/ Hex Artifact Content
Login

Artifact d9898bedbddb8b47dcb07c0b948addfe312e76af0ccfc42d2bedac9634153557:


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: 50 52 4f 47 52 45 53 53 5f 51 55 49 45 54 20 20  PROGRESS_QUIET  
7c70: 20 30 78 30 31 20 20 20 20 20 20 20 20 20 2f 2a   0x01         /*
7c80: 20 4f 6d 69 74 20 61 6e 6e 6f 75 6e 63 69 6e 67   Omit announcing
7c90: 20 65 76 65 72 79 20 70 72 6f 67 72 65 73 73 20   every progress 
7ca0: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 23 64 65 66  callback */.#def
7cb0: 69 6e 65 20 50 52 4f 47 52 45 53 53 5f 52 45 53  ine PROGRESS_RES
7cc0: 45 54 20 20 20 30 78 30 32 20 20 20 20 20 20 20  ET   0x02       
7cd0: 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 63    /* Reset the c
7ce0: 6f 75 6e 74 20 77 68 65 6e 20 74 68 65 20 70 72  ount when the pr
7cf0: 6f 67 72 65 73 0a 20 20 20 20 20 20 20 20 20 20  ogres.          
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63              ** c
7d20: 61 6c 6c 62 61 63 6b 20 6c 69 6d 69 74 20 69 73  allback limit is
7d30: 20 72 65 61 63 68 65 64 2c 20 61 6e 64 20 66 6f   reached, and fo
7d40: 72 20 65 61 63 68 0a 20 20 20 20 20 20 20 20 20  r each.         
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
7d70: 74 6f 70 2d 6c 65 76 65 6c 20 53 51 4c 20 73 74  top-level SQL st
7d80: 61 74 65 6d 65 6e 74 20 2a 2f 0a 23 64 65 66 69  atement */.#defi
7d90: 6e 65 20 50 52 4f 47 52 45 53 53 5f 4f 4e 43 45  ne PROGRESS_ONCE
7da0: 20 20 20 20 30 78 30 34 20 20 20 20 20 20 20 20      0x04        
7db0: 20 2f 2a 20 43 61 6e 63 65 6c 20 74 68 65 20 2d   /* Cancel the -
7dc0: 2d 6c 69 6d 69 74 20 61 66 74 65 72 20 66 69 72  -limit after fir
7dd0: 69 6e 67 20 6f 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a  ing once */../*.
7de0: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65  ** These are the
7df0: 20 61 6c 6c 6f 77 65 64 20 73 68 65 6c 6c 46 6c   allowed shellFl
7e00: 67 73 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 64 65  gs values.*/.#de
7e10: 66 69 6e 65 20 53 48 46 4c 47 5f 50 61 67 65 63  fine SHFLG_Pagec
7e20: 61 63 68 65 20 20 20 20 20 20 30 78 30 30 30 30  ache      0x0000
7e30: 30 30 30 31 20 2f 2a 20 54 68 65 20 2d 2d 70 61  0001 /* The --pa
7e40: 67 65 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 69  gecache option i
7e50: 73 20 75 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e  s used */.#defin
7e60: 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64  e SHFLG_Lookasid
7e70: 65 20 20 20 20 20 20 30 78 30 30 30 30 30 30 30  e      0x0000000
7e80: 32 20 2f 2a 20 4c 6f 6f 6b 61 73 69 64 65 20 6d  2 /* Lookaside m
7e90: 65 6d 6f 72 79 20 69 73 20 75 73 65 64 20 2a 2f  emory is used */
7ea0: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 42  .#define SHFLG_B
7eb0: 61 63 6b 73 6c 61 73 68 20 20 20 20 20 20 30 78  ackslash      0x
7ec0: 30 30 30 30 30 30 30 34 20 2f 2a 20 54 68 65 20  00000004 /* The 
7ed0: 2d 2d 62 61 63 6b 73 6c 61 73 68 20 6f 70 74 69  --backslash opti
7ee0: 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64  on is used */.#d
7ef0: 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 72 65 73  efine SHFLG_Pres
7f00: 65 72 76 65 52 6f 77 69 64 20 20 30 78 30 30 30  erveRowid  0x000
7f10: 30 30 30 30 38 20 2f 2a 20 2e 64 75 6d 70 20 70  00008 /* .dump p
7f20: 72 65 73 65 72 76 65 73 20 72 6f 77 69 64 20 76  reserves rowid v
7f30: 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65  alues */.#define
7f40: 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 20   SHFLG_Newlines 
7f50: 20 20 20 20 20 20 30 78 30 30 30 30 30 30 31 30        0x00000010
7f60: 20 2f 2a 20 2e 64 75 6d 70 20 2d 2d 6e 65 77 6c   /* .dump --newl
7f70: 69 6e 65 20 66 6c 61 67 20 2a 2f 0a 23 64 65 66  ine flag */.#def
7f80: 69 6e 65 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43  ine SHFLG_CountC
7f90: 68 61 6e 67 65 73 20 20 20 30 78 30 30 30 30 30  hanges   0x00000
7fa0: 30 32 30 20 2f 2a 20 2e 63 68 61 6e 67 65 73 20  020 /* .changes 
7fb0: 73 65 74 74 69 6e 67 20 2a 2f 0a 23 64 65 66 69  setting */.#defi
7fc0: 6e 65 20 53 48 46 4c 47 5f 45 63 68 6f 20 20 20  ne SHFLG_Echo   
7fd0: 20 20 20 20 20 20 20 20 30 78 30 30 30 30 30 30          0x000000
7fe0: 34 30 20 2f 2a 20 2e 65 63 68 6f 20 6f 72 20 2d  40 /* .echo or -
7ff0: 2d 65 63 68 6f 20 73 65 74 74 69 6e 67 20 2a 2f  -echo setting */
8000: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66  ../*.** Macros f
8010: 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73  or testing and s
8020: 65 74 74 69 6e 67 20 73 68 65 6c 6c 46 6c 67 73  etting shellFlgs
8030: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 68 65 6c  .*/.#define Shel
8040: 6c 48 61 73 46 6c 61 67 28 50 2c 58 29 20 20 20  lHasFlag(P,X)   
8050: 20 28 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67   (((P)->shellFlg
8060: 73 20 26 20 28 58 29 29 21 3d 30 29 0a 23 64 65  s & (X))!=0).#de
8070: 66 69 6e 65 20 53 68 65 6c 6c 53 65 74 46 6c 61  fine ShellSetFla
8080: 67 28 50 2c 58 29 20 20 20 20 28 28 50 29 2d 3e  g(P,X)    ((P)->
8090: 73 68 65 6c 6c 46 6c 67 73 7c 3d 28 58 29 29 0a  shellFlgs|=(X)).
80a0: 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 43 6c 65  #define ShellCle
80b0: 61 72 46 6c 61 67 28 50 2c 58 29 20 20 28 28 50  arFlag(P,X)  ((P
80c0: 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 26 3d 28 7e  )->shellFlgs&=(~
80d0: 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  (X)))../*.** The
80e0: 73 65 20 61 72 65 20 74 68 65 20 61 6c 6c 6f 77  se are the allow
80f0: 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65  ed modes..*/.#de
8100: 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e 65 20 20  fine MODE_Line  
8110: 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c     0  /* One col
8120: 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e 20 20 42  umn per line.  B
8130: 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74 77 65 65  lank line betwee
8140: 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a 23 64 65  n records */.#de
8150: 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e  fine MODE_Column
8160: 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20 72 65 63     1  /* One rec
8170: 6f 72 64 20 70 65 72 20 6c 69 6e 65 20 69 6e 20  ord per line in 
8180: 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  neat columns */.
8190: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 73  #define MODE_Lis
81a0: 74 20 20 20 20 20 32 20 20 2f 2a 20 4f 6e 65 20  t     2  /* One 
81b0: 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20  record per line 
81c0: 77 69 74 68 20 61 20 73 65 70 61 72 61 74 6f 72  with a separator
81d0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
81e0: 5f 53 65 6d 69 20 20 20 20 20 33 20 20 2f 2a 20  _Semi     3  /* 
81f0: 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f 4c 69 73  Same as MODE_Lis
8200: 74 20 62 75 74 20 61 70 70 65 6e 64 20 22 3b 22  t but append ";"
8210: 20 74 6f 20 65 61 63 68 20 6c 69 6e 65 20 2a 2f   to each line */
8220: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 48 74  .#define MODE_Ht
8230: 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20 47 65 6e  ml     4  /* Gen
8240: 65 72 61 74 65 20 61 6e 20 58 48 54 4d 4c 20 74  erate an XHTML t
8250: 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  able */.#define 
8260: 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20 20 35 20  MODE_Insert   5 
8270: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 53 51 4c   /* Generate SQL
8280: 20 22 69 6e 73 65 72 74 22 20 73 74 61 74 65 6d   "insert" statem
8290: 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ents */.#define 
82a0: 4d 4f 44 45 5f 51 75 6f 74 65 20 20 20 20 36 20  MODE_Quote    6 
82b0: 20 2f 2a 20 51 75 6f 74 65 20 76 61 6c 75 65 73   /* Quote values
82c0: 20 61 73 20 66 6f 72 20 53 51 4c 20 2a 2f 0a 23   as for SQL */.#
82d0: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54 63 6c 20  define MODE_Tcl 
82e0: 20 20 20 20 20 37 20 20 2f 2a 20 47 65 6e 65 72       7  /* Gener
82f0: 61 74 65 20 41 4e 53 49 2d 43 20 6f 72 20 54 43  ate ANSI-C or TC
8300: 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d 65 6e 74  L quoted element
8310: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  s */.#define MOD
8320: 45 5f 43 73 76 20 20 20 20 20 20 38 20 20 2f 2a  E_Csv      8  /*
8330: 20 51 75 6f 74 65 20 73 74 72 69 6e 67 73 2c 20   Quote strings, 
8340: 6e 75 6d 62 65 72 73 20 61 72 65 20 70 6c 61 69  numbers are plai
8350: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  n */.#define MOD
8360: 45 5f 45 78 70 6c 61 69 6e 20 20 39 20 20 2f 2a  E_Explain  9  /*
8370: 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d   Like MODE_Colum
8380: 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 74 72  n, but do not tr
8390: 75 6e 63 61 74 65 20 64 61 74 61 20 2a 2f 0a 23  uncate data */.#
83a0: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 41 73 63 69  define MODE_Asci
83b0: 69 20 20 20 31 30 20 20 2f 2a 20 55 73 65 20 41  i   10  /* Use A
83c0: 53 43 49 49 20 75 6e 69 74 20 61 6e 64 20 72 65  SCII unit and re
83d0: 63 6f 72 64 20 73 65 70 61 72 61 74 6f 72 73 20  cord separators 
83e0: 28 30 78 31 46 2f 30 78 31 45 29 20 2a 2f 0a 23  (0x1F/0x1E) */.#
83f0: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 50 72 65 74  define MODE_Pret
8400: 74 79 20 20 31 31 20 20 2f 2a 20 50 72 65 74 74  ty  11  /* Prett
8410: 79 2d 70 72 69 6e 74 20 73 63 68 65 6d 61 73 20  y-print schemas 
8420: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
8430: 45 51 50 20 20 20 20 20 31 32 20 20 2f 2a 20 43  EQP     12  /* C
8440: 6f 6e 76 65 72 74 73 20 45 58 50 4c 41 49 4e 20  onverts EXPLAIN 
8450: 51 55 45 52 59 20 50 4c 41 4e 20 6f 75 74 70 75  QUERY PLAN outpu
8460: 74 20 69 6e 74 6f 20 61 20 67 72 61 70 68 20 2a  t into a graph *
8470: 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  /..static const 
8480: 63 68 61 72 20 2a 6d 6f 64 65 44 65 73 63 72 5b  char *modeDescr[
8490: 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65 22 2c 0a  ] = {.  "line",.
84a0: 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20 22 6c    "column",.  "l
84b0: 69 73 74 22 2c 0a 20 20 22 73 65 6d 69 22 2c 0a  ist",.  "semi",.
84c0: 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22 69 6e 73    "html",.  "ins
84d0: 65 72 74 22 2c 0a 20 20 22 71 75 6f 74 65 22 2c  ert",.  "quote",
84e0: 0a 20 20 22 74 63 6c 22 2c 0a 20 20 22 63 73 76  .  "tcl",.  "csv
84f0: 22 2c 0a 20 20 22 65 78 70 6c 61 69 6e 22 2c 0a  ",.  "explain",.
8500: 20 20 22 61 73 63 69 69 22 2c 0a 20 20 22 70 72    "ascii",.  "pr
8510: 65 74 74 79 70 72 69 6e 74 22 2c 0a 20 20 22 65  ettyprint",.  "e
8520: 71 70 22 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  qp".};../*.** Th
8530: 65 73 65 20 61 72 65 20 74 68 65 20 63 6f 6c 75  ese are the colu
8540: 6d 6e 2f 72 6f 77 2f 6c 69 6e 65 20 73 65 70 61  mn/row/line sepa
8550: 72 61 74 6f 72 73 20 75 73 65 64 20 62 79 20 74  rators used by t
8560: 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 69 6d  he various.** im
8570: 70 6f 72 74 2f 65 78 70 6f 72 74 20 6d 6f 64 65  port/export mode
8580: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 45  s..*/.#define SE
8590: 50 5f 43 6f 6c 75 6d 6e 20 20 20 20 22 7c 22 0a  P_Column    "|".
85a0: 23 64 65 66 69 6e 65 20 53 45 50 5f 52 6f 77 20  #define SEP_Row 
85b0: 20 20 20 20 20 20 22 5c 6e 22 0a 23 64 65 66 69        "\n".#defi
85c0: 6e 65 20 53 45 50 5f 54 61 62 20 20 20 20 20 20  ne SEP_Tab      
85d0: 20 22 5c 74 22 0a 23 64 65 66 69 6e 65 20 53 45   "\t".#define SE
85e0: 50 5f 53 70 61 63 65 20 20 20 20 20 22 20 22 0a  P_Space     " ".
85f0: 23 64 65 66 69 6e 65 20 53 45 50 5f 43 6f 6d 6d  #define SEP_Comm
8600: 61 20 20 20 20 20 22 2c 22 0a 23 64 65 66 69 6e  a     ",".#defin
8610: 65 20 53 45 50 5f 43 72 4c 66 20 20 20 20 20 20  e SEP_CrLf      
8620: 22 5c 72 5c 6e 22 0a 23 64 65 66 69 6e 65 20 53  "\r\n".#define S
8630: 45 50 5f 55 6e 69 74 20 20 20 20 20 20 22 5c 78  EP_Unit      "\x
8640: 31 46 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f  1F".#define SEP_
8650: 52 65 63 6f 72 64 20 20 20 20 22 5c 78 31 45 22  Record    "\x1E"
8660: 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 62 61  ../*.** A callba
8670: 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  ck for the sqlit
8680: 65 33 5f 6c 6f 67 28 29 20 69 6e 74 65 72 66 61  e3_log() interfa
8690: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ce..*/.static vo
86a0: 69 64 20 73 68 65 6c 6c 4c 6f 67 28 76 6f 69 64  id shellLog(void
86b0: 20 2a 70 41 72 67 2c 20 69 6e 74 20 69 45 72 72   *pArg, int iErr
86c0: 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Code, const char
86d0: 20 2a 7a 4d 73 67 29 7b 0a 20 20 53 68 65 6c 6c   *zMsg){.  Shell
86e0: 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c  State *p = (Shel
86f0: 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a 20 20  lState*)pArg;.  
8700: 69 66 28 20 70 2d 3e 70 4c 6f 67 3d 3d 30 20 29  if( p->pLog==0 )
8710: 20 72 65 74 75 72 6e 3b 0a 20 20 75 74 66 38 5f   return;.  utf8_
8720: 70 72 69 6e 74 66 28 70 2d 3e 70 4c 6f 67 2c 20  printf(p->pLog, 
8730: 22 28 25 64 29 20 25 73 5c 6e 22 2c 20 69 45 72  "(%d) %s\n", iEr
8740: 72 43 6f 64 65 2c 20 7a 4d 73 67 29 3b 0a 20 20  rCode, zMsg);.  
8750: 66 66 6c 75 73 68 28 70 2d 3e 70 4c 6f 67 29 3b  fflush(p->pLog);
8760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75  .}../*.** SQL fu
8770: 6e 63 74 69 6f 6e 3a 20 20 73 68 65 6c 6c 5f 70  nction:  shell_p
8780: 75 74 73 6e 6c 28 58 29 0a 2a 2a 0a 2a 2a 20 57  utsnl(X).**.** W
8790: 72 69 74 65 20 74 68 65 20 74 65 78 74 20 58 20  rite the text X 
87a0: 74 6f 20 74 68 65 20 73 63 72 65 65 6e 20 28 6f  to the screen (o
87b0: 72 20 77 68 61 74 65 76 65 72 20 6f 75 74 70 75  r whatever outpu
87c0: 74 20 69 73 20 62 65 69 6e 67 20 64 69 72 65 63  t is being direc
87d0: 74 65 64 29 0a 2a 2a 20 61 64 64 69 6e 67 20 61  ted).** adding a
87e0: 20 6e 65 77 6c 69 6e 65 20 61 74 20 74 68 65 20   newline at the 
87f0: 65 6e 64 2c 20 61 6e 64 20 74 68 65 6e 20 72 65  end, and then re
8800: 74 75 72 6e 20 58 2e 0a 2a 2f 0a 73 74 61 74 69  turn X..*/.stati
8810: 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 75 74 73  c void shellPuts
8820: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
8830: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20  context *pCtx,. 
8840: 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c   int nVal,.  sql
8850: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
8860: 61 6c 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61  al.){.  ShellSta
8870: 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74  te *p = (ShellSt
8880: 61 74 65 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  ate*)sqlite3_use
8890: 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20  r_data(pCtx);.  
88a0: 28 76 6f 69 64 29 6e 56 61 6c 3b 0a 20 20 75 74  (void)nVal;.  ut
88b0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
88c0: 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
88d0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
88e0: 61 6c 5b 30 5d 29 29 3b 0a 20 20 73 71 6c 69 74  al[0]));.  sqlit
88f0: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
8900: 70 43 74 78 2c 20 61 70 56 61 6c 5b 30 5d 29 3b  pCtx, apVal[0]);
8910: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75  .}../*.** SQL fu
8920: 6e 63 74 69 6f 6e 3a 20 20 20 65 64 69 74 28 56  nction:   edit(V
8930: 41 4c 55 45 29 0a 2a 2a 20 20 20 20 20 20 20 20  ALUE).**        
8940: 20 20 20 20 20 20 20 20 20 65 64 69 74 28 56 41           edit(VA
8950: 4c 55 45 2c 45 44 49 54 4f 52 29 0a 2a 2a 0a 2a  LUE,EDITOR).**.*
8960: 2a 20 54 68 65 73 65 20 73 74 65 70 73 3a 0a 2a  * These steps:.*
8970: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 57 72 69  *.**     (1) Wri
8980: 74 65 20 56 41 4c 55 45 20 69 6e 74 6f 20 61 20  te VALUE into a 
8990: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a  temporary file..
89a0: 2a 2a 20 20 20 20 20 28 32 29 20 52 75 6e 20 70  **     (2) Run p
89b0: 72 6f 67 72 61 6d 20 45 44 49 54 4f 52 20 6f 6e  rogram EDITOR on
89c0: 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
89d0: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 33 29  file..**     (3)
89e0: 20 52 65 61 64 20 74 68 65 20 74 65 6d 70 6f 72   Read the tempor
89f0: 61 72 79 20 66 69 6c 65 20 62 61 63 6b 20 61 6e  ary file back an
8a00: 64 20 72 65 74 75 72 6e 20 69 74 73 20 63 6f 6e  d return its con
8a10: 74 65 6e 74 20 61 73 20 74 68 65 20 72 65 73 75  tent as the resu
8a20: 6c 74 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 44  lt..**     (4) D
8a30: 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
8a40: 61 72 79 20 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 49  ary file.**.** I
8a50: 66 20 74 68 65 20 45 44 49 54 4f 52 20 61 72 67  f the EDITOR arg
8a60: 75 6d 65 6e 74 20 69 73 20 6f 6d 69 74 74 65 64  ument is omitted
8a70: 2c 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20  , use the value 
8a80: 69 6e 20 74 68 65 20 56 49 53 55 41 4c 0a 2a 2a  in the VISUAL.**
8a90: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
8aa0: 69 61 62 6c 65 2e 20 20 49 66 20 73 74 69 6c 6c  iable.  If still
8ab0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 45 44 49   there is no EDI
8ac0: 54 4f 52 2c 20 74 68 72 6f 75 67 68 20 61 6e 20  TOR, through an 
8ad0: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  error..**.** Als
8ae0: 6f 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  o throw an error
8af0: 20 69 66 20 74 68 65 20 45 44 49 54 4f 52 20 70   if the EDITOR p
8b00: 72 6f 67 72 61 6d 20 72 65 74 75 72 6e 73 20 61  rogram returns a
8b10: 20 6e 6f 6e 2d 7a 65 72 6f 20 65 78 69 74 20 63   non-zero exit c
8b20: 6f 64 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ode..*/.#ifndef 
8b30: 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59  SQLITE_NOHAVE_SY
8b40: 53 54 45 4d 0a 73 74 61 74 69 63 20 76 6f 69 64  STEM.static void
8b50: 20 65 64 69 74 46 75 6e 63 28 0a 20 20 73 71 6c   editFunc(.  sql
8b60: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
8b70: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
8b80: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
8b90: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
8ba0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 64 69 74  onst char *zEdit
8bb0: 6f 72 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d  or;.  char *zTem
8bc0: 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73 71 6c  pFile = 0;.  sql
8bd0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
8be0: 20 2a 7a 43 6d 64 20 3d 20 30 3b 0a 20 20 69 6e   *zCmd = 0;.  in
8bf0: 74 20 62 42 69 6e 3b 0a 20 20 69 6e 74 20 72 63  t bBin;.  int rc
8c00: 3b 0a 20 20 69 6e 74 20 68 61 73 43 52 4e 4c 20  ;.  int hasCRNL 
8c10: 3d 20 30 3b 0a 20 20 46 49 4c 45 20 2a 66 20 3d  = 0;.  FILE *f =
8c20: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   0;.  sqlite3_in
8c30: 74 36 34 20 73 7a 3b 0a 20 20 73 71 6c 69 74 65  t64 sz;.  sqlite
8c40: 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20 75 6e 73  3_int64 x;.  uns
8c50: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 20 3d 20  igned char *p = 
8c60: 30 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d  0;..  if( argc==
8c70: 32 20 29 7b 0a 20 20 20 20 7a 45 64 69 74 6f 72  2 ){.    zEditor
8c80: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
8c90: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
8ca0: 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 7d  xt(argv[1]);.  }
8cb0: 65 6c 73 65 7b 0a 20 20 20 20 7a 45 64 69 74 6f  else{.    zEdito
8cc0: 72 20 3d 20 67 65 74 65 6e 76 28 22 56 49 53 55  r = getenv("VISU
8cd0: 41 4c 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  AL");.  }.  if( 
8ce0: 7a 45 64 69 74 6f 72 3d 3d 30 20 29 7b 0a 20 20  zEditor==0 ){.  
8cf0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8d00: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
8d10: 22 6e 6f 20 65 64 69 74 6f 72 20 66 6f 72 20 65  "no editor for e
8d20: 64 69 74 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20  dit()", -1);.   
8d30: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
8d40: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
8d50: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d  _type(argv[0])==
8d60: 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
8d70: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8d80: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
8d90: 20 22 4e 55 4c 4c 20 69 6e 70 75 74 20 74 6f 20   "NULL input to 
8da0: 65 64 69 74 28 29 22 2c 20 2d 31 29 3b 0a 20 20  edit()", -1);.  
8db0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
8dc0: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
8dd0: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
8de0: 6f 6e 74 65 78 74 29 3b 0a 20 20 7a 54 65 6d 70  ontext);.  zTemp
8df0: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  File = 0;.  sqli
8e00: 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
8e10: 28 64 62 2c 20 30 2c 20 53 51 4c 49 54 45 5f 46  (db, 0, SQLITE_F
8e20: 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d  CNTL_TEMPFILENAM
8e30: 45 2c 20 26 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  E, &zTempFile);.
8e40: 20 20 69 66 28 20 7a 54 65 6d 70 46 69 6c 65 3d    if( zTempFile=
8e50: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
8e60: 33 5f 75 69 6e 74 36 34 20 72 20 3d 20 30 3b 0a  3_uint64 r = 0;.
8e70: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
8e80: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29  omness(sizeof(r)
8e90: 2c 20 26 72 29 3b 0a 20 20 20 20 7a 54 65 6d 70  , &r);.    zTemp
8ea0: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
8eb0: 70 72 69 6e 74 66 28 22 74 65 6d 70 25 6c 6c 78  printf("temp%llx
8ec0: 22 2c 20 72 29 3b 0a 20 20 20 20 69 66 28 20 7a  ", r);.    if( z
8ed0: 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  TempFile==0 ){. 
8ee0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
8ef0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
8f00: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
8f10: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
8f20: 7d 0a 20 20 62 42 69 6e 20 3d 20 73 71 6c 69 74  }.  bBin = sqlit
8f30: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
8f40: 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 42  gv[0])==SQLITE_B
8f50: 4c 4f 42 3b 0a 20 20 2f 2a 20 57 68 65 6e 20 77  LOB;.  /* When w
8f60: 72 69 74 69 6e 67 20 74 68 65 20 66 69 6c 65 20  riting the file 
8f70: 74 6f 20 62 65 20 65 64 69 74 65 64 2c 20 64 6f  to be edited, do
8f80: 20 5c 6e 20 74 6f 20 5c 72 5c 6e 20 63 6f 6e 76   \n to \r\n conv
8f90: 65 72 73 69 6f 6e 73 20 6f 6e 20 73 79 73 74 65  ersions on syste
8fa0: 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 61 6e  ms.  ** that wan
8fb0: 74 20 5c 72 5c 6e 20 6c 69 6e 65 20 65 6e 64 69  t \r\n line endi
8fc0: 6e 67 73 20 2a 2f 0a 20 20 66 20 3d 20 66 6f 70  ngs */.  f = fop
8fd0: 65 6e 28 7a 54 65 6d 70 46 69 6c 65 2c 20 62 42  en(zTempFile, bB
8fe0: 69 6e 20 3f 20 22 77 62 22 20 3a 20 22 77 22 29  in ? "wb" : "w")
8ff0: 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a  ;.  if( f==0 ){.
9000: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
9010: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
9020: 2c 20 22 65 64 69 74 28 29 20 63 61 6e 6e 6f 74  , "edit() cannot
9030: 20 6f 70 65 6e 20 74 65 6d 70 20 66 69 6c 65 22   open temp file"
9040: 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20  , -1);.    goto 
9050: 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20  edit_func_end;. 
9060: 20 7d 0a 20 20 73 7a 20 3d 20 73 71 6c 69 74 65   }.  sz = sqlite
9070: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
9080: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 62 42  gv[0]);.  if( bB
9090: 69 6e 20 29 7b 0a 20 20 20 20 78 20 3d 20 66 77  in ){.    x = fw
90a0: 72 69 74 65 28 73 71 6c 69 74 65 33 5f 76 61 6c  rite(sqlite3_val
90b0: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
90c0: 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20 7d  , 1, sz, f);.  }
90d0: 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20  else{.    const 
90e0: 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74  char *z = (const
90f0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
9100: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
9110: 5d 29 3b 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d  ]);.    /* Remem
9120: 62 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ber whether or n
9130: 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f 72 69  ot the value ori
9140: 67 69 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65  ginally containe
9150: 64 20 5c 72 5c 6e 20 2a 2f 0a 20 20 20 20 69 66  d \r\n */.    if
9160: 28 20 7a 20 26 26 20 73 74 72 73 74 72 28 7a 2c  ( z && strstr(z,
9170: 22 5c 72 5c 6e 22 29 21 3d 30 20 29 20 68 61 73  "\r\n")!=0 ) has
9180: 43 52 4e 4c 20 3d 20 31 3b 0a 20 20 20 20 78 20  CRNL = 1;.    x 
9190: 3d 20 66 77 72 69 74 65 28 73 71 6c 69 74 65 33  = fwrite(sqlite3
91a0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
91b0: 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b  [0]), 1, sz, f);
91c0: 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 29  .  }.  fclose(f)
91d0: 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20 69 66 28  ;.  f = 0;.  if(
91e0: 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20 20 73 71   x!=sz ){.    sq
91f0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
9200: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 65 64 69  or(context, "edi
9210: 74 28 29 20 63 6f 75 6c 64 20 6e 6f 74 20 77 72  t() could not wr
9220: 69 74 65 20 74 68 65 20 77 68 6f 6c 65 20 66 69  ite the whole fi
9230: 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f  le", -1);.    go
9240: 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64  to edit_func_end
9250: 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 73  ;.  }.  zCmd = s
9260: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
9270: 25 73 20 5c 22 25 73 5c 22 22 2c 20 7a 45 64 69  %s \"%s\"", zEdi
9280: 74 6f 72 2c 20 7a 54 65 6d 70 46 69 6c 65 29 3b  tor, zTempFile);
9290: 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29  .  if( zCmd==0 )
92a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
92b0: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
92c0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 67  (context);.    g
92d0: 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e  oto edit_func_en
92e0: 64 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 79  d;.  }.  rc = sy
92f0: 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20 20 73 71  stem(zCmd);.  sq
9300: 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29  lite3_free(zCmd)
9310: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
9320: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
9330: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
9340: 22 45 44 49 54 4f 52 20 72 65 74 75 72 6e 65 64  "EDITOR returned
9350: 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20 2d 31 29 3b   non-zero", -1);
9360: 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66  .    goto edit_f
9370: 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 66  unc_end;.  }.  f
9380: 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69   = fopen(zTempFi
9390: 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28  le, "rb");.  if(
93a0: 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c   f==0 ){.    sql
93b0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
93c0: 72 28 63 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20  r(context,.     
93d0: 20 22 65 64 69 74 28 29 20 63 61 6e 6e 6f 74 20   "edit() cannot 
93e0: 72 65 6f 70 65 6e 20 74 65 6d 70 20 66 69 6c 65  reopen temp file
93f0: 20 61 66 74 65 72 20 65 64 69 74 22 2c 20 2d 31   after edit", -1
9400: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74  );.    goto edit
9410: 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20  _func_end;.  }. 
9420: 20 66 73 65 65 6b 28 66 2c 20 30 2c 20 53 45 45   fseek(f, 0, SEE
9430: 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a 20 3d 20 66  K_END);.  sz = f
9440: 74 65 6c 6c 28 66 29 3b 0a 20 20 72 65 77 69 6e  tell(f);.  rewin
9450: 64 28 66 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  d(f);.  p = sqli
9460: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 7a  te3_malloc64( sz
9470: 2b 28 62 42 69 6e 3d 3d 30 29 20 29 3b 0a 20 20  +(bBin==0) );.  
9480: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
9490: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
94a0: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
94b0: 78 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64  xt);.    goto ed
94c0: 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d  it_func_end;.  }
94d0: 0a 20 20 78 20 3d 20 66 72 65 61 64 28 70 2c 20  .  x = fread(p, 
94e0: 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20 66 63 6c  1, sz, f);.  fcl
94f0: 6f 73 65 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b  ose(f);.  f = 0;
9500: 0a 20 20 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a  .  if( x!=sz ){.
9510: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
9520: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
9530: 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 72 65 61  , "could not rea
9540: 64 20 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65  d back the whole
9550: 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20   file", -1);.   
9560: 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f   goto edit_func_
9570: 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62  end;.  }.  if( b
9580: 42 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Bin ){.    sqlit
9590: 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 36 34  e3_result_blob64
95a0: 28 63 6f 6e 74 65 78 74 2c 20 70 2c 20 73 7a 2c  (context, p, sz,
95b0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
95c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
95d0: 69 74 65 33 5f 69 6e 74 36 34 20 69 2c 20 6a 3b  ite3_int64 i, j;
95e0: 0a 20 20 20 20 69 66 28 20 68 61 73 43 52 4e 4c  .    if( hasCRNL
95f0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
9600: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  the original con
9610: 74 61 69 6e 73 20 5c 72 5c 6e 20 74 68 65 6e 20  tains \r\n then 
9620: 64 6f 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  do no conversion
9630: 73 20 62 61 63 6b 20 74 6f 20 5c 6e 20 2a 2f 0a  s back to \n */.
9640: 20 20 20 20 20 20 6a 20 3d 20 73 7a 3b 0a 20 20        j = sz;.  
9650: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
9660: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 64 69  * If the file di
9670: 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 6c 6c 79  d not originally
9680: 20 63 6f 6e 74 61 69 6e 20 5c 72 5c 6e 20 74 68   contain \r\n th
9690: 65 6e 20 63 6f 6e 76 65 72 74 20 61 6e 79 20 6e  en convert any n
96a0: 65 77 0a 20 20 20 20 20 20 2a 2a 20 5c 72 5c 6e  ew.      ** \r\n
96b0: 20 62 61 63 6b 20 69 6e 74 6f 20 5c 6e 20 2a 2f   back into \n */
96c0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30  .      for(i=j=0
96d0: 3b 20 69 3c 73 7a 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<sz; i++){.  
96e0: 20 20 20 20 20 20 69 66 28 20 70 5b 69 5d 3d 3d        if( p[i]==
96f0: 27 5c 72 27 20 26 26 20 70 5b 69 2b 31 5d 3d 3d  '\r' && p[i+1]==
9700: 27 5c 6e 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20  '\n' ) i++;.    
9710: 20 20 20 20 70 5b 6a 2b 2b 5d 20 3d 20 70 5b 69      p[j++] = p[i
9720: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
9730: 20 73 7a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70   sz = j;.      p
9740: 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 20  [sz] = 0;.    } 
9750: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
9760: 75 6c 74 5f 74 65 78 74 36 34 28 63 6f 6e 74 65  ult_text64(conte
9770: 78 74 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  xt, (const char*
9780: 29 70 2c 20 73 7a 2c 0a 20 20 20 20 20 20 20 20  )p, sz,.        
9790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 2c 20    sqlite3_free, 
97b0: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
97c0: 7d 0a 20 20 70 20 3d 20 30 3b 0a 0a 65 64 69 74  }.  p = 0;..edit
97d0: 5f 66 75 6e 63 5f 65 6e 64 3a 0a 20 20 69 66 28  _func_end:.  if(
97e0: 20 66 20 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a   f ) fclose(f);.
97f0: 20 20 75 6e 6c 69 6e 6b 28 7a 54 65 6d 70 46 69    unlink(zTempFi
9800: 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  le);.  sqlite3_f
9810: 72 65 65 28 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  ree(zTempFile);.
9820: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
9830: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
9840: 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53  QLITE_NOHAVE_SYS
9850: 54 45 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 61  TEM */../*.** Sa
9860: 76 65 20 6f 72 20 72 65 73 74 6f 72 65 20 74 68  ve or restore th
9870: 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74  e current output
9880: 20 6d 6f 64 65 0a 2a 2f 0a 73 74 61 74 69 63 20   mode.*/.static 
9890: 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64 65 50  void outputModeP
98a0: 75 73 68 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  ush(ShellState *
98b0: 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 50 72 69  p){.  p->modePri
98c0: 6f 72 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  or = p->mode;.  
98d0: 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65 70  memcpy(p->colSep
98e0: 50 72 69 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65 70  Prior, p->colSep
98f0: 61 72 61 74 6f 72 2c 20 73 69 7a 65 6f 66 28 70  arator, sizeof(p
9900: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 29  ->colSeparator))
9910: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72 6f  ;.  memcpy(p->ro
9920: 77 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e 72 6f  wSepPrior, p->ro
9930: 77 53 65 70 61 72 61 74 6f 72 2c 20 73 69 7a 65  wSeparator, size
9940: 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
9950: 6f 72 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  or));.}.static v
9960: 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64 65 50 6f  oid outputModePo
9970: 70 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  p(ShellState *p)
9980: 7b 0a 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d  {.  p->mode = p-
9990: 3e 6d 6f 64 65 50 72 69 6f 72 3b 0a 20 20 6d 65  >modePrior;.  me
99a0: 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65 70 61 72  mcpy(p->colSepar
99b0: 61 74 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65 70 50  ator, p->colSepP
99c0: 72 69 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  rior, sizeof(p->
99d0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 29 3b 0a  colSeparator));.
99e0: 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72 6f 77 53    memcpy(p->rowS
99f0: 65 70 61 72 61 74 6f 72 2c 20 70 2d 3e 72 6f 77  eparator, p->row
9a00: 53 65 70 50 72 69 6f 72 2c 20 73 69 7a 65 6f 66  SepPrior, sizeof
9a10: 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
9a20: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  ));.}../*.** Out
9a30: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
9a40: 72 69 6e 67 20 61 73 20 61 20 68 65 78 2d 65 6e  ring as a hex-en
9a50: 63 6f 64 65 64 20 62 6c 6f 62 20 28 65 67 2e 20  coded blob (eg. 
9a60: 58 27 31 32 33 34 27 20 29 0a 2a 2f 0a 73 74 61  X'1234' ).*/.sta
9a70: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
9a80: 68 65 78 5f 62 6c 6f 62 28 46 49 4c 45 20 2a 6f  hex_blob(FILE *o
9a90: 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ut, const void *
9aa0: 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62  pBlob, int nBlob
9ab0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  ){.  int i;.  ch
9ac0: 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 28 63 68 61  ar *zBlob = (cha
9ad0: 72 20 2a 29 70 42 6c 6f 62 3b 0a 20 20 72 61 77  r *)pBlob;.  raw
9ae0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 58 27 22  _printf(out,"X'"
9af0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
9b00: 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20 72 61 77  nBlob; i++){ raw
9b10: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 30 32  _printf(out,"%02
9b20: 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30 78 66 66  x",zBlob[i]&0xff
9b30: 29 3b 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74  ); }.  raw_print
9b40: 66 28 6f 75 74 2c 22 27 22 29 3b 0a 7d 0a 0a 2f  f(out,"'");.}../
9b50: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 73 74 72 69  *.** Find a stri
9b60: 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 66  ng that is not f
9b70: 6f 75 6e 64 20 61 6e 79 77 68 65 72 65 20 69 6e  ound anywhere in
9b80: 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 61 20   z[].  Return a 
9b90: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
9ba0: 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  at string..**.**
9bb0: 20 54 72 79 20 74 6f 20 75 73 65 20 7a 41 20 61   Try to use zA a
9bc0: 6e 64 20 7a 42 20 66 69 72 73 74 2e 20 20 49 66  nd zB first.  If
9bd0: 20 62 6f 74 68 20 6f 66 20 74 68 6f 73 65 20 61   both of those a
9be0: 72 65 20 61 6c 72 65 61 64 79 20 66 6f 75 6e 64  re already found
9bf0: 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68 65 6e 20   in z[].** then 
9c00: 6d 61 6b 65 20 75 70 20 73 6f 6d 65 20 73 74 72  make up some str
9c10: 69 6e 67 20 61 6e 64 20 73 74 6f 72 65 20 69 74  ing and store it
9c20: 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 7a   in the buffer z
9c30: 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  Buf..*/.static c
9c40: 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 75 73 65  onst char *unuse
9c50: 64 5f 73 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73  d_string(.  cons
9c60: 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20  t char *z,      
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9c80: 20 52 65 73 75 6c 74 20 6d 75 73 74 20 6e 6f 74   Result must not
9c90: 20 61 70 70 65 61 72 20 61 6e 79 77 68 65 72 65   appear anywhere
9ca0: 20 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f 6e 73 74   in z */.  const
9cb0: 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f 6e 73 74   char *zA, const
9cc0: 20 63 68 61 72 20 2a 7a 42 2c 20 20 20 2f 2a 20   char *zB,   /* 
9cd0: 54 72 79 20 74 68 65 73 65 20 66 69 72 73 74 20  Try these first 
9ce0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 20  */.  char *zBuf 
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d00: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
9d10: 74 6f 20 73 74 6f 72 65 20 61 20 67 65 6e 65 72  to store a gener
9d20: 61 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29  ated string */.)
9d30: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 20 3d  {.  unsigned i =
9d40: 20 30 3b 0a 20 20 69 66 28 20 73 74 72 73 74 72   0;.  if( strstr
9d50: 28 7a 2c 20 7a 41 29 3d 3d 30 20 29 20 72 65 74  (z, zA)==0 ) ret
9d60: 75 72 6e 20 7a 41 3b 0a 20 20 69 66 28 20 73 74  urn zA;.  if( st
9d70: 72 73 74 72 28 7a 2c 20 7a 42 29 3d 3d 30 20 29  rstr(z, zB)==0 )
9d80: 20 72 65 74 75 72 6e 20 7a 42 3b 0a 20 20 64 6f   return zB;.  do
9d90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
9da0: 70 72 69 6e 74 66 28 32 30 2c 7a 42 75 66 2c 22  printf(20,zBuf,"
9db0: 28 25 73 25 75 29 22 2c 20 7a 41 2c 20 69 2b 2b  (%s%u)", zA, i++
9dc0: 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 73 74 72  );.  }while( str
9dd0: 73 74 72 28 7a 2c 7a 42 75 66 29 21 3d 30 20 29  str(z,zBuf)!=0 )
9de0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42 75 66 3b  ;.  return zBuf;
9df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
9e00: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
9e10: 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73 74  g as a quoted st
9e20: 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71  ring using SQL q
9e30: 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  uoting conventio
9e40: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ns..**.** See al
9e50: 73 6f 3a 20 6f 75 74 70 75 74 5f 71 75 6f 74 65  so: output_quote
9e60: 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67  d_escaped_string
9e70: 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ().*/.static voi
9e80: 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f  d output_quoted_
9e90: 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74  string(FILE *out
9ea0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
9eb0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  {.  int i;.  cha
9ec0: 72 20 63 3b 0a 20 20 73 65 74 42 69 6e 61 72 79  r c;.  setBinary
9ed0: 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 20 20  Mode(out, 1);.  
9ee0: 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b  for(i=0; (c = z[
9ef0: 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 27  i])!=0 && c!='\'
9f00: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20  '; i++){}.  if( 
9f10: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38  c==0 ){.    utf8
9f20: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25 73  _printf(out,"'%s
9f30: 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  '",z);.  }else{.
9f40: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
9f50: 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77 68  ut, "'");.    wh
9f60: 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20  ile( *z ){.     
9f70: 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a   for(i=0; (c = z
9f80: 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c  [i])!=0 && c!='\
9f90: 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20  ''; i++){}.     
9fa0: 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20 69   if( c=='\'' ) i
9fb0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 20  ++;.      if( i 
9fc0: 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
9fd0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a  printf(out, "%.*
9fe0: 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20  s", i, z);.     
9ff0: 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20     z += i;.     
a000: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
a010: 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\'' ){.        
a020: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
a030: 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  "'");.        co
a040: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
a050: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
a060: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
a070: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
a080: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61  ++;.    }.    ra
a090: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27  w_printf(out, "'
a0a0: 22 29 3b 0a 20 20 7d 0a 20 20 73 65 74 54 65 78  ");.  }.  setTex
a0b0: 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 7d  tMode(out, 1);.}
a0c0: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74  ../*.** Output t
a0d0: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
a0e0: 61 73 20 61 20 71 75 6f 74 65 64 20 73 74 72 69  as a quoted stri
a0f0: 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75 6f  ng using SQL quo
a100: 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73  ting conventions
a110: 2e 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ..** Additionall
a120: 6c 79 20 2c 20 65 73 63 61 70 65 20 74 68 65 20  ly , escape the 
a130: 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22 20 63 68  "\n" and "\r" ch
a140: 61 72 61 63 74 65 72 73 20 73 6f 20 74 68 61 74  aracters so that
a150: 20 74 68 65 79 20 64 6f 20 6e 6f 74 0a 2a 2a 20   they do not.** 
a160: 67 65 74 20 63 6f 72 72 75 70 74 65 64 20 62 79  get corrupted by
a170: 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 74 72 61   end-of-line tra
a180: 6e 73 6c 61 74 69 6f 6e 20 66 61 63 69 6c 69 74  nslation facilit
a190: 69 65 73 20 69 6e 20 73 6f 6d 65 20 6f 70 65 72  ies in some oper
a1a0: 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73  ating.** systems
a1b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
a1c0: 6c 69 6b 65 20 6f 75 74 70 75 74 5f 71 75 6f 74  like output_quot
a1d0: 65 64 5f 73 74 72 69 6e 67 28 29 20 62 75 74 20  ed_string() but 
a1e0: 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f  with the additio
a1f0: 6e 20 6f 66 20 74 68 65 20 5c 72 5c 6e 0a 2a 2a  n of the \r\n.**
a200: 20 65 73 63 61 70 65 20 6d 65 63 68 61 6e 69 73   escape mechanis
a210: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
a220: 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f  d output_quoted_
a230: 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 46  escaped_string(F
a240: 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20  ILE *out, const 
a250: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
a260: 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 73  i;.  char c;.  s
a270: 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 6f 75 74  etBinaryMode(out
a280: 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  , 1);.  for(i=0;
a290: 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26   (c = z[i])!=0 &
a2a0: 26 20 63 21 3d 27 5c 27 27 20 26 26 20 63 21 3d  & c!='\'' && c!=
a2b0: 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27 3b  '\n' && c!='\r';
a2c0: 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63 3d   i++){}.  if( c=
a2d0: 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
a2e0: 72 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27 22  rintf(out,"'%s'"
a2f0: 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ,z);.  }else{.  
a300: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
a310: 4c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  L = 0;.    const
a320: 20 63 68 61 72 20 2a 7a 43 52 20 3d 20 30 3b 0a   char *zCR = 0;.
a330: 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d 20 30 3b      int nNL = 0;
a340: 0a 20 20 20 20 69 6e 74 20 6e 43 52 20 3d 20 30  .    int nCR = 0
a350: 3b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 31  ;.    char zBuf1
a360: 5b 32 30 5d 2c 20 7a 42 75 66 32 5b 32 30 5d 3b  [20], zBuf2[20];
a370: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  .    for(i=0; z[
a380: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
a390: 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29  if( z[i]=='\n' )
a3a0: 20 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20 20 69 66   nNL++;.      if
a3b0: 28 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20 29 20 6e  ( z[i]=='\r' ) n
a3c0: 43 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  CR++;.    }.    
a3d0: 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20  if( nNL ){.     
a3e0: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a3f0: 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20   "replace(");.  
a400: 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75 73 65 64      zNL = unused
a410: 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 6e 22  _string(z, "\\n"
a420: 2c 20 22 5c 5c 30 31 32 22 2c 20 7a 42 75 66 31  , "\\012", zBuf1
a430: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
a440: 20 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72 61   nCR ){.      ra
a450: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 72  w_printf(out, "r
a460: 65 70 6c 61 63 65 28 22 29 3b 0a 20 20 20 20 20  eplace(");.     
a470: 20 7a 43 52 20 3d 20 75 6e 75 73 65 64 5f 73 74   zCR = unused_st
a480: 72 69 6e 67 28 7a 2c 20 22 5c 5c 72 22 2c 20 22  ring(z, "\\r", "
a490: 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32 29 3b 0a  \\015", zBuf2);.
a4a0: 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72      }.    raw_pr
a4b0: 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a  intf(out, "'");.
a4c0: 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b      while( *z ){
a4d0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
a4e0: 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26  (c = z[i])!=0 &&
a4f0: 20 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27   c!='\n' && c!='
a500: 5c 72 27 20 26 26 20 63 21 3d 27 5c 27 27 3b 20  \r' && c!='\''; 
a510: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28  i++){}.      if(
a520: 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b 0a   c=='\'' ) i++;.
a530: 20 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a 20        if( i ){. 
a540: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
a550: 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c 20  tf(out, "%.*s", 
a560: 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a  i, z);.        z
a570: 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20   += i;.      }. 
a580: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27       if( c=='\''
a590: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
a5a0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29  printf(out, "'")
a5b0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
a5c0: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
a5d0: 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
a5e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a5f0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a     }.      z++;.
a600: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
a610: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  ' ){.        raw
a620: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
a630: 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 20 20 20  ", zNL);.       
a640: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
a650: 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69   }.      raw_pri
a660: 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a  ntf(out, "%s", z
a670: 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  CR);.    }.    r
a680: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a690: 27 22 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 52  '");.    if( nCR
a6a0: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
a6b0: 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73 27  intf(out, ",'%s'
a6c0: 2c 63 68 61 72 28 31 33 29 29 22 2c 20 7a 43 52  ,char(13))", zCR
a6d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
a6e0: 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72 61   nNL ){.      ra
a6f0: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c  w_printf(out, ",
a700: 27 25 73 27 2c 63 68 61 72 28 31 30 29 29 22 2c  '%s',char(10))",
a710: 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   zNL);.    }.  }
a720: 0a 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 6f  .  setTextMode(o
a730: 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ut, 1);.}../*.**
a740: 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   Output the give
a750: 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 71 75  n string as a qu
a760: 6f 74 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  oted according t
a770: 6f 20 43 20 6f 72 20 54 43 4c 20 71 75 6f 74 69  o C or TCL quoti
a780: 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 73 74 61  ng rules..*/.sta
a790: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
a7a0: 63 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f  c_string(FILE *o
a7b0: 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ut, const char *
a7c0: 7a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  z){.  unsigned i
a7d0: 6e 74 20 63 3b 0a 20 20 66 70 75 74 63 28 27 22  nt c;.  fputc('"
a7e0: 27 2c 20 6f 75 74 29 3b 0a 20 20 77 68 69 6c 65  ', out);.  while
a7f0: 28 20 28 63 20 3d 20 2a 28 7a 2b 2b 29 29 21 3d  ( (c = *(z++))!=
a800: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d  0 ){.    if( c==
a810: 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 66 70  '\\' ){.      fp
a820: 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
a830: 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29     fputc(c, out)
a840: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a850: 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20  c=='"' ){.      
a860: 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29  fputc('\\', out)
a870: 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 22  ;.      fputc('"
a880: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ', out);.    }el
a890: 73 65 20 69 66 28 20 63 3d 3d 27 5c 74 27 20 29  se if( c=='\t' )
a8a0: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c  {.      fputc('\
a8b0: 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  \', out);.      
a8c0: 66 70 75 74 63 28 27 74 27 2c 20 6f 75 74 29 3b  fputc('t', out);
a8d0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
a8e0: 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  =='\n' ){.      
a8f0: 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29  fputc('\\', out)
a900: 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 6e  ;.      fputc('n
a910: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ', out);.    }el
a920: 73 65 20 69 66 28 20 63 3d 3d 27 5c 72 27 20 29  se if( c=='\r' )
a930: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c  {.      fputc('\
a940: 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  \', out);.      
a950: 66 70 75 74 63 28 27 72 27 2c 20 6f 75 74 29 3b  fputc('r', out);
a960: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
a970: 69 73 70 72 69 6e 74 28 63 26 30 78 66 66 29 20  isprint(c&0xff) 
a980: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
a990: 6e 74 66 28 6f 75 74 2c 20 22 5c 5c 25 30 33 6f  ntf(out, "\\%03o
a9a0: 22 2c 20 63 26 30 78 66 66 29 3b 0a 20 20 20 20  ", c&0xff);.    
a9b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 75  }else{.      fpu
a9c0: 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20  tc(c, out);.    
a9d0: 7d 0a 20 20 7d 0a 20 20 66 70 75 74 63 28 27 22  }.  }.  fputc('"
a9e0: 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ', out);.}../*.*
a9f0: 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76  * Output the giv
aa00: 65 6e 20 73 74 72 69 6e 67 20 77 69 74 68 20 63  en string with c
aa10: 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20 61  haracters that a
aa20: 72 65 20 73 70 65 63 69 61 6c 20 74 6f 0a 2a 2a  re special to.**
aa30: 20 48 54 4d 4c 20 65 73 63 61 70 65 64 2e 0a 2a   HTML escaped..*
aa40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
aa50: 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67  tput_html_string
aa60: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73  (FILE *out, cons
aa70: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
aa80: 74 20 69 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  t i;.  if( z==0 
aa90: 29 20 7a 20 3d 20 22 22 3b 0a 20 20 77 68 69 6c  ) z = "";.  whil
aaa0: 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 66 6f 72  e( *z ){.    for
aab0: 28 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a 20 20 20  (i=0;   z[i].   
aac0: 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d           && z[i]
aad0: 21 3d 27 3c 27 0a 20 20 20 20 20 20 20 20 20 20  !='<'.          
aae0: 20 20 26 26 20 7a 5b 69 5d 21 3d 27 26 27 0a 20    && z[i]!='&'. 
aaf0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b             && z[
ab00: 69 5d 21 3d 27 3e 27 0a 20 20 20 20 20 20 20 20  i]!='>'.        
ab10: 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 22      && z[i]!='\"
ab20: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  '.            &&
ab30: 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a 20 20 20   z[i]!='\'';.   
ab40: 20 20 20 20 20 69 2b 2b 29 7b 7d 0a 20 20 20 20       i++){}.    
ab50: 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20  if( i>0 ){.     
ab60: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
ab70: 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b 0a 20 20  ,"%.*s",i,z);.  
ab80: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d    }.    if( z[i]
ab90: 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20 20 72  =='<' ){.      r
aba0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26  aw_printf(out,"&
abb0: 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lt;");.    }else
abc0: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26 27 20 29   if( z[i]=='&' )
abd0: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
abe0: 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29 3b  tf(out,"&amp;");
abf0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
ac00: 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20 20 20 20  [i]=='>' ){.    
ac10: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
ac20: 2c 22 26 67 74 3b 22 29 3b 0a 20 20 20 20 7d 65  ,"&gt;");.    }e
ac30: 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c  lse if( z[i]=='\
ac40: 22 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  "' ){.      raw_
ac50: 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 71 75 6f  printf(out,"&quo
ac60: 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  t;");.    }else 
ac70: 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20 29  if( z[i]=='\'' )
ac80: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
ac90: 74 66 28 6f 75 74 2c 22 26 23 33 39 3b 22 29 3b  tf(out,"&#39;");
aca0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
acb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
acc0: 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31 3b 0a 20     z += i + 1;. 
acd0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61   }.}../*.** If a
ace0: 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20   field contains 
acf0: 61 6e 79 20 63 68 61 72 61 63 74 65 72 20 69 64  any character id
ad00: 65 6e 74 69 66 69 65 64 20 62 79 20 61 20 31 20  entified by a 1 
ad10: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
ad20: 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68 65 6e 20  .** array, then 
ad30: 74 68 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20  the string must 
ad40: 62 65 20 71 75 6f 74 65 64 20 66 6f 72 20 43 53  be quoted for CS
ad50: 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  V..*/.static con
ad60: 73 74 20 63 68 61 72 20 6e 65 65 64 43 73 76 51  st char needCsvQ
ad70: 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20 31 2c 20  uote[] = {.  1, 
ad80: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
ad90: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
ada0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20  1, 1, 1, 1, 1,. 
adb0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
adc0: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
add0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ade0: 31 2c 0a 20 20 31 2c 20 30 2c 20 31 2c 20 30 2c  1,.  1, 0, 1, 0,
adf0: 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 20 20 30   0, 0, 0, 1,   0
ae00: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
ae10: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
ae20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
ae30: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
ae40: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
ae50: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
ae60: 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,   0, 0, 0, 
ae70: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
ae80: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
ae90: 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c  0, 0, 0,   0, 0,
aea0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
aeb0: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
aec0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30   0, 0, 0, 0,   0
aed0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
aee0: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
aef0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
af00: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
af10: 2c 20 30 2c 20 30 2c 20 31 2c 0a 20 20 31 2c 20  , 0, 0, 1,.  1, 
af20: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
af30: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
af40: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20  1, 1, 1, 1, 1,. 
af50: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
af60: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
af70: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
af80: 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,.  1, 1, 1, 1,
af90: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
afa0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
afb0: 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31   1, 1,.  1, 1, 1
afc0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
afd0: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
afe0: 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20  , 1, 1, 1,.  1, 
aff0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b000: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
b010: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20  1, 1, 1, 1, 1,. 
b020: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b030: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
b040: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b050: 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,.  1, 1, 1, 1,
b060: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
b070: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b080: 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31   1, 1,.  1, 1, 1
b090: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b0a0: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
b0b0: 2c 20 31 2c 20 31 2c 20 31 2c 0a 7d 3b 0a 0a 2f  , 1, 1, 1,.};../
b0c0: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20 73 69  *.** Output a si
b0d0: 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 43 53 56  ngle term of CSV
b0e0: 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20 70 2d 3e  .  Actually, p->
b0f0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 20 69 73 20  colSeparator is 
b100: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20  used for.** the 
b110: 73 65 70 61 72 61 74 6f 72 2c 20 77 68 69 63 68  separator, which
b120: 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
b130: 62 65 20 61 20 63 6f 6d 6d 61 2e 20 20 70 2d 3e  be a comma.  p->
b140: 6e 75 6c 6c 56 61 6c 75 65 20 69 73 0a 2a 2a 20  nullValue is.** 
b150: 74 68 65 20 6e 75 6c 6c 20 76 61 6c 75 65 2e 20  the null value. 
b160: 20 53 74 72 69 6e 67 73 20 61 72 65 20 71 75 6f   Strings are quo
b170: 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79  ted if necessary
b180: 2e 20 20 54 68 65 20 73 65 70 61 72 61 74 6f 72  .  The separator
b190: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 69 73 73 75  .** is only issu
b1a0: 65 64 20 69 66 20 62 53 65 70 20 69 73 20 74 72  ed if bSep is tr
b1b0: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
b1c0: 69 64 20 6f 75 74 70 75 74 5f 63 73 76 28 53 68  id output_csv(Sh
b1d0: 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  ellState *p, con
b1e0: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
b1f0: 62 53 65 70 29 7b 0a 20 20 46 49 4c 45 20 2a 6f  bSep){.  FILE *o
b200: 75 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a 20 20 69  ut = p->out;.  i
b210: 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 75  f( z==0 ){.    u
b220: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  tf8_printf(out,"
b230: 25 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  %s",p->nullValue
b240: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b250: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
b260: 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70  Sep = strlen30(p
b270: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
b280: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  .    for(i=0; z[
b290: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
b2a0: 69 66 28 20 6e 65 65 64 43 73 76 51 75 6f 74 65  if( needCsvQuote
b2b0: 5b 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  [((unsigned char
b2c0: 2a 29 7a 29 5b 69 5d 5d 0a 20 20 20 20 20 20 20  *)z)[i]].       
b2d0: 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70 2d 3e 63    || (z[i]==p->c
b2e0: 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 20 26  olSeparator[0] &
b2f0: 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  &.             (
b300: 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d 65 6d 63 6d  nSep==1 || memcm
b310: 70 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  p(z, p->colSepar
b320: 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d 30 29 29  ator, nSep)==0))
b330: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20   ){.        i = 
b340: 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  0;.        break
b350: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b360: 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
b370: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51 75 6f        char *zQuo
b380: 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ted = sqlite3_mp
b390: 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20  rintf("\"%w\"", 
b3a0: 7a 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  z);.      utf8_p
b3b0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c  rintf(out, "%s",
b3c0: 20 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 20   zQuoted);.     
b3d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
b3e0: 75 6f 74 65 64 29 3b 0a 20 20 20 20 7d 65 6c 73  uoted);.    }els
b3f0: 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  e{.      utf8_pr
b400: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
b410: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  z);.    }.  }.  
b420: 69 66 28 20 62 53 65 70 20 29 7b 0a 20 20 20 20  if( bSep ){.    
b430: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
b440: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c  ut, "%s", p->col
b450: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 7d 0a  Separator);.  }.
b460: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
b470: 75 74 69 6e 65 20 72 75 6e 73 20 77 68 65 6e 20  utine runs when 
b480: 74 68 65 20 75 73 65 72 20 70 72 65 73 73 65 73  the user presses
b490: 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74 61 74 69   Ctrl-C.*/.stati
b4a0: 63 20 76 6f 69 64 20 69 6e 74 65 72 72 75 70 74  c void interrupt
b4b0: 5f 68 61 6e 64 6c 65 72 28 69 6e 74 20 4e 6f 74  _handler(int Not
b4c0: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
b4d0: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
b4e0: 64 29 3b 0a 20 20 73 65 65 6e 49 6e 74 65 72 72  d);.  seenInterr
b4f0: 75 70 74 2b 2b 3b 0a 20 20 69 66 28 20 73 65 65  upt++;.  if( see
b500: 6e 49 6e 74 65 72 72 75 70 74 3e 32 20 29 20 65  nInterrupt>2 ) e
b510: 78 69 74 28 31 29 3b 0a 20 20 69 66 28 20 67 6c  xit(1);.  if( gl
b520: 6f 62 61 6c 44 62 20 29 20 73 71 6c 69 74 65 33  obalDb ) sqlite3
b530: 5f 69 6e 74 65 72 72 75 70 74 28 67 6c 6f 62 61  _interrupt(globa
b540: 6c 44 62 29 3b 0a 7d 0a 0a 23 69 66 20 28 64 65  lDb);.}..#if (de
b550: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
b560: 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29   defined(WIN32))
b570: 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57 49   && !defined(_WI
b580: 4e 33 32 5f 57 43 45 29 0a 2f 2a 0a 2a 2a 20 54  N32_WCE)./*.** T
b590: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
b5a0: 20 66 6f 72 20 63 6f 6e 73 6f 6c 65 20 65 76 65   for console eve
b5b0: 6e 74 73 20 28 65 2e 67 2e 20 43 74 72 6c 2d 43  nts (e.g. Ctrl-C
b5c0: 29 20 6f 6e 20 57 69 6e 33 32 0a 2a 2f 0a 73 74  ) on Win32.*/.st
b5d0: 61 74 69 63 20 42 4f 4f 4c 20 57 49 4e 41 50 49  atic BOOL WINAPI
b5e0: 20 43 6f 6e 73 6f 6c 65 43 74 72 6c 48 61 6e 64   ConsoleCtrlHand
b5f0: 6c 65 72 28 0a 20 20 44 57 4f 52 44 20 64 77 43  ler(.  DWORD dwC
b600: 74 72 6c 54 79 70 65 20 2f 2a 20 4f 6e 65 20 6f  trlType /* One o
b610: 66 20 74 68 65 20 43 54 52 4c 5f 2a 5f 45 56 45  f the CTRL_*_EVE
b620: 4e 54 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a  NT constants */.
b630: 29 7b 0a 20 20 69 66 28 20 64 77 43 74 72 6c 54  ){.  if( dwCtrlT
b640: 79 70 65 3d 3d 43 54 52 4c 5f 43 5f 45 56 45 4e  ype==CTRL_C_EVEN
b650: 54 20 29 7b 0a 20 20 20 20 69 6e 74 65 72 72 75  T ){.    interru
b660: 70 74 5f 68 61 6e 64 6c 65 72 28 30 29 3b 0a 20  pt_handler(0);. 
b670: 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a     return TRUE;.
b680: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 41 4c    }.  return FAL
b690: 53 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  SE;.}.#endif..#i
b6a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b6b0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
b6c0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 22  /*.** When the "
b6d0: 2e 61 75 74 68 20 4f 4e 22 20 69 73 20 73 65 74  .auth ON" is set
b6e0: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
b6f0: 61 75 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62  authorizer callb
b700: 61 63 6b 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65  ack is.** invoke
b710: 64 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65  d.  It always re
b720: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
b730: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
b740: 68 65 6c 6c 41 75 74 68 28 0a 20 20 76 6f 69 64  hellAuth(.  void
b750: 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 0a 20   *pClientData,. 
b760: 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74   int op,.  const
b770: 20 63 68 61 72 20 2a 7a 41 31 2c 0a 20 20 63 6f   char *zA1,.  co
b780: 6e 73 74 20 63 68 61 72 20 2a 7a 41 32 2c 0a 20  nst char *zA2,. 
b790: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 33   const char *zA3
b7a0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b7b0: 7a 41 34 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74  zA4.){.  ShellSt
b7c0: 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53  ate *p = (ShellS
b7d0: 74 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61 74  tate*)pClientDat
b7e0: 61 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  a;.  static cons
b7f0: 74 20 63 68 61 72 20 2a 61 7a 41 63 74 69 6f 6e  t char *azAction
b800: 5b 5d 20 3d 20 7b 20 30 2c 0a 20 20 20 20 20 22  [] = { 0,.     "
b810: 43 52 45 41 54 45 5f 49 4e 44 45 58 22 2c 20 20  CREATE_INDEX",  
b820: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f 54         "CREATE_T
b830: 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 22  ABLE",         "
b840: 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
b850: 58 22 2c 0a 20 20 20 20 20 22 43 52 45 41 54 45  X",.     "CREATE
b860: 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20  _TEMP_TABLE",   
b870: 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52   "CREATE_TEMP_TR
b880: 49 47 47 45 52 22 2c 20 20 22 43 52 45 41 54 45  IGGER",  "CREATE
b890: 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20  _TEMP_VIEW",.   
b8a0: 20 20 22 43 52 45 41 54 45 5f 54 52 49 47 47 45    "CREATE_TRIGGE
b8b0: 52 22 2c 20 20 20 20 20 20 20 22 43 52 45 41 54  R",       "CREAT
b8c0: 45 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20 20  E_VIEW",        
b8d0: 20 20 22 44 45 4c 45 54 45 22 2c 0a 20 20 20 20    "DELETE",.    
b8e0: 20 22 44 52 4f 50 5f 49 4e 44 45 58 22 2c 20 20   "DROP_INDEX",  
b8f0: 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 54           "DROP_T
b900: 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20  ABLE",          
b910: 20 22 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45   "DROP_TEMP_INDE
b920: 58 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f 54  X",.     "DROP_T
b930: 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20  EMP_TABLE",     
b940: 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47   "DROP_TEMP_TRIG
b950: 47 45 52 22 2c 20 20 20 20 22 44 52 4f 50 5f 54  GER",    "DROP_T
b960: 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20 20 20  EMP_VIEW",.     
b970: 22 44 52 4f 50 5f 54 52 49 47 47 45 52 22 2c 20  "DROP_TRIGGER", 
b980: 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56 49          "DROP_VI
b990: 45 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  EW",            
b9a0: 22 49 4e 53 45 52 54 22 2c 0a 20 20 20 20 20 22  "INSERT",.     "
b9b0: 50 52 41 47 4d 41 22 2c 20 20 20 20 20 20 20 20  PRAGMA",        
b9c0: 20 20 20 20 20 20 20 22 52 45 41 44 22 2c 20 20         "READ",  
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
b9e0: 53 45 4c 45 43 54 22 2c 0a 20 20 20 20 20 22 54  SELECT",.     "T
b9f0: 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20 20 20 20  RANSACTION",    
ba00: 20 20 20 20 20 20 22 55 50 44 41 54 45 22 2c 20        "UPDATE", 
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41                "A
ba20: 54 54 41 43 48 22 2c 0a 20 20 20 20 20 22 44 45  TTACH",.     "DE
ba30: 54 41 43 48 22 2c 20 20 20 20 20 20 20 20 20 20  TACH",          
ba40: 20 20 20 20 20 22 41 4c 54 45 52 5f 54 41 42 4c       "ALTER_TABL
ba50: 45 22 2c 20 20 20 20 20 20 20 20 20 20 22 52 45  E",          "RE
ba60: 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 41 4e  INDEX",.     "AN
ba70: 41 4c 59 5a 45 22 2c 20 20 20 20 20 20 20 20 20  ALYZE",         
ba80: 20 20 20 20 20 22 43 52 45 41 54 45 5f 56 54 41       "CREATE_VTA
ba90: 42 4c 45 22 2c 20 20 20 20 20 20 20 20 22 44 52  BLE",        "DR
baa0: 4f 50 5f 56 54 41 42 4c 45 22 2c 0a 20 20 20 20  OP_VTABLE",.    
bab0: 20 22 46 55 4e 43 54 49 4f 4e 22 2c 20 20 20 20   "FUNCTION",    
bac0: 20 20 20 20 20 20 20 20 20 22 53 41 56 45 50 4f           "SAVEPO
bad0: 49 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20 20  INT",           
bae0: 20 22 52 45 43 55 52 53 49 56 45 22 0a 20 20 7d   "RECURSIVE".  }
baf0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
bb00: 73 74 20 63 68 61 72 20 2a 61 7a 5b 34 5d 3b 0a  st char *az[4];.
bb10: 20 20 61 7a 5b 30 5d 20 3d 20 7a 41 31 3b 0a 20    az[0] = zA1;. 
bb20: 20 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b 0a 20 20   az[1] = zA2;.  
bb30: 61 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a 20 20 61  az[2] = zA3;.  a
bb40: 7a 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20 20 75 74  z[3] = zA4;.  ut
bb50: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
bb60: 2c 20 22 61 75 74 68 6f 72 69 7a 65 72 3a 20 25  , "authorizer: %
bb70: 73 22 2c 20 61 7a 41 63 74 69 6f 6e 5b 6f 70 5d  s", azAction[op]
bb80: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
bb90: 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 61 77  4; i++){.    raw
bba0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
bbb0: 22 20 22 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  " ");.    if( az
bbc0: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 6f 75 74  [i] ){.      out
bbd0: 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e  put_c_string(p->
bbe0: 6f 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20  out, az[i]);.   
bbf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
bc00: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
bc10: 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a   "NULL");.    }.
bc20: 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66    }.  raw_printf
bc30: 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
bc40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bc50: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
bc60: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 63 68 65  .** Print a sche
bc70: 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50  ma statement.  P
bc80: 61 72 74 20 6f 66 20 4d 4f 44 45 5f 53 65 6d 69  art of MODE_Semi
bc90: 20 61 6e 64 20 4d 4f 44 45 5f 50 72 65 74 74 79   and MODE_Pretty
bca0: 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54   output..**.** T
bcb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 76  his routine conv
bcc0: 65 72 74 73 20 73 6f 6d 65 20 43 52 45 41 54 45  erts some CREATE
bcd0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
bce0: 73 20 66 6f 72 20 73 68 61 64 6f 77 20 74 61 62  s for shadow tab
bcf0: 6c 65 73 0a 2a 2a 20 69 6e 20 46 54 53 33 2f 34  les.** in FTS3/4
bd00: 2f 35 20 69 6e 74 6f 20 43 52 45 41 54 45 20 54  /5 into CREATE T
bd10: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
bd20: 54 53 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  TS statements..*
bd30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  /.static void pr
bd40: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 46 49  intSchemaLine(FI
bd50: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
bd60: 68 61 72 20 2a 7a 2c 20 63 6f 6e 73 74 20 63 68  har *z, const ch
bd70: 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 69 66  ar *zTail){.  if
bd80: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ( sqlite3_strglo
bd90: 62 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  b("CREATE TABLE 
bda0: 5b 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d 30 20 29  ['\"]*", z)==0 )
bdb0: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
bdc0: 66 28 6f 75 74 2c 20 22 43 52 45 41 54 45 20 54  f(out, "CREATE T
bdd0: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
bde0: 54 53 20 25 73 25 73 22 2c 20 7a 2b 31 33 2c 20  TS %s%s", z+13, 
bdf0: 7a 54 61 69 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  zTail);.  }else{
be00: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
be10: 28 6f 75 74 2c 20 22 25 73 25 73 22 2c 20 7a 2c  (out, "%s%s", z,
be20: 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a 7d 0a 73   zTail);.  }.}.s
be30: 74 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74  tatic void print
be40: 53 63 68 65 6d 61 4c 69 6e 65 4e 28 46 49 4c 45  SchemaLineN(FILE
be50: 20 2a 6f 75 74 2c 20 63 68 61 72 20 2a 7a 2c 20   *out, char *z, 
be60: 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63 68 61  int n, const cha
be70: 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 63 68 61  r *zTail){.  cha
be80: 72 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20 20 7a 5b  r c = z[n];.  z[
be90: 6e 5d 20 3d 20 30 3b 0a 20 20 70 72 69 6e 74 53  n] = 0;.  printS
bea0: 63 68 65 6d 61 4c 69 6e 65 28 6f 75 74 2c 20 7a  chemaLine(out, z
beb0: 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7a 5b 6e 5d  , zTail);.  z[n]
bec0: 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = c;.}../*.** R
bed0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 73 74  eturn true if st
bee0: 72 69 6e 67 20 7a 5b 5d 20 68 61 73 20 6e 6f 74  ring z[] has not
bef0: 68 69 6e 67 20 62 75 74 20 77 68 69 74 65 73 70  hing but whitesp
bf00: 61 63 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73  ace and comments
bf10: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
bf20: 66 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65  f the first line
bf30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bf40: 77 73 54 6f 45 6f 6c 28 63 6f 6e 73 74 20 63 68  wsToEol(const ch
bf50: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b  ar *z){.  int i;
bf60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d  .  for(i=0; z[i]
bf70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
bf80: 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 72 65 74  z[i]=='\n' ) ret
bf90: 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 49  urn 1;.    if( I
bfa0: 73 53 70 61 63 65 28 7a 5b 69 5d 29 20 29 20 63  sSpace(z[i]) ) c
bfb0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
bfc0: 20 7a 5b 69 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b   z[i]=='-' && z[
bfd0: 69 2b 31 5d 3d 3d 27 2d 27 20 29 20 72 65 74 75  i+1]=='-' ) retu
bfe0: 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 1;.    return
bff0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
c000: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   1;.}../*.** Add
c010: 20 61 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20   a new entry to 
c020: 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52  the EXPLAIN QUER
c030: 59 20 50 4c 41 4e 20 64 61 74 61 0a 2a 2f 0a 73  Y PLAN data.*/.s
c040: 74 61 74 69 63 20 76 6f 69 64 20 65 71 70 5f 61  tatic void eqp_a
c050: 70 70 65 6e 64 28 53 68 65 6c 6c 53 74 61 74 65  ppend(ShellState
c060: 20 2a 70 2c 20 69 6e 74 20 69 45 71 70 49 64 2c   *p, int iEqpId,
c070: 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73 74 20 63   int p2, const c
c080: 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20 45  har *zText){.  E
c090: 51 50 47 72 61 70 68 52 6f 77 20 2a 70 4e 65 77  QPGraphRow *pNew
c0a0: 3b 0a 20 20 69 6e 74 20 6e 54 65 78 74 20 3d 20  ;.  int nText = 
c0b0: 73 74 72 6c 65 6e 33 30 28 7a 54 65 78 74 29 3b  strlen30(zText);
c0c0: 0a 20 20 69 66 28 20 70 2d 3e 61 75 74 6f 45 51  .  if( p->autoEQ
c0d0: 50 74 65 73 74 20 29 7b 0a 20 20 20 20 75 74 66  Ptest ){.    utf
c0e0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
c0f0: 20 22 25 64 2c 25 64 2c 25 73 5c 6e 22 2c 20 69   "%d,%d,%s\n", i
c100: 45 71 70 49 64 2c 20 70 32 2c 20 7a 54 65 78 74  EqpId, p2, zText
c110: 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20  );.  }.  pNew = 
c120: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
c130: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
c140: 2b 20 6e 54 65 78 74 20 29 3b 0a 20 20 69 66 28  + nText );.  if(
c150: 20 70 4e 65 77 3d 3d 30 20 29 20 73 68 65 6c 6c   pNew==0 ) shell
c160: 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29  _out_of_memory()
c170: 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 71 70 49 64  ;.  pNew->iEqpId
c180: 20 3d 20 69 45 71 70 49 64 3b 0a 20 20 70 4e 65   = iEqpId;.  pNe
c190: 77 2d 3e 69 50 61 72 65 6e 74 49 64 20 3d 20 70  w->iParentId = p
c1a0: 32 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77  2;.  memcpy(pNew
c1b0: 2d 3e 7a 54 65 78 74 2c 20 7a 54 65 78 74 2c 20  ->zText, zText, 
c1c0: 6e 54 65 78 74 2b 31 29 3b 0a 20 20 70 4e 65 77  nText+1);.  pNew
c1d0: 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 69  ->pNext = 0;.  i
c1e0: 66 28 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c 61  f( p->sGraph.pLa
c1f0: 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 73 47 72  st ){.    p->sGr
c200: 61 70 68 2e 70 4c 61 73 74 2d 3e 70 4e 65 78 74  aph.pLast->pNext
c210: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 65 6c 73 65   = pNew;.  }else
c220: 7b 0a 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e  {.    p->sGraph.
c230: 70 52 6f 77 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  pRow = pNew;.  }
c240: 0a 20 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c 61  .  p->sGraph.pLa
c250: 73 74 20 3d 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  st = pNew;.}../*
c260: 0a 2a 2a 20 46 72 65 65 20 61 6e 64 20 72 65 73  .** Free and res
c270: 65 74 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51  et the EXPLAIN Q
c280: 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61 20 74  UERY PLAN data t
c290: 68 61 74 20 68 61 73 20 62 65 65 6e 20 63 6f 6c  hat has been col
c2a0: 6c 65 63 74 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e  lected.** in p->
c2b0: 73 47 72 61 70 68 2e 0a 2a 2f 0a 73 74 61 74 69  sGraph..*/.stati
c2c0: 63 20 76 6f 69 64 20 65 71 70 5f 72 65 73 65 74  c void eqp_reset
c2d0: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
c2e0: 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a  .  EQPGraphRow *
c2f0: 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  pRow, *pNext;.  
c300: 66 6f 72 28 70 52 6f 77 20 3d 20 70 2d 3e 73 47  for(pRow = p->sG
c310: 72 61 70 68 2e 70 52 6f 77 3b 20 70 52 6f 77 3b  raph.pRow; pRow;
c320: 20 70 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b 0a   pRow = pNext){.
c330: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 52 6f 77      pNext = pRow
c340: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
c350: 69 74 65 33 5f 66 72 65 65 28 70 52 6f 77 29 3b  ite3_free(pRow);
c360: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70  .  }.  memset(&p
c370: 2d 3e 73 47 72 61 70 68 2c 20 30 2c 20 73 69 7a  ->sGraph, 0, siz
c380: 65 6f 66 28 70 2d 3e 73 47 72 61 70 68 29 29 3b  eof(p->sGraph));
c390: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68  .}../* Return th
c3a0: 65 20 6e 65 78 74 20 45 58 50 4c 41 49 4e 20 51  e next EXPLAIN Q
c3b0: 55 45 52 59 20 50 4c 41 4e 20 6c 69 6e 65 20 77  UERY PLAN line w
c3c0: 69 74 68 20 69 45 71 70 49 64 20 74 68 61 74 20  ith iEqpId that 
c3d0: 6f 63 63 75 72 73 20 61 66 74 65 72 0a 2a 2a 20  occurs after.** 
c3e0: 70 4f 6c 64 2c 20 6f 72 20 72 65 74 75 72 6e 20  pOld, or return 
c3f0: 74 68 65 20 66 69 72 73 74 20 73 75 63 68 20 6c  the first such l
c400: 69 6e 65 20 69 66 20 70 4f 6c 64 20 69 73 20 4e  ine if pOld is N
c410: 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 45 51  ULL.*/.static EQ
c420: 50 47 72 61 70 68 52 6f 77 20 2a 65 71 70 5f 6e  PGraphRow *eqp_n
c430: 65 78 74 5f 72 6f 77 28 53 68 65 6c 6c 53 74 61  ext_row(ShellSta
c440: 74 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70 49  te *p, int iEqpI
c450: 64 2c 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a  d, EQPGraphRow *
c460: 70 4f 6c 64 29 7b 0a 20 20 45 51 50 47 72 61 70  pOld){.  EQPGrap
c470: 68 52 6f 77 20 2a 70 52 6f 77 20 3d 20 70 4f 6c  hRow *pRow = pOl
c480: 64 20 3f 20 70 4f 6c 64 2d 3e 70 4e 65 78 74 20  d ? pOld->pNext 
c490: 3a 20 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77  : p->sGraph.pRow
c4a0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 52 6f 77 20  ;.  while( pRow 
c4b0: 26 26 20 70 52 6f 77 2d 3e 69 50 61 72 65 6e 74  && pRow->iParent
c4c0: 49 64 21 3d 69 45 71 70 49 64 20 29 20 70 52 6f  Id!=iEqpId ) pRo
c4d0: 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65 78 74 3b  w = pRow->pNext;
c4e0: 0a 20 20 72 65 74 75 72 6e 20 70 52 6f 77 3b 0a  .  return pRow;.
c4f0: 7d 0a 0a 2f 2a 20 52 65 6e 64 65 72 20 61 20 73  }../* Render a s
c500: 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f 66 20 74  ingle level of t
c510: 68 65 20 67 72 61 70 68 20 74 68 61 74 20 68 61  he graph that ha
c520: 73 20 69 45 71 70 49 64 20 61 73 20 69 74 73 20  s iEqpId as its 
c530: 70 61 72 65 6e 74 2e 20 20 43 61 6c 6c 65 64 0a  parent.  Called.
c540: 2a 2a 20 72 65 63 75 72 73 69 76 65 6c 79 20 74  ** recursively t
c550: 6f 20 72 65 6e 64 65 72 20 73 75 62 6c 65 76 65  o render subleve
c560: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
c570: 69 64 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c 65  id eqp_render_le
c580: 76 65 6c 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  vel(ShellState *
c590: 70 2c 20 69 6e 74 20 69 45 71 70 49 64 29 7b 0a  p, int iEqpId){.
c5a0: 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70    EQPGraphRow *p
c5b0: 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69  Row, *pNext;.  i
c5c0: 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28  nt n = strlen30(
c5d0: 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69  p->sGraph.zPrefi
c5e0: 78 29 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  x);.  char *z;. 
c5f0: 20 66 6f 72 28 70 52 6f 77 20 3d 20 65 71 70 5f   for(pRow = eqp_
c600: 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69 45 71 70  next_row(p, iEqp
c610: 49 64 2c 20 30 29 3b 20 70 52 6f 77 3b 20 70 52  Id, 0); pRow; pR
c620: 6f 77 20 3d 20 70 4e 65 78 74 29 7b 0a 20 20 20  ow = pNext){.   
c630: 20 70 4e 65 78 74 20 3d 20 65 71 70 5f 6e 65 78   pNext = eqp_nex
c640: 74 5f 72 6f 77 28 70 2c 20 69 45 71 70 49 64 2c  t_row(p, iEqpId,
c650: 20 70 52 6f 77 29 3b 0a 20 20 20 20 7a 20 3d 20   pRow);.    z = 
c660: 70 52 6f 77 2d 3e 7a 54 65 78 74 3b 0a 20 20 20  pRow->zText;.   
c670: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
c680: 6f 75 74 2c 20 22 25 73 25 73 25 73 5c 6e 22 2c  out, "%s%s%s\n",
c690: 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66   p->sGraph.zPref
c6a0: 69 78 2c 20 70 4e 65 78 74 20 3f 20 22 7c 2d 2d  ix, pNext ? "|--
c6b0: 22 20 3a 20 22 60 2d 2d 22 2c 20 7a 29 3b 0a 20  " : "`--", z);. 
c6c0: 20 20 20 69 66 28 20 6e 3c 28 69 6e 74 29 73 69     if( n<(int)si
c6d0: 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70 68 2e 7a  zeof(p->sGraph.z
c6e0: 50 72 65 66 69 78 29 2d 37 20 29 7b 0a 20 20 20  Prefix)-7 ){.   
c6f0: 20 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 73 47     memcpy(&p->sG
c700: 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 5d 2c  raph.zPrefix[n],
c710: 20 70 4e 65 78 74 20 3f 20 22 7c 20 20 22 20 3a   pNext ? "|  " :
c720: 20 22 20 20 20 22 2c 20 34 29 3b 0a 20 20 20 20   "   ", 4);.    
c730: 20 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c 65 76    eqp_render_lev
c740: 65 6c 28 70 2c 20 70 52 6f 77 2d 3e 69 45 71 70  el(p, pRow->iEqp
c750: 49 64 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73 47  Id);.      p->sG
c760: 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 5d 20  raph.zPrefix[n] 
c770: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
c780: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20  ../*.** Display 
c790: 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 45 58  and reset the EX
c7a0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
c7b0: 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63 20   data.*/.static 
c7c0: 76 6f 69 64 20 65 71 70 5f 72 65 6e 64 65 72 28  void eqp_render(
c7d0: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
c7e0: 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70    EQPGraphRow *p
c7f0: 52 6f 77 20 3d 20 70 2d 3e 73 47 72 61 70 68 2e  Row = p->sGraph.
c800: 70 52 6f 77 3b 0a 20 20 69 66 28 20 70 52 6f 77  pRow;.  if( pRow
c810: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52 6f 77   ){.    if( pRow
c820: 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 2d 27 20  ->zText[0]=='-' 
c830: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 6f  ){.      if( pRo
c840: 77 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 7b 0a 20  w->pNext==0 ){. 
c850: 20 20 20 20 20 20 20 65 71 70 5f 72 65 73 65 74         eqp_reset
c860: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
c870: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
c880: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
c890: 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 70  ->out, "%s\n", p
c8a0: 52 6f 77 2d 3e 7a 54 65 78 74 2b 33 29 3b 0a 20  Row->zText+3);. 
c8b0: 20 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 70       p->sGraph.p
c8c0: 52 6f 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65 78  Row = pRow->pNex
c8d0: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
c8e0: 5f 66 72 65 65 28 70 52 6f 77 29 3b 0a 20 20 20  _free(pRow);.   
c8f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74   }else{.      ut
c900: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
c910: 2c 20 22 51 55 45 52 59 20 50 4c 41 4e 5c 6e 22  , "QUERY PLAN\n"
c920: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  );.    }.    p->
c930: 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 30  sGraph.zPrefix[0
c940: 5d 20 3d 20 30 3b 0a 20 20 20 20 65 71 70 5f 72  ] = 0;.    eqp_r
c950: 65 6e 64 65 72 5f 6c 65 76 65 6c 28 70 2c 20 30  ender_level(p, 0
c960: 29 3b 0a 20 20 20 20 65 71 70 5f 72 65 73 65 74  );.    eqp_reset
c970: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
c980: 2a 20 50 72 6f 67 72 65 73 73 20 68 61 6e 64 6c  * Progress handl
c990: 65 72 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  er callback..*/.
c9a0: 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 67 72  static int progr
c9b0: 65 73 73 5f 68 61 6e 64 6c 65 72 28 76 6f 69 64  ess_handler(void
c9c0: 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 29 20 7b   *pClientData) {
c9d0: 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
c9e0: 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29   = (ShellState*)
c9f0: 70 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 70  pClientData;.  p
ca00: 2d 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20  ->nProgress++;. 
ca10: 20 69 66 28 20 70 2d 3e 6e 50 72 6f 67 72 65 73   if( p->nProgres
ca20: 73 3e 3d 70 2d 3e 6d 78 50 72 6f 67 72 65 73 73  s>=p->mxProgress
ca30: 20 26 26 20 70 2d 3e 6d 78 50 72 6f 67 72 65 73   && p->mxProgres
ca40: 73 3e 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70  s>0 ){.    raw_p
ca50: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50  rintf(p->out, "P
ca60: 72 6f 67 72 65 73 73 20 6c 69 6d 69 74 20 72 65  rogress limit re
ca70: 61 63 68 65 64 20 28 25 75 29 5c 6e 22 2c 20 70  ached (%u)\n", p
ca80: 2d 3e 6e 50 72 6f 67 72 65 73 73 29 3b 0a 20 20  ->nProgress);.  
ca90: 20 20 69 66 28 20 70 2d 3e 66 6c 67 50 72 6f 67    if( p->flgProg
caa0: 72 65 73 73 20 26 20 50 52 4f 47 52 45 53 53 5f  ress & PROGRESS_
cab0: 52 45 53 45 54 20 29 20 70 2d 3e 6e 50 72 6f 67  RESET ) p->nProg
cac0: 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 69 66  ress = 0;.    if
cad0: 28 20 70 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73  ( p->flgProgress
cae0: 20 26 20 50 52 4f 47 52 45 53 53 5f 4f 4e 43 45   & PROGRESS_ONCE
caf0: 20 29 20 70 2d 3e 6d 78 50 72 6f 67 72 65 73 73   ) p->mxProgress
cb00: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
cb10: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   1;.  }.  if( (p
cb20: 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73 20 26 20  ->flgProgress & 
cb30: 50 52 4f 47 52 45 53 53 5f 51 55 49 45 54 29 3d  PROGRESS_QUIET)=
cb40: 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72  =0 ){.    raw_pr
cb50: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 72  intf(p->out, "Pr
cb60: 6f 67 72 65 73 73 20 25 75 5c 6e 22 2c 20 70 2d  ogress %u\n", p-
cb70: 3e 6e 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 7d  >nProgress);.  }
cb80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
cb90: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
cba0: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
cbb0: 6e 65 20 74 68 61 74 20 74 68 65 20 73 68 65 6c  ne that the shel
cbc0: 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72  l.** invokes for
cbd0: 20 65 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71   each row of a q
cbe0: 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a  uery result..*/.
cbf0: 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c  static int shell
cc00: 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69  _callback(.  voi
cc10: 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 6e  d *pArg,.  int n
cc20: 41 72 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Arg,        /* N
cc30: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
cc40: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63 68 61  columns */.  cha
cc50: 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 2f 2a  r **azArg,    /*
cc60: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 72 65   Text of each re
cc70: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  sult column */. 
cc80: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c 20 20   char **azCol,  
cc90: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
cca0: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 54 79  s */.  int *aiTy
ccb0: 70 65 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  pe      /* Colum
ccc0: 6e 20 74 79 70 65 73 20 2a 2f 0a 29 7b 0a 20 20  n types */.){.  
ccd0: 69 6e 74 20 69 3b 0a 20 20 53 68 65 6c 6c 53 74  int i;.  ShellSt
cce0: 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53  ate *p = (ShellS
ccf0: 74 61 74 65 2a 29 70 41 72 67 3b 0a 0a 20 20 69  tate*)pArg;..  i
cd00: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65  f( azArg==0 ) re
cd10: 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68  turn 0;.  switch
cd20: 28 20 70 2d 3e 63 4d 6f 64 65 20 29 7b 0a 20 20  ( p->cMode ){.  
cd30: 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69 6e 65    case MODE_Line
cd40: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 20  : {.      int w 
cd50: 3d 20 35 3b 0a 20 20 20 20 20 20 69 66 28 20 61  = 5;.      if( a
cd60: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
cd70: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
cd80: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
cd90: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
cda0: 73 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69  strlen30(azCol[i
cdb0: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
cdc0: 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
cdd0: 6c 65 6e 3e 77 20 29 20 77 20 3d 20 6c 65 6e 3b  len>w ) w = len;
cde0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
cdf0: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20  f( p->cnt++>0 ) 
ce00: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
ce10: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
ce20: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
ce30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
ce40: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
ce50: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
ce60: 6f 75 74 2c 22 25 2a 73 20 3d 20 25 73 25 73 22  out,"%*s = %s%s"
ce70: 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 0a 20  , w, azCol[i],. 
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
ce90: 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b  zArg[i] ? azArg[
cea0: 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75  i] : p->nullValu
ceb0: 65 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  e, p->rowSeparat
cec0: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
ced0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
cee0: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 45 78      case MODE_Ex
cef0: 70 6c 61 69 6e 3a 0a 20 20 20 20 63 61 73 65 20  plain:.    case 
cf00: 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20  MODE_Column: {. 
cf10: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
cf20: 74 20 69 6e 74 20 61 45 78 70 6c 61 69 6e 57 69  t int aExplainWi
cf30: 64 74 68 73 5b 5d 20 3d 20 7b 34 2c 20 31 33 2c  dths[] = {4, 13,
cf40: 20 34 2c 20 34 2c 20 34 2c 20 31 33 2c 20 32 2c   4, 4, 4, 13, 2,
cf50: 20 31 33 7d 3b 0a 20 20 20 20 20 20 63 6f 6e 73   13};.      cons
cf60: 74 20 69 6e 74 20 2a 63 6f 6c 57 69 64 74 68 3b  t int *colWidth;
cf70: 0a 20 20 20 20 20 20 69 6e 74 20 73 68 6f 77 48  .      int showH
cf80: 64 72 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  dr;.      char *
cf90: 72 6f 77 53 65 70 3b 0a 20 20 20 20 20 20 69 66  rowSep;.      if
cfa0: 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45  ( p->cMode==MODE
cfb0: 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
cfc0: 20 20 20 63 6f 6c 57 69 64 74 68 20 3d 20 70 2d     colWidth = p-
cfd0: 3e 63 6f 6c 57 69 64 74 68 3b 0a 20 20 20 20 20  >colWidth;.     
cfe0: 20 20 20 73 68 6f 77 48 64 72 20 3d 20 70 2d 3e     showHdr = p->
cff0: 73 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20  showHeader;.    
d000: 20 20 20 20 72 6f 77 53 65 70 20 3d 20 70 2d 3e      rowSep = p->
d010: 72 6f 77 53 65 70 61 72 61 74 6f 72 3b 0a 20 20  rowSeparator;.  
d020: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d030: 20 20 20 63 6f 6c 57 69 64 74 68 20 3d 20 61 45     colWidth = aE
d040: 78 70 6c 61 69 6e 57 69 64 74 68 73 3b 0a 20 20  xplainWidths;.  
d050: 20 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d 20        showHdr = 
d060: 31 3b 0a 20 20 20 20 20 20 20 20 72 6f 77 53 65  1;.        rowSe
d070: 70 20 3d 20 53 45 50 5f 52 6f 77 3b 0a 20 20 20  p = SEP_Row;.   
d080: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
d090: 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20  ->cnt++==0 ){.  
d0a0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
d0b0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
d0c0: 20 20 20 20 20 20 20 69 6e 74 20 77 2c 20 6e 3b         int w, n;
d0d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
d0e0: 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f  <ArraySize(p->co
d0f0: 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20  lWidth) ){.     
d100: 20 20 20 20 20 20 20 77 20 3d 20 63 6f 6c 57 69         w = colWi
d110: 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  dth[i];.        
d120: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d130: 20 20 20 20 20 77 20 3d 20 30 3b 0a 20 20 20 20       w = 0;.    
d140: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d150: 20 20 69 66 28 20 77 3d 3d 30 20 29 7b 0a 20 20    if( w==0 ){.  
d160: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 73 74            w = st
d170: 72 6c 65 6e 43 68 61 72 28 61 7a 43 6f 6c 5b 69  rlenChar(azCol[i
d180: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
d190: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
d1a0: 69 66 28 20 77 3c 31 30 20 29 20 77 20 3d 20 31  if( w<10 ) w = 1
d1b0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  0;.            n
d1c0: 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a   = strlenChar(az
d1d0: 41 72 67 20 26 26 20 61 7a 41 72 67 5b 69 5d 20  Arg && azArg[i] 
d1e0: 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e  ? azArg[i] : p->
d1f0: 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20  nullValue);.    
d200: 20 20 20 20 20 20 20 20 69 66 28 20 77 3c 6e 20          if( w<n 
d210: 29 20 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  ) w = n;.       
d220: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
d230: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
d240: 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29  ->actualWidth) )
d250: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
d260: 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 20  >actualWidth[i] 
d270: 3d 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = w;.          }
d280: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
d290: 68 6f 77 48 64 72 20 29 7b 0a 20 20 20 20 20 20  howHdr ){.      
d2a0: 20 20 20 20 20 20 75 74 66 38 5f 77 69 64 74 68        utf8_width
d2b0: 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20 77  _print(p->out, w
d2c0: 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  , azCol[i]);.   
d2d0: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
d2e0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
d2f0: 22 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72  ", i==nArg-1 ? r
d300: 6f 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20  owSep : "  ");. 
d310: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d320: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
d330: 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20 20 20   showHdr ){.    
d340: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
d350: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
d360: 20 20 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a           int w;.
d370: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
d380: 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61  i<ArraySize(p->a
d390: 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20  ctualWidth) ){. 
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 20                w 
d3b0: 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  = p->actualWidth
d3c0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
d3d0: 20 20 20 20 69 66 28 20 77 3c 30 20 29 20 77 20      if( w<0 ) w 
d3e0: 3d 20 2d 77 3b 0a 20 20 20 20 20 20 20 20 20 20  = -w;.          
d3f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d400: 20 20 20 20 20 20 20 20 77 20 3d 20 31 30 3b 0a          w = 10;.
d410: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
d420: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
d430: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2d  rintf(p->out,"%-
d440: 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 0a 20 20 20  *.*s%s",w,w,.   
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d460: 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  "---------------
d470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20 20 20  -----------".   
d4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4b0: 22 2d 2d 2d 2d 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 22 2c 0a 20 20  -----------",.  
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d500: 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f    i==nArg-1 ? ro
d510: 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20  wSep : "  ");.  
d520: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d530: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
d540: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
d550: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f   break;.      fo
d560: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
d570: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
d580: 20 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   w;.        if( 
d590: 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61  i<ArraySize(p->a
d5a0: 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20  ctualWidth) ){. 
d5b0: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d            w = p-
d5c0: 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b  >actualWidth[i];
d5d0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
d5e0: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 31             w = 1
d5f0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
d600: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64       if( p->cMod
d610: 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  e==MODE_Explain 
d620: 26 26 20 61 7a 41 72 67 5b 69 5d 20 26 26 20 73  && azArg[i] && s
d630: 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 5b  trlenChar(azArg[
d640: 69 5d 29 3e 77 20 29 7b 0a 20 20 20 20 20 20 20  i])>w ){.       
d650: 20 20 20 77 20 3d 20 73 74 72 6c 65 6e 43 68 61     w = strlenCha
d660: 72 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  r(azArg[i]);.   
d670: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
d680: 66 28 20 69 3d 3d 31 20 26 26 20 70 2d 3e 61 69  f( i==1 && p->ai
d690: 49 6e 64 65 6e 74 20 26 26 20 70 2d 3e 70 53 74  Indent && p->pSt
d6a0: 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
d6b0: 69 66 28 20 70 2d 3e 69 49 6e 64 65 6e 74 3c 70  if( p->iIndent<p
d6c0: 2d 3e 6e 49 6e 64 65 6e 74 20 29 7b 0a 20 20 20  ->nIndent ){.   
d6d0: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
d6e0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2a  intf(p->out, "%*
d6f0: 2e 73 22 2c 20 70 2d 3e 61 69 49 6e 64 65 6e 74  .s", p->aiIndent
d700: 5b 70 2d 3e 69 49 6e 64 65 6e 74 5d 2c 20 22 22  [p->iIndent], ""
d710: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
d720: 20 20 20 20 20 20 20 20 20 70 2d 3e 69 49 6e 64           p->iInd
d730: 65 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  ent++;.        }
d740: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 77 69  .        utf8_wi
d750: 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74  dth_print(p->out
d760: 2c 20 77 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20  , w, azArg[i] ? 
d770: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
d780: 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
d790: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
d7a0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e  >out, "%s", i==n
d7b0: 41 72 67 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a  Arg-1 ? rowSep :
d7c0: 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a   "  ");.      }.
d7d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d7e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
d7f0: 5f 53 65 6d 69 3a 20 7b 20 20 20 2f 2a 20 2e 73  _Semi: {   /* .s
d800: 63 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73  chema and .fulls
d810: 63 68 65 6d 61 20 6f 75 74 70 75 74 20 2a 2f 0a  chema output */.
d820: 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d        printSchem
d830: 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 61 7a  aLine(p->out, az
d840: 41 72 67 5b 30 5d 2c 20 22 3b 5c 6e 22 29 3b 0a  Arg[0], ";\n");.
d850: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d860: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
d870: 5f 50 72 65 74 74 79 3a 20 7b 20 20 2f 2a 20 2e  _Pretty: {  /* .
d880: 73 63 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c  schema and .full
d890: 73 63 68 65 6d 61 20 77 69 74 68 20 2d 2d 69 6e  schema with --in
d8a0: 64 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 63 68  dent */.      ch
d8b0: 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69 6e 74  ar *z;.      int
d8c0: 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   j;.      int nP
d8d0: 61 72 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  aren = 0;.      
d8e0: 63 68 61 72 20 63 45 6e 64 20 3d 20 30 3b 0a 20  char cEnd = 0;. 
d8f0: 20 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20       char c;.   
d900: 20 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 30     int nLine = 0
d910: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d920: 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20  nArg==1 );.     
d930: 20 69 66 28 20 61 7a 41 72 67 5b 30 5d 3d 3d 30   if( azArg[0]==0
d940: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
d950: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c  if( sqlite3_strl
d960: 69 6b 65 28 22 43 52 45 41 54 45 20 56 49 45 57  ike("CREATE VIEW
d970: 25 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29  %", azArg[0], 0)
d980: 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71  ==0.       || sq
d990: 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 43  lite3_strlike("C
d9a0: 52 45 41 54 45 20 54 52 49 47 25 22 2c 20 61 7a  REATE TRIG%", az
d9b0: 41 72 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a 20 20  Arg[0], 0)==0.  
d9c0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 75      ){.        u
d9d0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
d9e0: 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 61 7a 41 72  t, "%s;\n", azAr
d9f0: 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 62  g[0]);.        b
da00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
da10: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
da20: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a  mprintf("%s", az
da30: 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 6a  Arg[0]);.      j
da40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
da50: 69 3d 30 3b 20 49 73 53 70 61 63 65 28 7a 5b 69  i=0; IsSpace(z[i
da60: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20  ]); i++){}.     
da70: 20 66 6f 72 28 3b 20 28 63 20 3d 20 7a 5b 69 5d   for(; (c = z[i]
da80: 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
da90: 20 20 20 20 69 66 28 20 49 73 53 70 61 63 65 28      if( IsSpace(
daa0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
dab0: 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 5c 72 27  if( z[j-1]=='\r'
dac0: 20 29 20 7a 5b 6a 2d 31 5d 20 3d 20 27 5c 6e 27   ) z[j-1] = '\n'
dad0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
dae0: 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20  IsSpace(z[j-1]) 
daf0: 7c 7c 20 7a 5b 6a 2d 31 5d 3d 3d 27 28 27 20 29  || z[j-1]=='(' )
db00: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
db10: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d     }else if( (c=
db20: 3d 27 28 27 20 7c 7c 20 63 3d 3d 27 29 27 29 20  ='(' || c==')') 
db30: 26 26 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63  && j>0 && IsSpac
db40: 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 0a 20 20 20  e(z[j-1]) ){.   
db50: 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20         j--;.    
db60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b      }.        z[
db70: 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20  j++] = c;.      
db80: 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a  }.      while( j
db90: 3e 30 20 26 26 20 49 73 53 70 61 63 65 28 7a 5b  >0 && IsSpace(z[
dba0: 6a 2d 31 5d 29 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  j-1]) ){ j--; }.
dbb0: 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a        z[j] = 0;.
dbc0: 20 20 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e        if( strlen
dbd0: 33 30 28 7a 29 3e 3d 37 39 20 29 7b 0a 20 20 20  30(z)>=79 ){.   
dbe0: 20 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20       for(i=j=0; 
dbf0: 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69  (c = z[i])!=0; i
dc00: 2b 2b 29 7b 20 20 2f 2a 20 43 6f 70 79 20 63 68  ++){  /* Copy ch
dc10: 61 6e 67 65 73 20 66 72 6f 6d 20 7a 5b 69 5d 20  anges from z[i] 
dc20: 62 61 63 6b 20 74 6f 20 7a 5b 6a 5d 20 2a 2f 0a  back to z[j] */.
dc30: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
dc40: 3d 63 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  =cEnd ){.       
dc50: 20 20 20 20 20 63 45 6e 64 20 3d 20 30 3b 0a 20       cEnd = 0;. 
dc60: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
dc70: 66 28 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d  f( c=='"' || c==
dc80: 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 60 27 20 29  '\'' || c=='`' )
dc90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 45  {.            cE
dca0: 6e 64 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  nd = c;.        
dcb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
dcc0: 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  [' ){.          
dcd0: 20 20 63 45 6e 64 20 3d 20 27 5d 27 3b 0a 20 20    cEnd = ']';.  
dce0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
dcf0: 28 20 63 3d 3d 27 2d 27 20 26 26 20 7a 5b 69 2b  ( c=='-' && z[i+
dd00: 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  1]=='-' ){.     
dd10: 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5c         cEnd = '\
dd20: 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  n';.          }e
dd30: 6c 73 65 20 69 66 28 20 63 3d 3d 27 28 27 20 29  lse if( c=='(' )
dd40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 50  {.            nP
dd50: 61 72 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  aren++;.        
dd60: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
dd70: 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )' ){.          
dd80: 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a 20 20 20 20    nParen--;.    
dd90: 20 20 20 20 20 20 20 20 69 66 28 20 6e 4c 69 6e          if( nLin
dda0: 65 3e 30 20 26 26 20 6e 50 61 72 65 6e 3d 3d 30  e>0 && nParen==0
ddb0: 20 26 26 20 6a 3e 30 20 29 7b 0a 20 20 20 20 20   && j>0 ){.     
ddc0: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 53 63           printSc
ddd0: 68 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74  hemaLineN(p->out
dde0: 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 22 29 3b 0a 20  , z, j, "\n");. 
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 20 3d               j =
de00: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
de10: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
de20: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
de30: 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   c;.          if
de40: 28 20 6e 50 61 72 65 6e 3d 3d 31 20 26 26 20 63  ( nParen==1 && c
de50: 45 6e 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  End==0.         
de60: 20 20 26 26 20 28 63 3d 3d 27 28 27 20 7c 7c 20    && (c=='(' || 
de70: 63 3d 3d 27 5c 6e 27 20 7c 7c 20 28 63 3d 3d 27  c=='\n' || (c=='
de80: 2c 27 20 26 26 20 21 77 73 54 6f 45 6f 6c 28 7a  ,' && !wsToEol(z
de90: 2b 69 2b 31 29 29 29 0a 20 20 20 20 20 20 20 20  +i+1))).        
dea0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
deb0: 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6a   if( c=='\n' ) j
dec0: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  --;.            
ded0: 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e  printSchemaLineN
dee0: 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22  (p->out, z, j, "
def0: 5c 6e 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20  \n  ");.        
df00: 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20      j = 0;.     
df10: 20 20 20 20 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a         nLine++;.
df20: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c              whil
df30: 65 28 20 49 73 53 70 61 63 65 28 7a 5b 69 2b 31  e( IsSpace(z[i+1
df40: 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ i++; }.   
df50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
df60: 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 5d 20   }.        z[j] 
df70: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
df80: 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69     printSchemaLi
df90: 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 22 3b  ne(p->out, z, ";
dfa0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  \n");.      sqli
dfb0: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20  te3_free(z);.   
dfc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
dfd0: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69      case MODE_Li
dfe0: 73 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  st: {.      if( 
dff0: 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70  p->cnt++==0 && p
e000: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
e010: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
e020: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
e030: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
e040: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25  intf(p->out,"%s%
e050: 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20  s",azCol[i],.   
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
e070: 3d 3d 6e 41 72 67 2d 31 20 3f 20 70 2d 3e 72 6f  ==nArg-1 ? p->ro
e080: 77 53 65 70 61 72 61 74 6f 72 20 3a 20 70 2d 3e  wSeparator : p->
e090: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
e0a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e0b0: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
e0c0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
e0d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
e0e0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
e0f0: 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72    char *z = azAr
e100: 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  g[i];.        if
e110: 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 2d 3e  ( z==0 ) z = p->
e120: 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20 20 20 20 20  nullValue;.     
e130: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
e140: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  ->out, "%s", z);
e150: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e  .        if( i<n
e160: 41 72 67 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  Arg-1 ){.       
e170: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
e180: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
e190: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
e1a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e1b0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
e1c0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
e1d0: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
e1e0: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
e1f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
e200: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
e210: 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a 20 7b 0a 20  e MODE_Html: {. 
e220: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
e230: 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48  +==0 && p->showH
e240: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
e250: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e260: 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20  ut,"<TR>");.    
e270: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e280: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
e290: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
e2a0: 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22 29 3b 0a  p->out,"<TH>");.
e2b0: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
e2c0: 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e  _html_string(p->
e2d0: 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  out, azCol[i]);.
e2e0: 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
e2f0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54  intf(p->out,"</T
e300: 48 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  H>\n");.        
e310: 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  }.        raw_pr
e320: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54  intf(p->out,"</T
e330: 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  R>\n");.      }.
e340: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
e350: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
e360: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
e370: 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20  out,"<TR>");.   
e380: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
e390: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
e3a0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
e3b0: 6f 75 74 2c 22 3c 54 44 3e 22 29 3b 0a 20 20 20  out,"<TD>");.   
e3c0: 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c       output_html
e3d0: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
e3e0: 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67  azArg[i] ? azArg
e3f0: 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c  [i] : p->nullVal
e400: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77  ue);.        raw
e410: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e420: 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TD>\n");.     
e430: 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69   }.      raw_pri
e440: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52  ntf(p->out,"</TR
e450: 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  >\n");.      bre
e460: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
e470: 73 65 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20  se MODE_Tcl: {. 
e480: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
e490: 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48  +==0 && p->showH
e4a0: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
e4b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
e4c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
e4d0: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
e4e0: 67 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69  g(p->out,azCol[i
e4f0: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
e500: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ");.          if
e510: 28 69 3c 6e 41 72 67 2d 31 29 20 75 74 66 38 5f  (i<nArg-1) utf8_
e520: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e530: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
e540: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ator);.        }
e550: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
e560: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
e570: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
e580: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
e590: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
e5a0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
e5b0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
e5c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6f 75  i++){.        ou
e5d0: 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d  tput_c_string(p-
e5e0: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f  >out, azArg[i] ?
e5f0: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
e600: 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullValue);.     
e610: 20 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20     if(i<nArg-1) 
e620: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
e630: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c  ut, "%s", p->col
e640: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
e650: 20 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70    }.      utf8_p
e660: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
e670: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
e680: 74 6f 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tor);.      brea
e690: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
e6a0: 65 20 4d 4f 44 45 5f 43 73 76 3a 20 7b 0a 20 20  e MODE_Csv: {.  
e6b0: 20 20 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64      setBinaryMod
e6c0: 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20  e(p->out, 1);.  
e6d0: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
e6e0: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
e6f0: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
e700: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
e710: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
e720: 20 6f 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61   output_csv(p, a
e730: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
e740: 69 5d 20 3a 20 22 22 2c 20 69 3c 6e 41 72 67 2d  i] : "", i<nArg-
e750: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
e760: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
e770: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
e780: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
e790: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e7a0: 69 66 28 20 6e 41 72 67 3e 30 20 29 7b 0a 20 20  if( nArg>0 ){.  
e7b0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e7c0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
e7d0: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73         output_cs
e7e0: 76 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 69  v(p, azArg[i], i
e7f0: 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20  <nArg-1);.      
e800: 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38    }.        utf8
e810: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e820: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
e830: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
e840: 20 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64        setTextMod
e850: 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20  e(p->out, 1);.  
e860: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e870: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 49  .    case MODE_I
e880: 6e 73 65 72 74 3a 20 7b 0a 20 20 20 20 20 20 69  nsert: {.      i
e890: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
e8a0: 65 61 6b 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  eak;.      utf8_
e8b0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 49  printf(p->out,"I
e8c0: 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 22 2c 70  NSERT INTO %s",p
e8d0: 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20  ->zDestTable);. 
e8e0: 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 6f 77       if( p->show
e8f0: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
e900: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
e910: 6f 75 74 2c 22 28 22 29 3b 0a 20 20 20 20 20 20  out,"(");.      
e920: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
e930: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
e940: 20 20 20 69 66 28 20 69 3e 30 20 29 20 72 61 77     if( i>0 ) raw
e950: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e960: 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",");.          
e970: 69 66 28 20 71 75 6f 74 65 43 68 61 72 28 61 7a  if( quoteChar(az
e980: 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  Col[i]) ){.     
e990: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d         char *z =
e9a0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
e9b0: 28 22 5c 22 25 77 5c 22 22 2c 20 61 7a 43 6f 6c  ("\"%w\"", azCol
e9c0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
e9d0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
e9e0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  >out, "%s", z);.
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ea00: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20  te3_free(z);.   
ea10: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ea20: 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
ea30: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
ea40: 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  ", azCol[i]);.  
ea50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ea60: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f    }.        raw_
ea70: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29  printf(p->out,")
ea80: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
ea90: 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20    p->cnt++;.    
eaa0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
eab0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
eac0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
ead0: 75 74 2c 20 69 3e 30 20 3f 20 22 2c 22 20 3a 20  ut, i>0 ? "," : 
eae0: 22 20 56 41 4c 55 45 53 28 22 29 3b 0a 20 20 20  " VALUES(");.   
eaf0: 20 20 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b       if( (azArg[
eb00: 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70  i]==0) || (aiTyp
eb10: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
eb20: 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a  SQLITE_NULL) ){.
eb30: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
eb40: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55  rintf(p->out,"NU
eb50: 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  LL");.        }e
eb60: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
eb70: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
eb80: 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
eb90: 20 20 20 20 20 20 69 66 28 20 53 68 65 6c 6c 48        if( ShellH
eba0: 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  asFlag(p, SHFLG_
ebb0: 4e 65 77 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20  Newlines) ){.   
ebc0: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
ebd0: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d  quoted_string(p-
ebe0: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  >out, azArg[i]);
ebf0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
ec00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 75  {.            ou
ec10: 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61  tput_quoted_esca
ec20: 70 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  ped_string(p->ou
ec30: 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  t, azArg[i]);.  
ec40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ec50: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
ec60: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
ec70: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
ec80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
ec90: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
eca0: 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  "%s", azArg[i]);
ecb0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
ecc0: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
ecd0: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46  ype[i]==SQLITE_F
ece0: 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
ecf0: 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20    char z[50];.  
ed00: 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72          double r
ed10: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
ed20: 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d  n_double(p->pStm
ed30: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
ed40: 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20   sqlite3_uint64 
ed50: 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  ur;.          me
ed60: 6d 63 70 79 28 26 75 72 2c 26 72 2c 73 69 7a 65  mcpy(&ur,&r,size
ed70: 6f 66 28 72 29 29 3b 0a 20 20 20 20 20 20 20 20  of(r));.        
ed80: 20 20 69 66 28 20 75 72 3d 3d 30 78 37 66 66 30    if( ur==0x7ff0
ed90: 30 30 30 30 30 30 30 30 30 30 30 30 4c 4c 20 29  000000000000LL )
eda0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61  {.            ra
edb0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
edc0: 20 22 31 65 39 39 39 22 29 3b 0a 20 20 20 20 20   "1e999");.     
edd0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75       }else if( u
ede0: 72 3d 3d 30 78 66 66 66 30 30 30 30 30 30 30 30  r==0xfff00000000
edf0: 30 30 30 30 30 4c 4c 20 29 7b 0a 20 20 20 20 20  00000LL ){.     
ee00: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
ee10: 66 28 70 2d 3e 6f 75 74 2c 20 22 2d 31 65 39 39  f(p->out, "-1e99
ee20: 39 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  9");.          }
ee30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ee40: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
ee50: 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22  tf(50,z,"%!.20g"
ee60: 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , r);.          
ee70: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
ee80: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
ee90: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
eea0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54     }else if( aiT
eeb0: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
eec0: 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26  ==SQLITE_BLOB &&
eed0: 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20   p->pStmt ){.   
eee0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69         const voi
eef0: 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74  d *pBlob = sqlit
ef00: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
ef10: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
ef20: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62         int nBlob
ef30: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
ef40: 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74  n_bytes(p->pStmt
ef50: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
ef60: 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28  output_hex_blob(
ef70: 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e  p->out, pBlob, n
ef80: 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  Blob);.        }
ef90: 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d 62 65  else if( isNumbe
efa0: 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29  r(azArg[i], 0) )
efb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
efc0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
efd0: 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  %s", azArg[i]);.
efe0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
eff0: 28 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70  ( ShellHasFlag(p
f000: 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73  , SHFLG_Newlines
f010: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  ) ){.          o
f020: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
f030: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
f040: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
f050: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f060: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73  output_quoted_es
f070: 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  caped_string(p->
f080: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
f090: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f0a0: 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  }.      raw_prin
f0b0: 74 66 28 70 2d 3e 6f 75 74 2c 22 29 3b 5c 6e 22  tf(p->out,");\n"
f0c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f0d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
f0e0: 4f 44 45 5f 51 75 6f 74 65 3a 20 7b 0a 20 20 20  ODE_Quote: {.   
f0f0: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
f100: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
f110: 66 28 20 70 2d 3e 63 6e 74 3d 3d 30 20 26 26 20  f( p->cnt==0 && 
f120: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
f130: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
f140: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
f150: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
f160: 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  0 ) raw_printf(p
f170: 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20  ->out, ",");.   
f180: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75         output_qu
f190: 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  oted_string(p->o
f1a0: 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20  ut, azCol[i]);. 
f1b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f1c0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
f1d0: 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ut,"\n");.      
f1e0: 7d 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b  }.      p->cnt++
f1f0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
f200: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
f210: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
f220: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
f230: 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
f240: 20 20 69 66 28 20 28 61 7a 41 72 67 5b 69 5d 3d    if( (azArg[i]=
f250: 3d 30 29 20 7c 7c 20 28 61 69 54 79 70 65 20 26  =0) || (aiType &
f260: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
f270: 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  ITE_NULL) ){.   
f280: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
f290: 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22  tf(p->out,"NULL"
f2a0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
f2b0: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61   if( aiType && a
f2c0: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
f2d0: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  _TEXT ){.       
f2e0: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
f2f0: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
f300: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
f310: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54     }else if( aiT
f320: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
f330: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
f340: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
f350: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
f360: 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29  ,"%s", azArg[i])
f370: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
f380: 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69  if( aiType && ai
f390: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
f3a0: 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
f3b0: 20 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20     char z[50];. 
f3c0: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
f3d0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r = sqlite3_colu
f3e0: 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74  mn_double(p->pSt
f3f0: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
f400: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
f410: 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22  tf(50,z,"%!.20g"
f420: 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , r);.          
f430: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
f440: 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  t, "%s", z);.   
f450: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
f460: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
f470: 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  i]==SQLITE_BLOB 
f480: 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  && p->pStmt ){. 
f490: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76           const v
f4a0: 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c  oid *pBlob = sql
f4b0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
f4c0: 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20  (p->pStmt, i);. 
f4d0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c           int nBl
f4e0: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ob = sqlite3_col
f4f0: 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74  umn_bytes(p->pSt
f500: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
f510: 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f    output_hex_blo
f520: 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c  b(p->out, pBlob,
f530: 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20   nBlob);.       
f540: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d   }else if( isNum
f550: 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29  ber(azArg[i], 0)
f560: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
f570: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
f580: 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29  ,"%s", azArg[i])
f590: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
f5a0: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
f5b0: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
f5c0: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
f5d0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f5e0: 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70     }.      raw_p
f5f0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e  rintf(p->out,"\n
f600: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
f610: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f620: 4d 4f 44 45 5f 41 73 63 69 69 3a 20 7b 0a 20 20  MODE_Ascii: {.  
f630: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
f640: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
f650: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
f660: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
f670: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
f680: 20 69 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f   if( i>0 ) utf8_
f690: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
f6a0: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
f6b0: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ator);.         
f6c0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
f6d0: 6f 75 74 2c 22 25 73 22 2c 61 7a 43 6f 6c 5b 69  out,"%s",azCol[i
f6e0: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
f6f0: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
f700: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
f710: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
f720: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
f730: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f740: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
f750: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
f760: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
f770: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
f780: 3e 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66  >0 ) utf8_printf
f790: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
f7a0: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
f7b0: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
f7c0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22  intf(p->out,"%s"
f7d0: 2c 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72  ,azArg[i] ? azAr
f7e0: 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61  g[i] : p->nullVa
f7f0: 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lue);.      }.  
f800: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
f810: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
f820: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
f830: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f840: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
f850: 5f 45 51 50 3a 20 7b 0a 20 20 20 20 20 20 65 71  _EQP: {.      eq
f860: 70 5f 61 70 70 65 6e 64 28 70 2c 20 61 74 6f 69  p_append(p, atoi
f870: 28 61 7a 41 72 67 5b 30 5d 29 2c 20 61 74 6f 69  (azArg[0]), atoi
f880: 28 61 7a 41 72 67 5b 31 5d 29 2c 20 61 7a 41 72  (azArg[1]), azAr
f890: 67 5b 33 5d 29 3b 0a 20 20 20 20 20 20 62 72 65  g[3]);.      bre
f8a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
f8b0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
f8c0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63  ** This is the c
f8d0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
f8e0: 74 68 61 74 20 74 68 65 20 53 51 4c 69 74 65 20  that the SQLite 
f8f0: 6c 69 62 72 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b  library.** invok
f900: 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  es for each row 
f910: 6f 66 20 61 20 71 75 65 72 79 20 72 65 73 75 6c  of a query resul
f920: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
f930: 20 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a   callback(void *
f940: 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20  pArg, int nArg, 
f950: 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68  char **azArg, ch
f960: 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 2f  ar **azCol){.  /
f970: 2a 20 73 69 6e 63 65 20 77 65 20 64 6f 6e 27 74  * since we don't
f980: 20 68 61 76 65 20 74 79 70 65 20 69 6e 66 6f 2c   have type info,
f990: 20 63 61 6c 6c 20 74 68 65 20 73 68 65 6c 6c 5f   call the shell_
f9a0: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 61 20  callback with a 
f9b0: 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20  NULL value */.  
f9c0: 72 65 74 75 72 6e 20 73 68 65 6c 6c 5f 63 61 6c  return shell_cal
f9d0: 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 41 72 67  lback(pArg, nArg
f9e0: 2c 20 61 7a 41 72 67 2c 20 61 7a 43 6f 6c 2c 20  , azArg, azCol, 
f9f0: 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  NULL);.}../*.** 
fa00: 54 68 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c  This is the call
fa10: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 66 72 6f  back routine fro
fa20: 6d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  m sqlite3_exec()
fa30: 20 74 68 61 74 20 61 70 70 65 6e 64 73 20 61 6c   that appends al
fa40: 6c 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 6e 74 6f  l.** output onto
fa50: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 53 68   the end of a Sh
fa60: 65 6c 6c 54 65 78 74 20 6f 62 6a 65 63 74 2e 0a  ellText object..
fa70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
fa80: 70 74 75 72 65 4f 75 74 70 75 74 43 61 6c 6c 62  ptureOutputCallb
fa90: 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ack(void *pArg, 
faa0: 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a  int nArg, char *
fab0: 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  *azArg, char **a
fac0: 7a 29 7b 0a 20 20 53 68 65 6c 6c 54 65 78 74 20  z){.  ShellText 
fad0: 2a 70 20 3d 20 28 53 68 65 6c 6c 54 65 78 74 2a  *p = (ShellText*
fae0: 29 70 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a  )pArg;.  int i;.
faf0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
fb00: 45 52 28 61 7a 29 3b 0a 20 20 69 66 28 20 61 7a  ER(az);.  if( az
fb10: 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Arg==0 ) return 
fb20: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 20 29 20  0;.  if( p->n ) 
fb30: 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20 22 7c  appendText(p, "|
fb40: 22 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ", 0);.  for(i=0
fb50: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
fb60: 20 20 20 20 69 66 28 20 69 20 29 20 61 70 70 65      if( i ) appe
fb70: 6e 64 54 65 78 74 28 70 2c 20 22 2c 22 2c 20 30  ndText(p, ",", 0
fb80: 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 41 72 67  );.    if( azArg
fb90: 5b 69 5d 20 29 20 61 70 70 65 6e 64 54 65 78 74  [i] ) appendText
fba0: 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 30 29  (p, azArg[i], 0)
fbb0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
fbc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
fbd0: 61 74 65 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ate an appropria
fbe0: 74 65 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c  te SELFTEST tabl
fbf0: 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  e in the main da
fc00: 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
fc10: 63 20 76 6f 69 64 20 63 72 65 61 74 65 53 65 6c  c void createSel
fc20: 66 74 65 73 74 54 61 62 6c 65 28 53 68 65 6c 6c  ftestTable(Shell
fc30: 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 63 68 61  State *p){.  cha
fc40: 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
fc50: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
fc60: 2d 3e 64 62 2c 0a 20 20 20 20 22 53 41 56 45 50  ->db,.    "SAVEP
fc70: 4f 49 4e 54 20 73 65 6c 66 74 65 73 74 5f 69 6e  OINT selftest_in
fc80: 69 74 3b 5c 6e 22 0a 20 20 20 20 22 43 52 45 41  it;\n".    "CREA
fc90: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
fca0: 45 58 49 53 54 53 20 73 65 6c 66 74 65 73 74 28  EXISTS selftest(
fcb0: 5c 6e 22 0a 20 20 20 20 22 20 20 74 6e 6f 20 49  \n".    "  tno I
fcc0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
fcd0: 45 59 2c 5c 6e 22 20 20 20 2f 2a 20 54 65 73 74  EY,\n"   /* Test
fce0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 22   number */.    "
fcf0: 20 20 6f 70 20 54 45 58 54 2c 5c 6e 22 20 20 20    op TEXT,\n"   
fd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd10: 2f 2a 20 4f 70 65 72 61 74 6f 72 3a 20 20 6d 65  /* Operator:  me
fd20: 6d 6f 20 72 75 6e 20 2a 2f 0a 20 20 20 20 22 20  mo run */.    " 
fd30: 20 63 6d 64 20 54 45 58 54 2c 5c 6e 22 20 20 20   cmd TEXT,\n"   
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fd50: 2a 20 43 6f 6d 6d 61 6e 64 20 74 65 78 74 20 2a  * Command text *
fd60: 2f 0a 20 20 20 20 22 20 20 61 6e 73 20 54 45 58  /.    "  ans TEX
fd70: 54 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  T\n"            
fd80: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65         /* Desire
fd90: 64 20 61 6e 73 77 65 72 20 2a 2f 0a 20 20 20 20  d answer */.    
fda0: 22 29 3b 22 0a 20 20 20 20 22 43 52 45 41 54 45  ");".    "CREATE
fdb0: 20 54 45 4d 50 20 54 41 42 4c 45 20 5b 5f 73 68   TEMP TABLE [_sh
fdc0: 65 6c 6c 24 73 65 6c 66 5d 28 6f 70 2c 63 6d 64  ell$self](op,cmd
fdd0: 2c 61 6e 73 29 3b 5c 6e 22 0a 20 20 20 20 22 49  ,ans);\n".    "I
fde0: 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65  NSERT INTO [_she
fdf0: 6c 6c 24 73 65 6c 66 5d 28 72 6f 77 69 64 2c 6f  ll$self](rowid,o
fe00: 70 2c 63 6d 64 29 5c 6e 22 0a 20 20 20 20 22 20  p,cmd)\n".    " 
fe10: 20 56 41 4c 55 45 53 28 63 6f 61 6c 65 73 63 65   VALUES(coalesce
fe20: 28 28 53 45 4c 45 43 54 20 28 6d 61 78 28 74 6e  ((SELECT (max(tn
fe30: 6f 29 2b 31 30 30 29 2f 31 30 20 46 52 4f 4d 20  o)+100)/10 FROM 
fe40: 73 65 6c 66 74 65 73 74 29 2c 31 30 29 2c 5c 6e  selftest),10),\n
fe50: 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20  ".    "         
fe60: 27 6d 65 6d 6f 27 2c 27 54 65 73 74 73 20 67 65  'memo','Tests ge
fe70: 6e 65 72 61 74 65 64 20 62 79 20 2d 2d 69 6e 69  nerated by --ini
fe80: 74 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53  t');\n".    "INS
fe90: 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c  ERT INTO [_shell
fea0: 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20  $self]\n".    " 
feb0: 20 53 45 4c 45 43 54 20 27 72 75 6e 27 2c 5c 6e   SELECT 'run',\n
fec0: 22 0a 20 20 20 20 22 20 20 20 20 27 53 45 4c 45  ".    "    'SELE
fed0: 43 54 20 68 65 78 28 73 68 61 33 5f 71 75 65 72  CT hex(sha3_quer
fee0: 79 28 27 27 53 45 4c 45 43 54 20 74 79 70 65 2c  y(''SELECT type,
fef0: 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71  name,tbl_name,sq
ff00: 6c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  l ".            
ff10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff20: 20 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74       "FROM sqlit
ff30: 65 5f 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42  e_master ORDER B
ff40: 59 20 32 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22  Y 2'',224))',\n"
ff50: 0a 20 20 20 20 22 20 20 20 20 68 65 78 28 73 68  .    "    hex(sh
ff60: 61 33 5f 71 75 65 72 79 28 27 53 45 4c 45 43 54  a3_query('SELECT
ff70: 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e   type,name,tbl_n
ff80: 61 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20  ame,sql ".      
ff90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffa0: 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65      "FROM sqlite
ffb0: 5f 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42 59  _master ORDER BY
ffc0: 20 32 27 2c 32 32 34 29 29 3b 5c 6e 22 0a 20 20   2',224));\n".  
ffd0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b    "INSERT INTO [
ffe0: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a  _shell$self]\n".
fff0: 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 27 72      "  SELECT 'r
10000 75 6e 27 2c 22 0a 20 20 20 20 22 20 20 20 20 27  un',".    "    '
10010 53 45 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f  SELECT hex(sha3_
10020 71 75 65 72 79 28 27 27 53 45 4c 45 43 54 20 2a  query(''SELECT *
10030 20 46 52 4f 4d 20 5c 22 27 20 7c 7c 22 0a 20 20   FROM \"' ||".  
10040 20 20 22 20 20 20 20 20 20 20 20 70 72 69 6e 74    "        print
10050 66 28 27 25 77 27 2c 6e 61 6d 65 29 20 7c 7c 20  f('%w',name) || 
10060 27 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 27  '\" NOT INDEXED'
10070 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20 20 20  ',224))',\n".   
10080 20 22 20 20 20 20 68 65 78 28 73 68 61 33 5f 71   "    hex(sha3_q
10090 75 65 72 79 28 70 72 69 6e 74 66 28 27 53 45 4c  uery(printf('SEL
100a0 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c  ECT * FROM \"%w\
100b0 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 27 2c 6e  " NOT INDEXED',n
100c0 61 6d 65 29 2c 32 32 34 29 29 5c 6e 22 0a 20 20  ame),224))\n".  
100d0 20 20 22 20 20 46 52 4f 4d 20 28 5c 6e 22 0a 20    "  FROM (\n". 
100e0 20 20 20 22 20 20 20 20 53 45 4c 45 43 54 20 6e     "    SELECT n
100f0 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
10100 6d 61 73 74 65 72 5c 6e 22 0a 20 20 20 20 22 20  master\n".    " 
10110 20 20 20 20 57 48 45 52 45 20 74 79 70 65 3d 27      WHERE type='
10120 74 61 62 6c 65 27 5c 6e 22 0a 20 20 20 20 22 20  table'\n".    " 
10130 20 20 20 20 20 20 41 4e 44 20 6e 61 6d 65 3c 3e        AND name<>
10140 27 73 65 6c 66 74 65 73 74 27 5c 6e 22 0a 20 20  'selftest'\n".  
10150 20 20 22 20 20 20 20 20 20 20 41 4e 44 20 63 6f    "       AND co
10160 61 6c 65 73 63 65 28 72 6f 6f 74 70 61 67 65 2c  alesce(rootpage,
10170 30 29 3e 30 5c 6e 22 0a 20 20 20 20 22 20 20 29  0)>0\n".    "  )
10180 5c 6e 22 0a 20 20 20 20 22 20 4f 52 44 45 52 20  \n".    " ORDER 
10190 42 59 20 6e 61 6d 65 3b 5c 6e 22 0a 20 20 20 20  BY name;\n".    
101a0 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73  "INSERT INTO [_s
101b0 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20  hell$self]\n".  
101c0 20 20 22 20 20 56 41 4c 55 45 53 28 27 72 75 6e    "  VALUES('run
101d0 27 2c 27 50 52 41 47 4d 41 20 69 6e 74 65 67 72  ','PRAGMA integr
101e0 69 74 79 5f 63 68 65 63 6b 27 2c 27 6f 6b 27 29  ity_check','ok')
101f0 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54  ;\n".    "INSERT
10200 20 49 4e 54 4f 20 73 65 6c 66 74 65 73 74 28 74   INTO selftest(t
10210 6e 6f 2c 6f 70 2c 63 6d 64 2c 61 6e 73 29 22 0a  no,op,cmd,ans)".
10220 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 72 6f      "  SELECT ro
10230 77 69 64 2a 31 30 2c 6f 70 2c 63 6d 64 2c 61 6e  wid*10,op,cmd,an
10240 73 20 46 52 4f 4d 20 5b 5f 73 68 65 6c 6c 24 73  s FROM [_shell$s
10250 65 6c 66 5d 3b 5c 6e 22 0a 20 20 20 20 22 44 52  elf];\n".    "DR
10260 4f 50 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c  OP TABLE [_shell
10270 24 73 65 6c 66 5d 3b 22 0a 20 20 20 20 2c 30 2c  $self];".    ,0,
10280 30 2c 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  0,&zErrMsg);.  i
10290 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
102a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
102b0 64 65 72 72 2c 20 22 53 45 4c 46 54 45 53 54 20  derr, "SELFTEST 
102c0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66  initialization f
102d0 61 69 6c 75 72 65 3a 20 25 73 5c 6e 22 2c 20 7a  ailure: %s\n", z
102e0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  ErrMsg);.    sql
102f0 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
10300 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
10310 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52  3_exec(p->db, "R
10320 45 4c 45 41 53 45 20 73 65 6c 66 74 65 73 74 5f  ELEASE selftest_
10330 69 6e 69 74 22 2c 30 2c 30 2c 30 29 3b 0a 7d 0a  init",0,0,0);.}.
10340 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
10350 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c  destination tabl
10360 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 53  e field of the S
10370 68 65 6c 6c 53 74 61 74 65 20 73 74 72 75 63 74  hellState struct
10380 75 72 65 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  ure to.** the na
10390 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
103a0 67 69 76 65 6e 2e 20 20 45 73 63 61 70 65 20 61  given.  Escape a
103b0 6e 79 20 71 75 6f 74 65 20 63 68 61 72 61 63 74  ny quote charact
103c0 65 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61  ers in the.** ta
103d0 62 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ble name..*/.sta
103e0 74 69 63 20 76 6f 69 64 20 73 65 74 5f 74 61 62  tic void set_tab
103f0 6c 65 5f 6e 61 6d 65 28 53 68 65 6c 6c 53 74 61  le_name(ShellSta
10400 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  te *p, const cha
10410 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
10420 20 69 2c 20 6e 3b 0a 20 20 63 68 61 72 20 63 51   i, n;.  char cQ
10430 75 6f 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  uote;.  char *z;
10440 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 44 65 73 74  ..  if( p->zDest
10450 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 72 65  Table ){.    fre
10460 65 28 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29  e(p->zDestTable)
10470 3b 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61  ;.    p->zDestTa
10480 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ble = 0;.  }.  i
10490 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
104a0 74 75 72 6e 3b 0a 20 20 63 51 75 6f 74 65 20 3d  turn;.  cQuote =
104b0 20 71 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65   quoteChar(zName
104c0 29 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33  );.  n = strlen3
104d0 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  0(zName);.  if( 
104e0 63 51 75 6f 74 65 20 29 20 6e 20 2b 3d 20 6e 2b  cQuote ) n += n+
104f0 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e 7a 44 65 73  2;.  z = p->zDes
10500 74 54 61 62 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28  tTable = malloc(
10510 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a 3d   n+1 );.  if( z=
10520 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f  =0 ) shell_out_o
10530 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 6e 20  f_memory();.  n 
10540 3d 20 30 3b 0a 20 20 69 66 28 20 63 51 75 6f 74  = 0;.  if( cQuot
10550 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75  e ) z[n++] = cQu
10560 6f 74 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ote;.  for(i=0; 
10570 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  zName[i]; i++){.
10580 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61      z[n++] = zNa
10590 6d 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a  me[i];.    if( z
105a0 4e 61 6d 65 5b 69 5d 3d 3d 63 51 75 6f 74 65 20  Name[i]==cQuote 
105b0 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74  ) z[n++] = cQuot
105c0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 51 75  e;.  }.  if( cQu
105d0 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63  ote ) z[n++] = c
105e0 51 75 6f 74 65 3b 0a 20 20 7a 5b 6e 5d 20 3d 20  Quote;.  z[n] = 
105f0 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65  0;.}.../*.** Exe
10600 63 75 74 65 20 61 20 71 75 65 72 79 20 73 74 61  cute a query sta
10610 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c  tement that will
10620 20 67 65 6e 65 72 61 74 65 20 53 51 4c 20 6f 75   generate SQL ou
10630 74 70 75 74 2e 20 20 50 72 69 6e 74 0a 2a 2a 20  tput.  Print.** 
10640 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  the result colum
10650 6e 73 2c 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61  ns, comma-separa
10660 74 65 64 2c 20 6f 6e 20 61 20 6c 69 6e 65 20 61  ted, on a line a
10670 6e 64 20 74 68 65 6e 20 61 64 64 20 61 0a 2a 2a  nd then add a.**
10680 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69   semicolon termi
10690 6e 61 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  nator to the end
106a0 20 6f 66 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a   of that line..*
106b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
106c0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 73  er of columns is
106d0 20 31 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75   1 and that colu
106e0 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74 65 78 74  mn contains text
106f0 20 22 2d 2d 22 0a 2a 2a 20 74 68 65 6e 20 77 72   "--".** then wr
10700 69 74 65 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f  ite the semicolo
10710 6e 20 6f 6e 20 61 20 73 65 70 61 72 61 74 65 20  n on a separate 
10720 6c 69 6e 65 2e 20 20 54 68 61 74 20 77 61 79 2c  line.  That way,
10730 20 69 66 20 61 0a 2a 2a 20 22 2d 2d 22 20 63 6f   if a.** "--" co
10740 6d 6d 65 6e 74 20 6f 63 63 75 72 73 20 61 74 20  mment occurs at 
10750 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73  the end of the s
10760 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 63 6f  tatement, the co
10770 6d 6d 65 6e 74 0a 2a 2a 20 77 6f 6e 27 74 20 63  mment.** won't c
10780 6f 6e 73 75 6d 65 20 74 68 65 20 73 65 6d 69 63  onsume the semic
10790 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72 2e  olon terminator.
107a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
107b0 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75  un_table_dump_qu
107c0 65 72 79 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  ery(.  ShellStat
107d0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
107e0 2f 2a 20 51 75 65 72 79 20 63 6f 6e 74 65 78 74  /* Query context
107f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
10800 20 2a 7a 53 65 6c 65 63 74 2c 20 20 20 20 20 2f   *zSelect,     /
10810 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
10820 6e 74 20 74 6f 20 65 78 74 72 61 63 74 20 63 6f  nt to extract co
10830 6e 74 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ntent */.  const
10840 20 63 68 61 72 20 2a 7a 46 69 72 73 74 52 6f 77   char *zFirstRow
10850 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 62 65 66      /* Print bef
10860 6f 72 65 20 66 69 72 73 74 20 72 6f 77 2c 20 69  ore first row, i
10870 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
10880 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
10890 2a 70 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74 20  *pSelect;.  int 
108a0 72 63 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c  rc;.  int nResul
108b0 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  t;.  int i;.  co
108c0 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 72  nst char *z;.  r
108d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
108e0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
108f0 65 6c 65 63 74 2c 20 2d 31 2c 20 26 70 53 65 6c  elect, -1, &pSel
10900 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ect, 0);.  if( r
10910 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
10920 21 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  !pSelect ){.    
10930 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
10940 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52  ut, "/**** ERROR
10950 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f  : (%d) %s *****/
10960 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20 20 20  \n", rc,.       
10970 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10980 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
10990 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66  .    if( (rc&0xf
109a0 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  f)!=SQLITE_CORRU
109b0 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a  PT ) p->nErr++;.
109c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
109d0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
109e0 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b  3_step(pSelect);
109f0 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c  .  nResult = sql
10a00 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
10a10 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 77 68  t(pSelect);.  wh
10a20 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
10a30 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  ROW ){.    if( z
10a40 46 69 72 73 74 52 6f 77 20 29 7b 0a 20 20 20 20  FirstRow ){.    
10a50 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
10a60 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 46 69 72  >out, "%s", zFir
10a70 73 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 7a 46  stRow);.      zF
10a80 69 72 73 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20  irstRow = 0;.   
10a90 20 7d 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73   }.    z = (cons
10aa0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
10ab0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c  column_text(pSel
10ac0 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 75 74 66  ect, 0);.    utf
10ad0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
10ae0 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 66   "%s", z);.    f
10af0 6f 72 28 69 3d 31 3b 20 69 3c 6e 52 65 73 75 6c  or(i=1; i<nResul
10b00 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  t; i++){.      u
10b10 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
10b20 74 2c 20 22 2c 25 73 22 2c 20 73 71 6c 69 74 65  t, ",%s", sqlite
10b30 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
10b40 65 6c 65 63 74 2c 20 69 29 29 3b 0a 20 20 20 20  elect, i));.    
10b50 7d 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  }.    if( z==0 )
10b60 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 77 68 69   z = "";.    whi
10b70 6c 65 28 20 7a 5b 30 5d 20 26 26 20 28 7a 5b 30  le( z[0] && (z[0
10b80 5d 21 3d 27 2d 27 20 7c 7c 20 7a 5b 31 5d 21 3d  ]!='-' || z[1]!=
10b90 27 2d 27 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  '-') ) z++;.    
10ba0 69 66 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  if( z[0] ){.    
10bb0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
10bc0 6f 75 74 2c 20 22 5c 6e 3b 5c 6e 22 29 3b 0a 20  out, "\n;\n");. 
10bd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10be0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
10bf0 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d  t, ";\n");.    }
10c00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10c10 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b  3_step(pSelect);
10c20 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
10c30 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 65  te3_finalize(pSe
10c40 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 72 63 21  lect);.  if( rc!
10c50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10c60 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
10c70 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52  >out, "/**** ERR
10c80 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a  OR: (%d) %s ****
10c90 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20  */\n", rc,.     
10ca0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
10cb0 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
10cc0 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30  );.    if( (rc&0
10cd0 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52  xff)!=SQLITE_COR
10ce0 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b  RUPT ) p->nErr++
10cf0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10d00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
10d10 63 61 74 65 20 73 70 61 63 65 20 61 6e 64 20 73  cate space and s
10d20 61 76 65 20 6f 66 66 20 63 75 72 72 65 6e 74 20  ave off current 
10d30 65 72 72 6f 72 20 73 74 72 69 6e 67 2e 0a 2a 2f  error string..*/
10d40 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 61  .static char *sa
10d50 76 65 5f 65 72 72 5f 6d 73 67 28 0a 20 20 73 71  ve_err_msg(.  sq
10d60 6c 69 74 65 33 20 2a 64 62 20 20 20 20 20 20 20  lite3 *db       
10d70 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
10d80 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 29 7b 0a   to query */.){.
10d90 20 20 69 6e 74 20 6e 45 72 72 4d 73 67 20 3d 20    int nErrMsg = 
10da0 31 2b 73 74 72 6c 65 6e 33 30 28 73 71 6c 69 74  1+strlen30(sqlit
10db0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
10dc0 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
10dd0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
10de0 36 34 28 6e 45 72 72 4d 73 67 29 3b 0a 20 20 69  64(nErrMsg);.  i
10df0 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
10e00 20 20 6d 65 6d 63 70 79 28 7a 45 72 72 4d 73 67    memcpy(zErrMsg
10e10 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
10e20 28 64 62 29 2c 20 6e 45 72 72 4d 73 67 29 3b 0a  (db), nErrMsg);.
10e30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72    }.  return zEr
10e40 72 4d 73 67 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rMsg;.}..#ifdef 
10e50 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20  __linux__./*.** 
10e60 41 74 74 65 6d 70 74 20 74 6f 20 64 69 73 70 6c  Attempt to displ
10e70 61 79 20 49 2f 4f 20 73 74 61 74 73 20 6f 6e 20  ay I/O stats on 
10e80 4c 69 6e 75 78 20 75 73 69 6e 67 20 2f 70 72 6f  Linux using /pro
10e90 63 2f 50 49 44 2f 69 6f 0a 2a 2f 0a 73 74 61 74  c/PID/io.*/.stat
10ea0 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 4c  ic void displayL
10eb0 69 6e 75 78 49 6f 53 74 61 74 73 28 46 49 4c 45  inuxIoStats(FILE
10ec0 20 2a 6f 75 74 29 7b 0a 20 20 46 49 4c 45 20 2a   *out){.  FILE *
10ed0 69 6e 3b 0a 20 20 63 68 61 72 20 7a 5b 32 30 30  in;.  char z[200
10ee0 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ];.  sqlite3_snp
10ef0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
10f00 20 7a 2c 20 22 2f 70 72 6f 63 2f 25 64 2f 69 6f   z, "/proc/%d/io
10f10 22 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20  ", getpid());.  
10f20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 2c 20 22 72  in = fopen(z, "r
10f30 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30  b");.  if( in==0
10f40 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69   ) return;.  whi
10f50 6c 65 28 20 66 67 65 74 73 28 7a 2c 20 73 69 7a  le( fgets(z, siz
10f60 65 6f 66 28 7a 29 2c 20 69 6e 29 21 3d 30 20 29  eof(z), in)!=0 )
10f70 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
10f80 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
10f90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
10fa0 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 63 6f  attern;.      co
10fb0 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 63 3b  nst char *zDesc;
10fc0 0a 20 20 20 20 7d 20 61 54 72 61 6e 73 5b 5d 20  .    } aTrans[] 
10fd0 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 72 63 68  = {.      { "rch
10fe0 61 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20  ar: ",          
10ff0 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20 72          "Bytes r
11000 65 63 65 69 76 65 64 20 62 79 20 72 65 61 64 28  eceived by read(
11010 29 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ):" },.      { "
11020 77 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20 20  wchar: ",       
11030 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65             "Byte
11040 73 20 73 65 6e 74 20 74 6f 20 77 72 69 74 65 28  s sent to write(
11050 29 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  ):"    },.      
11060 7b 20 22 73 79 73 63 72 3a 20 22 2c 20 20 20 20  { "syscr: ",    
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
11080 65 61 64 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ead() system cal
11090 6c 73 3a 22 20 20 20 20 20 20 7d 2c 0a 20 20 20  ls:"      },.   
110a0 20 20 20 7b 20 22 73 79 73 63 77 3a 20 22 2c 20     { "syscw: ", 
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110c0 20 22 57 72 69 74 65 28 29 20 73 79 73 74 65 6d   "Write() system
110d0 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 7d 2c 0a   calls:"     },.
110e0 20 20 20 20 20 20 7b 20 22 72 65 61 64 5f 62 79        { "read_by
110f0 74 65 73 3a 20 22 2c 20 20 20 20 20 20 20 20 20  tes: ",         
11100 20 20 20 20 22 42 79 74 65 73 20 72 65 61 64 20      "Bytes read 
11110 66 72 6f 6d 20 73 74 6f 72 61 67 65 3a 22 20 20  from storage:"  
11120 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 72 69 74  },.      { "writ
11130 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20  e_bytes: ",     
11140 20 20 20 20 20 20 20 22 42 79 74 65 73 20 77 72         "Bytes wr
11150 69 74 74 65 6e 20 74 6f 20 73 74 6f 72 61 67 65  itten to storage
11160 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63  :" },.      { "c
11170 61 6e 63 65 6c 6c 65 64 5f 77 72 69 74 65 5f 62  ancelled_write_b
11180 79 74 65 73 3a 20 22 2c 20 20 22 43 61 6e 63 65  ytes: ",  "Cance
11190 6c 6c 65 64 20 77 72 69 74 65 20 62 79 74 65 73  lled write bytes
111a0 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a  :"    },.    };.
111b0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
111c0 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
111d0 69 7a 65 28 61 54 72 61 6e 73 29 3b 20 69 2b 2b  ize(aTrans); i++
111e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
111f0 20 73 74 72 6c 65 6e 33 30 28 61 54 72 61 6e 73   strlen30(aTrans
11200 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 29 3b 0a 20  [i].zPattern);. 
11210 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
11220 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74  (aTrans[i].zPatt
11230 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d 30 20 29 7b  ern, z, n)==0 ){
11240 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
11250 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
11260 20 25 73 22 2c 20 61 54 72 61 6e 73 5b 69 5d 2e   %s", aTrans[i].
11270 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d 29 3b 0a 20  zDesc, &z[n]);. 
11280 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11290 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
112a0 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 7d 0a    fclose(in);.}.
112b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69  #endif../*.** Di
112c0 73 70 6c 61 79 20 61 20 73 69 6e 67 6c 65 20 6c  splay a single l
112d0 69 6e 65 20 6f 66 20 73 74 61 74 75 73 20 75 73  ine of status us
112e0 69 6e 67 20 36 34 2d 62 69 74 20 76 61 6c 75 65  ing 64-bit value
112f0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
11300 64 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e  d displayStatLin
11310 65 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  e(.  ShellState 
11320 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
11330 2a 20 54 68 65 20 73 68 65 6c 6c 20 63 6f 6e 74  * The shell cont
11340 65 78 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ext */.  char *z
11350 4c 61 62 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Label,          
11360 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
11370 74 68 69 73 20 6f 6e 65 20 6c 69 6e 65 20 2a 2f  this one line */
11380 0a 20 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  .  char *zFormat
11390 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
113a0 46 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 72  Format for the r
113b0 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69  esult */.  int i
113c0 53 74 61 74 75 73 43 74 72 6c 2c 20 20 20 20 20  StatusCtrl,     
113d0 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 73 74       /* Which st
113e0 61 74 75 73 20 74 6f 20 64 69 73 70 6c 61 79 20  atus to display 
113f0 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73 65 74 20  */.  int bReset 
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11410 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20  * True to reset 
11420 74 68 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a  the stats */.){.
11430 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
11440 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73 71 6c  iCur = -1;.  sql
11450 69 74 65 33 5f 69 6e 74 36 34 20 69 48 69 77 74  ite3_int64 iHiwt
11460 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 2c  r = -1;.  int i,
11470 20 6e 50 65 72 63 65 6e 74 3b 0a 20 20 63 68 61   nPercent;.  cha
11480 72 20 7a 4c 69 6e 65 5b 32 30 30 5d 3b 0a 20 20  r zLine[200];.  
11490 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 36 34  sqlite3_status64
114a0 28 69 53 74 61 74 75 73 43 74 72 6c 2c 20 26 69  (iStatusCtrl, &i
114b0 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
114c0 65 73 65 74 29 3b 0a 20 20 66 6f 72 28 69 3d 30  eset);.  for(i=0
114d0 2c 20 6e 50 65 72 63 65 6e 74 3d 30 3b 20 7a 46  , nPercent=0; zF
114e0 6f 72 6d 61 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  ormat[i]; i++){.
114f0 20 20 20 20 69 66 28 20 7a 46 6f 72 6d 61 74 5b      if( zFormat[
11500 69 5d 3d 3d 27 25 27 20 29 20 6e 50 65 72 63 65  i]=='%' ) nPerce
11510 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nt++;.  }.  if( 
11520 6e 50 65 72 63 65 6e 74 3e 31 20 29 7b 0a 20 20  nPercent>1 ){.  
11530 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
11540 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  tf(sizeof(zLine)
11550 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74  , zLine, zFormat
11560 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b  , iCur, iHiwtr);
11570 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
11580 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
11590 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c  izeof(zLine), zL
115a0 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 69 48  ine, zFormat, iH
115b0 69 77 74 72 29 3b 0a 20 20 7d 0a 20 20 72 61 77  iwtr);.  }.  raw
115c0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
115d0 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 4c  "%-36s %s\n", zL
115e0 61 62 65 6c 2c 20 7a 4c 69 6e 65 29 3b 0a 7d 0a  abel, zLine);.}.
115f0 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 6d  ./*.** Display m
11600 65 6d 6f 72 79 20 73 74 61 74 73 2e 0a 2a 2f 0a  emory stats..*/.
11610 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c  static int displ
11620 61 79 5f 73 74 61 74 73 28 0a 20 20 73 71 6c 69  ay_stats(.  sqli
11630 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
11640 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
11650 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  ase to query */.
11660 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41    ShellState *pA
11670 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rg,           /*
11680 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c   Pointer to Shel
11690 6c 53 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  lState */.  int 
116a0 62 52 65 73 65 74 20 20 20 20 20 20 20 20 20 20  bReset          
116b0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
116c0 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74 61  to reset the sta
116d0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
116e0 43 75 72 3b 0a 20 20 69 6e 74 20 69 48 69 77 74  Cur;.  int iHiwt
116f0 72 3b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 0a  r;.  FILE *out;.
11700 20 20 69 66 28 20 70 41 72 67 3d 3d 30 20 7c 7c    if( pArg==0 ||
11710 20 70 41 72 67 2d 3e 6f 75 74 3d 3d 30 20 29 20   pArg->out==0 ) 
11720 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 75 74 20  return 0;.  out 
11730 3d 20 70 41 72 67 2d 3e 6f 75 74 3b 0a 0a 20 20  = pArg->out;..  
11740 69 66 28 20 70 41 72 67 2d 3e 70 53 74 6d 74 20  if( pArg->pStmt 
11750 26 26 20 28 70 41 72 67 2d 3e 73 74 61 74 73 4f  && (pArg->statsO
11760 6e 20 26 20 32 29 20 29 7b 0a 20 20 20 20 69 6e  n & 2) ){.    in
11770 74 20 6e 43 6f 6c 2c 20 69 2c 20 78 3b 0a 20 20  t nCol, i, x;.  
11780 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
11790 70 53 74 6d 74 20 3d 20 70 41 72 67 2d 3e 70 53  pStmt = pArg->pS
117a0 74 6d 74 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b  tmt;.    char z[
117b0 31 30 30 5d 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d  100];.    nCol =
117c0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
117d0 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
117e0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
117f0 2c 20 22 25 2d 33 36 73 20 25 64 5c 6e 22 2c 20  , "%-36s %d\n", 
11800 22 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75  "Number of outpu
11810 74 20 63 6f 6c 75 6d 6e 73 3a 22 2c 20 6e 43 6f  t columns:", nCo
11820 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l);.    for(i=0;
11830 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
11840 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
11850 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
11860 7a 2c 22 43 6f 6c 75 6d 6e 20 25 64 20 25 6e 6e  z,"Column %d %nn
11870 61 6d 65 3a 22 2c 20 69 2c 20 26 78 29 3b 0a 20  ame:", i, &x);. 
11880 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
11890 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c  (out, "%-36s %s\
118a0 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63  n", z, sqlite3_c
118b0 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
118c0 2c 69 29 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ,i));.#ifndef SQ
118d0 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
118e0 50 45 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  PE.      sqlite3
118f0 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b  _snprintf(30, z+
11900 78 2c 20 22 64 65 63 6c 61 72 65 64 20 74 79 70  x, "declared typ
11910 65 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38  e:");.      utf8
11920 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d  _printf(out, "%-
11930 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71  36s %s\n", z, sq
11940 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
11950 6c 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29 29  ltype(pStmt, i))
11960 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
11970 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
11980 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
11990 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
119a0 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22 64  intf(30, z+x, "d
119b0 61 74 61 62 61 73 65 20 6e 61 6d 65 3a 22 29 3b  atabase name:");
119c0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
119d0 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  tf(out, "%-36s %
119e0 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33  s\n", z, sqlite3
119f0 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65  _column_database
11a00 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b  _name(pStmt,i));
11a10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
11a20 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c  nprintf(30, z+x,
11a30 20 22 74 61 62 6c 65 20 6e 61 6d 65 3a 22 29 3b   "table name:");
11a40 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
11a50 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  tf(out, "%-36s %
11a60 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33  s\n", z, sqlite3
11a70 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61  _column_table_na
11a80 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20  me(pStmt,i));.  
11a90 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
11aa0 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22 6f  intf(30, z+x, "o
11ab0 72 69 67 69 6e 20 6e 61 6d 65 3a 22 29 3b 0a 20  rigin name:");. 
11ac0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
11ad0 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c  (out, "%-36s %s\
11ae0 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63  n", z, sqlite3_c
11af0 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d  olumn_origin_nam
11b00 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 23 65 6e  e(pStmt,i));.#en
11b10 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  dif.    }.  }.. 
11b20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
11b30 28 70 41 72 67 2c 20 22 4d 65 6d 6f 72 79 20 55  (pArg, "Memory U
11b40 73 65 64 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c  sed:",.     "%ll
11b50 64 20 28 6d 61 78 20 25 6c 6c 64 29 20 62 79 74  d (max %lld) byt
11b60 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  es", SQLITE_STAT
11b70 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20  US_MEMORY_USED, 
11b80 62 52 65 73 65 74 29 3b 0a 20 20 64 69 73 70 6c  bReset);.  displ
11b90 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c  ayStatLine(pArg,
11ba0 20 22 4e 75 6d 62 65 72 20 6f 66 20 4f 75 74 73   "Number of Outs
11bb0 74 61 6e 64 69 6e 67 20 41 6c 6c 6f 63 61 74 69  tanding Allocati
11bc0 6f 6e 73 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c  ons:",.     "%ll
11bd0 64 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c 20 53  d (max %lld)", S
11be0 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c  QLITE_STATUS_MAL
11bf0 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62 52 65 73 65  LOC_COUNT, bRese
11c00 74 29 3b 0a 20 20 69 66 28 20 70 41 72 67 2d 3e  t);.  if( pArg->
11c10 73 68 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c  shellFlgs & SHFL
11c20 47 5f 50 61 67 65 63 61 63 68 65 20 29 7b 0a 20  G_Pagecache ){. 
11c30 20 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69     displayStatLi
11c40 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72  ne(pArg, "Number
11c50 20 6f 66 20 50 63 61 63 68 65 20 50 61 67 65 73   of Pcache Pages
11c60 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20 20 20   Used:",.       
11c70 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29  "%lld (max %lld)
11c80 20 70 61 67 65 73 22 2c 20 53 51 4c 49 54 45 5f   pages", SQLITE_
11c90 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45  STATUS_PAGECACHE
11ca0 5f 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a  _USED, bReset);.
11cb0 20 20 7d 0a 20 20 64 69 73 70 6c 61 79 53 74 61    }.  displaySta
11cc0 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d  tLine(pArg, "Num
11cd0 62 65 72 20 6f 66 20 50 63 61 63 68 65 20 4f 76  ber of Pcache Ov
11ce0 65 72 66 6c 6f 77 20 42 79 74 65 73 3a 22 2c 0a  erflow Bytes:",.
11cf0 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20       "%lld (max 
11d00 25 6c 6c 64 29 20 62 79 74 65 73 22 2c 20 53 51  %lld) bytes", SQ
11d10 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45  LITE_STATUS_PAGE
11d20 43 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57 2c 20  CACHE_OVERFLOW, 
11d30 62 52 65 73 65 74 29 3b 0a 20 20 64 69 73 70 6c  bReset);.  displ
11d40 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c  ayStatLine(pArg,
11d50 20 22 4c 61 72 67 65 73 74 20 41 6c 6c 6f 63 61   "Largest Alloca
11d60 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22 25 6c  tion:",.     "%l
11d70 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54  ld bytes", SQLIT
11d80 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f  E_STATUS_MALLOC_
11d90 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a 20  SIZE, bReset);. 
11da0 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
11db0 28 70 41 72 67 2c 20 22 4c 61 72 67 65 73 74 20  (pArg, "Largest 
11dc0 50 63 61 63 68 65 20 41 6c 6c 6f 63 61 74 69 6f  Pcache Allocatio
11dd0 6e 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20  n:",.     "%lld 
11de0 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53  bytes", SQLITE_S
11df0 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f  TATUS_PAGECACHE_
11e00 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a 23  SIZE, bReset);.#
11e10 69 66 64 65 66 20 59 59 54 52 41 43 4b 4d 41 58  ifdef YYTRACKMAX
11e20 53 54 41 43 4b 44 45 50 54 48 0a 20 20 64 69 73  STACKDEPTH.  dis
11e30 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72  playStatLine(pAr
11e40 67 2c 20 22 44 65 65 70 65 73 74 20 50 61 72 73  g, "Deepest Pars
11e50 65 72 20 53 74 61 63 6b 3a 22 2c 0a 20 20 20 20  er Stack:",.    
11e60 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64   "%lld (max %lld
11e70 29 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55  )", SQLITE_STATU
11e80 53 5f 50 41 52 53 45 52 5f 53 54 41 43 4b 2c 20  S_PARSER_STACK, 
11e90 62 52 65 73 65 74 29 3b 0a 23 65 6e 64 69 66 0a  bReset);.#endif.
11ea0 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20  .  if( db ){.   
11eb0 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65 6c 6c   if( pArg->shell
11ec0 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 4c 6f 6f  Flgs & SHFLG_Loo
11ed0 6b 61 73 69 64 65 20 29 7b 0a 20 20 20 20 20 20  kaside ){.      
11ee0 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
11ef0 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  -1;.      sqlite
11f00 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
11f10 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
11f20 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45 44 2c 0a  LOOKASIDE_USED,.
11f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f40 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26          &iCur, &
11f50 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
11f60 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
11f70 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20  f(pArg->out,.   
11f80 20 20 20 20 20 20 20 20 20 20 20 22 4c 6f 6f 6b             "Look
11f90 61 73 69 64 65 20 53 6c 6f 74 73 20 55 73 65 64  aside Slots Used
11fa0 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
11fb0 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c   %d (max %d)\n",
11fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
11fd0 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20  Cur, iHiwtr);.  
11fe0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
11ff0 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
12000 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53  _DBSTATUS_LOOKAS
12010 49 44 45 5f 48 49 54 2c 0a 20 20 20 20 20 20 20  IDE_HIT,.       
12020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12030 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
12040 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20   bReset);.      
12050 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
12060 3e 6f 75 74 2c 20 22 53 75 63 63 65 73 73 66 75  >out, "Successfu
12070 6c 20 6c 6f 6f 6b 61 73 69 64 65 20 61 74 74 65  l lookaside atte
12080 6d 70 74 73 3a 20 20 20 20 20 20 20 25 64 5c 6e  mpts:       %d\n
12090 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
120a0 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20   iHiwtr);.      
120b0 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
120c0 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
120d0 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f  TATUS_LOOKASIDE_
120e0 4d 49 53 53 5f 53 49 5a 45 2c 0a 20 20 20 20 20  MISS_SIZE,.     
120f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12100 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74     &iCur, &iHiwt
12110 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
12120 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12130 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69  g->out, "Lookasi
12140 64 65 20 66 61 69 6c 75 72 65 73 20 64 75 65 20  de failures due 
12150 74 6f 20 73 69 7a 65 3a 20 20 20 20 20 20 25 64  to size:      %d
12160 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
12170 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20     iHiwtr);.    
12180 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
12190 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
121a0 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44  BSTATUS_LOOKASID
121b0 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c 0a 20 20 20  E_MISS_FULL,.   
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121d0 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69       &iCur, &iHi
121e0 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
121f0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
12200 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61  Arg->out, "Looka
12210 73 69 64 65 20 66 61 69 6c 75 72 65 73 20 64 75  side failures du
12220 65 20 74 6f 20 4f 4f 4d 3a 20 20 20 20 20 20 20  e to OOM:       
12230 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
12240 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20       iHiwtr);.  
12250 20 20 7d 0a 20 20 20 20 69 48 69 77 74 72 20 3d    }.    iHiwtr =
12260 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
12270 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
12280 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
12290 54 41 54 55 53 5f 43 41 43 48 45 5f 55 53 45 44  TATUS_CACHE_USED
122a0 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
122b0 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72  , bReset);.    r
122c0 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
122d0 6f 75 74 2c 20 22 50 61 67 65 72 20 48 65 61 70  out, "Pager Heap
122e0 20 55 73 61 67 65 3a 20 20 20 20 20 20 20 20 20   Usage:         
122f0 20 20 20 20 20 20 20 20 20 20 20 25 64 20 62 79             %d by
12300 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  tes\n",.        
12310 20 20 20 20 69 43 75 72 29 3b 0a 20 20 20 20 69      iCur);.    i
12320 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
12330 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  1;.    sqlite3_d
12340 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
12350 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
12360 48 45 5f 48 49 54 2c 20 26 69 43 75 72 2c 20 26  HE_HIT, &iCur, &
12370 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20  iHiwtr, 1);.    
12380 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
12390 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68  >out, "Page cach
123a0 65 20 68 69 74 73 3a 20 20 20 20 20 20 20 20 20  e hits:         
123b0 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
123c0 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48  ", iCur);.    iH
123d0 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
123e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
123f0 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
12400 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
12410 45 5f 4d 49 53 53 2c 20 26 69 43 75 72 2c 20 26  E_MISS, &iCur, &
12420 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20  iHiwtr, 1);.    
12430 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
12440 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68  >out, "Page cach
12450 65 20 6d 69 73 73 65 73 3a 20 20 20 20 20 20 20  e misses:       
12460 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
12470 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48  ", iCur);.    iH
12480 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
12490 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
124a0 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
124b0 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
124c0 45 5f 57 52 49 54 45 2c 20 26 69 43 75 72 2c 20  E_WRITE, &iCur, 
124d0 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20  &iHiwtr, 1);.   
124e0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
124f0 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63  ->out, "Page cac
12500 68 65 20 77 72 69 74 65 73 3a 20 20 20 20 20 20  he writes:      
12510 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
12520 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
12530 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
12540 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  1;.    sqlite3_d
12550 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
12560 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
12570 48 45 5f 53 50 49 4c 4c 2c 20 26 69 43 75 72 2c  HE_SPILL, &iCur,
12580 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20   &iHiwtr, 1);.  
12590 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
125a0 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61  g->out, "Page ca
125b0 63 68 65 20 73 70 69 6c 6c 73 3a 20 20 20 20 20  che spills:     
125c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
125d0 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
125e0 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
125f0 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
12600 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
12610 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53 43  LITE_DBSTATUS_SC
12620 48 45 4d 41 5f 55 53 45 44 2c 20 26 69 43 75 72  HEMA_USED, &iCur
12630 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
12640 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  t);.    raw_prin
12650 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53  tf(pArg->out, "S
12660 63 68 65 6d 61 20 48 65 61 70 20 55 73 61 67 65  chema Heap Usage
12670 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
12680 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c      %d bytes\n",
12690 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75  .            iCu
126a0 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d  r);.    iHiwtr =
126b0 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
126c0 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
126d0 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
126e0 54 41 54 55 53 5f 53 54 4d 54 5f 55 53 45 44 2c  TATUS_STMT_USED,
126f0 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
12700 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61   bReset);.    ra
12710 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
12720 75 74 2c 20 22 53 74 61 74 65 6d 65 6e 74 20 48  ut, "Statement H
12730 65 61 70 2f 4c 6f 6f 6b 61 73 69 64 65 20 55 73  eap/Lookaside Us
12740 61 67 65 3a 20 20 20 20 20 20 25 64 20 62 79 74  age:      %d byt
12750 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
12760 20 20 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 20     iCur);.  }.. 
12770 20 69 66 28 20 70 41 72 67 2d 3e 70 53 74 6d 74   if( pArg->pStmt
12780 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 73   ){.    iCur = s
12790 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
127a0 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20  us(pArg->pStmt, 
127b0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
127c0 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c  S_FULLSCAN_STEP,
127d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
127e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127f0 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
12800 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12810 74 2c 20 22 46 75 6c 6c 73 63 61 6e 20 53 74 65  t, "Fullscan Ste
12820 70 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ps:             
12830 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
12840 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20  iCur);.    iCur 
12850 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
12860 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d  tatus(pArg->pStm
12870 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  t, SQLITE_STMTST
12880 41 54 55 53 5f 53 4f 52 54 2c 20 62 52 65 73 65  ATUS_SORT, bRese
12890 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  t);.    raw_prin
128a0 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53  tf(pArg->out, "S
128b0 6f 72 74 20 4f 70 65 72 61 74 69 6f 6e 73 3a 20  ort Operations: 
128c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128d0 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
128e0 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c  ;.    iCur = sql
128f0 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
12900 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51  (pArg->pStmt, SQ
12910 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
12920 41 55 54 4f 49 4e 44 45 58 2c 62 52 65 73 65 74  AUTOINDEX,bReset
12930 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
12940 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 41 75  f(pArg->out, "Au
12950 74 6f 69 6e 64 65 78 20 49 6e 73 65 72 74 73 3a  toindex Inserts:
12960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12970 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
12980 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
12990 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
129a0 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
129b0 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 56  ITE_STMTSTATUS_V
129c0 4d 5f 53 54 45 50 2c 20 62 52 65 73 65 74 29 3b  M_STEP, bReset);
129d0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
129e0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 56 69 72 74  pArg->out, "Virt
129f0 75 61 6c 20 4d 61 63 68 69 6e 65 20 53 74 65 70  ual Machine Step
12a00 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s:              
12a10 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12a20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65     iCur = sqlite
12a30 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41  3_stmt_status(pA
12a40 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54  rg->pStmt, SQLIT
12a50 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52 45 50  E_STMTSTATUS_REP
12a60 52 45 50 41 52 45 2c 20 62 52 65 73 65 74 29 3b  REPARE, bReset);
12a70 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
12a80 70 41 72 67 2d 3e 6f 75 74 2c 20 22 52 65 70 72  pArg->out, "Repr
12a90 65 70 61 72 65 20 6f 70 65 72 61 74 69 6f 6e 73  epare operations
12aa0 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
12ab0 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12ac0 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65     iCur = sqlite
12ad0 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41  3_stmt_status(pA
12ae0 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54  rg->pStmt, SQLIT
12af0 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52 55 4e  E_STMTSTATUS_RUN
12b00 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72  , bReset);.    r
12b10 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
12b20 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20  out, "Number of 
12b30 74 69 6d 65 73 20 72 75 6e 3a 20 20 20 20 20 20  times run:      
12b40 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
12b50 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75  , iCur);.    iCu
12b60 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  r = sqlite3_stmt
12b70 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53  _status(pArg->pS
12b80 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54  tmt, SQLITE_STMT
12b90 53 54 41 54 55 53 5f 4d 45 4d 55 53 45 44 2c 20  STATUS_MEMUSED, 
12ba0 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
12bb0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12bc0 74 2c 20 22 4d 65 6d 6f 72 79 20 75 73 65 64 20  t, "Memory used 
12bd0 62 79 20 70 72 65 70 61 72 65 64 20 73 74 6d 74  by prepared stmt
12be0 3a 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20  :        %d\n", 
12bf0 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 23 69 66 64  iCur);.  }..#ifd
12c00 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 20 20 64  ef __linux__.  d
12c10 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61  isplayLinuxIoSta
12c20 74 73 28 70 41 72 67 2d 3e 6f 75 74 29 3b 0a 23  ts(pArg->out);.#
12c30 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 6e  endif..  /* Do n
12c40 6f 74 20 72 65 6d 6f 76 65 20 74 68 69 73 20 6d  ot remove this m
12c50 61 63 68 69 6e 65 20 72 65 61 64 61 62 6c 65 20  achine readable 
12c60 63 6f 6d 6d 65 6e 74 3a 20 65 78 74 72 61 2d 73  comment: extra-s
12c70 74 61 74 73 2d 6f 75 74 70 75 74 2d 68 65 72 65  tats-output-here
12c80 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b   */..  return 0;
12c90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61  .}../*.** Displa
12ca0 79 20 73 63 61 6e 20 73 74 61 74 73 2e 0a 2a 2f  y scan stats..*/
12cb0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
12cc0 70 6c 61 79 5f 73 63 61 6e 73 74 61 74 73 28 0a  play_scanstats(.
12cd0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
12ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cf0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f    /* Database to
12d00 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 68 65 6c   query */.  Shel
12d10 6c 53 74 61 74 65 20 2a 70 41 72 67 20 20 20 20  lState *pArg    
12d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
12d30 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53  ointer to ShellS
12d40 74 61 74 65 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  tate */.){.#ifnd
12d50 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
12d60 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
12d70 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
12d80 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45  TER(db);.  UNUSE
12d90 44 5f 50 41 52 41 4d 45 54 45 52 28 70 41 72 67  D_PARAMETER(pArg
12da0 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 69  );.#else.  int i
12db0 2c 20 6b 2c 20 6e 2c 20 6d 78 3b 0a 20 20 72 61  , k, n, mx;.  ra
12dc0 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
12dd0 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 63  ut, "-------- sc
12de0 61 6e 73 74 61 74 73 20 2d 2d 2d 2d 2d 2d 2d 2d  anstats --------
12df0 5c 6e 22 29 3b 0a 20 20 6d 78 20 3d 20 30 3b 0a  \n");.  mx = 0;.
12e00 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 3d 6d 78    for(k=0; k<=mx
12e10 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 64 6f 75 62  ; k++){.    doub
12e20 6c 65 20 72 45 73 74 4c 6f 6f 70 20 3d 20 31 2e  le rEstLoop = 1.
12e30 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30  0;.    for(i=n=0
12e40 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ; 1; i++){.     
12e50 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
12e60 20 3d 20 70 41 72 67 2d 3e 70 53 74 6d 74 3b 0a   = pArg->pStmt;.
12e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
12e80 74 36 34 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73 69  t64 nLoop, nVisi
12e90 74 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20  t;.      double 
12ea0 72 45 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  rEst;.      int 
12eb0 69 53 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73  iSid;.      cons
12ec0 74 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e  t char *zExplain
12ed0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
12ee0 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
12ef0 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45  tus(p, i, SQLITE
12f00 5f 53 43 41 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c  _SCANSTAT_NLOOP,
12f10 20 28 76 6f 69 64 2a 29 26 6e 4c 6f 6f 70 29 20   (void*)&nLoop) 
12f20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
12f30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12f40 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
12f50 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
12f60 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 53 45  LITE_SCANSTAT_SE
12f70 4c 45 43 54 49 44 2c 20 28 76 6f 69 64 2a 29 26  LECTID, (void*)&
12f80 69 53 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28  iSid);.      if(
12f90 20 69 53 69 64 3e 6d 78 20 29 20 6d 78 20 3d 20   iSid>mx ) mx = 
12fa0 69 53 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20  iSid;.      if( 
12fb0 69 53 69 64 21 3d 6b 20 29 20 63 6f 6e 74 69 6e  iSid!=k ) contin
12fc0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d  ue;.      if( n=
12fd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 45  =0 ){.        rE
12fe0 73 74 4c 6f 6f 70 20 3d 20 28 64 6f 75 62 6c 65  stLoop = (double
12ff0 29 6e 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  )nLoop;.        
13000 69 66 28 20 6b 3e 30 20 29 20 72 61 77 5f 70 72  if( k>0 ) raw_pr
13010 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
13020 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75 62 71 75 65  "-------- subque
13030 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 5c 6e 22  ry %d -------\n"
13040 2c 20 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , k);.      }.  
13050 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 73      n++;.      s
13060 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
13070 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c  status(p, i, SQL
13080 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56 49  ITE_SCANSTAT_NVI
13090 53 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56 69  SIT, (void*)&nVi
130a0 73 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  sit);.      sqli
130b0 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
130c0 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45  tus(p, i, SQLITE
130d0 5f 53 43 41 4e 53 54 41 54 5f 45 53 54 2c 20 28  _SCANSTAT_EST, (
130e0 76 6f 69 64 2a 29 26 72 45 73 74 29 3b 0a 20 20  void*)&rEst);.  
130f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
13100 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69  _scanstatus(p, i
13110 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
13120 54 5f 45 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64  T_EXPLAIN, (void
13130 2a 29 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20  *)&zExplain);.  
13140 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
13150 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 70  pArg->out, "Loop
13160 20 25 32 64 3a 20 25 73 5c 6e 22 2c 20 6e 2c 20   %2d: %s\n", n, 
13170 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20  zExplain);.     
13180 20 72 45 73 74 4c 6f 6f 70 20 2a 3d 20 72 45 73   rEstLoop *= rEs
13190 74 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  t;.      raw_pri
131a0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20  ntf(pArg->out,. 
131b0 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20 20           "      
131c0 20 20 20 6e 4c 6f 6f 70 3d 25 2d 38 6c 6c 64 20     nLoop=%-8lld 
131d0 6e 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52  nRow=%-8lld estR
131e0 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77  ow=%-8lld estRow
131f0 2f 4c 6f 6f 70 3d 25 2d 38 67 5c 6e 22 2c 0a 20  /Loop=%-8g\n",. 
13200 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70 2c 20           nLoop, 
13210 6e 56 69 73 69 74 2c 20 28 73 71 6c 69 74 65 33  nVisit, (sqlite3
13220 5f 69 6e 74 36 34 29 28 72 45 73 74 4c 6f 6f 70  _int64)(rEstLoop
13230 2b 30 2e 35 29 2c 20 72 45 73 74 0a 20 20 20 20  +0.5), rEst.    
13240 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20    );.    }.  }. 
13250 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
13260 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d  ->out, "--------
13270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13280 2d 2d 2d 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a  ---\n");.#endif.
13290 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
132a0 65 72 20 61 7a 41 72 72 61 79 20 70 6f 69 6e 74  er azArray point
132b0 73 20 74 6f 20 61 20 7a 65 72 6f 2d 74 65 72 6d  s to a zero-term
132c0 69 6e 61 74 65 64 20 61 72 72 61 79 20 6f 66 20  inated array of 
132d0 73 74 72 69 6e 67 73 2e 20 7a 53 74 72 0a 2a 2a  strings. zStr.**
132e0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 69 6e   points to a sin
132f0 67 6c 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  gle nul-terminat
13300 65 64 20 73 74 72 69 6e 67 2e 20 52 65 74 75 72  ed string. Retur
13310 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 7a 53  n non-zero if zS
13320 74 72 0a 2a 2a 20 69 73 20 65 71 75 61 6c 2c 20  tr.** is equal, 
13330 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 74 72  according to str
13340 63 6d 70 28 29 2c 20 74 6f 20 61 6e 79 20 6f 66  cmp(), to any of
13350 20 74 68 65 20 73 74 72 69 6e 67 73 20 69 6e 20   the strings in 
13360 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 20 4f 74  the array..** Ot
13370 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
13380 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
13390 69 6e 74 20 73 74 72 5f 69 6e 5f 61 72 72 61 79  int str_in_array
133a0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74  (const char *zSt
133b0 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  r, const char **
133c0 61 7a 41 72 72 61 79 29 7b 0a 20 20 69 6e 74 20  azArray){.  int 
133d0 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 61 7a  i;.  for(i=0; az
133e0 41 72 72 61 79 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  Array[i]; i++){.
133f0 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
13400 70 28 7a 53 74 72 2c 20 61 7a 41 72 72 61 79 5b  p(zStr, azArray[
13410 69 5d 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  i]) ) return 1;.
13420 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
13430 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70  }../*.** If comp
13440 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 20 70  iled statement p
13450 53 71 6c 20 61 70 70 65 61 72 73 20 74 6f 20 62  Sql appears to b
13460 65 20 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61  e an EXPLAIN sta
13470 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f 63 61 74 65  tement, allocate
13480 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
13490 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74 65 2e   the ShellState.
134a0 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79  aiIndent[] array
134b0 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62 65 72   with the number
134c0 20 6f 66 0a 2a 2a 20 73 70 61 63 65 73 20 65 61   of.** spaces ea
134d0 63 68 20 6f 70 63 6f 64 65 20 73 68 6f 75 6c 64  ch opcode should
134e0 20 62 65 20 69 6e 64 65 6e 74 65 64 20 62 65 66   be indented bef
134f0 6f 72 65 20 69 74 20 69 73 20 6f 75 74 70 75 74  ore it is output
13500 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
13510 6e 74 69 6e 67 20 72 75 6c 65 73 20 61 72 65 3a  nting rules are:
13520 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72  .**.**     * For
13530 20 65 61 63 68 20 22 4e 65 78 74 22 2c 20 22 50   each "Next", "P
13540 72 65 76 22 2c 20 22 56 4e 65 78 74 22 20 6f 72  rev", "VNext" or
13550 20 22 56 50 72 65 76 22 20 69 6e 73 74 72 75 63   "VPrev" instruc
13560 74 69 6f 6e 2c 20 69 6e 64 65 6e 74 0a 2a 2a 20  tion, indent.** 
13570 20 20 20 20 20 20 61 6c 6c 20 6f 70 63 6f 64 65        all opcode
13580 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 74  s that occur bet
13590 77 65 65 6e 20 74 68 65 20 70 32 20 6a 75 6d 70  ween the p2 jump
135a0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 6e 64   destination and
135b0 20 74 68 65 20 6f 70 63 6f 64 65 0a 2a 2a 20 20   the opcode.**  
135c0 20 20 20 20 20 69 74 73 65 6c 66 20 62 79 20 32       itself by 2
135d0 20 73 70 61 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20   spaces..**.**  
135e0 20 20 20 2a 20 46 6f 72 20 65 61 63 68 20 22 47     * For each "G
135f0 6f 74 6f 22 2c 20 69 66 20 74 68 65 20 6a 75 6d  oto", if the jum
13600 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  p destination is
13610 20 65 61 72 6c 69 65 72 20 69 6e 20 74 68 65 20   earlier in the 
13620 70 72 6f 67 72 61 6d 0a 2a 2a 20 20 20 20 20 20  program.**      
13630 20 61 6e 64 20 65 6e 64 73 20 6f 6e 20 6f 6e 65   and ends on one
13640 20 6f 66 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20   of:.**         
13650 20 59 69 65 6c 64 20 20 53 65 65 6b 47 74 20 20   Yield  SeekGt  
13660 53 65 65 6b 4c 74 20 20 52 6f 77 53 65 74 52 65  SeekLt  RowSetRe
13670 61 64 20 20 52 65 77 69 6e 64 0a 2a 2a 20 20 20  ad  Rewind.**   
13680 20 20 20 20 6f 72 20 69 66 20 74 68 65 20 50 31      or if the P1
13690 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 6e   parameter is on
136a0 65 20 69 6e 73 74 65 61 64 20 6f 66 20 7a 65 72  e instead of zer
136b0 6f 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 6e  o,.**       then
136c0 20 69 6e 64 65 6e 74 20 61 6c 6c 20 6f 70 63 6f   indent all opco
136d0 64 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  des between the 
136e0 65 61 72 6c 69 65 72 20 69 6e 73 74 72 75 63 74  earlier instruct
136f0 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ion.**       and
13700 20 22 47 6f 74 6f 22 20 62 79 20 32 20 73 70 61   "Goto" by 2 spa
13710 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ces..*/.static v
13720 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64 61 74 61  oid explain_data
13730 5f 70 72 65 70 61 72 65 28 53 68 65 6c 6c 53 74  _prepare(ShellSt
13740 61 74 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ate *p, sqlite3_
13750 73 74 6d 74 20 2a 70 53 71 6c 29 7b 0a 20 20 63  stmt *pSql){.  c
13760 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
13770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13780 2a 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68  * The text of th
13790 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
137a0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
137b0 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
137c0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
137d0 63 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  check if this is
137e0 20 61 6e 20 45 58 50 4c 41 49 4e 20 2a 2f 0a 20   an EXPLAIN */. 
137f0 20 69 6e 74 20 2a 61 62 59 69 65 6c 64 20 3d 20   int *abYield = 
13800 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13810 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 20 69   /* True if op i
13820 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64 20 2a 2f  s an OP_Yield */
13830 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20  .  int nAlloc = 
13840 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13850 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
13860 73 69 7a 65 20 6f 66 20 70 2d 3e 61 69 49 6e 64  size of p->aiInd
13870 65 6e 74 5b 5d 2c 20 61 62 59 69 65 6c 64 20 2a  ent[], abYield *
13880 2f 0a 20 20 69 6e 74 20 69 4f 70 3b 20 20 20 20  /.  int iOp;    
13890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138a0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
138b0 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20 70 2d 3e  operation in p->
138c0 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 0a 20  aiIndent[] */.. 
138d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4e   const char *azN
138e0 65 78 74 5b 5d 20 3d 20 7b 20 22 4e 65 78 74 22  ext[] = { "Next"
138f0 2c 20 22 50 72 65 76 22 2c 20 22 56 50 72 65 76  , "Prev", "VPrev
13900 22 2c 20 22 56 4e 65 78 74 22 2c 20 22 53 6f 72  ", "VNext", "Sor
13910 74 65 72 4e 65 78 74 22 2c 20 30 20 7d 3b 0a 20  terNext", 0 };. 
13920 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 59   const char *azY
13930 69 65 6c 64 5b 5d 20 3d 20 7b 20 22 59 69 65 6c  ield[] = { "Yiel
13940 64 22 2c 20 22 53 65 65 6b 4c 54 22 2c 20 22 53  d", "SeekLT", "S
13950 65 65 6b 47 54 22 2c 20 22 52 6f 77 53 65 74 52  eekGT", "RowSetR
13960 65 61 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ead",.          
13970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13980 20 20 22 52 65 77 69 6e 64 22 2c 20 30 20 7d 3b    "Rewind", 0 };
13990 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
139a0 7a 47 6f 74 6f 5b 5d 20 3d 20 7b 20 22 47 6f 74  zGoto[] = { "Got
139b0 6f 22 2c 20 30 20 7d 3b 0a 0a 20 20 2f 2a 20 54  o", 0 };..  /* T
139c0 72 79 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  ry to figure out
139d0 20 69 66 20 74 68 69 73 20 69 73 20 72 65 61 6c   if this is real
139e0 6c 79 20 61 6e 20 45 58 50 4c 41 49 4e 20 73 74  ly an EXPLAIN st
139f0 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 69 73  atement. If this
13a00 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  .  ** cannot be 
13a10 76 65 72 69 66 69 65 64 2c 20 72 65 74 75 72 6e  verified, return
13a20 20 65 61 72 6c 79 2e 20 20 2a 2f 0a 20 20 69 66   early.  */.  if
13a30 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
13a40 5f 63 6f 75 6e 74 28 70 53 71 6c 29 21 3d 38 20  _count(pSql)!=8 
13a50 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20  ){.    p->cMode 
13a60 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72  = p->mode;.    r
13a70 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 53 71  eturn;.  }.  zSq
13a80 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28  l = sqlite3_sql(
13a90 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a 53 71  pSql);.  if( zSq
13aa0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  l==0 ) return;. 
13ab0 20 66 6f 72 28 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d   for(z=zSql; *z=
13ac0 3d 27 20 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27  =' ' || *z=='\t'
13ad0 20 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27 20 7c 7c 20   || *z=='\n' || 
13ae0 2a 7a 3d 3d 27 5c 66 27 20 7c 7c 20 2a 7a 3d 3d  *z=='\f' || *z==
13af0 27 5c 72 27 3b 20 7a 2b 2b 29 3b 0a 20 20 69 66  '\r'; z++);.  if
13b00 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ( sqlite3_strnic
13b10 6d 70 28 7a 2c 20 22 65 78 70 6c 61 69 6e 22 2c  mp(z, "explain",
13b20 20 37 29 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d   7) ){.    p->cM
13b30 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ode = p->mode;. 
13b40 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
13b50 20 20 66 6f 72 28 69 4f 70 3d 30 3b 20 53 51 4c    for(iOp=0; SQL
13b60 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
13b70 5f 73 74 65 70 28 70 53 71 6c 29 3b 20 69 4f 70  _step(pSql); iOp
13b80 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ++){.    int i;.
13b90 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20      int iAddr = 
13ba0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
13bb0 6e 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20  nt(pSql, 0);.   
13bc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
13bd0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
13be0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
13bf0 65 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a 0a 20  ext(pSql, 1);.. 
13c00 20 20 20 2f 2a 20 53 65 74 20 70 32 20 74 6f 20     /* Set p2 to 
13c10 74 68 65 20 50 32 20 66 69 65 6c 64 20 6f 66 20  the P2 field of 
13c20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 70 63 6f  the current opco
13c30 64 65 2e 20 54 68 65 6e 2c 20 61 73 73 75 6d 69  de. Then, assumi
13c40 6e 67 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 70  ng that.    ** p
13c50 32 20 69 73 20 61 6e 20 69 6e 73 74 72 75 63 74  2 is an instruct
13c60 69 6f 6e 20 61 64 64 72 65 73 73 2c 20 73 65 74  ion address, set
13c70 20 76 61 72 69 61 62 6c 65 20 70 32 6f 70 20 74   variable p2op t
13c80 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
13c90 68 61 74 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72  hat.    ** instr
13ca0 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 69  uction in the ai
13cb0 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79 2e 20  Indent[] array. 
13cc0 70 32 20 61 6e 64 20 70 32 6f 70 20 6d 61 79 20  p2 and p2op may 
13cd0 62 65 20 64 69 66 66 65 72 65 6e 74 20 69 66 0a  be different if.
13ce0 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
13cf0 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  nt instruction i
13d00 73 20 70 61 72 74 20 6f 66 20 61 20 73 75 62 2d  s part of a sub-
13d10 70 72 6f 67 72 61 6d 20 67 65 6e 65 72 61 74 65  program generate
13d20 64 20 62 79 20 61 6e 0a 20 20 20 20 2a 2a 20 53  d by an.    ** S
13d30 51 4c 20 74 72 69 67 67 65 72 20 6f 72 20 66 6f  QL trigger or fo
13d40 72 65 69 67 6e 20 6b 65 79 2e 20 20 2a 2f 0a 20  reign key.  */. 
13d50 20 20 20 69 6e 74 20 70 32 20 3d 20 73 71 6c 69     int p2 = sqli
13d60 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
13d70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20 69 6e 74  Sql, 3);.    int
13d80 20 70 32 6f 70 20 3d 20 28 70 32 20 2b 20 28 69   p2op = (p2 + (i
13d90 4f 70 2d 69 41 64 64 72 29 29 3b 0a 0a 20 20 20  Op-iAddr));..   
13da0 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 70 2d 3e   /* Grow the p->
13db0 61 69 49 6e 64 65 6e 74 20 61 72 72 61 79 20 61  aiIndent array a
13dc0 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
13dd0 20 20 69 66 28 20 69 4f 70 3e 3d 6e 41 6c 6c 6f    if( iOp>=nAllo
13de0 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  c ){.      if( i
13df0 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Op==0 ){.       
13e00 20 2f 2a 20 44 6f 20 66 75 72 74 68 65 72 20 76   /* Do further v
13e10 65 72 66 69 63 61 74 69 6f 6e 20 74 68 61 74 20  erfication that 
13e20 74 68 69 73 20 69 73 20 65 78 70 6c 61 69 6e 20  this is explain 
13e30 6f 75 74 70 75 74 2e 20 20 41 62 6f 72 74 20 69  output.  Abort i
13e40 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  f.        ** it 
13e50 69 73 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20  is not */.      
13e60 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
13e70 68 61 72 20 2a 65 78 70 6c 61 69 6e 43 6f 6c 73  har *explainCols
13e80 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
13e90 20 20 22 61 64 64 72 22 2c 20 22 6f 70 63 6f 64    "addr", "opcod
13ea0 65 22 2c 20 22 70 31 22 2c 20 22 70 32 22 2c 20  e", "p1", "p2", 
13eb0 22 70 33 22 2c 20 22 70 34 22 2c 20 22 70 35 22  "p3", "p4", "p5"
13ec0 2c 20 22 63 6f 6d 6d 65 6e 74 22 20 7d 3b 0a 20  , "comment" };. 
13ed0 20 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20         int jj;. 
13ee0 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b         for(jj=0;
13ef0 20 6a 6a 3c 41 72 72 61 79 53 69 7a 65 28 65 78   jj<ArraySize(ex
13f00 70 6c 61 69 6e 43 6f 6c 73 29 3b 20 6a 6a 2b 2b  plainCols); jj++
13f10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
13f20 20 73 74 72 63 6d 70 28 73 71 6c 69 74 65 33 5f   strcmp(sqlite3_
13f30 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 71 6c  column_name(pSql
13f40 2c 6a 6a 29 2c 65 78 70 6c 61 69 6e 43 6f 6c 73  ,jj),explainCols
13f50 5b 6a 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20  [jj])!=0 ){.    
13f60 20 20 20 20 20 20 20 20 70 2d 3e 63 4d 6f 64 65          p->cMode
13f70 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20   = p->mode;.    
13f80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13f90 72 65 73 65 74 28 70 53 71 6c 29 3b 0a 20 20 20  reset(pSql);.   
13fa0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
13fb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
13fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13fd0 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31       nAlloc += 1
13fe0 30 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 69 49  00;.      p->aiI
13ff0 6e 64 65 6e 74 20 3d 20 28 69 6e 74 2a 29 73 71  ndent = (int*)sq
14000 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
14010 70 2d 3e 61 69 49 6e 64 65 6e 74 2c 20 6e 41 6c  p->aiIndent, nAl
14020 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29  loc*sizeof(int))
14030 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  ;.      if( p->a
14040 69 49 6e 64 65 6e 74 3d 3d 30 20 29 20 73 68 65  iIndent==0 ) she
14050 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79  ll_out_of_memory
14060 28 29 3b 0a 20 20 20 20 20 20 61 62 59 69 65 6c  ();.      abYiel
14070 64 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65  d = (int*)sqlite
14080 33 5f 72 65 61 6c 6c 6f 63 36 34 28 61 62 59 69  3_realloc64(abYi
14090 65 6c 64 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65  eld, nAlloc*size
140a0 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20  of(int));.      
140b0 69 66 28 20 61 62 59 69 65 6c 64 3d 3d 30 20 29  if( abYield==0 )
140c0 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65   shell_out_of_me
140d0 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20  mory();.    }.  
140e0 20 20 61 62 59 69 65 6c 64 5b 69 4f 70 5d 20 3d    abYield[iOp] =
140f0 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f   str_in_array(zO
14100 70 2c 20 61 7a 59 69 65 6c 64 29 3b 0a 20 20 20  p, azYield);.   
14110 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 4f 70   p->aiIndent[iOp
14120 5d 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 49  ] = 0;.    p->nI
14130 6e 64 65 6e 74 20 3d 20 69 4f 70 2b 31 3b 0a 0a  ndent = iOp+1;..
14140 20 20 20 20 69 66 28 20 73 74 72 5f 69 6e 5f 61      if( str_in_a
14150 72 72 61 79 28 7a 4f 70 2c 20 61 7a 4e 65 78 74  rray(zOp, azNext
14160 29 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ) ){.      for(i
14170 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b  =p2op; i<iOp; i+
14180 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69  +) p->aiIndent[i
14190 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  ] += 2;.    }.  
141a0 20 20 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72    if( str_in_arr
141b0 61 79 28 7a 4f 70 2c 20 61 7a 47 6f 74 6f 29 20  ay(zOp, azGoto) 
141c0 26 26 20 70 32 6f 70 3c 70 2d 3e 6e 49 6e 64 65  && p2op<p->nInde
141d0 6e 74 0a 20 20 20 20 20 26 26 20 28 61 62 59 69  nt.     && (abYi
141e0 65 6c 64 5b 70 32 6f 70 5d 20 7c 7c 20 73 71 6c  eld[p2op] || sql
141f0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
14200 70 53 71 6c 2c 20 32 29 29 0a 20 20 20 20 29 7b  pSql, 2)).    ){
14210 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 32 6f  .      for(i=p2o
14220 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70  p; i<iOp; i++) p
14230 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d  ->aiIndent[i] +=
14240 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   2;.    }.  }.. 
14250 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b   p->iIndent = 0;
14260 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
14270 61 62 59 69 65 6c 64 29 3b 0a 20 20 73 71 6c 69  abYield);.  sqli
14280 74 65 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b  te3_reset(pSql);
14290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
142a0 68 65 20 61 72 72 61 79 20 61 6c 6c 6f 63 61 74  he array allocat
142b0 65 64 20 62 79 20 65 78 70 6c 61 69 6e 5f 64 61  ed by explain_da
142c0 74 61 5f 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f  ta_prepare()..*/
142d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
142e0 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65  lain_data_delete
142f0 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
14300 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
14310 70 2d 3e 61 69 49 6e 64 65 6e 74 29 3b 0a 20 20  p->aiIndent);.  
14320 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d 20 30 3b  p->aiIndent = 0;
14330 0a 20 20 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20  .  p->nIndent = 
14340 30 3b 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20  0;.  p->iIndent 
14350 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  = 0;.}../*.** Di
14360 73 61 62 6c 65 20 61 6e 64 20 72 65 73 74 6f 72  sable and restor
14370 65 20 2e 77 68 65 72 65 74 72 61 63 65 20 61 6e  e .wheretrace an
14380 64 20 2e 73 65 6c 65 63 74 74 72 61 63 65 20 73  d .selecttrace s
14390 65 74 74 69 6e 67 73 2e 0a 2a 2f 0a 23 69 66 20  ettings..*/.#if 
143a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
143b0 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64  EBUG) && defined
143c0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
143d0 45 4c 45 43 54 54 52 41 43 45 29 0a 65 78 74 65  ELECTTRACE).exte
143e0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 53 65  rn int sqlite3Se
143f0 6c 65 63 74 54 72 61 63 65 3b 0a 73 74 61 74 69  lectTrace;.stati
14400 63 20 69 6e 74 20 73 61 76 65 64 53 65 6c 65 63  c int savedSelec
14410 74 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23  tTrace;.#endif.#
14420 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
14430 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
14440 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
14450 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a 65 78  E_WHERETRACE).ex
14460 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
14470 57 68 65 72 65 54 72 61 63 65 3b 0a 73 74 61 74  WhereTrace;.stat
14480 69 63 20 69 6e 74 20 73 61 76 65 64 57 68 65 72  ic int savedWher
14490 65 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 73  eTrace;.#endif.s
144a0 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62  tatic void disab
144b0 6c 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d  le_debug_trace_m
144c0 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23 69 66 20  odes(void){.#if 
144d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
144e0 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64  EBUG) && defined
144f0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
14500 45 4c 45 43 54 54 52 41 43 45 29 0a 20 20 73 61  ELECTTRACE).  sa
14510 76 65 64 53 65 6c 65 63 74 54 72 61 63 65 20 3d  vedSelectTrace =
14520 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
14530 61 63 65 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ace;.  sqlite3Se
14540 6c 65 63 74 54 72 61 63 65 20 3d 20 30 3b 0a 23  lectTrace = 0;.#
14550 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
14560 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
14570 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
14580 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52  E_ENABLE_WHERETR
14590 41 43 45 29 0a 20 20 73 61 76 65 64 57 68 65 72  ACE).  savedWher
145a0 65 54 72 61 63 65 20 3d 20 73 71 6c 69 74 65 33  eTrace = sqlite3
145b0 57 68 65 72 65 54 72 61 63 65 3b 0a 20 20 73 71  WhereTrace;.  sq
145c0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
145d0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 73 74  = 0;.#endif.}.st
145e0 61 74 69 63 20 76 6f 69 64 20 72 65 73 74 6f 72  atic void restor
145f0 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f  e_debug_trace_mo
14600 64 65 73 28 76 6f 69 64 29 7b 0a 23 69 66 20 64  des(void){.#if d
14610 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
14620 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
14630 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
14640 4c 45 43 54 54 52 41 43 45 29 0a 20 20 73 71 6c  LECTTRACE).  sql
14650 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
14660 3d 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61  = savedSelectTra
14670 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ce;.#endif.#if d
14680 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
14690 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
146a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48  SQLITE_ENABLE_WH
146b0 45 52 45 54 52 41 43 45 29 0a 20 20 73 71 6c 69  ERETRACE).  sqli
146c0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
146d0 73 61 76 65 64 57 68 65 72 65 54 72 61 63 65 3b  savedWhereTrace;
146e0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
146f0 20 52 75 6e 20 61 20 70 72 65 70 61 72 65 64 20   Run a prepared 
14700 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 73 74 61  statement.*/.sta
14710 74 69 63 20 76 6f 69 64 20 65 78 65 63 5f 70 72  tic void exec_pr
14720 65 70 61 72 65 64 5f 73 74 6d 74 28 0a 20 20 53  epared_stmt(.  S
14730 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c  hellState *pArg,
14740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14760 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68  /* Pointer to Sh
14770 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 73 71  ellState */.  sq
14780 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
14790 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
147a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
147b0 2a 20 53 74 61 74 6d 65 6e 74 20 74 6f 20 72 75  * Statment to ru
147c0 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  n */.){.  int rc
147d0 3b 0a 0a 20 20 2f 2a 20 70 65 72 66 6f 72 6d 20  ;..  /* perform 
147e0 74 68 65 20 66 69 72 73 74 20 73 74 65 70 2e 20  the first step. 
147f0 20 74 68 69 73 20 77 69 6c 6c 20 74 65 6c 6c 20   this will tell 
14800 75 73 20 69 66 20 77 65 0a 20 20 2a 2a 20 68 61  us if we.  ** ha
14810 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 20  ve a result set 
14820 6f 72 20 6e 6f 74 20 61 6e 64 20 68 6f 77 20 77  or not and how w
14830 69 64 65 20 69 74 20 69 73 2e 0a 20 20 2a 2f 0a  ide it is..  */.
14840 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
14850 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a  tep(pStmt);.  /*
14860 20 69 66 20 77 65 20 68 61 76 65 20 61 20 72 65   if we have a re
14870 73 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f 0a 20  sult set... */. 
14880 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20   if( SQLITE_ROW 
14890 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 2f 2a 20  == rc ){.    /* 
148a0 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
148b0 6f 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74 72 2c  or col name ptr,
148c0 20 76 61 6c 75 65 20 70 74 72 2c 20 61 6e 64 20   value ptr, and 
148d0 74 79 70 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  type */.    int 
148e0 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
148f0 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
14900 74 29 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44  t);.    void *pD
14910 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ata = sqlite3_ma
14920 6c 6c 6f 63 36 34 28 33 2a 6e 43 6f 6c 2a 73 69  lloc64(3*nCol*si
14930 7a 65 6f 66 28 63 6f 6e 73 74 20 63 68 61 72 2a  zeof(const char*
14940 29 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ) + 1);.    if( 
14950 21 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  !pData ){.      
14960 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
14970 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
14980 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c      char **azCol
14990 73 20 3d 20 28 63 68 61 72 20 2a 2a 29 70 44 61  s = (char **)pDa
149a0 74 61 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ta;      /* Name
149b0 73 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  s of result colu
149c0 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  mns */.      cha
149d0 72 20 2a 2a 61 7a 56 61 6c 73 20 3d 20 26 61 7a  r **azVals = &az
149e0 43 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20 20 20  Cols[nCol];     
149f0 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a 2f 0a    /* Results */.
14a00 20 20 20 20 20 20 69 6e 74 20 2a 61 69 54 79 70        int *aiTyp
14a10 65 73 20 3d 20 28 69 6e 74 20 2a 29 26 61 7a 56  es = (int *)&azV
14a20 61 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20 52 65  als[nCol]; /* Re
14a30 73 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a 20 20  sult types */.  
14a40 20 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20      int i, x;.  
14a50 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f      assert(sizeo
14a60 66 28 69 6e 74 29 20 3c 3d 20 73 69 7a 65 6f 66  f(int) <= sizeof
14a70 28 63 68 61 72 20 2a 29 29 3b 0a 20 20 20 20 20  (char *));.     
14a80 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 70 74 72   /* save off ptr
14a90 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s to column name
14aa0 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69  s */.      for(i
14ab0 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
14ac0 7b 0a 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 73  {.        azCols
14ad0 5b 69 5d 20 3d 20 28 63 68 61 72 20 2a 29 73 71  [i] = (char *)sq
14ae0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
14af0 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  e(pStmt, i);.   
14b00 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 7b 0a 20     }.      do{. 
14b10 20 20 20 20 20 20 20 2f 2a 20 65 78 74 72 61 63         /* extrac
14b20 74 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 64  t the data and d
14b30 61 74 61 20 74 79 70 65 73 20 2a 2f 0a 20 20 20  ata types */.   
14b40 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
14b50 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
14b60 20 20 20 20 20 20 61 69 54 79 70 65 73 5b 69 5d        aiTypes[i]
14b70 20 3d 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 63   = x = sqlite3_c
14b80 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74  olumn_type(pStmt
14b90 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
14ba0 69 66 28 20 78 3d 3d 53 51 4c 49 54 45 5f 42 4c  if( x==SQLITE_BL
14bb0 4f 42 20 26 26 20 70 41 72 67 20 26 26 20 70 41  OB && pArg && pA
14bc0 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f  rg->cMode==MODE_
14bd0 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 20 20  Insert ){.      
14be0 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20        azVals[i] 
14bf0 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20  = "";.          
14c00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
14c10 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 28     azVals[i] = (
14c20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
14c30 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
14c40 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   i);.          }
14c50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
14c60 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28 61 69  azVals[i] && (ai
14c70 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49 54 45  Types[i]!=SQLITE
14c80 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  _NULL) ){.      
14c90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14ca0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
14cb0 20 20 20 20 20 62 72 65 61 6b 3b 20 2f 2a 20 66       break; /* f
14cc0 72 6f 6d 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20  rom for */.     
14cd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
14ce0 20 2f 2a 20 65 6e 64 20 66 6f 72 20 2a 2f 0a 0a   /* end for */..
14cf0 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 64 61          /* if da
14d00 74 61 20 61 6e 64 20 74 79 70 65 73 20 65 78 74  ta and types ext
14d10 72 61 63 74 65 64 20 73 75 63 63 65 73 73 66 75  racted successfu
14d20 6c 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  lly... */.      
14d30 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
14d40 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 20 20   == rc ){.      
14d50 20 20 20 20 2f 2a 20 63 61 6c 6c 20 74 68 65 20      /* call the 
14d60 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63  supplied callbac
14d70 6b 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c  k with the resul
14d80 74 20 72 6f 77 20 64 61 74 61 20 2a 2f 0a 20 20  t row data */.  
14d90 20 20 20 20 20 20 20 20 69 66 28 20 73 68 65 6c          if( shel
14da0 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c  l_callback(pArg,
14db0 20 6e 43 6f 6c 2c 20 61 7a 56 61 6c 73 2c 20 61   nCol, azVals, a
14dc0 7a 43 6f 6c 73 2c 20 61 69 54 79 70 65 73 29 20  zCols, aiTypes) 
14dd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
14de0 63 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  c = SQLITE_ABORT
14df0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
14e00 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
14e10 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
14e20 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
14e30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
14e40 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 53 51       } while( SQ
14e50 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29  LITE_ROW == rc )
14e60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
14e70 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20 20  free(pData);.   
14e80 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
14e90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
14ea0 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
14eb0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
14ec0 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
14ed0 65 73 73 20 53 51 4c 20 69 66 20 74 68 65 20 70  ess SQL if the p
14ee0 72 65 76 69 6f 75 73 20 73 68 65 6c 6c 20 63 6f  revious shell co
14ef0 6d 6d 61 6e 64 0a 2a 2a 20 77 61 73 20 22 2e 65  mmand.** was ".e
14f00 78 70 65 72 74 22 2e 20 49 74 20 70 61 73 73 65  xpert". It passe
14f10 73 20 74 68 65 20 53 51 4c 20 69 6e 20 74 68 65  s the SQL in the
14f20 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
14f30 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20   directly to.** 
14f40 74 68 65 20 73 71 6c 69 74 65 33 65 78 70 65 72  the sqlite3exper
14f50 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  t object..**.** 
14f60 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
14f70 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
14f80 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
14f90 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
14fa0 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74 68 69  .** code. In thi
14fb0 73 20 63 61 73 65 2c 20 28 2a 70 7a 45 72 72 29  s case, (*pzErr)
14fc0 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70   may be set to p
14fd0 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
14fe0 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61   containing.** a
14ff0 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  n English langua
15000 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ge error message
15010 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
15020 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
15030 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65  e.** caller to e
15040 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74  ventually free t
15050 68 69 73 20 62 75 66 66 65 72 20 75 73 69 6e 67  his buffer using
15060 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
15070 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
15080 78 70 65 72 74 48 61 6e 64 6c 65 53 51 4c 28 0a  xpertHandleSQL(.
15090 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
150a0 74 61 74 65 2c 20 0a 20 20 63 6f 6e 73 74 20 63  tate, .  const c
150b0 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 63 68  har *zSql, .  ch
150c0 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
150d0 61 73 73 65 72 74 28 20 70 53 74 61 74 65 2d 3e  assert( pState->
150e0 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 29  expert.pExpert )
150f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a 45 72  ;.  assert( pzEr
15100 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d  r==0 || *pzErr==
15110 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
15120 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 73 71 6c  lite3_expert_sql
15130 28 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e  (pState->expert.
15140 70 45 78 70 65 72 74 2c 20 7a 53 71 6c 2c 20 70  pExpert, zSql, p
15150 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zErr);.}../*.** 
15160 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
15170 20 63 61 6c 6c 65 64 20 65 69 74 68 65 72 20 74   called either t
15180 6f 20 73 69 6c 65 6e 74 6c 79 20 63 6c 65 61 6e  o silently clean
15190 20 75 70 20 74 68 65 20 6f 62 6a 65 63 74 0a 2a   up the object.*
151a0 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  * created by the
151b0 20 22 2e 65 78 70 65 72 74 22 20 63 6f 6d 6d 61   ".expert" comma
151c0 6e 64 20 28 69 66 20 62 43 61 6e 63 65 6c 3d 3d  nd (if bCancel==
151d0 31 29 2c 20 6f 72 20 74 6f 20 67 65 6e 65 72 61  1), or to genera
151e0 74 65 20 61 20 0a 2a 2a 20 72 65 70 6f 72 74 20  te a .** report 
151f0 66 72 6f 6d 20 69 74 20 61 6e 64 20 74 68 65 6e  from it and then
15200 20 63 6c 65 61 6e 20 69 74 20 75 70 20 28 69 66   clean it up (if
15210 20 62 43 61 6e 63 65 6c 3d 3d 30 29 2e 0a 2a 2a   bCancel==0)..**
15220 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
15230 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
15240 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
15250 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
15260 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e  rror.** code. In
15270 20 74 68 69 73 20 63 61 73 65 2c 20 28 2a 70 7a   this case, (*pz
15280 45 72 72 29 20 6d 61 79 20 62 65 20 73 65 74 20  Err) may be set 
15290 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
152a0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ffer containing.
152b0 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61  ** an English la
152c0 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d 65 73  nguage error mes
152d0 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20  sage. It is the 
152e0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
152f0 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
15300 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
15310 65 65 20 74 68 69 73 20 62 75 66 66 65 72 20 75  ee this buffer u
15320 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  sing sqlite3_fre
15330 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
15340 6e 74 20 65 78 70 65 72 74 46 69 6e 69 73 68 28  nt expertFinish(
15350 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
15360 53 74 61 74 65 2c 0a 20 20 69 6e 74 20 62 43 61  State,.  int bCa
15370 6e 63 65 6c 2c 0a 20 20 63 68 61 72 20 2a 2a 70  ncel,.  char **p
15380 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63  zErr.){.  int rc
15390 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
153a0 73 71 6c 69 74 65 33 65 78 70 65 72 74 20 2a 70  sqlite3expert *p
153b0 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72   = pState->exper
153c0 74 2e 70 45 78 70 65 72 74 3b 0a 20 20 61 73 73  t.pExpert;.  ass
153d0 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65  ert( p );.  asse
153e0 72 74 28 20 62 43 61 6e 63 65 6c 20 7c 7c 20 70  rt( bCancel || p
153f0 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72  zErr==0 || *pzEr
15400 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 62 43  r==0 );.  if( bC
15410 61 6e 63 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ancel==0 ){.    
15420 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53 74 61  FILE *out = pSta
15430 74 65 2d 3e 6f 75 74 3b 0a 20 20 20 20 69 6e 74  te->out;.    int
15440 20 62 56 65 72 62 6f 73 65 20 3d 20 70 53 74 61   bVerbose = pSta
15450 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62  te->expert.bVerb
15460 6f 73 65 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  ose;..    rc = s
15470 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 61 6e  qlite3_expert_an
15480 61 6c 79 7a 65 28 70 2c 20 70 7a 45 72 72 29 3b  alyze(p, pzErr);
15490 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
154a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
154b0 69 6e 74 20 6e 51 75 65 72 79 20 3d 20 73 71 6c  int nQuery = sql
154c0 69 74 65 33 5f 65 78 70 65 72 74 5f 63 6f 75 6e  ite3_expert_coun
154d0 74 28 70 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  t(p);.      int 
154e0 69 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 62 56  i;..      if( bV
154f0 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
15500 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
15510 61 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  and = sqlite3_ex
15520 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 30 2c  pert_report(p,0,
15530 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 43 41  EXPERT_REPORT_CA
15540 4e 44 49 44 41 54 45 53 29 3b 0a 20 20 20 20 20  NDIDATES);.     
15550 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
15560 74 2c 20 22 2d 2d 20 43 61 6e 64 69 64 61 74 65  t, "-- Candidate
15570 73 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s --------------
15580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c  ---------------\
15590 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77  n");.        raw
155a0 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
155b0 5c 6e 22 2c 20 7a 43 61 6e 64 29 3b 0a 20 20 20  \n", zCand);.   
155c0 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
155d0 3d 30 3b 20 69 3c 6e 51 75 65 72 79 3b 20 69 2b  =0; i<nQuery; i+
155e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
155f0 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73  t char *zSql = s
15600 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65  qlite3_expert_re
15610 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45 52  port(p, i, EXPER
15620 54 5f 52 45 50 4f 52 54 5f 53 51 4c 29 3b 0a 20  T_REPORT_SQL);. 
15630 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
15640 72 20 2a 7a 49 64 78 20 3d 20 73 71 6c 69 74 65  r *zIdx = sqlite
15650 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28  3_expert_report(
15660 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50  p, i, EXPERT_REP
15670 4f 52 54 5f 49 4e 44 45 58 45 53 29 3b 0a 20 20  ORT_INDEXES);.  
15680 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
15690 20 2a 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33   *zEQP = sqlite3
156a0 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70  _expert_report(p
156b0 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f  , i, EXPERT_REPO
156c0 52 54 5f 50 4c 41 4e 29 3b 0a 20 20 20 20 20 20  RT_PLAN);.      
156d0 20 20 69 66 28 20 7a 49 64 78 3d 3d 30 20 29 20    if( zIdx==0 ) 
156e0 7a 49 64 78 20 3d 20 22 28 6e 6f 20 6e 65 77 20  zIdx = "(no new 
156f0 69 6e 64 65 78 65 73 29 5c 6e 22 3b 0a 20 20 20  indexes)\n";.   
15700 20 20 20 20 20 69 66 28 20 62 56 65 72 62 6f 73       if( bVerbos
15710 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
15720 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
15730 2d 2d 20 51 75 65 72 79 20 25 64 20 2d 2d 2d 2d  -- Query %d ----
15740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c  ------------\n",
15760 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  i+1);.          
15770 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
15780 22 25 73 5c 6e 5c 6e 22 2c 20 7a 53 71 6c 29 3b  "%s\n\n", zSql);
15790 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
157a0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
157b0 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 64 78 29  t, "%s\n", zIdx)
157c0 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  ;.        raw_pr
157d0 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22  intf(out, "%s\n"
157e0 2c 20 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 7d  , zEQP);.      }
157f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
15800 69 74 65 33 5f 65 78 70 65 72 74 5f 64 65 73 74  ite3_expert_dest
15810 72 6f 79 28 70 29 3b 0a 20 20 70 53 74 61 74 65  roy(p);.  pState
15820 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
15830 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
15840 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
15850 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e  ementation of ".
15860 65 78 70 65 72 74 22 20 64 6f 74 20 63 6f 6d 6d  expert" dot comm
15870 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  and..*/.static i
15880 6e 74 20 65 78 70 65 72 74 44 6f 74 43 6f 6d 6d  nt expertDotComm
15890 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  and(.  ShellStat
158a0 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20  e *pState,      
158b0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
158c0 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61  t shell tool sta
158d0 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  te */.  char **a
158e0 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  zArg,           
158f0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
15900 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61   of arguments pa
15910 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d  ssed to dot comm
15920 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  and */.  int nAr
15930 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
15940 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
15950 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
15960 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20   azArg[] */.){. 
15970 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
15980 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  _OK;.  char *zEr
15990 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  r = 0;.  int i;.
159a0 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 20 3d 20    int iSample = 
159b0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  0;..  assert( pS
159c0 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
159d0 70 65 72 74 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d  pert==0 );.  mem
159e0 73 65 74 28 26 70 53 74 61 74 65 2d 3e 65 78 70  set(&pState->exp
159f0 65 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  ert, 0, sizeof(E
15a00 78 70 65 72 74 49 6e 66 6f 29 29 3b 0a 0a 20 20  xpertInfo));..  
15a10 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c  for(i=1; rc==SQL
15a20 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41 72 67  ITE_OK && i<nArg
15a30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
15a40 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a   *z = azArg[i];.
15a50 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69      int n;.    i
15a60 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20  f( z[0]=='-' && 
15a70 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[1]=='-' ) z++;
15a80 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33  .    n = strlen3
15a90 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e  0(z);.    if( n>
15aa0 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70  =2 && 0==strncmp
15ab0 28 7a 2c 20 22 2d 76 65 72 62 6f 73 65 22 2c 20  (z, "-verbose", 
15ac0 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 53 74 61  n) ){.      pSta
15ad0 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62  te->expert.bVerb
15ae0 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ose = 1;.    }. 
15af0 20 20 20 65 6c 73 65 20 69 66 28 20 6e 3e 3d 32     else if( n>=2
15b00 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28 7a   && 0==strncmp(z
15b10 2c 20 22 2d 73 61 6d 70 6c 65 22 2c 20 6e 29 20  , "-sample", n) 
15b20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  ){.      if( i==
15b30 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20  (nArg-1) ){.    
15b40 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
15b50 74 64 65 72 72 2c 20 22 6f 70 74 69 6f 6e 20 72  tderr, "option r
15b60 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d  equires an argum
15b70 65 6e 74 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  ent: %s\n", z);.
15b80 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
15b90 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
15ba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15bb0 69 53 61 6d 70 6c 65 20 3d 20 28 69 6e 74 29 69  iSample = (int)i
15bc0 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72  ntegerValue(azAr
15bd0 67 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20 20  g[++i]);.       
15be0 20 69 66 28 20 69 53 61 6d 70 6c 65 3c 30 20 7c   if( iSample<0 |
15bf0 7c 20 69 53 61 6d 70 6c 65 3e 31 30 30 20 29 7b  | iSample>100 ){
15c00 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
15c10 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 76  rintf(stderr, "v
15c20 61 6c 75 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  alue out of rang
15c30 65 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b  e: %s\n", azArg[
15c40 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  i]);.          r
15c50 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
15c60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15c70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c    }.    }.    el
15c80 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
15c90 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e  intf(stderr, "un
15ca0 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73  known option: %s
15cb0 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72  \n", z);.      r
15cc0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
15cd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
15ce0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15cf0 20 29 7b 0a 20 20 20 20 70 53 74 61 74 65 2d 3e   ){.    pState->
15d00 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 3d  expert.pExpert =
15d10 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
15d20 6e 65 77 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  new(pState->db, 
15d30 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  &zErr);.    if( 
15d40 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
15d50 45 78 70 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20  Expert==0 ){.   
15d60 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
15d70 64 65 72 72 2c 20 22 73 71 6c 69 74 65 33 5f 65  derr, "sqlite3_e
15d80 78 70 65 72 74 5f 6e 65 77 3a 20 25 73 5c 6e 22  xpert_new: %s\n"
15d90 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 72  , zErr);.      r
15da0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
15db0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15dc0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72     sqlite3_exper
15dd0 74 5f 63 6f 6e 66 69 67 28 0a 20 20 20 20 20 20  t_config(.      
15de0 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65      pState->expe
15df0 72 74 2e 70 45 78 70 65 72 74 2c 20 45 58 50 45  rt.pExpert, EXPE
15e00 52 54 5f 43 4f 4e 46 49 47 5f 53 41 4d 50 4c 45  RT_CONFIG_SAMPLE
15e10 2c 20 69 53 61 6d 70 6c 65 0a 20 20 20 20 20 20  , iSample.      
15e20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
15e30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
15e40 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  dif /* ifndef SQ
15e50 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
15e60 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LTABLE */../*.**
15e70 20 45 78 65 63 75 74 65 20 61 20 73 74 61 74 65   Execute a state
15e80 6d 65 6e 74 20 6f 72 20 73 65 74 20 6f 66 20 73  ment or set of s
15e90 74 61 74 65 6d 65 6e 74 73 2e 20 20 50 72 69 6e  tatements.  Prin
15ea0 74 0a 2a 2a 20 61 6e 79 20 72 65 73 75 6c 74 20  t.** any result 
15eb0 72 6f 77 73 2f 63 6f 6c 75 6d 6e 73 20 64 65 70  rows/columns dep
15ec0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 63 75  ending on the cu
15ed0 72 72 65 6e 74 20 6d 6f 64 65 0a 2a 2a 20 73 65  rrent mode.** se
15ee0 74 20 76 69 61 20 74 68 65 20 73 75 70 70 6c 69  t via the suppli
15ef0 65 64 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  ed callback..**.
15f00 2a 2a 20 54 68 69 73 20 69 73 20 76 65 72 79 20  ** This is very 
15f10 73 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c 69 74  similar to SQLit
15f20 65 27 73 20 62 75 69 6c 74 2d 69 6e 20 73 71 6c  e's built-in sql
15f30 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66  ite3_exec().** f
15f40 75 6e 63 74 69 6f 6e 20 65 78 63 65 70 74 20 69  unction except i
15f50 74 20 74 61 6b 65 73 20 61 20 73 6c 69 67 68 74  t takes a slight
15f60 6c 79 20 64 69 66 66 65 72 65 6e 74 20 63 61 6c  ly different cal
15f70 6c 62 61 63 6b 0a 2a 2a 20 61 6e 64 20 63 61 6c  lback.** and cal
15f80 6c 62 61 63 6b 20 64 61 74 61 20 61 72 67 75 6d  lback data argum
15f90 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
15fa0 6e 74 20 73 68 65 6c 6c 5f 65 78 65 63 28 0a 20  nt shell_exec(. 
15fb0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72   ShellState *pAr
15fc0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
15fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
15fe0 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74  inter to ShellSt
15ff0 61 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ate */.  const c
16000 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20  har *zSql,      
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16020 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20     /* SQL to be 
16030 65 76 61 6c 75 61 74 65 64 20 2a 2f 0a 20 20 63  evaluated */.  c
16040 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20  har **pzErrMsg  
16050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16060 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
16070 72 20 6d 73 67 20 77 72 69 74 74 65 6e 20 68 65  r msg written he
16080 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  re */.){.  sqlit
16090 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
160a0 20 4e 55 4c 4c 3b 20 20 20 20 20 2f 2a 20 53 74   NULL;     /* St
160b0 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75  atement to execu
160c0 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  te. */.  int rc 
160d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
160e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
160f0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
16100 20 72 63 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68   rc2;.  const ch
16110 61 72 20 2a 7a 4c 65 66 74 6f 76 65 72 3b 20 20  ar *zLeftover;  
16120 20 20 20 20 20 20 20 20 2f 2a 20 54 61 69 6c 20          /* Tail 
16130 6f 66 20 75 6e 70 72 6f 63 65 73 73 65 64 20 53  of unprocessed S
16140 51 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  QL */.  sqlite3 
16150 2a 64 62 20 3d 20 70 41 72 67 2d 3e 64 62 3b 0a  *db = pArg->db;.
16160 0a 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20  .  if( pzErrMsg 
16170 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67  ){.    *pzErrMsg
16180 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 23 69   = NULL;.  }..#i
16190 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
161a0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
161b0 20 69 66 28 20 70 41 72 67 2d 3e 65 78 70 65 72   if( pArg->exper
161c0 74 2e 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20  t.pExpert ){.   
161d0 20 72 63 20 3d 20 65 78 70 65 72 74 48 61 6e 64   rc = expertHand
161e0 6c 65 53 51 4c 28 70 41 72 67 2c 20 7a 53 71 6c  leSQL(pArg, zSql
161f0 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , pzErrMsg);.   
16200 20 72 65 74 75 72 6e 20 65 78 70 65 72 74 46 69   return expertFi
16210 6e 69 73 68 28 70 41 72 67 2c 20 28 72 63 21 3d  nish(pArg, (rc!=
16220 53 51 4c 49 54 45 5f 4f 4b 29 2c 20 70 7a 45 72  SQLITE_OK), pzEr
16230 72 4d 73 67 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rMsg);.  }.#endi
16240 66 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c  f..  while( zSql
16250 5b 30 5d 20 26 26 20 28 53 51 4c 49 54 45 5f 4f  [0] && (SQLITE_O
16260 4b 20 3d 3d 20 72 63 29 20 29 7b 0a 20 20 20 20  K == rc) ){.    
16270 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
16280 72 20 2a 7a 53 74 6d 74 53 71 6c 3b 0a 20 20 20  r *zStmtSql;.   
16290 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
162a0 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
162b0 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26  l, -1, &pStmt, &
162c0 7a 4c 65 66 74 6f 76 65 72 29 3b 0a 20 20 20 20  zLeftover);.    
162d0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 20 21 3d  if( SQLITE_OK !=
162e0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28   rc ){.      if(
162f0 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20   pzErrMsg ){.   
16300 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
16310 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62   save_err_msg(db
16320 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
16330 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
16340 21 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  !pStmt ){.      
16350 20 20 2f 2a 20 74 68 69 73 20 68 61 70 70 65 6e    /* this happen
16360 73 20 66 6f 72 20 61 20 63 6f 6d 6d 65 6e 74 20  s for a comment 
16370 6f 72 20 77 68 69 74 65 2d 73 70 61 63 65 20 2a  or white-space *
16380 2f 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d  /.        zSql =
16390 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20   zLeftover;.    
163a0 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
163b0 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53  ce(zSql[0]) ) zS
163c0 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f  ql++;.        co
163d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
163e0 20 20 20 20 20 20 7a 53 74 6d 74 53 71 6c 20 3d        zStmtSql =
163f0 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74   sqlite3_sql(pSt
16400 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  mt);.      if( z
16410 53 74 6d 74 53 71 6c 3d 3d 30 20 29 20 7a 53 74  StmtSql==0 ) zSt
16420 6d 74 53 71 6c 20 3d 20 22 22 3b 0a 20 20 20 20  mtSql = "";.    
16430 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
16440 28 7a 53 74 6d 74 53 71 6c 5b 30 5d 29 20 29 20  (zStmtSql[0]) ) 
16450 7a 53 74 6d 74 53 71 6c 2b 2b 3b 0a 0a 20 20 20  zStmtSql++;..   
16460 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 74     /* save off t
16470 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
16480 6d 65 6e 74 20 68 61 6e 64 6c 65 20 61 6e 64 20  ment handle and 
16490 72 65 73 65 74 20 72 6f 77 20 63 6f 75 6e 74 20  reset row count 
164a0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
164b0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72  g ){.        pAr
164c0 67 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74  g->pStmt = pStmt
164d0 3b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e  ;.        pArg->
164e0 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  cnt = 0;.      }
164f0 0a 0a 20 20 20 20 20 20 2f 2a 20 65 63 68 6f 20  ..      /* echo 
16500 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e  the sql statemen
16510 74 20 69 66 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a  t if echo on */.
16520 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26        if( pArg &
16530 26 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70  & ShellHasFlag(p
16540 41 72 67 2c 20 53 48 46 4c 47 5f 45 63 68 6f 29  Arg, SHFLG_Echo)
16550 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
16560 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
16570 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 74 6d 74  t, "%s\n", zStmt
16580 53 71 6c 20 3f 20 7a 53 74 6d 74 53 71 6c 20 3a  Sql ? zStmtSql :
16590 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   zSql);.      }.
165a0 0a 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 74  .      /* Show t
165b0 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  he EXPLAIN QUERY
165c0 20 50 4c 41 4e 20 69 66 20 2e 65 71 70 20 69 73   PLAN if .eqp is
165d0 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28   on */.      if(
165e0 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 61   pArg && pArg->a
165f0 75 74 6f 45 51 50 20 26 26 20 73 71 6c 69 74 65  utoEQP && sqlite
16600 33 5f 73 74 72 6c 69 6b 65 28 22 45 58 50 4c 41  3_strlike("EXPLA
16610 49 4e 25 22 2c 7a 53 74 6d 74 53 71 6c 2c 30 29  IN%",zStmtSql,0)
16620 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
16630 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78  qlite3_stmt *pEx
16640 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 63  plain;.        c
16650 68 61 72 20 2a 7a 45 51 50 3b 0a 20 20 20 20 20  har *zEQP;.     
16660 20 20 20 69 6e 74 20 74 72 69 67 67 65 72 45 51     int triggerEQ
16670 50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 64  P = 0;.        d
16680 69 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61  isable_debug_tra
16690 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20  ce_modes();.    
166a0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63      sqlite3_db_c
166b0 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45  onfig(db, SQLITE
166c0 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45  _DBCONFIG_TRIGGE
166d0 52 5f 45 51 50 2c 20 2d 31 2c 20 26 74 72 69 67  R_EQP, -1, &trig
166e0 67 65 72 45 51 50 29 3b 0a 20 20 20 20 20 20 20  gerEQP);.       
166f0 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45   if( pArg->autoE
16700 51 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67  QP>=AUTOEQP_trig
16710 67 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ger ){.         
16720 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
16730 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  ig(db, SQLITE_DB
16740 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45  CONFIG_TRIGGER_E
16750 51 50 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  QP, 1, 0);.     
16760 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 45 51     }.        zEQ
16770 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  P = sqlite3_mpri
16780 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 51 55 45  ntf("EXPLAIN QUE
16790 52 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53 74  RY PLAN %s", zSt
167a0 6d 74 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20  mtSql);.        
167b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
167c0 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50  pare_v2(db, zEQP
167d0 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c  , -1, &pExplain,
167e0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
167f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16800 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
16810 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
16820 70 45 78 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54  pExplain)==SQLIT
16830 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20  E_ROW ){.       
16840 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
16850 2a 7a 45 51 50 4c 69 6e 65 20 3d 20 28 63 6f 6e  *zEQPLine = (con
16860 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
16870 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78  _column_text(pEx
16880 70 6c 61 69 6e 2c 33 29 3b 0a 20 20 20 20 20 20  plain,3);.      
16890 20 20 20 20 20 20 69 6e 74 20 69 45 71 70 49 64        int iEqpId
168a0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
168b0 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20  n_int(pExplain, 
168c0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
168d0 69 6e 74 20 69 50 61 72 65 6e 74 49 64 20 3d 20  int iParentId = 
168e0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
168f0 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b  nt(pExplain, 1);
16900 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
16910 20 7a 45 51 50 4c 69 6e 65 5b 30 5d 3d 3d 27 2d   zEQPLine[0]=='-
16920 27 20 29 20 65 71 70 5f 72 65 6e 64 65 72 28 70  ' ) eqp_render(p
16930 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Arg);.          
16940 20 20 65 71 70 5f 61 70 70 65 6e 64 28 70 41 72    eqp_append(pAr
16950 67 2c 20 69 45 71 70 49 64 2c 20 69 50 61 72 65  g, iEqpId, iPare
16960 6e 74 49 64 2c 20 7a 45 51 50 4c 69 6e 65 29 3b  ntId, zEQPLine);
16970 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
16980 20 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65         eqp_rende
16990 72 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20  r(pArg);.       
169a0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
169b0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70  e3_finalize(pExp
169c0 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lain);.        s
169d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 51 50  qlite3_free(zEQP
169e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
169f0 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55  Arg->autoEQP>=AU
16a00 54 4f 45 51 50 5f 66 75 6c 6c 20 29 7b 0a 20 20  TOEQP_full ){.  
16a10 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20          /* Also 
16a20 64 6f 20 61 6e 20 45 58 50 4c 41 49 4e 20 66 6f  do an EXPLAIN fo
16a30 72 20 22 2e 65 71 70 20 66 75 6c 6c 22 20 6d 6f  r ".eqp full" mo
16a40 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  de */.          
16a50 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zEQP = sqlite3_m
16a60 70 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20  printf("EXPLAIN 
16a70 25 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a  %s", zStmtSql);.
16a80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
16a90 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
16aa0 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20  2(db, zEQP, -1, 
16ab0 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20  &pExplain, 0);. 
16ac0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
16ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16ae0 20 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e            pArg->
16af0 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70  cMode = MODE_Exp
16b00 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lain;.          
16b10 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70    explain_data_p
16b20 72 65 70 61 72 65 28 70 41 72 67 2c 20 70 45 78  repare(pArg, pEx
16b30 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  plain);.        
16b40 20 20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65      exec_prepare
16b50 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 45 78  d_stmt(pArg, pEx
16b60 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  plain);.        
16b70 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61      explain_data
16b80 5f 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a 20  _delete(pArg);. 
16b90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16ba0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
16bb0 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b  alize(pExplain);
16bc0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16bd0 65 33 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20  e3_free(zEQP);. 
16be0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16bf0 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45   if( pArg->autoE
16c00 51 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67  QP>=AUTOEQP_trig
16c10 67 65 72 20 26 26 20 74 72 69 67 67 65 72 45 51  ger && triggerEQ
16c20 50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  P==0 ){.        
16c30 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
16c40 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  fig(db, SQLITE_D
16c50 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f  BCONFIG_TRIGGER_
16c60 45 51 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  EQP, 0, 0);.    
16c70 20 20 20 20 20 20 2f 2a 20 52 65 70 72 65 70 61        /* Reprepa
16c80 72 65 20 70 53 74 6d 74 20 62 65 66 6f 72 65 20  re pStmt before 
16c90 72 65 61 63 74 69 76 69 6e 67 20 74 72 61 63 65  reactiving trace
16ca0 20 6d 6f 64 65 73 20 2a 2f 0a 20 20 20 20 20 20   modes */.      
16cb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
16cc0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
16cd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
16ce0 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
16cf0 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
16d00 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
16d10 28 20 70 41 72 67 20 29 20 70 41 72 67 2d 3e 70  ( pArg ) pArg->p
16d20 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
16d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16d40 72 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72  restore_debug_tr
16d50 61 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20  ace_modes();.   
16d60 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
16d70 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  pArg ){.        
16d80 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 70 41  pArg->cMode = pA
16d90 72 67 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20  rg->mode;.      
16da0 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f    if( pArg->auto
16db0 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20  Explain ){.     
16dc0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
16dd0 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
16de0 74 6d 74 29 3d 3d 38 0a 20 20 20 20 20 20 20 20  tmt)==8.        
16df0 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74     && sqlite3_st
16e00 72 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e 25 22  rlike("EXPLAIN%"
16e10 2c 20 7a 53 74 6d 74 53 71 6c 2c 30 29 3d 3d 30  , zStmtSql,0)==0
16e20 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
16e30 20 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e            pArg->
16e40 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70  cMode = MODE_Exp
16e50 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lain;.          
16e60 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
16e70 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
16e80 6f 75 6e 74 28 70 53 74 6d 74 29 3d 3d 34 0a 20  ount(pStmt)==4. 
16e90 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
16ea0 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 45 58  ite3_strlike("EX
16eb0 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
16ec0 25 22 2c 20 7a 53 74 6d 74 53 71 6c 2c 30 29 3d  %", zStmtSql,0)=
16ed0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
16ee0 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20    pArg->cMode = 
16ef0 4d 4f 44 45 5f 45 51 50 3b 0a 20 20 20 20 20 20  MODE_EQP;.      
16f00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
16f10 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
16f20 68 65 20 73 68 65 6c 6c 20 69 73 20 63 75 72 72  he shell is curr
16f30 65 6e 74 6c 79 20 69 6e 20 22 2e 65 78 70 6c 61  ently in ".expla
16f40 69 6e 22 20 6d 6f 64 65 2c 20 67 61 74 68 65 72  in" mode, gather
16f50 20 74 68 65 20 65 78 74 72 61 0a 20 20 20 20 20   the extra.     
16f60 20 20 20 2a 2a 20 64 61 74 61 20 72 65 71 75 69     ** data requi
16f70 72 65 64 20 74 6f 20 61 64 64 20 69 6e 64 65 6e  red to add inden
16f80 74 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ts to the output
16f90 2e 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20  .*/.        if( 
16fa0 70 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44  pArg->cMode==MOD
16fb0 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  E_Explain ){.   
16fc0 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64         explain_d
16fd0 61 74 61 5f 70 72 65 70 61 72 65 28 70 41 72 67  ata_prepare(pArg
16fe0 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  , pStmt);.      
16ff0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
17000 20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64     exec_prepared
17010 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 53 74 6d  _stmt(pArg, pStm
17020 74 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  t);.      explai
17030 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70 41  n_data_delete(pA
17040 72 67 29 3b 0a 20 20 20 20 20 20 65 71 70 5f 72  rg);.      eqp_r
17050 65 6e 64 65 72 28 70 41 72 67 29 3b 0a 0a 20 20  ender(pArg);..  
17060 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 75 73 61      /* print usa
17070 67 65 20 73 74 61 74 73 20 69 66 20 73 74 61 74  ge stats if stat
17080 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66  s on */.      if
17090 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
170a0 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20  statsOn ){.     
170b0 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73     display_stats
170c0 28 64 62 2c 20 70 41 72 67 2c 20 30 29 3b 0a 20  (db, pArg, 0);. 
170d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
170e0 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f 75 6e   print loop-coun
170f0 74 65 72 73 20 69 66 20 72 65 71 75 69 72 65 64  ters if required
17100 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41   */.      if( pA
17110 72 67 20 26 26 20 70 41 72 67 2d 3e 73 63 61 6e  rg && pArg->scan
17120 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20  statsOn ){.     
17130 20 20 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73     display_scans
17140 74 61 74 73 28 64 62 2c 20 70 41 72 67 29 3b 0a  tats(db, pArg);.
17150 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
17160 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 73  * Finalize the s
17170 74 61 74 65 6d 65 6e 74 20 6a 75 73 74 20 65 78  tatement just ex
17180 65 63 75 74 65 64 2e 20 49 66 20 74 68 69 73 20  ecuted. If this 
17190 66 61 69 6c 73 2c 20 73 61 76 65 20 61 0a 20 20  fails, save a.  
171a0 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
171b0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
171c0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  . Otherwise, set
171d0 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74 20 74   zSql to point t
171e0 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e  o the.      ** n
171f0 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ext statement to
17200 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20 20   execute. */.   
17210 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
17220 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
17230 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
17240 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 72  SQLITE_NOMEM ) r
17250 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 69  c = rc2;.      i
17260 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17270 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c   ){.        zSql
17280 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20   = zLeftover;.  
17290 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53        while( IsS
172a0 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20  pace(zSql[0]) ) 
172b0 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  zSql++;.      }e
172c0 6c 73 65 20 69 66 28 20 70 7a 45 72 72 4d 73 67  lse if( pzErrMsg
172d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
172e0 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72  rrMsg = save_err
172f0 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20  _msg(db);.      
17300 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c 65 61  }..      /* clea
17310 72 20 73 61 76 65 64 20 73 74 6d 74 20 68 61 6e  r saved stmt han
17320 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dle */.      if(
17330 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20   pArg ){.       
17340 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 4e   pArg->pStmt = N
17350 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ULL;.      }.   
17360 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20 77 68   }.  } /* end wh
17370 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e  ile */..  return
17380 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
17390 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 70 72 65  lease memory pre
173a0 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
173b0 64 20 62 79 20 74 61 62 6c 65 43 6f 6c 75 6d 6e  d by tableColumn
173c0 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  List()..*/.stati
173d0 63 20 76 6f 69 64 20 66 72 65 65 43 6f 6c 75 6d  c void freeColum
173e0 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a 61 7a 43  nList(char **azC
173f0 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ol){.  int i;.  
17400 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69  for(i=1; azCol[i
17410 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ]; i++){.    sql
17420 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c 5b  ite3_free(azCol[
17430 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 61 7a  i]);.  }.  /* az
17440 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73 74 61 74  Col[0] is a stat
17450 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 73  ic string */.  s
17460 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f  qlite3_free(azCo
17470 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  l);.}../*.** Ret
17480 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 6f  urn a list of po
17490 69 6e 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67  inters to string
174a0 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20  s which are the 
174b0 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a 2a 20  names of all.** 
174c0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65  columns in table
174d0 20 7a 54 61 62 2e 20 20 20 54 68 65 20 6d 65 6d   zTab.   The mem
174e0 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ory to hold the 
174f0 6e 61 6d 65 73 20 69 73 20 64 79 6e 61 6d 69 63  names is dynamic
17500 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ally.** allocate
17510 64 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 65  d and must be re
17520 6c 65 61 73 65 64 20 62 79 20 74 68 65 20 63 61  leased by the ca
17530 6c 6c 65 72 20 75 73 69 6e 67 20 61 20 73 75 62  ller using a sub
17540 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20  sequent call.** 
17550 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73  to freeColumnLis
17560 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t()..**.** The a
17570 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79 20 69 73  zCol[0] entry is
17580 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20   usually NULL.  
17590 48 6f 77 65 76 65 72 2c 20 69 66 20 7a 54 61 62  However, if zTab
175a0 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77 69   contains a rowi
175b0 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68 61 74 20  d.** value that 
175c0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72 65 73  needs to be pres
175d0 65 72 76 65 64 2c 20 74 68 65 6e 20 61 7a 43 6f  erved, then azCo
175e0 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65 64 20 69  l[0] is filled i
175f0 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6e 61  n with the.** na
17600 6d 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  me of the rowid 
17610 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  column..**.** Th
17620 65 20 66 69 72 73 74 20 72 65 67 75 6c 61 72 20  e first regular 
17630 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
17640 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b 31 5d 2e  ble is azCol[1].
17650 20 20 54 68 65 20 6c 69 73 74 20 69 73 20 74 65    The list is te
17660 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62 79 20 61  rminated.** by a
17670 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 7a 43  n entry with azC
17680 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73 74 61  ol[i]==0..*/.sta
17690 74 69 63 20 63 68 61 72 20 2a 2a 74 61 62 6c 65  tic char **table
176a0 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68 65 6c 6c  ColumnList(Shell
176b0 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20  State *p, const 
176c0 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20 63  char *zTab){.  c
176d0 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20 30 3b  har **azCol = 0;
176e0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
176f0 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *pStmt;.  char *
17700 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  zSql;.  int nCol
17710 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41 6c 6c   = 0;.  int nAll
17720 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50  oc = 0;.  int nP
17730 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  K = 0;       /* 
17740 4e 75 6d 62 65 72 20 6f 66 20 50 52 49 4d 41 52  Number of PRIMAR
17750 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 73 65  Y KEY columns se
17760 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 50  en */.  int isIP
17770 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72  K = 0;     /* Tr
17780 75 65 20 69 66 20 6f 6e 65 20 50 52 49 4d 41 52  ue if one PRIMAR
17790 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 66 20  Y KEY column of 
177a0 74 79 70 65 20 49 4e 54 45 47 45 52 20 2a 2f 0a  type INTEGER */.
177b0 20 20 69 6e 74 20 70 72 65 73 65 72 76 65 52 6f    int preserveRo
177c0 77 69 64 20 3d 20 53 68 65 6c 6c 48 61 73 46 6c  wid = ShellHasFl
177d0 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73  ag(p, SHFLG_Pres
177e0 65 72 76 65 52 6f 77 69 64 29 3b 0a 20 20 69 6e  erveRowid);.  in
177f0 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20  t rc;..  zSql = 
17800 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
17810 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e  "PRAGMA table_in
17820 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b 0a 20  fo=%Q", zTab);. 
17830 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
17840 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
17850 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
17860 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
17870 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66  free(zSql);.  if
17880 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b  ( rc ) return 0;
17890 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65  .  while( sqlite
178a0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
178b0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
178c0 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c 6c 6f   if( nCol>=nAllo
178d0 63 2d 32 20 29 7b 0a 20 20 20 20 20 20 6e 41 6c  c-2 ){.      nAl
178e0 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32 20 2b  loc = nAlloc*2 +
178f0 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20 20 20 20   nCol + 10;.    
17900 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65    azCol = sqlite
17910 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f 6c 2c  3_realloc(azCol,
17920 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 61   nAlloc*sizeof(a
17930 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 20  zCol[0]));.     
17940 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20   if( azCol==0 ) 
17950 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d  shell_out_of_mem
17960 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ory();.    }.   
17970 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d 20 3d   azCol[++nCol] =
17980 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
17990 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63  ("%s", sqlite3_c
179a0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
179b0 2c 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 73  , 1));.    if( s
179c0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
179d0 74 28 70 53 74 6d 74 2c 20 35 29 20 29 7b 0a 20  t(pStmt, 5) ){. 
179e0 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20 20 20       nPK++;.    
179f0 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20 20 20    if( nPK==1.   
17a00 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73      && sqlite3_s
17a10 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20 63 68  tricmp((const ch
17a20 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
17a30 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29  mn_text(pStmt,2)
17a40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17a50 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 54              "INT
17a60 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20  EGER")==0.      
17a70 29 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50 4b  ){.        isIPK
17a80 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
17a90 65 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50 4b  e{.        isIPK
17aa0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
17ab0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
17ac0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
17ad0 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d  );.  if( azCol==
17ae0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
17af0 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20  azCol[0] = 0;.  
17b00 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20 3d 20  azCol[nCol+1] = 
17b10 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 63  0;..  /* The dec
17b20 69 73 69 6f 6e 20 6f 66 20 77 68 65 74 68 65 72  ision of whether
17b30 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69 64 20   or not a rowid 
17b40 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 74 6f 20  really needs to 
17b50 62 65 20 70 72 65 73 65 72 76 65 64 0a 20 20 2a  be preserved.  *
17b60 2a 20 69 73 20 74 72 69 63 6b 79 2e 20 20 57 65  * is tricky.  We
17b70 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 70   never need to p
17b80 72 65 73 65 72 76 65 20 61 20 72 6f 77 69 64 20  reserve a rowid 
17b90 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f  for a WITHOUT RO
17ba0 57 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  WID table.  ** o
17bb0 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 61  r a table with a
17bc0 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
17bd0 59 20 4b 45 59 2e 20 20 57 65 20 61 72 65 20 75  Y KEY.  We are u
17be0 6e 61 62 6c 65 20 74 6f 20 70 72 65 73 65 72 76  nable to preserv
17bf0 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20 6f 6e  e.  ** rowids on
17c00 20 74 61 62 6c 65 73 20 77 68 65 72 65 20 74 68   tables where th
17c10 65 20 72 6f 77 69 64 20 69 73 20 69 6e 61 63 63  e rowid is inacc
17c20 65 73 73 69 62 6c 65 20 62 65 63 61 75 73 65 20  essible because 
17c30 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 0a  there are other.
17c40 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20    ** columns in 
17c50 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  the table named 
17c60 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69 64  "rowid", "_rowid
17c70 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e 0a 20  _", and "oid".. 
17c80 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 73 65 72   */.  if( preser
17c90 76 65 52 6f 77 69 64 20 26 26 20 69 73 49 50 4b  veRowid && isIPK
17ca0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
17cb0 73 69 6e 67 6c 65 20 50 52 49 4d 41 52 59 20 4b  single PRIMARY K
17cc0 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 74  EY column with t
17cd0 79 70 65 20 49 4e 54 45 47 45 52 20 77 61 73 20  ype INTEGER was 
17ce0 73 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a 20 20  seen, then it.  
17cf0 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 61 6e    ** might be an
17d00 20 61 6c 69 73 65 20 66 6f 72 20 74 68 65 20 52   alise for the R
17d10 4f 57 49 44 2e 20 20 42 75 74 20 69 74 20 6d 69  OWID.  But it mi
17d20 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20 57 49  ght also be a WI
17d30 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 20 20  THOUT ROWID.    
17d40 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61 20 49 4e  ** table or a IN
17d50 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
17d60 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c 20 6e  Y DESC column, n
17d70 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
17d80 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57 49 44  are.    ** ROWID
17d90 20 61 6c 69 61 73 65 73 2e 20 20 54 6f 20 64 69   aliases.  To di
17da0 73 74 69 6e 67 75 69 73 68 20 74 68 65 73 65 20  stinguish these 
17db0 63 61 73 65 73 2c 20 63 68 65 63 6b 20 74 6f 20  cases, check to 
17dc0 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  see if.    ** th
17dd0 65 72 65 20 69 73 20 61 20 22 70 6b 22 20 65 6e  ere is a "pk" en
17de0 74 72 79 20 69 6e 20 22 50 52 41 47 4d 41 20 69  try in "PRAGMA i
17df0 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20 54 68 65  ndex_list".  The
17e00 72 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a  re will be.    *
17e10 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65 78 20  * no "pk" index 
17e20 69 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  if the PRIMARY K
17e30 45 59 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20  EY really is an 
17e40 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52 4f  alias for the RO
17e50 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  WID..    */.    
17e60 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
17e70 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 31  printf("SELECT 1
17e80 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69 6e 64   FROM pragma_ind
17e90 65 78 5f 6c 69 73 74 28 25 51 29 22 0a 20 20 20  ex_list(%Q)".   
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17eb0 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
17ec0 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20 7a 54  origin='pk'", zT
17ed0 61 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ab);.    rc = sq
17ee0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
17ef0 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
17f00 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
17f10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
17f20 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
17f30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 43 6f   ){.      freeCo
17f40 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b  lumnList(azCol);
17f50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
17f60 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
17f70 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
17f80 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
17f90 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
17fa0 3b 0a 20 20 20 20 70 72 65 73 65 72 76 65 52 6f  ;.    preserveRo
17fb0 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45  wid = rc==SQLITE
17fc0 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _ROW;.  }.  if( 
17fd0 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 29 7b  preserveRowid ){
17fe0 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70 72 65  .    /* Only pre
17ff0 73 65 72 76 65 20 74 68 65 20 72 6f 77 69 64 20  serve the rowid 
18000 69 66 20 77 65 20 63 61 6e 20 66 69 6e 64 20 61  if we can find a
18010 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 66 6f 72   name to use for
18020 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 77 69   the.    ** rowi
18030 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20  d */.    static 
18040 63 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b 5d 20  char *azRowid[] 
18050 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22 5f 72  = { "rowid", "_r
18060 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22 20 7d 3b  owid_", "oid" };
18070 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
18080 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b     for(j=0; j<3;
18090 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   j++){.      for
180a0 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b 20 69  (i=1; i<=nCol; i
180b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
180c0 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
180d0 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a 43 6f  (azRowid[j],azCo
180e0 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65 61 6b  l[i])==0 ) break
180f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18100 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a 20 20  if( i>nCol ){.  
18110 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
18120 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20   point, we know 
18130 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a 5d 20  that azRowid[j] 
18140 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20  is not the name 
18150 6f 66 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a  of any.        *
18160 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c 75 6d  * ordinary colum
18170 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  n in the table. 
18180 20 56 65 72 69 66 79 20 74 68 61 74 20 61 7a 52   Verify that azR
18190 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20 76 61 6c  owid[j] is a val
181a0 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 61  id.        ** na
181b0 6d 65 20 66 6f 72 20 74 68 65 20 72 6f 77 69 64  me for the rowid
181c0 20 62 65 66 6f 72 65 20 61 64 64 69 6e 67 20 69   before adding i
181d0 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e 20 20  t to azCol[0].  
181e0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20  WITHOUT ROWID.  
181f0 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20        ** tables 
18200 77 69 6c 6c 20 66 61 69 6c 20 74 68 69 73 20 6c  will fail this l
18210 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20 20 20  ast check */.   
18220 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18230 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
18240 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c 30 2c  etadata(p->db,0,
18250 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a 5d 2c  zTab,azRowid[j],
18260 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20  0,0,0,0,0);.    
18270 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18280 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b 30 5d  TE_OK ) azCol[0]
18290 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b 0a 20   = azRowid[j];. 
182a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
182b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
182c0 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c 3b 0a    return azCol;.
182d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c 65 20  }../*.** Toggle 
182e0 74 68 65 20 72 65 76 65 72 73 65 5f 75 6e 6f 72  the reverse_unor
182f0 64 65 72 65 64 5f 73 65 6c 65 63 74 73 20 73 65  dered_selects se
18300 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tting..*/.static
18310 20 76 6f 69 64 20 74 6f 67 67 6c 65 53 65 6c 65   void toggleSele
18320 63 74 4f 72 64 65 72 28 73 71 6c 69 74 65 33 20  ctOrder(sqlite3 
18330 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  *db){.  sqlite3_
18340 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
18350 0a 20 20 69 6e 74 20 69 53 65 74 74 69 6e 67 20  .  int iSetting 
18360 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 53 74 6d  = 0;.  char zStm
18370 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65  t[100];.  sqlite
18380 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
18390 20 22 50 52 41 47 4d 41 20 72 65 76 65 72 73 65   "PRAGMA reverse
183a0 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63  _unordered_selec
183b0 74 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  ts", -1, &pStmt,
183c0 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74   0);.  if( sqlit
183d0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
183e0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
183f0 20 20 69 53 65 74 74 69 6e 67 20 3d 20 73 71 6c    iSetting = sql
18400 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
18410 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20  pStmt, 0);.  }. 
18420 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
18430 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69  e(pStmt);.  sqli
18440 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
18450 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53 74 6d  eof(zStmt), zStm
18460 74 2c 0a 20 20 20 20 20 20 20 22 50 52 41 47 4d  t,.       "PRAGM
18470 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64 65  A reverse_unorde
18480 72 65 64 5f 73 65 6c 65 63 74 73 28 25 64 29 22  red_selects(%d)"
18490 2c 20 21 69 53 65 74 74 69 6e 67 29 3b 0a 20 20  , !iSetting);.  
184a0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
184b0 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20 30 29   zStmt, 0, 0, 0)
184c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
184d0 69 73 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  is a different c
184e0 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
184f0 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69 6e 67  used for dumping
18500 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
18510 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63 65 69  * Each row recei
18520 76 65 64 20 62 79 20 74 68 69 73 20 63 61 6c 6c  ved by this call
18530 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
18540 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a   a table name,.*
18550 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79 70 65  * the table type
18560 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22 74 61   ("index" or "ta
18570 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20 74 6f  ble") and SQL to
18580 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c   create the tabl
18590 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  e..** This routi
185a0 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e 74 20  ne should print 
185b0 74 65 78 74 20 73 75 66 66 69 63 69 65 6e 74 20  text sufficient 
185c0 74 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20  to recreate the 
185d0 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
185e0 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c 62 61   int dump_callba
185f0 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  ck(void *pArg, i
18600 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a  nt nArg, char **
18610 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a  azArg, char **az
18620 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e 74 20  NotUsed){.  int 
18630 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rc;.  const char
18640 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f 6e 73   *zTable;.  cons
18650 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20  t char *zType;. 
18660 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
18670 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  l;.  ShellState 
18680 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65  *p = (ShellState
18690 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e 55 53   *)pArg;..  UNUS
186a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 7a 4e  ED_PARAMETER(azN
186b0 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 6e  otUsed);.  if( n
186c0 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72 67 3d  Arg!=3 || azArg=
186d0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
186e0 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b   zTable = azArg[
186f0 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20 61 7a  0];.  zType = az
18700 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20 3d  Arg[1];.  zSql =
18710 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20 69 66   azArg[2];..  if
18720 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c 65 2c  ( strcmp(zTable,
18730 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
18740 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61  e")==0 ){.    ra
18750 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
18760 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 71   "DELETE FROM sq
18770 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c 6e  lite_sequence;\n
18780 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
18790 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
187a0 22 73 71 6c 69 74 65 5f 73 74 61 74 3f 22 2c 20  "sqlite_stat?", 
187b0 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a 20 20  zTable)==0 ){.  
187c0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
187d0 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71  out, "ANALYZE sq
187e0 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29  lite_master;\n")
187f0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
18800 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73  rncmp(zTable, "s
18810 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29  qlite_", 7)==0 )
18820 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
18830 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
18840 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45 41 54  cmp(zSql, "CREAT
18850 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22  E VIRTUAL TABLE"
18860 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 20)==0 ){.    
18870 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20 20 20  char *zIns;.    
18880 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62 6c 65  if( !p->writable
18890 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
188a0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
188b0 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  t, "PRAGMA writa
188c0 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c 6e  ble_schema=ON;\n
188d0 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69  ");.      p->wri
188e0 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 31 3b  tableSchema = 1;
188f0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e 73 20  .    }.    zIns 
18900 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
18910 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53 45 52  f(.       "INSER
18920 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61  T INTO sqlite_ma
18930 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65 2c 74  ster(type,name,t
18940 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61 67 65  bl_name,rootpage
18950 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20 22 56  ,sql)".       "V
18960 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c 27 25  ALUES('table','%
18970 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27 29 3b  q','%q',0,'%q');
18980 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62 6c 65  ",.       zTable
18990 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c 29 3b  , zTable, zSql);
189a0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
189b0 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  (p->out, "%s\n",
189c0 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69   zIns);.    sqli
189d0 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29 3b 0a  te3_free(zIns);.
189e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
189f0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e 74  }else{.    print
18a00 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75  SchemaLine(p->ou
18a10 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22 29 3b  t, zSql, ";\n");
18a20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74 72 63  .  }..  if( strc
18a30 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62 6c 65  mp(zType, "table
18a40 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65  ")==0 ){.    She
18a50 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74 3b 0a  llText sSelect;.
18a60 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 54      ShellText sT
18a70 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  able;.    char *
18a80 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20  *azCol;.    int 
18a90 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 61 76  i;.    char *sav
18aa0 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20  edDestTable;.   
18ab0 20 69 6e 74 20 73 61 76 65 64 4d 6f 64 65 3b 0a   int savedMode;.
18ac0 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74 61 62  .    azCol = tab
18ad0 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 2c 20  leColumnList(p, 
18ae0 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28  zTable);.    if(
18af0 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20   azCol==0 ){.   
18b00 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20     p->nErr++;.  
18b10 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18b20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61    }..    /* Alwa
18b30 79 73 20 71 75 6f 74 65 20 74 68 65 20 74 61 62  ys quote the tab
18b40 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20 69 66  le name, even if
18b50 20 69 74 20 61 70 70 65 61 72 73 20 74 6f 20 62   it appears to b
18b60 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a 20 20  e pure ascii,.  
18b70 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69 74 20    ** in case it 
18b80 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20 45 78  is a keyword. Ex
18b90 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 22  :  INSERT INTO "
18ba0 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a 20 20  table" ... */.  
18bb0 20 20 69 6e 69 74 54 65 78 74 28 26 73 54 61 62    initText(&sTab
18bc0 6c 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  le);.    appendT
18bd0 65 78 74 28 26 73 54 61 62 6c 65 2c 20 7a 54 61  ext(&sTable, zTa
18be0 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28 7a  ble, quoteChar(z
18bf0 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f 2a 20  Table));.    /* 
18c00 49 66 20 70 72 65 73 65 72 76 69 6e 67 20 74 68  If preserving th
18c10 65 20 72 6f 77 69 64 2c 20 61 64 64 20 61 20 63  e rowid, add a c
18c20 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74 65 72  olumn list after
18c30 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
18c40 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72  .    ** In other
18c50 20 77 6f 72 64 73 3a 20 20 22 49 4e 53 45 52 54   words:  "INSERT
18c60 20 49 4e 54 4f 20 74 61 62 28 72 6f 77 69 64 2c   INTO tab(rowid,
18c70 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c 55 45  a,b,c,...) VALUE
18c80 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 69  S(...)".    ** i
18c90 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
18ca0 75 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  ual "INSERT INTO
18cb0 20 74 61 62 20 56 41 4c 55 45 53 28 2e 2e 2e 29   tab VALUES(...)
18cc0 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  "..    */.    if
18cd0 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20  ( azCol[0] ){.  
18ce0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
18cf0 73 54 61 62 6c 65 2c 20 22 28 22 2c 20 30 29 3b  sTable, "(", 0);
18d00 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
18d10 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c  t(&sTable, azCol
18d20 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  [0], 0);.      f
18d30 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d  or(i=1; azCol[i]
18d40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
18d50 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62  appendText(&sTab
18d60 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20  le, ",", 0);.   
18d70 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
18d80 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b 69  &sTable, azCol[i
18d90 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43  ], quoteChar(azC
18da0 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20 7d  ol[i]));.      }
18db0 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
18dc0 74 28 26 73 54 61 62 6c 65 2c 20 22 29 22 2c 20  t(&sTable, ")", 
18dd0 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  0);.    }..    /
18de0 2a 20 42 75 69 6c 64 20 61 6e 20 61 70 70 72 6f  * Build an appro
18df0 70 72 69 61 74 65 20 53 45 4c 45 43 54 20 73 74  priate SELECT st
18e00 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
18e10 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65 63 74  nitText(&sSelect
18e20 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
18e30 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45 4c  t(&sSelect, "SEL
18e40 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20 20 69  ECT ", 0);.    i
18e50 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20  f( azCol[0] ){. 
18e60 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
18e70 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b  &sSelect, azCol[
18e80 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 70  0], 0);.      ap
18e90 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
18ea0 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20  t, ",", 0);.    
18eb0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61  }.    for(i=1; a
18ec0 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  zCol[i]; i++){. 
18ed0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
18ee0 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b  &sSelect, azCol[
18ef0 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a  i], quoteChar(az
18f00 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20  Col[i]));.      
18f10 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d 20 29  if( azCol[i+1] )
18f20 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
18f30 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
18f40 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ,", 0);.      }.
18f50 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 43 6f      }.    freeCo
18f60 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b  lumnList(azCol);
18f70 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28  .    appendText(
18f80 26 73 53 65 6c 65 63 74 2c 20 22 20 46 52 4f 4d  &sSelect, " FROM
18f90 20 22 2c 20 30 29 3b 0a 20 20 20 20 61 70 70 65   ", 0);.    appe
18fa0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
18fb0 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68   zTable, quoteCh
18fc0 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a 20 20  ar(zTable));..  
18fd0 20 20 73 61 76 65 64 44 65 73 74 54 61 62 6c 65    savedDestTable
18fe0 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65   = p->zDestTable
18ff0 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f 64 65 20  ;.    savedMode 
19000 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 70  = p->mode;.    p
19010 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 73  ->zDestTable = s
19020 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70 2d 3e  Table.z;.    p->
19030 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64 65 20  mode = p->cMode 
19040 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20  = MODE_Insert;. 
19050 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65 78     rc = shell_ex
19060 65 63 28 70 2c 20 73 53 65 6c 65 63 74 2e 7a 2c  ec(p, sSelect.z,
19070 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63   0);.    if( (rc
19080 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
19090 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20  ORRUPT ){.      
190a0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
190b0 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52  t, "/****** CORR
190c0 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a  UPTION ERROR ***
190d0 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 20  ****/\n");.     
190e0 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64   toggleSelectOrd
190f0 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  er(p->db);.     
19100 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c 20 73   shell_exec(p, s
19110 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a 20 20  Select.z, 0);.  
19120 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74      toggleSelect
19130 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20  Order(p->db);.  
19140 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74    }.    p->zDest
19150 54 61 62 6c 65 20 3d 20 73 61 76 65 64 44 65 73  Table = savedDes
19160 74 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d 3e 6d  tTable;.    p->m
19170 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f 64 65 3b  ode = savedMode;
19180 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73  .    freeText(&s
19190 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 65 65  Table);.    free
191a0 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a  Text(&sSelect);.
191b0 20 20 20 20 69 66 28 20 72 63 20 29 20 70 2d 3e      if( rc ) p->
191c0 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nErr++;.  }.  re
191d0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
191e0 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55 73   Run zQuery.  Us
191f0 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28  e dump_callback(
19200 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61 63  ) as the callbac
19210 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61  k routine so tha
19220 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
19230 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 61  s of the query a
19240 72 65 20 6f 75 74 70 75 74 20 61 73 20 53 51 4c  re output as SQL
19250 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
19260 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61 20 53  ** If we get a S
19270 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
19280 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20 71  ror, rerun the q
19290 75 65 72 79 20 61 66 74 65 72 20 61 70 70 65 6e  uery after appen
192a0 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20 42  ding.** "ORDER B
192b0 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 74 6f  Y rowid DESC" to
192c0 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61   the end..*/.sta
192d0 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68 65  tic int run_sche
192e0 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20  ma_dump_query(. 
192f0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a   ShellState *p,.
19300 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51    const char *zQ
19310 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72 63  uery.){.  int rc
19320 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
19330 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
19340 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
19350 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61 6c 6c  Query, dump_call
19360 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b  back, p, &zErr);
19370 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19380 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20  E_CORRUPT ){.   
19390 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20 20   char *zQ2;.    
193a0 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  int len = strlen
193b0 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20  30(zQuery);.    
193c0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
193d0 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52  t, "/****** CORR
193e0 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a  UPTION ERROR ***
193f0 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 69  ****/\n");.    i
19400 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
19410 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
19420 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 25 73  out, "/****** %s
19430 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72   ******/\n", zEr
19440 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
19450 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
19460 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a 20 20      zErr = 0;.  
19470 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20 6d 61    }.    zQ2 = ma
19480 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20 29 3b  lloc( len+100 );
19490 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d 30 20  .    if( zQ2==0 
194a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
194b0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
194c0 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32 2c 20  f(len+100, zQ2, 
194d0 22 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77  "%s ORDER BY row
194e0 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72 79  id DESC", zQuery
194f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
19500 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
19510 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61  zQ2, dump_callba
19520 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20  ck, p, &zErr);. 
19530 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
19540 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
19550 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20  ->out, "/****** 
19560 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a 2a 2a  ERROR: %s ******
19570 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20  /\n", zErr);.   
19580 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
19590 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
195a0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  T;.    }.    sql
195b0 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b  ite3_free(zErr);
195c0 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29 3b 0a  .    free(zQ2);.
195d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
195e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f  .}../*.** Text o
195f0 66 20 68 65 6c 70 20 6d 65 73 73 61 67 65 73 2e  f help messages.
19600 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 65 6c 70 20  .**.** The help 
19610 74 65 78 74 20 66 6f 72 20 65 61 63 68 20 69 6e  text for each in
19620 64 69 76 69 64 75 61 6c 20 63 6f 6d 6d 61 6e 64  dividual command
19630 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 6c   begins with a l
19640 69 6e 65 20 74 68 61 74 20 73 74 61 72 74 73 0a  ine that starts.
19650 2a 2a 20 77 69 74 68 20 22 2e 22 2e 20 20 53 75  ** with ".".  Su
19660 62 73 65 71 75 65 6e 74 20 6c 69 6e 65 73 20 61  bsequent lines a
19670 72 65 20 73 75 70 70 6c 69 6d 65 6e 74 61 6c 20  re supplimental 
19680 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
19690 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
196a0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 70 61   two or more spa
196b0 63 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ces between the 
196c0 65 6e 64 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61  end of the comma
196d0 6e 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 73 74  nd and the.** st
196e0 61 72 74 20 6f 66 20 74 68 65 20 64 65 73 63 72  art of the descr
196f0 69 70 74 69 6f 6e 20 6f 66 20 77 68 61 74 20 74  iption of what t
19700 68 61 74 20 63 6f 6d 6d 61 6e 64 20 64 6f 65 73  hat command does
19710 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
19720 74 20 63 68 61 72 20 2a 28 61 7a 48 65 6c 70 5b  t char *(azHelp[
19730 5d 29 20 3d 20 7b 0a 23 69 66 20 64 65 66 69 6e  ]) = {.#if defin
19740 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a  ed(SQLITE_HAVE_Z
19750 4c 49 42 29 20 26 26 20 21 64 65 66 69 6e 65 64  LIB) && !defined
19760 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
19770 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 22 2e 61  TUALTABLE).  ".a
19780 72 63 68 69 76 65 20 2e 2e 2e 20 20 20 20 20 20  rchive ...      
19790 20 20 20 20 20 20 20 4d 61 6e 61 67 65 20 53 51         Manage SQ
197a0 4c 20 61 72 63 68 69 76 65 73 22 2c 0a 20 20 22  L archives",.  "
197b0 20 20 20 45 61 63 68 20 63 6f 6d 6d 61 6e 64 20     Each command 
197c0 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c  must have exactl
197d0 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  y one of the fol
197e0 6c 6f 77 69 6e 67 20 6f 70 74 69 6f 6e 73 3a 22  lowing options:"
197f0 2c 0a 20 20 22 20 20 20 20 20 2d 63 2c 20 2d 2d  ,.  "     -c, --
19800 63 72 65 61 74 65 20 20 20 20 20 20 20 20 20 20  create          
19810 20 20 20 20 20 43 72 65 61 74 65 20 61 20 6e 65       Create a ne
19820 77 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20  w archive",.  " 
19830 20 20 20 20 2d 75 2c 20 2d 2d 75 70 64 61 74 65      -u, --update
19840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55                 U
19850 70 64 61 74 65 20 6f 72 20 61 64 64 20 66 69 6c  pdate or add fil
19860 65 73 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e  es to an existin
19870 67 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20  g archive",.  " 
19880 20 20 20 20 2d 74 2c 20 2d 2d 6c 69 73 74 20 20      -t, --list  
19890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
198a0 69 73 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ist contents of 
198b0 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20 20 20  archive",.  "   
198c0 20 20 2d 78 2c 20 2d 2d 65 78 74 72 61 63 74 20    -x, --extract 
198d0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 74               Ext
198e0 72 61 63 74 20 66 69 6c 65 73 20 66 72 6f 6d 20  ract files from 
198f0 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20 20 20  archive",.  "   
19900 4f 70 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e  Optional argumen
19910 74 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d 76  ts:",.  "     -v
19920 2c 20 2d 2d 76 65 72 62 6f 73 65 20 20 20 20 20  , --verbose     
19930 20 20 20 20 20 20 20 20 20 50 72 69 6e 74 20 65           Print e
19940 61 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 73 20  ach filename as 
19950 69 74 20 69 73 20 70 72 6f 63 65 73 73 65 64 22  it is processed"
19960 2c 0a 20 20 22 20 20 20 20 20 2d 66 20 46 49 4c  ,.  "     -f FIL
19970 45 2c 20 2d 2d 66 69 6c 65 20 46 49 4c 45 20 20  E, --file FILE  
19980 20 20 20 20 20 4f 70 65 72 61 74 65 20 6f 6e 20       Operate on 
19990 61 72 63 68 69 76 65 20 46 49 4c 45 20 28 64 65  archive FILE (de
199a0 66 61 75 6c 74 20 69 73 20 63 75 72 72 65 6e 74  fault is current
199b0 20 64 62 29 22 2c 0a 20 20 22 20 20 20 20 20 2d   db)",.  "     -
199c0 61 20 46 49 4c 45 2c 20 2d 2d 61 70 70 65 6e 64  a FILE, --append
199d0 20 46 49 4c 45 20 20 20 20 20 4f 70 65 72 61 74   FILE     Operat
199e0 65 20 6f 6e 20 46 49 4c 45 20 6f 70 65 6e 65 64  e on FILE opened
199f0 20 75 73 69 6e 67 20 74 68 65 20 61 70 6e 64 76   using the apndv
19a00 66 73 20 56 46 53 22 2c 0a 20 20 22 20 20 20 20  fs VFS",.  "    
19a10 20 2d 43 20 44 49 52 2c 20 2d 2d 64 69 72 65 63   -C DIR, --direc
19a20 74 6f 72 79 20 44 49 52 20 20 20 20 43 68 61 6e  tory DIR    Chan
19a30 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20  ge to directory 
19a40 44 49 52 20 74 6f 20 72 65 61 64 2f 65 78 74 72  DIR to read/extr
19a50 61 63 74 20 66 69 6c 65 73 22 2c 0a 20 20 22 20  act files",.  " 
19a60 20 20 20 20 2d 6e 2c 20 2d 2d 64 72 79 72 75 6e      -n, --dryrun
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
19a80 68 6f 77 20 74 68 65 20 53 51 4c 20 74 68 61 74  how the SQL that
19a90 20 77 6f 75 6c 64 20 68 61 76 65 20 6f 63 63 75   would have occu
19aa0 72 72 65 64 22 2c 0a 20 20 22 20 20 20 45 78 61  rred",.  "   Exa
19ab0 6d 70 6c 65 73 3a 22 2c 0a 20 20 22 20 20 20 20  mples:",.  "    
19ac0 20 2e 61 72 20 2d 63 66 20 61 72 63 68 69 76 65   .ar -cf archive
19ad0 2e 73 61 72 20 66 6f 6f 20 62 61 72 20 20 23 20  .sar foo bar  # 
19ae0 43 72 65 61 74 65 20 61 72 63 68 69 76 65 2e 73  Create archive.s
19af0 61 72 20 66 72 6f 6d 20 66 69 6c 65 73 20 66 6f  ar from files fo
19b00 6f 20 61 6e 64 20 62 61 72 22 2c 0a 20 20 22 20  o and bar",.  " 
19b10 20 20 20 20 2e 61 72 20 2d 74 66 20 61 72 63 68      .ar -tf arch
19b20 69 76 65 2e 73 61 72 20 20 20 20 20 20 20 20 20  ive.sar         
19b30 20 23 20 4c 69 73 74 20 6d 65 6d 62 65 72 73 20   # List members 
19b40 6f 66 20 61 72 63 68 69 76 65 2e 73 61 72 22 2c  of archive.sar",
19b50 0a 20 20 22 20 20 20 20 20 2e 61 72 20 2d 78 76  .  "     .ar -xv
19b60 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 20 20  f archive.sar   
19b70 20 20 20 20 20 20 23 20 56 65 72 62 6f 73 65 6c        # Verbosel
19b80 79 20 65 78 74 72 61 63 74 20 66 69 6c 65 73 20  y extract files 
19b90 66 72 6f 6d 20 61 72 63 68 69 76 65 2e 73 61 72  from archive.sar
19ba0 22 2c 0a 20 20 22 20 20 20 53 65 65 20 61 6c 73  ",.  "   See als
19bb0 6f 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 68 74  o:",.  "      ht
19bc0 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f  tp://sqlite.org/
19bd0 63 6c 69 2e 68 74 6d 6c 23 73 71 6c 61 72 5f 61  cli.html#sqlar_a
19be0 72 63 68 69 76 65 5f 73 75 70 70 6f 72 74 22 2c  rchive_support",
19bf0 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
19c00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
19c10 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e 61 75  ORIZATION.  ".au
19c20 74 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20 20  th ON|OFF       
19c30 20 20 20 20 20 20 53 68 6f 77 20 61 75 74 68 6f        Show autho
19c40 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 73 22  rizer callbacks"
19c50 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 62 61 63  ,.#endif.  ".bac
19c60 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45 20 20 20  kup ?DB? FILE   
19c70 20 20 20 20 20 42 61 63 6b 75 70 20 44 42 20 28       Backup DB (
19c80 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22  default \"main\"
19c90 29 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20  ) to FILE",.  " 
19ca0 20 20 20 20 20 20 2d 2d 61 70 70 65 6e 64 20 20        --append  
19cb0 20 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68            Use th
19cc0 65 20 61 70 70 65 6e 64 76 66 73 22 2c 0a 20 20  e appendvfs",.  
19cd0 22 20 20 20 20 20 20 20 2d 2d 61 73 79 6e 63 20  "       --async 
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
19cf0 65 20 74 6f 20 46 49 4c 45 20 77 69 74 68 6f 75  e to FILE withou
19d00 74 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  t a journal and 
19d10 77 69 74 68 6f 75 74 20 66 73 79 6e 63 28 29 22  without fsync()"
19d20 2c 0a 20 20 22 2e 62 61 69 6c 20 6f 6e 7c 6f 66  ,.  ".bail on|of
19d30 66 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74  f             St
19d40 6f 70 20 61 66 74 65 72 20 68 69 74 74 69 6e 67  op after hitting
19d50 20 61 6e 20 65 72 72 6f 72 2e 20 20 44 65 66 61   an error.  Defa
19d60 75 6c 74 20 4f 46 46 22 2c 0a 20 20 22 2e 62 69  ult OFF",.  ".bi
19d70 6e 61 72 79 20 6f 6e 7c 6f 66 66 20 20 20 20 20  nary on|off     
19d80 20 20 20 20 20 20 54 75 72 6e 20 62 69 6e 61 72        Turn binar
19d90 79 20 6f 75 74 70 75 74 20 6f 6e 20 6f 72 20 6f  y output on or o
19da0 66 66 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46  ff.  Default OFF
19db0 22 2c 0a 20 20 22 2e 63 64 20 44 49 52 45 43 54  ",.  ".cd DIRECT
19dc0 4f 52 59 20 20 20 20 20 20 20 20 20 20 20 20 43  ORY            C
19dd0 68 61 6e 67 65 20 74 68 65 20 77 6f 72 6b 69 6e  hange the workin
19de0 67 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 44  g directory to D
19df0 49 52 45 43 54 4f 52 59 22 2c 0a 20 20 22 2e 63  IRECTORY",.  ".c
19e00 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 20 20 20  hanges on|off   
19e10 20 20 20 20 20 20 20 53 68 6f 77 20 6e 75 6d 62         Show numb
19e20 65 72 20 6f 66 20 72 6f 77 73 20 63 68 61 6e 67  er of rows chang
19e30 65 64 20 62 79 20 53 51 4c 22 2c 0a 20 20 22 2e  ed by SQL",.  ".
19e40 63 68 65 63 6b 20 47 4c 4f 42 20 20 20 20 20 20  check GLOB      
19e50 20 20 20 20 20 20 20 20 46 61 69 6c 20 69 66 20          Fail if 
19e60 6f 75 74 70 75 74 20 73 69 6e 63 65 20 2e 74 65  output since .te
19e70 73 74 63 61 73 65 20 64 6f 65 73 20 6e 6f 74 20  stcase does not 
19e80 6d 61 74 63 68 22 2c 0a 20 20 22 2e 63 6c 6f 6e  match",.  ".clon
19e90 65 20 4e 45 57 44 42 20 20 20 20 20 20 20 20 20  e NEWDB         
19ea0 20 20 20 20 43 6c 6f 6e 65 20 64 61 74 61 20 69      Clone data i
19eb0 6e 74 6f 20 4e 45 57 44 42 20 66 72 6f 6d 20 74  nto NEWDB from t
19ec0 68 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  he existing data
19ed0 62 61 73 65 22 2c 0a 20 20 22 2e 64 61 74 61 62  base",.  ".datab
19ee0 61 73 65 73 20 20 20 20 20 20 20 20 20 20 20 20  ases            
19ef0 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 61 6e     List names an
19f00 64 20 66 69 6c 65 73 20 6f 66 20 61 74 74 61 63  d files of attac
19f10 68 65 64 20 64 61 74 61 62 61 73 65 73 22 2c 0a  hed databases",.
19f20 20 20 22 2e 64 62 63 6f 6e 66 69 67 20 3f 6f 70    ".dbconfig ?op
19f30 3f 20 3f 76 61 6c 3f 20 20 20 20 20 4c 69 73 74  ? ?val?     List
19f40 20 6f 72 20 63 68 61 6e 67 65 20 73 71 6c 69 74   or change sqlit
19f50 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 29 20 6f  e3_db_config() o
19f60 70 74 69 6f 6e 73 22 2c 0a 20 20 22 2e 64 62 69  ptions",.  ".dbi
19f70 6e 66 6f 20 3f 44 42 3f 20 20 20 20 20 20 20 20  nfo ?DB?        
19f80 20 20 20 20 20 53 68 6f 77 20 73 74 61 74 75 73       Show status
19f90 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
19fa0 75 74 20 74 68 65 20 64 61 74 61 62 61 73 65 22  ut the database"
19fb0 2c 0a 20 20 22 2e 64 75 6d 70 20 3f 54 41 42 4c  ,.  ".dump ?TABL
19fc0 45 3f 20 2e 2e 2e 20 20 20 20 20 20 20 20 52 65  E? ...        Re
19fd0 6e 64 65 72 20 61 6c 6c 20 64 61 74 61 62 61 73  nder all databas
19fe0 65 20 63 6f 6e 74 65 6e 74 20 61 73 20 53 51 4c  e content as SQL
19ff0 22 2c 0a 20 20 22 20 20 20 4f 70 74 69 6f 6e 73  ",.  "   Options
1a000 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d 2d 70 72  :",.  "     --pr
1a010 65 73 65 72 76 65 2d 72 6f 77 69 64 73 20 20 20  eserve-rowids   
1a020 20 20 20 49 6e 63 6c 75 64 65 20 52 4f 57 49 44     Include ROWID
1a030 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 6f   values in the o
1a040 75 74 70 75 74 22 2c 0a 20 20 22 20 20 20 20 20  utput",.  "     
1a050 2d 2d 6e 65 77 6c 69 6e 65 73 20 20 20 20 20 20  --newlines      
1a060 20 20 20 20 20 20 20 41 6c 6c 6f 77 20 75 6e 65         Allow une
1a070 73 63 61 70 65 64 20 6e 65 77 6c 69 6e 65 20 63  scaped newline c
1a080 68 61 72 61 63 74 65 72 73 20 69 6e 20 6f 75 74  haracters in out
1a090 70 75 74 22 2c 0a 20 20 22 20 20 20 54 41 42 4c  put",.  "   TABL
1a0a0 45 20 69 73 20 4c 49 4b 45 20 70 61 74 74 65 72  E is LIKE patter
1a0b0 6e 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 73  n for the tables
1a0c0 20 74 6f 20 64 75 6d 70 22 2c 0a 20 20 22 2e 65   to dump",.  ".e
1a0d0 63 68 6f 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20  cho on|off      
1a0e0 20 20 20 20 20 20 20 54 75 72 6e 20 63 6f 6d 6d         Turn comm
1a0f0 61 6e 64 20 65 63 68 6f 20 6f 6e 20 6f 72 20 6f  and echo on or o
1a100 66 66 22 2c 0a 20 20 22 2e 65 71 70 20 6f 6e 7c  ff",.  ".eqp on|
1a110 6f 66 66 7c 66 75 6c 6c 7c 2e 2e 2e 20 20 20 20  off|full|...    
1a120 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
1a130 6c 65 20 61 75 74 6f 6d 61 74 69 63 20 45 58 50  le automatic EXP
1a140 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22  LAIN QUERY PLAN"
1a150 2c 0a 20 20 22 20 20 20 4f 74 68 65 72 20 4d 6f  ,.  "   Other Mo
1a160 64 65 73 3a 22 2c 0a 23 69 66 64 65 66 20 53 51  des:",.#ifdef SQ
1a170 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 22 20 20  LITE_DEBUG.  "  
1a180 20 20 20 20 74 65 73 74 20 20 20 20 20 20 20 20      test        
1a190 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 72            Show r
1a1a0 61 77 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  aw EXPLAIN QUERY
1a1b0 20 50 4c 41 4e 20 6f 75 74 70 75 74 22 2c 0a 20   PLAN output",. 
1a1c0 20 22 20 20 20 20 20 20 74 72 61 63 65 20 20 20   "      trace   
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69                Li
1a1e0 6b 65 20 5c 22 66 75 6c 6c 5c 22 20 62 75 74 20  ke \"full\" but 
1a1f0 61 6c 73 6f 20 65 6e 61 62 6c 65 20 5c 22 50 52  also enable \"PR
1a200 41 47 4d 41 20 76 64 62 65 5f 74 72 61 63 65 5c  AGMA vdbe_trace\
1a210 22 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 20 20  "",.#endif.  "  
1a220 20 20 20 20 74 72 69 67 67 65 72 20 20 20 20 20      trigger     
1a230 20 20 20 20 20 20 20 20 20 20 4c 69 6b 65 20 5c            Like \
1a240 22 66 75 6c 6c 5c 22 20 62 75 74 20 61 6c 73 6f  "full\" but also
1a250 20 73 68 6f 77 20 74 72 69 67 67 65 72 20 62 79   show trigger by
1a260 74 65 63 6f 64 65 22 2c 0a 20 20 22 2e 65 78 63  tecode",.  ".exc
1a270 65 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  el              
1a280 20 20 20 20 20 44 69 73 70 6c 61 79 20 74 68 65       Display the
1a290 20 6f 75 74 70 75 74 20 6f 66 20 6e 65 78 74 20   output of next 
1a2a0 63 6f 6d 6d 61 6e 64 20 69 6e 20 61 20 73 70 72  command in a spr
1a2b0 65 61 64 73 68 65 65 74 22 2c 0a 20 20 22 2e 65  eadsheet",.  ".e
1a2c0 78 69 74 20 3f 43 4f 44 45 3f 20 20 20 20 20 20  xit ?CODE?      
1a2d0 20 20 20 20 20 20 20 45 78 69 74 20 74 68 69 73         Exit this
1a2e0 20 70 72 6f 67 72 61 6d 20 77 69 74 68 20 72 65   program with re
1a2f0 74 75 72 6e 2d 63 6f 64 65 20 43 4f 44 45 22 2c  turn-code CODE",
1a300 0a 20 20 22 2e 65 78 70 65 72 74 20 20 20 20 20  .  ".expert     
1a310 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58 50               EXP
1a320 45 52 49 4d 45 4e 54 41 4c 2e 20 53 75 67 67 65  ERIMENTAL. Sugge
1a330 73 74 20 69 6e 64 65 78 65 73 20 66 6f 72 20 73  st indexes for s
1a340 70 65 63 69 66 69 65 64 20 71 75 65 72 69 65 73  pecified queries
1a350 22 2c 0a 2f 2a 20 42 65 63 61 75 73 65 20 65 78  ",./* Because ex
1a360 70 6c 61 69 6e 20 6d 6f 64 65 20 63 6f 6d 65 73  plain mode comes
1a370 20 6f 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   on automaticall
1a380 79 20 6e 6f 77 2c 20 74 68 65 20 22 2e 65 78 70  y now, the ".exp
1a390 6c 61 69 6e 22 20 6d 6f 64 65 0a 2a 2a 20 69 73  lain" mode.** is
1a3a0 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
1a3b0 65 20 68 65 6c 70 20 73 63 72 65 65 6e 2e 20 20  e help screen.  
1a3c0 49 74 20 69 73 20 73 74 69 6c 6c 20 73 75 70 70  It is still supp
1a3d0 6f 72 74 65 64 20 66 6f 72 20 6c 65 67 61 63 79  orted for legacy
1a3e0 2c 20 68 6f 77 65 76 65 72 20 2a 2f 0a 2f 2a 22  , however */./*"
1a3f0 2e 65 78 70 6c 61 69 6e 20 3f 6f 6e 7c 6f 66 66  .explain ?on|off
1a400 7c 61 75 74 6f 3f 20 20 20 54 75 72 6e 20 45 58  |auto?   Turn EX
1a410 50 4c 41 49 4e 20 6f 75 74 70 75 74 20 6d 6f 64  PLAIN output mod
1a420 65 20 6f 6e 20 6f 72 20 6f 66 66 20 6f 72 20 74  e on or off or t
1a430 6f 20 61 75 74 6f 6d 61 74 69 63 22 2c 2a 2f 0a  o automatic",*/.
1a440 20 20 22 2e 66 75 6c 6c 73 63 68 65 6d 61 20 3f    ".fullschema ?
1a450 2d 2d 69 6e 64 65 6e 74 3f 20 20 20 53 68 6f 77  --indent?   Show
1a460 20 73 63 68 65 6d 61 20 61 6e 64 20 74 68 65 20   schema and the 
1a470 63 6f 6e 74 65 6e 74 20 6f 66 20 73 71 6c 69 74  content of sqlit
1a480 65 5f 73 74 61 74 20 74 61 62 6c 65 73 22 2c 0a  e_stat tables",.
1a490 20 20 22 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f    ".headers on|o
1a4a0 66 66 20 20 20 20 20 20 20 20 20 20 54 75 72 6e  ff          Turn
1a4b0 20 64 69 73 70 6c 61 79 20 6f 66 20 68 65 61 64   display of head
1a4c0 65 72 73 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a  ers on or off",.
1a4d0 20 20 22 2e 68 65 6c 70 20 3f 2d 61 6c 6c 3f 20    ".help ?-all? 
1a4e0 3f 50 41 54 54 45 52 4e 3f 20 20 20 53 68 6f 77  ?PATTERN?   Show
1a4f0 20 68 65 6c 70 20 74 65 78 74 20 66 6f 72 20 50   help text for P
1a500 41 54 54 45 52 4e 22 2c 0a 20 20 22 2e 69 6d 70  ATTERN",.  ".imp
1a510 6f 72 74 20 46 49 4c 45 20 54 41 42 4c 45 20 20  ort FILE TABLE  
1a520 20 20 20 20 20 49 6d 70 6f 72 74 20 64 61 74 61       Import data
1a530 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 74 6f 20   from FILE into 
1a540 54 41 42 4c 45 22 2c 0a 23 69 66 6e 64 65 66 20  TABLE",.#ifndef 
1a550 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 53 54  SQLITE_OMIT_TEST
1a560 5f 43 4f 4e 54 52 4f 4c 0a 20 20 22 2e 69 6d 70  _CONTROL.  ".imp
1a570 6f 73 74 65 72 20 49 4e 44 45 58 20 54 41 42 4c  oster INDEX TABL
1a580 45 20 20 20 20 43 72 65 61 74 65 20 69 6d 70 6f  E    Create impo
1a590 73 74 65 72 20 74 61 62 6c 65 20 54 41 42 4c 45  ster table TABLE
1a5a0 20 6f 6e 20 69 6e 64 65 78 20 49 4e 44 45 58 22   on index INDEX"
1a5b0 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 69 6e 64  ,.#endif.  ".ind
1a5c0 65 78 65 73 20 3f 54 41 42 4c 45 3f 20 20 20 20  exes ?TABLE?    
1a5d0 20 20 20 20 20 53 68 6f 77 20 6e 61 6d 65 73 20       Show names 
1a5e0 6f 66 20 69 6e 64 65 78 65 73 22 2c 0a 20 20 22  of indexes",.  "
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a600 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54 41             If TA
1a610 42 4c 45 20 69 73 20 73 70 65 63 69 66 69 65 64  BLE is specified
1a620 2c 20 6f 6e 6c 79 20 73 68 6f 77 20 69 6e 64 65  , only show inde
1a630 78 65 73 20 66 6f 72 22 2c 0a 20 20 22 20 20 20  xes for",.  "   
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a650 20 20 20 20 20 20 20 20 74 61 62 6c 65 73 20 6d          tables m
1a660 61 74 63 68 69 6e 67 20 54 41 42 4c 45 20 75 73  atching TABLE us
1a670 69 6e 67 20 74 68 65 20 4c 49 4b 45 20 6f 70 65  ing the LIKE ope
1a680 72 61 74 6f 72 2e 22 2c 0a 23 69 66 64 65 66 20  rator.",.#ifdef 
1a690 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
1a6a0 54 52 41 43 45 0a 20 20 22 2e 69 6f 74 72 61 63  TRACE.  ".iotrac
1a6b0 65 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20  e FILE          
1a6c0 20 20 45 6e 61 62 6c 65 20 49 2f 4f 20 64 69 61    Enable I/O dia
1a6d0 67 6e 6f 73 74 69 63 20 6c 6f 67 67 69 6e 67 20  gnostic logging 
1a6e0 74 6f 20 46 49 4c 45 22 2c 0a 23 65 6e 64 69 66  to FILE",.#endif
1a6f0 0a 20 20 22 2e 6c 69 6d 69 74 20 3f 4c 49 4d 49  .  ".limit ?LIMI
1a700 54 3f 20 3f 56 41 4c 3f 20 20 20 20 20 44 69 73  T? ?VAL?     Dis
1a710 70 6c 61 79 20 6f 72 20 63 68 61 6e 67 65 20 74  play or change t
1a720 68 65 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 53  he value of an S
1a730 51 4c 49 54 45 5f 4c 49 4d 49 54 22 2c 0a 20 20  QLITE_LIMIT",.  
1a740 22 2e 6c 69 6e 74 20 4f 50 54 49 4f 4e 53 20 20  ".lint OPTIONS  
1a750 20 20 20 20 20 20 20 20 20 20 52 65 70 6f 72 74            Report
1a760 20 70 6f 74 65 6e 74 69 61 6c 20 73 63 68 65 6d   potential schem
1a770 61 20 69 73 73 75 65 73 2e 22 2c 0a 20 20 22 20  a issues.",.  " 
1a780 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20      Options:",. 
1a790 20 22 20 20 20 20 20 20 20 20 66 6b 65 79 2d 69   "        fkey-i
1a7a0 6e 64 65 78 65 73 20 20 20 20 20 46 69 6e 64 20  ndexes     Find 
1a7b0 6d 69 73 73 69 6e 67 20 66 6f 72 65 69 67 6e 20  missing foreign 
1a7c0 6b 65 79 20 69 6e 64 65 78 65 73 22 2c 0a 23 69  key indexes",.#i
1a7d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a7e0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
1a7f0 0a 20 20 22 2e 6c 6f 61 64 20 46 49 4c 45 20 3f  .  ".load FILE ?
1a800 45 4e 54 52 59 3f 20 20 20 20 20 20 20 4c 6f 61  ENTRY?       Loa
1a810 64 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e 20 6c  d an extension l
1a820 69 62 72 61 72 79 22 2c 0a 23 65 6e 64 69 66 0a  ibrary",.#endif.
1a830 20 20 22 2e 6c 6f 67 20 46 49 4c 45 7c 6f 66 66    ".log FILE|off
1a840 20 20 20 20 20 20 20 20 20 20 20 20 54 75 72 6e              Turn
1a850 20 6c 6f 67 67 69 6e 67 20 6f 6e 20 6f 72 20 6f   logging on or o
1a860 66 66 2e 20 20 46 49 4c 45 20 63 61 6e 20 62 65  ff.  FILE can be
1a870 20 73 74 64 65 72 72 2f 73 74 64 6f 75 74 22 2c   stderr/stdout",
1a880 0a 20 20 22 2e 6d 6f 64 65 20 4d 4f 44 45 20 3f  .  ".mode MODE ?
1a890 54 41 42 4c 45 3f 20 20 20 20 20 20 20 53 65 74  TABLE?       Set
1a8a0 20 6f 75 74 70 75 74 20 6d 6f 64 65 22 2c 0a 20   output mode",. 
1a8b0 20 22 20 20 20 4d 4f 44 45 20 69 73 20 6f 6e 65   "   MODE is one
1a8c0 20 6f 66 3a 22 2c 0a 20 20 22 20 20 20 20 20 61   of:",.  "     a
1a8d0 73 63 69 69 20 20 20 20 43 6f 6c 75 6d 6e 73 2f  scii    Columns/
1a8e0 72 6f 77 73 20 64 65 6c 69 6d 69 74 65 64 20 62  rows delimited b
1a8f0 79 20 30 78 31 46 20 61 6e 64 20 30 78 31 45 22  y 0x1F and 0x1E"
1a900 2c 0a 20 20 22 20 20 20 20 20 63 73 76 20 20 20  ,.  "     csv   
1a910 20 20 20 43 6f 6d 6d 61 2d 73 65 70 61 72 61 74     Comma-separat
1a920 65 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 22 20  ed values",.  " 
1a930 20 20 20 20 63 6f 6c 75 6d 6e 20 20 20 4c 65 66      column   Lef
1a940 74 2d 61 6c 69 67 6e 65 64 20 63 6f 6c 75 6d 6e  t-aligned column
1a950 73 2e 20 20 28 53 65 65 20 2e 77 69 64 74 68 29  s.  (See .width)
1a960 22 2c 0a 20 20 22 20 20 20 20 20 68 74 6d 6c 20  ",.  "     html 
1a970 20 20 20 20 48 54 4d 4c 20 3c 74 61 62 6c 65 3e      HTML <table>
1a980 20 63 6f 64 65 22 2c 0a 20 20 22 20 20 20 20 20   code",.  "     
1a990 69 6e 73 65 72 74 20 20 20 53 51 4c 20 69 6e 73  insert   SQL ins
1a9a0 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 66  ert statements f
1a9b0 6f 72 20 54 41 42 4c 45 22 2c 0a 20 20 22 20 20  or TABLE",.  "  
1a9c0 20 20 20 6c 69 6e 65 20 20 20 20 20 4f 6e 65 20     line     One 
1a9d0 76 61 6c 75 65 20 70 65 72 20 6c 69 6e 65 22 2c  value per line",
1a9e0 0a 20 20 22 20 20 20 20 20 6c 69 73 74 20 20 20  .  "     list   
1a9f0 20 20 56 61 6c 75 65 73 20 64 65 6c 69 6d 69 74    Values delimit
1aa00 65 64 20 62 79 20 5c 22 7c 5c 22 22 2c 0a 20 20  ed by \"|\"",.  
1aa10 22 20 20 20 20 20 71 75 6f 74 65 20 20 20 20 45  "     quote    E
1aa20 73 63 61 70 65 20 61 6e 73 77 65 72 73 20 61 73  scape answers as
1aa30 20 66 6f 72 20 53 51 4c 22 2c 0a 20 20 22 20 20   for SQL",.  "  
1aa40 20 20 20 74 61 62 73 20 20 20 20 20 54 61 62 2d     tabs     Tab-
1aa50 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65 73  separated values
1aa60 22 2c 0a 20 20 22 20 20 20 20 20 74 63 6c 20 20  ",.  "     tcl  
1aa70 20 20 20 20 54 43 4c 20 6c 69 73 74 20 65 6c 65      TCL list ele
1aa80 6d 65 6e 74 73 22 2c 0a 20 20 22 2e 6e 75 6c 6c  ments",.  ".null
1aa90 76 61 6c 75 65 20 53 54 52 49 4e 47 20 20 20 20  value STRING    
1aaa0 20 20 20 20 55 73 65 20 53 54 52 49 4e 47 20 69      Use STRING i
1aab0 6e 20 70 6c 61 63 65 20 6f 66 20 4e 55 4c 4c 20  n place of NULL 
1aac0 76 61 6c 75 65 73 22 2c 0a 20 20 22 2e 6f 6e 63  values",.  ".onc
1aad0 65 20 28 2d 65 7c 2d 78 7c 46 49 4c 45 29 20 20  e (-e|-x|FILE)  
1aae0 20 20 20 20 20 4f 75 74 70 75 74 20 66 6f 72 20       Output for 
1aaf0 74 68 65 20 6e 65 78 74 20 53 51 4c 20 63 6f 6d  the next SQL com
1ab00 6d 61 6e 64 20 6f 6e 6c 79 20 74 6f 20 46 49 4c  mand only to FIL
1ab10 45 22 2c 0a 20 20 22 20 20 20 20 20 49 66 20 46  E",.  "     If F
1ab20 49 4c 45 20 62 65 67 69 6e 73 20 77 69 74 68 20  ILE begins with 
1ab30 27 7c 27 20 74 68 65 6e 20 6f 70 65 6e 20 61 73  '|' then open as
1ab40 20 61 20 70 69 70 65 22 2c 0a 20 20 22 20 20 20   a pipe",.  "   
1ab50 20 20 4f 74 68 65 72 20 6f 70 74 69 6f 6e 73 3a    Other options:
1ab60 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 65 20  ",.  "       -e 
1ab70 20 20 20 49 6e 76 6f 6b 65 20 73 79 73 74 65 6d     Invoke system
1ab80 20 74 65 78 74 20 65 64 69 74 6f 72 22 2c 0a 20   text editor",. 
1ab90 20 22 20 20 20 20 20 20 20 2d 78 20 20 20 20 4f   "       -x    O
1aba0 70 65 6e 20 69 6e 20 61 20 73 70 72 65 61 64 73  pen in a spreads
1abb0 68 65 65 74 22 2c 0a 20 20 22 2e 6f 70 65 6e 20  heet",.  ".open 
1abc0 3f 4f 50 54 49 4f 4e 53 3f 20 3f 46 49 4c 45 3f  ?OPTIONS? ?FILE?
1abd0 20 20 20 43 6c 6f 73 65 20 65 78 69 73 74 69 6e     Close existin
1abe0 67 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  g database and r
1abf0 65 6f 70 65 6e 20 46 49 4c 45 22 2c 0a 20 20 22  eopen FILE",.  "
1ac00 20 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a       Options:",.
1ac10 20 20 22 20 20 20 20 20 20 20 20 2d 2d 61 70 70    "        --app
1ac20 65 6e 64 20 20 20 20 20 20 20 20 55 73 65 20 61  end        Use a
1ac30 70 70 65 6e 64 76 66 73 20 74 6f 20 61 70 70 65  ppendvfs to appe
1ac40 6e 64 20 64 61 74 61 62 61 73 65 20 74 6f 20 74  nd database to t
1ac50 68 65 20 65 6e 64 20 6f 66 20 46 49 4c 45 22 2c  he end of FILE",
1ac60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1ac70 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a  NABLE_DESERIALIZ
1ac80 45 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d 64  E.  "        --d
1ac90 65 73 65 72 69 61 6c 69 7a 65 20 20 20 4c 6f 61  eserialize   Loa
1aca0 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 75 73  d into memory us
1acb0 65 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 65 73  eing sqlite3_des
1acc0 65 72 69 61 6c 69 7a 65 28 29 22 2c 0a 20 20 22  erialize()",.  "
1acd0 20 20 20 20 20 20 20 20 2d 2d 68 65 78 64 62 20          --hexdb 
1ace0 20 20 20 20 20 20 20 20 4c 6f 61 64 20 74 68 65          Load the
1acf0 20 6f 75 74 70 75 74 20 6f 66 20 5c 22 64 62 74   output of \"dbt
1ad00 6f 74 78 74 5c 22 20 61 73 20 61 6e 20 69 6e 2d  otxt\" as an in-
1ad10 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 22  memory database"
1ad20 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d 6d  ,.  "        --m
1ad30 61 78 73 69 7a 65 20 4e 20 20 20 20 20 4d 61 78  axsize N     Max
1ad40 69 6d 75 6d 20 73 69 7a 65 20 66 6f 72 20 2d 2d  imum size for --
1ad50 68 65 78 64 62 20 6f 72 20 2d 2d 64 65 73 65 72  hexdb or --deser
1ad60 69 61 6c 69 7a 65 64 20 64 61 74 61 62 61 73 65  ialized database
1ad70 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 20 20 20  ",.#endif.  "   
1ad80 20 20 20 20 20 2d 2d 6e 65 77 20 20 20 20 20 20       --new      
1ad90 20 20 20 20 20 49 6e 69 74 69 61 6c 69 7a 65 20       Initialize 
1ada0 46 49 4c 45 20 74 6f 20 61 6e 20 65 6d 70 74 79  FILE to an empty
1adb0 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 22 20   database",.  " 
1adc0 20 20 20 20 20 20 20 2d 2d 72 65 61 64 6f 6e 6c         --readonl
1add0 79 20 20 20 20 20 20 4f 70 65 6e 20 46 49 4c 45  y      Open FILE
1ade0 20 72 65 61 64 6f 6e 6c 79 22 2c 0a 20 20 22 20   readonly",.  " 
1adf0 20 20 20 20 20 20 20 2d 2d 7a 69 70 20 20 20 20         --zip    
1ae00 20 20 20 20 20 20 20 46 49 4c 45 20 69 73 20 61         FILE is a
1ae10 20 5a 49 50 20 61 72 63 68 69 76 65 22 2c 0a 20   ZIP archive",. 
1ae20 20 22 2e 6f 75 74 70 75 74 20 3f 46 49 4c 45 3f   ".output ?FILE?
1ae30 20 20 20 20 20 20 20 20 20 20 20 53 65 6e 64 20             Send 
1ae40 6f 75 74 70 75 74 20 74 6f 20 46 49 4c 45 20 6f  output to FILE o
1ae50 72 20 73 74 64 6f 75 74 20 69 66 20 46 49 4c 45  r stdout if FILE
1ae60 20 69 73 20 6f 6d 69 74 74 65 64 22 2c 0a 20 20   is omitted",.  
1ae70 22 20 20 20 20 20 49 66 20 46 49 4c 45 20 62 65  "     If FILE be
1ae80 67 69 6e 73 20 77 69 74 68 20 27 7c 27 20 74 68  gins with '|' th
1ae90 65 6e 20 6f 70 65 6e 20 69 74 20 61 73 20 61 20  en open it as a 
1aea0 70 69 70 65 2e 22 2c 0a 20 20 22 2e 70 72 69 6e  pipe.",.  ".prin
1aeb0 74 20 53 54 52 49 4e 47 2e 2e 2e 20 20 20 20 20  t STRING...     
1aec0 20 20 20 20 50 72 69 6e 74 20 6c 69 74 65 72 61      Print litera
1aed0 6c 20 53 54 52 49 4e 47 22 2c 0a 20 20 22 2e 70  l STRING",.  ".p
1aee0 72 6f 67 72 65 73 73 20 4e 20 20 20 20 20 20 20  rogress N       
1aef0 20 20 20 20 20 20 20 49 6e 76 6f 6b 65 20 70 72         Invoke pr
1af00 6f 67 72 65 73 73 20 68 61 6e 64 6c 65 72 20 61  ogress handler a
1af10 66 74 65 72 20 65 76 65 72 79 20 4e 20 6f 70 63  fter every N opc
1af20 6f 64 65 73 22 2c 0a 20 20 22 20 20 20 2d 2d 6c  odes",.  "   --l
1af30 69 6d 69 74 20 4e 20 20 20 20 20 20 20 20 20 20  imit N          
1af40 20 20 20 20 20 20 20 49 6e 74 65 72 72 75 70 74         Interrupt
1af50 20 61 66 74 65 72 20 4e 20 70 72 6f 67 72 65 73   after N progres
1af60 73 20 63 61 6c 6c 62 61 63 6b 73 22 2c 0a 20 20  s callbacks",.  
1af70 22 20 20 20 2d 2d 6f 6e 63 65 20 20 20 20 20 20  "   --once      
1af80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44 6f                Do
1af90 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
1afa0 65 20 70 72 6f 67 72 65 73 73 20 69 6e 74 65 72  e progress inter
1afb0 72 75 70 74 22 2c 0a 20 20 22 20 20 20 2d 2d 71  rupt",.  "   --q
1afc0 75 69 65 74 7c 2d 71 20 20 20 20 20 20 20 20 20  uiet|-q         
1afd0 20 20 20 20 20 20 20 4e 6f 20 6f 75 74 70 75 74         No output
1afe0 20 65 78 63 65 70 74 20 61 74 20 69 6e 74 65 72   except at inter
1aff0 72 75 70 74 73 22 2c 0a 20 20 22 20 20 20 2d 2d  rupts",.  "   --
1b000 72 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20  reset           
1b010 20 20 20 20 20 20 20 20 52 65 73 65 74 20 74 68          Reset th
1b020 65 20 63 6f 75 6e 74 20 66 6f 72 20 65 61 63 68  e count for each
1b030 20 69 6e 70 75 74 20 61 6e 64 20 69 6e 74 65 72   input and inter
1b040 72 75 70 74 22 2c 0a 20 20 22 2e 70 72 6f 6d 70  rupt",.  ".promp
1b050 74 20 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45 20  t MAIN CONTINUE 
1b060 20 20 20 52 65 70 6c 61 63 65 20 74 68 65 20 73     Replace the s
1b070 74 61 6e 64 61 72 64 20 70 72 6f 6d 70 74 73 22  tandard prompts"
1b080 2c 0a 20 20 22 2e 71 75 69 74 20 20 20 20 20 20  ,.  ".quit      
1b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
1b0a0 69 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d 22  it this program"
1b0b0 2c 0a 20 20 22 2e 72 65 61 64 20 46 49 4c 45 20  ,.  ".read FILE 
1b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65                Re
1b0d0 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 46 49  ad input from FI
1b0e0 4c 45 22 2c 0a 20 20 22 2e 72 65 73 74 6f 72 65  LE",.  ".restore
1b0f0 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20 20 20   ?DB? FILE      
1b100 20 52 65 73 74 6f 72 65 20 63 6f 6e 74 65 6e 74   Restore content
1b110 20 6f 66 20 44 42 20 28 64 65 66 61 75 6c 74 20   of DB (default 
1b120 5c 22 6d 61 69 6e 5c 22 29 20 66 72 6f 6d 20 46  \"main\") from F
1b130 49 4c 45 22 2c 0a 20 20 22 2e 73 61 76 65 20 46  ILE",.  ".save F
1b140 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  ILE             
1b150 20 20 57 72 69 74 65 20 69 6e 2d 6d 65 6d 6f 72    Write in-memor
1b160 79 20 64 61 74 61 62 61 73 65 20 69 6e 74 6f 20  y database into 
1b170 46 49 4c 45 22 2c 0a 20 20 22 2e 73 63 61 6e 73  FILE",.  ".scans
1b180 74 61 74 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20  tats on|off     
1b190 20 20 20 54 75 72 6e 20 73 71 6c 69 74 65 33 5f     Turn sqlite3_
1b1a0 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
1b1b0 29 20 6d 65 74 72 69 63 73 20 6f 6e 20 6f 72 20  ) metrics on or 
1b1c0 6f 66 66 22 2c 0a 20 20 22 2e 73 63 68 65 6d 61  off",.  ".schema
1b1d0 20 3f 50 41 54 54 45 52 4e 3f 20 20 20 20 20 20   ?PATTERN?      
1b1e0 20 20 53 68 6f 77 20 74 68 65 20 43 52 45 41 54    Show the CREAT
1b1f0 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6d 61 74  E statements mat
1b200 63 68 69 6e 67 20 50 41 54 54 45 52 4e 22 2c 0a  ching PATTERN",.
1b210 20 20 22 20 20 20 20 20 4f 70 74 69 6f 6e 73 3a    "     Options:
1b220 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20 2d  ",.  "         -
1b230 2d 69 6e 64 65 6e 74 20 20 20 20 20 20 20 20 20  -indent         
1b240 20 20 20 54 72 79 20 74 6f 20 70 72 65 74 74 79     Try to pretty
1b250 2d 70 72 69 6e 74 20 74 68 65 20 73 63 68 65 6d  -print the schem
1b260 61 22 2c 0a 20 20 22 2e 73 65 6c 66 74 65 73 74  a",.  ".selftest
1b270 20 3f 4f 50 54 49 4f 4e 53 3f 20 20 20 20 20 20   ?OPTIONS?      
1b280 52 75 6e 20 74 65 73 74 73 20 64 65 66 69 6e 65  Run tests define
1b290 64 20 69 6e 20 74 68 65 20 53 45 4c 46 54 45 53  d in the SELFTES
1b2a0 54 20 74 61 62 6c 65 22 2c 0a 20 20 22 20 20 20  T table",.  "   
1b2b0 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20   Options:",.  " 
1b2c0 20 20 20 20 20 20 2d 2d 69 6e 69 74 20 20 20 20        --init    
1b2d0 20 20 20 20 20 20 20 20 20 20 20 43 72 65 61 74             Creat
1b2e0 65 20 61 20 6e 65 77 20 53 45 4c 46 54 45 53 54  e a new SELFTEST
1b2f0 20 74 61 62 6c 65 22 2c 0a 20 20 22 20 20 20 20   table",.  "    
1b300 20 20 20 2d 76 20 20 20 20 20 20 20 20 20 20 20     -v           
1b310 20 20 20 20 20 20 20 20 56 65 72 62 6f 73 65 20          Verbose 
1b320 6f 75 74 70 75 74 22 2c 0a 20 20 22 2e 73 65 70  output",.  ".sep
1b330 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f  arator COL ?ROW?
1b340 20 20 20 20 20 43 68 61 6e 67 65 20 74 68 65 20       Change the 
1b350 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 6f 77 20 73  column and row s
1b360 65 70 61 72 61 74 6f 72 73 22 2c 0a 23 69 66 20  eparators",.#if 
1b370 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1b380 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20  NABLE_SESSION). 
1b390 20 22 2e 73 65 73 73 69 6f 6e 20 3f 4e 41 4d 45   ".session ?NAME
1b3a0 3f 20 43 4d 44 20 2e 2e 2e 20 20 43 72 65 61 74  ? CMD ...  Creat
1b3b0 65 20 6f 72 20 63 6f 6e 74 72 6f 6c 20 73 65 73  e or control ses
1b3c0 73 69 6f 6e 73 22 2c 0a 20 20 22 20 20 20 53 75  sions",.  "   Su
1b3d0 62 63 6f 6d 6d 61 6e 64 73 3a 22 2c 0a 20 20 22  bcommands:",.  "
1b3e0 20 20 20 20 20 61 74 74 61 63 68 20 54 41 42 4c       attach TABL
1b3f0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 41 74  E             At
1b400 74 61 63 68 20 54 41 42 4c 45 22 2c 0a 20 20 22  tach TABLE",.  "
1b410 20 20 20 20 20 63 68 61 6e 67 65 73 65 74 20 46       changeset F
1b420 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 57 72  ILE           Wr
1b430 69 74 65 20 61 20 63 68 61 6e 67 65 73 65 74 20  ite a changeset 
1b440 69 6e 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20  into FILE",.  " 
1b450 20 20 20 20 63 6c 6f 73 65 20 20 20 20 20 20 20      close       
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f               Clo
1b470 73 65 20 6f 6e 65 20 73 65 73 73 69 6f 6e 22 2c  se one session",
1b480 0a 20 20 22 20 20 20 20 20 65 6e 61 62 6c 65 20  .  "     enable 
1b490 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20  ?BOOLEAN?       
1b4a0 20 20 53 65 74 20 6f 72 20 71 75 65 72 79 20 74    Set or query t
1b4b0 68 65 20 65 6e 61 62 6c 65 20 62 69 74 22 2c 0a  he enable bit",.
1b4c0 20 20 22 20 20 20 20 20 66 69 6c 74 65 72 20 47    "     filter G
1b4d0 4c 4f 42 2e 2e 2e 20 20 20 20 20 20 20 20 20 20  LOB...          
1b4e0 20 52 65 6a 65 63 74 20 74 61 62 6c 65 73 20 6d   Reject tables m
1b4f0 61 74 63 68 69 6e 67 20 47 4c 4f 42 73 22 2c 0a  atching GLOBs",.
1b500 20 20 22 20 20 20 20 20 69 6e 64 69 72 65 63 74    "     indirect
1b510 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20   ?BOOLEAN?      
1b520 20 4d 61 72 6b 20 6f 72 20 71 75 65 72 79 20 74   Mark or query t
1b530 68 65 20 69 6e 64 69 72 65 63 74 20 73 74 61 74  he indirect stat
1b540 75 73 22 2c 0a 20 20 22 20 20 20 20 20 69 73 65  us",.  "     ise
1b550 6d 70 74 79 20 20 20 20 20 20 20 20 20 20 20 20  mpty            
1b560 20 20 20 20 20 20 51 75 65 72 79 20 77 68 65 74        Query whet
1b570 68 65 72 20 74 68 65 20 73 65 73 73 69 6f 6e 20  her the session 
1b580 69 73 20 65 6d 70 74 79 22 2c 0a 20 20 22 20 20  is empty",.  "  
1b590 20 20 20 6c 69 73 74 20 20 20 20 20 20 20 20 20     list         
1b5a0 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74              List
1b5b0 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
1b5c0 73 65 73 73 69 6f 6e 20 6e 61 6d 65 73 22 2c 0a  session names",.
1b5d0 20 20 22 20 20 20 20 20 6f 70 65 6e 20 44 42 20    "     open DB 
1b5e0 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 20 20  NAME            
1b5f0 20 4f 70 65 6e 20 61 20 6e 65 77 20 73 65 73 73   Open a new sess
1b600 69 6f 6e 20 6f 6e 20 44 42 22 2c 0a 20 20 22 20  ion on DB",.  " 
1b610 20 20 20 20 70 61 74 63 68 73 65 74 20 46 49 4c      patchset FIL
1b620 45 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69  E            Wri
1b630 74 65 20 61 20 70 61 74 63 68 73 65 74 20 69 6e  te a patchset in
1b640 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20  to FILE",.  "   
1b650 49 66 20 3f 4e 41 4d 45 3f 20 69 73 20 6f 6d 69  If ?NAME? is omi
1b660 74 74 65 64 2c 20 74 68 65 20 66 69 72 73 74 20  tted, the first 
1b670 64 65 66 69 6e 65 64 20 73 65 73 73 69 6f 6e 20  defined session 
1b680 69 73 20 75 73 65 64 2e 22 2c 0a 23 65 6e 64 69  is used.",.#endi
1b690 66 0a 20 20 22 2e 73 68 61 33 73 75 6d 20 2e 2e  f.  ".sha3sum ..
1b6a0 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f  .             Co
1b6b0 6d 70 75 74 65 20 61 20 53 48 41 33 20 68 61 73  mpute a SHA3 has
1b6c0 68 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  h of database co
1b6d0 6e 74 65 6e 74 22 2c 0a 20 20 22 20 20 20 20 4f  ntent",.  "    O
1b6e0 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20  ptions:",.  "   
1b6f0 20 20 20 2d 2d 73 63 68 65 6d 61 20 20 20 20 20     --schema     
1b700 20 20 20 20 20 20 20 20 20 41 6c 73 6f 20 68 61           Also ha
1b710 73 68 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  sh the sqlite_ma
1b720 73 74 65 72 20 74 61 62 6c 65 22 2c 0a 20 20 22  ster table",.  "
1b730 20 20 20 20 20 20 2d 2d 73 68 61 33 2d 32 32 34        --sha3-224
1b740 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20              Use 
1b750 74 68 65 20 73 68 61 33 2d 32 32 34 20 61 6c 67  the sha3-224 alg
1b760 6f 72 69 74 68 6d 22 2c 0a 20 20 22 20 20 20 20  orithm",.  "    
1b770 20 20 2d 2d 73 68 61 33 2d 32 35 36 20 20 20 20    --sha3-256    
1b780 20 20 20 20 20 20 20 20 55 73 65 20 74 68 65 20          Use the 
1b790 73 68 61 33 2d 32 35 36 20 61 6c 67 6f 72 69 74  sha3-256 algorit
1b7a0 68 6d 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  hm.  This is the
1b7b0 20 64 65 66 61 75 6c 74 2e 22 2c 0a 20 20 22 20   default.",.  " 
1b7c0 20 20 20 20 20 2d 2d 73 68 61 33 2d 33 38 34 20       --sha3-384 
1b7d0 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20 74             Use t
1b7e0 68 65 20 73 68 61 33 2d 33 38 34 20 61 6c 67 6f  he sha3-384 algo
1b7f0 72 69 74 68 6d 22 2c 0a 20 20 22 20 20 20 20 20  rithm",.  "     
1b800 20 2d 2d 73 68 61 33 2d 35 31 32 20 20 20 20 20   --sha3-512     
1b810 20 20 20 20 20 20 20 55 73 65 20 74 68 65 20 73         Use the s
1b820 68 61 33 2d 35 31 32 20 61 6c 67 6f 72 69 74 68  ha3-512 algorith
1b830 6d 22 2c 0a 20 20 22 20 20 20 20 41 6e 79 20 6f  m",.  "    Any o
1b840 74 68 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73  ther argument is
1b850 20 61 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20   a LIKE pattern 
1b860 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 68 61  for tables to ha
1b870 73 68 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c  sh",.#ifndef SQL
1b880 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45  ITE_NOHAVE_SYSTE
1b890 4d 0a 20 20 22 2e 73 68 65 6c 6c 20 43 4d 44 20  M.  ".shell CMD 
1b8a0 41 52 47 53 2e 2e 2e 20 20 20 20 20 20 20 52 75  ARGS...       Ru
1b8b0 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e  n CMD ARGS... in
1b8c0 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c 22   a system shell"
1b8d0 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73 68 6f  ,.#endif.  ".sho
1b8e0 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w               
1b8f0 20 20 20 20 20 53 68 6f 77 20 74 68 65 20 63 75       Show the cu
1b900 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72  rrent values for
1b910 20 76 61 72 69 6f 75 73 20 73 65 74 74 69 6e 67   various setting
1b920 73 22 2c 0a 20 20 22 2e 73 74 61 74 73 20 3f 6f  s",.  ".stats ?o
1b930 6e 7c 6f 66 66 3f 20 20 20 20 20 20 20 20 20 20  n|off?          
1b940 53 68 6f 77 20 73 74 61 74 73 20 6f 72 20 74 75  Show stats or tu
1b950 72 6e 20 73 74 61 74 73 20 6f 6e 20 6f 72 20 6f  rn stats on or o
1b960 66 66 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c  ff",.#ifndef SQL
1b970 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45  ITE_NOHAVE_SYSTE
1b980 4d 0a 20 20 22 2e 73 79 73 74 65 6d 20 43 4d 44  M.  ".system CMD
1b990 20 41 52 47 53 2e 2e 2e 20 20 20 20 20 20 52 75   ARGS...      Ru
1b9a0 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e  n CMD ARGS... in
1b9b0 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c 22   a system shell"
1b9c0 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 74 61 62  ,.#endif.  ".tab
1b9d0 6c 65 73 20 3f 54 41 42 4c 45 3f 20 20 20 20 20  les ?TABLE?     
1b9e0 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20       List names 
1b9f0 6f 66 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69  of tables matchi
1ba00 6e 67 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20  ng LIKE pattern 
1ba10 54 41 42 4c 45 22 2c 0a 20 20 22 2e 74 65 73 74  TABLE",.  ".test
1ba20 63 61 73 65 20 4e 41 4d 45 20 20 20 20 20 20 20  case NAME       
1ba30 20 20 20 20 42 65 67 69 6e 20 72 65 64 69 72 65      Begin redire
1ba40 63 74 69 6e 67 20 6f 75 74 70 75 74 20 74 6f 20  cting output to 
1ba50 27 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78  'testcase-out.tx
1ba60 74 27 22 2c 0a 20 20 22 2e 74 69 6d 65 6f 75 74  t'",.  ".timeout
1ba70 20 4d 53 20 20 20 20 20 20 20 20 20 20 20 20 20   MS             
1ba80 20 54 72 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63   Try opening loc
1ba90 6b 65 64 20 74 61 62 6c 65 73 20 66 6f 72 20 4d  ked tables for M
1baa0 53 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 22 2c  S milliseconds",
1bab0 0a 20 20 22 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66  .  ".timer on|of
1bac0 66 20 20 20 20 20 20 20 20 20 20 20 20 54 75 72  f            Tur
1bad0 6e 20 53 51 4c 20 74 69 6d 65 72 20 6f 6e 20 6f  n SQL timer on o
1bae0 72 20 6f 66 66 22 2c 0a 23 69 66 6e 64 65 66 20  r off",.#ifndef 
1baf0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
1bb00 45 0a 20 20 22 2e 74 72 61 63 65 20 3f 4f 50 54  E.  ".trace ?OPT
1bb10 49 4f 4e 53 3f 20 20 20 20 20 20 20 20 20 4f 75  IONS?         Ou
1bb20 74 70 75 74 20 65 61 63 68 20 53 51 4c 20 73 74  tput each SQL st
1bb30 61 74 65 6d 65 6e 74 20 61 73 20 69 74 20 69 73  atement as it is
1bb40 20 72 75 6e 22 2c 0a 20 20 22 20 20 20 20 46 49   run",.  "    FI
1bb50 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LE              
1bb60 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75        Send outpu
1bb70 74 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20  t to FILE",.  " 
1bb80 20 20 20 73 74 64 6f 75 74 20 20 20 20 20 20 20     stdout       
1bb90 20 20 20 20 20 20 20 20 20 20 20 53 65 6e 64 20             Send 
1bba0 6f 75 74 70 75 74 20 74 6f 20 73 74 64 6f 75 74  output to stdout
1bbb0 22 2c 0a 20 20 22 20 20 20 20 73 74 64 65 72 72  ",.  "    stderr
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbd0 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f    Send output to
1bbe0 20 73 74 64 65 72 72 22 2c 0a 20 20 22 20 20 20   stderr",.  "   
1bbf0 20 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 20   off            
1bc00 20 20 20 20 20 20 20 20 20 44 69 73 61 62 6c 65           Disable
1bc10 20 74 72 61 63 69 6e 67 22 2c 0a 20 20 22 20 20   tracing",.  "  
1bc20 20 20 2d 2d 65 78 70 61 6e 64 65 64 20 20 20 20    --expanded    
1bc30 20 20 20 20 20 20 20 20 20 20 45 78 70 61 6e 64            Expand
1bc40 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
1bc50 73 22 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54  s",.#ifdef SQLIT
1bc60 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49  E_ENABLE_NORMALI
1bc70 5a 45 0a 20 20 22 20 20 20 20 2d 2d 6e 6f 72 6d  ZE.  "    --norm
1bc80 61 6c 69 7a 65 64 20 20 20 20 20 20 20 20 20 20  alized          
1bc90 20 20 4e 6f 72 6d 61 6c 20 74 68 65 20 53 51 4c    Normal the SQL
1bca0 20 73 74 61 74 65 6d 65 6e 74 73 22 2c 0a 23 65   statements",.#e
1bcb0 6e 64 69 66 0a 20 20 22 20 20 20 20 2d 2d 70 6c  ndif.  "    --pl
1bcc0 61 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ain             
1bcd0 20 20 20 20 53 68 6f 77 20 53 51 4c 20 61 73 20      Show SQL as 
1bce0 69 74 20 69 73 20 69 6e 70 75 74 22 2c 0a 20 20  it is input",.  
1bcf0 22 20 20 20 20 2d 2d 73 74 6d 74 20 20 20 20 20  "    --stmt     
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
1bd10 63 65 20 73 74 61 74 65 6d 65 6e 74 20 65 78 65  ce statement exe
1bd20 63 75 74 69 6f 6e 20 28 53 51 4c 49 54 45 5f 54  cution (SQLITE_T
1bd30 52 41 43 45 5f 53 54 4d 54 29 22 2c 0a 20 20 22  RACE_STMT)",.  "
1bd40 20 20 20 20 2d 2d 70 72 6f 66 69 6c 65 20 20 20      --profile   
1bd50 20 20 20 20 20 20 20 20 20 20 20 20 50 72 6f 66              Prof
1bd60 69 6c 65 20 73 74 61 74 65 6d 65 6e 74 73 20 28  ile statements (
1bd70 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 50 52 4f  SQLITE_TRACE_PRO
1bd80 46 49 4c 45 29 22 2c 0a 20 20 22 20 20 20 20 2d  FILE)",.  "    -
1bd90 2d 72 6f 77 20 20 20 20 20 20 20 20 20 20 20 20  -row            
1bda0 20 20 20 20 20 20 20 54 72 61 63 65 20 65 61 63         Trace eac
1bdb0 68 20 72 6f 77 20 28 53 51 4c 49 54 45 5f 54 52  h row (SQLITE_TR
1bdc0 41 43 45 5f 52 4f 57 29 22 2c 0a 20 20 22 20 20  ACE_ROW)",.  "  
1bdd0 20 20 2d 2d 63 6c 6f 73 65 20 20 20 20 20 20 20    --close       
1bde0 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 20            Trace 
1bdf0 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 6f 73 65  connection close
1be00 20 28 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43   (SQLITE_TRACE_C
1be10 4c 4f 53 45 29 22 2c 0a 23 65 6e 64 69 66 20 2f  LOSE)",.#endif /
1be20 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  * SQLITE_OMIT_TR
1be30 41 43 45 20 2a 2f 0a 20 20 22 2e 76 66 73 69 6e  ACE */.  ".vfsin
1be40 66 6f 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20  fo ?AUX?        
1be50 20 20 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61     Information a
1be60 62 6f 75 74 20 74 68 65 20 74 6f 70 2d 6c 65 76  bout the top-lev
1be70 65 6c 20 56 46 53 22 2c 0a 20 20 22 2e 76 66 73  el VFS",.  ".vfs
1be80 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
1be90 20 20 20 20 20 4c 69 73 74 20 61 6c 6c 20 61 76       List all av
1bea0 61 69 6c 61 62 6c 65 20 56 46 53 65 73 22 2c 0a  ailable VFSes",.
1beb0 20 20 22 2e 76 66 73 6e 61 6d 65 20 3f 41 55 58    ".vfsname ?AUX
1bec0 3f 20 20 20 20 20 20 20 20 20 20 20 50 72 69 6e  ?           Prin
1bed0 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
1bee0 65 20 56 46 53 20 73 74 61 63 6b 22 2c 0a 20 20  e VFS stack",.  
1bef0 22 2e 77 69 64 74 68 20 4e 55 4d 31 20 4e 55 4d  ".width NUM1 NUM
1bf00 32 20 2e 2e 2e 20 20 20 20 20 53 65 74 20 63 6f  2 ...     Set co
1bf10 6c 75 6d 6e 20 77 69 64 74 68 73 20 66 6f 72 20  lumn widths for 
1bf20 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65 22  \"column\" mode"
1bf30 2c 0a 20 20 22 20 20 20 20 20 4e 65 67 61 74 69  ,.  "     Negati
1bf40 76 65 20 76 61 6c 75 65 73 20 72 69 67 68 74 2d  ve values right-
1bf50 6a 75 73 74 69 66 79 22 2c 0a 7d 3b 0a 0a 2f 2a  justify",.};../*
1bf60 0a 2a 2a 20 4f 75 74 70 75 74 20 68 65 6c 70 20  .** Output help 
1bf70 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 7a 50 61 74  text..**.** zPat
1bf80 74 65 72 6e 20 64 65 73 63 72 69 62 65 73 20 74  tern describes t
1bf90 68 65 20 73 65 74 20 6f 66 20 63 6f 6d 6d 61 6e  he set of comman
1bfa0 64 73 20 66 6f 72 20 77 68 69 63 68 20 68 65 6c  ds for which hel
1bfb0 70 20 74 65 78 74 20 69 73 20 70 72 6f 76 69 64  p text is provid
1bfc0 65 64 2e 0a 2a 2a 20 49 66 20 7a 50 61 74 74 65  ed..** If zPatte
1bfd0 72 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  rn is NULL, then
1bfe0 20 73 68 6f 77 20 61 6c 6c 20 63 6f 6d 6d 61 6e   show all comman
1bff0 64 73 2c 20 62 75 74 20 6f 6e 6c 79 20 67 69 76  ds, but only giv
1c000 65 20 61 20 6f 6e 65 2d 6c 69 6e 65 0a 2a 2a 20  e a one-line.** 
1c010 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 65  description of e
1c020 61 63 68 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ach..**.** Retur
1c030 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1c040 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74  matches..*/.stat
1c050 69 63 20 69 6e 74 20 73 68 6f 77 48 65 6c 70 28  ic int showHelp(
1c060 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
1c070 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 29   char *zPattern)
1c080 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  {.  int i = 0;. 
1c090 20 69 6e 74 20 6a 20 3d 20 30 3b 0a 20 20 69 6e   int j = 0;.  in
1c0a0 74 20 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  t n = 0;.  char 
1c0b0 2a 7a 50 61 74 3b 0a 20 20 69 66 28 20 7a 50 61  *zPat;.  if( zPa
1c0c0 74 74 65 72 6e 3d 3d 30 0a 20 20 20 7c 7c 20 7a  ttern==0.   || z
1c0d0 50 61 74 74 65 72 6e 5b 30 5d 3d 3d 27 30 27 0a  Pattern[0]=='0'.
1c0e0 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 50 61     || strcmp(zPa
1c0f0 74 74 65 72 6e 2c 22 2d 61 22 29 3d 3d 30 0a 20  ttern,"-a")==0. 
1c100 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 50 61 74    || strcmp(zPat
1c110 74 65 72 6e 2c 22 2d 61 6c 6c 22 29 3d 3d 30 0a  tern,"-all")==0.
1c120 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 68 6f 77    ){.    /* Show
1c130 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73 2c 20 62   all commands, b
1c140 75 74 20 6f 6e 6c 79 20 6f 6e 65 20 6c 69 6e 65  ut only one line
1c150 20 70 65 72 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a   per command */.
1c160 20 20 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e      if( zPattern
1c170 3d 3d 30 20 29 20 7a 50 61 74 74 65 72 6e 20 3d  ==0 ) zPattern =
1c180 20 22 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   "";.    for(i=0
1c190 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 7a  ; i<ArraySize(az
1c1a0 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  Help); i++){.   
1c1b0 20 20 20 69 66 28 20 61 7a 48 65 6c 70 5b 69 5d     if( azHelp[i]
1c1c0 5b 30 5d 3d 3d 27 2e 27 20 7c 7c 20 7a 50 61 74  [0]=='.' || zPat
1c1d0 74 65 72 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 20  tern[0] ){.     
1c1e0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
1c1f0 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65  ut, "%s\n", azHe
1c200 6c 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  lp[i]);.        
1c210 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
1c220 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1c230 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 63 6f 6d 6d  /* Look for comm
1c240 61 6e 64 73 20 74 68 61 74 20 66 6f 72 20 77 68  ands that for wh
1c250 69 63 68 20 7a 50 61 74 74 65 72 6e 20 69 73 20  ich zPattern is 
1c260 61 6e 20 65 78 61 63 74 20 70 72 65 66 69 78 20  an exact prefix 
1c270 2a 2f 0a 20 20 20 20 7a 50 61 74 20 3d 20 73 71  */.    zPat = sq
1c280 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 2e  lite3_mprintf(".
1c290 25 73 2a 22 2c 20 7a 50 61 74 74 65 72 6e 29 3b  %s*", zPattern);
1c2a0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1c2b0 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70  ArraySize(azHelp
1c2c0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
1c2d0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
1c2e0 6f 62 28 7a 50 61 74 2c 20 61 7a 48 65 6c 70 5b  ob(zPat, azHelp[
1c2f0 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  i])==0 ){.      
1c300 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
1c310 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c  t, "%s\n", azHel
1c320 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6a  p[i]);.        j
1c330 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20 20   = i+1;.        
1c340 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
1c350 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
1c360 72 65 65 28 7a 50 61 74 29 3b 0a 20 20 20 20 69  ree(zPat);.    i
1c370 66 28 20 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  f( n ){.      if
1c380 28 20 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ( n==1 ){.      
1c390 20 20 2f 2a 20 77 68 65 6e 20 7a 50 61 74 74 65    /* when zPatte
1c3a0 72 6e 20 69 73 20 61 20 70 72 65 66 69 78 20 6f  rn is a prefix o
1c3b0 66 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 6f  f exactly one co
1c3c0 6d 6d 61 6e 64 2c 20 74 68 65 6e 20 69 6e 63 6c  mmand, then incl
1c3d0 75 64 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  ude the.        
1c3e0 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 74 68  ** details of th
1c3f0 61 74 20 63 6f 6d 6d 61 6e 64 2c 20 77 68 69 63  at command, whic
1c400 68 20 73 68 6f 75 6c 64 20 62 65 67 69 6e 20 61  h should begin a
1c410 74 20 6f 66 66 73 65 74 20 6a 20 2a 2f 0a 20 20  t offset j */.  
1c420 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 41        while( j<A
1c430 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29  rraySize(azHelp)
1c440 2d 31 20 26 26 20 61 7a 48 65 6c 70 5b 6a 5d 5b  -1 && azHelp[j][
1c450 30 5d 21 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20  0]!='.' ){.     
1c460 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1c470 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a  (out, "%s\n", az
1c480 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  Help[j]);.      
1c490 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
1c4a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1c4b0 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 20 20 7d   return n;.    }
1c4c0 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72  .    /* Look for
1c4d0 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 63   commands that c
1c4e0 6f 6e 74 61 69 6e 20 7a 50 61 74 74 65 72 6e 20  ontain zPattern 
1c4f0 61 6e 79 77 68 65 72 65 2e 20 20 53 68 6f 77 20  anywhere.  Show 
1c500 74 68 65 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20  the complete.   
1c510 20 2a 2a 20 74 65 78 74 20 6f 66 20 61 6c 6c 20   ** text of all 
1c520 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 6d 61  commands that ma
1c530 74 63 68 2e 20 2a 2f 0a 20 20 20 20 7a 50 61 74  tch. */.    zPat
1c540 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1c550 74 66 28 22 25 25 25 73 25 25 22 2c 20 7a 50 61  tf("%%%s%%", zPa
1c560 74 74 65 72 6e 29 3b 0a 20 20 20 20 66 6f 72 28  ttern);.    for(
1c570 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
1c580 28 61 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a  (azHelp); i++){.
1c590 20 20 20 20 20 20 69 66 28 20 61 7a 48 65 6c 70        if( azHelp
1c5a0 5b 69 5d 5b 30 5d 3d 3d 27 2e 27 20 29 20 6a 20  [i][0]=='.' ) j 
1c5b0 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 73  = i;.      if( s
1c5c0 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a  qlite3_strlike(z
1c5d0 50 61 74 2c 20 61 7a 48 65 6c 70 5b 69 5d 2c 20  Pat, azHelp[i], 
1c5e0 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)==0 ){.       
1c5f0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
1c600 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70  , "%s\n", azHelp
1c610 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 77 68  [j]);.        wh
1c620 69 6c 65 28 20 6a 3c 41 72 72 61 79 53 69 7a 65  ile( j<ArraySize
1c630 28 61 7a 48 65 6c 70 29 2d 31 20 26 26 20 61 7a  (azHelp)-1 && az
1c640 48 65 6c 70 5b 6a 2b 31 5d 5b 30 5d 21 3d 27 2e  Help[j+1][0]!='.
1c650 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a  ' ){.          j
1c660 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 75 74  ++;.          ut
1c670 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
1c680 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d  %s\n", azHelp[j]
1c690 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1c6a0 20 20 20 20 20 69 20 3d 20 6a 3b 0a 20 20 20 20       i = j;.    
1c6b0 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d      n++;.      }
1c6c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1c6d0 65 33 5f 66 72 65 65 28 7a 50 61 74 29 3b 0a 20  e3_free(zPat);. 
1c6e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
1c6f0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
1c700 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
1c710 20 69 6e 74 20 70 72 6f 63 65 73 73 5f 69 6e 70   int process_inp
1c720 75 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  ut(ShellState *p
1c730 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  );../*.** Read t
1c740 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69  he content of fi
1c750 6c 65 20 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d 65  le zName into me
1c760 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
1c770 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
1c780 63 36 34 28 29 0a 2a 2a 20 61 6e 64 20 72 65 74  c64().** and ret
1c790 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1c7a0 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 65   the buffer. The
1c7b0 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
1c7c0 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69  nsible for freei
1c7d0 6e 67 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  ng.** the memory
1c7e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
1c7f0 65 74 65 72 20 70 6e 42 79 74 65 20 69 73 20 6e  eter pnByte is n
1c800 6f 74 20 4e 55 4c 4c 2c 20 28 2a 70 6e 42 79 74  ot NULL, (*pnByt
1c810 65 29 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  e) is set to the
1c820 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1c830 0a 2a 2a 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  .** read..**.** 
1c840 46 6f 72 20 63 6f 6e 76 65 6e 69 65 6e 63 65 2c  For convenience,
1c850 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f   a nul-terminato
1c860 72 20 62 79 74 65 20 69 73 20 61 6c 77 61 79 73  r byte is always
1c870 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
1c880 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 66 72   data read.** fr
1c890 6f 6d 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f  om the file befo
1c8a0 72 65 20 74 68 65 20 62 75 66 66 65 72 20 69 73  re the buffer is
1c8b0 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20   returned. This 
1c8c0 62 79 74 65 20 69 73 20 6e 6f 74 20 69 6e 63 6c  byte is not incl
1c8d0 75 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 66  uded in.** the f
1c8e0 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 28 2a  inal value of (*
1c8f0 70 6e 42 79 74 65 29 2c 20 69 66 20 61 70 70 6c  pnByte), if appl
1c900 69 63 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 55  icable..**.** NU
1c910 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  LL is returned i
1c920 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
1c930 6e 63 6f 75 6e 74 65 72 65 64 2e 20 54 68 65 20  ncountered. The 
1c940 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a  final value of *
1c950 70 6e 42 79 74 65 0a 2a 2a 20 69 73 20 75 6e 64  pnByte.** is und
1c960 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63  efined in this c
1c970 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
1c980 68 61 72 20 2a 72 65 61 64 46 69 6c 65 28 63 6f  har *readFile(co
1c990 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1c9a0 20 69 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20   int *pnByte){. 
1c9b0 20 46 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70 65   FILE *in = fope
1c9c0 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a  n(zName, "rb");.
1c9d0 20 20 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20 73 69    long nIn;.  si
1c9e0 7a 65 5f 74 20 6e 52 65 61 64 3b 0a 20 20 63 68  ze_t nRead;.  ch
1c9f0 61 72 20 2a 70 42 75 66 3b 0a 20 20 69 66 28 20  ar *pBuf;.  if( 
1ca00 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  in==0 ) return 0
1ca10 3b 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c  ;.  fseek(in, 0,
1ca20 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 49   SEEK_END);.  nI
1ca30 6e 20 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20  n = ftell(in);. 
1ca40 20 72 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20 70   rewind(in);.  p
1ca50 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Buf = sqlite3_ma
1ca60 6c 6c 6f 63 36 34 28 20 6e 49 6e 2b 31 20 29 3b  lloc64( nIn+1 );
1ca70 0a 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29  .  if( pBuf==0 )
1ca80 7b 20 66 63 6c 6f 73 65 28 69 6e 29 3b 20 72 65  { fclose(in); re
1ca90 74 75 72 6e 20 30 3b 20 7d 0a 20 20 6e 52 65 61  turn 0; }.  nRea
1caa0 64 20 3d 20 66 72 65 61 64 28 70 42 75 66 2c 20  d = fread(pBuf, 
1cab0 6e 49 6e 2c 20 31 2c 20 69 6e 29 3b 0a 20 20 66  nIn, 1, in);.  f
1cac0 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69 66 28  close(in);.  if(
1cad0 20 6e 52 65 61 64 21 3d 31 20 29 7b 0a 20 20 20   nRead!=1 ){.   
1cae0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
1caf0 75 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  uf);.    return 
1cb00 30 3b 0a 20 20 7d 0a 20 20 70 42 75 66 5b 6e 49  0;.  }.  pBuf[nI
1cb10 6e 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 6e  n] = 0;.  if( pn
1cb20 42 79 74 65 20 29 20 2a 70 6e 42 79 74 65 20 3d  Byte ) *pnByte =
1cb30 20 6e 49 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70   nIn;.  return p
1cb40 42 75 66 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  Buf;.}..#if defi
1cb50 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1cb60 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a  E_SESSION)./*.**
1cb70 20 43 6c 6f 73 65 20 61 20 73 69 6e 67 6c 65 20   Close a single 
1cb80 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65  OpenSession obje
1cb90 63 74 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61  ct and release a
1cba0 6c 6c 20 6f 66 20 69 74 73 20 61 73 73 6f 63 69  ll of its associ
1cbb0 61 74 65 64 0a 2a 2a 20 72 65 73 6f 75 72 63 65  ated.** resource
1cbc0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1cbd0 64 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28  d session_close(
1cbe0 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65  OpenSession *pSe
1cbf0 73 73 69 6f 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  ssion){.  int i;
1cc00 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  .  sqlite3sessio
1cc10 6e 5f 64 65 6c 65 74 65 28 70 53 65 73 73 69 6f  n_delete(pSessio
1cc20 6e 2d 3e 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  n->p);.  sqlite3
1cc30 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e  _free(pSession->
1cc40 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d  zName);.  for(i=
1cc50 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e  0; i<pSession->n
1cc60 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20  Filter; i++){.  
1cc70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1cc80 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
1cc90 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  r[i]);.  }.  sql
1cca0 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69  ite3_free(pSessi
1ccb0 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20  on->azFilter);. 
1ccc0 20 6d 65 6d 73 65 74 28 70 53 65 73 73 69 6f 6e   memset(pSession
1ccd0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 70 65 6e  , 0, sizeof(Open
1cce0 53 65 73 73 69 6f 6e 29 29 3b 0a 7d 0a 23 65 6e  Session));.}.#en
1ccf0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  dif../*.** Close
1cd00 20 61 6c 6c 20 4f 70 65 6e 53 65 73 73 69 6f 6e   all OpenSession
1cd10 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 72 65 6c   objects and rel
1cd20 65 61 73 65 20 61 6c 6c 20 61 73 73 6f 63 69 61  ease all associa
1cd30 74 65 64 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a  ted resources..*
1cd40 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
1cd50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
1cd60 49 4f 4e 29 0a 73 74 61 74 69 63 20 76 6f 69 64  ION).static void
1cd70 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61   session_close_a
1cd80 6c 6c 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  ll(ShellState *p
1cd90 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1cda0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73  r(i=0; i<p->nSes
1cdb0 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sion; i++){.    
1cdc0 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 26 70  session_close(&p
1cdd0 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 29 3b 0a  ->aSession[i]);.
1cde0 20 20 7d 0a 20 20 70 2d 3e 6e 53 65 73 73 69 6f    }.  p->nSessio
1cdf0 6e 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23  n = 0;.}.#else.#
1ce00 20 64 65 66 69 6e 65 20 73 65 73 73 69 6f 6e 5f   define session_
1ce10 63 6c 6f 73 65 5f 61 6c 6c 28 58 29 0a 23 65 6e  close_all(X).#en
1ce20 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  dif../*.** Imple
1ce30 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1ce40 20 78 46 69 6c 74 65 72 20 66 75 6e 63 74 69 6f   xFilter functio
1ce50 6e 20 66 6f 72 20 61 6e 20 6f 70 65 6e 20 73 65  n for an open se
1ce60 73 73 69 6f 6e 2e 20 20 4f 6d 69 74 0a 2a 2a 20  ssion.  Omit.** 
1ce70 61 6e 79 20 74 61 62 6c 65 73 20 6e 61 6d 65 64  any tables named
1ce80 20 62 79 20 22 2e 73 65 73 73 69 6f 6e 20 66 69   by ".session fi
1ce90 6c 74 65 72 22 20 62 75 74 20 6c 65 74 20 61 6c  lter" but let al
1cea0 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 20 74 68  l other table th
1ceb0 72 6f 75 67 68 2e 0a 2a 2f 0a 23 69 66 20 64 65  rough..*/.#if de
1cec0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1ced0 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61  BLE_SESSION).sta
1cee0 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 5f  tic int session_
1cef0 66 69 6c 74 65 72 28 76 6f 69 64 20 2a 70 43 74  filter(void *pCt
1cf00 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  x, const char *z
1cf10 54 61 62 29 7b 0a 20 20 4f 70 65 6e 53 65 73 73  Tab){.  OpenSess
1cf20 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20  ion *pSession = 
1cf30 28 4f 70 65 6e 53 65 73 73 69 6f 6e 2a 29 70 43  (OpenSession*)pC
1cf40 74 78 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  tx;.  int i;.  f
1cf50 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73 73 69  or(i=0; i<pSessi
1cf60 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b  on->nFilter; i++
1cf70 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1cf80 65 33 5f 73 74 72 67 6c 6f 62 28 70 53 65 73 73  e3_strglob(pSess
1cf90 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d  ion->azFilter[i]
1cfa0 2c 20 7a 54 61 62 29 3d 3d 30 20 29 20 72 65 74  , zTab)==0 ) ret
1cfb0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
1cfc0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
1cfd0 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65  ./*.** Try to de
1cfe0 64 75 63 65 20 74 68 65 20 74 79 70 65 20 6f 66  duce the type of
1cff0 20 66 69 6c 65 20 66 6f 72 20 7a 4e 61 6d 65 20   file for zName 
1d000 62 61 73 65 64 20 6f 6e 20 69 74 73 20 63 6f 6e  based on its con
1d010 74 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  tent.  Return.**
1d020 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 48 45 4c   one of the SHEL
1d030 4c 5f 4f 50 45 4e 5f 2a 20 63 6f 6e 73 74 61 6e  L_OPEN_* constan
1d040 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ts..**.** If the
1d050 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
1d060 78 69 73 74 20 6f 72 20 69 73 20 65 6d 70 74 79  xist or is empty
1d070 20 62 75 74 20 69 74 73 20 6e 61 6d 65 20 6c 6f   but its name lo
1d080 6f 6b 73 20 6c 69 6b 65 20 61 20 5a 49 50 0a 2a  oks like a ZIP.*
1d090 2a 20 61 72 63 68 69 76 65 20 61 6e 64 20 74 68  * archive and th
1d0a0 65 20 64 66 6c 74 5a 69 70 20 66 6c 61 67 20 69  e dfltZip flag i
1d0b0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 73 73  s true, then ass
1d0c0 75 6d 65 20 69 74 20 69 73 20 61 20 5a 49 50 20  ume it is a ZIP 
1d0d0 61 72 63 68 69 76 65 2e 0a 2a 2a 20 4f 74 68 65  archive..** Othe
1d0e0 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 61 6e  rwise, assume an
1d0f0 20 6f 72 64 69 6e 61 72 79 20 64 61 74 61 62 61   ordinary databa
1d100 73 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  se regardless of
1d110 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 69 66   the filename if
1d120 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 63 61 6e  .** the type can
1d130 6e 6f 74 20 62 65 20 64 65 74 65 72 6d 69 6e 65  not be determine
1d140 64 20 66 72 6f 6d 20 63 6f 6e 74 65 6e 74 2e 0a  d from content..
1d150 2a 2f 0a 69 6e 74 20 64 65 64 75 63 65 44 61 74  */.int deduceDat
1d160 61 62 61 73 65 54 79 70 65 28 63 6f 6e 73 74 20  abaseType(const 
1d170 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
1d180 20 64 66 6c 74 5a 69 70 29 7b 0a 20 20 46 49 4c   dfltZip){.  FIL
1d190 45 20 2a 66 20 3d 20 66 6f 70 65 6e 28 7a 4e 61  E *f = fopen(zNa
1d1a0 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 73 69 7a  me, "rb");.  siz
1d1b0 65 5f 74 20 6e 3b 0a 20 20 69 6e 74 20 72 63 20  e_t n;.  int rc 
1d1c0 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53  = SHELL_OPEN_UNS
1d1d0 50 45 43 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  PEC;.  char zBuf
1d1e0 5b 31 30 30 5d 3b 0a 20 20 69 66 28 20 66 3d 3d  [100];.  if( f==
1d1f0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 66 6c  0 ){.    if( dfl
1d200 74 5a 69 70 20 26 26 20 73 71 6c 69 74 65 33 5f  tZip && sqlite3_
1d210 73 74 72 6c 69 6b 65 28 22 25 2e 7a 69 70 22 2c  strlike("%.zip",
1d220 7a 4e 61 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a 20  zName,0)==0 ){. 
1d230 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 48 45        return SHE
1d240 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b  LL_OPEN_ZIPFILE;
1d250 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d260 20 20 20 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f     return SHELL_
1d270 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  OPEN_NORMAL;.   
1d280 20 7d 0a 20 20 7d 0a 20 20 6e 20 3d 20 66 72 65   }.  }.  n = fre
1d290 61 64 28 7a 42 75 66 2c 20 31 36 2c 20 31 2c 20  ad(zBuf, 16, 1, 
1d2a0 66 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31 20 26  f);.  if( n==1 &
1d2b0 26 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 22  & memcmp(zBuf, "
1d2c0 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 22  SQLite format 3"
1d2d0 2c 20 31 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 16)==0 ){.    
1d2e0 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 20 20 72  fclose(f);.    r
1d2f0 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e  eturn SHELL_OPEN
1d300 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 66  _NORMAL;.  }.  f
1d310 73 65 65 6b 28 66 2c 20 2d 32 35 2c 20 53 45 45  seek(f, -25, SEE
1d320 4b 5f 45 4e 44 29 3b 0a 20 20 6e 20 3d 20 66 72  K_END);.  n = fr
1d330 65 61 64 28 7a 42 75 66 2c 20 32 35 2c 20 31 2c  ead(zBuf, 25, 1,
1d340 20 66 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31 20   f);.  if( n==1 
1d350 26 26 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20  && memcmp(zBuf, 
1d360 22 53 74 61 72 74 2d 4f 66 2d 53 51 4c 69 74 65  "Start-Of-SQLite
1d370 33 2d 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20  3-", 17)==0 ){. 
1d380 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50     rc = SHELL_OP
1d390 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20  EN_APPENDVFS;.  
1d3a0 7d 65 6c 73 65 7b 0a 20 20 20 20 66 73 65 65 6b  }else{.    fseek
1d3b0 28 66 2c 20 2d 32 32 2c 20 53 45 45 4b 5f 45 4e  (f, -22, SEEK_EN
1d3c0 44 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61  D);.    n = frea
1d3d0 64 28 7a 42 75 66 2c 20 32 32 2c 20 31 2c 20 66  d(zBuf, 22, 1, f
1d3e0 29 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 31 20  );.    if( n==1 
1d3f0 26 26 20 7a 42 75 66 5b 30 5d 3d 3d 30 78 35 30  && zBuf[0]==0x50
1d400 20 26 26 20 7a 42 75 66 5b 31 5d 3d 3d 30 78 34   && zBuf[1]==0x4
1d410 62 20 26 26 20 7a 42 75 66 5b 32 5d 3d 3d 30 78  b && zBuf[2]==0x
1d420 30 35 0a 20 20 20 20 20 20 20 26 26 20 7a 42 75  05.       && zBu
1d430 66 5b 33 5d 3d 3d 30 78 30 36 20 29 7b 0a 20 20  f[3]==0x06 ){.  
1d440 20 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f      rc = SHELL_O
1d450 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20  PEN_ZIPFILE;.   
1d460 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 30 20   }else if( n==0 
1d470 26 26 20 64 66 6c 74 5a 69 70 20 26 26 20 73 71  && dfltZip && sq
1d480 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 25  lite3_strlike("%
1d490 2e 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29 3d 3d  .zip",zName,0)==
1d4a0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1d4b0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49  SHELL_OPEN_ZIPFI
1d4c0 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LE;.    }.  }.  
1d4d0 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 72 65 74  fclose(f);.  ret
1d4e0 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 23 69 66  urn rc;  .}..#if
1d4f0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1d500 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a 2f 2a  E_DESERIALIZE./*
1d510 0a 2a 2a 20 52 65 63 6f 6e 73 74 72 75 63 74 20  .** Reconstruct 
1d520 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
1d530 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
1d540 6f 75 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20  output from the 
1d550 22 64 62 74 6f 74 78 74 22 0a 2a 2a 20 70 72 6f  "dbtotxt".** pro
1d560 67 72 61 6d 2e 20 20 52 65 61 64 20 63 6f 6e 74  gram.  Read cont
1d570 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ent from the fil
1d580 65 20 69 6e 20 70 2d 3e 7a 44 62 46 69 6c 65 6e  e in p->zDbFilen
1d590 61 6d 65 2e 20 20 49 66 20 70 2d 3e 7a 44 62 46  ame.  If p->zDbF
1d5a0 69 6c 65 6e 61 6d 65 0a 2a 2a 20 69 73 20 30 2c  ilename.** is 0,
1d5b0 20 74 68 65 6e 20 72 65 61 64 20 66 72 6f 6d 20   then read from 
1d5c0 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2e 0a  standard input..
1d5d0 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  */.static unsign
1d5e0 65 64 20 63 68 61 72 20 2a 72 65 61 64 48 65 78  ed char *readHex
1d5f0 44 62 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  Db(ShellState *p
1d600 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61 29 7b 0a  , int *pnData){.
1d610 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1d620 2a 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4c  *a = 0;.  int nL
1d630 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  ine;.  int n = 0
1d640 3b 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 30  ;.  int pgsz = 0
1d650 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20  ;.  int iOffset 
1d660 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b  = 0;.  int j, k;
1d670 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 46 49 4c  .  int rc;.  FIL
1d680 45 20 2a 69 6e 3b 0a 20 20 75 6e 73 69 67 6e 65  E *in;.  unsigne
1d690 64 20 63 68 61 72 20 78 5b 31 36 5d 3b 0a 20 20  d char x[16];.  
1d6a0 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30 5d  char zLine[1000]
1d6b0 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 44 62 46 69  ;.  if( p->zDbFi
1d6c0 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e  lename ){.    in
1d6d0 20 3d 20 66 6f 70 65 6e 28 70 2d 3e 7a 44 62 46   = fopen(p->zDbF
1d6e0 69 6c 65 6e 61 6d 65 2c 20 22 72 22 29 3b 0a 20  ilename, "r");. 
1d6f0 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a     if( in==0 ){.
1d700 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
1d710 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f  f(stderr, "canno
1d720 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f  t open \"%s\" fo
1d730 72 20 72 65 61 64 69 6e 67 5c 6e 22 2c 20 70 2d  r reading\n", p-
1d740 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  >zDbFilename);. 
1d750 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1d760 20 20 20 7d 0a 20 20 20 20 6e 4c 69 6e 65 20 3d     }.    nLine =
1d770 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1d780 20 69 6e 20 3d 20 70 2d 3e 69 6e 3b 0a 20 20 20   in = p->in;.   
1d790 20 6e 4c 69 6e 65 20 3d 20 70 2d 3e 6c 69 6e 65   nLine = p->line
1d7a0 6e 6f 3b 0a 20 20 7d 0a 20 20 2a 70 6e 44 61 74  no;.  }.  *pnDat
1d7b0 61 20 3d 20 30 3b 0a 20 20 6e 4c 69 6e 65 2b 2b  a = 0;.  nLine++
1d7c0 3b 0a 20 20 69 66 28 20 66 67 65 74 73 28 7a 4c  ;.  if( fgets(zL
1d7d0 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e  ine, sizeof(zLin
1d7e0 65 29 2c 20 69 6e 29 3d 3d 30 20 29 20 67 6f 74  e), in)==0 ) got
1d7f0 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f  o readHexDb_erro
1d800 72 3b 0a 20 20 72 63 20 3d 20 73 73 63 61 6e 66  r;.  rc = sscanf
1d810 28 7a 4c 69 6e 65 2c 20 22 7c 20 73 69 7a 65 20  (zLine, "| size 
1d820 25 64 20 70 61 67 65 73 69 7a 65 20 25 64 22 2c  %d pagesize %d",
1d830 20 26 6e 2c 20 26 70 67 73 7a 29 3b 0a 20 20 69   &n, &pgsz);.  i
1d840 66 28 20 72 63 21 3d 32 20 29 20 67 6f 74 6f 20  f( rc!=2 ) goto 
1d850 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f 72 3b  readHexDb_error;
1d860 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 20 67 6f  .  if( n<=0 ) go
1d870 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72  to readHexDb_err
1d880 6f 72 3b 0a 20 20 61 20 3d 20 73 71 6c 69 74 65  or;.  a = sqlite
1d890 33 5f 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20  3_malloc( n );. 
1d8a0 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
1d8b0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1d8c0 65 72 72 2c 20 22 4f 75 74 20 6f 66 20 6d 65 6d  err, "Out of mem
1d8d0 6f 72 79 21 5c 6e 22 29 3b 0a 20 20 20 20 67 6f  ory!\n");.    go
1d8e0 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72  to readHexDb_err
1d8f0 6f 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  or;.  }.  memset
1d900 28 61 2c 20 30 2c 20 6e 29 3b 0a 20 20 69 66 28  (a, 0, n);.  if(
1d910 20 70 67 73 7a 3c 35 31 32 20 7c 7c 20 70 67 73   pgsz<512 || pgs
1d920 7a 3e 36 35 35 33 36 20 7c 7c 20 28 70 67 73 7a  z>65536 || (pgsz
1d930 20 26 20 28 70 67 73 7a 2d 31 29 29 21 3d 30 20   & (pgsz-1))!=0 
1d940 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
1d950 74 66 28 73 74 64 65 72 72 2c 20 22 69 6e 76 61  tf(stderr, "inva
1d960 6c 69 64 20 70 61 67 65 73 69 7a 65 5c 6e 22 29  lid pagesize\n")
1d970 3b 0a 20 20 20 20 67 6f 74 6f 20 72 65 61 64 48  ;.    goto readH
1d980 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  exDb_error;.  }.
1d990 20 20 66 6f 72 28 6e 4c 69 6e 65 2b 2b 3b 20 66    for(nLine++; f
1d9a0 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65  gets(zLine, size
1d9b0 6f 66 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 21 3d  of(zLine), in)!=
1d9c0 30 3b 20 6e 4c 69 6e 65 2b 2b 29 7b 0a 20 20 20  0; nLine++){.   
1d9d0 20 72 63 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69   rc = sscanf(zLi
1d9e0 6e 65 2c 20 22 7c 20 70 61 67 65 20 25 64 20 6f  ne, "| page %d o
1d9f0 66 66 73 65 74 20 25 64 22 2c 20 26 6a 2c 20 26  ffset %d", &j, &
1da00 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  k);.    if( rc==
1da10 32 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 73  2 ){.      iOffs
1da20 65 74 20 3d 20 6b 3b 0a 20 20 20 20 20 20 63 6f  et = k;.      co
1da30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
1da40 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4c    if( strncmp(zL
1da50 69 6e 65 2c 20 22 7c 20 65 6e 64 20 22 2c 20 36  ine, "| end ", 6
1da60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  )==0 ){.      br
1da70 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  eak;.    }.    r
1da80 63 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69 6e 65  c = sscanf(zLine
1da90 2c 22 7c 20 25 64 3a 20 25 68 68 78 20 25 68 68  ,"| %d: %hhx %hh
1daa0 78 20 25 68 68 78 20 25 68 68 78 20 25 68 68 78  x %hhx %hhx %hhx
1dab0 20 25 68 68 78 20 25 68 68 78 20 25 68 68 78 22   %hhx %hhx %hhx"
1dac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dad0 20 20 20 20 20 20 20 22 20 20 25 68 68 78 20 25         "  %hhx %
1dae0 68 68 78 20 25 68 68 78 20 25 68 68 78 20 25 68  hhx %hhx %hhx %h
1daf0 68 78 20 25 68 68 78 20 25 68 68 78 20 25 68 68  hx %hhx %hhx %hh
1db00 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
1db10 20 20 20 20 26 6a 2c 20 26 78 5b 30 5d 2c 20 26      &j, &x[0], &
1db20 78 5b 31 5d 2c 20 26 78 5b 32 5d 2c 20 26 78 5b  x[1], &x[2], &x[
1db30 33 5d 2c 20 26 78 5b 34 5d 2c 20 26 78 5b 35 5d  3], &x[4], &x[5]
1db40 2c 20 26 78 5b 36 5d 2c 20 26 78 5b 37 5d 2c 0a  , &x[6], &x[7],.
1db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db60 26 78 5b 38 5d 2c 20 26 78 5b 39 5d 2c 20 26 78  &x[8], &x[9], &x
1db70 5b 31 30 5d 2c 20 26 78 5b 31 31 5d 2c 20 26 78  [10], &x[11], &x
1db80 5b 31 32 5d 2c 20 26 78 5b 31 33 5d 2c 20 26 78  [12], &x[13], &x
1db90 5b 31 34 5d 2c 20 26 78 5b 31 35 5d 29 3b 0a 20  [14], &x[15]);. 
1dba0 20 20 20 69 66 28 20 72 63 3d 3d 31 37 20 29 7b     if( rc==17 ){
1dbb0 0a 20 20 20 20 20 20 6b 20 3d 20 69 4f 66 66 73  .      k = iOffs
1dbc0 65 74 2b 6a 3b 0a 20 20 20 20 20 20 69 66 28 20  et+j;.      if( 
1dbd0 6b 2b 31 36 3c 3d 6e 20 29 7b 0a 20 20 20 20 20  k+16<=n ){.     
1dbe0 20 20 20 6d 65 6d 63 70 79 28 61 2b 6b 2c 20 78     memcpy(a+k, x
1dbf0 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , 16);.      }. 
1dc00 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 6e 44 61     }.  }.  *pnDa
1dc10 74 61 20 3d 20 6e 3b 0a 20 20 69 66 28 20 69 6e  ta = n;.  if( in
1dc20 21 3d 70 2d 3e 69 6e 20 29 7b 0a 20 20 20 20 66  !=p->in ){.    f
1dc30 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 65 6c  close(in);.  }el
1dc40 73 65 7b 0a 20 20 20 20 70 2d 3e 6c 69 6e 65 6e  se{.    p->linen
1dc50 6f 20 3d 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20  o = nLine;.  }. 
1dc60 20 72 65 74 75 72 6e 20 61 3b 0a 0a 72 65 61 64   return a;..read
1dc70 48 65 78 44 62 5f 65 72 72 6f 72 3a 0a 20 20 69  HexDb_error:.  i
1dc80 66 28 20 69 6e 21 3d 73 74 64 69 6e 20 29 7b 0a  f( in!=stdin ){.
1dc90 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
1dca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
1dcb0 6c 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c  le( fgets(zLine,
1dcc0 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20   sizeof(zLine), 
1dcd0 70 2d 3e 69 6e 29 21 3d 30 20 29 7b 0a 20 20 20  p->in)!=0 ){.   
1dce0 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20     nLine++;.    
1dcf0 20 20 69 66 28 73 74 72 6e 63 6d 70 28 7a 4c 69    if(strncmp(zLi
1dd00 6e 65 2c 20 22 7c 20 65 6e 64 20 22 2c 20 36 29  ne, "| end ", 6)
1dd10 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
1dd20 20 7d 0a 20 20 20 20 70 2d 3e 6c 69 6e 65 6e 6f   }.    p->lineno
1dd30 20 3d 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20 20   = nLine;.  }.  
1dd40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b  sqlite3_free(a);
1dd50 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73  .  utf8_printf(s
1dd60 74 64 65 72 72 2c 22 45 72 72 6f 72 20 6f 6e 20  tderr,"Error on 
1dd70 6c 69 6e 65 20 25 64 20 6f 66 20 2d 2d 68 65 78  line %d of --hex
1dd80 64 62 20 69 6e 70 75 74 5c 6e 22 2c 20 6e 4c 69  db input\n", nLi
1dd90 6e 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ne);.  return 0;
1dda0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1ddb0 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52  ITE_ENABLE_DESER
1ddc0 49 41 4c 49 5a 45 20 2a 2f 0a 0a 2f 2a 20 46 6c  IALIZE */../* Fl
1ddd0 61 67 73 20 66 6f 72 20 6f 70 65 6e 5f 64 62 28  ags for open_db(
1dde0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  )..**.** The def
1ddf0 61 75 6c 74 20 62 65 68 61 76 69 6f 72 20 6f 66  ault behavior of
1de00 20 6f 70 65 6e 5f 64 62 28 29 20 69 73 20 74 6f   open_db() is to
1de10 20 65 78 69 74 28 31 29 20 69 66 20 74 68 65 20   exit(1) if the 
1de20 64 61 74 61 62 61 73 65 20 66 61 69 6c 73 20 74  database fails t
1de30 6f 0a 2a 2a 20 6f 70 65 6e 2e 20 20 54 68 65 20  o.** open.  The 
1de40 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56  OPEN_DB_KEEPALIV
1de50 45 20 66 6c 61 67 20 63 68 61 6e 67 65 73 20 74  E flag changes t
1de60 68 61 74 20 73 6f 20 74 68 61 74 20 69 74 20 70  hat so that it p
1de70 72 69 6e 74 73 20 61 6e 20 65 72 72 6f 72 0a 2a  rints an error.*
1de80 2a 20 62 75 74 20 73 74 69 6c 6c 20 72 65 74 75  * but still retu
1de90 72 6e 73 20 77 69 74 68 6f 75 74 20 63 61 6c 6c  rns without call
1dea0 69 6e 67 20 65 78 69 74 2e 0a 2a 2a 0a 2a 2a 20  ing exit..**.** 
1deb0 54 68 65 20 4f 50 45 4e 5f 44 42 5f 5a 49 50 46  The OPEN_DB_ZIPF
1dec0 49 4c 45 20 66 6c 61 67 20 63 61 75 73 65 73 20  ILE flag causes 
1ded0 6f 70 65 6e 5f 64 62 28 29 20 74 6f 20 70 72 65  open_db() to pre
1dee0 66 65 72 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  fer to open file
1def0 73 20 61 73 20 61 0a 2a 2a 20 5a 49 50 20 61 72  s as a.** ZIP ar
1df00 63 68 69 76 65 20 69 66 20 74 68 65 20 66 69 6c  chive if the fil
1df10 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
1df20 20 6f 72 20 69 73 20 65 6d 70 74 79 20 61 6e 64   or is empty and
1df30 20 69 74 73 20 6e 61 6d 65 20 6d 61 74 63 68 65   its name matche
1df40 73 0a 2a 2a 20 74 68 65 20 2a 2e 7a 69 70 20 70  s.** the *.zip p
1df50 61 74 74 65 72 6e 2e 0a 2a 2f 0a 23 64 65 66 69  attern..*/.#defi
1df60 6e 65 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41  ne OPEN_DB_KEEPA
1df70 4c 49 56 45 20 20 20 30 78 30 30 31 20 20 20 2f  LIVE   0x001   /
1df80 2a 20 52 65 74 75 72 6e 20 61 66 74 65 72 20 65  * Return after e
1df90 72 72 6f 72 20 69 66 20 74 72 75 65 20 2a 2f 0a  rror if true */.
1dfa0 23 64 65 66 69 6e 65 20 4f 50 45 4e 5f 44 42 5f  #define OPEN_DB_
1dfb0 5a 49 50 46 49 4c 45 20 20 20 20 20 30 78 30 30  ZIPFILE     0x00
1dfc0 32 20 20 20 2f 2a 20 4f 70 65 6e 20 61 73 20 5a  2   /* Open as Z
1dfd0 49 50 20 69 66 20 6e 61 6d 65 20 6d 61 74 63 68  IP if name match
1dfe0 65 73 20 2a 2e 7a 69 70 20 2a 2f 0a 0a 2f 2a 0a  es *.zip */../*.
1dff0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
1e000 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
1e010 6e 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  n.  If it is not
1e020 2c 20 74 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20  , then open it. 
1e030 20 49 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   If.** the datab
1e040 61 73 65 20 66 61 69 6c 73 20 74 6f 20 6f 70 65  ase fails to ope
1e050 6e 2c 20 70 72 69 6e 74 20 61 6e 20 65 72 72 6f  n, print an erro
1e060 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 65 78  r message and ex
1e070 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
1e080 69 64 20 6f 70 65 6e 5f 64 62 28 53 68 65 6c 6c  id open_db(Shell
1e090 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 6f 70  State *p, int op
1e0a0 65 6e 46 6c 61 67 73 29 7b 0a 20 20 69 66 28 20  enFlags){.  if( 
1e0b0 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20  p->db==0 ){.    
1e0c0 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d  if( p->openMode=
1e0d0 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50  =SHELL_OPEN_UNSP
1e0e0 45 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  EC ){.      if( 
1e0f0 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d  p->zDbFilename==
1e100 30 20 7c 7c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e  0 || p->zDbFilen
1e110 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  ame[0]==0 ){.   
1e120 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65       p->openMode
1e130 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f   = SHELL_OPEN_NO
1e140 52 4d 41 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RMAL;.      }els
1e150 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70  e{.        p->op
1e160 65 6e 4d 6f 64 65 20 3d 20 28 75 38 29 64 65 64  enMode = (u8)ded
1e170 75 63 65 44 61 74 61 62 61 73 65 54 79 70 65 28  uceDatabaseType(
1e180 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  p->zDbFilename, 
1e190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6f                (o
1e1b0 70 65 6e 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f  penFlags & OPEN_
1e1c0 44 42 5f 5a 49 50 46 49 4c 45 29 21 3d 30 29 3b  DB_ZIPFILE)!=0);
1e1d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e1e0 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70     switch( p->op
1e1f0 65 6e 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  enMode ){.      
1e200 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  case SHELL_OPEN_
1e210 41 50 50 45 4e 44 56 46 53 3a 20 7b 0a 20 20 20  APPENDVFS: {.   
1e220 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65       sqlite3_ope
1e230 6e 5f 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e  n_v2(p->zDbFilen
1e240 61 6d 65 2c 20 26 70 2d 3e 64 62 2c 20 0a 20 20  ame, &p->db, .  
1e250 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1e260 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
1e270 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1e280 45 2c 20 22 61 70 6e 64 76 66 73 22 29 3b 0a 20  E, "apndvfs");. 
1e290 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1e2a0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
1e2b0 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44   SHELL_OPEN_HEXD
1e2c0 42 3a 0a 20 20 20 20 20 20 63 61 73 65 20 53 48  B:.      case SH
1e2d0 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41  ELL_OPEN_DESERIA
1e2e0 4c 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  LIZE: {.        
1e2f0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 30 2c 20  sqlite3_open(0, 
1e300 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  &p->db);.       
1e310 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1e320 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c        case SHELL
1e330 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3a 20 7b  _OPEN_ZIPFILE: {
1e340 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e350 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22  _open(":memory:"
1e360 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  , &p->db);.     
1e370 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1e380 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45  }.      case SHE
1e390 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  LL_OPEN_READONLY
1e3a0 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
1e3b0 74 65 33 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a  te3_open_v2(p->z
1e3c0 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e  DbFilename, &p->
1e3d0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  db, SQLITE_OPEN_
1e3e0 52 45 41 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20  READONLY, 0);.  
1e3f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e400 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
1e410 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45  SHELL_OPEN_UNSPE
1e420 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 53 48  C:.      case SH
1e430 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3a  ELL_OPEN_NORMAL:
1e440 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
1e450 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69  e3_open(p->zDbFi
1e460 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 29 3b  lename, &p->db);
1e470 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1e480 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e490 20 20 67 6c 6f 62 61 6c 44 62 20 3d 20 70 2d 3e    globalDb = p->
1e4a0 64 62 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64  db;.    if( p->d
1e4b0 62 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  b==0 || SQLITE_O
1e4c0 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  K!=sqlite3_errco
1e4d0 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20  de(p->db) ){.   
1e4e0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1e4f0 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e  tderr,"Error: un
1e500 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
1e510 61 62 61 73 65 20 5c 22 25 73 5c 22 3a 20 25 73  abase \"%s\": %s
1e520 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
1e530 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 73  ->zDbFilename, s
1e540 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
1e550 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66 28  >db));.      if(
1e560 20 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 50 45   openFlags & OPE
1e570 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45 20 29  N_DB_KEEPALIVE )
1e580 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e590 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a  3_open(":memory:
1e5a0 22 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20  ", &p->db);.    
1e5b0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1e5c0 20 20 7d 0a 20 20 20 20 20 20 65 78 69 74 28 31    }.      exit(1
1e5d0 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  );.    }.#ifndef
1e5e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
1e5f0 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
1e600 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
1e610 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d  oad_extension(p-
1e620 3e 64 62 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a  >db, 1);.#endif.
1e630 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
1e640 69 6f 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30  io_init(p->db, 0
1e650 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1e660 33 5f 73 68 61 74 68 72 65 65 5f 69 6e 69 74 28  3_shathree_init(
1e670 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  p->db, 0, 0);.  
1e680 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65    sqlite3_comple
1e690 74 69 6f 6e 5f 69 6e 69 74 28 70 2d 3e 64 62 2c  tion_init(p->db,
1e6a0 20 30 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53   0, 0);.#ifdef S
1e6b0 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a  QLITE_HAVE_ZLIB.
1e6c0 20 20 20 20 73 71 6c 69 74 65 33 5f 7a 69 70 66      sqlite3_zipf
1e6d0 69 6c 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  ile_init(p->db, 
1e6e0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1e6f0 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 70 2d  e3_sqlar_init(p-
1e700 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  >db, 0, 0);.#end
1e710 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  if.    sqlite3_c
1e720 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
1e730 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 61 64 64  ->db, "shell_add
1e740 5f 73 63 68 65 6d 61 22 2c 20 33 2c 20 53 51 4c  _schema", 3, SQL
1e750 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
1e760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e770 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 41 64           shellAd
1e780 64 53 63 68 65 6d 61 4e 61 6d 65 2c 20 30 2c 20  dSchemaName, 0, 
1e790 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
1e7a0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
1e7b0 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 6d 6f  p->db, "shell_mo
1e7c0 64 75 6c 65 5f 73 63 68 65 6d 61 22 2c 20 31 2c  dule_schema", 1,
1e7d0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
1e7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65               she
1e800 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 2c 20  llModuleSchema, 
1e810 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1e820 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1e830 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c  on(p->db, "shell
1e840 5f 70 75 74 73 6e 6c 22 2c 20 31 2c 20 53 51 4c  _putsnl", 1, SQL
1e850 49 54 45 5f 55 54 46 38 2c 20 70 2c 0a 20 20 20  ITE_UTF8, p,.   
1e860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e870 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 50 75           shellPu
1e880 74 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 23  tsFunc, 0, 0);.#
1e890 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
1e8a0 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20  HAVE_SYSTEM.    
1e8b0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1e8c0 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22  unction(p->db, "
1e8d0 65 64 69 74 22 2c 20 31 2c 20 53 51 4c 49 54 45  edit", 1, SQLITE
1e8e0 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
1e8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e900 20 20 20 20 20 20 65 64 69 74 46 75 6e 63 2c 20        editFunc, 
1e910 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1e920 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1e930 6f 6e 28 70 2d 3e 64 62 2c 20 22 65 64 69 74 22  on(p->db, "edit"
1e940 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 2, SQLITE_UTF8
1e950 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e970 20 65 64 69 74 46 75 6e 63 2c 20 30 2c 20 30 29   editFunc, 0, 0)
1e980 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
1e990 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48   p->openMode==SH
1e9a0 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45  ELL_OPEN_ZIPFILE
1e9b0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
1e9c0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
1e9d0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
1e9e0 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c   "CREATE VIRTUAL
1e9f0 20 54 41 42 4c 45 20 7a 69 70 20 55 53 49 4e 47   TABLE zip USING
1ea00 20 7a 69 70 66 69 6c 65 28 25 51 29 3b 22 2c 20   zipfile(%Q);", 
1ea10 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 29 3b  p->zDbFilename);
1ea20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65  .      sqlite3_e
1ea30 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  xec(p->db, zSql,
1ea40 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
1ea50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
1ea60 71 6c 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  ql);.    }.#ifde
1ea70 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1ea80 44 45 53 45 52 49 41 4c 49 5a 45 0a 20 20 20 20  DESERIALIZE.    
1ea90 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 2d 3e  else.    if( p->
1eaa0 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f  openMode==SHELL_
1eab0 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a 45  OPEN_DESERIALIZE
1eac0 20 7c 7c 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d   || p->openMode=
1ead0 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44  =SHELL_OPEN_HEXD
1eae0 42 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  B ){.      int r
1eaf0 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 61  c;.      int nDa
1eb00 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e  ta = 0;.      un
1eb10 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
1eb20 74 61 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ta;.      if( p-
1eb30 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c  >openMode==SHELL
1eb40 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a  _OPEN_DESERIALIZ
1eb50 45 20 29 7b 0a 20 20 20 20 20 20 20 20 61 44 61  E ){.        aDa
1eb60 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ta = (unsigned c
1eb70 68 61 72 2a 29 72 65 61 64 46 69 6c 65 28 70 2d  har*)readFile(p-
1eb80 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 6e  >zDbFilename, &n
1eb90 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Data);.      }el
1eba0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 44 61 74  se{.        aDat
1ebb0 61 20 3d 20 72 65 61 64 48 65 78 44 62 28 70 2c  a = readHexDb(p,
1ebc0 20 26 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20   &nData);.      
1ebd0 20 20 69 66 28 20 61 44 61 74 61 3d 3d 30 20 29    if( aData==0 )
1ebe0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
1ebf0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1ec00 22 45 72 72 6f 72 20 69 6e 20 68 65 78 64 62 20  "Error in hexdb 
1ec10 69 6e 70 75 74 5c 6e 22 29 3b 0a 20 20 20 20 20  input\n");.     
1ec20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
1ec30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1ec40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ec50 33 5f 64 65 73 65 72 69 61 6c 69 7a 65 28 70 2d  3_deserialize(p-
1ec60 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 61 44 61  >db, "main", aDa
1ec70 74 61 2c 20 6e 44 61 74 61 2c 20 6e 44 61 74 61  ta, nData, nData
1ec80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ec90 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 53 45       SQLITE_DESE
1eca0 52 49 41 4c 49 5a 45 5f 52 45 53 49 5a 45 41 42  RIALIZE_RESIZEAB
1ecb0 4c 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  LE |.           
1ecc0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
1ecd0 45 53 45 52 49 41 4c 49 5a 45 5f 46 52 45 45 4f  ESERIALIZE_FREEO
1ece0 4e 43 4c 4f 53 45 29 3b 0a 20 20 20 20 20 20 69  NCLOSE);.      i
1ecf0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1ed00 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1ed10 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 71 6c  err, "Error: sql
1ed20 69 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a 65  ite3_deserialize
1ed30 28 29 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22  () returns %d\n"
1ed40 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , rc);.      }. 
1ed50 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61       if( p->szMa
1ed60 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  x>0 ){.        s
1ed70 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
1ed80 72 6f 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69 6e  rol(p->db, "main
1ed90 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ", SQLITE_FCNTL_
1eda0 53 49 5a 45 5f 4c 49 4d 49 54 2c 20 26 70 2d 3e  SIZE_LIMIT, &p->
1edb0 73 7a 4d 61 78 29 3b 0a 20 20 20 20 20 20 7d 0a  szMax);.      }.
1edc0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
1edd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
1ede0 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64  t to close the d
1edf0 61 74 61 62 61 65 73 20 63 6f 6e 6e 65 63 74 69  atabaes connecti
1ee00 6f 6e 2e 20 20 52 65 70 6f 72 74 20 65 72 72 6f  on.  Report erro
1ee10 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6c 6f 73  rs..*/.void clos
1ee20 65 5f 64 62 28 73 71 6c 69 74 65 33 20 2a 64 62  e_db(sqlite3 *db
1ee30 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ){.  int rc = sq
1ee40 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
1ee50 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1ee60 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1ee70 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 71 6c  err, "Error: sql
1ee80 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 72 65 74  ite3_close() ret
1ee90 75 72 6e 73 20 25 64 3a 20 25 73 5c 6e 22 2c 0a  urns %d: %s\n",.
1eea0 20 20 20 20 20 20 20 20 72 63 2c 20 73 71 6c 69          rc, sqli
1eeb0 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
1eec0 0a 20 20 7d 20 0a 7d 0a 0a 23 69 66 20 48 41 56  .  } .}..#if HAV
1eed0 45 5f 52 45 41 44 4c 49 4e 45 20 7c 7c 20 48 41  E_READLINE || HA
1eee0 56 45 5f 45 44 49 54 4c 49 4e 45 0a 2f 2a 0a 2a  VE_EDITLINE./*.*
1eef0 2a 20 52 65 61 64 6c 69 6e 65 20 63 6f 6d 70 6c  * Readline compl
1ef00 65 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 0a  etion callbacks.
1ef10 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
1ef20 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74  readline_complet
1ef30 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 28 63 6f  ion_generator(co
1ef40 6e 73 74 20 63 68 61 72 20 2a 74 65 78 74 2c 20  nst char *text, 
1ef50 69 6e 74 20 73 74 61 74 65 29 7b 0a 20 20 73 74  int state){.  st
1ef60 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d  atic sqlite3_stm
1ef70 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
1ef80 63 68 61 72 20 2a 7a 52 65 74 3b 0a 20 20 69 66  char *zRet;.  if
1ef90 28 20 73 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20  ( state==0 ){.  
1efa0 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
1efb0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
1efc0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a  ze(pStmt);.    z
1efd0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
1efe0 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49  rintf("SELECT DI
1eff0 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65  STINCT candidate
1f000 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22   COLLATE nocase"
1f010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f020 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 46              "  F
1f030 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25  ROM completion(%
1f040 51 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c 20  Q) ORDER BY 1", 
1f050 74 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  text);.    sqlit
1f060 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 67 6c  e3_prepare_v2(gl
1f070 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31  obalDb, zSql, -1
1f080 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
1f090 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1f0a0 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Sql);.  }.  if( 
1f0b0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
1f0c0 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
1f0d0 29 7b 0a 20 20 20 20 7a 52 65 74 20 3d 20 73 74  ){.    zRet = st
1f0e0 72 64 75 70 28 28 63 6f 6e 73 74 20 63 68 61 72  rdup((const char
1f0f0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
1f100 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29  _text(pStmt, 0))
1f110 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1f120 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1f130 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d  pStmt);.    pStm
1f140 74 20 3d 20 30 3b 0a 20 20 20 20 7a 52 65 74 20  t = 0;.    zRet 
1f150 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1f160 6e 20 7a 52 65 74 3b 0a 7d 0a 73 74 61 74 69 63  n zRet;.}.static
1f170 20 63 68 61 72 20 2a 2a 72 65 61 64 6c 69 6e 65   char **readline
1f180 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73  _completion(cons
1f190 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69  t char *zText, i
1f1a0 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69  nt iStart, int i
1f1b0 45 6e 64 29 7b 0a 20 20 72 6c 5f 61 74 74 65 6d  End){.  rl_attem
1f1c0 70 74 65 64 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f  pted_completion_
1f1d0 6f 76 65 72 20 3d 20 31 3b 0a 20 20 72 65 74 75  over = 1;.  retu
1f1e0 72 6e 20 72 6c 5f 63 6f 6d 70 6c 65 74 69 6f 6e  rn rl_completion
1f1f0 5f 6d 61 74 63 68 65 73 28 7a 54 65 78 74 2c 20  _matches(zText, 
1f200 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74  readline_complet
1f210 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 29 3b 0a  ion_generator);.
1f220 7d 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c 49  }..#elif HAVE_LI
1f230 4e 45 4e 4f 49 53 45 0a 2f 2a 0a 2a 2a 20 4c 69  NENOISE./*.** Li
1f240 6e 65 6e 6f 69 73 65 20 63 6f 6d 70 6c 65 74 69  nenoise completi
1f250 6f 6e 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73  on callback.*/.s
1f260 74 61 74 69 63 20 76 6f 69 64 20 6c 69 6e 65 6e  tatic void linen
1f270 6f 69 73 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28  oise_completion(
1f280 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e  const char *zLin
1f290 65 2c 20 6c 69 6e 65 6e 6f 69 73 65 43 6f 6d 70  e, linenoiseComp
1f2a0 6c 65 74 69 6f 6e 73 20 2a 6c 63 29 7b 0a 20 20  letions *lc){.  
1f2b0 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 73 74 72 6c  int nLine = strl
1f2c0 65 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 69  en30(zLine);.  i
1f2d0 6e 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20  nt i, iStart;.  
1f2e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1f2f0 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
1f300 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42  *zSql;.  char zB
1f310 75 66 5b 31 30 30 30 5d 3b 0a 0a 20 20 69 66 28  uf[1000];..  if(
1f320 20 6e 4c 69 6e 65 3e 73 69 7a 65 6f 66 28 7a 42   nLine>sizeof(zB
1f330 75 66 29 2d 33 30 20 29 20 72 65 74 75 72 6e 3b  uf)-30 ) return;
1f340 0a 20 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d  .  if( zLine[0]=
1f350 3d 27 2e 27 20 7c 7c 20 7a 4c 69 6e 65 5b 30 5d  ='.' || zLine[0]
1f360 3d 3d 27 23 27 29 20 72 65 74 75 72 6e 3b 0a 20  =='#') return;. 
1f370 20 66 6f 72 28 69 3d 6e 4c 69 6e 65 2d 31 3b 20   for(i=nLine-1; 
1f380 69 3e 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d  i>=0 && (isalnum
1f390 28 7a 4c 69 6e 65 5b 69 5d 29 20 7c 7c 20 7a 4c  (zLine[i]) || zL
1f3a0 69 6e 65 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69 2d  ine[i]=='_'); i-
1f3b0 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3d 3d 6e 4c  -){}.  if( i==nL
1f3c0 69 6e 65 2d 31 20 29 20 72 65 74 75 72 6e 3b 0a  ine-1 ) return;.
1f3d0 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a    iStart = i+1;.
1f3e0 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a    memcpy(zBuf, z
1f3f0 4c 69 6e 65 2c 20 69 53 74 61 72 74 29 3b 0a 20  Line, iStart);. 
1f400 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
1f410 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
1f420 44 49 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61  DISTINCT candida
1f430 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  te COLLATE nocas
1f440 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e".             
1f450 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 46              "  F
1f460 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25  ROM completion(%
1f470 51 2c 25 51 29 20 4f 52 44 45 52 20 42 59 20 31  Q,%Q) ORDER BY 1
1f480 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1f490 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 4c 69              &zLi
1f4a0 6e 65 5b 69 53 74 61 72 74 5d 2c 20 7a 4c 69 6e  ne[iStart], zLin
1f4b0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72  e);.  sqlite3_pr
1f4c0 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c 44  epare_v2(globalD
1f4d0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
1f4e0 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  tmt, 0);.  sqlit
1f4f0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
1f500 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67 6c   sqlite3_exec(gl
1f510 6f 62 61 6c 44 62 2c 20 22 50 52 41 47 4d 41 20  obalDb, "PRAGMA 
1f520 70 61 67 65 5f 63 6f 75 6e 74 22 2c 20 30 2c 20  page_count", 0, 
1f530 30 2c 20 30 29 3b 20 2f 2a 20 4c 6f 61 64 20 74  0, 0); /* Load t
1f540 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 77  he schema */.  w
1f550 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74  hile( sqlite3_st
1f560 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
1f570 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e  E_ROW ){.    con
1f580 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 70 6c 65  st char *zComple
1f590 74 69 6f 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68  tion = (const ch
1f5a0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
1f5b0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30  mn_text(pStmt, 0
1f5c0 29 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6d 70  );.    int nComp
1f5d0 6c 65 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33  letion = sqlite3
1f5e0 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
1f5f0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
1f600 20 69 53 74 61 72 74 2b 6e 43 6f 6d 70 6c 65 74   iStart+nComplet
1f610 69 6f 6e 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75  ion < sizeof(zBu
1f620 66 29 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65  f)-1 ){.      me
1f630 6d 63 70 79 28 7a 42 75 66 2b 69 53 74 61 72 74  mcpy(zBuf+iStart
1f640 2c 20 7a 43 6f 6d 70 6c 65 74 69 6f 6e 2c 20 6e  , zCompletion, n
1f650 43 6f 6d 70 6c 65 74 69 6f 6e 2b 31 29 3b 0a 20  Completion+1);. 
1f660 20 20 20 20 20 6c 69 6e 65 6e 6f 69 73 65 41 64       linenoiseAd
1f670 64 43 6f 6d 70 6c 65 74 69 6f 6e 28 6c 63 2c 20  dCompletion(lc, 
1f680 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zBuf);.    }.  }
1f690 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
1f6a0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 23 65  ize(pStmt);.}.#e
1f6b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43  ndif../*.** Do C
1f6c0 2d 6c 61 6e 67 75 61 67 65 20 73 74 79 6c 65 20  -language style 
1f6d0 64 65 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  dequoting..**.**
1f6e0 20 20 20 20 5c 61 20 20 20 20 2d 3e 20 61 6c 61      \a    -> ala
1f6f0 72 6d 0a 2a 2a 20 20 20 20 5c 62 20 20 20 20 2d  rm.**    \b    -
1f700 3e 20 62 61 63 6b 73 70 61 63 65 0a 2a 2a 20 20  > backspace.**  
1f710 20 20 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a 2a    \t    -> tab.*
1f720 2a 20 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e 65  *    \n    -> ne
1f730 77 6c 69 6e 65 0a 2a 2a 20 20 20 20 5c 76 20 20  wline.**    \v  
1f740 20 20 2d 3e 20 76 65 72 74 69 63 61 6c 20 74 61    -> vertical ta
1f750 62 0a 2a 2a 20 20 20 20 5c 66 20 20 20 20 2d 3e  b.**    \f    ->
1f760 20 66 6f 72 6d 20 66 65 65 64 0a 2a 2a 20 20 20   form feed.**   
1f770 20 5c 72 20 20 20 20 2d 3e 20 63 61 72 72 69 61   \r    -> carria
1f780 67 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 20  ge return.**    
1f790 5c 73 20 20 20 20 2d 3e 20 73 70 61 63 65 0a 2a  \s    -> space.*
1f7a0 2a 20 20 20 20 5c 22 20 20 20 20 2d 3e 20 22 0a  *    \"    -> ".
1f7b0 2a 2a 20 20 20 20 5c 27 20 20 20 20 2d 3e 20 27  **    \'    -> '
1f7c0 0a 2a 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e 20  .**    \\    -> 
1f7d0 62 61 63 6b 73 6c 61 73 68 0a 2a 2a 20 20 20 20  backslash.**    
1f7e0 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20 63  \NNN  -> ascii c
1f7f0 68 61 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e 20  haracter NNN in 
1f800 6f 63 74 61 6c 0a 2a 2f 0a 73 74 61 74 69 63 20  octal.*/.static 
1f810 76 6f 69 64 20 72 65 73 6f 6c 76 65 5f 62 61 63  void resolve_bac
1f820 6b 73 6c 61 73 68 65 73 28 63 68 61 72 20 2a 7a  kslashes(char *z
1f830 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
1f840 20 63 68 61 72 20 63 3b 0a 20 20 77 68 69 6c 65   char c;.  while
1f850 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 5c 27  ( *z && *z!='\\'
1f860 20 29 20 7a 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d   ) z++;.  for(i=
1f870 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  j=0; (c = z[i])!
1f880 3d 30 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  =0; i++, j++){. 
1f890 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 26     if( c=='\\' &
1f8a0 26 20 7a 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a 20  & z[i+1]!=0 ){. 
1f8b0 20 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b       c = z[++i];
1f8c0 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 61  .      if( c=='a
1f8d0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
1f8e0 20 27 5c 61 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\a';.      }el
1f8f0 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20 29 7b  se if( c=='b' ){
1f900 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 62  .        c = '\b
1f910 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
1f920 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20  f( c=='t' ){.   
1f930 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a 20       c = '\t';. 
1f940 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
1f950 3d 3d 27 6e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='n' ){.       
1f960 20 63 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20   c = '\n';.     
1f970 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 76   }else if( c=='v
1f980 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
1f990 20 27 5c 76 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\v';.      }el
1f9a0 73 65 20 69 66 28 20 63 3d 3d 27 66 27 20 29 7b  se if( c=='f' ){
1f9b0 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 66  .        c = '\f
1f9c0 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
1f9d0 66 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20  f( c=='r' ){.   
1f9e0 20 20 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20       c = '\r';. 
1f9f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
1fa00 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20  =='"' ){.       
1fa10 20 63 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20   c = '"';.      
1fa20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 27  }else if( c=='\'
1fa30 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
1fa40 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\'';.      }el
1fa50 73 65 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29  se if( c=='\\' )
1fa60 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
1fa70 5c 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  \';.      }else 
1fa80 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c  if( c>='0' && c<
1fa90 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='7' ){.        
1faa0 63 20 2d 3d 20 27 30 27 3b 0a 20 20 20 20 20 20  c -= '0';.      
1fab0 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30    if( z[i+1]>='0
1fac0 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27  ' && z[i+1]<='7'
1fad0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b   ){.          i+
1fae0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  +;.          c =
1faf0 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d   (c<<3) + z[i] -
1fb00 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '0';.          
1fb10 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20  if( z[i+1]>='0' 
1fb20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29  && z[i+1]<='7' )
1fb30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 2b  {.            i+
1fb40 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  +;.            c
1fb50 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d   = (c<<3) + z[i]
1fb60 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20   - '0';.        
1fb70 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1fb80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1fb90 7a 5b 6a 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20  z[j] = c;.  }.  
1fba0 69 66 28 20 6a 3c 69 20 29 20 7a 5b 6a 5d 20 3d  if( j<i ) z[j] =
1fbb0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74   0;.}../*.** Int
1fbc0 65 72 70 72 65 74 20 7a 41 72 67 20 61 73 20 65  erpret zArg as e
1fbd0 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72  ither an integer
1fbe0 20 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61   or a boolean va
1fbf0 6c 75 65 2e 20 20 52 65 74 75 72 6e 20 31 20 6f  lue.  Return 1 o
1fc00 72 20 30 0a 2a 2a 20 66 6f 72 20 54 52 55 45 20  r 0.** for TRUE 
1fc10 61 6e 64 20 46 41 4c 53 45 2e 20 20 52 65 74 75  and FALSE.  Retu
1fc20 72 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20 76  rn the integer v
1fc30 61 6c 75 65 20 69 66 20 61 70 70 72 6f 70 72 69  alue if appropri
1fc40 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ate..*/.static i
1fc50 6e 74 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28  nt booleanValue(
1fc60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
1fc70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1fc80 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20 26  ( zArg[0]=='0' &
1fc90 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20 29  & zArg[1]=='x' )
1fca0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20 68  {.    for(i=2; h
1fcb0 65 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72  exDigitValue(zAr
1fcc0 67 5b 69 5d 29 3e 3d 30 3b 20 69 2b 2b 29 7b 7d  g[i])>=0; i++){}
1fcd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
1fce0 72 28 69 3d 30 3b 20 7a 41 72 67 5b 69 5d 3e 3d  r(i=0; zArg[i]>=
1fcf0 27 30 27 20 26 26 20 7a 41 72 67 5b 69 5d 3c 3d  '0' && zArg[i]<=
1fd00 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 0a  '9'; i++){}.  }.
1fd10 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 41 72    if( i>0 && zAr
1fd20 67 5b 69 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  g[i]==0 ) return
1fd30 20 28 69 6e 74 29 28 69 6e 74 65 67 65 72 56 61   (int)(integerVa
1fd40 6c 75 65 28 7a 41 72 67 29 20 26 20 30 78 66 66  lue(zArg) & 0xff
1fd50 66 66 66 66 66 66 29 3b 0a 20 20 69 66 28 20 73  ffffff);.  if( s
1fd60 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
1fd70 41 72 67 2c 20 22 6f 6e 22 29 3d 3d 30 20 7c 7c  Arg, "on")==0 ||
1fd80 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
1fd90 28 7a 41 72 67 2c 22 79 65 73 22 29 3d 3d 30 20  (zArg,"yes")==0 
1fda0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1fdb0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1fdc0 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c  e3_stricmp(zArg,
1fdd0 20 22 6f 66 66 22 29 3d 3d 30 20 7c 7c 20 73 71   "off")==0 || sq
1fde0 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41  lite3_stricmp(zA
1fdf0 72 67 2c 22 6e 6f 22 29 3d 3d 30 20 29 7b 0a 20  rg,"no")==0 ){. 
1fe00 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1fe10 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73  .  utf8_printf(s
1fe20 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e  tderr, "ERROR: N
1fe30 6f 74 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  ot a boolean val
1fe40 75 65 3a 20 5c 22 25 73 5c 22 2e 20 41 73 73 75  ue: \"%s\". Assu
1fe50 6d 69 6e 67 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c  ming \"no\".\n",
1fe60 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 29  .          zArg)
1fe70 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1fe80 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 6c  ./*.** Set or cl
1fe90 65 61 72 20 61 20 73 68 65 6c 6c 20 66 6c 61 67  ear a shell flag
1fea0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 20   according to a 
1feb0 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a  boolean value..*
1fec0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
1fed0 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 53 68 65  tOrClearFlag(She
1fee0 6c 6c 53 74 61 74 65 20 2a 70 2c 20 75 6e 73 69  llState *p, unsi
1fef0 67 6e 65 64 20 6d 46 6c 61 67 2c 20 63 6f 6e 73  gned mFlag, cons
1ff00 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20  t char *zArg){. 
1ff10 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75   if( booleanValu
1ff20 65 28 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 53  e(zArg) ){.    S
1ff30 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 6d  hellSetFlag(p, m
1ff40 46 6c 61 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Flag);.  }else{.
1ff50 20 20 20 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c      ShellClearFl
1ff60 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20  ag(p, mFlag);.  
1ff70 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
1ff80 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2c   an output file,
1ff90 20 61 73 73 75 6d 69 6e 67 20 69 74 20 69 73 20   assuming it is 
1ffa0 6e 6f 74 20 73 74 64 65 72 72 20 6f 72 20 73 74  not stderr or st
1ffb0 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dout.*/.static v
1ffc0 6f 69 64 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f  oid output_file_
1ffd0 63 6c 6f 73 65 28 46 49 4c 45 20 2a 66 29 7b 0a  close(FILE *f){.
1ffe0 20 20 69 66 28 20 66 20 26 26 20 66 21 3d 73 74    if( f && f!=st
1fff0 64 6f 75 74 20 26 26 20 66 21 3d 73 74 64 65 72  dout && f!=stder
20000 72 20 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a 7d  r ) fclose(f);.}
20010 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
20020 70 65 6e 20 61 6e 20 6f 75 74 70 75 74 20 66 69  pen an output fi
20030 6c 65 2e 20 20 20 54 68 65 20 6e 61 6d 65 73 20  le.   The names 
20040 22 73 74 64 6f 75 74 22 20 61 6e 64 20 22 73 74  "stdout" and "st
20050 64 65 72 72 22 20 61 72 65 0a 2a 2a 20 72 65 63  derr" are.** rec
20060 6f 67 6e 69 7a 65 64 20 61 6e 64 20 64 6f 20 74  ognized and do t
20070 68 65 20 72 69 67 68 74 20 74 68 69 6e 67 2e 20  he right thing. 
20080 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
20090 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 0a  d if the output.
200a0 2a 2a 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 22  ** filename is "
200b0 6f 66 66 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  off"..*/.static 
200c0 46 49 4c 45 20 2a 6f 75 74 70 75 74 5f 66 69 6c  FILE *output_fil
200d0 65 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  e_open(const cha
200e0 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 62 54  r *zFile, int bT
200f0 65 78 74 4d 6f 64 65 29 7b 0a 20 20 46 49 4c 45  extMode){.  FILE
20100 20 2a 66 3b 0a 20 20 69 66 28 20 73 74 72 63 6d   *f;.  if( strcm
20110 70 28 7a 46 69 6c 65 2c 22 73 74 64 6f 75 74 22  p(zFile,"stdout"
20120 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20  )==0 ){.    f = 
20130 73 74 64 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20  stdout;.  }else 
20140 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
20150 2c 20 22 73 74 64 65 72 72 22 29 3d 3d 30 20 29  , "stderr")==0 )
20160 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 65 72 72  {.    f = stderr
20170 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
20180 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 6f 66 66  rcmp(zFile, "off
20190 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d  ")==0 ){.    f =
201a0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
201b0 20 66 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65   f = fopen(zFile
201c0 2c 20 62 54 65 78 74 4d 6f 64 65 20 3f 20 22 77  , bTextMode ? "w
201d0 22 20 3a 20 22 77 62 22 29 3b 0a 20 20 20 20 69  " : "wb");.    i
201e0 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( f==0 ){.     
201f0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
20200 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
20210 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
20220 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20  n", zFile);.    
20230 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
20240 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
20250 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f  ITE_OMIT_TRACE./
20260 2a 0a 2a 2a 20 41 20 72 6f 75 74 69 6e 65 20 66  *.** A routine f
20270 6f 72 20 68 61 6e 64 6c 69 6e 67 20 6f 75 74 70  or handling outp
20280 75 74 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ut from sqlite3_
20290 74 72 61 63 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  trace()..*/.stat
202a0 69 63 20 69 6e 74 20 73 71 6c 5f 74 72 61 63 65  ic int sql_trace
202b0 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 75 6e 73  _callback(.  uns
202c0 69 67 6e 65 64 20 6d 54 79 70 65 2c 20 20 20 20  igned mType,    
202d0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 63       /* The trac
202e0 65 20 74 79 70 65 20 2a 2f 0a 20 20 76 6f 69 64  e type */.  void
202f0 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20   *pArg,         
20300 20 20 20 20 2f 2a 20 54 68 65 20 53 68 65 6c 6c      /* The Shell
20310 53 74 61 74 65 20 70 6f 69 6e 74 65 72 20 2a 2f  State pointer */
20320 0a 20 20 76 6f 69 64 20 2a 70 50 2c 20 20 20 20  .  void *pP,    
20330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
20340 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
20350 74 6f 20 73 71 6c 69 74 65 5f 73 74 6d 74 20 2a  to sqlite_stmt *
20360 2f 0a 20 20 76 6f 69 64 20 2a 70 58 20 20 20 20  /.  void *pX    
20370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
20380 75 78 69 6c 69 61 72 79 20 6f 75 74 70 75 74 20  uxiliary output 
20390 2a 2f 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61  */.){.  ShellSta
203a0 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74  te *p = (ShellSt
203b0 61 74 65 2a 29 70 41 72 67 3b 0a 20 20 73 71 6c  ate*)pArg;.  sql
203c0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
203d0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
203e0 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 53 71 6c  zSql;.  int nSql
203f0 3b 0a 20 20 69 66 28 20 70 2d 3e 74 72 61 63 65  ;.  if( p->trace
20400 4f 75 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Out==0 ) return 
20410 30 3b 0a 20 20 69 66 28 20 6d 54 79 70 65 3d 3d  0;.  if( mType==
20420 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f  SQLITE_TRACE_CLO
20430 53 45 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  SE ){.    utf8_p
20440 72 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75  rintf(p->traceOu
20450 74 2c 20 22 2d 2d 20 63 6c 6f 73 69 6e 67 20 64  t, "-- closing d
20460 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
20470 6f 6e 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75  on\n");.    retu
20480 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
20490 6d 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 54 52  mType!=SQLITE_TR
204a0 41 43 45 5f 52 4f 57 20 26 26 20 28 28 63 6f 6e  ACE_ROW && ((con
204b0 73 74 20 63 68 61 72 2a 29 70 58 29 5b 30 5d 3d  st char*)pX)[0]=
204c0 3d 27 2d 27 20 29 7b 0a 20 20 20 20 7a 53 71 6c  ='-' ){.    zSql
204d0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
204e0 70 58 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  pX;.  }else{.   
204f0 20 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65   pStmt = (sqlite
20500 33 5f 73 74 6d 74 2a 29 70 50 3b 0a 20 20 20 20  3_stmt*)pP;.    
20510 73 77 69 74 63 68 28 20 70 2d 3e 65 54 72 61 63  switch( p->eTrac
20520 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  eType ){.      c
20530 61 73 65 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f  ase SHELL_TRACE_
20540 45 58 50 41 4e 44 45 44 3a 20 7b 0a 20 20 20 20  EXPANDED: {.    
20550 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
20560 65 33 5f 65 78 70 61 6e 64 65 64 5f 73 71 6c 28  e3_expanded_sql(
20570 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
20580 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
20590 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
205a0 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20  BLE_NORMALIZE.  
205b0 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 54      case SHELL_T
205c0 52 41 43 45 5f 4e 4f 52 4d 41 4c 49 5a 45 44 3a  RACE_NORMALIZED:
205d0 20 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20   {.        zSql 
205e0 3d 20 73 71 6c 69 74 65 33 5f 6e 6f 72 6d 61 6c  = sqlite3_normal
205f0 69 7a 65 64 5f 73 71 6c 28 70 53 74 6d 74 29 3b  ized_sql(pStmt);
20600 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
20610 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
20620 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
20630 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73          zSql = s
20640 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74  qlite3_sql(pStmt
20650 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
20660 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20670 20 20 7d 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d    }.  if( zSql==
20680 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
20690 6e 53 71 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSql = strlen30(
206a0 7a 53 71 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20  zSql);.  while( 
206b0 6e 53 71 6c 3e 30 20 26 26 20 7a 53 71 6c 5b 6e  nSql>0 && zSql[n
206c0 53 71 6c 2d 31 5d 3d 3d 27 3b 27 20 29 7b 20 6e  Sql-1]==';' ){ n
206d0 53 71 6c 2d 2d 3b 20 7d 0a 20 20 73 77 69 74 63  Sql--; }.  switc
206e0 68 28 20 6d 54 79 70 65 20 29 7b 0a 20 20 20 20  h( mType ){.    
206f0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 43  case SQLITE_TRAC
20700 45 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73 65 20  E_ROW:.    case 
20710 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d  SQLITE_TRACE_STM
20720 54 3a 20 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  T: {.      utf8_
20730 70 72 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f  printf(p->traceO
20740 75 74 2c 20 22 25 2e 2a 73 3b 5c 6e 22 2c 20 6e  ut, "%.*s;\n", n
20750 53 71 6c 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  Sql, zSql);.    
20760 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
20770 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
20780 52 41 43 45 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a  RACE_PROFILE: {.
20790 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
207a0 74 36 34 20 6e 4e 61 6e 6f 73 65 63 20 3d 20 2a  t64 nNanosec = *
207b0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29  (sqlite3_int64*)
207c0 70 58 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  pX;.      utf8_p
207d0 72 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75  rintf(p->traceOu
207e0 74 2c 20 22 25 2e 2a 73 3b 20 2d 2d 20 25 6c 6c  t, "%.*s; -- %ll
207f0 64 20 6e 73 5c 6e 22 2c 20 6e 53 71 6c 2c 20 7a  d ns\n", nSql, z
20800 53 71 6c 2c 20 6e 4e 61 6e 6f 73 65 63 29 3b 0a  Sql, nNanosec);.
20810 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20820 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
20830 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
20840 2a 2a 20 41 20 6e 6f 2d 6f 70 20 72 6f 75 74 69  ** A no-op routi
20850 6e 65 20 74 68 61 74 20 72 75 6e 73 20 77 69 74  ne that runs wit
20860 68 20 74 68 65 20 22 2e 62 72 65 61 6b 70 6f 69  h the ".breakpoi
20870 6e 74 22 20 64 6f 63 2d 63 6f 6d 6d 61 6e 64 2e  nt" doc-command.
20880 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 61 20 75    This is.** a u
20890 73 65 66 75 6c 20 73 70 6f 74 20 74 6f 20 73 65  seful spot to se
208a0 74 20 61 20 64 65 62 75 67 67 65 72 20 62 72 65  t a debugger bre
208b0 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  akpoint..*/.stat
208c0 69 63 20 76 6f 69 64 20 74 65 73 74 5f 62 72 65  ic void test_bre
208d0 61 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20  akpoint(void){. 
208e0 20 73 74 61 74 69 63 20 69 6e 74 20 6e 43 61 6c   static int nCal
208f0 6c 20 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b  l = 0;.  nCall++
20900 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62  ;.}../*.** An ob
20910 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 61  ject used to rea
20920 64 20 61 20 43 53 56 20 61 6e 64 20 6f 74 68 65  d a CSV and othe
20930 72 20 66 69 6c 65 73 20 66 6f 72 20 69 6d 70 6f  r files for impo
20940 72 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  rt..*/.typedef s
20950 74 72 75 63 74 20 49 6d 70 6f 72 74 43 74 78 20  truct ImportCtx 
20960 49 6d 70 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  ImportCtx;.struc
20970 74 20 49 6d 70 6f 72 74 43 74 78 20 7b 0a 20 20  t ImportCtx {.  
20980 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
20990 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e;  /* Name of t
209a0 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
209b0 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20  .  FILE *in;    
209c0 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
209d0 68 65 20 43 53 56 20 74 65 78 74 20 66 72 6f 6d  he CSV text from
209e0 20 74 68 69 73 20 69 6e 70 75 74 20 73 74 72 65   this input stre
209f0 61 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  am */.  char *z;
20a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
20a10 63 63 75 6d 75 6c 61 74 65 64 20 74 65 78 74 20  ccumulated text 
20a20 66 6f 72 20 61 20 66 69 65 6c 64 20 2a 2f 0a 20  for a field */. 
20a30 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
20a40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20a50 66 20 62 79 74 65 73 20 69 6e 20 7a 20 2a 2f 0a  f bytes in z */.
20a60 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20    int nAlloc;   
20a70 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
20a80 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d  llocated for z[]
20a90 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b   */.  int nLine;
20aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
20ab0 72 65 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72  rent line number
20ac0 20 2a 2f 0a 20 20 69 6e 74 20 62 4e 6f 74 46 69   */.  int bNotFi
20ad0 72 73 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  rst;      /* Tru
20ae0 65 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  e if one or more
20af0 20 62 79 74 65 73 20 61 6c 72 65 61 64 79 20 72   bytes already r
20b00 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 63 54 65  ead */.  int cTe
20b10 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rm;          /* 
20b20 43 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74  Character that t
20b30 65 72 6d 69 6e 61 74 65 64 20 74 68 65 20 6d 6f  erminated the mo
20b40 73 74 20 72 65 63 65 6e 74 20 66 69 65 6c 64 20  st recent field 
20b50 2a 2f 0a 20 20 69 6e 74 20 63 43 6f 6c 53 65 70  */.  int cColSep
20b60 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
20b70 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
20b80 20 63 68 61 72 61 63 74 65 72 2e 20 20 28 55 73   character.  (Us
20b90 75 61 6c 6c 79 20 22 2c 22 29 20 2a 2f 0a 20 20  ually ",") */.  
20ba0 69 6e 74 20 63 52 6f 77 53 65 70 3b 20 20 20 20  int cRowSep;    
20bb0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 20 73      /* The row s
20bc0 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
20bd0 65 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 5c  er.  (Usually "\
20be0 6e 22 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70  n") */.};../* Ap
20bf0 70 65 6e 64 20 61 20 73 69 6e 67 6c 65 20 62 79  pend a single by
20c00 74 65 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61  te to z[] */.sta
20c10 74 69 63 20 76 6f 69 64 20 69 6d 70 6f 72 74 5f  tic void import_
20c20 61 70 70 65 6e 64 5f 63 68 61 72 28 49 6d 70 6f  append_char(Impo
20c30 72 74 43 74 78 20 2a 70 2c 20 69 6e 74 20 63 29  rtCtx *p, int c)
20c40 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d  {.  if( p->n+1>=
20c50 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  p->nAlloc ){.   
20c60 20 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d   p->nAlloc += p-
20c70 3e 6e 41 6c 6c 6f 63 20 2b 20 31 30 30 3b 0a 20  >nAlloc + 100;. 
20c80 20 20 20 70 2d 3e 7a 20 3d 20 73 71 6c 69 74 65     p->z = sqlite
20c90 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a  3_realloc64(p->z
20ca0 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20  , p->nAlloc);.  
20cb0 20 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20    if( p->z==0 ) 
20cc0 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d  shell_out_of_mem
20cd0 6f 72 79 28 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ory();.  }.  p->
20ce0 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61  z[p->n++] = (cha
20cf0 72 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20  r)c;.}../* Read 
20d00 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f  a single field o
20d10 66 20 43 53 56 20 74 65 78 74 2e 20 20 43 6f 6d  f CSV text.  Com
20d20 70 61 74 69 62 6c 65 20 77 69 74 68 20 72 66 63  patible with rfc
20d30 34 31 38 30 20 61 6e 64 20 65 78 74 65 6e 64 65  4180 and extende
20d40 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 70  d.** with the op
20d50 74 69 6f 6e 20 6f 66 20 68 61 76 69 6e 67 20 61  tion of having a
20d60 20 73 65 70 61 72 61 74 6f 72 20 6f 74 68 65 72   separator other
20d70 20 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a   than ","..**.**
20d80 20 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65     +  Input come
20d90 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a  s from p->in..**
20da0 20 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75     +  Store resu
20db0 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c  lts in p->z of l
20dc0 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61  ength p->n.  Spa
20dd0 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20  ce to hold p->z 
20de0 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72  comes.**      fr
20df0 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
20e00 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55  c64()..**   +  U
20e10 73 65 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68  se p->cSep as th
20e20 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  e column separat
20e30 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  or.  The default
20e40 20 69 73 20 22 2c 22 2e 0a 2a 2a 20 20 20 2b 20   is ","..**   + 
20e50 20 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20   Use p->rSep as 
20e60 74 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f  the row separato
20e70 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  r.  The default 
20e80 69 73 20 22 5c 6e 22 2e 0a 2a 2a 20 20 20 2b 20  is "\n"..**   + 
20e90 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
20ea0 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69  he line number i
20eb0 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20  n p->nLine..**  
20ec0 20 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68   +  Store the ch
20ed0 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72  aracter that ter
20ee0 6d 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c  minates the fiel
20ef0 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20  d in p->cTerm.  
20f00 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f  Store.**      EO
20f10 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65  F on end-of-file
20f20 2e 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74  ..**   +  Report
20f30 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f   syntax errors o
20f40 6e 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74  n stderr.*/.stat
20f50 69 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f  ic char *SQLITE_
20f60 43 44 45 43 4c 20 63 73 76 5f 72 65 61 64 5f 6f  CDECL csv_read_o
20f70 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43  ne_field(ImportC
20f80 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b  tx *p){.  int c;
20f90 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d  .  int cSep = p-
20fa0 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20  >cColSep;.  int 
20fb0 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65  rSep = p->cRowSe
20fc0 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20  p;.  p->n = 0;. 
20fd0 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
20fe0 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20  );.  if( c==EOF 
20ff0 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  || seenInterrupt
21000 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d   ){.    p->cTerm
21010 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75   = EOF;.    retu
21020 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
21030 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 69 6e  c=='"' ){.    in
21040 74 20 70 63 2c 20 70 70 63 3b 0a 20 20 20 20 69  t pc, ppc;.    i
21050 6e 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 70  nt startLine = p
21060 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 20 20 69 6e 74  ->nLine;.    int
21070 20 63 51 75 6f 74 65 20 3d 20 63 3b 0a 20 20 20   cQuote = c;.   
21080 20 70 63 20 3d 20 70 70 63 20 3d 20 30 3b 0a 20   pc = ppc = 0;. 
21090 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20     while( 1 ){. 
210a0 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70       c = fgetc(p
210b0 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  ->in);.      if(
210c0 20 63 3d 3d 72 53 65 70 20 29 20 70 2d 3e 6e 4c   c==rSep ) p->nL
210d0 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ine++;.      if(
210e0 20 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20   c==cQuote ){.  
210f0 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51        if( pc==cQ
21100 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  uote ){.        
21110 20 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20    pc = 0;.      
21120 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
21130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
21140 20 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63 53        if( (c==cS
21150 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65  ep && pc==cQuote
21160 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d  ).       || (c==
21170 72 53 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f  rSep && pc==cQuo
21180 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63  te).       || (c
21190 3d 3d 72 53 65 70 20 26 26 20 70 63 3d 3d 27 5c  ==rSep && pc=='\
211a0 72 27 20 26 26 20 70 70 63 3d 3d 63 51 75 6f 74  r' && ppc==cQuot
211b0 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d  e).       || (c=
211c0 3d 45 4f 46 20 26 26 20 70 63 3d 3d 63 51 75 6f  =EOF && pc==cQuo
211d0 74 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  te).      ){.   
211e0 20 20 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b       do{ p->n--;
211f0 20 7d 77 68 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d   }while( p->z[p-
21200 3e 6e 5d 21 3d 63 51 75 6f 74 65 20 29 3b 0a 20  >n]!=cQuote );. 
21210 20 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20         p->cTerm 
21220 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = c;.        bre
21230 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
21240 20 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65    if( pc==cQuote
21250 20 26 26 20 63 21 3d 27 5c 72 27 20 29 7b 0a 20   && c!='\r' ){. 
21260 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
21270 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25  tf(stderr, "%s:%
21280 64 3a 20 75 6e 65 73 63 61 70 65 64 20 25 63 20  d: unescaped %c 
21290 63 68 61 72 61 63 74 65 72 5c 6e 22 2c 0a 20 20  character\n",.  
212a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
212b0 3e 7a 46 69 6c 65 2c 20 70 2d 3e 6e 4c 69 6e 65  >zFile, p->nLine
212c0 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20  , cQuote);.     
212d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
212e0 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 20 20 75  EOF ){.        u
212f0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
21300 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e 74 65 72  r, "%s:%d: unter
21310 6d 69 6e 61 74 65 64 20 25 63 2d 71 75 6f 74 65  minated %c-quote
21320 64 20 66 69 65 6c 64 5c 6e 22 2c 0a 20 20 20 20  d field\n",.    
21330 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
21340 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c  File, startLine,
21350 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20   cQuote);.      
21360 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a    p->cTerm = c;.
21370 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
21380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6d 70       }.      imp
21390 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28  ort_append_char(
213a0 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 70 70 63  p, c);.      ppc
213b0 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 70 63 20   = pc;.      pc 
213c0 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = c;.    }.  }el
213d0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
213e0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
213f0 66 69 65 6c 64 20 62 65 69 6e 67 20 70 61 72 73  field being pars
21400 65 64 20 61 6e 64 20 69 74 20 62 65 67 69 6e 73  ed and it begins
21410 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a   with the.    **
21420 20 55 54 46 2d 38 20 42 4f 4d 20 20 28 30 78 45   UTF-8 BOM  (0xE
21430 46 20 42 42 20 42 46 29 20 74 68 65 6e 20 73 6b  F BB BF) then sk
21440 69 70 20 74 68 65 20 42 4f 4d 20 2a 2f 0a 20 20  ip the BOM */.  
21450 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d    if( (c&0xff)==
21460 30 78 65 66 20 26 26 20 70 2d 3e 62 4e 6f 74 46  0xef && p->bNotF
21470 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  irst==0 ){.     
21480 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63   import_append_c
21490 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20  har(p, c);.     
214a0 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
214b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63 26  );.      if( (c&
214c0 30 78 66 66 29 3d 3d 30 78 62 62 20 29 7b 0a 20  0xff)==0xbb ){. 
214d0 20 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70         import_ap
214e0 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b  pend_char(p, c);
214f0 0a 20 20 20 20 20 20 20 20 63 20 3d 20 66 67 65  .        c = fge
21500 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20  tc(p->in);.     
21510 20 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d     if( (c&0xff)=
21520 3d 30 78 62 66 20 29 7b 0a 20 20 20 20 20 20 20  =0xbf ){.       
21530 20 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20     p->bNotFirst 
21540 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
21550 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ->n = 0;.       
21560 20 20 20 72 65 74 75 72 6e 20 63 73 76 5f 72 65     return csv_re
21570 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 70 29 3b  ad_one_field(p);
21580 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21590 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69   }.    }.    whi
215a0 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21  le( c!=EOF && c!
215b0 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70  =cSep && c!=rSep
215c0 20 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74   ){.      import
215d0 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20  _append_char(p, 
215e0 63 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67  c);.      c = fg
215f0 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20  etc(p->in);.    
21600 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65  }.    if( c==rSe
21610 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c  p ){.      p->nL
21620 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ine++;.      if(
21630 20 70 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b   p->n>0 && p->z[
21640 70 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20  p->n-1]=='\r' ) 
21650 70 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  p->n--;.    }.  
21660 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a    p->cTerm = c;.
21670 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29    }.  if( p->z )
21680 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b   p->z[p->n] = 0;
21690 0a 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20  .  p->bNotFirst 
216a0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  = 1;.  return p-
216b0 3e 7a 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61  >z;.}../* Read a
216c0 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66   single field of
216d0 20 41 53 43 49 49 20 64 65 6c 69 6d 69 74 65 64   ASCII delimited
216e0 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b   text..**.**   +
216f0 20 20 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72    Input comes fr
21700 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b  om p->in..**   +
21710 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
21720 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74  in p->z of lengt
21730 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74  h p->n.  Space t
21740 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65  o hold p->z come
21750 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73  s.**      from s
21760 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
21770 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70  )..**   +  Use p
21780 2d 3e 63 53 65 70 20 61 73 20 74 68 65 20 63 6f  ->cSep as the co
21790 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20  lumn separator. 
217a0 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
217b0 22 5c 78 31 46 22 2e 0a 2a 2a 20 20 20 2b 20 20  "\x1F"..**   +  
217c0 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74  Use p->rSep as t
217d0 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  he row separator
217e0 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
217f0 73 20 22 5c 78 31 45 22 2e 0a 2a 2a 20 20 20 2b  s "\x1E"..**   +
21800 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20    Keep track of 
21810 74 68 65 20 72 6f 77 20 6e 75 6d 62 65 72 20 69  the row number i
21820 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20  n p->nLine..**  
21830 20 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68   +  Store the ch
21840 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72  aracter that ter
21850 6d 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c  minates the fiel
21860 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20  d in p->cTerm.  
21870 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f  Store.**      EO
21880 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65  F on end-of-file
21890 2e 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74  ..**   +  Report
218a0 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f   syntax errors o
218b0 6e 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74  n stderr.*/.stat
218c0 69 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f  ic char *SQLITE_
218d0 43 44 45 43 4c 20 61 73 63 69 69 5f 72 65 61 64  CDECL ascii_read
218e0 5f 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72  _one_field(Impor
218f0 74 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tCtx *p){.  int 
21900 63 3b 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20  c;.  int cSep = 
21910 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e  p->cColSep;.  in
21920 74 20 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77  t rSep = p->cRow
21930 53 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b  Sep;.  p->n = 0;
21940 0a 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e  .  c = fgetc(p->
21950 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f  in);.  if( c==EO
21960 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75  F || seenInterru
21970 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65  pt ){.    p->cTe
21980 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65  rm = EOF;.    re
21990 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77 68  turn 0;.  }.  wh
219a0 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63  ile( c!=EOF && c
219b0 21 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53 65  !=cSep && c!=rSe
219c0 70 20 29 7b 0a 20 20 20 20 69 6d 70 6f 72 74 5f  p ){.    import_
219d0 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
219e0 29 3b 0a 20 20 20 20 63 20 3d 20 66 67 65 74 63  );.    c = fgetc
219f0 28 70 2d 3e 69 6e 29 3b 0a 20 20 7d 0a 20 20 69  (p->in);.  }.  i
21a00 66 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20  f( c==rSep ){.  
21a10 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20    p->nLine++;.  
21a20 7d 0a 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63  }.  p->cTerm = c
21a30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70  ;.  if( p->z ) p
21a40 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  ->z[p->n] = 0;. 
21a50 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a   return p->z;.}.
21a60 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72  ./*.** Try to tr
21a70 61 6e 73 66 65 72 20 64 61 74 61 20 66 6f 72 20  ansfer data for 
21a80 74 61 62 6c 65 20 7a 54 61 62 6c 65 2e 20 20 49  table zTable.  I
21a90 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
21aa0 65 6e 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69  en while.** movi
21ab0 6e 67 20 66 6f 72 77 61 72 64 2c 20 74 72 79 20  ng forward, try 
21ac0 74 6f 20 67 6f 20 62 61 63 6b 77 61 72 64 73 2e  to go backwards.
21ad0 20 20 54 68 65 20 62 61 63 6b 77 61 72 64 73 20    The backwards 
21ae0 6d 6f 76 65 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a  movement won't.*
21af0 2a 20 77 6f 72 6b 20 66 6f 72 20 57 49 54 48 4f  * work for WITHO
21b00 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e  UT ROWID tables.
21b10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21b20 74 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61 28 0a  tryToCloneData(.
21b30 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c    ShellState *p,
21b40 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44  .  sqlite3 *newD
21b50 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
21b60 2a 7a 54 61 62 6c 65 0a 29 7b 0a 20 20 73 71 6c  *zTable.){.  sql
21b70 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72  ite3_stmt *pQuer
21b80 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  y = 0;.  sqlite3
21b90 5f 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d  _stmt *pInsert =
21ba0 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65   0;.  char *zQue
21bb0 72 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ry = 0;.  char *
21bc0 7a 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 69  zInsert = 0;.  i
21bd0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20  nt rc;.  int i, 
21be0 6a 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 54 61 62  j, n;.  int nTab
21bf0 6c 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54  le = strlen30(zT
21c00 61 62 6c 65 29 3b 0a 20 20 69 6e 74 20 6b 20 3d  able);.  int k =
21c10 20 30 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20   0;.  int cnt = 
21c20 30 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 73  0;.  const int s
21c30 70 69 6e 52 61 74 65 20 3d 20 31 30 30 30 30 3b  pinRate = 10000;
21c40 0a 0a 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c  ..  zQuery = sql
21c50 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
21c60 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77  LECT * FROM \"%w
21c70 5c 22 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  \"", zTable);.  
21c80 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
21c90 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
21ca0 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65  Query, -1, &pQue
21cb0 72 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ry, 0);.  if( rc
21cc0 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
21cd0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
21ce0 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73  or %d: %s on [%s
21cf0 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
21d00 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64    sqlite3_extend
21d10 65 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62  ed_errcode(p->db
21d20 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ), sqlite3_errms
21d30 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20  g(p->db),.      
21d40 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20        zQuery);. 
21d50 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61     goto end_data
21d60 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d  _xfer;.  }.  n =
21d70 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
21d80 63 6f 75 6e 74 28 70 51 75 65 72 79 29 3b 0a 20  count(pQuery);. 
21d90 20 7a 49 6e 73 65 72 74 20 3d 20 73 71 6c 69 74   zInsert = sqlit
21da0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 32 30 30 20  e3_malloc64(200 
21db0 2b 20 6e 54 61 62 6c 65 20 2b 20 6e 2a 33 29 3b  + nTable + n*3);
21dc0 0a 20 20 69 66 28 20 7a 49 6e 73 65 72 74 3d 3d  .  if( zInsert==
21dd0 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66  0 ) shell_out_of
21de0 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 73 71 6c  _memory();.  sql
21df0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30  ite3_snprintf(20
21e00 30 2b 6e 54 61 62 6c 65 2c 7a 49 6e 73 65 72 74  0+nTable,zInsert
21e10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21e20 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20       "INSERT OR 
21e30 49 47 4e 4f 52 45 20 49 4e 54 4f 20 5c 22 25 73  IGNORE INTO \"%s
21e40 5c 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54  \" VALUES(?", zT
21e50 61 62 6c 65 29 3b 0a 20 20 69 20 3d 20 73 74 72  able);.  i = str
21e60 6c 65 6e 33 30 28 7a 49 6e 73 65 72 74 29 3b 0a  len30(zInsert);.
21e70 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 3b 20    for(j=1; j<n; 
21e80 6a 2b 2b 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  j++){.    memcpy
21e90 28 7a 49 6e 73 65 72 74 2b 69 2c 20 22 2c 3f 22  (zInsert+i, ",?"
21ea0 2c 20 32 29 3b 0a 20 20 20 20 69 20 2b 3d 20 32  , 2);.    i += 2
21eb0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a  ;.  }.  memcpy(z
21ec0 49 6e 73 65 72 74 2b 69 2c 20 22 29 3b 22 2c 20  Insert+i, ");", 
21ed0 33 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  3);.  rc = sqlit
21ee0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 6e 65  e3_prepare_v2(ne
21ef0 77 44 62 2c 20 7a 49 6e 73 65 72 74 2c 20 2d 31  wDb, zInsert, -1
21f00 2c 20 26 70 49 6e 73 65 72 74 2c 20 30 29 3b 0a  , &pInsert, 0);.
21f10 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
21f20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
21f30 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25  rr, "Error %d: %
21f40 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20  s on [%s]\n",.  
21f50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21f60 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
21f70 64 65 28 6e 65 77 44 62 29 2c 20 73 71 6c 69 74  de(newDb), sqlit
21f80 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29  e3_errmsg(newDb)
21f90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 51  ,.            zQ
21fa0 75 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20  uery);.    goto 
21fb0 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20  end_data_xfer;. 
21fc0 20 7d 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c   }.  for(k=0; k<
21fd0 32 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 77 68 69  2; k++){.    whi
21fe0 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  le( (rc = sqlite
21ff0 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d  3_step(pQuery))=
22000 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
22010 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
22020 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
22030 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
22040 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 51 75  _column_type(pQu
22050 65 72 79 2c 20 69 29 20 29 7b 0a 20 20 20 20 20  ery, i) ){.     
22060 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
22070 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20  _NULL: {.       
22080 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
22090 64 5f 6e 75 6c 6c 28 70 49 6e 73 65 72 74 2c 20  d_null(pInsert, 
220a0 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  i+1);.          
220b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
220c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
220d0 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
220e0 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ER: {.          
220f0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
22100 6e 74 36 34 28 70 49 6e 73 65 72 74 2c 20 69 2b  nt64(pInsert, i+
22110 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  1, sqlite3_colum
22120 6e 5f 69 6e 74 36 34 28 70 51 75 65 72 79 2c 69  n_int64(pQuery,i
22130 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
22140 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
22150 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   }.          cas
22160 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
22170 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
22180 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
22190 65 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20  e(pInsert, i+1, 
221a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
221b0 6f 75 62 6c 65 28 70 51 75 65 72 79 2c 69 29 29  ouble(pQuery,i))
221c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
221d0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
221e0 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
221f0 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20  SQLITE_TEXT: {. 
22200 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
22210 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 49 6e  e3_bind_text(pIn
22220 73 65 72 74 2c 20 69 2b 31 2c 0a 20 20 20 20 20  sert, i+1,.     
22230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22240 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63          (const c
22250 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
22260 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c  umn_text(pQuery,
22270 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i),.            
22280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22290 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
222a0 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  IC);.           
222b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
222c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61    }.          ca
222d0 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20  se SQLITE_BLOB: 
222e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
222f0 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
22300 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71  pInsert, i+1, sq
22310 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
22320 62 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20  b(pQuery,i),.   
22330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22350 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22360 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 51  _column_bytes(pQ
22370 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20  uery,i),.       
22380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223a0 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 41 54       SQLITE_STAT
223b0 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  IC);.           
223c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
223d0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
223e0 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72      } /* End for
223f0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
22400 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73  qlite3_step(pIns
22410 65 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ert);.      if( 
22420 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
22430 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
22440 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  && rc!=SQLITE_DO
22450 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  NE ){.        ut
22460 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
22470 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 5c  , "Error %d: %s\
22480 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 78 74 65  n", sqlite3_exte
22490 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77  nded_errcode(new
224a0 44 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Db),.           
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
224c0 69 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44  ite3_errmsg(newD
224d0 62 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b));.      }.   
224e0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74     sqlite3_reset
224f0 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20  (pInsert);.     
22500 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66   cnt++;.      if
22510 28 20 28 63 6e 74 25 73 70 69 6e 52 61 74 65 29  ( (cnt%spinRate)
22520 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
22530 72 69 6e 74 66 28 22 25 63 5c 62 22 2c 20 22 7c  rintf("%c\b", "|
22540 2f 2d 5c 5c 22 5b 28 63 6e 74 2f 73 70 69 6e 52  /-\\"[(cnt/spinR
22550 61 74 65 29 25 34 5d 29 3b 0a 20 20 20 20 20 20  ate)%4]);.      
22560 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
22570 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
22580 2f 2a 20 45 6e 64 20 77 68 69 6c 65 20 2a 2f 0a  /* End while */.
22590 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
225a0 54 45 5f 44 4f 4e 45 20 29 20 62 72 65 61 6b 3b  TE_DONE ) break;
225b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
225c0 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20  alize(pQuery);. 
225d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
225e0 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75  zQuery);.    zQu
225f0 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ery = sqlite3_mp
22600 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20  rintf("SELECT * 
22610 46 52 4f 4d 20 5c 22 25 77 5c 22 20 4f 52 44 45  FROM \"%w\" ORDE
22620 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 3b  R BY rowid DESC;
22630 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
22640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22650 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 63 20  zTable);.    rc 
22660 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
22670 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65  e_v2(p->db, zQue
22680 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c  ry, -1, &pQuery,
22690 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
226a0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
226b0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 61  intf(stderr, "Wa
226c0 72 6e 69 6e 67 3a 20 63 61 6e 6e 6f 74 20 73 74  rning: cannot st
226d0 65 70 20 5c 22 25 73 5c 22 20 62 61 63 6b 77 61  ep \"%s\" backwa
226e0 72 64 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  rds", zTable);. 
226f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22700 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72  }.  } /* End for
22710 28 6b 3d 30 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e 64  (k=0...) */..end
22720 5f 64 61 74 61 5f 78 66 65 72 3a 0a 20 20 73 71  _data_xfer:.  sq
22730 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
22740 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65  Query);.  sqlite
22750 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e 73 65  3_finalize(pInse
22760 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  rt);.  sqlite3_f
22770 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 73  ree(zQuery);.  s
22780 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73  qlite3_free(zIns
22790 65 72 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ert);.}.../*.** 
227a0 54 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20  Try to transfer 
227b0 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20  all rows of the 
227c0 73 63 68 65 6d 61 20 74 68 61 74 20 6d 61 74 63  schema that matc
227d0 68 20 7a 57 68 65 72 65 2e 20 20 46 6f 72 0a 2a  h zWhere.  For.*
227e0 2a 20 65 61 63 68 20 72 6f 77 2c 20 69 6e 76 6f  * each row, invo
227f0 6b 65 20 78 46 6f 72 45 61 63 68 28 29 20 6f 6e  ke xForEach() on
22800 20 74 68 65 20 6f 62 6a 65 63 74 20 64 65 66 69   the object defi
22810 6e 65 64 20 62 79 20 74 68 61 74 20 72 6f 77 2e  ned by that row.
22820 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
22830 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  is encountered w
22840 68 69 6c 65 20 6d 6f 76 69 6e 67 20 66 6f 72 77  hile moving forw
22850 61 72 64 20 74 68 72 6f 75 67 68 20 74 68 65 0a  ard through the.
22860 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
22870 20 74 61 62 6c 65 2c 20 74 72 79 20 61 67 61 69   table, try agai
22880 6e 20 6d 6f 76 69 6e 67 20 62 61 63 6b 77 61 72  n moving backwar
22890 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
228a0 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68  id tryToCloneSch
228b0 65 6d 61 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  ema(.  ShellStat
228c0 65 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20  e *p,.  sqlite3 
228d0 2a 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20  *newDb,.  const 
228e0 63 68 61 72 20 2a 7a 57 68 65 72 65 2c 0a 20 20  char *zWhere,.  
228f0 76 6f 69 64 20 28 2a 78 46 6f 72 45 61 63 68 29  void (*xForEach)
22900 28 53 68 65 6c 6c 53 74 61 74 65 2a 2c 73 71 6c  (ShellState*,sql
22910 69 74 65 33 2a 2c 63 6f 6e 73 74 20 63 68 61 72  ite3*,const char
22920 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  *).){.  sqlite3_
22930 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30  stmt *pQuery = 0
22940 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79  ;.  char *zQuery
22950 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
22960 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
22970 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
22980 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
22990 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61  har *zSql;.  cha
229a0 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
229b0 0a 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69  .  zQuery = sqli
229c0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
229d0 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52  ECT name, sql FR
229e0 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
229f0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
22a00 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
22a10 48 45 52 45 20 25 73 22 2c 20 7a 57 68 65 72 65  HERE %s", zWhere
22a20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
22a30 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
22a40 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
22a50 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69  &pQuery, 0);.  i
22a60 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66  f( rc ){.    utf
22a70 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
22a80 20 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73   "Error: (%d) %s
22a90 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20   on [%s]\n",.   
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ab0 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
22ac0 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  d_errcode(p->db)
22ad0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
22ae0 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20  (p->db),.       
22af0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75               zQu
22b00 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ery);.    goto e
22b10 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a  nd_schema_xfer;.
22b20 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 28 72 63    }.  while( (rc
22b30 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
22b40 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45  pQuery))==SQLITE
22b50 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  _ROW ){.    zNam
22b60 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
22b70 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20  mn_text(pQuery, 
22b80 30 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73  0);.    zSql = s
22b90 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
22ba0 78 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20  xt(pQuery, 1);. 
22bb0 20 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e     printf("%s...
22bc0 20 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75   ", zName); fflu
22bd0 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20  sh(stdout);.    
22be0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
22bf0 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  Db, (const char*
22c00 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45  )zSql, 0, 0, &zE
22c10 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20  rrMsg);.    if( 
22c20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
22c30 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
22c40 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
22c50 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  nSQL: [%s]\n", z
22c60 45 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20  ErrMsg, zSql);. 
22c70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22c80 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
22c90 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20    zErrMsg = 0;. 
22ca0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 78 46 6f     }.    if( xFo
22cb0 72 45 61 63 68 20 29 7b 0a 20 20 20 20 20 20 78  rEach ){.      x
22cc0 46 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62  ForEach(p, newDb
22cd0 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  , (const char*)z
22ce0 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
22cf0 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22   printf("done\n"
22d00 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
22d10 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
22d20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
22d30 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20  lize(pQuery);.  
22d40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22d50 51 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65  Query);.    zQue
22d60 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
22d70 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d  intf("SELECT nam
22d80 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
22d90 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
22da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22db0 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
22dc0 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  %s ORDER BY rowi
22dd0 64 20 44 45 53 43 22 2c 20 7a 57 68 65 72 65 29  d DESC", zWhere)
22de0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
22df0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
22e00 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c  >db, zQuery, -1,
22e10 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20   &pQuery, 0);.  
22e20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
22e30 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
22e40 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 28 25  derr, "Error: (%
22e50 64 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22  d) %s on [%s]\n"
22e60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22e70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
22e80 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
22e90 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33  (p->db), sqlite3
22ea0 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a  _errmsg(p->db),.
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20        zQuery);. 
22ed0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63       goto end_sc
22ee0 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20 20 20 7d  hema_xfer;.    }
22ef0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20  .    while( (rc 
22f00 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
22f10 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f  Query))==SQLITE_
22f20 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61  ROW ){.      zNa
22f30 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  me = sqlite3_col
22f40 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c  umn_text(pQuery,
22f50 20 30 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20   0);.      zSql 
22f60 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
22f70 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 31 29  _text(pQuery, 1)
22f80 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  ;.      printf("
22f90 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b  %s... ", zName);
22fa0 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
22fb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65  .      sqlite3_e
22fc0 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73  xec(newDb, (cons
22fd0 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c  t char*)zSql, 0,
22fe0 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20   0, &zErrMsg);. 
22ff0 20 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67       if( zErrMsg
23000 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
23010 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
23020 22 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a  "Error: %s\nSQL:
23030 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73   [%s]\n", zErrMs
23040 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  g, zSql);.      
23050 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23060 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
23070 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20   zErrMsg = 0;.  
23080 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23090 78 46 6f 72 45 61 63 68 20 29 7b 0a 20 20 20 20  xForEach ){.    
230a0 20 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c 20      xForEach(p, 
230b0 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68  newDb, (const ch
230c0 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ar*)zName);.    
230d0 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66    }.      printf
230e0 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 20 20  ("done\n");.    
230f0 7d 0a 20 20 7d 0a 65 6e 64 5f 73 63 68 65 6d 61  }.  }.end_schema
23100 5f 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33  _xfer:.  sqlite3
23110 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79  _finalize(pQuery
23120 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
23130 65 28 7a 51 75 65 72 79 29 3b 0a 7d 0a 0a 2f 2a  e(zQuery);.}../*
23140 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64  .** Open a new d
23150 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
23160 65 64 20 22 7a 4e 65 77 44 62 22 2e 20 20 54 72  ed "zNewDb".  Tr
23170 79 20 74 6f 20 72 65 63 6f 76 65 72 20 61 73 20  y to recover as 
23180 6d 75 63 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  much information
23190 0a 2a 2a 20 61 73 20 70 6f 73 73 69 62 6c 65 20  .** as possible 
231a0 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
231b0 64 61 74 61 62 61 73 65 20 28 77 68 69 63 68 20  database (which 
231c0 6d 69 67 68 74 20 62 65 20 63 6f 72 72 75 70 74  might be corrupt
231d0 29 20 61 6e 64 20 77 72 69 74 65 20 69 74 0a 2a  ) and write it.*
231e0 2a 20 69 6e 74 6f 20 7a 4e 65 77 44 62 2e 0a 2a  * into zNewDb..*
231f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72  /.static void tr
23200 79 54 6f 43 6c 6f 6e 65 28 53 68 65 6c 6c 53 74  yToClone(ShellSt
23210 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ate *p, const ch
23220 61 72 20 2a 7a 4e 65 77 44 62 29 7b 0a 20 20 69  ar *zNewDb){.  i
23230 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
23240 20 2a 6e 65 77 44 62 20 3d 20 30 3b 0a 20 20 69   *newDb = 0;.  i
23250 66 28 20 61 63 63 65 73 73 28 7a 4e 65 77 44 62  f( access(zNewDb
23260 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74  ,0)==0 ){.    ut
23270 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
23280 2c 20 22 46 69 6c 65 20 5c 22 25 73 5c 22 20 61  , "File \"%s\" a
23290 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 5c 6e  lready exists.\n
232a0 22 2c 20 7a 4e 65 77 44 62 29 3b 0a 20 20 20 20  ", zNewDb);.    
232b0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63  return;.  }.  rc
232c0 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28   = sqlite3_open(
232d0 7a 4e 65 77 44 62 2c 20 26 6e 65 77 44 62 29 3b  zNewDb, &newDb);
232e0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
232f0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
23300 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 72 65  err, "Cannot cre
23310 61 74 65 20 6f 75 74 70 75 74 20 64 61 74 61 62  ate output datab
23320 61 73 65 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20  ase: %s\n",.    
23330 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
23340 65 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a  errmsg(newDb));.
23350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
23360 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
23370 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
23380 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 22 2c 20 30  e_schema=ON;", 0
23390 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
233a0 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c  ite3_exec(newDb,
233b0 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56   "BEGIN EXCLUSIV
233c0 45 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  E;", 0, 0, 0);. 
233d0 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68     tryToCloneSch
233e0 65 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74  ema(p, newDb, "t
233f0 79 70 65 3d 27 74 61 62 6c 65 27 22 2c 20 74 72  ype='table'", tr
23400 79 54 6f 43 6c 6f 6e 65 44 61 74 61 29 3b 0a 20  yToCloneData);. 
23410 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68     tryToCloneSch
23420 65 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74  ema(p, newDb, "t
23430 79 70 65 21 3d 27 74 61 62 6c 65 27 22 2c 20 30  ype!='table'", 0
23440 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  );.    sqlite3_e
23450 78 65 63 28 6e 65 77 44 62 2c 20 22 43 4f 4d 4d  xec(newDb, "COMM
23460 49 54 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  IT;", 0, 0, 0);.
23470 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
23480 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20  (p->db, "PRAGMA 
23490 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
234a0 4f 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b  OFF;", 0, 0, 0);
234b0 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 5f 64 62 28  .  }.  close_db(
234c0 6e 65 77 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  newDb);.}../*.**
234d0 20 43 68 61 6e 67 65 20 74 68 65 20 6f 75 74 70   Change the outp
234e0 75 74 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  ut file back to 
234f0 73 74 64 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  stdout..**.** If
23500 20 74 68 65 20 70 2d 3e 64 6f 58 64 67 4f 70 65   the p->doXdgOpe
23510 6e 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  n flag is set, t
23520 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 6f 75  hat means the ou
23530 74 70 75 74 20 77 61 73 20 62 65 69 6e 67 0a 2a  tput was being.*
23540 2a 20 72 65 64 69 72 65 63 74 65 64 20 74 6f 20  * redirected to 
23550 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
23560 20 6e 61 6d 65 64 20 62 79 20 70 2d 3e 7a 54 65   named by p->zTe
23570 6d 70 46 69 6c 65 2e 20 20 49 6e 20 74 68 61 74  mpFile.  In that
23580 20 63 61 73 65 2c 0a 2a 2a 20 6c 61 75 6e 63 68   case,.** launch
23590 20 73 74 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d   start/open/xdg-
235a0 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 74 65 6d  open on that tem
235b0 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a  porary file..*/.
235c0 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
235d0 75 74 5f 72 65 73 65 74 28 53 68 65 6c 6c 53 74  ut_reset(ShellSt
235e0 61 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ate *p){.  if( p
235f0 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 3d 3d 27 7c  ->outfile[0]=='|
23600 27 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ' ){.#ifndef SQL
23610 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20  ITE_OMIT_POPEN. 
23620 20 20 20 70 63 6c 6f 73 65 28 70 2d 3e 6f 75 74     pclose(p->out
23630 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
23640 65 7b 0a 20 20 20 20 6f 75 74 70 75 74 5f 66 69  e{.    output_fi
23650 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29  le_close(p->out)
23660 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
23670 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20  _NOHAVE_SYSTEM. 
23680 20 20 20 69 66 28 20 70 2d 3e 64 6f 58 64 67 4f     if( p->doXdgO
23690 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  pen ){.      con
236a0 73 74 20 63 68 61 72 20 2a 7a 58 64 67 4f 70 65  st char *zXdgOpe
236b0 6e 43 6d 64 20 3d 0a 23 69 66 20 64 65 66 69 6e  nCmd =.#if defin
236c0 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 20 20 20  ed(_WIN32).     
236d0 20 22 73 74 61 72 74 22 3b 0a 23 65 6c 69 66 20   "start";.#elif 
236e0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
236f0 5f 29 0a 20 20 20 20 20 20 22 6f 70 65 6e 22 3b  _).      "open";
23700 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22 78 64  .#else.      "xd
23710 67 2d 6f 70 65 6e 22 3b 0a 23 65 6e 64 69 66 0a  g-open";.#endif.
23720 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6d 64        char *zCmd
23730 3b 0a 20 20 20 20 20 20 7a 43 6d 64 20 3d 20 73  ;.      zCmd = s
23740 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
23750 25 73 20 25 73 22 2c 20 7a 58 64 67 4f 70 65 6e  %s %s", zXdgOpen
23760 43 6d 64 2c 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  Cmd, p->zTempFil
23770 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 79  e);.      if( sy
23780 73 74 65 6d 28 7a 43 6d 64 29 20 29 7b 0a 20 20  stem(zCmd) ){.  
23790 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
237a0 66 28 73 74 64 65 72 72 2c 20 22 46 61 69 6c 65  f(stderr, "Faile
237b0 64 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 43 6d 64  d: [%s]\n", zCmd
237c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
237d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
237e0 6d 64 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75  md);.      outpu
237f0 74 4d 6f 64 65 50 6f 70 28 70 29 3b 0a 20 20 20  tModePop(p);.   
23800 20 20 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20     p->doXdgOpen 
23810 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 0;.    }.#endi
23820 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
23830 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54  LITE_NOHAVE_SYST
23840 45 4d 29 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e  EM) */.  }.  p->
23850 6f 75 74 66 69 6c 65 5b 30 5d 20 3d 20 30 3b 0a  outfile[0] = 0;.
23860 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75    p->out = stdou
23870 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  t;.}../*.** Run 
23880 61 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 61  an SQL command a
23890 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 69  nd return the si
238a0 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 72 65 73  ngle integer res
238b0 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
238c0 6e 74 20 64 62 5f 69 6e 74 28 53 68 65 6c 6c 53  nt db_int(ShellS
238d0 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tate *p, const c
238e0 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 73 71  har *zSql){.  sq
238f0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
23900 74 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30  t;.  int res = 0
23910 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ;.  sqlite3_prep
23920 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
23930 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
23940 30 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20  0);.  if( pStmt 
23950 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  && sqlite3_step(
23960 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
23970 4f 57 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  OW ){.    res = 
23980 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
23990 6e 74 28 70 53 74 6d 74 2c 30 29 3b 0a 20 20 7d  nt(pStmt,0);.  }
239a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
239b0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 72 65  ize(pStmt);.  re
239c0 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
239d0 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 32 2d 62  ** Convert a 2-b
239e0 79 74 65 20 6f 72 20 34 2d 62 79 74 65 20 62 69  yte or 4-byte bi
239f0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
23a00 20 69 6e 74 6f 20 61 20 6e 61 74 69 76 65 20 69   into a native i
23a10 6e 74 65 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63  nteger.*/.static
23a20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67 65   unsigned int ge
23a30 74 32 62 79 74 65 49 6e 74 28 75 6e 73 69 67 6e  t2byteInt(unsign
23a40 65 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20 72  ed char *a){.  r
23a50 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 38 29 20  eturn (a[0]<<8) 
23a60 2b 20 61 5b 31 5d 3b 0a 7d 0a 73 74 61 74 69 63  + a[1];.}.static
23a70 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67 65   unsigned int ge
23a80 74 34 62 79 74 65 49 6e 74 28 75 6e 73 69 67 6e  t4byteInt(unsign
23a90 65 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20 72  ed char *a){.  r
23aa0 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 32 34 29  eturn (a[0]<<24)
23ab0 20 2b 20 28 61 5b 31 5d 3c 3c 31 36 29 20 2b 20   + (a[1]<<16) + 
23ac0 28 61 5b 32 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d  (a[2]<<8) + a[3]
23ad0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
23ae0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
23af0 20 22 2e 69 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64   ".info" command
23b00 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  ..**.** Return 1
23b10 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f 20   on error, 2 to 
23b20 65 78 69 74 2c 20 61 6e 64 20 30 20 6f 74 68 65  exit, and 0 othe
23b30 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
23b40 20 69 6e 74 20 73 68 65 6c 6c 5f 64 62 69 6e 66   int shell_dbinf
23b50 6f 5f 63 6f 6d 6d 61 6e 64 28 53 68 65 6c 6c 53  o_command(ShellS
23b60 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 6e 41 72  tate *p, int nAr
23b70 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 29  g, char **azArg)
23b80 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
23b90 20 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74 20   struct { const 
23ba0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 69 6e 74  char *zName; int
23bb0 20 6f 66 73 74 3b 20 7d 20 61 46 69 65 6c 64 5b   ofst; } aField[
23bc0 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 66 69  ] = {.     { "fi
23bd0 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  le change counte
23be0 72 3a 22 2c 20 20 32 34 20 20 7d 2c 0a 20 20 20  r:",  24  },.   
23bf0 20 20 7b 20 22 64 61 74 61 62 61 73 65 20 70 61    { "database pa
23c00 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20 32 38 20  ge count:",  28 
23c10 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 72 65 65   },.     { "free
23c20 6c 69 73 74 20 70 61 67 65 20 63 6f 75 6e 74 3a  list page count:
23c30 22 2c 20 20 33 36 20 20 7d 2c 0a 20 20 20 20 20  ",  36  },.     
23c40 7b 20 22 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  { "schema cookie
23c50 3a 22 2c 20 20 20 20 20 20 20 20 34 30 20 20 7d  :",        40  }
23c60 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d 61  ,.     { "schema
23c70 20 66 6f 72 6d 61 74 3a 22 2c 20 20 20 20 20 20   format:",      
23c80 20 20 34 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20    44  },.     { 
23c90 22 64 65 66 61 75 6c 74 20 63 61 63 68 65 20 73  "default cache s
23ca0 69 7a 65 3a 22 2c 20 20 20 34 38 20 20 7d 2c 0a  ize:",   48  },.
23cb0 20 20 20 20 20 7b 20 22 61 75 74 6f 76 61 63 75       { "autovacu
23cc0 75 6d 20 74 6f 70 20 72 6f 6f 74 3a 22 2c 20 20  um top root:",  
23cd0 35 32 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 69  52  },.     { "i
23ce0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
23cf0 6d 3a 22 2c 20 20 20 36 34 20 20 7d 2c 0a 20 20  m:",   64  },.  
23d00 20 20 20 7b 20 22 74 65 78 74 20 65 6e 63 6f 64     { "text encod
23d10 69 6e 67 3a 22 2c 20 20 20 20 20 20 20 20 35 36  ing:",        56
23d20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73 65    },.     { "use
23d30 72 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20  r version:",    
23d40 20 20 20 20 20 36 30 20 20 7d 2c 0a 20 20 20 20       60  },.    
23d50 20 7b 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 20   { "application 
23d60 69 64 3a 22 2c 20 20 20 20 20 20 20 36 38 20 20  id:",       68  
23d70 7d 2c 0a 20 20 20 20 20 7b 20 22 73 6f 66 74 77  },.     { "softw
23d80 61 72 65 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20  are version:",  
23d90 20 20 20 39 36 20 20 7d 2c 0a 20 20 7d 3b 0a 20     96  },.  };. 
23da0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
23db0 72 75 63 74 20 7b 20 63 6f 6e 73 74 20 63 68 61  ruct { const cha
23dc0 72 20 2a 7a 4e 61 6d 65 3b 20 63 6f 6e 73 74 20  r *zName; const 
23dd0 63 68 61 72 20 2a 7a 53 71 6c 3b 20 7d 20 61 51  char *zSql; } aQ
23de0 75 65 72 79 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  uery[] = {.     
23df0 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 74 61 62  { "number of tab
23e00 6c 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53  les:",.       "S
23e10 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
23e20 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70  ROM %s WHERE typ
23e30 65 3d 27 74 61 62 6c 65 27 22 20 7d 2c 0a 20 20  e='table'" },.  
23e40 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20     { "number of 
23e50 69 6e 64 65 78 65 73 3a 22 2c 0a 20 20 20 20 20  indexes:",.     
23e60 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
23e70 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45  *) FROM %s WHERE
23e80 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 20 7d   type='index'" }
23e90 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72  ,.     { "number
23ea0 20 6f 66 20 74 72 69 67 67 65 72 73 3a 22 2c 0a   of triggers:",.
23eb0 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
23ec0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20  ount(*) FROM %s 
23ed0 57 48 45 52 45 20 74 79 70 65 3d 27 74 72 69 67  WHERE type='trig
23ee0 67 65 72 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20  ger'" },.     { 
23ef0 22 6e 75 6d 62 65 72 20 6f 66 20 76 69 65 77 73  "number of views
23f00 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
23f10 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
23f20 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27   %s WHERE type='
23f30 76 69 65 77 27 22 20 7d 2c 0a 20 20 20 20 20 7b  view'" },.     {
23f40 20 22 73 63 68 65 6d 61 20 73 69 7a 65 3a 22 2c   "schema size:",
23f50 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  .       "SELECT 
23f60 74 6f 74 61 6c 28 6c 65 6e 67 74 68 28 73 71 6c  total(length(sql
23f70 29 29 20 46 52 4f 4d 20 25 73 22 20 7d 2c 0a 20  )) FROM %s" },. 
23f80 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75   };.  int i;.  u
23f90 6e 73 69 67 6e 65 64 20 69 44 61 74 61 56 65 72  nsigned iDataVer
23fa0 73 69 6f 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53  sion;.  char *zS
23fb0 63 68 65 6d 61 54 61 62 3b 0a 20 20 63 68 61 72  chemaTab;.  char
23fc0 20 2a 7a 44 62 20 3d 20 6e 41 72 67 3e 3d 32 20   *zDb = nArg>=2 
23fd0 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 6d 61  ? azArg[1] : "ma
23fe0 69 6e 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  in";.  sqlite3_s
23ff0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
24000 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
24010 61 48 64 72 5b 31 30 30 5d 3b 0a 20 20 6f 70 65  aHdr[100];.  ope
24020 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 69 66  n_db(p, 0);.  if
24030 28 20 70 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74  ( p->db==0 ) ret
24040 75 72 6e 20 31 3b 0a 20 20 73 71 6c 69 74 65 33  urn 1;.  sqlite3
24050 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
24060 62 2c 22 53 45 4c 45 43 54 20 64 61 74 61 20 46  b,"SELECT data F
24070 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70 61 67  ROM sqlite_dbpag
24080 65 28 3f 31 29 20 57 48 45 52 45 20 70 67 6e 6f  e(?1) WHERE pgno
24090 3d 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  =1",.           
240a0 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70            -1, &p
240b0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Stmt, 0);.  sqli
240c0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
240d0 74 6d 74 2c 20 31 2c 20 7a 44 62 2c 20 2d 31 2c  tmt, 1, zDb, -1,
240e0 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
240f0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
24100 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
24110 54 45 5f 52 4f 57 0a 20 20 20 26 26 20 73 71 6c  TE_ROW.   && sql
24120 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
24130 73 28 70 53 74 6d 74 2c 30 29 3e 31 30 30 0a 20  s(pStmt,0)>100. 
24140 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 61   ){.    memcpy(a
24150 48 64 72 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  Hdr, sqlite3_col
24160 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 30  umn_blob(pStmt,0
24170 29 2c 20 31 30 30 29 3b 0a 20 20 20 20 73 71 6c  ), 100);.    sql
24180 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
24190 74 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tmt);.  }else{. 
241a0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
241b0 64 65 72 72 2c 20 22 75 6e 61 62 6c 65 20 74 6f  derr, "unable to
241c0 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68   read database h
241d0 65 61 64 65 72 5c 6e 22 29 3b 0a 20 20 20 20 73  eader\n");.    s
241e0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
241f0 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 65 74 75  pStmt);.    retu
24200 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 20 3d 20  rn 1;.  }.  i = 
24210 67 65 74 32 62 79 74 65 49 6e 74 28 61 48 64 72  get2byteInt(aHdr
24220 2b 31 36 29 3b 0a 20 20 69 66 28 20 69 3d 3d 31  +16);.  if( i==1
24230 20 29 20 69 20 3d 20 36 35 35 33 36 3b 0a 20 20   ) i = 65536;.  
24240 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
24250 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22  ut, "%-20s %d\n"
24260 2c 20 22 64 61 74 61 62 61 73 65 20 70 61 67 65  , "database page
24270 20 73 69 7a 65 3a 22 2c 20 69 29 3b 0a 20 20 75   size:", i);.  u
24280 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
24290 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c  t, "%-20s %d\n",
242a0 20 22 77 72 69 74 65 20 66 6f 72 6d 61 74 3a 22   "write format:"
242b0 2c 20 61 48 64 72 5b 31 38 5d 29 3b 0a 20 20 75  , aHdr[18]);.  u
242c0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
242d0 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c  t, "%-20s %d\n",
242e0 20 22 72 65 61 64 20 66 6f 72 6d 61 74 3a 22 2c   "read format:",
242f0 20 61 48 64 72 5b 31 39 5d 29 3b 0a 20 20 75 74   aHdr[19]);.  ut
24300 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
24310 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20  , "%-20s %d\n", 
24320 22 72 65 73 65 72 76 65 64 20 62 79 74 65 73 3a  "reserved bytes:
24330 22 2c 20 61 48 64 72 5b 32 30 5d 29 3b 0a 20 20  ", aHdr[20]);.  
24340 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
24350 53 69 7a 65 28 61 46 69 65 6c 64 29 3b 20 69 2b  Size(aField); i+
24360 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74  +){.    int ofst
24370 20 3d 20 61 46 69 65 6c 64 5b 69 5d 2e 6f 66 73   = aField[i].ofs
24380 74 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  t;.    unsigned 
24390 69 6e 74 20 76 61 6c 20 3d 20 67 65 74 34 62 79  int val = get4by
243a0 74 65 49 6e 74 28 61 48 64 72 20 2b 20 6f 66 73  teInt(aHdr + ofs
243b0 74 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  t);.    utf8_pri
243c0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32  ntf(p->out, "%-2
243d0 30 73 20 25 75 22 2c 20 61 46 69 65 6c 64 5b 69  0s %u", aField[i
243e0 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20  ].zName, val);. 
243f0 20 20 20 73 77 69 74 63 68 28 20 6f 66 73 74 20     switch( ofst 
24400 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 35 36  ){.      case 56
24410 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
24420 76 61 6c 3d 3d 31 20 29 20 72 61 77 5f 70 72 69  val==1 ) raw_pri
24430 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75  ntf(p->out, " (u
24440 74 66 38 29 22 29 3b 0a 20 20 20 20 20 20 20 20  tf8)");.        
24450 69 66 28 20 76 61 6c 3d 3d 32 20 29 20 72 61 77  if( val==2 ) raw
24460 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
24470 22 20 28 75 74 66 31 36 6c 65 29 22 29 3b 0a 20  " (utf16le)");. 
24480 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d         if( val==
24490 33 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  3 ) raw_printf(p
244a0 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 31 36 62  ->out, " (utf16b
244b0 65 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e)");.      }.  
244c0 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e    }.    raw_prin
244d0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29  tf(p->out, "\n")
244e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 44 62 3d  ;.  }.  if( zDb=
244f0 3d 30 20 29 7b 0a 20 20 20 20 7a 53 63 68 65 6d  =0 ){.    zSchem
24500 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d  aTab = sqlite3_m
24510 70 72 69 6e 74 66 28 22 6d 61 69 6e 2e 73 71 6c  printf("main.sql
24520 69 74 65 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20  ite_master");.  
24530 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
24540 28 7a 44 62 2c 22 74 65 6d 70 22 29 3d 3d 30 20  (zDb,"temp")==0 
24550 29 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61  ){.    zSchemaTa
24560 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  b = sqlite3_mpri
24570 6e 74 66 28 22 25 73 22 2c 20 22 73 71 6c 69 74  ntf("%s", "sqlit
24580 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 29 3b  e_temp_master");
24590 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53  .  }else{.    zS
245a0 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74  chemaTab = sqlit
245b0 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77  e3_mprintf("\"%w
245c0 5c 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  \".sqlite_master
245d0 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 66  ", zDb);.  }.  f
245e0 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
245f0 69 7a 65 28 61 51 75 65 72 79 29 3b 20 69 2b 2b  ize(aQuery); i++
24600 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  ){.    char *zSq
24610 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
24620 6e 74 66 28 61 51 75 65 72 79 5b 69 5d 2e 7a 53  ntf(aQuery[i].zS
24630 71 6c 2c 20 7a 53 63 68 65 6d 61 54 61 62 29 3b  ql, zSchemaTab);
24640 0a 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 64  .    int val = d
24650 62 5f 69 6e 74 28 70 2c 20 7a 53 71 6c 29 3b 0a  b_int(p, zSql);.
24660 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24670 28 7a 53 71 6c 29 3b 0a 20 20 20 20 75 74 66 38  (zSql);.    utf8
24680 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
24690 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 61 51  "%-20s %d\n", aQ
246a0 75 65 72 79 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76  uery[i].zName, v
246b0 61 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  al);.  }.  sqlit
246c0 65 33 5f 66 72 65 65 28 7a 53 63 68 65 6d 61 54  e3_free(zSchemaT
246d0 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ab);.  sqlite3_f
246e0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64  ile_control(p->d
246f0 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46  b, zDb, SQLITE_F
24700 43 4e 54 4c 5f 44 41 54 41 5f 56 45 52 53 49 4f  CNTL_DATA_VERSIO
24710 4e 2c 20 26 69 44 61 74 61 56 65 72 73 69 6f 6e  N, &iDataVersion
24720 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  );.  utf8_printf
24730 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20  (p->out, "%-20s 
24740 25 75 5c 6e 22 2c 20 22 64 61 74 61 20 76 65 72  %u\n", "data ver
24750 73 69 6f 6e 22 2c 20 69 44 61 74 61 56 65 72 73  sion", iDataVers
24760 69 6f 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ion);.  return 0
24770 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ;.}../*.** Print
24780 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c   the current sql
24790 69 74 65 33 5f 65 72 72 6d 73 67 28 29 20 76 61  ite3_errmsg() va
247a0 6c 75 65 20 74 6f 20 73 74 64 65 72 72 20 61 6e  lue to stderr an
247b0 64 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 73  d return 1..*/.s
247c0 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 44  tatic int shellD
247d0 61 74 61 62 61 73 65 45 72 72 6f 72 28 73 71 6c  atabaseError(sql
247e0 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e  ite3 *db){.  con
247f0 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  st char *zErr = 
24800 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
24810 62 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  b);.  utf8_print
24820 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
24830 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a  : %s\n", zErr);.
24840 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
24850 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
24860 20 70 61 74 74 65 72 6e 20 69 6e 20 7a 47 6c 6f   pattern in zGlo
24870 62 5b 5d 20 61 67 61 69 6e 73 74 20 74 68 65 20  b[] against the 
24880 74 65 78 74 20 69 6e 20 7a 5b 5d 2e 20 20 52 65  text in z[].  Re
24890 74 75 72 6e 20 54 52 55 45 0a 2a 2a 20 69 66 20  turn TRUE.** if 
248a0 74 68 65 79 20 6d 61 74 63 68 20 61 6e 64 20 46  they match and F
248b0 41 4c 53 45 20 28 30 29 20 69 66 20 74 68 65 79  ALSE (0) if they
248c0 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a   do not match..*
248d0 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20 72 75  *.** Globbing ru
248e0 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
248f0 27 2a 27 20 20 20 20 20 20 20 4d 61 74 63 68 65  '*'       Matche
24900 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f  s any sequence o
24910 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63  f zero or more c
24920 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  haracters..**.**
24930 20 20 20 20 20 20 27 3f 27 20 20 20 20 20 20 20        '?'       
24940 4d 61 74 63 68 65 73 20 65 78 61 63 74 6c 79 20  Matches exactly 
24950 6f 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  one character..*
24960 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20 20  *.**     [...]  
24970 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20      Matches one 
24980 63 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20 74  character from t
24990 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74  he enclosed list
249a0 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
249b0 20 20 20 20 20 20 63 68 61 72 61 63 74 65 72 73        characters
249c0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e  ..**.**     [^..
249d0 2e 5d 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f  .]     Matches o
249e0 6e 65 20 63 68 61 72 61 63 74 65 72 20 6e 6f 74  ne character not
249f0 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73 65 64   in the enclosed
24a00 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   list..**.**    
24a10 20 20 27 23 27 20 20 20 20 20 20 20 4d 61 74 63    '#'       Matc
24a20 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65  hes any sequence
24a30 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   of one or more 
24a40 64 69 67 69 74 73 20 77 69 74 68 20 61 6e 0a 2a  digits with an.*
24a50 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
24a60 20 6f 70 74 69 6f 6e 61 6c 20 2b 20 6f 72 20 2d   optional + or -
24a70 20 73 69 67 6e 20 69 6e 20 66 72 6f 6e 74 0a 2a   sign in front.*
24a80 2a 0a 2a 2a 20 20 20 20 20 20 27 20 27 20 20 20  *.**      ' '   
24a90 20 20 20 20 41 6e 79 20 73 70 61 6e 20 6f 66 20      Any span of 
24aa0 77 68 69 74 65 73 70 61 63 65 20 6d 61 74 63 68  whitespace match
24ab0 65 73 20 61 6e 79 20 6f 74 68 65 72 20 73 70 61  es any other spa
24ac0 6e 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  n of.**         
24ad0 20 20 20 20 20 20 20 77 68 69 74 65 73 70 61 63         whitespac
24ae0 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 74 72 61 20 77  e..**.** Extra w
24af0 68 69 74 65 73 70 61 63 65 20 61 74 20 74 68 65  hitespace at the
24b00 20 65 6e 64 20 6f 66 20 7a 5b 5d 20 69 73 20 69   end of z[] is i
24b10 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  gnored..*/.stati
24b20 63 20 69 6e 74 20 74 65 73 74 63 61 73 65 5f 67  c int testcase_g
24b30 6c 6f 62 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  lob(const char *
24b40 7a 47 6c 6f 62 2c 20 63 6f 6e 73 74 20 63 68 61  zGlob, const cha
24b50 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 63 2c 20  r *z){.  int c, 
24b60 63 32 3b 0a 20 20 69 6e 74 20 69 6e 76 65 72 74  c2;.  int invert
24b70 3b 0a 20 20 69 6e 74 20 73 65 65 6e 3b 0a 0a 20  ;.  int seen;.. 
24b80 20 77 68 69 6c 65 28 20 28 63 20 3d 20 28 2a 28   while( (c = (*(
24b90 7a 47 6c 6f 62 2b 2b 29 29 29 21 3d 30 20 29 7b  zGlob++)))!=0 ){
24ba0 0a 20 20 20 20 69 66 28 20 49 73 53 70 61 63 65  .    if( IsSpace
24bb0 28 63 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  (c) ){.      if(
24bc0 20 21 49 73 53 70 61 63 65 28 2a 7a 29 20 29 20   !IsSpace(*z) ) 
24bd0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
24be0 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a  while( IsSpace(*
24bf0 7a 47 6c 6f 62 29 20 29 20 7a 47 6c 6f 62 2b 2b  zGlob) ) zGlob++
24c00 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49  ;.      while( I
24c10 73 53 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b  sSpace(*z) ) z++
24c20 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
24c30 63 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20  c=='*' ){.      
24c40 77 68 69 6c 65 28 20 28 63 3d 28 2a 28 7a 47 6c  while( (c=(*(zGl
24c50 6f 62 2b 2b 29 29 29 20 3d 3d 20 27 2a 27 20 7c  ob++))) == '*' |
24c60 7c 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20  | c=='?' ){.    
24c70 20 20 20 20 69 66 28 20 63 3d 3d 27 3f 27 20 26      if( c=='?' &
24c80 26 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29 20  & (*(z++))==0 ) 
24c90 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
24ca0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
24cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
24cc0 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 1;.      }els
24cd0 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a  e if( c=='[' ){.
24ce0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a          while( *
24cf0 7a 20 26 26 20 74 65 73 74 63 61 73 65 5f 67 6c  z && testcase_gl
24d00 6f 62 28 7a 47 6c 6f 62 2d 31 2c 7a 29 3d 3d 30  ob(zGlob-1,z)==0
24d10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 2b   ){.          z+
24d20 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
24d30 20 20 20 20 20 72 65 74 75 72 6e 20 28 2a 7a 29       return (*z)
24d40 21 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  !=0;.      }.   
24d50 20 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20     while( (c2 = 
24d60 28 2a 28 7a 2b 2b 29 29 29 21 3d 30 20 29 7b 0a  (*(z++)))!=0 ){.
24d70 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63          while( c
24d80 32 21 3d 63 20 29 7b 0a 20 20 20 20 20 20 20 20  2!=c ){.        
24d90 20 20 63 32 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20    c2 = *(z++);. 
24da0 20 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d           if( c2=
24db0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
24dc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24dd0 20 69 66 28 20 74 65 73 74 63 61 73 65 5f 67 6c   if( testcase_gl
24de0 6f 62 28 7a 47 6c 6f 62 2c 7a 29 20 29 20 72 65  ob(zGlob,z) ) re
24df0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
24e00 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
24e10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
24e20 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 69 66  ='?' ){.      if
24e30 28 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29 20  ( (*(z++))==0 ) 
24e40 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
24e50 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29  lse if( c=='[' )
24e60 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f  {.      int prio
24e70 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  r_c = 0;.      s
24e80 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  een = 0;.      i
24e90 6e 76 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  nvert = 0;.     
24ea0 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20   c = *(z++);.   
24eb0 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65     if( c==0 ) re
24ec0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 63 32  turn 0;.      c2
24ed0 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20   = *(zGlob++);. 
24ee0 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5e 27       if( c2=='^'
24ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 65   ){.        inve
24f00 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rt = 1;.        
24f10 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b  c2 = *(zGlob++);
24f20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
24f30 66 28 20 63 32 3d 3d 27 5d 27 20 29 7b 0a 20 20  f( c2==']' ){.  
24f40 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5d 27        if( c==']'
24f50 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20   ) seen = 1;.   
24f60 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f       c2 = *(zGlo
24f70 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  b++);.      }.  
24f80 20 20 20 20 77 68 69 6c 65 28 20 63 32 20 26 26      while( c2 &&
24f90 20 63 32 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20   c2!=']' ){.    
24fa0 20 20 20 20 69 66 28 20 63 32 3d 3d 27 2d 27 20      if( c2=='-' 
24fb0 26 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d 27 5d 27  && zGlob[0]!=']'
24fc0 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d 30 20   && zGlob[0]!=0 
24fd0 26 26 20 70 72 69 6f 72 5f 63 3e 30 20 29 7b 0a  && prior_c>0 ){.
24fe0 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a            c2 = *
24ff0 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20  (zGlob++);.     
25000 20 20 20 20 20 69 66 28 20 63 3e 3d 70 72 69 6f       if( c>=prio
25010 72 5f 63 20 26 26 20 63 3c 3d 63 32 20 29 20 73  r_c && c<=c2 ) s
25020 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
25030 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a     prior_c = 0;.
25040 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25050 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
25060 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c2 ){.          
25070 20 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20    seen = 1;.    
25080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25090 20 20 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a    prior_c = c2;.
250a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
250b0 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b    c2 = *(zGlob++
250c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
250d0 20 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73   if( c2==0 || (s
250e0 65 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30  een ^ invert)==0
250f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
25100 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 23   }else if( c=='#
25110 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ' ){.      if( (
25120 7a 5b 30 5d 3d 3d 27 2d 27 20 7c 7c 20 7a 5b 30  z[0]=='-' || z[0
25130 5d 3d 3d 27 2b 27 29 20 26 26 20 49 73 44 69 67  ]=='+') && IsDig
25140 69 74 28 7a 5b 31 5d 29 20 29 20 7a 2b 2b 3b 0a  it(z[1]) ) z++;.
25150 20 20 20 20 20 20 69 66 28 20 21 49 73 44 69 67        if( !IsDig
25160 69 74 28 7a 5b 30 5d 29 20 29 20 72 65 74 75 72  it(z[0]) ) retur
25170 6e 20 30 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a  n 0;.      z++;.
25180 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 44        while( IsD
25190 69 67 69 74 28 7a 5b 30 5d 29 20 29 7b 20 7a 2b  igit(z[0]) ){ z+
251a0 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  +; }.    }else{.
251b0 20 20 20 20 20 20 69 66 28 20 63 21 3d 28 2a 28        if( c!=(*(
251c0 7a 2b 2b 29 29 20 29 20 72 65 74 75 72 6e 20 30  z++)) ) return 0
251d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68  ;.    }.  }.  wh
251e0 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a 29  ile( IsSpace(*z)
251f0 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 72 65 74   ){ z++; }.  ret
25200 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 0a 2f  urn *z==0;.}.../
25210 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
25220 20 73 74 72 69 6e 67 20 61 73 20 61 20 63 6f 6d   string as a com
25230 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
25240 20 77 69 74 68 20 65 69 74 68 65 72 20 6f 6e 65   with either one
25250 20 6f 72 20 74 77 6f 0a 2a 2a 20 69 6e 69 74 69   or two.** initi
25260 61 6c 20 22 2d 22 20 63 68 61 72 61 63 74 65 72  al "-" character
25270 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
25280 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e   optionMatch(con
25290 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 63  st char *zStr, c
252a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 29  onst char *zOpt)
252b0 7b 0a 20 20 69 66 28 20 7a 53 74 72 5b 30 5d 21  {.  if( zStr[0]!
252c0 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 30 3b  ='-' ) return 0;
252d0 0a 20 20 7a 53 74 72 2b 2b 3b 0a 20 20 69 66 28  .  zStr++;.  if(
252e0 20 7a 53 74 72 5b 30 5d 3d 3d 27 2d 27 20 29 20   zStr[0]=='-' ) 
252f0 7a 53 74 72 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  zStr++;.  return
25300 20 73 74 72 63 6d 70 28 7a 53 74 72 2c 20 7a 4f   strcmp(zStr, zO
25310 70 74 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pt)==0;.}../*.**
25320 20 44 65 6c 65 74 65 20 61 20 66 69 6c 65 2e 0a   Delete a file..
25330 2a 2f 0a 69 6e 74 20 73 68 65 6c 6c 44 65 6c 65  */.int shellDele
25340 74 65 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61  teFile(const cha
25350 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
25360 20 69 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20   int rc;.#ifdef 
25370 5f 57 49 4e 33 32 0a 20 20 77 63 68 61 72 5f 74  _WIN32.  wchar_t
25380 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 77 69   *z = sqlite3_wi
25390 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63  n32_utf8_to_unic
253a0 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
253b0 20 20 72 63 20 3d 20 5f 77 75 6e 6c 69 6e 6b 28    rc = _wunlink(
253c0 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  z);.  sqlite3_fr
253d0 65 65 28 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 72  ee(z);.#else.  r
253e0 63 20 3d 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65  c = unlink(zFile
253f0 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  name);.#endif.  
25400 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25410 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65 6c 65 74  .** Try to delet
25420 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
25430 66 69 6c 65 20 28 69 66 20 74 68 65 72 65 20 69  file (if there i
25440 73 20 6f 6e 65 29 20 61 6e 64 20 66 72 65 65 20  s one) and free 
25450 74 68 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 75 73  the.** memory us
25460 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  ed to hold the n
25470 61 6d 65 20 6f 66 20 74 68 65 20 74 65 6d 70 20  ame of the temp 
25480 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
25490 76 6f 69 64 20 63 6c 65 61 72 54 65 6d 70 46 69  void clearTempFi
254a0 6c 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  le(ShellState *p
254b0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d  ){.  if( p->zTem
254c0 70 46 69 6c 65 3d 3d 30 20 29 20 72 65 74 75 72  pFile==0 ) retur
254d0 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 64 6f 58 64  n;.  if( p->doXd
254e0 67 4f 70 65 6e 20 29 20 72 65 74 75 72 6e 3b 0a  gOpen ) return;.
254f0 20 20 69 66 28 20 73 68 65 6c 6c 44 65 6c 65 74    if( shellDelet
25500 65 46 69 6c 65 28 70 2d 3e 7a 54 65 6d 70 46 69  eFile(p->zTempFi
25510 6c 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  le) ) return;.  
25520 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
25530 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70 2d  zTempFile);.  p-
25540 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a  >zTempFile = 0;.
25550 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
25560 61 20 6e 65 77 20 74 65 6d 70 20 66 69 6c 65 20  a new temp file 
25570 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20 67 69  name with the gi
25580 76 65 6e 20 73 75 66 66 69 78 2e 0a 2a 2f 0a 73  ven suffix..*/.s
25590 74 61 74 69 63 20 76 6f 69 64 20 6e 65 77 54 65  tatic void newTe
255a0 6d 70 46 69 6c 65 28 53 68 65 6c 6c 53 74 61 74  mpFile(ShellStat
255b0 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
255c0 20 2a 7a 53 75 66 66 69 78 29 7b 0a 20 20 63 6c   *zSuffix){.  cl
255d0 65 61 72 54 65 6d 70 46 69 6c 65 28 70 29 3b 0a  earTempFile(p);.
255e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
255f0 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20  ->zTempFile);.  
25600 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30  p->zTempFile = 0
25610 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b  ;.  if( p->db ){
25620 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
25630 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c  e_control(p->db,
25640 20 30 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   0, SQLITE_FCNTL
25650 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 2c 20 26  _TEMPFILENAME, &
25660 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20  p->zTempFile);. 
25670 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d   }.  if( p->zTem
25680 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pFile==0 ){.    
25690 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72  sqlite3_uint64 r
256a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  ;.    sqlite3_ra
256b0 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
256c0 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 70 2d 3e  r), &r);.    p->
256d0 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69  zTempFile = sqli
256e0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d  te3_mprintf("tem
256f0 70 25 6c 6c 78 2e 25 73 22 2c 20 72 2c 20 7a 53  p%llx.%s", r, zS
25700 75 66 66 69 78 29 3b 0a 20 20 7d 65 6c 73 65 7b  uffix);.  }else{
25710 0a 20 20 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  .    p->zTempFil
25720 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
25730 6e 74 66 28 22 25 7a 2e 25 73 22 2c 20 70 2d 3e  ntf("%z.%s", p->
25740 7a 54 65 6d 70 46 69 6c 65 2c 20 7a 53 75 66 66  zTempFile, zSuff
25750 69 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ix);.  }.  if( p
25760 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29  ->zTempFile==0 )
25770 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  {.    raw_printf
25780 28 73 74 64 65 72 72 2c 20 22 6f 75 74 20 6f 66  (stderr, "out of
25790 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
257a0 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a   exit(1);.  }.}.
257b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ../*.** The impl
257c0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 53 51  ementation of SQ
257d0 4c 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  L scalar functio
257e0 6e 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63  n fkey_collate_c
257f0 6c 61 75 73 65 28 29 2c 20 75 73 65 64 0a 2a 2a  lause(), used.**
25800 20 62 79 20 74 68 65 20 22 2e 6c 69 6e 74 20 66   by the ".lint f
25810 6b 65 79 2d 69 6e 64 65 78 65 73 22 20 63 6f 6d  key-indexes" com
25820 6d 61 6e 64 2e 20 54 68 69 73 20 73 63 61 6c 61  mand. This scala
25830 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c  r function is al
25840 77 61 79 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77  ways.** called w
25850 69 74 68 20 66 6f 75 72 20 61 72 67 75 6d 65 6e  ith four argumen
25860 74 73 20 2d 20 74 68 65 20 70 61 72 65 6e 74 20  ts - the parent 
25870 74 61 62 6c 65 20 6e 61 6d 65 2c 20 74 68 65 20  table name, the 
25880 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 6e 61  parent column na
25890 6d 65 2c 0a 2a 2a 20 74 68 65 20 63 68 69 6c 64  me,.** the child
258a0 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
258b0 74 68 65 20 63 68 69 6c 64 20 63 6f 6c 75 6d 6e  the child column
258c0 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 66   name..**.**   f
258d0 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75  key_collate_clau
258e0 73 65 28 27 70 61 72 65 6e 74 2d 74 61 62 27 2c  se('parent-tab',
258f0 20 27 70 61 72 65 6e 74 2d 63 6f 6c 27 2c 20 27   'parent-col', '
25900 63 68 69 6c 64 2d 74 61 62 27 2c 20 27 63 68 69  child-tab', 'chi
25910 6c 64 2d 63 6f 6c 27 29 0a 2a 2a 0a 2a 2a 20 49  ld-col').**.** I
25920 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  f either of the 
25930 6e 61 6d 65 64 20 74 61 62 6c 65 73 20 6f 72 20  named tables or 
25940 63 6f 6c 75 6d 6e 73 20 64 6f 20 6e 6f 74 20 65  columns do not e
25950 78 69 73 74 2c 20 74 68 69 73 20 66 75 6e 63 74  xist, this funct
25960 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61  ion.** returns a
25970 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20  n empty string. 
25980 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  An empty string 
25990 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
259a0 20 69 66 20 62 6f 74 68 20 74 61 62 6c 65 73 0a   if both tables.
259b0 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 20 65  ** and columns e
259c0 78 69 73 74 20 62 75 74 20 68 61 76 65 20 74 68  xist but have th
259d0 65 20 73 61 6d 65 20 64 65 66 61 75 6c 74 20 63  e same default c
259e0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
259f0 65 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 62 6f 74  e. Or,.** if bot
25a00 68 20 65 78 69 73 74 20 62 75 74 20 74 68 65 20  h exist but the 
25a10 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f  default collatio
25a20 6e 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20  n sequences are 
25a30 64 69 66 66 65 72 65 6e 74 2c 20 74 68 69 73 0a  different, this.
25a40 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
25a50 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 22  rns the string "
25a60 20 43 4f 4c 4c 41 54 45 20 3c 70 61 72 65 6e 74   COLLATE <parent
25a70 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 22 2c 20 77 68  -collation>", wh
25a80 65 72 65 0a 2a 2a 20 3c 70 61 72 65 6e 74 2d 63  ere.** <parent-c
25a90 6f 6c 6c 61 74 69 6f 6e 3e 20 69 73 20 74 68 65  ollation> is the
25aa0 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
25ab0 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74  on sequence of t
25ac0 68 65 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e  he parent column
25ad0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25ae0 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74   shellFkeyCollat
25af0 65 43 6c 61 75 73 65 28 0a 20 20 73 71 6c 69 74  eClause(.  sqlit
25b00 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
25b10 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20  ,.  int nVal,.  
25b20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
25b30 61 70 56 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74  apVal.){.  sqlit
25b40 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
25b50 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
25b60 6c 65 28 70 43 74 78 29 3b 0a 20 20 63 6f 6e 73  le(pCtx);.  cons
25b70 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 3b  t char *zParent;
25b80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25b90 50 61 72 65 6e 74 43 6f 6c 3b 0a 20 20 63 6f 6e  ParentCol;.  con
25ba0 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74  st char *zParent
25bb0 53 65 71 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Seq;.  const cha
25bc0 72 20 2a 7a 43 68 69 6c 64 3b 0a 20 20 63 6f 6e  r *zChild;.  con
25bd0 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 43  st char *zChildC
25be0 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ol;.  const char
25bf0 20 2a 7a 43 68 69 6c 64 53 65 71 20 3d 20 30 3b   *zChildSeq = 0;
25c00 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
25c10 74 6f 20 61 76 6f 69 64 20 66 61 6c 73 65 2d 70  to avoid false-p
25c20 6f 73 69 74 69 76 65 20 77 61 72 6e 69 6e 67 20  ositive warning 
25c30 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
25c40 61 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d 34 20  assert( nVal==4 
25c50 29 3b 0a 20 20 7a 50 61 72 65 6e 74 20 3d 20 28  );.  zParent = (
25c60 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
25c70 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
25c80 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 7a 50 61 72  pVal[0]);.  zPar
25c90 65 6e 74 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20  entCol = (const 
25ca0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
25cb0 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31  lue_text(apVal[1
25cc0 5d 29 3b 0a 20 20 7a 43 68 69 6c 64 20 3d 20 28  ]);.  zChild = (
25cd0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
25ce0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
25cf0 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 7a 43 68 69  pVal[2]);.  zChi
25d00 6c 64 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63  ldCol = (const c
25d10 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
25d20 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 33 5d  ue_text(apVal[3]
25d30 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  );..  sqlite3_re
25d40 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
25d50 22 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  "", -1, SQLITE_S
25d60 54 41 54 49 43 29 3b 0a 20 20 72 63 20 3d 20 73  TATIC);.  rc = s
25d70 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
25d80 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20  umn_metadata(.  
25d90 20 20 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20      db, "main", 
25da0 7a 50 61 72 65 6e 74 2c 20 7a 50 61 72 65 6e 74  zParent, zParent
25db0 43 6f 6c 2c 20 30 2c 20 26 7a 50 61 72 65 6e 74  Col, 0, &zParent
25dc0 53 65 71 2c 20 30 2c 20 30 2c 20 30 0a 20 20 29  Seq, 0, 0, 0.  )
25dd0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
25de0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
25df0 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  = sqlite3_table_
25e00 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28  column_metadata(
25e10 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22 6d 61  .        db, "ma
25e20 69 6e 22 2c 20 7a 43 68 69 6c 64 2c 20 7a 43 68  in", zChild, zCh
25e30 69 6c 64 43 6f 6c 2c 20 30 2c 20 26 7a 43 68 69  ildCol, 0, &zChi
25e40 6c 64 53 65 71 2c 20 30 2c 20 30 2c 20 30 0a 20  ldSeq, 0, 0, 0. 
25e50 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28     );.  }..  if(
25e60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
25e70 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  & sqlite3_stricm
25e80 70 28 7a 50 61 72 65 6e 74 53 65 71 2c 20 7a 43  p(zParentSeq, zC
25e90 68 69 6c 64 53 65 71 29 20 29 7b 0a 20 20 20 20  hildSeq) ){.    
25ea0 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
25eb0 33 5f 6d 70 72 69 6e 74 66 28 22 20 43 4f 4c 4c  3_mprintf(" COLL
25ec0 41 54 45 20 25 73 22 2c 20 7a 50 61 72 65 6e 74  ATE %s", zParent
25ed0 53 65 71 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Seq);.    sqlite
25ee0 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
25ef0 74 78 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54  tx, z, -1, SQLIT
25f00 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
25f10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
25f20 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
25f30 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
25f40 69 6f 6e 20 6f 66 20 64 6f 74 2d 63 6f 6d 6d 61  ion of dot-comma
25f50 6e 64 20 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69  nd ".lint fkey-i
25f60 6e 64 65 78 65 73 22 2e 0a 2a 2f 0a 73 74 61 74  ndexes"..*/.stat
25f70 69 63 20 69 6e 74 20 6c 69 6e 74 46 6b 65 79 49  ic int lintFkeyI
25f80 6e 64 65 78 65 73 28 0a 20 20 53 68 65 6c 6c 53  ndexes(.  ShellS
25f90 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20  tate *pState,   
25fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
25fb0 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20  rent shell tool 
25fc0 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  state */.  char 
25fd0 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20  **azArg,        
25fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
25ff0 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ray of arguments
26000 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63   passed to dot c
26010 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
26020 6e 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  nArg            
26030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26040 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
26050 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29   in azArg[] */.)
26060 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
26070 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b 20 20 20  = pState->db;   
26080 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
26090 68 61 6e 64 6c 65 20 74 6f 20 71 75 65 72 79 20  handle to query 
260a0 22 6d 61 69 6e 22 20 64 62 20 6f 66 20 2a 2f 0a  "main" db of */.
260b0 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53    FILE *out = pS
260c0 74 61 74 65 2d 3e 6f 75 74 3b 20 20 20 20 20 20  tate->out;      
260d0 20 20 2f 2a 20 53 74 72 65 61 6d 20 74 6f 20 77    /* Stream to w
260e0 72 69 74 65 20 6e 6f 6e 2d 65 72 72 6f 72 20 6f  rite non-error o
260f0 75 74 70 75 74 20 74 6f 20 2a 2f 0a 20 20 69 6e  utput to */.  in
26100 74 20 62 56 65 72 62 6f 73 65 20 3d 20 30 3b 20  t bVerbose = 0; 
26110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26120 20 49 66 20 2d 76 65 72 62 6f 73 65 20 69 73 20   If -verbose is 
26130 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
26140 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 20   bGroupByParent 
26150 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
26160 49 66 20 2d 67 72 6f 75 70 62 79 70 61 72 65 6e  If -groupbyparen
26170 74 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  t is present */.
26180 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
26190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261a0 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20    /* To iterate 
261b0 74 68 72 6f 75 67 68 20 61 7a 41 72 67 5b 5d 20  through azArg[] 
261c0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
261d0 2a 7a 49 6e 64 65 6e 74 20 3d 20 22 22 3b 20 20  *zIndent = "";  
261e0 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68       /* How much
261f0 20 74 6f 20 69 6e 64 65 6e 74 20 43 52 45 41 54   to indent CREAT
26200 45 20 49 4e 44 45 58 20 62 79 20 2a 2f 0a 20 20  E INDEX by */.  
26210 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
26220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26230 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
26240 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
26250 20 2a 70 53 71 6c 20 3d 20 30 3b 20 20 20 20 20   *pSql = 0;     
26260 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20      /* Compiled 
26270 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c 20 73  version of SQL s
26280 74 61 74 65 6d 65 6e 74 20 62 65 6c 6f 77 20 2a  tatement below *
26290 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 69  /..  /*.  ** Thi
262a0 73 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  s SELECT stateme
262b0 6e 74 20 72 65 74 75 72 6e 73 20 6f 6e 65 20 72  nt returns one r
262c0 6f 77 20 66 6f 72 20 65 61 63 68 20 66 6f 72 65  ow for each fore
262d0 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
262e0 6e 74 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 73  nt.  ** in the s
262f0 63 68 65 6d 61 20 6f 66 20 74 68 65 20 6d 61 69  chema of the mai
26300 6e 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  n database. The 
26310 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72  column values ar
26320 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 30 2e 20  e:.  **.  ** 0. 
26330 54 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 53  The text of an S
26340 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 73 69 6d  QL statement sim
26350 69 6c 61 72 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  ilar to:.  **.  
26360 2a 2a 20 20 20 20 20 20 22 45 58 50 4c 41 49 4e  **      "EXPLAIN
26370 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45   QUERY PLAN SELE
26380 43 54 20 31 20 46 52 4f 4d 20 63 68 69 6c 64 5f  CT 1 FROM child_
26390 74 61 62 6c 65 20 57 48 45 52 45 20 63 68 69 6c  table WHERE chil
263a0 64 5f 6b 65 79 3d 3f 22 0a 20 20 2a 2a 0a 20 20  d_key=?".  **.  
263b0 2a 2a 20 20 20 20 54 68 69 73 20 53 45 4c 45 43  **    This SELEC
263c0 54 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  T is similar to 
263d0 74 68 65 20 6f 6e 65 20 74 68 61 74 20 74 68 65  the one that the
263e0 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 69 6d   foreign keys im
263f0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 2a  plementation.  *
26400 2a 20 20 20 20 6e 65 65 64 73 20 74 6f 20 72 75  *    needs to ru
26410 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20 6f 6e 20  n internally on 
26420 63 68 69 6c 64 20 74 61 62 6c 65 73 2e 20 49 66  child tables. If
26430 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64   there is an ind
26440 65 78 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  ex that can.  **
26450 20 20 20 20 62 65 20 75 73 65 64 20 74 6f 20 6f      be used to o
26460 70 74 69 6d 69 7a 65 20 74 68 69 73 20 71 75 65  ptimize this que
26470 72 79 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20  ry, then it can 
26480 61 6c 73 6f 20 62 65 20 75 73 65 64 20 62 79 20  also be used by 
26490 74 68 65 20 46 4b 0a 20 20 2a 2a 20 20 20 20 69  the FK.  **    i
264a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 6f  mplementation to
264b0 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45 54 45   optimize DELETE
264c0 20 6f 72 20 55 50 44 41 54 45 20 73 74 61 74 65   or UPDATE state
264d0 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 72  ments on the par
264e0 65 6e 74 0a 20 20 2a 2a 20 20 20 20 74 61 62 6c  ent.  **    tabl
264f0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 2e 20  e..  **.  ** 1. 
26500 41 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 20 73  A GLOB pattern s
26510 75 69 74 61 62 6c 65 20 66 6f 72 20 73 71 6c 69  uitable for sqli
26520 74 65 33 5f 73 74 72 67 6c 6f 62 28 29 2e 20 49  te3_strglob(). I
26530 66 20 74 68 65 20 70 6c 61 6e 20 6f 75 74 70 75  f the plan outpu
26540 74 20 62 79 0a 20 20 2a 2a 20 20 20 20 74 68 65  t by.  **    the
26550 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
26560 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 6d 61 74 63  LAN command matc
26570 68 65 73 20 74 68 69 73 20 70 61 74 74 65 72 6e  hes this pattern
26580 2c 20 74 68 65 6e 20 74 68 65 20 73 63 68 65 6d  , then the schem
26590 61 0a 20 20 2a 2a 20 20 20 20 63 6f 6e 74 61 69  a.  **    contai
265a0 6e 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  ns an index that
265b0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
265c0 6f 70 74 69 6d 69 7a 65 20 74 68 65 20 71 75 65  optimize the que
265d0 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 2e  ry..  **.  ** 2.
265e0 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   Human readable 
265f0 74 65 78 74 20 74 68 61 74 20 64 65 73 63 72 69  text that descri
26600 62 65 73 20 74 68 65 20 63 68 69 6c 64 20 74 61  bes the child ta
26610 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e  ble and columns.
26620 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   e.g..  **.  ** 
26630 20 20 20 20 20 20 22 63 68 69 6c 64 5f 74 61 62        "child_tab
26640 6c 65 28 63 68 69 6c 64 5f 6b 65 79 31 2c 20 63  le(child_key1, c
26650 68 69 6c 64 5f 6b 65 79 32 29 22 0a 20 20 2a 2a  hild_key2)".  **
26660 0a 20 20 2a 2a 20 33 2e 20 48 75 6d 61 6e 20 72  .  ** 3. Human r
26670 65 61 64 61 62 6c 65 20 74 65 78 74 20 74 68 61  eadable text tha
26680 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
26690 70 61 72 65 6e 74 20 74 61 62 6c 65 20 61 6e 64  parent table and
266a0 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20   columns. e.g.. 
266b0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22   **.  **       "
266c0 70 61 72 65 6e 74 5f 74 61 62 6c 65 28 70 61 72  parent_table(par
266d0 65 6e 74 5f 6b 65 79 31 2c 20 70 61 72 65 6e 74  ent_key1, parent
266e0 5f 6b 65 79 32 29 22 0a 20 20 2a 2a 0a 20 20 2a  _key2)".  **.  *
266f0 2a 20 34 2e 20 41 20 66 75 6c 6c 20 43 52 45 41  * 4. A full CREA
26700 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
26710 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20  nt for an index 
26720 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20 75 73  that could be us
26730 65 64 20 74 6f 0a 20 20 2a 2a 20 20 20 20 6f 70  ed to.  **    op
26740 74 69 6d 69 7a 65 20 44 45 4c 45 54 45 20 6f 72  timize DELETE or
26750 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
26760 74 73 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74  ts on the parent
26770 20 74 61 62 6c 65 2e 20 65 2e 67 2e 0a 20 20 2a   table. e.g..  *
26780 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 43 52  *.  **       "CR
26790 45 41 54 45 20 49 4e 44 45 58 20 63 68 69 6c 64  EATE INDEX child
267a0 5f 74 61 62 6c 65 5f 63 68 69 6c 64 5f 6b 65 79  _table_child_key
267b0 20 4f 4e 20 63 68 69 6c 64 5f 74 61 62 6c 65 28   ON child_table(
267c0 63 68 69 6c 64 5f 6b 65 79 29 22 0a 20 20 2a 2a  child_key)".  **
267d0 0a 20 20 2a 2a 20 35 2e 20 54 68 65 20 6e 61 6d  .  ** 5. The nam
267e0 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  e of the parent 
267f0 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  table..  **.  **
26800 20 54 68 65 73 65 20 73 69 78 20 76 61 6c 75 65   These six value
26810 73 20 61 72 65 20 75 73 65 64 20 62 79 20 74 68  s are used by th
26820 65 20 43 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20  e C logic below 
26830 74 6f 20 67 65 6e 65 72 61 74 65 20 74 68 65 20  to generate the 
26840 72 65 70 6f 72 74 2e 0a 20 20 2a 2f 0a 20 20 63  report..  */.  c
26850 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20  onst char *zSql 
26860 3d 0a 20 20 22 53 45 4c 45 43 54 20 22 0a 20 20  =.  "SELECT ".  
26870 20 20 22 20 20 20 20 20 27 45 58 50 4c 41 49 4e    "     'EXPLAIN
26880 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45   QUERY PLAN SELE
26890 43 54 20 31 20 46 52 4f 4d 20 27 20 7c 7c 20 71  CT 1 FROM ' || q
268a0 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20  uote(s.name) || 
268b0 27 20 57 48 45 52 45 20 27 22 0a 20 20 20 20 22  ' WHERE '".    "
268c0 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61    || group_conca
268d0 74 28 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20  t(quote(s.name) 
268e0 7c 7c 20 27 2e 27 20 7c 7c 20 71 75 6f 74 65 28  || '.' || quote(
268f0 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 20 27 3d 3f  f.[from]) || '=?
26900 27 20 22 0a 20 20 20 20 22 20 20 7c 7c 20 66 6b  ' ".    "  || fk
26910 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73  ey_collate_claus
26920 65 28 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  e(".    "       
26930 66 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41 4c 45  f.[table], COALE
26940 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e  SCE(f.[to], p.[n
26950 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c 20 66  ame]), s.name, f
26960 2e 5b 66 72 6f 6d 5d 29 2c 27 20 41 4e 44 20 27  .[from]),' AND '
26970 29 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20  )".    ", ".    
26980 22 20 20 20 20 20 27 53 45 41 52 43 48 20 54 41  "     'SEARCH TA
26990 42 4c 45 20 27 20 7c 7c 20 73 2e 6e 61 6d 65 20  BLE ' || s.name 
269a0 7c 7c 20 27 20 55 53 49 4e 47 20 43 4f 56 45 52  || ' USING COVER
269b0 49 4e 47 20 49 4e 44 45 58 2a 28 27 22 0a 20 20  ING INDEX*('".  
269c0 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f    "  || group_co
269d0 6e 63 61 74 28 27 2a 3d 3f 27 2c 20 27 20 41 4e  ncat('*=?', ' AN
269e0 44 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20 20  D ') || ')'".   
269f0 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20   ", ".    "     
26a00 73 2e 6e 61 6d 65 20 20 7c 7c 20 27 28 27 20 7c  s.name  || '(' |
26a10 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66  | group_concat(f
26a20 2e 5b 66 72 6f 6d 5d 2c 20 20 27 2c 20 27 29 20  .[from],  ', ') 
26a30 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22  || ')'".    ", "
26a40 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74 61  .    "     f.[ta
26a50 62 6c 65 5d 20 7c 7c 20 27 28 27 20 7c 7c 20 67  ble] || '(' || g
26a60 72 6f 75 70 5f 63 6f 6e 63 61 74 28 43 4f 41 4c  roup_concat(COAL
26a70 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b  ESCE(f.[to], p.[
26a80 6e 61 6d 65 5d 29 29 20 7c 7c 20 27 29 27 22 0a  name])) || ')'".
26a90 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20      ", ".    "  
26aa0 20 20 20 27 43 52 45 41 54 45 20 49 4e 44 45 58     'CREATE INDEX
26ab0 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61   ' || quote(s.na
26ac0 6d 65 20 7c 7c 27 5f 27 7c 7c 20 67 72 6f 75 70  me ||'_'|| group
26ad0 5f 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d  _concat(f.[from]
26ae0 2c 20 27 5f 27 29 29 22 0a 20 20 20 20 22 20 20  , '_'))".    "  
26af0 7c 7c 20 27 20 4f 4e 20 27 20 7c 7c 20 71 75 6f  || ' ON ' || quo
26b00 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 28  te(s.name) || '(
26b10 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f  '".    "  || gro
26b20 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28  up_concat(quote(
26b30 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 22 0a 20 20  f.[from]) ||".  
26b40 20 20 22 20 20 20 20 20 20 20 20 66 6b 65 79 5f    "        fkey_
26b50 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 22  collate_clause("
26b60 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20  .    "          
26b70 66 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41 4c 45  f.[table], COALE
26b80 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e  SCE(f.[to], p.[n
26b90 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c 20 66  ame]), s.name, f
26ba0 2e 5b 66 72 6f 6d 5d 29 2c 20 27 2c 20 27 29 22  .[from]), ', ')"
26bb0 0a 20 20 20 20 22 20 20 7c 7c 20 27 29 3b 27 22  .    "  || ');'"
26bc0 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20  .    ", ".    " 
26bd0 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20 22 0a      f.[table] ".
26be0 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65      "FROM sqlite
26bf0 5f 6d 61 73 74 65 72 20 41 53 20 73 2c 20 70 72  _master AS s, pr
26c00 61 67 6d 61 5f 66 6f 72 65 69 67 6e 5f 6b 65 79  agma_foreign_key
26c10 5f 6c 69 73 74 28 73 2e 6e 61 6d 65 29 20 41 53  _list(s.name) AS
26c20 20 66 20 22 0a 20 20 20 20 22 4c 45 46 54 20 4a   f ".    "LEFT J
26c30 4f 49 4e 20 70 72 61 67 6d 61 5f 74 61 62 6c 65  OIN pragma_table
26c40 5f 69 6e 66 6f 20 41 53 20 70 20 4f 4e 20 28 70  _info AS p ON (p
26c50 6b 2d 31 3d 73 65 71 20 41 4e 44 20 70 2e 61 72  k-1=seq AND p.ar
26c60 67 3d 66 2e 5b 74 61 62 6c 65 5d 29 20 22 0a 20  g=f.[table]) ". 
26c70 20 20 20 22 47 52 4f 55 50 20 42 59 20 73 2e 6e     "GROUP BY s.n
26c80 61 6d 65 2c 20 66 2e 69 64 20 22 0a 20 20 20 20  ame, f.id ".    
26c90 22 4f 52 44 45 52 20 42 59 20 28 43 41 53 45 20  "ORDER BY (CASE 
26ca0 57 48 45 4e 20 3f 20 54 48 45 4e 20 66 2e 5b 74  WHEN ? THEN f.[t
26cb0 61 62 6c 65 5d 20 45 4c 53 45 20 73 2e 6e 61 6d  able] ELSE s.nam
26cc0 65 20 45 4e 44 29 22 0a 20 20 3b 0a 20 20 63 6f  e END)".  ;.  co
26cd0 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 49  nst char *zGlobI
26ce0 50 4b 20 3d 20 22 53 45 41 52 43 48 20 54 41 42  PK = "SEARCH TAB
26cf0 4c 45 20 2a 20 55 53 49 4e 47 20 49 4e 54 45 47  LE * USING INTEG
26d00 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 28  ER PRIMARY KEY (
26d10 72 6f 77 69 64 3d 3f 29 22 3b 0a 0a 20 20 66 6f  rowid=?)";..  fo
26d20 72 28 69 3d 32 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=2; i<nArg; i
26d30 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  ++){.    int n =
26d40 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b   strlen30(azArg[
26d50 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 31  i]);.    if( n>1
26d60 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e   && sqlite3_strn
26d70 69 63 6d 70 28 22 2d 76 65 72 62 6f 73 65 22 2c  icmp("-verbose",
26d80 20 61 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30   azArg[i], n)==0
26d90 20 29 7b 0a 20 20 20 20 20 20 62 56 65 72 62 6f   ){.      bVerbo
26da0 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  se = 1;.    }.  
26db0 20 20 65 6c 73 65 20 69 66 28 20 6e 3e 31 20 26    else if( n>1 &
26dc0 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  & sqlite3_strnic
26dd0 6d 70 28 22 2d 67 72 6f 75 70 62 79 70 61 72 65  mp("-groupbypare
26de0 6e 74 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 6e  nt", azArg[i], n
26df0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 47  )==0 ){.      bG
26e00 72 6f 75 70 42 79 50 61 72 65 6e 74 20 3d 20 31  roupByParent = 1
26e10 3b 0a 20 20 20 20 20 20 7a 49 6e 64 65 6e 74 20  ;.      zIndent 
26e20 3d 20 22 20 20 20 20 22 3b 0a 20 20 20 20 7d 0a  = "    ";.    }.
26e30 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
26e40 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
26e50 72 2c 20 22 55 73 61 67 65 3a 20 25 73 20 25 73  r, "Usage: %s %s
26e60 20 3f 2d 76 65 72 62 6f 73 65 3f 20 3f 2d 67 72   ?-verbose? ?-gr
26e70 6f 75 70 62 79 70 61 72 65 6e 74 3f 5c 6e 22 2c  oupbyparent?\n",
26e80 0a 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67  .          azArg
26e90 5b 30 5d 2c 20 61 7a 41 72 67 5b 31 5d 0a 20 20  [0], azArg[1].  
26ea0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74      );.      ret
26eb0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
26ec0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
26ed0 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20 66  * Register the f
26ee0 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75  key_collate_clau
26ef0 73 65 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  se() SQL functio
26f00 6e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  n */.  rc = sqli
26f10 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
26f20 69 6f 6e 28 64 62 2c 20 22 66 6b 65 79 5f 63 6f  ion(db, "fkey_co
26f30 6c 6c 61 74 65 5f 63 6c 61 75 73 65 22 2c 20 34  llate_clause", 4
26f40 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20  , SQLITE_UTF8,. 
26f50 20 20 20 20 20 30 2c 20 73 68 65 6c 6c 46 6b 65       0, shellFke
26f60 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65 2c 20  yCollateClause, 
26f70 30 2c 20 30 0a 20 20 29 3b 0a 0a 0a 20 20 69 66  0, 0.  );...  if
26f80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26f90 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
26fa0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
26fb0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
26fc0 71 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  ql, 0);.  }.  if
26fd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26fe0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
26ff0 69 6e 64 5f 69 6e 74 28 70 53 71 6c 2c 20 31 2c  ind_int(pSql, 1,
27000 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 29   bGroupByParent)
27010 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
27020 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27030 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 63    int rc2;.    c
27040 68 61 72 20 2a 7a 50 72 65 76 20 3d 20 30 3b 0a  har *zPrev = 0;.
27050 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54      while( SQLIT
27060 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
27070 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20 20  tep(pSql) ){.   
27080 20 20 20 69 6e 74 20 72 65 73 20 3d 20 2d 31 3b     int res = -1;
27090 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
270a0 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 20 3d 20  tmt *pExplain = 
270b0 30 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  0;.      const c
270c0 68 61 72 20 2a 7a 45 51 50 20 3d 20 28 63 6f 6e  har *zEQP = (con
270d0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
270e0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
270f0 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e  l, 0);.      con
27100 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 20 3d  st char *zGlob =
27110 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
27120 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
27130 74 28 70 53 71 6c 2c 20 31 29 3b 0a 20 20 20 20  t(pSql, 1);.    
27140 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
27150 72 6f 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  rom = (const cha
27160 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
27170 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 32 29 3b  n_text(pSql, 2);
27180 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
27190 72 20 2a 7a 54 61 72 67 65 74 20 3d 20 28 63 6f  r *zTarget = (co
271a0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
271b0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
271c0 71 6c 2c 20 33 29 3b 0a 20 20 20 20 20 20 63 6f  ql, 3);.      co
271d0 6e 73 74 20 63 68 61 72 20 2a 7a 43 49 20 3d 20  nst char *zCI = 
271e0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
271f0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
27200 28 70 53 71 6c 2c 20 34 29 3b 0a 20 20 20 20 20  (pSql, 4);.     
27210 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
27220 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  rent = (const ch
27230 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
27240 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 35 29  mn_text(pSql, 5)
27250 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ;..      rc = sq
27260 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
27270 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26  (db, zEQP, -1, &
27280 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
27290 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
272a0 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20  TE_OK ) break;. 
272b0 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
272c0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
272d0 70 28 70 45 78 70 6c 61 69 6e 29 20 29 7b 0a 20  p(pExplain) ){. 
272e0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
272f0 72 20 2a 7a 50 6c 61 6e 20 3d 20 28 63 6f 6e 73  r *zPlan = (cons
27300 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
27310 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70  column_text(pExp
27320 6c 61 69 6e 2c 20 33 29 3b 0a 20 20 20 20 20 20  lain, 3);.      
27330 20 20 72 65 73 20 3d 20 28 0a 20 20 20 20 20 20    res = (.      
27340 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74          0==sqlit
27350 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47 6c 6f 62  e3_strglob(zGlob
27360 2c 20 7a 50 6c 61 6e 29 0a 20 20 20 20 20 20 20  , zPlan).       
27370 20 20 20 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65      || 0==sqlite
27380 33 5f 73 74 72 67 6c 6f 62 28 7a 47 6c 6f 62 49  3_strglob(zGlobI
27390 50 4b 2c 20 7a 50 6c 61 6e 29 0a 20 20 20 20 20  PK, zPlan).     
273a0 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
273b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
273c0 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61  _finalize(pExpla
273d0 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  in);.      if( r
273e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
273f0 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 69 66 28  reak;..      if(
27400 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20   res<0 ){.      
27410 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
27420 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 69 6e 74  err, "Error: int
27430 65 72 6e 61 6c 20 65 72 72 6f 72 22 29 3b 0a 20  ernal error");. 
27440 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
27450 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27460 20 20 20 69 66 28 20 62 47 72 6f 75 70 42 79 50     if( bGroupByP
27470 61 72 65 6e 74 0a 20 20 20 20 20 20 20 20 26 26  arent.        &&
27480 20 28 62 56 65 72 62 6f 73 65 20 7c 7c 20 72 65   (bVerbose || re
27490 73 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 26 26  s==0).        &&
274a0 20 28 7a 50 72 65 76 3d 3d 30 20 7c 7c 20 73 71   (zPrev==0 || sq
274b0 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 50  lite3_stricmp(zP
274c0 61 72 65 6e 74 2c 20 7a 50 72 65 76 29 29 0a 20  arent, zPrev)). 
274d0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
274e0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
274f0 75 74 2c 20 22 2d 2d 20 50 61 72 65 6e 74 20 74  ut, "-- Parent t
27500 61 62 6c 65 20 25 73 5c 6e 22 2c 20 7a 50 61 72  able %s\n", zPar
27510 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ent);.          
27520 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72  sqlite3_free(zPr
27530 65 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ev);.          z
27540 50 72 65 76 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Prev = sqlite3_m
27550 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 50 61  printf("%s", zPa
27560 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  rent);.        }
27570 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ..        if( re
27580 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
27590 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
275a0 2c 20 22 25 73 25 73 20 2d 2d 3e 20 25 73 5c 6e  , "%s%s --> %s\n
275b0 22 2c 20 7a 49 6e 64 65 6e 74 2c 20 7a 43 49 2c  ", zIndent, zCI,
275c0 20 7a 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20   zTarget);.     
275d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 56 65     }else if( bVe
275e0 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20  rbose ){.       
275f0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
27600 74 2c 20 22 25 73 2f 2a 20 6e 6f 20 65 78 74 72  t, "%s/* no extr
27610 61 20 69 6e 64 65 78 65 73 20 72 65 71 75 69 72  a indexes requir
27620 65 64 20 66 6f 72 20 25 73 20 2d 3e 20 25 73 20  ed for %s -> %s 
27630 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  */\n",.         
27640 20 20 20 20 20 7a 49 6e 64 65 6e 74 2c 20 7a 46       zIndent, zF
27650 72 6f 6d 2c 20 7a 54 61 72 67 65 74 0a 20 20 20  rom, zTarget.   
27660 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
27670 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27680 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
27690 65 65 28 7a 50 72 65 76 29 3b 0a 0a 20 20 20 20  ee(zPrev);..    
276a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
276b0 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  K ){.      raw_p
276c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
276d0 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
276e0 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d  rmsg(db));.    }
276f0 0a 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ..    rc2 = sqli
27700 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 71  te3_finalize(pSq
27710 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  l);.    if( rc==
27720 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 32  SQLITE_OK && rc2
27730 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
27740 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
27750 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
27760 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20  stderr, "%s\n", 
27770 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
27780 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  b));.    }.  }el
27790 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  se{.    raw_prin
277a0 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e  tf(stderr, "%s\n
277b0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
277c0 67 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 72  g(db));.  }..  r
277d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
277e0 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
277f0 6e 20 6f 66 20 22 2e 6c 69 6e 74 22 20 64 6f 74  n of ".lint" dot
27800 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61   command..*/.sta
27810 74 69 63 20 69 6e 74 20 6c 69 6e 74 44 6f 74 43  tic int lintDotC
27820 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53  ommand(.  ShellS
27830 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20  tate *pState,   
27840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
27850 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20  rent shell tool 
27860 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  state */.  char 
27870 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20  **azArg,        
27880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
27890 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ray of arguments
278a0 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63   passed to dot c
278b0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
278c0 6e 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  nArg            
278d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
278e0 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
278f0 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29   in azArg[] */.)
27900 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 6e 20 3d  {.  int n;.  n =
27910 20 28 6e 41 72 67 3e 3d 32 20 3f 20 73 74 72 6c   (nArg>=2 ? strl
27920 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29 20 3a  en30(azArg[1]) :
27930 20 30 29 3b 0a 20 20 69 66 28 20 6e 3c 31 20 7c   0);.  if( n<1 |
27940 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  | sqlite3_strnic
27950 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22 66 6b  mp(azArg[1], "fk
27960 65 79 2d 69 6e 64 65 78 65 73 22 2c 20 6e 29 20  ey-indexes", n) 
27970 29 20 67 6f 74 6f 20 75 73 61 67 65 3b 0a 20 20  ) goto usage;.  
27980 72 65 74 75 72 6e 20 6c 69 6e 74 46 6b 65 79 49  return lintFkeyI
27990 6e 64 65 78 65 73 28 70 53 74 61 74 65 2c 20 61  ndexes(pState, a
279a0 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 0a 20 75  zArg, nArg);.. u
279b0 73 61 67 65 3a 0a 20 20 72 61 77 5f 70 72 69 6e  sage:.  raw_prin
279c0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
279d0 65 20 25 73 20 73 75 62 2d 63 6f 6d 6d 61 6e 64  e %s sub-command
279e0 20 3f 73 77 69 74 63 68 65 73 2e 2e 2e 3f 5c 6e   ?switches...?\n
279f0 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20  ", azArg[0]);.  
27a00 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
27a10 72 2c 20 22 57 68 65 72 65 20 73 75 62 2d 63 6f  r, "Where sub-co
27a20 6d 6d 61 6e 64 73 20 61 72 65 3a 5c 6e 22 29 3b  mmands are:\n");
27a30 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74  .  raw_printf(st
27a40 64 65 72 72 2c 20 22 20 20 20 20 66 6b 65 79 2d  derr, "    fkey-
27a50 69 6e 64 65 78 65 73 5c 6e 22 29 3b 0a 20 20 72  indexes\n");.  r
27a60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
27a70 4f 52 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OR;.}..#if !defi
27a80 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
27a90 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
27aa0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
27ab0 48 41 56 45 5f 5a 4c 49 42 29 0a 2f 2a 2a 2a 2a  HAVE_ZLIB)./****
27ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
27b10 20 54 68 65 20 22 2e 61 72 63 68 69 76 65 22 20   The ".archive" 
27b20 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64  or ".ar" command
27b30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
27b40 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 0a 20   shellPrepare(. 
27b50 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
27b60 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 63 6f   int *pRc, .  co
27b70 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20  nst char *zSql, 
27b80 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
27b90 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a 20 20 2a 70  **ppStmt.){.  *p
27ba0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28  pStmt = 0;.  if(
27bb0 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
27bc0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
27bd0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
27be0 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  _v2(db, zSql, -1
27bf0 2c 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , ppStmt, 0);.  
27c00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27c10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77  _OK ){.      raw
27c20 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
27c30 22 73 71 6c 20 65 72 72 6f 72 3a 20 25 73 20 28  "sql error: %s (
27c40 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  %d)\n", .       
27c50 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
27c60 67 28 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65  g(db), sqlite3_e
27c70 72 72 63 6f 64 65 28 64 62 29 0a 20 20 20 20 20  rrcode(db).     
27c80 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d   );.      *pRc =
27c90 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   rc;.    }.  }.}
27ca0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  ..static void sh
27cb0 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66  ellPreparePrintf
27cc0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
27cd0 20 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20   .  int *pRc, . 
27ce0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a   sqlite3_stmt **
27cf0 70 70 53 74 6d 74 2c 0a 20 20 63 6f 6e 73 74 20  ppStmt,.  const 
27d00 63 68 61 72 20 2a 7a 46 6d 74 2c 20 0a 20 20 2e  char *zFmt, .  .
27d10 2e 2e 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20  ...){.  *ppStmt 
27d20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d  = 0;.  if( *pRc=
27d30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27d40 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
27d50 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 76    char *z;.    v
27d60 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74  a_start(ap, zFmt
27d70 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  );.    z = sqlit
27d80 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74  e3_vmprintf(zFmt
27d90 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
27da0 64 28 61 70 29 3b 0a 20 20 20 20 69 66 28 20 7a  d(ap);.    if( z
27db0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ==0 ){.      *pR
27dc0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
27dd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27de0 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28     shellPrepare(
27df0 64 62 2c 20 70 52 63 2c 20 7a 2c 20 70 70 53 74  db, pRc, z, ppSt
27e00 6d 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  mt);.      sqlit
27e10 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20  e3_free(z);.    
27e20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
27e30 76 6f 69 64 20 73 68 65 6c 6c 46 69 6e 61 6c 69  void shellFinali
27e40 7a 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  ze(.  int *pRc, 
27e50 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
27e60 2a 70 53 74 6d 74 0a 29 7b 0a 20 20 69 66 28 20  *pStmt.){.  if( 
27e70 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c  pStmt ){.    sql
27e80 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
27e90 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74  e3_db_handle(pSt
27ea0 6d 74 29 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  mt);.    int rc 
27eb0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
27ec0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  ze(pStmt);.    i
27ed0 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
27ee0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
27ef0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27f00 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
27f10 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c  ntf(stderr, "SQL
27f20 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73   error: %s\n", s
27f30 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
27f40 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
27f50 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20    *pRc = rc;.   
27f60 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63   }.  }.}..static
27f70 20 76 6f 69 64 20 73 68 65 6c 6c 52 65 73 65 74   void shellReset
27f80 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20  (.  int *pRc, . 
27f90 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
27fa0 53 74 6d 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Stmt.){.  int rc
27fb0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
27fc0 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 2a  (pStmt);.  if( *
27fd0 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
27fe0 7b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  {.    if( rc!=SQ
27ff0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28000 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
28010 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65  qlite3_db_handle
28020 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
28030 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
28040 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73  , "SQL error: %s
28050 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
28060 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a  msg(db));.    }.
28070 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20      *pRc = rc;. 
28080 20 7d 0a 7d 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63   }.}./*.** Struc
28090 74 75 72 65 20 72 65 70 72 65 73 65 6e 74 69 6e  ture representin
280a0 67 20 61 20 73 69 6e 67 6c 65 20 22 2e 61 72 22  g a single ".ar"
280b0 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 74 79 70   command..*/.typ
280c0 65 64 65 66 20 73 74 72 75 63 74 20 41 72 43 6f  edef struct ArCo
280d0 6d 6d 61 6e 64 20 41 72 43 6f 6d 6d 61 6e 64 3b  mmand ArCommand;
280e0 0a 73 74 72 75 63 74 20 41 72 43 6f 6d 6d 61 6e  .struct ArComman
280f0 64 20 7b 0a 20 20 75 38 20 65 43 6d 64 3b 20 20  d {.  u8 eCmd;  
28100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28110 20 20 20 20 20 20 2f 2a 20 41 6e 20 41 52 5f 43        /* An AR_C
28120 4d 44 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20  MD_* value */.  
28130 75 38 20 62 56 65 72 62 6f 73 65 3b 20 20 20 20  u8 bVerbose;    
28140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28150 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 76 65 72  /* True if --ver
28160 62 6f 73 65 20 2a 2f 0a 20 20 75 38 20 62 5a 69  bose */.  u8 bZi
28170 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
28180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
28190 65 20 69 66 20 74 68 65 20 61 72 63 68 69 76 65  e if the archive
281a0 20 69 73 20 61 20 5a 49 50 20 2a 2f 0a 20 20 75   is a ZIP */.  u
281b0 38 20 62 44 72 79 52 75 6e 3b 20 20 20 20 20 20  8 bDryRun;      
281c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
281d0 2a 20 54 72 75 65 20 69 66 20 2d 2d 64 72 79 2d  * True if --dry-
281e0 72 75 6e 20 2a 2f 0a 20 20 75 38 20 62 41 70 70  run */.  u8 bApp
281f0 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  end;            
28200 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
28210 20 69 66 20 2d 2d 61 70 70 65 6e 64 20 2a 2f 0a   if --append */.
28220 20 20 75 38 20 66 72 6f 6d 43 6d 64 4c 69 6e 65    u8 fromCmdLine
28230 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28240 20 20 2f 2a 20 52 75 6e 20 66 72 6f 6d 20 2d 41    /* Run from -A
28250 20 69 6e 73 74 65 61 64 20 6f 66 20 2e 61 72 63   instead of .arc
28260 68 69 76 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  hive */.  int nA
28270 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
28280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
28290 62 65 72 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61  ber of command a
282a0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
282b0 61 72 20 2a 7a 53 72 63 54 61 62 6c 65 3b 20 20  ar *zSrcTable;  
282c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
282d0 20 22 73 71 6c 61 72 22 2c 20 22 7a 69 70 66 69   "sqlar", "zipfi
282e0 6c 65 28 24 66 69 6c 65 29 22 20 6f 72 20 22 7a  le($file)" or "z
282f0 69 70 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ip" */.  const c
28300 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20  har *zFile;     
28310 20 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 66 69           /* --fi
28320 6c 65 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20  le argument, or 
28330 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  NULL */.  const 
28340 63 68 61 72 20 2a 7a 44 69 72 3b 20 20 20 20 20  char *zDir;     
28350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 64            /* --d
28360 69 72 65 63 74 6f 72 79 20 61 72 67 75 6d 65 6e  irectory argumen
28370 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  t, or NULL */.  
28380 63 68 61 72 20 2a 2a 61 7a 41 72 67 3b 20 20 20  char **azArg;   
28390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283a0 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6d 6d  /* Array of comm
283b0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
283c0 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
283d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
283e0 20 20 20 2f 2a 20 53 68 65 6c 6c 20 73 74 61 74     /* Shell stat
283f0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
28400 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
28410 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
28420 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
28430 65 20 61 72 63 68 69 76 65 20 2a 2f 0a 7d 3b 0a  e archive */.};.
28440 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 75  ./*.** Print a u
28450 73 61 67 65 20 6d 65 73 73 61 67 65 20 66 6f 72  sage message for
28460 20 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64   the .ar command
28470 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72   to stderr and r
28480 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
28490 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OR..*/.static in
284a0 74 20 61 72 55 73 61 67 65 28 46 49 4c 45 20 2a  t arUsage(FILE *
284b0 66 29 7b 0a 20 20 73 68 6f 77 48 65 6c 70 28 66  f){.  showHelp(f
284c0 2c 22 61 72 63 68 69 76 65 22 29 3b 0a 20 20 72  ,"archive");.  r
284d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
284e0 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  OR;.}../*.** Pri
284f0 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nt an error mess
28500 61 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72 20  age for the .ar 
28510 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65 72  command to stder
28520 72 20 61 6e 64 20 72 65 74 75 72 6e 20 0a 2a 2a  r and return .**
28530 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a   SQLITE_ERROR..*
28540 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45  /.static int arE
28550 72 72 6f 72 4d 73 67 28 41 72 43 6f 6d 6d 61 6e  rrorMsg(ArComman
28560 64 20 2a 70 41 72 2c 20 63 6f 6e 73 74 20 63 68  d *pAr, const ch
28570 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a  ar *zFmt, ...){.
28580 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
28590 63 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 73 74  char *z;.  va_st
285a0 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20  art(ap, zFmt);. 
285b0 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70   z = sqlite3_vmp
285c0 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b  rintf(zFmt, ap);
285d0 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
285e0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
285f0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
28600 6e 22 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 41  n", z);.  if( pA
28610 72 2d 3e 66 72 6f 6d 43 6d 64 4c 69 6e 65 20 29  r->fromCmdLine )
28620 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
28630 66 28 73 74 64 65 72 72 2c 20 22 55 73 65 20 5c  f(stderr, "Use \
28640 22 2d 41 5c 22 20 66 6f 72 20 6d 6f 72 65 20 68  "-A\" for more h
28650 65 6c 70 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65  elp\n");.  }else
28660 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
28670 66 28 73 74 64 65 72 72 2c 20 22 55 73 65 20 5c  f(stderr, "Use \
28680 22 2e 61 72 63 68 69 76 65 20 2d 2d 68 65 6c 70  ".archive --help
28690 5c 22 20 66 6f 72 20 6d 6f 72 65 20 68 65 6c 70  \" for more help
286a0 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  \n");.  }.  sqli
286b0 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
286c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
286d0 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c  OR;.}../*.** Val
286e0 75 65 73 20 66 6f 72 20 41 72 43 6f 6d 6d 61 6e  ues for ArComman
286f0 64 2e 65 43 6d 64 2e 0a 2a 2f 0a 23 64 65 66 69  d.eCmd..*/.#defi
28700 6e 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45  ne AR_CMD_CREATE
28710 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65         1.#define
28720 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 20   AR_CMD_EXTRACT 
28730 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 41       2.#define A
28740 52 5f 43 4d 44 5f 4c 49 53 54 20 20 20 20 20 20  R_CMD_LIST      
28750 20 20 20 33 0a 23 64 65 66 69 6e 65 20 41 52 5f     3.#define AR_
28760 43 4d 44 5f 55 50 44 41 54 45 20 20 20 20 20 20  CMD_UPDATE      
28770 20 34 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d   4.#define AR_CM
28780 44 5f 48 45 4c 50 20 20 20 20 20 20 20 20 20 35  D_HELP         5
28790 0a 0a 2f 2a 0a 2a 2a 20 4f 74 68 65 72 20 28 6e  ../*.** Other (n
287a0 6f 6e 2d 63 6f 6d 6d 61 6e 64 29 20 73 77 69 74  on-command) swit
287b0 63 68 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ches..*/.#define
287c0 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f   AR_SWITCH_VERBO
287d0 53 45 20 20 20 20 20 36 0a 23 64 65 66 69 6e 65  SE     6.#define
287e0 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 20   AR_SWITCH_FILE 
287f0 20 20 20 20 20 20 20 37 0a 23 64 65 66 69 6e 65         7.#define
28800 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43   AR_SWITCH_DIREC
28810 54 4f 52 59 20 20 20 38 0a 23 64 65 66 69 6e 65  TORY   8.#define
28820 20 41 52 5f 53 57 49 54 43 48 5f 41 50 50 45 4e   AR_SWITCH_APPEN
28830 44 20 20 20 20 20 20 39 0a 23 64 65 66 69 6e 65  D      9.#define
28840 20 41 52 5f 53 57 49 54 43 48 5f 44 52 59 52 55   AR_SWITCH_DRYRU
28850 4e 20 20 20 20 20 31 30 0a 0a 73 74 61 74 69 63  N     10..static
28860 20 69 6e 74 20 61 72 50 72 6f 63 65 73 73 53 77   int arProcessSw
28870 69 74 63 68 28 41 72 43 6f 6d 6d 61 6e 64 20 2a  itch(ArCommand *
28880 70 41 72 2c 20 69 6e 74 20 65 53 77 69 74 63 68  pAr, int eSwitch
28890 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  , const char *zA
288a0 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65  rg){.  switch( e
288b0 53 77 69 74 63 68 20 29 7b 0a 20 20 20 20 63 61  Switch ){.    ca
288c0 73 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45  se AR_CMD_CREATE
288d0 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d  :.    case AR_CM
288e0 44 5f 45 58 54 52 41 43 54 3a 0a 20 20 20 20 63  D_EXTRACT:.    c
288f0 61 73 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 3a  ase AR_CMD_LIST:
28900 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44  .    case AR_CMD
28910 5f 55 50 44 41 54 45 3a 0a 20 20 20 20 63 61 73  _UPDATE:.    cas
28920 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20  e AR_CMD_HELP:. 
28930 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 65 43       if( pAr->eC
28940 6d 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  md ){.        re
28950 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28  turn arErrorMsg(
28960 70 41 72 2c 20 22 6d 75 6c 74 69 70 6c 65 20 63  pAr, "multiple c
28970 6f 6d 6d 61 6e 64 20 6f 70 74 69 6f 6e 73 22 29  ommand options")
28980 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28990 70 41 72 2d 3e 65 43 6d 64 20 3d 20 65 53 77 69  pAr->eCmd = eSwi
289a0 74 63 68 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  tch;.      break
289b0 3b 0a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53  ;..    case AR_S
289c0 57 49 54 43 48 5f 44 52 59 52 55 4e 3a 0a 20 20  WITCH_DRYRUN:.  
289d0 20 20 20 20 70 41 72 2d 3e 62 44 72 79 52 75 6e      pAr->bDryRun
289e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
289f0 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53  k;.    case AR_S
28a00 57 49 54 43 48 5f 56 45 52 42 4f 53 45 3a 0a 20  WITCH_VERBOSE:. 
28a10 20 20 20 20 20 70 41 72 2d 3e 62 56 65 72 62 6f       pAr->bVerbo
28a20 73 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  se = 1;.      br
28a30 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52  eak;.    case AR
28a40 5f 53 57 49 54 43 48 5f 41 50 50 45 4e 44 3a 0a  _SWITCH_APPEND:.
28a50 20 20 20 20 20 20 70 41 72 2d 3e 62 41 70 70 65        pAr->bAppe
28a60 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a  nd = 1;.      /*
28a70 20 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20   Fall thru into 
28a80 2d 2d 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 61  --file */.    ca
28a90 73 65 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c  se AR_SWITCH_FIL
28aa0 45 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a 46  E:.      pAr->zF
28ab0 69 6c 65 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20  ile = zArg;.    
28ac0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
28ad0 65 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45  e AR_SWITCH_DIRE
28ae0 43 54 4f 52 59 3a 0a 20 20 20 20 20 20 70 41 72  CTORY:.      pAr
28af0 2d 3e 7a 44 69 72 20 3d 20 7a 41 72 67 3b 0a 20  ->zDir = zArg;. 
28b00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
28b10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
28b20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  _OK;.}../*.** Pa
28b30 72 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  rse the command 
28b40 6c 69 6e 65 20 66 6f 72 20 61 6e 20 22 2e 61 72  line for an ".ar
28b50 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 65 20 72  " command. The r
28b60 65 73 75 6c 74 73 20 61 72 65 20 77 72 69 74 74  esults are writt
28b70 65 6e 20 69 6e 74 6f 0a 2a 2a 20 73 74 72 75 63  en into.** struc
28b80 74 75 72 65 20 28 2a 70 41 72 29 2e 20 53 51 4c  ture (*pAr). SQL
28b90 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
28ba0 65 64 20 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e  ed if the comman
28bb0 64 20 6c 69 6e 65 20 69 73 20 70 61 72 73 65 64  d line is parsed
28bc0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
28bd0 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
28be0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
28bf0 77 72 69 74 74 65 6e 20 74 6f 20 73 74 64 65 72  written to stder
28c00 72 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45  r and .** SQLITE
28c10 5f 45 52 52 4f 52 20 72 65 74 75 72 6e 65 64 2e  _ERROR returned.
28c20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
28c30 72 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28 0a 20  rParseCommand(. 
28c40 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
28c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c60 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67   /* Array of arg
28c70 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
28c80 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a   dot command */.
28c90 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
28ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cb0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
28cc0 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b  ntries in azArg[
28cd0 5d 20 2a 2f 0a 20 20 41 72 43 6f 6d 6d 61 6e 64  ] */.  ArCommand
28ce0 20 2a 70 41 72 20 20 20 20 20 20 20 20 20 20 20   *pAr           
28cf0 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61         /* Popula
28d00 74 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  te this object *
28d10 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 41 72  /.){.  struct Ar
28d20 53 77 69 74 63 68 20 7b 0a 20 20 20 20 63 6f 6e  Switch {.    con
28d30 73 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 3b 0a  st char *zLong;.
28d40 20 20 20 20 63 68 61 72 20 63 53 68 6f 72 74 3b      char cShort;
28d50 0a 20 20 20 20 75 38 20 65 53 77 69 74 63 68 3b  .    u8 eSwitch;
28d60 0a 20 20 20 20 75 38 20 62 41 72 67 3b 0a 20 20  .    u8 bArg;.  
28d70 7d 20 61 53 77 69 74 63 68 5b 5d 20 3d 20 7b 0a  } aSwitch[] = {.
28d80 20 20 20 20 7b 20 22 63 72 65 61 74 65 22 2c 20      { "create", 
28d90 20 20 20 27 63 27 2c 20 41 52 5f 43 4d 44 5f 43     'c', AR_CMD_C
28da0 52 45 41 54 45 2c 20 20 20 20 20 20 20 30 20 7d  REATE,       0 }
28db0 2c 0a 20 20 20 20 7b 20 22 65 78 74 72 61 63 74  ,.    { "extract
28dc0 22 2c 20 20 20 27 78 27 2c 20 41 52 5f 43 4d 44  ",   'x', AR_CMD
28dd0 5f 45 58 54 52 41 43 54 2c 20 20 20 20 20 20 30  _EXTRACT,      0
28de0 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 69 73 74 22   },.    { "list"
28df0 2c 20 20 20 20 20 20 27 74 27 2c 20 41 52 5f 43  ,      't', AR_C
28e00 4d 44 5f 4c 49 53 54 2c 20 20 20 20 20 20 20 20  MD_LIST,        
28e10 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 75 70 64   0 },.    { "upd
28e20 61 74 65 22 2c 20 20 20 20 27 75 27 2c 20 41 52  ate",    'u', AR
28e30 5f 43 4d 44 5f 55 50 44 41 54 45 2c 20 20 20 20  _CMD_UPDATE,    
28e40 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 68     0 },.    { "h
28e50 65 6c 70 22 2c 20 20 20 20 20 20 27 68 27 2c 20  elp",      'h', 
28e60 41 52 5f 43 4d 44 5f 48 45 4c 50 2c 20 20 20 20  AR_CMD_HELP,    
28e70 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20       0 },.    { 
28e80 22 76 65 72 62 6f 73 65 22 2c 20 20 20 27 76 27  "verbose",   'v'
28e90 2c 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42  , AR_SWITCH_VERB
28ea0 4f 53 45 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20  OSE,   0 },.    
28eb0 7b 20 22 66 69 6c 65 22 2c 20 20 20 20 20 20 27  { "file",      '
28ec0 66 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 46 49  f', AR_SWITCH_FI
28ed0 4c 45 2c 20 20 20 20 20 20 31 20 7d 2c 0a 20 20  LE,      1 },.  
28ee0 20 20 7b 20 22 61 70 70 65 6e 64 22 2c 20 20 20    { "append",   
28ef0 20 27 61 27 2c 20 41 52 5f 53 57 49 54 43 48 5f   'a', AR_SWITCH_
28f00 41 50 50 45 4e 44 2c 20 20 20 20 31 20 7d 2c 0a  APPEND,    1 },.
28f10 20 20 20 20 7b 20 22 64 69 72 65 63 74 6f 72 79      { "directory
28f20 22 2c 20 27 43 27 2c 20 41 52 5f 53 57 49 54 43  ", 'C', AR_SWITC
28f30 48 5f 44 49 52 45 43 54 4f 52 59 2c 20 31 20 7d  H_DIRECTORY, 1 }
28f40 2c 0a 20 20 20 20 7b 20 22 64 72 79 72 75 6e 22  ,.    { "dryrun"
28f50 2c 20 20 20 20 27 6e 27 2c 20 41 52 5f 53 57 49  ,    'n', AR_SWI
28f60 54 43 48 5f 44 52 59 52 55 4e 2c 20 20 20 20 30  TCH_DRYRUN,    0
28f70 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 6e   },.  };.  int n
28f80 53 77 69 74 63 68 20 3d 20 73 69 7a 65 6f 66 28  Switch = sizeof(
28f90 61 53 77 69 74 63 68 29 20 2f 20 73 69 7a 65 6f  aSwitch) / sizeo
28fa0 66 28 73 74 72 75 63 74 20 41 72 53 77 69 74 63  f(struct ArSwitc
28fb0 68 29 3b 0a 20 20 73 74 72 75 63 74 20 41 72 53  h);.  struct ArS
28fc0 77 69 74 63 68 20 2a 70 45 6e 64 20 3d 20 26 61  witch *pEnd = &a
28fd0 53 77 69 74 63 68 5b 6e 53 77 69 74 63 68 5d 3b  Switch[nSwitch];
28fe0 0a 0a 20 20 69 66 28 20 6e 41 72 67 3c 3d 31 20  ..  if( nArg<=1 
28ff0 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
29000 74 66 28 73 74 64 65 72 72 2c 20 22 57 72 6f 6e  tf(stderr, "Wron
29010 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
29020 6d 65 6e 74 73 2e 20 20 55 73 61 67 65 3a 5c 6e  ments.  Usage:\n
29030 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61  ");.    return a
29040 72 55 73 61 67 65 28 73 74 64 65 72 72 29 3b 0a  rUsage(stderr);.
29050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
29060 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 31 5d 3b  r *z = azArg[1];
29070 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27  .    if( z[0]!='
29080 2d 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  -' ){.      /* T
29090 72 61 64 69 74 69 6f 6e 61 6c 20 73 74 79 6c 65  raditional style
290a0 20 5b 74 61 72 5d 20 69 6e 76 6f 63 61 74 69 6f   [tar] invocatio
290b0 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  n */.      int i
290c0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 72 67  ;.      int iArg
290d0 20 3d 20 32 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 2;.      for(
290e0 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  i=0; z[i]; i++){
290f0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
29100 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20  har *zArg = 0;. 
29110 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72         struct Ar
29120 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20  Switch *pOpt;.  
29130 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26        for(pOpt=&
29140 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74  aSwitch[0]; pOpt
29150 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a  <pEnd; pOpt++){.
29160 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b            if( z[
29170 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74  i]==pOpt->cShort
29180 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
29190 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
291a0 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20  pOpt==pEnd ){.  
291b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
291c0 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22  rErrorMsg(pAr, "
291d0 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74  unrecognized opt
291e0 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b  ion: %c", z[i]);
291f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29200 20 20 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72     if( pOpt->bAr
29210 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  g ){.          i
29220 66 28 20 69 41 72 67 3e 3d 6e 41 72 67 20 29 7b  f( iArg>=nArg ){
29230 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
29240 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70  urn arErrorMsg(p
29250 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75  Ar, "option requ
29260 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
29270 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20  : %c",z[i]);.   
29280 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29290 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b     zArg = azArg[
292a0 69 41 72 67 2b 2b 5d 3b 0a 20 20 20 20 20 20 20  iArg++];.       
292b0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 61   }.        if( a
292c0 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70  rProcessSwitch(p
292d0 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63  Ar, pOpt->eSwitc
292e0 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75 72  h, zArg) ) retur
292f0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
29300 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
29310 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69  r->nArg = nArg-i
29320 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Arg;.      if( p
29330 41 72 2d 3e 6e 41 72 67 3e 30 20 29 7b 0a 20 20  Ar->nArg>0 ){.  
29340 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67        pAr->azArg
29350 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b   = &azArg[iArg];
29360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
29370 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 6e  se{.      /* Non
29380 2d 74 72 61 64 69 74 69 6f 6e 61 6c 20 69 6e 76  -traditional inv
29390 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ocation */.     
293a0 20 69 6e 74 20 69 41 72 67 3b 0a 20 20 20 20 20   int iArg;.     
293b0 20 66 6f 72 28 69 41 72 67 3d 31 3b 20 69 41 72   for(iArg=1; iAr
293c0 67 3c 6e 41 72 67 3b 20 69 41 72 67 2b 2b 29 7b  g<nArg; iArg++){
293d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  .        int n;.
293e0 20 20 20 20 20 20 20 20 7a 20 3d 20 61 7a 41 72          z = azAr
293f0 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20  g[iArg];.       
29400 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29   if( z[0]!='-' )
29410 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
29420 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d  ll remaining com
29430 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 20  mand line words 
29440 61 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75  are command argu
29450 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20  ments. */.      
29460 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d      pAr->azArg =
29470 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20   &azArg[iArg];. 
29480 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41           pAr->nA
29490 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a  rg = nArg-iArg;.
294a0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
294b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
294c0 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28     n = strlen30(
294d0 7a 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  z);..        if(
294e0 20 7a 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20 20   z[1]!='-' ){.  
294f0 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
29500 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
29510 6f 72 20 6d 6f 72 65 20 73 68 6f 72 74 20 6f 70  or more short op
29520 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20  tions */.       
29530 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b     for(i=1; i<n;
29540 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
29550 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
29560 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Arg = 0;.       
29570 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77       struct ArSw
29580 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20  itch *pOpt;.    
29590 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74          for(pOpt
295a0 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f  =&aSwitch[0]; pO
295b0 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29  pt<pEnd; pOpt++)
295c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
295d0 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e  if( z[i]==pOpt->
295e0 63 53 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a  cShort ) break;.
295f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
29600 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
29610 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  pt==pEnd ){.    
29620 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
29630 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c   arErrorMsg(pAr,
29640 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f   "unrecognized o
29650 70 74 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d  ption: %c", z[i]
29660 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
29670 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
29680 20 70 4f 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20   pOpt->bArg ){. 
29690 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
296a0 20 69 3c 28 6e 2d 31 29 20 29 7b 0a 20 20 20 20   i<(n-1) ){.    
296b0 20 20 20 20 20 20 20 20 20 20 20 20 7a 41 72 67              zArg
296c0 20 3d 20 26 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20   = &z[i+1];.    
296d0 20 20 20 20 20 20 20 20 20 20 20 20 69 20 3d 20              i = 
296e0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
296f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
29700 20 20 20 20 20 20 20 20 69 66 28 20 69 41 72 67          if( iArg
29710 3e 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20  >=(nArg-1) ){.  
29720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29730 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73  return arErrorMs
29740 67 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72  g(pAr, "option r
29750 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d  equires an argum
29760 65 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a  ent: %c",z[i]);.
29770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29780 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
29790 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 2b    zArg = azArg[+
297a0 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20  +iArg];.        
297b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
297c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
297d0 20 20 69 66 28 20 61 72 50 72 6f 63 65 73 73 53    if( arProcessS
297e0 77 69 74 63 68 28 70 41 72 2c 20 70 4f 70 74 2d  witch(pAr, pOpt-
297f0 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20  >eSwitch, zArg) 
29800 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
29810 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
29820 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
29830 20 69 66 28 20 7a 5b 32 5d 3d 3d 27 5c 30 27 20   if( z[2]=='\0' 
29840 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
29850 41 20 2d 2d 20 6f 70 74 69 6f 6e 2c 20 69 6e 64  A -- option, ind
29860 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 6c 6c  icating that all
29870 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d 61   remaining comma
29880 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 0a 20 20  nd line words.  
29890 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 63          ** are c
298a0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
298b0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
298c0 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a  pAr->azArg = &az
298d0 41 72 67 5b 69 41 72 67 2b 31 5d 3b 0a 20 20 20  Arg[iArg+1];.   
298e0 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67         pAr->nArg
298f0 20 3d 20 6e 41 72 67 2d 69 41 72 67 2d 31 3b 0a   = nArg-iArg-1;.
29900 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
29910 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
29920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c            /* A l
29930 6f 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20  ong option */.  
29940 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
29950 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 20 20 20  ar *zArg = 0;   
29960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
29970 75 6d 65 6e 74 20 66 6f 72 20 6f 70 74 69 6f 6e  ument for option
29980 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20 20  , if any */.    
29990 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53        struct ArS
299a0 77 69 74 63 68 20 2a 70 4d 61 74 63 68 20 3d 20  witch *pMatch = 
299b0 30 3b 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68  0;      /* Match
299c0 69 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20  ing option */.  
299d0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
299e0 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 20 20  rSwitch *pOpt;  
299f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
29a00 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
29a10 20 20 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77     for(pOpt=&aSw
29a20 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45  itch[0]; pOpt<pE
29a30 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20  nd; pOpt++){.   
29a40 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
29a50 68 61 72 20 2a 7a 4c 6f 6e 67 20 3d 20 70 4f 70  har *zLong = pOp
29a60 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20 20 20 20 20  t->zLong;.      
29a70 20 20 20 20 20 20 69 66 28 20 28 6e 2d 32 29 3c        if( (n-2)<
29a80 3d 73 74 72 6c 65 6e 33 30 28 7a 4c 6f 6e 67 29  =strlen30(zLong)
29a90 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 26 7a   && 0==memcmp(&z
29aa0 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c 20 6e 2d 32 29  [2], zLong, n-2)
29ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29ac0 20 20 69 66 28 20 70 4d 61 74 63 68 20 29 7b 0a    if( pMatch ){.
29ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ae0 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73  return arErrorMs
29af0 67 28 70 41 72 2c 20 22 61 6d 62 69 67 75 6f 75  g(pAr, "ambiguou
29b00 73 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 7a 29  s option: %s",z)
29b10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
29b20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
29b30 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20         pMatch = 
29b40 70 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20  pOpt;.          
29b50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29b60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
29b70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
29b80 4d 61 74 63 68 3d 3d 30 20 29 7b 0a 20 20 20 20  Match==0 ){.    
29b90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
29ba0 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22  rErrorMsg(pAr, "
29bb0 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74  unrecognized opt
29bc0 69 6f 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ion: %s", z);.  
29bd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29be0 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 2d 3e      if( pMatch->
29bf0 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  bArg ){.        
29c00 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d 28 6e      if( iArg>=(n
29c10 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  Arg-1) ){.      
29c20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
29c30 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22  rErrorMsg(pAr, "
29c40 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
29c50 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 22  an argument: %s"
29c60 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , z);.          
29c70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
29c80 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 2b 2b 69  zArg = azArg[++i
29c90 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Arg];.          
29ca0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
29cb0 61 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28  arProcessSwitch(
29cc0 70 41 72 2c 20 70 4d 61 74 63 68 2d 3e 65 53 77  pAr, pMatch->eSw
29cd0 69 74 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65  itch, zArg) ) re
29ce0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
29cf0 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
29d00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
29d10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29d20 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
29d30 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
29d40 65 73 20 74 68 61 74 20 61 6c 6c 20 61 72 67 75  es that all argu
29d50 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 68 65  ments within the
29d60 20 41 72 43 6f 6d 6d 61 6e 64 2e 61 7a 41 72 67   ArCommand.azArg
29d70 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 72 65 66 65  [].** array refe
29d80 72 20 74 6f 20 61 72 63 68 69 76 65 20 6d 65 6d  r to archive mem
29d90 62 65 72 73 2c 20 61 73 20 66 6f 72 20 74 68 65  bers, as for the
29da0 20 2d 2d 65 78 74 72 61 63 74 20 6f 72 20 2d 2d   --extract or --
29db0 6c 69 73 74 20 63 6f 6d 6d 61 6e 64 73 2e 20 0a  list commands. .
29dc0 2a 2a 20 49 74 20 63 68 65 63 6b 73 20 74 68 61  ** It checks tha
29dd0 74 20 65 61 63 68 20 6f 66 20 74 68 65 6d 20 61  t each of them a
29de0 72 65 20 70 72 65 73 65 6e 74 2e 20 49 66 20 61  re present. If a
29df0 6e 79 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  ny specified fil
29e00 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 70 72 65 73  e is not.** pres
29e10 65 6e 74 20 69 6e 20 74 68 65 20 61 72 63 68 69  ent in the archi
29e20 76 65 2c 20 61 6e 20 65 72 72 6f 72 20 69 73 20  ve, an error is 
29e30 70 72 69 6e 74 65 64 20 74 6f 20 73 74 64 65 72  printed to stder
29e40 72 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 0a 2a  r and an error.*
29e50 2a 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e  * code returned.
29e60 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
29e70 6c 6c 20 73 70 65 63 69 66 69 65 64 20 61 72 67  ll specified arg
29e80 75 6d 65 6e 74 73 20 61 72 65 20 70 72 65 73 65  uments are prese
29e90 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72 63  nt in.** the arc
29ea0 68 69 76 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  hive, SQLITE_OK 
29eb0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
29ec0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
29ed0 20 73 74 72 69 70 73 20 61 6e 79 20 74 72 61 69   strips any trai
29ee0 6c 69 6e 67 20 27 2f 27 20 63 68 61 72 61 63 74  ling '/' charact
29ef0 65 72 73 20 66 72 6f 6d 20 65 61 63 68 20 61 72  ers from each ar
29f00 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20  gument..** This 
29f10 69 73 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69  is consistent wi
29f20 74 68 20 74 68 65 20 77 61 79 20 74 68 65 20 5b  th the way the [
29f30 74 61 72 5d 20 63 6f 6d 6d 61 6e 64 20 73 65 65  tar] command see
29f40 6d 73 20 74 6f 20 77 6f 72 6b 20 6f 6e 0a 2a 2a  ms to work on.**
29f50 20 4c 69 6e 75 78 2e 0a 2a 2f 0a 73 74 61 74 69   Linux..*/.stati
29f60 63 20 69 6e 74 20 61 72 43 68 65 63 6b 45 6e 74  c int arCheckEnt
29f70 72 69 65 73 28 41 72 43 6f 6d 6d 61 6e 64 20 2a  ries(ArCommand *
29f80 70 41 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pAr){.  int rc =
29f90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
29fa0 28 20 70 41 72 2d 3e 6e 41 72 67 20 29 7b 0a 20  ( pAr->nArg ){. 
29fb0 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
29fc0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
29fd0 54 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 73  Test = 0;..    s
29fe0 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74  hellPreparePrint
29ff0 66 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20  f(pAr->db, &rc, 
2a000 26 70 54 65 73 74 2c 0a 20 20 20 20 20 20 20 20  &pTest,.        
2a010 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f  "SELECT name FRO
2a020 4d 20 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d  M %s WHERE name=
2a030 24 6e 61 6d 65 22 2c 20 0a 20 20 20 20 20 20 20  $name", .       
2a040 20 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 0a   pAr->zSrcTable.
2a050 20 20 20 20 29 3b 0a 20 20 20 20 6a 20 3d 20 73      );.    j = s
2a060 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
2a070 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 54 65 73  meter_index(pTes
2a080 74 2c 20 22 24 6e 61 6d 65 22 29 3b 0a 20 20 20  t, "$name");.   
2a090 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d   for(i=0; i<pAr-
2a0a0 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c  >nArg && rc==SQL
2a0b0 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
2a0c0 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 70 41      char *z = pA
2a0d0 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20  r->azArg[i];.   
2a0e0 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65     int n = strle
2a0f0 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 69 6e  n30(z);.      in
2a100 74 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 20  t bOk = 0;.     
2a110 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a   while( n>0 && z
2a120 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 20 6e 2d 2d  [n-1]=='/' ) n--
2a130 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 27  ;.      z[n] = '
2a140 5c 30 27 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  \0';.      sqlit
2a150 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 54 65  e3_bind_text(pTe
2a160 73 74 2c 20 6a 2c 20 7a 2c 20 2d 31 2c 20 53 51  st, j, z, -1, SQ
2a170 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
2a180 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
2a190 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2a1a0 28 70 54 65 73 74 29 20 29 7b 0a 20 20 20 20 20  (pTest) ){.     
2a1b0 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20     bOk = 1;.    
2a1c0 20 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 52    }.      shellR
2a1d0 65 73 65 74 28 26 72 63 2c 20 70 54 65 73 74 29  eset(&rc, pTest)
2a1e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2a1f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b  SQLITE_OK && bOk
2a200 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==0 ){.        u
2a210 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2a220 72 2c 20 22 6e 6f 74 20 66 6f 75 6e 64 20 69 6e  r, "not found in
2a230 20 61 72 63 68 69 76 65 3a 20 25 73 5c 6e 22 2c   archive: %s\n",
2a240 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20   z);.        rc 
2a250 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2a260 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2a270 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28    shellFinalize(
2a280 26 72 63 2c 20 70 54 65 73 74 29 3b 0a 20 20 7d  &rc, pTest);.  }
2a290 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2a2a0 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 61 20  ./*.** Format a 
2a2b0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
2a2c0 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 67  t can be used ag
2a2d0 61 69 6e 73 74 20 74 68 65 20 22 73 71 6c 61 72  ainst the "sqlar
2a2e0 22 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 69 64  " table to.** id
2a2f0 65 6e 74 69 66 79 20 61 6c 6c 20 61 72 63 68 69  entify all archi
2a300 76 65 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20  ve members that 
2a310 6d 61 74 63 68 20 74 68 65 20 63 6f 6d 6d 61 6e  match the comman
2a320 64 20 61 72 67 75 6d 65 6e 74 73 20 68 65 6c 64  d arguments held
2a330 0a 2a 2a 20 69 6e 20 28 2a 70 41 72 29 2e 20 4c  .** in (*pAr). L
2a340 65 61 76 65 20 74 68 69 73 20 57 48 45 52 45 20  eave this WHERE 
2a350 63 6c 61 75 73 65 20 69 6e 20 28 2a 70 7a 57 68  clause in (*pzWh
2a360 65 72 65 29 20 62 65 66 6f 72 65 20 72 65 74 75  ere) before retu
2a370 72 6e 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 61  rning..** The ca
2a380 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
2a390 62 6c 65 20 66 6f 72 20 65 76 65 6e 74 75 61 6c  ble for eventual
2a3a0 6c 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  ly calling sqlit
2a3b0 65 33 5f 66 72 65 65 28 29 20 6f 6e 0a 2a 2a 20  e3_free() on.** 
2a3c0 61 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c 20 28 2a 70  any non-NULL (*p
2a3d0 7a 57 68 65 72 65 29 20 76 61 6c 75 65 2e 0a 2a  zWhere) value..*
2a3e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 72  /.static void ar
2a3f0 57 68 65 72 65 43 6c 61 75 73 65 28 0a 20 20 69  WhereClause(.  i
2a400 6e 74 20 2a 70 52 63 2c 20 0a 20 20 41 72 43 6f  nt *pRc, .  ArCo
2a410 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 0a 20 20 63  mmand *pAr, .  c
2a420 68 61 72 20 2a 2a 70 7a 57 68 65 72 65 20 20 20  har **pzWhere   
2a430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a440 2a 20 4f 55 54 3a 20 4e 65 77 20 57 48 45 52 45  * OUT: New WHERE
2a450 20 63 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20   clause */.){.  
2a460 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30  char *zWhere = 0
2a470 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  ;.  if( *pRc==SQ
2a480 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2a490 66 28 20 70 41 72 2d 3e 6e 41 72 67 3d 3d 30 20  f( pAr->nArg==0 
2a4a0 29 7b 0a 20 20 20 20 20 20 7a 57 68 65 72 65 20  ){.      zWhere 
2a4b0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2a4c0 66 28 22 31 22 29 3b 0a 20 20 20 20 7d 65 6c 73  f("1");.    }els
2a4d0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
2a4e0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2a4f0 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20   *zSep = "";.   
2a500 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
2a510 72 2d 3e 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20  r->nArg; i++){. 
2a520 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2a530 72 20 2a 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72  r *z = pAr->azAr
2a540 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a 57  g[i];.        zW
2a550 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  here = sqlite3_m
2a560 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
2a570 20 20 22 25 7a 25 73 20 6e 61 6d 65 20 3d 20 27    "%z%s name = '
2a580 25 71 27 20 4f 52 20 73 75 62 73 74 72 28 6e 61  %q' OR substr(na
2a590 6d 65 2c 31 2c 25 64 29 20 3d 20 27 25 71 2f 27  me,1,%d) = '%q/'
2a5a0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 7a 57  ", .          zW
2a5b0 68 65 72 65 2c 20 7a 53 65 70 2c 20 7a 2c 20 73  here, zSep, z, s
2a5c0 74 72 6c 65 6e 33 30 28 7a 29 2b 31 2c 20 7a 0a  trlen30(z)+1, z.
2a5d0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2a5e0 20 20 20 69 66 28 20 7a 57 68 65 72 65 3d 3d 30     if( zWhere==0
2a5f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
2a600 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
2a610 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  M;.          bre
2a620 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
2a630 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20 4f        zSep = " O
2a640 52 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  R ";.      }.   
2a650 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 57 68 65 72   }.  }.  *pzWher
2a660 65 20 3d 20 7a 57 68 65 72 65 3b 0a 7d 0a 0a 2f  e = zWhere;.}../
2a670 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
2a680 69 6f 6e 20 6f 66 20 2e 61 72 20 22 6c 69 73 54  ion of .ar "lisT
2a690 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73  " command. .*/.s
2a6a0 74 61 74 69 63 20 69 6e 74 20 61 72 4c 69 73 74  tatic int arList
2a6b0 43 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e  Command(ArComman
2a6c0 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74  d *pAr){.  const
2a6d0 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53   char *zSql = "S
2a6e0 45 4c 45 43 54 20 25 73 20 46 52 4f 4d 20 25 73  ELECT %s FROM %s
2a6f0 20 57 48 45 52 45 20 25 73 22 3b 20 0a 20 20 63   WHERE %s"; .  c
2a700 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 43 6f 6c  onst char *azCol
2a710 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 6e 61 6d  s[] = {.    "nam
2a720 65 22 2c 0a 20 20 20 20 22 6c 73 6d 6f 64 65 28  e",.    "lsmode(
2a730 6d 6f 64 65 29 2c 20 73 7a 2c 20 64 61 74 65 74  mode), sz, datet
2a740 69 6d 65 28 6d 74 69 6d 65 2c 20 27 75 6e 69 78  ime(mtime, 'unix
2a750 65 70 6f 63 68 27 29 2c 20 6e 61 6d 65 22 0a 20  epoch'), name". 
2a760 20 7d 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 57 68   };..  char *zWh
2a770 65 72 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ere = 0;.  sqlit
2a780 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20  e3_stmt *pSql = 
2a790 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  0;.  int rc;..  
2a7a0 72 63 20 3d 20 61 72 43 68 65 63 6b 45 6e 74 72  rc = arCheckEntr
2a7b0 69 65 73 28 70 41 72 29 3b 0a 20 20 61 72 57 68  ies(pAr);.  arWh
2a7c0 65 72 65 43 6c 61 75 73 65 28 26 72 63 2c 20 70  ereClause(&rc, p
2a7d0 41 72 2c 20 26 7a 57 68 65 72 65 29 3b 0a 0a 20  Ar, &zWhere);.. 
2a7e0 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69   shellPreparePri
2a7f0 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72 63  ntf(pAr->db, &rc
2a800 2c 20 26 70 53 71 6c 2c 20 7a 53 71 6c 2c 20 61  , &pSql, zSql, a
2a810 7a 43 6f 6c 73 5b 70 41 72 2d 3e 62 56 65 72 62  zCols[pAr->bVerb
2a820 6f 73 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  ose],.          
2a830 20 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e             pAr->
2a840 7a 53 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72  zSrcTable, zWher
2a850 65 29 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 62  e);.  if( pAr->b
2a860 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 75 74  DryRun ){.    ut
2a870 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70  f8_printf(pAr->p
2a880 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73  ->out, "%s\n", s
2a890 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c 29  qlite3_sql(pSql)
2a8a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2a8b0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
2a8c0 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
2a8d0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2a8e0 28 70 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20  (pSql) ){.      
2a8f0 69 66 28 20 70 41 72 2d 3e 62 56 65 72 62 6f 73  if( pAr->bVerbos
2a900 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  e ){.        utf
2a910 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d  8_printf(pAr->p-
2a920 3e 6f 75 74 2c 20 22 25 73 20 25 20 31 30 64 20  >out, "%s % 10d 
2a930 20 25 73 20 20 25 73 5c 6e 22 2c 0a 20 20 20 20   %s  %s\n",.    
2a940 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2a950 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
2a960 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
2a970 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
2a980 5f 69 6e 74 28 70 53 71 6c 2c 20 31 29 2c 20 0a  _int(pSql, 1), .
2a990 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2a9a0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
2a9b0 70 53 71 6c 2c 20 32 29 2c 0a 20 20 20 20 20 20  pSql, 2),.      
2a9c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
2a9d0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
2a9e0 33 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  3).        );.  
2a9f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2aa00 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2aa10 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c  Ar->p->out, "%s\
2aa20 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n", sqlite3_colu
2aa30 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29  mn_text(pSql, 0)
2aa40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2aa50 0a 20 20 7d 0a 20 20 73 68 65 6c 6c 46 69 6e 61  .  }.  shellFina
2aa60 6c 69 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b  lize(&rc, pSql);
2aa70 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2aa80 7a 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72  zWhere);.  retur
2aa90 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2aaa0 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
2aab0 66 20 2e 61 72 20 22 65 58 74 72 61 63 74 22 20  f .ar "eXtract" 
2aac0 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61  command. .*/.sta
2aad0 74 69 63 20 69 6e 74 20 61 72 45 78 74 72 61 63  tic int arExtrac
2aae0 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61  tCommand(ArComma
2aaf0 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73  nd *pAr){.  cons
2ab00 74 20 63 68 61 72 20 2a 7a 53 71 6c 31 20 3d 20  t char *zSql1 = 
2ab10 0a 20 20 20 20 22 53 45 4c 45 43 54 20 22 0a 20  .    "SELECT ". 
2ab20 20 20 20 22 20 28 24 64 69 72 20 7c 7c 20 6e 61     " ($dir || na
2ab30 6d 65 29 2c 22 0a 20 20 20 20 22 20 77 72 69 74  me),".    " writ
2ab40 65 66 69 6c 65 28 28 24 64 69 72 20 7c 7c 20 6e  efile(($dir || n
2ab50 61 6d 65 29 2c 20 25 73 2c 20 6d 6f 64 65 2c 20  ame), %s, mode, 
2ab60 6d 74 69 6d 65 29 20 22 0a 20 20 20 20 22 46 52  mtime) ".    "FR
2ab70 4f 4d 20 25 73 20 57 48 45 52 45 20 28 25 73 29  OM %s WHERE (%s)
2ab80 20 41 4e 44 20 28 64 61 74 61 20 49 53 20 4e 55   AND (data IS NU
2ab90 4c 4c 20 4f 52 20 24 64 69 72 4f 6e 6c 79 20 3d  LL OR $dirOnly =
2aba0 20 30 29 22 0a 20 20 20 20 22 20 41 4e 44 20 6e   0)".    " AND n
2abb0 61 6d 65 20 4e 4f 54 20 47 4c 4f 42 20 27 2a 2e  ame NOT GLOB '*.
2abc0 2e 5b 2f 5c 5c 5d 2a 27 22 3b 0a 0a 20 20 63 6f  .[/\\]*'";..  co
2abd0 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 78 74 72  nst char *azExtr
2abe0 61 41 72 67 5b 5d 20 3d 20 7b 20 0a 20 20 20 20  aArg[] = { .    
2abf0 22 73 71 6c 61 72 5f 75 6e 63 6f 6d 70 72 65 73  "sqlar_uncompres
2ac00 73 28 64 61 74 61 2c 20 73 7a 29 22 2c 0a 20 20  s(data, sz)",.  
2ac10 20 20 22 64 61 74 61 22 0a 20 20 7d 3b 0a 0a 20    "data".  };.. 
2ac20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2ac30 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Sql = 0;.  int r
2ac40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2ac50 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b   char *zDir = 0;
2ac60 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20  .  char *zWhere 
2ac70 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  = 0;.  int i, j;
2ac80 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65  ..  /* If argume
2ac90 6e 74 73 20 61 72 65 20 73 70 65 63 69 66 69 65  nts are specifie
2aca0 64 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  d, check that th
2acb0 65 79 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73  ey actually exis
2acc0 74 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68  t within.  ** th
2acd0 65 20 61 72 63 68 69 76 65 20 62 65 66 6f 72 65  e archive before
2ace0 20 70 72 6f 63 65 65 64 69 6e 67 2e 20 41 6e 64   proceeding. And
2acf0 20 66 6f 72 6d 75 6c 61 74 65 20 61 20 57 48 45   formulate a WHE
2ad00 52 45 20 63 6c 61 75 73 65 20 74 6f 0a 20 20 2a  RE clause to.  *
2ad10 2a 20 6d 61 74 63 68 20 74 68 65 6d 2e 20 20 2a  * match them.  *
2ad20 2f 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b  /.  rc = arCheck
2ad30 45 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20  Entries(pAr);.  
2ad40 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72  arWhereClause(&r
2ad50 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29  c, pAr, &zWhere)
2ad60 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
2ad70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
2ad80 28 20 70 41 72 2d 3e 7a 44 69 72 20 29 7b 0a 20  ( pAr->zDir ){. 
2ad90 20 20 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69       zDir = sqli
2ada0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f  te3_mprintf("%s/
2adb0 22 2c 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20  ", pAr->zDir);. 
2adc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2add0 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zDir = sqlite3_m
2ade0 70 72 69 6e 74 66 28 22 22 29 3b 0a 20 20 20 20  printf("");.    
2adf0 7d 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d  }.    if( zDir==
2ae00 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  0 ) rc = SQLITE_
2ae10 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 73 68  NOMEM;.  }..  sh
2ae20 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66  ellPreparePrintf
2ae30 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26  (pAr->db, &rc, &
2ae40 70 53 71 6c 2c 20 7a 53 71 6c 31 2c 20 0a 20 20  pSql, zSql1, .  
2ae50 20 20 20 20 61 7a 45 78 74 72 61 41 72 67 5b 70      azExtraArg[p
2ae60 41 72 2d 3e 62 5a 69 70 5d 2c 20 70 41 72 2d 3e  Ar->bZip], pAr->
2ae70 7a 53 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72  zSrcTable, zWher
2ae80 65 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  e.  );..  if( rc
2ae90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2aea0 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62     j = sqlite3_b
2aeb0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
2aec0 64 65 78 28 70 53 71 6c 2c 20 22 24 64 69 72 22  dex(pSql, "$dir"
2aed0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
2aee0 69 6e 64 5f 74 65 78 74 28 70 53 71 6c 2c 20 6a  ind_text(pSql, j
2aef0 2c 20 7a 44 69 72 2c 20 2d 31 2c 20 53 51 4c 49  , zDir, -1, SQLI
2af00 54 45 5f 53 54 41 54 49 43 29 3b 0a 0a 20 20 20  TE_STATIC);..   
2af10 20 2f 2a 20 52 75 6e 20 74 68 65 20 53 45 4c 45   /* Run the SELE
2af20 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 77 69  CT statement twi
2af30 63 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 69  ce. The first ti
2af40 6d 65 2c 20 77 72 69 74 65 66 69 6c 65 28 29 20  me, writefile() 
2af50 69 73 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a  is called.    **
2af60 20 66 6f 72 20 61 6c 6c 20 61 72 63 68 69 76 65   for all archive
2af70 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 73 68   members that sh
2af80 6f 75 6c 64 20 62 65 20 65 78 74 72 61 63 74 65  ould be extracte
2af90 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 74 69  d. The second ti
2afa0 6d 65 2c 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20  me,.    ** only 
2afb0 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72  for the director
2afc0 69 65 73 2e 20 54 68 69 73 20 69 73 20 62 65 63  ies. This is bec
2afd0 61 75 73 65 20 74 68 65 20 74 69 6d 65 73 74 61  ause the timesta
2afe0 6d 70 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65  mps for.    ** e
2aff0 78 74 72 61 63 74 65 64 20 64 69 72 65 63 74 6f  xtracted directo
2b000 72 69 65 73 20 6d 75 73 74 20 62 65 20 72 65 73  ries must be res
2b010 65 74 20 61 66 74 65 72 20 74 68 65 79 20 61 72  et after they ar
2b020 65 20 70 6f 70 75 6c 61 74 65 64 20 28 61 73 0a  e populated (as.
2b030 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 69 6e      ** populatin
2b040 67 20 74 68 65 6d 20 63 68 61 6e 67 65 73 20 74  g them changes t
2b050 68 65 20 74 69 6d 65 73 74 61 6d 70 29 2e 20 20  he timestamp).  
2b060 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
2b070 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
2b080 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e   j = sqlite3_bin
2b090 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
2b0a0 78 28 70 53 71 6c 2c 20 22 24 64 69 72 4f 6e 6c  x(pSql, "$dirOnl
2b0b0 79 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  y");.      sqlit
2b0c0 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c  e3_bind_int(pSql
2b0d0 2c 20 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , j, i);.      i
2b0e0 66 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20  f( pAr->bDryRun 
2b0f0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
2b100 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f  printf(pAr->p->o
2b110 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69  ut, "%s\n", sqli
2b120 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b 0a  te3_sql(pSql));.
2b130 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b140 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d       while( rc==
2b150 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
2b160 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
2b170 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20  _step(pSql) ){. 
2b180 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d           if( i==
2b190 30 20 26 26 20 70 41 72 2d 3e 62 56 65 72 62 6f  0 && pAr->bVerbo
2b1a0 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
2b1b0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
2b1c0 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  r->p->out, "%s\n
2b1d0 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
2b1e0 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29  n_text(pSql, 0))
2b1f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2b200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2b210 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74        shellReset
2b220 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20 20  (&rc, pSql);.   
2b230 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61   }.    shellFina
2b240 6c 69 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b  lize(&rc, pSql);
2b250 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
2b260 66 72 65 65 28 7a 44 69 72 29 3b 0a 20 20 73 71  free(zDir);.  sq
2b270 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72  lite3_free(zWher
2b280 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
2b290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68  .}../*.** Run th
2b2a0 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2b2b0 69 6e 20 7a 53 71 6c 2e 20 20 4f 72 20 69 66 20  in zSql.  Or if 
2b2c0 64 6f 69 6e 67 20 61 20 2d 2d 64 72 79 72 75 6e  doing a --dryrun
2b2d0 2c 20 6d 65 72 65 6c 79 20 70 72 69 6e 74 20 69  , merely print i
2b2e0 74 20 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t out..*/.static
2b2f0 20 69 6e 74 20 61 72 45 78 65 63 53 71 6c 28 41   int arExecSql(A
2b300 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63  rCommand *pAr, c
2b310 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29  onst char *zSql)
2b320 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
2b330 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29  ( pAr->bDryRun )
2b340 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
2b350 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22  f(pAr->p->out, "
2b360 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20  %s\n", zSql);.  
2b370 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2b380 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
2b390 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
2b3a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2b3b0 65 78 65 63 28 70 41 72 2d 3e 64 62 2c 20 7a 53  exec(pAr->db, zS
2b3c0 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29  ql, 0, 0, &zErr)
2b3d0 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 20 29  ;.    if( zErr )
2b3e0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
2b3f0 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 45 52 52  ntf(stdout, "ERR
2b400 4f 52 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29  OR: %s\n", zErr)
2b410 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2b420 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20  free(zErr);.    
2b430 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
2b440 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  c;.}.../*.** Imp
2b450 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e  lementation of .
2b460 61 72 20 22 63 72 65 61 74 65 22 20 61 6e 64 20  ar "create" and 
2b470 22 75 70 64 61 74 65 22 20 63 6f 6d 6d 61 6e 64  "update" command
2b480 73 2e 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20  s..**.** Create 
2b490 74 68 65 20 22 73 71 6c 61 72 22 20 74 61 62 6c  the "sqlar" tabl
2b4a0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
2b4b0 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
2b4c0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a   already exist..
2b4d0 2a 2a 20 54 68 65 6e 20 61 64 64 20 65 61 63 68  ** Then add each
2b4e0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 61 7a 46   file in the azF
2b4f0 69 6c 65 5b 5d 20 61 72 72 61 79 20 74 6f 20 74  ile[] array to t
2b500 68 65 20 61 72 63 68 69 76 65 2e 20 44 69 72 65  he archive. Dire
2b510 63 74 6f 72 69 65 73 0a 2a 2a 20 61 72 65 20 61  ctories.** are a
2b520 64 64 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  dded recursively
2b530 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 56  . If argument bV
2b540 65 72 62 6f 73 65 20 69 73 20 6e 6f 6e 2d 7a 65  erbose is non-ze
2b550 72 6f 2c 20 61 20 6d 65 73 73 61 67 65 20 69 73  ro, a message is
2b560 0a 2a 2a 20 70 72 69 6e 74 65 64 20 6f 6e 20 73  .** printed on s
2b570 74 64 6f 75 74 20 66 6f 72 20 65 61 63 68 20 66  tdout for each f
2b580 69 6c 65 20 61 72 63 68 69 76 65 64 2e 0a 2a 2a  ile archived..**
2b590 0a 2a 2a 20 54 68 65 20 63 72 65 61 74 65 20 63  .** The create c
2b5a0 6f 6d 6d 61 6e 64 20 69 73 20 74 68 65 20 73 61  ommand is the sa
2b5b0 6d 65 20 61 73 20 75 70 64 61 74 65 2c 20 65 78  me as update, ex
2b5c0 63 65 70 74 20 74 68 61 74 20 69 74 20 64 72 6f  cept that it dro
2b5d0 70 73 0a 2a 2a 20 61 6e 79 20 65 78 69 73 74 69  ps.** any existi
2b5e0 6e 67 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65  ng "sqlar" table
2b5f0 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e   before beginnin
2b600 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
2b610 20 61 72 43 72 65 61 74 65 4f 72 55 70 64 61 74   arCreateOrUpdat
2b620 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 41 72 43 6f  eCommand(.  ArCo
2b630 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 20 20 20 20  mmand *pAr,     
2b640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2b650 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
2b660 20 61 6e 64 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a   and options */.
2b670 20 20 69 6e 74 20 62 55 70 64 61 74 65 20 20 20    int bUpdate   
2b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b690 20 20 2f 2a 20 74 72 75 65 20 66 6f 72 20 61 20    /* true for a 
2b6a0 2d 2d 63 72 65 61 74 65 2e 20 20 66 61 6c 73 65  --create.  false
2b6b0 20 66 6f 72 20 2d 2d 75 70 64 61 74 65 20 2a 2f   for --update */
2b6c0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
2b6d0 20 2a 7a 43 72 65 61 74 65 20 3d 20 0a 20 20 20   *zCreate = .   
2b6e0 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
2b6f0 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73   IF NOT EXISTS s
2b700 71 6c 61 72 28 5c 6e 22 0a 20 20 20 20 20 20 22  qlar(\n".      "
2b710 20 20 6e 61 6d 65 20 54 45 58 54 20 50 52 49 4d    name TEXT PRIM
2b720 41 52 59 20 4b 45 59 2c 20 20 2d 2d 20 6e 61 6d  ARY KEY,  -- nam
2b730 65 20 6f 66 20 74 68 65 20 66 69 6c 65 5c 6e 22  e of the file\n"
2b740 0a 20 20 20 20 20 20 22 20 20 6d 6f 64 65 20 49  .      "  mode I
2b750 4e 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  NT,             
2b760 20 20 2d 2d 20 61 63 63 65 73 73 20 70 65 72 6d    -- access perm
2b770 69 73 73 69 6f 6e 73 5c 6e 22 0a 20 20 20 20 20  issions\n".     
2b780 20 22 20 20 6d 74 69 6d 65 20 49 4e 54 2c 20 20   "  mtime INT,  
2b790 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 6c              -- l
2b7a0 61 73 74 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  ast modification
2b7b0 20 74 69 6d 65 5c 6e 22 0a 20 20 20 20 20 20 22   time\n".      "
2b7c0 20 20 73 7a 20 49 4e 54 2c 20 20 20 20 20 20 20    sz INT,       
2b7d0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 6f 72 69            -- ori
2b7e0 67 69 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 5c  ginal file size\
2b7f0 6e 22 0a 20 20 20 20 20 20 22 20 20 64 61 74 61  n".      "  data
2b800 20 42 4c 4f 42 20 20 20 20 20 20 20 20 20 20 20   BLOB           
2b810 20 20 20 20 2d 2d 20 63 6f 6d 70 72 65 73 73 65      -- compresse
2b820 64 20 63 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 20  d content\n".   
2b830 20 20 20 22 29 22 3b 0a 20 20 63 6f 6e 73 74 20     ")";.  const 
2b840 63 68 61 72 20 2a 7a 44 72 6f 70 20 3d 20 22 44  char *zDrop = "D
2b850 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
2b860 53 54 53 20 73 71 6c 61 72 22 3b 0a 20 20 63 6f  STS sqlar";.  co
2b870 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 73 65 72  nst char *zInser
2b880 74 46 6d 74 5b 32 5d 20 3d 20 7b 0a 20 20 20 20  tFmt[2] = {.    
2b890 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25   "REPLACE INTO %
2b8a0 73 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d  s(name,mode,mtim
2b8b0 65 2c 73 7a 2c 64 61 74 61 29 5c 6e 22 0a 20 20  e,sz,data)\n".  
2b8c0 20 20 20 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a     "  SELECT\n".
2b8d0 20 20 20 20 20 22 20 20 20 20 25 73 2c 5c 6e 22       "    %s,\n"
2b8e0 0a 20 20 20 20 20 22 20 20 20 20 6d 6f 64 65 2c  .     "    mode,
2b8f0 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d 74  \n".     "    mt
2b900 69 6d 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20  ime,\n".     "  
2b910 20 20 43 41 53 45 20 73 75 62 73 74 72 28 6c 73    CASE substr(ls
2b920 6d 6f 64 65 28 6d 6f 64 65 29 2c 31 2c 31 29 5c  mode(mode),1,1)\
2b930 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20 20 57  n".     "      W
2b940 48 45 4e 20 27 2d 27 20 54 48 45 4e 20 6c 65 6e  HEN '-' THEN len
2b950 67 74 68 28 64 61 74 61 29 5c 6e 22 0a 20 20 20  gth(data)\n".   
2b960 20 20 22 20 20 20 20 20 20 57 48 45 4e 20 27 64    "      WHEN 'd
2b970 27 20 54 48 45 4e 20 30 5c 6e 22 0a 20 20 20 20  ' THEN 0\n".    
2b980 20 22 20 20 20 20 20 20 45 4c 53 45 20 2d 31 20   "      ELSE -1 
2b990 45 4e 44 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20  END,\n".     "  
2b9a0 20 20 73 71 6c 61 72 5f 63 6f 6d 70 72 65 73 73    sqlar_compress
2b9b0 28 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22  (data)\n".     "
2b9c0 20 20 46 52 4f 4d 20 66 73 64 69 72 28 25 51 2c    FROM fsdir(%Q,
2b9d0 25 51 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 57  %Q)\n".     "  W
2b9e0 48 45 52 45 20 6c 73 6d 6f 64 65 28 6d 6f 64 65  HERE lsmode(mode
2b9f0 29 20 4e 4f 54 20 4c 49 4b 45 20 27 3f 25 25 27  ) NOT LIKE '?%%'
2ba00 3b 22 2c 0a 20 20 20 20 20 22 52 45 50 4c 41 43  ;",.     "REPLAC
2ba10 45 20 49 4e 54 4f 20 25 73 28 6e 61 6d 65 2c 6d  E INTO %s(name,m
2ba20 6f 64 65 2c 6d 74 69 6d 65 2c 64 61 74 61 29 5c  ode,mtime,data)\
2ba30 6e 22 0a 20 20 20 20 20 22 20 20 53 45 4c 45 43  n".     "  SELEC
2ba40 54 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 25  T\n".     "    %
2ba50 73 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  s,\n".     "    
2ba60 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20  mode,\n".     " 
2ba70 20 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a 20 20 20     mtime,\n".   
2ba80 20 20 22 20 20 20 20 64 61 74 61 5c 6e 22 0a 20    "    data\n". 
2ba90 20 20 20 20 22 20 20 46 52 4f 4d 20 66 73 64 69      "  FROM fsdi
2baa0 72 28 25 51 2c 25 51 29 5c 6e 22 0a 20 20 20 20  r(%Q,%Q)\n".    
2bab0 20 22 20 20 57 48 45 52 45 20 6c 73 6d 6f 64 65   "  WHERE lsmode
2bac0 28 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20  (mode) NOT LIKE 
2bad0 27 3f 25 25 27 3b 22 0a 20 20 7d 3b 0a 20 20 69  '?%%';".  };.  i
2bae0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
2baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bb00 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20  * For iterating 
2bb10 74 68 72 6f 75 67 68 20 61 7a 46 69 6c 65 5b 5d  through azFile[]
2bb20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
2bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb40 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2bb50 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
2bb60 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20  char *zTab = 0; 
2bb70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
2bb80 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63   table into whic
2bb90 68 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20  h to insert */. 
2bba0 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
2bbb0 68 61 72 20 7a 54 65 6d 70 5b 35 30 5d 3b 0a 0a  har zTemp[50];..
2bbc0 20 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c    arExecSql(pAr,
2bbd0 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69   "PRAGMA page_si
2bbe0 7a 65 3d 35 31 32 22 29 3b 0a 20 20 72 63 20 3d  ze=512");.  rc =
2bbf0 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
2bc00 22 53 41 56 45 50 4f 49 4e 54 20 61 72 3b 22 29  "SAVEPOINT ar;")
2bc10 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2bc20 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
2bc30 63 3b 0a 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20  c;.  zTemp[0] = 
2bc40 30 3b 20 0a 20 20 69 66 28 20 70 41 72 2d 3e 62  0; .  if( pAr->b
2bc50 5a 69 70 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  Zip ){.    /* In
2bc60 69 74 69 61 6c 69 7a 65 20 74 68 65 20 7a 69 70  itialize the zip
2bc70 66 69 6c 65 20 76 69 72 74 75 61 6c 20 74 61 62  file virtual tab
2bc80 6c 65 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  le, if necessary
2bc90 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 41 72 2d   */.    if( pAr-
2bca0 3e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  >zFile ){.      
2bcb0 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72  sqlite3_uint64 r
2bcc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2bcd0 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
2bce0 66 28 72 29 2c 26 72 29 3b 0a 20 20 20 20 20 20  f(r),&r);.      
2bcf0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2bd00 28 73 69 7a 65 6f 66 28 7a 54 65 6d 70 29 2c 7a  (sizeof(zTemp),z
2bd10 54 65 6d 70 2c 22 7a 69 70 25 30 31 36 6c 6c 78  Temp,"zip%016llx
2bd20 22 2c 72 29 3b 0a 20 20 20 20 20 20 7a 54 61 62  ",r);.      zTab
2bd30 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
2bd40 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
2bd50 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
2bd60 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c   "CREATE VIRTUAL
2bd70 20 54 41 42 4c 45 20 74 65 6d 70 2e 25 73 20 55   TABLE temp.%s U
2bd80 53 49 4e 47 20 7a 69 70 66 69 6c 65 28 25 51 29  SING zipfile(%Q)
2bd90 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 54 61 62  ",.         zTab
2bda0 2c 20 70 41 72 2d 3e 7a 46 69 6c 65 0a 20 20 20  , pAr->zFile.   
2bdb0 20 20 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d     );.      rc =
2bdc0 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
2bdd0 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  zSql);.      sql
2bde0 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
2bdf0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2be00 20 20 7a 54 61 62 20 3d 20 22 7a 69 70 22 3b 0a    zTab = "zip";.
2be10 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2be20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
2be30 20 74 68 65 20 74 61 62 6c 65 20 66 6f 72 20 61   the table for a
2be40 6e 20 53 51 4c 41 52 20 2a 2f 0a 20 20 20 20 7a  n SQLAR */.    z
2be50 54 61 62 20 3d 20 22 73 71 6c 61 72 22 3b 0a 20  Tab = "sqlar";. 
2be60 20 20 20 69 66 28 20 62 55 70 64 61 74 65 3d 3d     if( bUpdate==
2be70 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
2be80 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a  arExecSql(pAr, z
2be90 44 72 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  Drop);.      if(
2bea0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2beb0 20 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 74 72 61   goto end_ar_tra
2bec0 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a  nsaction;.    }.
2bed0 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53      rc = arExecS
2bee0 71 6c 28 70 41 72 2c 20 7a 43 72 65 61 74 65 29  ql(pAr, zCreate)
2bef0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
2bf00 20 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26 20   i<pAr->nArg && 
2bf10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
2bf20 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
2bf30 53 71 6c 32 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Sql2 = sqlite3_m
2bf40 70 72 69 6e 74 66 28 7a 49 6e 73 65 72 74 46 6d  printf(zInsertFm
2bf50 74 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 7a 54  t[pAr->bZip], zT
2bf60 61 62 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d  ab,.        pAr-
2bf70 3e 62 56 65 72 62 6f 73 65 20 3f 20 22 73 68 65  >bVerbose ? "she
2bf80 6c 6c 5f 70 75 74 73 6e 6c 28 6e 61 6d 65 29 22  ll_putsnl(name)"
2bf90 20 3a 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 20   : "name",.     
2bfa0 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d     pAr->azArg[i]
2bfb0 2c 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20 20  , pAr->zDir);.  
2bfc0 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c    rc = arExecSql
2bfd0 28 70 41 72 2c 20 7a 53 71 6c 32 29 3b 0a 20 20  (pAr, zSql2);.  
2bfe0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2bff0 53 71 6c 32 29 3b 0a 20 20 7d 0a 65 6e 64 5f 61  Sql2);.  }.end_a
2c000 72 5f 74 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20  r_transaction:. 
2c010 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c020 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
2c030 33 5f 65 78 65 63 28 70 41 72 2d 3e 64 62 2c 20  3_exec(pAr->db, 
2c040 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 72 3b  "ROLLBACK TO ar;
2c050 20 52 45 4c 45 41 53 45 20 61 72 3b 22 2c 20 30   RELEASE ar;", 0
2c060 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 0);.  }else
2c070 7b 0a 20 20 20 20 72 63 20 3d 20 61 72 45 78 65  {.    rc = arExe
2c080 63 53 71 6c 28 70 41 72 2c 20 22 52 45 4c 45 41  cSql(pAr, "RELEA
2c090 53 45 20 61 72 3b 22 29 3b 0a 20 20 20 20 69 66  SE ar;");.    if
2c0a0 28 20 70 41 72 2d 3e 62 5a 69 70 20 26 26 20 70  ( pAr->bZip && p
2c0b0 41 72 2d 3e 7a 46 69 6c 65 20 29 7b 0a 20 20 20  Ar->zFile ){.   
2c0c0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
2c0d0 33 5f 6d 70 72 69 6e 74 66 28 22 44 52 4f 50 20  3_mprintf("DROP 
2c0e0 54 41 42 4c 45 20 25 73 22 2c 20 7a 54 65 6d 70  TABLE %s", zTemp
2c0f0 29 3b 0a 20 20 20 20 20 20 61 72 45 78 65 63 53  );.      arExecS
2c100 71 6c 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a 20  ql(pAr, zSql);. 
2c110 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2c120 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20  e(zSql);.    }. 
2c130 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2c140 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2c150 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 61 72 22  ntation of ".ar"
2c160 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   dot command..*/
2c170 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 44 6f  .static int arDo
2c180 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c  tCommand(.  Shel
2c190 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20  lState *pState, 
2c1a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2c1b0 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f  urrent shell too
2c1c0 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74  l state */.  int
2c1d0 20 66 72 6f 6d 43 6d 64 4c 69 6e 65 2c 20 20 20   fromCmdLine,   
2c1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c1f0 54 72 75 65 20 69 66 20 2d 41 20 63 6f 6d 6d 61  True if -A comma
2c200 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2c 20  nd-line option, 
2c210 6e 6f 74 20 2e 61 72 20 63 6d 64 20 2a 2f 0a 20  not .ar cmd */. 
2c220 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
2c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c240 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67   /* Array of arg
2c250 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
2c260 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a   dot command */.
2c270 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20    int nArg      
2c280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c290 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
2c2a0 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b  ntries in azArg[
2c2b0 5d 20 2a 2f 0a 29 7b 0a 20 20 41 72 43 6f 6d 6d  ] */.){.  ArComm
2c2c0 61 6e 64 20 63 6d 64 3b 0a 20 20 69 6e 74 20 72  and cmd;.  int r
2c2d0 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6d 64  c;.  memset(&cmd
2c2e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29  , 0, sizeof(cmd)
2c2f0 29 3b 0a 20 20 63 6d 64 2e 66 72 6f 6d 43 6d 64  );.  cmd.fromCmd
2c300 4c 69 6e 65 20 3d 20 66 72 6f 6d 43 6d 64 4c 69  Line = fromCmdLi
2c310 6e 65 3b 0a 20 20 72 63 20 3d 20 61 72 50 61 72  ne;.  rc = arPar
2c320 73 65 43 6f 6d 6d 61 6e 64 28 61 7a 41 72 67 2c  seCommand(azArg,
2c330 20 6e 41 72 67 2c 20 26 63 6d 64 29 3b 0a 20 20   nArg, &cmd);.  
2c340 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2c350 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 44 62  K ){.    int eDb
2c360 54 79 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45  Type = SHELL_OPE
2c370 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 20 20 63 6d  N_UNSPEC;.    cm
2c380 64 2e 70 20 3d 20 70 53 74 61 74 65 3b 0a 20 20  d.p = pState;.  
2c390 20 20 63 6d 64 2e 64 62 20 3d 20 70 53 74 61 74    cmd.db = pStat
2c3a0 65 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 63  e->db;.    if( c
2c3b0 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20  md.zFile ){.    
2c3c0 20 20 65 44 62 54 79 70 65 20 3d 20 64 65 64 75    eDbType = dedu
2c3d0 63 65 44 61 74 61 62 61 73 65 54 79 70 65 28 63  ceDatabaseType(c
2c3e0 6d 64 2e 7a 46 69 6c 65 2c 20 31 29 3b 0a 20 20  md.zFile, 1);.  
2c3f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65    }else{.      e
2c400 44 62 54 79 70 65 20 3d 20 70 53 74 61 74 65 2d  DbType = pState-
2c410 3e 6f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 7d  >openMode;.    }
2c420 0a 20 20 20 20 69 66 28 20 65 44 62 54 79 70 65  .    if( eDbType
2c430 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50  ==SHELL_OPEN_ZIP
2c440 46 49 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66  FILE ){.      if
2c450 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43  ( cmd.eCmd==AR_C
2c460 4d 44 5f 45 58 54 52 41 43 54 20 7c 7c 20 63 6d  MD_EXTRACT || cm
2c470 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 4c  d.eCmd==AR_CMD_L
2c480 49 53 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  IST ){.        i
2c490 66 28 20 63 6d 64 2e 7a 46 69 6c 65 3d 3d 30 20  f( cmd.zFile==0 
2c4a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64  ){.          cmd
2c4b0 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c  .zSrcTable = sql
2c4c0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69  ite3_mprintf("zi
2c4d0 70 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  p");.        }el
2c4e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6d  se{.          cm
2c4f0 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71  d.zSrcTable = sq
2c500 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a  lite3_mprintf("z
2c510 69 70 66 69 6c 65 28 25 51 29 22 2c 20 63 6d 64  ipfile(%Q)", cmd
2c520 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  .zFile);.       
2c530 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2c540 20 63 6d 64 2e 62 5a 69 70 20 3d 20 31 3b 0a 20   cmd.bZip = 1;. 
2c550 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6d 64     }else if( cmd
2c560 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  .zFile ){.      
2c570 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 20 20 20  int flags;.     
2c580 20 69 66 28 20 63 6d 64 2e 62 41 70 70 65 6e 64   if( cmd.bAppend
2c590 20 29 20 65 44 62 54 79 70 65 20 3d 20 53 48 45   ) eDbType = SHE
2c5a0 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46  LL_OPEN_APPENDVF
2c5b0 53 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64  S;.      if( cmd
2c5c0 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43 52  .eCmd==AR_CMD_CR
2c5d0 45 41 54 45 20 7c 7c 20 63 6d 64 2e 65 43 6d 64  EATE || cmd.eCmd
2c5e0 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 20  ==AR_CMD_UPDATE 
2c5f0 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
2c600 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
2c610 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
2c620 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20  OPEN_CREATE;.   
2c630 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c640 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45    flags = SQLITE
2c650 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
2c660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d        }.      cm
2c670 64 2e 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  d.db = 0;.      
2c680 69 66 28 20 63 6d 64 2e 62 44 72 79 52 75 6e 20  if( cmd.bDryRun 
2c690 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
2c6a0 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f  printf(pState->o
2c6b0 75 74 2c 20 22 2d 2d 20 6f 70 65 6e 20 64 61 74  ut, "-- open dat
2c6c0 61 62 61 73 65 20 27 25 73 27 25 73 5c 6e 22 2c  abase '%s'%s\n",
2c6d0 20 63 6d 64 2e 7a 46 69 6c 65 2c 0a 20 20 20 20   cmd.zFile,.    
2c6e0 20 20 20 20 20 20 20 20 20 65 44 62 54 79 70 65           eDbType
2c6f0 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50  ==SHELL_OPEN_APP
2c700 45 4e 44 56 46 53 20 3f 20 22 20 75 73 69 6e 67  ENDVFS ? " using
2c710 20 27 61 70 6e 64 76 66 73 27 22 20 3a 20 22 22   'apndvfs'" : ""
2c720 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2c730 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
2c740 65 6e 5f 76 32 28 63 6d 64 2e 7a 46 69 6c 65 2c  en_v2(cmd.zFile,
2c750 20 26 63 6d 64 2e 64 62 2c 20 66 6c 61 67 73 2c   &cmd.db, flags,
2c760 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 65   .             e
2c770 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50  DbType==SHELL_OP
2c780 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 3f 20 22  EN_APPENDVFS ? "
2c790 61 70 6e 64 76 66 73 22 20 3a 20 30 29 3b 0a 20  apndvfs" : 0);. 
2c7a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2c7b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c7c0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2c7d0 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20 6f 70  derr, "cannot op
2c7e0 65 6e 20 66 69 6c 65 3a 20 25 73 20 28 25 73 29  en file: %s (%s)
2c7f0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
2c800 20 20 63 6d 64 2e 7a 46 69 6c 65 2c 20 73 71 6c    cmd.zFile, sql
2c810 69 74 65 33 5f 65 72 72 6d 73 67 28 63 6d 64 2e  ite3_errmsg(cmd.
2c820 64 62 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  db).        );. 
2c830 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2c840 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20 20 20  ar_command;.    
2c850 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2c860 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28 63 6d  3_fileio_init(cm
2c870 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  d.db, 0, 0);.   
2c880 20 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61 72     sqlite3_sqlar
2c890 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20 30 2c  _init(cmd.db, 0,
2c8a0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
2c8b0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
2c8c0 6f 6e 28 63 6d 64 2e 64 62 2c 20 22 73 68 65 6c  on(cmd.db, "shel
2c8d0 6c 5f 70 75 74 73 6e 6c 22 2c 20 31 2c 20 53 51  l_putsnl", 1, SQ
2c8e0 4c 49 54 45 5f 55 54 46 38 2c 20 63 6d 64 2e 70  LITE_UTF8, cmd.p
2c8f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2c900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c910 73 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c 20 30  shellPutsFunc, 0
2c920 2c 20 30 29 3b 0a 0a 20 20 20 20 7d 0a 20 20 20  , 0);..    }.   
2c930 20 69 66 28 20 63 6d 64 2e 7a 53 72 63 54 61 62   if( cmd.zSrcTab
2c940 6c 65 3d 3d 30 20 26 26 20 63 6d 64 2e 62 5a 69  le==0 && cmd.bZi
2c950 70 3d 3d 30 20 26 26 20 63 6d 64 2e 65 43 6d 64  p==0 && cmd.eCmd
2c960 21 3d 41 52 5f 43 4d 44 5f 48 45 4c 50 20 29 7b  !=AR_CMD_HELP ){
2c970 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65  .      if( cmd.e
2c980 43 6d 64 21 3d 41 52 5f 43 4d 44 5f 43 52 45 41  Cmd!=AR_CMD_CREA
2c990 54 45 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  TE.       && sql
2c9a0 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
2c9b0 6e 5f 6d 65 74 61 64 61 74 61 28 63 6d 64 2e 64  n_metadata(cmd.d
2c9c0 62 2c 30 2c 22 73 71 6c 61 72 22 2c 22 6e 61 6d  b,0,"sqlar","nam
2c9d0 65 22 2c 30 2c 30 2c 30 2c 30 2c 30 29 0a 20 20  e",0,0,0,0,0).  
2c9e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 75      ){.        u
2c9f0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2ca00 72 2c 20 22 64 61 74 61 62 61 73 65 20 64 6f 65  r, "database doe
2ca10 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
2ca20 20 27 73 71 6c 61 72 27 20 74 61 62 6c 65 5c 6e   'sqlar' table\n
2ca30 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
2ca40 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2ca50 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2ca60 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20 20 20  ar_command;.    
2ca70 20 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e 7a 53    }.      cmd.zS
2ca80 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  rcTable = sqlite
2ca90 33 5f 6d 70 72 69 6e 74 66 28 22 73 71 6c 61 72  3_mprintf("sqlar
2caa0 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  ");.    }..    s
2cab0 77 69 74 63 68 28 20 63 6d 64 2e 65 43 6d 64 20  witch( cmd.eCmd 
2cac0 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 41 52  ){.      case AR
2cad0 5f 43 4d 44 5f 43 52 45 41 54 45 3a 0a 20 20 20  _CMD_CREATE:.   
2cae0 20 20 20 20 20 72 63 20 3d 20 61 72 43 72 65 61       rc = arCrea
2caf0 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e  teOrUpdateComman
2cb00 64 28 26 63 6d 64 2c 20 30 29 3b 0a 20 20 20 20  d(&cmd, 0);.    
2cb10 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
2cb20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 45 58    case AR_CMD_EX
2cb30 54 52 41 43 54 3a 0a 20 20 20 20 20 20 20 20 72  TRACT:.        r
2cb40 63 20 3d 20 61 72 45 78 74 72 61 63 74 43 6f 6d  c = arExtractCom
2cb50 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20 20 20  mand(&cmd);.    
2cb60 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
2cb70 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c 49    case AR_CMD_LI
2cb80 53 54 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ST:.        rc =
2cb90 20 61 72 4c 69 73 74 43 6f 6d 6d 61 6e 64 28 26   arListCommand(&
2cba0 63 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72  cmd);.        br
2cbb0 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
2cbc0 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20   AR_CMD_HELP:.  
2cbd0 20 20 20 20 20 20 61 72 55 73 61 67 65 28 70 53        arUsage(pS
2cbe0 74 61 74 65 2d 3e 6f 75 74 29 3b 0a 20 20 20 20  tate->out);.    
2cbf0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
2cc00 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
2cc10 20 20 20 61 73 73 65 72 74 28 20 63 6d 64 2e 65     assert( cmd.e
2cc20 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41  Cmd==AR_CMD_UPDA
2cc30 54 45 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  TE );.        rc
2cc40 20 3d 20 61 72 43 72 65 61 74 65 4f 72 55 70 64   = arCreateOrUpd
2cc50 61 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c  ateCommand(&cmd,
2cc60 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   1);.        bre
2cc70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65 6e  ak;.    }.  }.en
2cc80 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3a 0a 20 20  d_ar_command:.  
2cc90 69 66 28 20 63 6d 64 2e 64 62 21 3d 70 53 74 61  if( cmd.db!=pSta
2cca0 74 65 2d 3e 64 62 20 29 7b 0a 20 20 20 20 63 6c  te->db ){.    cl
2ccb0 6f 73 65 5f 64 62 28 63 6d 64 2e 64 62 29 3b 0a  ose_db(cmd.db);.
2ccc0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
2ccd0 65 65 28 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65  ee(cmd.zSrcTable
2cce0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
2ccf0 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  .}./* End of the
2cd00 20 22 2e 61 72 63 68 69 76 65 22 20 6f 72 20 22   ".archive" or "
2cd10 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 20 6c 6f 67  .ar" command log
2cd20 69 63 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ic.*************
2cd30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cd40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cd50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cd60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cd70 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  *****/.#endif /*
2cd80 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2cd90 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2cda0 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  LE) && defined(S
2cdb0 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29  QLITE_HAVE_ZLIB)
2cdc0 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61   */.../*.** If a
2cdd0 6e 20 69 6e 70 75 74 20 6c 69 6e 65 20 62 65 67  n input line beg
2cde0 69 6e 73 20 77 69 74 68 20 22 2e 22 20 74 68 65  ins with "." the
2cdf0 6e 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  n invoke this ro
2ce00 75 74 69 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63  utine to.** proc
2ce10 65 73 73 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a  ess that line..*
2ce20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e  *.** Return 1 on
2ce30 20 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69   error, 2 to exi
2ce40 74 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69  t, and 0 otherwi
2ce50 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
2ce60 74 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e  t do_meta_comman
2ce70 64 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 53  d(char *zLine, S
2ce80 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
2ce90 20 69 6e 74 20 68 20 3d 20 31 3b 0a 20 20 69 6e   int h = 1;.  in
2cea0 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e  t nArg = 0;.  in
2ceb0 74 20 6e 2c 20 63 3b 0a 20 20 69 6e 74 20 72 63  t n, c;.  int rc
2cec0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 61 7a   = 0;.  char *az
2ced0 41 72 67 5b 35 30 5d 3b 0a 0a 23 69 66 6e 64 65  Arg[50];..#ifnde
2cee0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2cef0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
2cf00 20 70 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65   p->expert.pExpe
2cf10 72 74 20 29 7b 0a 20 20 20 20 65 78 70 65 72 74  rt ){.    expert
2cf20 46 69 6e 69 73 68 28 70 2c 20 31 2c 20 30 29 3b  Finish(p, 1, 0);
2cf30 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2cf40 2a 20 50 61 72 73 65 20 74 68 65 20 69 6e 70 75  * Parse the inpu
2cf50 74 20 6c 69 6e 65 20 69 6e 74 6f 20 74 6f 6b 65  t line into toke
2cf60 6e 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ns..  */.  while
2cf70 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 6e 41  ( zLine[h] && nA
2cf80 72 67 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 41  rg<ArraySize(azA
2cf90 72 67 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  rg) ){.    while
2cfa0 28 20 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b  ( IsSpace(zLine[
2cfb0 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20  h]) ){ h++; }.  
2cfc0 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d    if( zLine[h]==
2cfd0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
2cfe0 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 27  f( zLine[h]=='\'
2cff0 27 20 7c 7c 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27  ' || zLine[h]=='
2d000 22 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  "' ){.      int 
2d010 64 65 6c 69 6d 20 3d 20 7a 4c 69 6e 65 5b 68 2b  delim = zLine[h+
2d020 2b 5d 3b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b  +];.      azArg[
2d030 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65  nArg++] = &zLine
2d040 5b 68 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  [h];.      while
2d050 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 7a 4c  ( zLine[h] && zL
2d060 69 6e 65 5b 68 5d 21 3d 64 65 6c 69 6d 20 29 7b  ine[h]!=delim ){
2d070 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69  .        if( zLi
2d080 6e 65 5b 68 5d 3d 3d 27 5c 5c 27 20 26 26 20 64  ne[h]=='\\' && d
2d090 65 6c 69 6d 3d 3d 27 22 27 20 26 26 20 7a 4c 69  elim=='"' && zLi
2d0a0 6e 65 5b 68 2b 31 5d 21 3d 30 20 29 20 68 2b 2b  ne[h+1]!=0 ) h++
2d0b0 3b 0a 20 20 20 20 20 20 20 20 68 2b 2b 3b 0a 20  ;.        h++;. 
2d0c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2d0d0 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 64 65 6c 69 6d   zLine[h]==delim
2d0e0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e   ){.        zLin
2d0f0 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20  e[h++] = 0;.    
2d100 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65    }.      if( de
2d110 6c 69 6d 3d 3d 27 22 27 20 29 20 72 65 73 6f 6c  lim=='"' ) resol
2d120 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61  ve_backslashes(a
2d130 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20  zArg[nArg-1]);. 
2d140 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d150 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20  azArg[nArg++] = 
2d160 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20  &zLine[h];.     
2d170 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d   while( zLine[h]
2d180 20 26 26 20 21 49 73 53 70 61 63 65 28 7a 4c 69   && !IsSpace(zLi
2d190 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d  ne[h]) ){ h++; }
2d1a0 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65  .      if( zLine
2d1b0 5b 68 5d 20 29 20 7a 4c 69 6e 65 5b 68 2b 2b 5d  [h] ) zLine[h++]
2d1c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 73 6f   = 0;.      reso
2d1d0 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28  lve_backslashes(
2d1e0 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a  azArg[nArg-1]);.
2d1f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2d200 50 72 6f 63 65 73 73 20 74 68 65 20 69 6e 70 75  Process the inpu
2d210 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  t line..  */.  i
2d220 66 28 20 6e 41 72 67 3d 3d 30 20 29 20 72 65 74  f( nArg==0 ) ret
2d230 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 74 6f 6b  urn 0; /* no tok
2d240 65 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f  ens, no error */
2d250 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28  .  n = strlen30(
2d260 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 63 20 3d  azArg[0]);.  c =
2d270 20 61 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20   azArg[0][0];.  
2d280 63 6c 65 61 72 54 65 6d 70 46 69 6c 65 28 70 29  clearTempFile(p)
2d290 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
2d2a0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
2d2b0 54 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 61  TION.  if( c=='a
2d2c0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2d2d0 72 67 5b 30 5d 2c 20 22 61 75 74 68 22 2c 20 6e  rg[0], "auth", n
2d2e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
2d2f0 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20  nArg!=2 ){.     
2d300 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2d310 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 61 75 74  rr, "Usage: .aut
2d320 68 20 4f 4e 7c 4f 46 46 5c 6e 22 29 3b 0a 20 20  h ON|OFF\n");.  
2d330 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2d340 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2d350 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
2d360 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
2d370 29 3b 0a 20 20 20 20 69 66 28 20 62 6f 6f 6c 65  );.    if( boole
2d380 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
2d390 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
2d3a0 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
2d3b0 72 28 70 2d 3e 64 62 2c 20 73 68 65 6c 6c 41 75  r(p->db, shellAu
2d3c0 74 68 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73  th, p);.    }els
2d3d0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2d3e0 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28  _set_authorizer(
2d3f0 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  p->db, 0, 0);.  
2d400 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
2d410 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
2d420 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
2d430 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
2d440 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56  fined(SQLITE_HAV
2d450 45 5f 5a 4c 49 42 29 0a 20 20 69 66 28 20 63 3d  E_ZLIB).  if( c=
2d460 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='a' && strncmp(
2d470 61 7a 41 72 67 5b 30 5d 2c 20 22 61 72 63 68 69  azArg[0], "archi
2d480 76 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ve", n)==0 ){.  
2d490 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
2d4a0 0a 20 20 20 20 72 63 20 3d 20 61 72 44 6f 74 43  .    rc = arDotC
2d4b0 6f 6d 6d 61 6e 64 28 70 2c 20 30 2c 20 61 7a 41  ommand(p, 0, azA
2d4c0 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c  rg, nArg);.  }el
2d4d0 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  se.#endif..  if(
2d4e0 20 28 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33   (c=='b' && n>=3
2d4f0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2d500 67 5b 30 5d 2c 20 22 62 61 63 6b 75 70 22 2c 20  g[0], "backup", 
2d510 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 63 3d  n)==0).   || (c=
2d520 3d 27 73 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='s' && n>=3 && 
2d530 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2d540 2c 20 22 73 61 76 65 22 2c 20 6e 29 3d 3d 30 29  , "save", n)==0)
2d550 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  .  ){.    const 
2d560 63 68 61 72 20 2a 7a 44 65 73 74 46 69 6c 65 20  char *zDestFile 
2d570 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
2d580 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20  har *zDb = 0;.  
2d590 20 20 73 71 6c 69 74 65 33 20 2a 70 44 65 73 74    sqlite3 *pDest
2d5a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61  ;.    sqlite3_ba
2d5b0 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20  ckup *pBackup;. 
2d5c0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 69 6e     int j;.    in
2d5d0 74 20 62 41 73 79 6e 63 20 3d 20 30 3b 0a 20 20  t bAsync = 0;.  
2d5e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
2d5f0 66 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  fs = 0;.    for(
2d600 6a 3d 31 3b 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b  j=1; j<nArg; j++
2d610 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
2d620 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 6a  har *z = azArg[j
2d630 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30  ];.      if( z[0
2d640 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
2d650 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20    if( z[1]=='-' 
2d660 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  ) z++;.        i
2d670 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 61  f( strcmp(z, "-a
2d680 70 70 65 6e 64 22 29 3d 3d 30 20 29 7b 0a 20 20  ppend")==0 ){.  
2d690 20 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20 22          zVfs = "
2d6a0 61 70 6e 64 76 66 73 22 3b 0a 20 20 20 20 20 20  apndvfs";.      
2d6b0 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20    }else.        
2d6c0 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d  if( strcmp(z, "-
2d6d0 61 73 79 6e 63 22 29 3d 3d 30 20 29 7b 0a 20 20  async")==0 ){.  
2d6e0 20 20 20 20 20 20 20 20 62 41 73 79 6e 63 20 3d          bAsync =
2d6f0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
2d700 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  e.        {.    
2d710 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2d720 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f  f(stderr, "unkno
2d730 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22  wn option: %s\n"
2d740 2c 20 61 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 20  , azArg[j]);.   
2d750 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2d760 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d770 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 65 73 74   }else if( zDest
2d780 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
2d790 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 61     zDestFile = a
2d7a0 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d  zArg[j];.      }
2d7b0 65 6c 73 65 20 69 66 28 20 7a 44 62 3d 3d 30 20  else if( zDb==0 
2d7c0 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 62 20 3d  ){.        zDb =
2d7d0 20 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20 20 20   zDestFile;.    
2d7e0 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20      zDestFile = 
2d7f0 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20  azArg[j];.      
2d800 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
2d810 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2d820 2c 20 22 55 73 61 67 65 3a 20 2e 62 61 63 6b 75  , "Usage: .backu
2d830 70 20 3f 44 42 3f 20 3f 4f 50 54 49 4f 4e 53 3f  p ?DB? ?OPTIONS?
2d840 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20   FILENAME\n");. 
2d850 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2d860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2d870 20 20 20 69 66 28 20 7a 44 65 73 74 46 69 6c 65     if( zDestFile
2d880 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
2d890 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2d8a0 22 6d 69 73 73 69 6e 67 20 46 49 4c 45 4e 41 4d  "missing FILENAM
2d8b0 45 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 2e 62  E argument on .b
2d8c0 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20 20 20 20  ackup\n");.     
2d8d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2d8e0 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20  .    if( zDb==0 
2d8f0 29 20 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a  ) zDb = "main";.
2d900 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2d910 5f 6f 70 65 6e 5f 76 32 28 7a 44 65 73 74 46 69  _open_v2(zDestFi
2d920 6c 65 2c 20 26 70 44 65 73 74 2c 20 0a 20 20 20  le, &pDest, .   
2d930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2d940 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
2d950 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
2d960 5f 43 52 45 41 54 45 2c 20 7a 56 66 73 29 3b 0a  _CREATE, zVfs);.
2d970 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2d980 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
2d990 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2d9a0 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
2d9b0 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
2d9c0 2c 20 7a 44 65 73 74 46 69 6c 65 29 3b 0a 20 20  , zDestFile);.  
2d9d0 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 44 65      close_db(pDe
2d9e0 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
2d9f0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
2da00 66 28 20 62 41 73 79 6e 63 20 29 7b 0a 20 20 20  f( bAsync ){.   
2da10 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
2da20 70 44 65 73 74 2c 20 22 50 52 41 47 4d 41 20 73  pDest, "PRAGMA s
2da30 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 20  ynchronous=OFF; 
2da40 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
2da50 6f 64 65 3d 4f 46 46 3b 22 2c 0a 20 20 20 20 20  ode=OFF;",.     
2da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
2da70 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
2da80 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
2da90 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73  .    pBackup = s
2daa0 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e  qlite3_backup_in
2dab0 69 74 28 70 44 65 73 74 2c 20 22 6d 61 69 6e 22  it(pDest, "main"
2dac0 2c 20 70 2d 3e 64 62 2c 20 7a 44 62 29 3b 0a 20  , p->db, zDb);. 
2dad0 20 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d     if( pBackup==
2dae0 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  0 ){.      utf8_
2daf0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2db00 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
2db10 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
2db20 73 74 29 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  st));.      clos
2db30 65 5f 64 62 28 70 44 65 73 74 29 3b 0a 20 20 20  e_db(pDest);.   
2db40 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2db50 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28   }.    while(  (
2db60 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  rc = sqlite3_bac
2db70 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70  kup_step(pBackup
2db80 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  ,100))==SQLITE_O
2db90 4b 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65  K ){}.    sqlite
2dba0 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28  3_backup_finish(
2dbb0 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66  pBackup);.    if
2dbc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
2dbd0 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E ){.      rc = 
2dbe0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
2dbf0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2dc00 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2dc10 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
2dc20 72 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20  rrmsg(pDest));. 
2dc30 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2dc40 20 7d 0a 20 20 20 20 63 6c 6f 73 65 5f 64 62 28   }.    close_db(
2dc50 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  pDest);.  }else.
2dc60 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26  .  if( c=='b' &&
2dc70 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
2dc80 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 69 6c  (azArg[0], "bail
2dc90 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2dca0 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
2dcb0 20 20 20 20 20 62 61 69 6c 5f 6f 6e 5f 65 72 72       bail_on_err
2dcc0 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  or = booleanValu
2dcd0 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
2dce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
2dcf0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2dd00 20 22 55 73 61 67 65 3a 20 2e 62 61 69 6c 20 6f   "Usage: .bail o
2dd10 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20  n|off\n");.     
2dd20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
2dd30 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2dd40 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='b' && n>=3 && 
2dd50 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2dd60 2c 20 22 62 69 6e 61 72 79 22 2c 20 6e 29 3d 3d  , "binary", n)==
2dd70 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
2dd80 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  g==2 ){.      if
2dd90 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  ( booleanValue(a
2dda0 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20  zArg[1]) ){.    
2ddb0 20 20 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64      setBinaryMod
2ddc0 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20  e(p->out, 1);.  
2ddd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2dde0 20 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 70     setTextMode(p
2ddf0 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20  ->out, 1);.     
2de00 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2de10 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2de20 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2de30 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 5c 6e 22  binary on|off\n"
2de40 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2de50 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
2de60 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20    if( c=='c' && 
2de70 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  strcmp(azArg[0],
2de80 22 63 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  "cd")==0 ){.    
2de90 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 23  if( nArg==2 ){.#
2dea0 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
2deb0 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
2dec0 4e 33 32 29 0a 20 20 20 20 20 20 77 63 68 61 72  N32).      wchar
2ded0 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  _t *z = sqlite3_
2dee0 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e  win32_utf8_to_un
2def0 69 63 6f 64 65 28 61 7a 41 72 67 5b 31 5d 29 3b  icode(azArg[1]);
2df00 0a 20 20 20 20 20 20 72 63 20 3d 20 21 53 65 74  .      rc = !Set
2df10 43 75 72 72 65 6e 74 44 69 72 65 63 74 6f 72 79  CurrentDirectory
2df20 57 28 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  W(z);.      sqli
2df30 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c  te3_free(z);.#el
2df40 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 63 68  se.      rc = ch
2df50 64 69 72 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23  dir(azArg[1]);.#
2df60 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
2df70 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  rc ){.        ut
2df80 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2df90 2c 20 22 43 61 6e 6e 6f 74 20 63 68 61 6e 67 65  , "Cannot change
2dfa0 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20 5c 22   to directory \"
2dfb0 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31  %s\"\n", azArg[1
2dfc0 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ]);.        rc =
2dfd0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2dfe0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
2dff0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2e000 22 55 73 61 67 65 3a 20 2e 63 64 20 44 49 52 45  "Usage: .cd DIRE
2e010 43 54 4f 52 59 5c 6e 22 29 3b 0a 20 20 20 20 20  CTORY\n");.     
2e020 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
2e030 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65   }else..  /* The
2e040 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 22 2e   undocumented ".
2e050 62 72 65 61 6b 70 6f 69 6e 74 22 20 63 6f 6d 6d  breakpoint" comm
2e060 61 6e 64 20 63 61 75 73 65 73 20 61 20 63 61 6c  and causes a cal
2e070 6c 20 74 6f 20 74 68 65 20 6e 6f 2d 6f 70 0a 20  l to the no-op. 
2e080 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6e 61 6d 65   ** routine name
2e090 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e  d test_breakpoin
2e0a0 74 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  t()..  */.  if( 
2e0b0 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26  c=='b' && n>=3 &
2e0c0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2e0d0 30 5d 2c 20 22 62 72 65 61 6b 70 6f 69 6e 74 22  0], "breakpoint"
2e0e0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74  , n)==0 ){.    t
2e0f0 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29  est_breakpoint()
2e100 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
2e110 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20   c=='c' && n>=3 
2e120 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2e130 5b 30 5d 2c 20 22 63 68 61 6e 67 65 73 22 2c 20  [0], "changes", 
2e140 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
2e150 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
2e160 20 20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67    setOrClearFlag
2e170 28 70 2c 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43  (p, SHFLG_CountC
2e180 68 61 6e 67 65 73 2c 20 61 7a 41 72 67 5b 31 5d  hanges, azArg[1]
2e190 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2e1a0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2e1b0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2e1c0 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 5c 6e  changes on|off\n
2e1d0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
2e1e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2e1f0 0a 20 20 2f 2a 20 43 61 6e 63 65 6c 20 6f 75 74  .  /* Cancel out
2e200 70 75 74 20 72 65 64 69 72 65 63 74 69 6f 6e 2c  put redirection,
2e210 20 69 66 20 69 74 20 69 73 20 63 75 72 72 65 6e   if it is curren
2e220 74 6c 79 20 73 65 74 20 28 62 79 20 2e 74 65 73  tly set (by .tes
2e230 74 63 61 73 65 29 0a 20 20 2a 2a 20 54 68 65 6e  tcase).  ** Then
2e240 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
2e250 74 20 6f 66 20 74 68 65 20 74 65 73 74 63 61 73  t of the testcas
2e260 65 2d 6f 75 74 2e 74 78 74 20 66 69 6c 65 20 61  e-out.txt file a
2e270 6e 64 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  nd compare again
2e280 73 74 0a 20 20 2a 2a 20 61 7a 41 72 67 5b 31 5d  st.  ** azArg[1]
2e290 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
2e2a0 64 69 66 66 65 72 65 6e 63 65 73 2c 20 72 65 70  differences, rep
2e2b0 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 61 6e 64  ort an error and
2e2c0 20 65 78 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66   exit..  */.  if
2e2d0 28 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33  ( c=='c' && n>=3
2e2e0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2e2f0 67 5b 30 5d 2c 20 22 63 68 65 63 6b 22 2c 20 6e  g[0], "check", n
2e300 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  )==0 ){.    char
2e310 20 2a 7a 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *zRes = 0;.    
2e320 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b  output_reset(p);
2e330 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32  .    if( nArg!=2
2e340 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2e350 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2e360 61 67 65 3a 20 2e 63 68 65 63 6b 20 47 4c 4f 42  age: .check GLOB
2e370 2d 50 41 54 54 45 52 4e 5c 6e 22 29 3b 0a 20 20  -PATTERN\n");.  
2e380 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 20 20      rc = 2;.    
2e390 7d 65 6c 73 65 20 69 66 28 20 28 7a 52 65 73 20  }else if( (zRes 
2e3a0 3d 20 72 65 61 64 46 69 6c 65 28 22 74 65 73 74  = readFile("test
2e3b0 63 61 73 65 2d 6f 75 74 2e 74 78 74 22 2c 20 30  case-out.txt", 0
2e3c0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ))==0 ){.      r
2e3d0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2e3e0 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  , "Error: cannot
2e3f0 20 72 65 61 64 20 27 74 65 73 74 63 61 73 65 2d   read 'testcase-
2e400 6f 75 74 2e 74 78 74 27 5c 6e 22 29 3b 0a 20 20  out.txt'\n");.  
2e410 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 20 20      rc = 2;.    
2e420 7d 65 6c 73 65 20 69 66 28 20 74 65 73 74 63 61  }else if( testca
2e430 73 65 5f 67 6c 6f 62 28 61 7a 41 72 67 5b 31 5d  se_glob(azArg[1]
2e440 2c 7a 52 65 73 29 3d 3d 30 20 29 7b 0a 20 20 20  ,zRes)==0 ){.   
2e450 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2e460 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20  tderr,.         
2e470 20 20 20 20 20 20 20 20 22 74 65 73 74 63 61 73          "testcas
2e480 65 2d 25 73 20 46 41 49 4c 45 44 5c 6e 20 45 78  e-%s FAILED\n Ex
2e490 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c 6e 20 20  pected: [%s]\n  
2e4a0 20 20 20 20 47 6f 74 3a 20 5b 25 73 5d 5c 6e 22      Got: [%s]\n"
2e4b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e4c0 20 20 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c     p->zTestcase,
2e4d0 20 61 7a 41 72 67 5b 31 5d 2c 20 7a 52 65 73 29   azArg[1], zRes)
2e4e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2e4f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e500 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2e510 6f 75 74 2c 20 22 74 65 73 74 63 61 73 65 2d 25  out, "testcase-%
2e520 73 20 6f 6b 5c 6e 22 2c 20 70 2d 3e 7a 54 65 73  s ok\n", p->zTes
2e530 74 63 61 73 65 29 3b 0a 20 20 20 20 20 20 70 2d  tcase);.      p-
2e540 3e 6e 43 68 65 63 6b 2b 2b 3b 0a 20 20 20 20 7d  >nCheck++;.    }
2e550 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2e560 65 28 7a 52 65 73 29 3b 0a 20 20 7d 65 6c 73 65  e(zRes);.  }else
2e570 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26  ..  if( c=='c' &
2e580 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2e590 30 5d 2c 20 22 63 6c 6f 6e 65 22 2c 20 6e 29 3d  0], "clone", n)=
2e5a0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
2e5b0 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 74  rg==2 ){.      t
2e5c0 72 79 54 6f 43 6c 6f 6e 65 28 70 2c 20 61 7a 41  ryToClone(p, azA
2e5d0 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  rg[1]);.    }els
2e5e0 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
2e5f0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2e600 67 65 3a 20 2e 63 6c 6f 6e 65 20 46 49 4c 45 4e  ge: .clone FILEN
2e610 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  AME\n");.      r
2e620 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
2e630 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2e640 64 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74 72  d' && n>1 && str
2e650 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2e660 64 61 74 61 62 61 73 65 73 22 2c 20 6e 29 3d 3d  databases", n)==
2e670 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74  0 ){.    ShellSt
2e680 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68  ate data;.    ch
2e690 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
2e6a0 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
2e6b0 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  0);.    memcpy(&
2e6c0 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28  data, p, sizeof(
2e6d0 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61  data));.    data
2e6e0 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b  .showHeader = 0;
2e6f0 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20  .    data.cMode 
2e700 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f  = data.mode = MO
2e710 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c  DE_List;.    sql
2e720 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2e730 7a 65 6f 66 28 64 61 74 61 2e 63 6f 6c 53 65 70  zeof(data.colSep
2e740 61 72 61 74 6f 72 29 2c 64 61 74 61 2e 63 6f 6c  arator),data.col
2e750 53 65 70 61 72 61 74 6f 72 2c 22 3a 20 22 29 3b  Separator,": ");
2e760 0a 20 20 20 20 64 61 74 61 2e 63 6e 74 20 3d 20  .    data.cnt = 
2e770 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  0;.    sqlite3_e
2e780 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45  xec(p->db, "SELE
2e790 43 54 20 6e 61 6d 65 2c 20 66 69 6c 65 20 46 52  CT name, file FR
2e7a0 4f 4d 20 70 72 61 67 6d 61 5f 64 61 74 61 62 61  OM pragma_databa
2e7b0 73 65 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20 20  se_list",.      
2e7c0 20 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62             callb
2e7d0 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72  ack, &data, &zEr
2e7e0 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a  rMsg);.    if( z
2e7f0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
2e800 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2e810 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  rr,"Error: %s\n"
2e820 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
2e830 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2e840 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72  ErrMsg);.      r
2e850 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
2e860 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2e870 64 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  d' && n>=3 && st
2e880 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2e890 22 64 62 63 6f 6e 66 69 67 22 2c 20 6e 29 3d 3d  "dbconfig", n)==
2e8a0 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
2e8b0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 44 62 43  const struct DbC
2e8c0 6f 6e 66 69 67 43 68 6f 69 63 65 73 20 7b 0a 20  onfigChoices {. 
2e8d0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2e8e0 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e  *zName;.      in
2e8f0 74 20 6f 70 3b 0a 20 20 20 20 7d 20 61 44 62 43  t op;.    } aDbC
2e900 6f 6e 66 69 67 5b 5d 20 3d 20 7b 0a 20 20 20 20  onfig[] = {.    
2e910 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 66 6b      { "enable_fk
2e920 65 79 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45  ey",      SQLITE
2e930 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
2e940 5f 46 4b 45 59 20 20 20 20 20 20 20 20 20 20 20  _FKEY           
2e950 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 65   },.        { "e
2e960 6e 61 62 6c 65 5f 74 72 69 67 67 65 72 22 2c 20  nable_trigger", 
2e970 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
2e980 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52  G_ENABLE_TRIGGER
2e990 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2e9a0 20 20 20 20 7b 20 22 66 74 73 33 5f 74 6f 6b 65      { "fts3_toke
2e9b0 6e 69 7a 65 72 22 2c 20 20 20 53 51 4c 49 54 45  nizer",   SQLITE
2e9c0 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
2e9d0 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 20  _FTS3_TOKENIZER 
2e9e0 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 6c   },.        { "l
2e9f0 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20  oad_extension", 
2ea00 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
2ea10 47 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58  G_ENABLE_LOAD_EX
2ea20 54 45 4e 53 49 4f 4e 20 20 7d 2c 0a 20 20 20 20  TENSION  },.    
2ea30 20 20 20 20 7b 20 22 6e 6f 5f 63 6b 70 74 5f 6f      { "no_ckpt_o
2ea40 6e 5f 63 6c 6f 73 65 22 2c 20 53 51 4c 49 54 45  n_close", SQLITE
2ea50 5f 44 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50  _DBCONFIG_NO_CKP
2ea60 54 5f 4f 4e 5f 43 4c 4f 53 45 20 20 20 20 20 20  T_ON_CLOSE      
2ea70 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 65   },.        { "e
2ea80 6e 61 62 6c 65 5f 71 70 73 67 22 2c 20 20 20 20  nable_qpsg",    
2ea90 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
2eaa0 47 5f 45 4e 41 42 4c 45 5f 51 50 53 47 20 20 20  G_ENABLE_QPSG   
2eab0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2eac0 20 20 20 20 7b 20 22 74 72 69 67 67 65 72 5f 65      { "trigger_e
2ead0 71 70 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45  qp",      SQLITE
2eae0 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45  _DBCONFIG_TRIGGE
2eaf0 52 5f 45 51 50 20 20 20 20 20 20 20 20 20 20 20  R_EQP           
2eb00 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 72   },.        { "r
2eb10 65 73 65 74 5f 64 61 74 61 62 61 73 65 22 2c 20  eset_database", 
2eb20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
2eb30 47 5f 52 45 53 45 54 5f 44 41 54 41 42 41 53 45  G_RESET_DATABASE
2eb40 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2eb50 20 20 20 20 7b 20 22 64 65 66 65 6e 73 69 76 65      { "defensive
2eb60 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ",        SQLITE
2eb70 5f 44 42 43 4f 4e 46 49 47 5f 44 45 46 45 4e 53  _DBCONFIG_DEFENS
2eb80 49 56 45 20 20 20 20 20 20 20 20 20 20 20 20 20  IVE             
2eb90 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69   },.    };.    i
2eba0 6e 74 20 69 69 2c 20 76 3b 0a 20 20 20 20 6f 70  nt ii, v;.    op
2ebb0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2ebc0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 41 72   for(ii=0; ii<Ar
2ebd0 72 61 79 53 69 7a 65 28 61 44 62 43 6f 6e 66 69  raySize(aDbConfi
2ebe0 67 29 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  g); ii++){.     
2ebf0 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20 73   if( nArg>1 && s
2ec00 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20  trcmp(azArg[1], 
2ec10 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e  aDbConfig[ii].zN
2ec20 61 6d 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  ame)!=0 ) contin
2ec30 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41  ue;.      if( nA
2ec40 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  rg>=3 ){.       
2ec50 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
2ec60 69 67 28 70 2d 3e 64 62 2c 20 61 44 62 43 6f 6e  ig(p->db, aDbCon
2ec70 66 69 67 5b 69 69 5d 2e 6f 70 2c 20 62 6f 6f 6c  fig[ii].op, bool
2ec80 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 32  eanValue(azArg[2
2ec90 5d 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ]), 0);.      }.
2eca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
2ecb0 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20 61  _config(p->db, a
2ecc0 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 6f 70 2c  DbConfig[ii].op,
2ecd0 20 2d 31 2c 20 26 76 29 3b 0a 20 20 20 20 20 20   -1, &v);.      
2ece0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
2ecf0 75 74 2c 20 22 25 31 38 73 20 25 73 5c 6e 22 2c  ut, "%18s %s\n",
2ed00 20 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a   aDbConfig[ii].z
2ed10 4e 61 6d 65 2c 20 76 20 3f 20 22 6f 6e 22 20 3a  Name, v ? "on" :
2ed20 20 22 6f 66 66 22 29 3b 0a 20 20 20 20 20 20 69   "off");.      i
2ed30 66 28 20 6e 41 72 67 3e 31 20 29 20 62 72 65 61  f( nArg>1 ) brea
2ed40 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
2ed50 20 6e 41 72 67 3e 31 20 26 26 20 69 69 3d 3d 41   nArg>1 && ii==A
2ed60 72 72 61 79 53 69 7a 65 28 61 44 62 43 6f 6e 66  rraySize(aDbConf
2ed70 69 67 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ig) ){.      utf
2ed80 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2ed90 20 22 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e   "Error: unknown
2eda0 20 64 62 63 6f 6e 66 69 67 20 5c 22 25 73 5c 22   dbconfig \"%s\"
2edb0 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  \n", azArg[1]);.
2edc0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2edd0 66 28 73 74 64 65 72 72 2c 20 22 45 6e 74 65 72  f(stderr, "Enter
2ede0 20 5c 22 2e 64 62 63 6f 6e 66 69 67 5c 22 20 77   \".dbconfig\" w
2edf0 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  ith no arguments
2ee00 20 66 6f 72 20 61 20 6c 69 73 74 5c 6e 22 29 3b   for a list\n");
2ee10 0a 20 20 20 20 7d 20 20 20 0a 20 20 7d 65 6c 73  .    }   .  }els
2ee20 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20  e..  if( c=='d' 
2ee30 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
2ee40 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62  mp(azArg[0], "db
2ee50 69 6e 66 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  info", n)==0 ){.
2ee60 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 64      rc = shell_d
2ee70 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c  binfo_command(p,
2ee80 20 6e 41 72 67 2c 20 61 7a 41 72 67 29 3b 0a 20   nArg, azArg);. 
2ee90 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2eea0 3d 27 64 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='d' && strncmp(
2eeb0 61 7a 41 72 67 5b 30 5d 2c 20 22 64 75 6d 70 22  azArg[0], "dump"
2eec0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
2eed0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65  onst char *zLike
2eee0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b   = 0;.    int i;
2eef0 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64 53 68  .    int savedSh
2ef00 6f 77 48 65 61 64 65 72 20 3d 20 70 2d 3e 73 68  owHeader = p->sh
2ef10 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 69 6e  owHeader;.    in
2ef20 74 20 73 61 76 65 64 53 68 65 6c 6c 46 6c 61 67  t savedShellFlag
2ef30 73 20 3d 20 70 2d 3e 73 68 65 6c 6c 46 6c 67 73  s = p->shellFlgs
2ef40 3b 0a 20 20 20 20 53 68 65 6c 6c 43 6c 65 61 72  ;.    ShellClear
2ef50 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72  Flag(p, SHFLG_Pr
2ef60 65 73 65 72 76 65 52 6f 77 69 64 7c 53 48 46 4c  eserveRowid|SHFL
2ef70 47 5f 4e 65 77 6c 69 6e 65 73 7c 53 48 46 4c 47  G_Newlines|SHFLG
2ef80 5f 45 63 68 6f 29 3b 0a 20 20 20 20 66 6f 72 28  _Echo);.    for(
2ef90 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=1; i<nArg; i++
2efa0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41  ){.      if( azA
2efb0 72 67 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b  rg[i][0]=='-' ){
2efc0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
2efd0 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69  har *z = azArg[i
2efe0 5d 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ]+1;.        if(
2eff0 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b   z[0]=='-' ) z++
2f000 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  ;.        if( st
2f010 72 63 6d 70 28 7a 2c 22 70 72 65 73 65 72 76 65  rcmp(z,"preserve
2f020 2d 72 6f 77 69 64 73 22 29 3d 3d 30 20 29 7b 0a  -rowids")==0 ){.
2f030 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
2f040 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2f050 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
2f060 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 54 68  intf(stderr, "Th
2f070 65 20 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f 77  e --preserve-row
2f080 69 64 73 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f  ids option is no
2f090 74 20 63 6f 6d 70 61 74 69 62 6c 65 22 0a 20 20  t compatible".  
2f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f0b0 20 20 20 20 20 20 20 20 20 20 20 22 20 77 69 74             " wit
2f0c0 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  h SQLITE_OMIT_VI
2f0d0 52 54 55 41 4c 54 41 42 4c 45 5c 6e 22 29 3b 0a  RTUALTABLE\n");.
2f0e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
2f0f0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2f100 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2f110 69 74 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  it;.#else.      
2f120 20 20 20 20 53 68 65 6c 6c 53 65 74 46 6c 61 67      ShellSetFlag
2f130 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73 65 72  (p, SHFLG_Preser
2f140 76 65 52 6f 77 69 64 29 3b 0a 23 65 6e 64 69 66  veRowid);.#endif
2f150 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  .        }else. 
2f160 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
2f170 70 28 7a 2c 22 6e 65 77 6c 69 6e 65 73 22 29 3d  p(z,"newlines")=
2f180 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2f190 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20  ShellSetFlag(p, 
2f1a0 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 3b  SHFLG_Newlines);
2f1b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  .        }else. 
2f1c0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2f1d0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2f1e0 64 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f  derr, "Unknown o
2f1f0 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20  ption \"%s\" on 
2f200 5c 22 2e 64 75 6d 70 5c 22 5c 6e 22 2c 20 61 7a  \".dump\"\n", az
2f210 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
2f220 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2f230 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
2f240 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
2f250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
2f260 73 65 20 69 66 28 20 7a 4c 69 6b 65 20 29 7b 0a  se if( zLike ){.
2f270 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
2f280 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2f290 65 3a 20 2e 64 75 6d 70 20 3f 2d 2d 70 72 65 73  e: .dump ?--pres
2f2a0 65 72 76 65 2d 72 6f 77 69 64 73 3f 20 22 0a 20  erve-rowids? ". 
2f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2c0 20 20 20 20 20 20 20 20 20 20 22 3f 2d 2d 6e 65            "?--ne
2f2d0 77 6c 69 6e 65 73 3f 20 3f 4c 49 4b 45 2d 50 41  wlines? ?LIKE-PA
2f2e0 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20  TTERN?\n");.    
2f2f0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2f300 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
2f310 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
2f320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f330 20 7a 4c 69 6b 65 20 3d 20 61 7a 41 72 67 5b 69   zLike = azArg[i
2f340 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
2f350 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
2f360 30 29 3b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  0);.    /* When 
2f370 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 61 20 22  playing back a "
2f380 64 75 6d 70 22 2c 20 74 68 65 20 63 6f 6e 74 65  dump", the conte
2f390 6e 74 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  nt might appear 
2f3a0 69 6e 20 61 6e 20 6f 72 64 65 72 0a 20 20 20 20  in an order.    
2f3b0 2a 2a 20 77 68 69 63 68 20 63 61 75 73 65 73 20  ** which causes 
2f3c0 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
2f3d0 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
2f3e0 73 20 74 6f 20 62 65 20 76 69 6f 6c 61 74 65 64  s to be violated
2f3f0 2e 0a 20 20 20 20 2a 2a 20 53 6f 20 64 69 73 61  ..    ** So disa
2f400 62 6c 65 20 66 6f 72 65 69 67 6e 2d 6b 65 79 20  ble foreign-key 
2f410 63 6f 6e 73 74 72 61 69 6e 74 20 65 6e 66 6f 72  constraint enfor
2f420 63 65 6d 65 6e 74 20 74 6f 20 70 72 65 76 65 6e  cement to preven
2f430 74 20 70 72 6f 62 6c 65 6d 73 2e 20 2a 2f 0a 20  t problems. */. 
2f440 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
2f450 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 66 6f  >out, "PRAGMA fo
2f460 72 65 69 67 6e 5f 6b 65 79 73 3d 4f 46 46 3b 5c  reign_keys=OFF;\
2f470 6e 22 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  n");.    raw_pri
2f480 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 42 45 47  ntf(p->out, "BEG
2f490 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 5c  IN TRANSACTION;\
2f4a0 6e 22 29 3b 0a 20 20 20 20 70 2d 3e 77 72 69 74  n");.    p->writ
2f4b0 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a  ableSchema = 0;.
2f4c0 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65      p->showHeade
2f4d0 72 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 53 65  r = 0;.    /* Se
2f4e0 74 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  t writable_schem
2f4f0 61 3d 4f 4e 20 73 69 6e 63 65 20 64 6f 69 6e 67  a=ON since doing
2f500 20 73 6f 20 66 6f 72 63 65 73 20 53 51 4c 69 74   so forces SQLit
2f510 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a  e to initialize.
2f520 20 20 20 20 2a 2a 20 61 73 20 6d 75 63 68 20 6f      ** as much o
2f530 66 20 74 68 65 20 73 63 68 65 6d 61 20 61 73 20  f the schema as 
2f540 69 74 20 63 61 6e 20 65 76 65 6e 20 69 66 20 74  it can even if t
2f550 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
2f560 20 74 61 62 6c 65 20 69 73 0a 20 20 20 20 2a 2a   table is.    **
2f570 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20   corrupt. */.   
2f580 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
2f590 3e 64 62 2c 20 22 53 41 56 45 50 4f 49 4e 54 20  >db, "SAVEPOINT 
2f5a0 64 75 6d 70 3b 20 50 52 41 47 4d 41 20 77 72 69  dump; PRAGMA wri
2f5b0 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 22  table_schema=ON"
2f5c0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
2f5d0 70 2d 3e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 20  p->nErr = 0;.   
2f5e0 20 69 66 28 20 7a 4c 69 6b 65 3d 3d 30 20 29 7b   if( zLike==0 ){
2f5f0 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d  .      run_schem
2f600 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a  a_dump_query(p,.
2f610 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
2f620 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20  name, type, sql 
2f630 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
2f640 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48  er ".        "WH
2f650 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c  ERE sql NOT NULL
2f660 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c   AND type=='tabl
2f670 65 27 20 41 4e 44 20 6e 61 6d 65 21 3d 27 73 71  e' AND name!='sq
2f680 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a  lite_sequence'".
2f690 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
2f6a0 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71  un_schema_dump_q
2f6b0 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20  uery(p,.        
2f6c0 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79  "SELECT name, ty
2f6d0 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  pe, sql FROM sql
2f6e0 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
2f6f0 20 20 20 20 20 22 57 48 45 52 45 20 6e 61 6d 65       "WHERE name
2f700 3d 3d 27 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  =='sqlite_sequen
2f710 63 65 27 22 0a 20 20 20 20 20 20 29 3b 0a 20 20  ce'".      );.  
2f720 20 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75      run_table_du
2f730 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20  mp_query(p,.    
2f740 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20      "SELECT sql 
2f750 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
2f760 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48  er ".        "WH
2f770 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c  ERE sql NOT NULL
2f780 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28 27 69   AND type IN ('i
2f790 6e 64 65 78 27 2c 27 74 72 69 67 67 65 72 27 2c  ndex','trigger',
2f7a0 27 76 69 65 77 27 29 22 2c 20 30 0a 20 20 20 20  'view')", 0.    
2f7b0 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    );.    }else{.
2f7c0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c        char *zSql
2f7d0 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  ;.      zSql = s
2f7e0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
2f7f0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
2f800 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20  name, type, sql 
2f810 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
2f820 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48  er ".        "WH
2f830 45 52 45 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b  ERE tbl_name LIK
2f840 45 20 25 51 20 41 4e 44 20 74 79 70 65 3d 3d 27  E %Q AND type=='
2f850 74 61 62 6c 65 27 22 0a 20 20 20 20 20 20 20 20  table'".        
2f860 22 20 20 41 4e 44 20 73 71 6c 20 4e 4f 54 20 4e  "  AND sql NOT N
2f870 55 4c 4c 22 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20  ULL", zLike);.  
2f880 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64      run_schema_d
2f890 75 6d 70 5f 71 75 65 72 79 28 70 2c 7a 53 71 6c  ump_query(p,zSql
2f8a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2f8b0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
2f8c0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
2f8d0 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
2f8e0 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46     "SELECT sql F
2f8f0 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
2f900 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
2f910 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22  RE sql NOT NULL"
2f920 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20  .        "  AND 
2f930 74 79 70 65 20 49 4e 20 28 27 69 6e 64 65 78 27  type IN ('index'
2f940 2c 27 74 72 69 67 67 65 72 27 2c 27 76 69 65 77  ,'trigger','view
2f950 27 29 22 0a 20 20 20 20 20 20 20 20 22 20 20 41  ')".        "  A
2f960 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45  ND tbl_name LIKE
2f970 20 25 51 22 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20   %Q", zLike);.  
2f980 20 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75      run_table_du
2f990 6d 70 5f 71 75 65 72 79 28 70 2c 20 7a 53 71 6c  mp_query(p, zSql
2f9a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
2f9b0 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
2f9c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
2f9d0 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20  >writableSchema 
2f9e0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2f9f0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52 41  ntf(p->out, "PRA
2fa00 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
2fa10 65 6d 61 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20  ema=OFF;\n");.  
2fa20 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53      p->writableS
2fa30 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 7d  chema = 0;.    }
2fa40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
2fa50 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41  c(p->db, "PRAGMA
2fa60 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
2fa70 3d 4f 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29  =OFF;", 0, 0, 0)
2fa80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
2fa90 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41  ec(p->db, "RELEA
2faa0 53 45 20 64 75 6d 70 3b 22 2c 20 30 2c 20 30 2c  SE dump;", 0, 0,
2fab0 20 30 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69   0);.    raw_pri
2fac0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 6e  ntf(p->out, p->n
2fad0 45 72 72 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 3b  Err ? "ROLLBACK;
2fae0 20 2d 2d 20 64 75 65 20 74 6f 20 65 72 72 6f 72   -- due to error
2faf0 73 5c 6e 22 20 3a 20 22 43 4f 4d 4d 49 54 3b 5c  s\n" : "COMMIT;\
2fb00 6e 22 29 3b 0a 20 20 20 20 70 2d 3e 73 68 6f 77  n");.    p->show
2fb10 48 65 61 64 65 72 20 3d 20 73 61 76 65 64 53 68  Header = savedSh
2fb20 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 70 2d  owHeader;.    p-
2fb30 3e 73 68 65 6c 6c 46 6c 67 73 20 3d 20 73 61 76  >shellFlgs = sav
2fb40 65 64 53 68 65 6c 6c 46 6c 61 67 73 3b 0a 20 20  edShellFlags;.  
2fb50 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2fb60 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'e' && strncmp(a
2fb70 7a 41 72 67 5b 30 5d 2c 20 22 65 63 68 6f 22 2c  zArg[0], "echo",
2fb80 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
2fb90 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
2fba0 20 20 20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61     setOrClearFla
2fbb0 67 28 70 2c 20 53 48 46 4c 47 5f 45 63 68 6f 2c  g(p, SHFLG_Echo,
2fbc0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
2fbd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
2fbe0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2fbf0 22 55 73 61 67 65 3a 20 2e 65 63 68 6f 20 6f 6e  "Usage: .echo on
2fc00 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |off\n");.      
2fc10 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
2fc20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2fc30 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'e' && strncmp(a
2fc40 7a 41 72 67 5b 30 5d 2c 20 22 65 71 70 22 2c 20  zArg[0], "eqp", 
2fc50 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
2fc60 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
2fc70 20 20 70 2d 3e 61 75 74 6f 45 51 50 74 65 73 74    p->autoEQPtest
2fc80 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
2fc90 70 2d 3e 61 75 74 6f 45 51 50 74 72 61 63 65 20  p->autoEQPtrace 
2fca0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
2fcb0 2d 3e 64 62 20 29 20 73 71 6c 69 74 65 33 5f 65  ->db ) sqlite3_e
2fcc0 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47  xec(p->db, "PRAG
2fcd0 4d 41 20 76 64 62 65 5f 74 72 61 63 65 3d 4f 46  MA vdbe_trace=OF
2fce0 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  F;", 0, 0, 0);. 
2fcf0 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51         p->autoEQ
2fd00 50 74 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  Ptrace = 0;.    
2fd10 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74    }.      if( st
2fd20 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 66  rcmp(azArg[1],"f
2fd30 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ull")==0 ){.    
2fd40 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d      p->autoEQP =
2fd50 20 41 55 54 4f 45 51 50 5f 66 75 6c 6c 3b 0a 20   AUTOEQP_full;. 
2fd60 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
2fd70 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
2fd80 74 72 69 67 67 65 72 22 29 3d 3d 30 20 29 7b 0a  trigger")==0 ){.
2fd90 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45          p->autoE
2fda0 51 50 20 3d 20 41 55 54 4f 45 51 50 5f 74 72 69  QP = AUTOEQP_tri
2fdb0 67 67 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c  gger;.#ifdef SQL
2fdc0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
2fdd0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
2fde0 28 61 7a 41 72 67 5b 31 5d 2c 22 74 65 73 74 22  (azArg[1],"test"
2fdf0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2fe00 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41 55 54  p->autoEQP = AUT
2fe10 4f 45 51 50 5f 6f 6e 3b 0a 20 20 20 20 20 20 20  OEQP_on;.       
2fe20 20 70 2d 3e 61 75 74 6f 45 51 50 74 65 73 74 20   p->autoEQPtest 
2fe30 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
2fe40 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72   if( strcmp(azAr
2fe50 67 5b 31 5d 2c 22 74 72 61 63 65 22 29 3d 3d 30  g[1],"trace")==0
2fe60 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   ){.        p->a
2fe70 75 74 6f 45 51 50 20 3d 20 41 55 54 4f 45 51 50  utoEQP = AUTOEQP
2fe80 5f 66 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  _full;.        p
2fe90 2d 3e 61 75 74 6f 45 51 50 74 72 61 63 65 20 3d  ->autoEQPtrace =
2fea0 20 31 3b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e   1;.        open
2feb0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 20  _db(p, 0);.     
2fec0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
2fed0 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 6e  p->db, "SELECT n
2fee0 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
2fef0 6d 61 73 74 65 72 20 4c 49 4d 49 54 20 31 22 2c  master LIMIT 1",
2ff00 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
2ff10 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
2ff20 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 76  p->db, "PRAGMA v
2ff30 64 62 65 5f 74 72 61 63 65 3d 4f 4e 3b 22 2c 20  dbe_trace=ON;", 
2ff40 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  0, 0, 0);.#endif
2ff50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2ff60 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50        p->autoEQP
2ff70 20 3d 20 28 75 38 29 62 6f 6f 6c 65 61 6e 56 61   = (u8)booleanVa
2ff80 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
2ff90 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2ffa0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2ffb0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2ffc0 65 3a 20 2e 65 71 70 20 6f 66 66 7c 6f 6e 7c 74  e: .eqp off|on|t
2ffd0 72 61 63 65 7c 74 72 69 67 67 65 72 7c 66 75 6c  race|trigger|ful
2ffe0 6c 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  l\n");.      rc 
2fff0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
30000 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27  se..  if( c=='e'
30010 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
30020 67 5b 30 5d 2c 20 22 65 78 69 74 22 2c 20 6e 29  g[0], "exit", n)
30030 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
30040 41 72 67 3e 31 20 26 26 20 28 72 63 20 3d 20 28  Arg>1 && (rc = (
30050 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65  int)integerValue
30060 28 61 7a 41 72 67 5b 31 5d 29 29 21 3d 30 20 29  (azArg[1]))!=0 )
30070 20 65 78 69 74 28 72 63 29 3b 0a 20 20 20 20 72   exit(rc);.    r
30080 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a  c = 2;.  }else..
30090 20 20 2f 2a 20 54 68 65 20 22 2e 65 78 70 6c 61    /* The ".expla
300a0 69 6e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61  in" command is a
300b0 75 74 6f 6d 61 74 69 63 20 6e 6f 77 2e 20 20 49  utomatic now.  I
300c0 74 20 69 73 20 6c 61 72 67 65 6c 79 20 70 6f 69  t is largely poi
300d0 6e 74 6c 65 73 73 2e 20 20 49 74 0a 20 20 2a 2a  ntless.  It.  **
300e0 20 72 65 74 61 69 6e 65 64 20 70 75 72 65 6c 79   retained purely
300f0 20 66 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63   for backwards c
30100 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2a 2f 0a  ompatibility */.
30110 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20    if( c=='e' && 
30120 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
30130 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 6e 29 3d  , "explain", n)=
30140 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 76 61  =0 ){.    int va
30150 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 6e  l = 1;.    if( n
30160 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg>=2 ){.      
30170 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67  if( strcmp(azArg
30180 5b 31 5d 2c 22 61 75 74 6f 22 29 3d 3d 30 20 29  [1],"auto")==0 )
30190 7b 0a 20 20 20 20 20 20 20 20 76 61 6c 20 3d 20  {.        val = 
301a0 39 39 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  99;.      }else{
301b0 0a 20 20 20 20 20 20 20 20 76 61 6c 20 3d 20 20  .        val =  
301c0 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
301d0 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  rg[1]);.      }.
301e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 76 61      }.    if( va
301f0 6c 3d 3d 31 20 26 26 20 70 2d 3e 6d 6f 64 65 21  l==1 && p->mode!
30200 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b  =MODE_Explain ){
30210 0a 20 20 20 20 20 20 70 2d 3e 6e 6f 72 6d 61 6c  .      p->normal
30220 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a  Mode = p->mode;.
30230 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
30240 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20  MODE_Explain;.  
30250 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61      p->autoExpla
30260 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  in = 0;.    }els
30270 65 20 69 66 28 20 76 61 6c 3d 3d 30 20 29 7b 0a  e if( val==0 ){.
30280 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64        if( p->mod
30290 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  e==MODE_Explain 
302a0 29 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e  ) p->mode = p->n
302b0 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20 20 20 20 20  ormalMode;.     
302c0 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20   p->autoExplain 
302d0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
302e0 66 28 20 76 61 6c 3d 3d 39 39 20 29 7b 0a 20 20  f( val==99 ){.  
302f0 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d      if( p->mode=
30300 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 20  =MODE_Explain ) 
30310 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72  p->mode = p->nor
30320 6d 61 6c 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70  malMode;.      p
30330 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20  ->autoExplain = 
30340 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
30350 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
30360 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
30370 4c 45 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20  LE.  if( c=='e' 
30380 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
30390 5b 30 5d 2c 20 22 65 78 70 65 72 74 22 2c 20 6e  [0], "expert", n
303a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e  )==0 ){.    open
303b0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 65  _db(p, 0);.    e
303c0 78 70 65 72 74 44 6f 74 43 6f 6d 6d 61 6e 64 28  xpertDotCommand(
303d0 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b  p, azArg, nArg);
303e0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
303f0 0a 20 20 69 66 28 20 63 3d 3d 27 66 27 20 26 26  .  if( c=='f' &&
30400 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
30410 5d 2c 20 22 66 75 6c 6c 73 63 68 65 6d 61 22 2c  ], "fullschema",
30420 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68   n)==0 ){.    Sh
30430 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20  ellState data;. 
30440 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
30450 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 64 6f   = 0;.    int do
30460 53 74 61 74 73 20 3d 20 30 3b 0a 20 20 20 20 6d  Stats = 0;.    m
30470 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20  emcpy(&data, p, 
30480 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20  sizeof(data));. 
30490 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64     data.showHead
304a0 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61  er = 0;.    data
304b0 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f  .cMode = data.mo
304c0 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a  de = MODE_Semi;.
304d0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
304e0 26 26 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61  && optionMatch(a
304f0 7a 41 72 67 5b 31 5d 2c 20 22 69 6e 64 65 6e 74  zArg[1], "indent
30500 22 29 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61  ") ){.      data
30510 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f  .cMode = data.mo
30520 64 65 20 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79  de = MODE_Pretty
30530 3b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 31  ;.      nArg = 1
30540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30550 6e 41 72 67 21 3d 31 20 29 7b 0a 20 20 20 20 20  nArg!=1 ){.     
30560 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
30570 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 66 75 6c  rr, "Usage: .ful
30580 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e  lschema ?--inden
30590 74 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  t?\n");.      rc
305a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
305b0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
305c0 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70  it;.    }.    op
305d0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
305e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
305f0 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20  ec(p->db,.      
30600 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
30610 4d 22 0a 20 20 20 20 20 20 20 22 20 20 28 53 45  M".       "  (SE
30620 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c 20 74 79  LECT sql sql, ty
30630 70 65 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d  pe type, tbl_nam
30640 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65  e tbl_name, name
30650 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20 78 22 0a   name, rowid x".
30660 20 20 20 20 20 20 20 22 20 20 20 20 20 46 52 4f         "     FRO
30670 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
30680 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20  UNION ALL".     
30690 20 20 22 20 20 20 53 45 4c 45 43 54 20 73 71 6c    "   SELECT sql
306a0 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65  , type, tbl_name
306b0 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20 46 52  , name, rowid FR
306c0 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  OM sqlite_temp_m
306d0 61 73 74 65 72 29 20 22 0a 20 20 20 20 20 20 20  aster) ".       
306e0 22 57 48 45 52 45 20 74 79 70 65 21 3d 27 6d 65  "WHERE type!='me
306f0 74 61 27 20 41 4e 44 20 73 71 6c 20 4e 4f 54 4e  ta' AND sql NOTN
30700 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54  ULL AND name NOT
30710 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27   LIKE 'sqlite_%'
30720 20 22 0a 20 20 20 20 20 20 20 22 4f 52 44 45 52   ".       "ORDER
30730 20 42 59 20 72 6f 77 69 64 22 2c 0a 20 20 20 20   BY rowid",.    
30740 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61     callback, &da
30750 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20 20  ta, &zErrMsg.   
30760 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
30770 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30780 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
30790 2a 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 72 63  *pStmt;.      rc
307a0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
307b0 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20  re_v2(p->db,.   
307c0 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
307d0 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 73  ECT rowid FROM s
307e0 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20  qlite_master".  
307f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
30800 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f 42 20 27  HERE name GLOB '
30810 73 71 6c 69 74 65 5f 73 74 61 74 5b 31 33 34 5d  sqlite_stat[134]
30820 27 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '",.            
30830 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30     -1, &pStmt, 0
30840 29 3b 0a 20 20 20 20 20 20 64 6f 53 74 61 74 73  );.      doStats
30850 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
30860 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
30870 4f 57 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  OW;.      sqlite
30880 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
30890 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
308a0 20 64 6f 53 74 61 74 73 3d 3d 30 20 29 7b 0a 20   doStats==0 ){. 
308b0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
308c0 70 2d 3e 6f 75 74 2c 20 22 2f 2a 20 4e 6f 20 53  p->out, "/* No S
308d0 54 41 54 20 74 61 62 6c 65 73 20 61 76 61 69 6c  TAT tables avail
308e0 61 62 6c 65 20 2a 2f 5c 6e 22 29 3b 0a 20 20 20  able */\n");.   
308f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
30900 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
30910 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65   "ANALYZE sqlite
30920 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20  _master;\n");.  
30930 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
30940 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20  (p->db, "SELECT 
30950 27 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f  'ANALYZE sqlite_
30960 6d 61 73 74 65 72 27 22 2c 0a 20 20 20 20 20 20  master'",.      
30970 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 6c               cal
30980 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a  lback, &data, &z
30990 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64  ErrMsg);.      d
309a0 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
309b0 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73  .mode = MODE_Ins
309c0 65 72 74 3b 0a 20 20 20 20 20 20 64 61 74 61 2e  ert;.      data.
309d0 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71  zDestTable = "sq
309e0 6c 69 74 65 5f 73 74 61 74 31 22 3b 0a 20 20 20  lite_stat1";.   
309f0 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 26 64     shell_exec(&d
30a00 61 74 61 2c 20 22 53 45 4c 45 43 54 20 2a 20 46  ata, "SELECT * F
30a10 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 31  ROM sqlite_stat1
30a20 22 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ", &zErrMsg);.  
30a30 20 20 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61      data.zDestTa
30a40 62 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74  ble = "sqlite_st
30a50 61 74 33 22 3b 0a 20 20 20 20 20 20 73 68 65 6c  at3";.      shel
30a60 6c 5f 65 78 65 63 28 26 64 61 74 61 2c 20 22 53  l_exec(&data, "S
30a70 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
30a80 69 74 65 5f 73 74 61 74 33 22 2c 20 26 7a 45 72  ite_stat3", &zEr
30a90 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74  rMsg);.      dat
30aa0 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22  a.zDestTable = "
30ab0 73 71 6c 69 74 65 5f 73 74 61 74 34 22 3b 0a 20  sqlite_stat4";. 
30ac0 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28       shell_exec(
30ad0 26 64 61 74 61 2c 20 22 53 45 4c 45 43 54 20 2a  &data, "SELECT *
30ae0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61   FROM sqlite_sta
30af0 74 34 22 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  t4", &zErrMsg);.
30b00 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
30b10 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a  (p->out, "ANALYZ
30b20 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  E sqlite_master;
30b30 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  \n");.    }.  }e
30b40 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68  lse..  if( c=='h
30b50 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
30b60 72 67 5b 30 5d 2c 20 22 68 65 61 64 65 72 73 22  rg[0], "headers"
30b70 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
30b80 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
30b90 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65      p->showHeade
30ba0 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  r = booleanValue
30bb0 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20  (azArg[1]);.    
30bc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
30bd0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
30be0 22 55 73 61 67 65 3a 20 2e 68 65 61 64 65 72 73  "Usage: .headers
30bf0 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20   on|off\n");.   
30c00 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
30c10 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
30c20 63 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d  c=='h' && strncm
30c30 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 6c  p(azArg[0], "hel
30c40 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  p", n)==0 ){.   
30c50 20 69 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a   if( nArg>=2 ){.
30c60 20 20 20 20 20 20 6e 20 3d 20 73 68 6f 77 48 65        n = showHe
30c70 6c 70 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  lp(p->out, azArg
30c80 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [1]);.      if( 
30c90 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
30ca0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
30cb0 75 74 2c 20 22 4e 6f 74 68 69 6e 67 20 6d 61 74  ut, "Nothing mat
30cc0 63 68 65 73 20 27 25 73 27 5c 6e 22 2c 20 61 7a  ches '%s'\n", az
30cd0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d  Arg[1]);.      }
30ce0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30cf0 20 20 73 68 6f 77 48 65 6c 70 28 70 2d 3e 6f 75    showHelp(p->ou
30d00 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t, 0);.    }.  }
30d10 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
30d20 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  i' && strncmp(az
30d30 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 72 74 22  Arg[0], "import"
30d40 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
30d50 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20  har *zTable;    
30d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
30d70 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74  sert data into t
30d80 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  his table */.   
30d90 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20   char *zFile;   
30da0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30db0 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
30dc0 65 78 74 72 61 20 63 6f 6e 74 65 6e 74 20 66 72  extra content fr
30dd0 6f 6d 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  om */.    sqlite
30de0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
30df0 4e 55 4c 4c 3b 20 2f 2a 20 41 20 73 74 61 74 65  NULL; /* A state
30e00 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ment */.    int 
30e10 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
30e20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
30e30 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
30e40 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
30e50 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
30e60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30e70 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
30e80 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67  in an SQL string
30e90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   */.    int i, j
30ea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30eb0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
30ec0 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ters */.    int 
30ed0 6e 65 65 64 43 6f 6d 6d 69 74 3b 20 20 20 20 20  needCommit;     
30ee0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
30ef0 74 6f 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c  to COMMIT or ROL
30f00 4c 42 41 43 4b 20 61 74 20 65 6e 64 20 2a 2f 0a  LBACK at end */.
30f10 20 20 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20      int nSep;   
30f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
30f40 65 73 20 69 6e 20 70 2d 3e 63 6f 6c 53 65 70 61  es in p->colSepa
30f50 72 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20 20 20 63  rator[] */.    c
30f60 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
30f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
30f80 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
30f90 2f 0a 20 20 20 20 49 6d 70 6f 72 74 43 74 78 20  /.    ImportCtx 
30fa0 73 43 74 78 3b 20 20 20 20 20 20 20 20 20 20 20  sCtx;           
30fb0 20 20 2f 2a 20 52 65 61 64 65 72 20 63 6f 6e 74    /* Reader cont
30fc0 65 78 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ext */.    char 
30fd0 2a 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a  *(SQLITE_CDECL *
30fe0 78 52 65 61 64 29 28 49 6d 70 6f 72 74 43 74 78  xRead)(ImportCtx
30ff0 2a 29 3b 20 2f 2a 20 46 75 6e 63 20 74 6f 20 72  *); /* Func to r
31000 65 61 64 20 6f 6e 65 20 76 61 6c 75 65 20 2a 2f  ead one value */
31010 0a 20 20 20 20 69 6e 74 20 28 53 51 4c 49 54 45  .    int (SQLITE
31020 5f 43 44 45 43 4c 20 2a 78 43 6c 6f 73 65 72 29  _CDECL *xCloser)
31030 28 46 49 4c 45 2a 29 3b 20 20 20 20 20 20 2f 2a  (FILE*);      /*
31040 20 46 75 6e 63 20 74 6f 20 63 6c 6f 73 65 20 66   Func to close f
31050 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  ile */..    if( 
31060 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20 20  nArg!=3 ){.     
31070 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
31080 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d 70  rr, "Usage: .imp
31090 6f 72 74 20 46 49 4c 45 20 54 41 42 4c 45 5c 6e  ort FILE TABLE\n
310a0 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  ");.      goto m
310b0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
310c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c  ;.    }.    zFil
310d0 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20  e = azArg[1];.  
310e0 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67    zTable = azArg
310f0 5b 32 5d 3b 0a 20 20 20 20 73 65 65 6e 49 6e 74  [2];.    seenInt
31100 65 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 20 20  errupt = 0;.    
31110 6d 65 6d 73 65 74 28 26 73 43 74 78 2c 20 30 2c  memset(&sCtx, 0,
31120 20 73 69 7a 65 6f 66 28 73 43 74 78 29 29 3b 0a   sizeof(sCtx));.
31130 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
31140 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74  );.    nSep = st
31150 72 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c 53 65 70  rlen30(p->colSep
31160 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 69 66 28  arator);.    if(
31170 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20   nSep==0 ){.    
31180 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
31190 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  err,.           
311a0 20 20 20 20 20 20 22 45 72 72 6f 72 3a 20 6e 6f        "Error: no
311b0 6e 2d 6e 75 6c 6c 20 63 6f 6c 75 6d 6e 20 73 65  n-null column se
311c0 70 61 72 61 74 6f 72 20 72 65 71 75 69 72 65 64  parator required
311d0 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b   for import\n");
311e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
311f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
31200 53 65 70 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  Sep>1 ){.      r
31210 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
31220 2c 20 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69 2d  , "Error: multi-
31230 63 68 61 72 61 63 74 65 72 20 63 6f 6c 75 6d 6e  character column
31240 20 73 65 70 61 72 61 74 6f 72 73 20 6e 6f 74 20   separators not 
31250 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20 20 20 20  allowed".       
31260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
31270 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b   for import\n");
31280 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
31290 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 65 70 20  .    }.    nSep 
312a0 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 72 6f  = strlen30(p->ro
312b0 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  wSeparator);.   
312c0 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a   if( nSep==0 ){.
312d0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
312e0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
312f0 20 6e 6f 6e 2d 6e 75 6c 6c 20 72 6f 77 20 73 65   non-null row se
31300 70 61 72 61 74 6f 72 20 72 65 71 75 69 72 65 64  parator required
31310 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b   for import\n");
31320 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
31330 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
31340 53 65 70 3d 3d 32 20 26 26 20 70 2d 3e 6d 6f 64  Sep==2 && p->mod
31350 65 3d 3d 4d 4f 44 45 5f 43 73 76 20 26 26 20 73  e==MODE_Csv && s
31360 74 72 63 6d 70 28 70 2d 3e 72 6f 77 53 65 70 61  trcmp(p->rowSepa
31370 72 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29  rator, SEP_CrLf)
31380 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
31390 57 68 65 6e 20 69 6d 70 6f 72 74 69 6e 67 20 43  When importing C
313a0 53 56 20 28 6f 6e 6c 79 29 2c 20 69 66 20 74 68  SV (only), if th
313b0 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20  e row separator 
313c0 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20  is set to the.  
313d0 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 6f      ** default o
313e0 75 74 70 75 74 20 72 6f 77 20 73 65 70 61 72 61  utput row separa
313f0 74 6f 72 2c 20 63 68 61 6e 67 65 20 69 74 20 74  tor, change it t
31400 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20 69 6e  o the default in
31410 70 75 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77  put.      ** row
31420 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 69   separator.  Thi
31430 73 20 61 76 6f 69 64 73 20 68 61 76 69 6e 67 20  s avoids having 
31440 74 6f 20 6d 61 69 6e 74 61 69 6e 20 64 69 66 66  to maintain diff
31450 65 72 65 6e 74 20 69 6e 70 75 74 0a 20 20 20 20  erent input.    
31460 20 20 2a 2a 20 61 6e 64 20 6f 75 74 70 75 74 20    ** and output 
31470 72 6f 77 20 73 65 70 61 72 61 74 6f 72 73 2e 20  row separators. 
31480 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
31490 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
314a0 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
314b0 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ), p->rowSeparat
314c0 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20  or, SEP_Row);.  
314d0 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65      nSep = strle
314e0 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  n30(p->rowSepara
314f0 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tor);.    }.    
31500 69 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20 20  if( nSep>1 ){.  
31510 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
31520 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d  tderr, "Error: m
31530 75 6c 74 69 2d 63 68 61 72 61 63 74 65 72 20 72  ulti-character r
31540 6f 77 20 73 65 70 61 72 61 74 6f 72 73 20 6e 6f  ow separators no
31550 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20 20  t allowed".     
31560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31570 20 22 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22   " for import\n"
31580 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
31590 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 74  1;.    }.    sCt
315a0 78 2e 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b  x.zFile = zFile;
315b0 0a 20 20 20 20 73 43 74 78 2e 6e 4c 69 6e 65 20  .    sCtx.nLine 
315c0 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73 43 74  = 1;.    if( sCt
315d0 78 2e 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20  x.zFile[0]=='|' 
315e0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
315f0 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20  _OMIT_POPEN.    
31600 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
31610 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 70 69 70  err, "Error: pip
31620 65 73 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f  es are not suppo
31630 72 74 65 64 20 69 6e 20 74 68 69 73 20 4f 53 5c  rted in this OS\
31640 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
31650 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  n 1;.#else.     
31660 20 73 43 74 78 2e 69 6e 20 3d 20 70 6f 70 65 6e   sCtx.in = popen
31670 28 73 43 74 78 2e 7a 46 69 6c 65 2b 31 2c 20 22  (sCtx.zFile+1, "
31680 72 22 29 3b 0a 20 20 20 20 20 20 73 43 74 78 2e  r");.      sCtx.
31690 7a 46 69 6c 65 20 3d 20 22 3c 70 69 70 65 3e 22  zFile = "<pipe>"
316a0 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 20  ;.      xCloser 
316b0 3d 20 70 63 6c 6f 73 65 3b 0a 23 65 6e 64 69 66  = pclose;.#endif
316c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
316d0 20 20 73 43 74 78 2e 69 6e 20 3d 20 66 6f 70 65    sCtx.in = fope
316e0 6e 28 73 43 74 78 2e 7a 46 69 6c 65 2c 20 22 72  n(sCtx.zFile, "r
316f0 62 22 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73  b");.      xClos
31700 65 72 20 3d 20 66 63 6c 6f 73 65 3b 0a 20 20 20  er = fclose;.   
31710 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f   }.    if( p->mo
31720 64 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20 29  de==MODE_Ascii )
31730 7b 0a 20 20 20 20 20 20 78 52 65 61 64 20 3d 20  {.      xRead = 
31740 61 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f 66  ascii_read_one_f
31750 69 65 6c 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ield;.    }else{
31760 0a 20 20 20 20 20 20 78 52 65 61 64 20 3d 20 63  .      xRead = c
31770 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c  sv_read_one_fiel
31780 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
31790 20 73 43 74 78 2e 69 6e 3d 3d 30 20 29 7b 0a 20   sCtx.in==0 ){. 
317a0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
317b0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
317c0 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
317d0 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a  s\"\n", zFile);.
317e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
317f0 20 20 20 20 7d 0a 20 20 20 20 73 43 74 78 2e 63      }.    sCtx.c
31800 43 6f 6c 53 65 70 20 3d 20 70 2d 3e 63 6f 6c 53  ColSep = p->colS
31810 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20 20  eparator[0];.   
31820 20 73 43 74 78 2e 63 52 6f 77 53 65 70 20 3d 20   sCtx.cRowSep = 
31830 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 5b  p->rowSeparator[
31840 30 5d 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73  0];.    zSql = s
31850 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
31860 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25 73  SELECT * FROM %s
31870 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  ", zTable);.    
31880 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
31890 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74       xCloser(sCt
318a0 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 73 68 65  x.in);.      she
318b0 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79  ll_out_of_memory
318c0 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  ();.    }.    nB
318d0 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  yte = strlen30(z
318e0 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Sql);.    rc = s
318f0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
31900 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
31910 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
31920 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64     import_append
31930 5f 63 68 61 72 28 26 73 43 74 78 2c 20 30 29 3b  _char(&sCtx, 0);
31940 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65      /* To ensure
31950 20 73 43 74 78 2e 7a 20 69 73 20 61 6c 6c 6f 63   sCtx.z is alloc
31960 61 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  ated */.    if( 
31970 72 63 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  rc && sqlite3_st
31980 72 67 6c 6f 62 28 22 6e 6f 20 73 75 63 68 20 74  rglob("no such t
31990 61 62 6c 65 3a 20 2a 22 2c 20 73 71 6c 69 74 65  able: *", sqlite
319a0 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
319b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ==0 ){.      cha
319c0 72 20 2a 7a 43 72 65 61 74 65 20 3d 20 73 71 6c  r *zCreate = sql
319d0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 43 52  ite3_mprintf("CR
319e0 45 41 54 45 20 54 41 42 4c 45 20 25 73 22 2c 20  EATE TABLE %s", 
319f0 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 63  zTable);.      c
31a00 68 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b 0a  har cSep = '(';.
31a10 20 20 20 20 20 20 77 68 69 6c 65 28 20 78 52 65        while( xRe
31a20 61 64 28 26 73 43 74 78 29 20 29 7b 0a 20 20 20  ad(&sCtx) ){.   
31a30 20 20 20 20 20 7a 43 72 65 61 74 65 20 3d 20 73       zCreate = s
31a40 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
31a50 25 7a 25 63 5c 6e 20 20 5c 22 25 77 5c 22 20 54  %z%c\n  \"%w\" T
31a60 45 58 54 22 2c 20 7a 43 72 65 61 74 65 2c 20 63  EXT", zCreate, c
31a70 53 65 70 2c 20 73 43 74 78 2e 7a 29 3b 0a 20 20  Sep, sCtx.z);.  
31a80 20 20 20 20 20 20 63 53 65 70 20 3d 20 27 2c 27        cSep = ','
31a90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 43  ;.        if( sC
31aa0 74 78 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e 63  tx.cTerm!=sCtx.c
31ab0 43 6f 6c 53 65 70 20 29 20 62 72 65 61 6b 3b 0a  ColSep ) break;.
31ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
31ad0 28 20 63 53 65 70 3d 3d 27 28 27 20 29 7b 0a 20  ( cSep=='(' ){. 
31ae0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
31af0 72 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20 20  ree(zCreate);.  
31b00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
31b10 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20  ee(sCtx.z);.    
31b20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78      xCloser(sCtx
31b30 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 75 74  .in);.        ut
31b40 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
31b50 2c 22 25 73 3a 20 65 6d 70 74 79 20 66 69 6c 65  ,"%s: empty file
31b60 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69 6c 65 29  \n", sCtx.zFile)
31b70 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
31b80 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
31b90 20 20 7a 43 72 65 61 74 65 20 3d 20 73 71 6c 69    zCreate = sqli
31ba0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 5c  te3_mprintf("%z\
31bb0 6e 29 22 2c 20 7a 43 72 65 61 74 65 29 3b 0a 20  n)", zCreate);. 
31bc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31bd0 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 43  3_exec(p->db, zC
31be0 72 65 61 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b  reate, 0, 0, 0);
31bf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
31c00 72 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20 20  ree(zCreate);.  
31c10 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
31c20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
31c30 66 28 73 74 64 65 72 72 2c 20 22 43 52 45 41 54  f(stderr, "CREAT
31c40 45 20 54 41 42 4c 45 20 25 73 28 2e 2e 2e 29 20  E TABLE %s(...) 
31c50 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 7a  failed: %s\n", z
31c60 54 61 62 6c 65 2c 0a 20 20 20 20 20 20 20 20 20  Table,.         
31c70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
31c80 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
31c90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
31ca0 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20  ree(sCtx.z);.   
31cb0 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74       xCloser(sCt
31cc0 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 72  x.in);.        r
31cd0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
31ce0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
31cf0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
31d00 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
31d10 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
31d20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
31d30 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
31d40 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66  ( rc ){.      if
31d50 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74 65 33   (pStmt) sqlite3
31d60 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
31d70 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
31d80 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
31d90 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
31da0 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
31db0 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28  ;.      xCloser(
31dc0 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20  sCtx.in);.      
31dd0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
31de0 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74      nCol = sqlit
31df0 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
31e00 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  pStmt);.    sqli
31e10 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
31e20 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d  mt);.    pStmt =
31e30 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c   0;.    if( nCol
31e40 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
31e50 2f 2a 20 6e 6f 20 63 6f 6c 75 6d 6e 73 2c 20 6e  /* no columns, n
31e60 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 7a  o error */.    z
31e70 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Sql = sqlite3_ma
31e80 6c 6c 6f 63 36 34 28 20 6e 42 79 74 65 2a 32 20  lloc64( nByte*2 
31e90 2b 20 32 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b  + 20 + nCol*2 );
31ea0 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
31eb0 20 29 7b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65   ){.      xClose
31ec0 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20  r(sCtx.in);.    
31ed0 20 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d    shell_out_of_m
31ee0 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20  emory();.    }. 
31ef0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
31f00 6e 74 66 28 6e 42 79 74 65 2b 32 30 2c 20 7a 53  ntf(nByte+20, zS
31f10 71 6c 2c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  ql, "INSERT INTO
31f20 20 5c 22 25 77 5c 22 20 56 41 4c 55 45 53 28 3f   \"%w\" VALUES(?
31f30 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  ", zTable);.    
31f40 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71  j = strlen30(zSq
31f50 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  l);.    for(i=1;
31f60 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
31f70 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d       zSql[j++] =
31f80 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c   ',';.      zSql
31f90 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20  [j++] = '?';.   
31fa0 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d   }.    zSql[j++]
31fb0 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c   = ')';.    zSql
31fc0 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  [j] = 0;.    rc 
31fd0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
31fe0 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
31ff0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
32000 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
32010 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
32020 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74  ( rc ){.      ut
32030 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
32040 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
32050 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
32060 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 69  p->db));.      i
32070 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74 65  f (pStmt) sqlite
32080 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
32090 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72  );.      xCloser
320a0 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20  (sCtx.in);.     
320b0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
320c0 0a 20 20 20 20 6e 65 65 64 43 6f 6d 6d 69 74 20  .    needCommit 
320d0 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  = sqlite3_get_au
320e0 74 6f 63 6f 6d 6d 69 74 28 70 2d 3e 64 62 29 3b  tocommit(p->db);
320f0 0a 20 20 20 20 69 66 28 20 6e 65 65 64 43 6f 6d  .    if( needCom
32100 6d 69 74 20 29 20 73 71 6c 69 74 65 33 5f 65 78  mit ) sqlite3_ex
32110 65 63 28 70 2d 3e 64 62 2c 20 22 42 45 47 49 4e  ec(p->db, "BEGIN
32120 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
32130 20 64 6f 7b 0a 20 20 20 20 20 20 69 6e 74 20 73   do{.      int s
32140 74 61 72 74 4c 69 6e 65 20 3d 20 73 43 74 78 2e  tartLine = sCtx.
32150 6e 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72  nLine;.      for
32160 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
32170 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
32180 20 2a 7a 20 3d 20 78 52 65 61 64 28 26 73 43 74   *z = xRead(&sCt
32190 78 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20  x);.        /*. 
321a0 20 20 20 20 20 20 20 2a 2a 20 44 69 64 20 77 65         ** Did we
321b0 20 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69   reach end-of-fi
321c0 6c 65 20 62 65 66 6f 72 65 20 66 69 6e 64 69 6e  le before findin
321d0 67 20 61 6e 79 20 63 6f 6c 75 6d 6e 73 3f 0a 20  g any columns?. 
321e0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 73 6f 2c         ** If so,
321f0 20 73 74 6f 70 20 69 6e 73 74 65 61 64 20 6f 66   stop instead of
32200 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67 20 74 68   NULL filling th
32210 65 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c 75  e remaining colu
32220 6d 6e 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  mns..        */.
32230 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30          if( z==0
32240 20 26 26 20 69 3d 3d 30 20 29 20 62 72 65 61 6b   && i==0 ) break
32250 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20  ;.        /*.   
32260 20 20 20 20 20 2a 2a 20 44 69 64 20 77 65 20 72       ** Did we r
32270 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69 6c 65  each end-of-file
32280 20 4f 52 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20   OR end-of-line 
32290 62 65 66 6f 72 65 20 66 69 6e 64 69 6e 67 20 61  before finding a
322a0 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  ny.        ** co
322b0 6c 75 6d 6e 73 20 69 6e 20 41 53 43 49 49 20 6d  lumns in ASCII m
322c0 6f 64 65 3f 20 20 49 66 20 73 6f 2c 20 73 74 6f  ode?  If so, sto
322d0 70 20 69 6e 73 74 65 61 64 20 6f 66 20 4e 55 4c  p instead of NUL
322e0 4c 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20  L filling.      
322f0 20 20 2a 2a 20 74 68 65 20 72 65 6d 61 69 6e 69    ** the remaini
32300 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20  ng columns..    
32310 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
32320 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45  f( p->mode==MODE
32330 5f 41 73 63 69 69 20 26 26 20 28 7a 3d 3d 30 20  _Ascii && (z==0 
32340 7c 7c 20 7a 5b 30 5d 3d 3d 30 29 20 26 26 20 69  || z[0]==0) && i
32350 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
32360 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
32370 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2b  d_text(pStmt, i+
32380 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  1, z, -1, SQLITE
32390 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
323a0 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 2d       if( i<nCol-
323b0 31 20 26 26 20 73 43 74 78 2e 63 54 65 72 6d 21  1 && sCtx.cTerm!
323c0 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 7b  =sCtx.cColSep ){
323d0 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
323e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
323f0 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65 64 20  %s:%d: expected 
32400 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 66  %d columns but f
32410 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20 20 20  ound %d - ".    
32420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32430 20 20 20 20 20 20 22 66 69 6c 6c 69 6e 67 20 74        "filling t
32440 68 65 20 72 65 73 74 20 77 69 74 68 20 4e 55 4c  he rest with NUL
32450 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  L\n",.          
32460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32470 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61 72  sCtx.zFile, star
32480 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 2b 31  tLine, nCol, i+1
32490 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
324a0 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 77  = 2;.          w
324b0 68 69 6c 65 28 20 69 3c 3d 6e 43 6f 6c 20 29 7b  hile( i<=nCol ){
324c0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
324d0 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b 20 69 2b  ll(pStmt, i); i+
324e0 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20  +; }.        }. 
324f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
32500 20 73 43 74 78 2e 63 54 65 72 6d 3d 3d 73 43 74   sCtx.cTerm==sCt
32510 78 2e 63 43 6f 6c 53 65 70 20 29 7b 0a 20 20 20  x.cColSep ){.   
32520 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
32530 20 20 20 78 52 65 61 64 28 26 73 43 74 78 29 3b     xRead(&sCtx);
32540 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  .          i++;.
32550 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20          }while( 
32560 73 43 74 78 2e 63 54 65 72 6d 3d 3d 73 43 74 78  sCtx.cTerm==sCtx
32570 2e 63 43 6f 6c 53 65 70 20 29 3b 0a 20 20 20 20  .cColSep );.    
32580 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
32590 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20  stderr, "%s:%d: 
325a0 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75  expected %d colu
325b0 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64 20 25 64  mns but found %d
325c0 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20 20   - ".           
325d0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65 78               "ex
325e0 74 72 61 73 20 69 67 6e 6f 72 65 64 5c 6e 22 2c  tras ignored\n",
325f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32600 20 20 20 20 20 20 20 20 20 73 43 74 78 2e 7a 46           sCtx.zF
32610 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20  ile, startLine, 
32620 6e 43 6f 6c 2c 20 69 29 3b 0a 20 20 20 20 20 20  nCol, i);.      
32630 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e  }.      if( i>=n
32640 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Col ){.        s
32650 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
32660 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
32670 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
32680 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 69  Stmt);.        i
32690 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
326a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
326b0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
326c0 2c 20 22 25 73 3a 25 64 3a 20 49 4e 53 45 52 54  , "%s:%d: INSERT
326d0 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20   failed: %s\n", 
326e0 73 43 74 78 2e 7a 46 69 6c 65 2c 0a 20 20 20 20  sCtx.zFile,.    
326f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32700 20 20 73 74 61 72 74 4c 69 6e 65 2c 20 73 71 6c    startLine, sql
32710 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
32720 62 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  b));.        }. 
32730 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c       }.    }whil
32740 65 28 20 73 43 74 78 2e 63 54 65 72 6d 21 3d 45  e( sCtx.cTerm!=E
32750 4f 46 20 29 3b 0a 0a 20 20 20 20 78 43 6c 6f 73  OF );..    xClos
32760 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20  er(sCtx.in);.   
32770 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43   sqlite3_free(sC
32780 74 78 2e 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  tx.z);.    sqlit
32790 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
327a0 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64  t);.    if( need
327b0 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69 74 65 33  Commit ) sqlite3
327c0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 43 4f  _exec(p->db, "CO
327d0 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b  MMIT", 0, 0, 0);
327e0 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
327f0 66 20 53 51 4c 49 54 45 5f 55 4e 54 45 53 54 41  f SQLITE_UNTESTA
32800 42 4c 45 0a 20 20 69 66 28 20 63 3d 3d 27 69 27  BLE.  if( c=='i'
32810 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
32820 67 5b 30 5d 2c 20 22 69 6d 70 6f 73 74 65 72 22  g[0], "imposter"
32830 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
32840 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 63  har *zSql;.    c
32850 68 61 72 20 2a 7a 43 6f 6c 6c 69 73 74 20 3d 20  har *zCollist = 
32860 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  0;.    sqlite3_s
32870 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20  tmt *pStmt;.    
32880 69 6e 74 20 74 6e 75 6d 20 3d 20 30 3b 0a 20 20  int tnum = 0;.  
32890 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28    int i;.    if(
328a0 20 21 28 6e 41 72 67 3d 3d 33 20 7c 7c 20 28 6e   !(nArg==3 || (n
328b0 41 72 67 3d 3d 32 20 26 26 20 73 71 6c 69 74 65  Arg==2 && sqlite
328c0 33 5f 73 74 72 69 63 6d 70 28 61 7a 41 72 67 5b  3_stricmp(azArg[
328d0 31 5d 2c 22 6f 66 66 22 29 3d 3d 30 29 29 20 29  1],"off")==0)) )
328e0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
328f0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
32900 67 65 3a 20 2e 69 6d 70 6f 73 74 65 72 20 49 4e  ge: .imposter IN
32910 44 45 58 20 49 4d 50 4f 53 54 45 52 5c 6e 22 0a  DEX IMPOSTER\n".
32920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32930 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20            "     
32940 20 20 2e 69 6d 70 6f 73 74 65 72 20 6f 66 66 5c    .imposter off\
32950 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
32960 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
32970 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
32980 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
32990 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66  db(p, 0);.    if
329a0 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
329b0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
329c0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
329d0 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
329e0 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c  , p->db, "main",
329f0 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 67 6f   0, 1);.      go
32a00 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
32a10 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
32a20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
32a30 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 72  printf("SELECT r
32a40 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71 6c  ootpage FROM sql
32a50 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20  ite_master".    
32a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a70 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6e         " WHERE n
32a80 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70  ame='%q' AND typ
32a90 65 3d 27 69 6e 64 65 78 27 22 2c 20 61 7a 41 72  e='index'", azAr
32aa0 67 5b 31 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74  g[1]);.    sqlit
32ab0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
32ac0 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
32ad0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73  pStmt, 0);.    s
32ae0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
32af0 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
32b00 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
32b10 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
32b20 20 20 20 20 74 6e 75 6d 20 3d 20 73 71 6c 69 74      tnum = sqlit
32b30 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
32b40 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  tmt, 0);.    }. 
32b50 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
32b60 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
32b70 69 66 28 20 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20  if( tnum==0 ){. 
32b80 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
32b90 28 73 74 64 65 72 72 2c 20 22 6e 6f 20 73 75 63  (stderr, "no suc
32ba0 68 20 69 6e 64 65 78 3a 20 5c 22 25 73 5c 22 5c  h index: \"%s\"\
32bb0 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  n", azArg[1]);. 
32bc0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
32bd0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
32be0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
32bf0 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
32c00 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
32c10 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 3d  GMA index_xinfo=
32c20 27 25 71 27 22 2c 20 61 7a 41 72 67 5b 31 5d 29  '%q'", azArg[1])
32c30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
32c40 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
32c50 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
32c60 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73  pStmt, 0);.    s
32c70 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
32c80 29 3b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20  );.    i = 0;.  
32c90 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
32ca0 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
32cb0 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
32cc0 20 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 32 30    char zLabel[20
32cd0 5d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ];.      const c
32ce0 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e  har *zCol = (con
32cf0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
32d00 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
32d10 6d 74 2c 32 29 3b 0a 20 20 20 20 20 20 69 2b 2b  mt,2);.      i++
32d20 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c  ;.      if( zCol
32d30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
32d40 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  f( sqlite3_colum
32d50 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 31 29 3d 3d  n_int(pStmt,1)==
32d60 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
32d70 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57 49 44 5f 22  zCol = "_ROWID_"
32d80 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
32d90 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
32da0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
32db0 6f 66 28 7a 4c 61 62 65 6c 29 2c 7a 4c 61 62 65  of(zLabel),zLabe
32dc0 6c 2c 22 65 78 70 72 25 64 22 2c 69 29 3b 0a 20  l,"expr%d",i);. 
32dd0 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20           zCol = 
32de0 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 20 20  zLabel;.        
32df0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
32e00 69 66 28 20 7a 43 6f 6c 6c 69 73 74 3d 3d 30 20  if( zCollist==0 
32e10 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c  ){.        zColl
32e20 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ist = sqlite3_mp
32e30 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20  rintf("\"%w\"", 
32e40 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c  zCol);.      }el
32e50 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
32e60 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  list = sqlite3_m
32e70 70 72 69 6e 74 66 28 22 25 7a 2c 5c 22 25 77 5c  printf("%z,\"%w\
32e80 22 22 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 43  "", zCollist, zC
32e90 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ol);.      }.   
32ea0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
32eb0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
32ec0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
32ed0 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
32ee0 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
32ef0 42 4c 45 20 5c 22 25 77 5c 22 28 25 73 2c 50 52  BLE \"%w\"(%s,PR
32f00 49 4d 41 52 59 20 4b 45 59 28 25 73 29 29 57 49  IMARY KEY(%s))WI
32f10 54 48 4f 55 54 20 52 4f 57 49 44 22 2c 0a 20 20  THOUT ROWID",.  
32f20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 32 5d          azArg[2]
32f30 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 43 6f 6c  , zCollist, zCol
32f40 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  list);.    sqlit
32f50 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c 69 73 74  e3_free(zCollist
32f60 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
32f70 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
32f80 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
32f90 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62  _IMPOSTER, p->db
32fa0 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74 6e 75  , "main", 1, tnu
32fb0 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  m);.    if( rc==
32fc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32fd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
32fe0 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  exec(p->db, zSql
32ff0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
33000 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
33010 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
33020 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c  STCTRL_IMPOSTER,
33030 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20   p->db, "main", 
33040 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
33050 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75   rc ){.        u
33060 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
33070 72 2c 20 22 45 72 72 6f 72 20 69 6e 20 5b 25 73  r, "Error in [%s
33080 5d 3a 20 25 73 5c 6e 22 2c 20 7a 53 71 6c 2c 20  ]: %s\n", zSql, 
33090 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
330a0 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 7d 65  ->db));.      }e
330b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 74 66  lse{.        utf
330c0 38 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c  8_printf(stdout,
330d0 20 22 25 73 3b 5c 6e 22 2c 20 7a 53 71 6c 29 3b   "%s;\n", zSql);
330e0 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
330f0 6e 74 66 28 73 74 64 6f 75 74 2c 0a 20 20 20 20  ntf(stdout,.    
33100 20 20 20 20 20 20 20 22 57 41 52 4e 49 4e 47 3a         "WARNING:
33110 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 20 69   writing to an i
33120 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 77 69  mposter table wi
33130 6c 6c 20 63 6f 72 72 75 70 74 20 74 68 65 20 69  ll corrupt the i
33140 6e 64 65 78 21 5c 6e 22 0a 20 20 20 20 20 20 20  ndex!\n".       
33150 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
33160 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
33170 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
33180 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  "SQLITE_TESTCTRL
33190 5f 49 4d 50 4f 53 54 45 52 20 72 65 74 75 72 6e  _IMPOSTER return
331a0 73 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20  s %d\n", rc);.  
331b0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
331c0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
331d0 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73  ee(zSql);.  }els
331e0 65 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  e.#endif /* !def
331f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
33200 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 29 20 2a  _TEST_CONTROL) *
33210 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
33220 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a  _ENABLE_IOTRACE.
33230 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20    if( c=='i' && 
33240 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
33250 2c 20 22 69 6f 74 72 61 63 65 22 2c 20 6e 29 3d  , "iotrace", n)=
33260 3d 30 20 29 7b 0a 20 20 20 20 53 51 4c 49 54 45  =0 ){.    SQLITE
33270 5f 41 50 49 20 65 78 74 65 72 6e 20 76 6f 69 64  _API extern void
33280 20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a   (SQLITE_CDECL *
33290 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 29 28  sqlite3IoTrace)(
332a0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e  const char*, ...
332b0 29 3b 0a 20 20 20 20 69 66 28 20 69 6f 74 72 61  );.    if( iotra
332c0 63 65 20 26 26 20 69 6f 74 72 61 63 65 21 3d 73  ce && iotrace!=s
332d0 74 64 6f 75 74 20 29 20 66 63 6c 6f 73 65 28 69  tdout ) fclose(i
332e0 6f 74 72 61 63 65 29 3b 0a 20 20 20 20 69 6f 74  otrace);.    iot
332f0 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  race = 0;.    if
33300 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20  ( nArg<2 ){.    
33310 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
33320 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
33330 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67  if( strcmp(azArg
33340 5b 31 5d 2c 20 22 2d 22 29 3d 3d 30 20 29 7b 0a  [1], "-")==0 ){.
33350 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54        sqlite3IoT
33360 72 61 63 65 20 3d 20 69 6f 74 72 61 63 65 50 72  race = iotracePr
33370 69 6e 74 66 3b 0a 20 20 20 20 20 20 69 6f 74 72  intf;.      iotr
33380 61 63 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  ace = stdout;.  
33390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
333a0 6f 74 72 61 63 65 20 3d 20 66 6f 70 65 6e 28 61  otrace = fopen(a
333b0 7a 41 72 67 5b 31 5d 2c 20 22 77 22 29 3b 0a 20  zArg[1], "w");. 
333c0 20 20 20 20 20 69 66 28 20 69 6f 74 72 61 63 65       if( iotrace
333d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==0 ){.        u
333e0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
333f0 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
33400 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
33410 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
33420 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72       sqlite3IoTr
33430 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ace = 0;.       
33440 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
33450 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
33460 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69  lite3IoTrace = i
33470 6f 74 72 61 63 65 50 72 69 6e 74 66 3b 0a 20 20  otracePrintf;.  
33480 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
33490 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  lse.#endif..  if
334a0 28 20 63 3d 3d 27 6c 27 20 26 26 20 6e 3e 3d 35  ( c=='l' && n>=5
334b0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
334c0 67 5b 30 5d 2c 20 22 6c 69 6d 69 74 73 22 2c 20  g[0], "limits", 
334d0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  n)==0 ){.    sta
334e0 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
334f0 20 7b 0a 20 20 20 20 20 20 20 63 6f 6e 73 74 20   {.       const 
33500 63 68 61 72 20 2a 7a 4c 69 6d 69 74 4e 61 6d 65  char *zLimitName
33510 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61  ;   /* Name of a
33520 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20 20 20   limit */.      
33530 20 69 6e 74 20 6c 69 6d 69 74 43 6f 64 65 3b 20   int limitCode; 
33540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
33550 74 65 67 65 72 20 63 6f 64 65 20 66 6f 72 20 74  teger code for t
33560 68 61 74 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20  hat limit */.   
33570 20 7d 20 61 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a   } aLimit[] = {.
33580 20 20 20 20 20 20 7b 20 22 6c 65 6e 67 74 68 22        { "length"
33590 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
335a0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45   SQLITE_LIMIT_LE
335b0 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20 20  NGTH            
335c0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
335d0 20 7b 20 22 73 71 6c 5f 6c 65 6e 67 74 68 22 2c   { "sql_length",
335e0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
335f0 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e  TE_LIMIT_SQL_LEN
33600 47 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20  GTH             
33610 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63     },.      { "c
33620 6f 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20 20 20  olumn",         
33630 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
33640 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20 20 20 20 20  MIT_COLUMN      
33650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
33660 0a 20 20 20 20 20 20 7b 20 22 65 78 70 72 5f 64  .      { "expr_d
33670 65 70 74 68 22 2c 20 20 20 20 20 20 20 20 20 20  epth",          
33680 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45    SQLITE_LIMIT_E
33690 58 50 52 5f 44 45 50 54 48 20 20 20 20 20 20 20  XPR_DEPTH       
336a0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
336b0 20 20 7b 20 22 63 6f 6d 70 6f 75 6e 64 5f 73 65    { "compound_se
336c0 6c 65 63 74 22 2c 20 20 20 20 20 20 20 53 51 4c  lect",       SQL
336d0 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55  ITE_LIMIT_COMPOU
336e0 4e 44 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20  ND_SELECT       
336f0 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
33700 76 64 62 65 5f 6f 70 22 2c 20 20 20 20 20 20 20  vdbe_op",       
33710 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
33720 49 4d 49 54 5f 56 44 42 45 5f 4f 50 20 20 20 20  IMIT_VDBE_OP    
33730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
33740 2c 0a 20 20 20 20 20 20 7b 20 22 66 75 6e 63 74  ,.      { "funct
33750 69 6f 6e 5f 61 72 67 22 2c 20 20 20 20 20 20 20  ion_arg",       
33760 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
33770 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 20 20 20  FUNCTION_ARG    
33780 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
33790 20 20 20 7b 20 22 61 74 74 61 63 68 65 64 22 2c     { "attached",
337a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
337b0 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43  LITE_LIMIT_ATTAC
337c0 48 45 44 20 20 20 20 20 20 20 20 20 20 20 20 20  HED             
337d0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
337e0 22 6c 69 6b 65 5f 70 61 74 74 65 72 6e 5f 6c 65  "like_pattern_le
337f0 6e 67 74 68 22 2c 20 20 20 53 51 4c 49 54 45 5f  ngth",   SQLITE_
33800 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45  LIMIT_LIKE_PATTE
33810 52 4e 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20  RN_LENGTH       
33820 7d 2c 0a 20 20 20 20 20 20 7b 20 22 76 61 72 69  },.      { "vari
33830 61 62 6c 65 5f 6e 75 6d 62 65 72 22 2c 20 20 20  able_number",   
33840 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
33850 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
33860 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
33870 20 20 20 20 7b 20 22 74 72 69 67 67 65 72 5f 64      { "trigger_d
33880 65 70 74 68 22 2c 20 20 20 20 20 20 20 20 20 53  epth",         S
33890 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47  QLITE_LIMIT_TRIG
338a0 47 45 52 5f 44 45 50 54 48 20 20 20 20 20 20 20  GER_DEPTH       
338b0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
338c0 20 22 77 6f 72 6b 65 72 5f 74 68 72 65 61 64 73   "worker_threads
338d0 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ",        SQLITE
338e0 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
338f0 52 45 41 44 53 20 20 20 20 20 20 20 20 20 20 20  READS           
33900 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69   },.    };.    i
33910 6e 74 20 69 2c 20 6e 32 3b 0a 20 20 20 20 6f 70  nt i, n2;.    op
33920 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
33930 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a   if( nArg==1 ){.
33940 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
33950 3c 41 72 72 61 79 53 69 7a 65 28 61 4c 69 6d 69  <ArraySize(aLimi
33960 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  t); i++){.      
33970 20 20 70 72 69 6e 74 66 28 22 25 32 30 73 20 25    printf("%20s %
33980 64 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e  d\n", aLimit[i].
33990 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20 20 20 20  zLimitName,.    
339a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
339b0 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20  e3_limit(p->db, 
339c0 61 4c 69 6d 69 74 5b 69 5d 2e 6c 69 6d 69 74 43  aLimit[i].limitC
339d0 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20  ode, -1));.     
339e0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
339f0 20 6e 41 72 67 3e 33 20 29 7b 0a 20 20 20 20 20   nArg>3 ){.     
33a00 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
33a10 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 69 6d  rr, "Usage: .lim
33a20 69 74 20 4e 41 4d 45 20 3f 4e 45 57 2d 56 41 4c  it NAME ?NEW-VAL
33a30 55 45 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  UE?\n");.      r
33a40 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
33a50 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
33a60 78 69 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  xit;.    }else{.
33a70 20 20 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74        int iLimit
33a80 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e 32 20   = -1;.      n2 
33a90 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67  = strlen30(azArg
33aa0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  [1]);.      for(
33ab0 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
33ac0 28 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a  (aLimit); i++){.
33ad0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
33ae0 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 61 4c 69  te3_strnicmp(aLi
33af0 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d  mit[i].zLimitNam
33b00 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 6e 32 29  e, azArg[1], n2)
33b10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
33b20 20 69 66 28 20 69 4c 69 6d 69 74 3c 30 20 29 7b   if( iLimit<0 ){
33b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4c 69  .            iLi
33b40 6d 69 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  mit = i;.       
33b50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33b60 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
33b70 66 28 73 74 64 65 72 72 2c 20 22 61 6d 62 69 67  f(stderr, "ambig
33b80 75 6f 75 73 20 6c 69 6d 69 74 3a 20 5c 22 25 73  uous limit: \"%s
33b90 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29  \"\n", azArg[1])
33ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
33bb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
33bc0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
33bd0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
33be0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
33bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
33c00 28 20 69 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20  ( iLimit<0 ){.  
33c10 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
33c20 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f  f(stderr, "unkno
33c30 77 6e 20 6c 69 6d 69 74 3a 20 5c 22 25 73 5c 22  wn limit: \"%s\"
33c40 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n".            
33c50 20 20 20 20 20 20 20 20 20 20 20 20 22 65 6e 74              "ent
33c60 65 72 20 5c 22 2e 6c 69 6d 69 74 73 5c 22 20 77  er \".limits\" w
33c70 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  ith no arguments
33c80 20 66 6f 72 20 61 20 6c 69 73 74 2e 5c 6e 22 2c   for a list.\n",
33c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33ca0 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
33cb0 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  1]);.        rc 
33cc0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
33cd0 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
33ce0 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xit;.      }.   
33cf0 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29     if( nArg==3 )
33d00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
33d10 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61  3_limit(p->db, a
33d20 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69  Limit[iLimit].li
33d30 6d 69 74 43 6f 64 65 2c 0a 20 20 20 20 20 20 20  mitCode,.       
33d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
33d50 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65  int)integerValue
33d60 28 61 7a 41 72 67 5b 32 5d 29 29 3b 0a 20 20 20  (azArg[2]));.   
33d70 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74     }.      print
33d80 66 28 22 25 32 30 73 20 25 64 5c 6e 22 2c 20 61  f("%20s %d\n", a
33d90 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 7a 4c  Limit[iLimit].zL
33da0 69 6d 69 74 4e 61 6d 65 2c 0a 20 20 20 20 20 20  imitName,.      
33db0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
33dc0 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d  imit(p->db, aLim
33dd0 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69 6d 69 74  it[iLimit].limit
33de0 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20  Code, -1));.    
33df0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
33e00 20 63 3d 3d 27 6c 27 20 26 26 20 6e 3e 32 20 26   c=='l' && n>2 &
33e10 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
33e20 30 5d 2c 20 22 6c 69 6e 74 22 2c 20 6e 29 3d 3d  0], "lint", n)==
33e30 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  0 ){.    open_db
33e40 28 70 2c 20 30 29 3b 0a 20 20 20 20 6c 69 6e 74  (p, 0);.    lint
33e50 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a  DotCommand(p, az
33e60 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65  Arg, nArg);.  }e
33e70 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  lse..#ifndef SQL
33e80 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
33e90 54 45 4e 53 49 4f 4e 0a 20 20 69 66 28 20 63 3d  TENSION.  if( c=
33ea0 3d 27 6c 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='l' && strncmp(
33eb0 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 61 64 22  azArg[0], "load"
33ec0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
33ed0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
33ee0 2c 20 2a 7a 50 72 6f 63 3b 0a 20 20 20 20 63 68  , *zProc;.    ch
33ef0 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
33f00 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20  .    if( nArg<2 
33f10 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
33f20 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
33f30 67 65 3a 20 2e 6c 6f 61 64 20 46 49 4c 45 20 3f  ge: .load FILE ?
33f40 45 4e 54 52 59 50 4f 49 4e 54 3f 5c 6e 22 29 3b  ENTRYPOINT?\n");
33f50 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
33f60 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
33f70 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
33f80 20 7d 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 61   }.    zFile = a
33f90 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a 50 72  zArg[1];.    zPr
33fa0 6f 63 20 3d 20 6e 41 72 67 3e 3d 33 20 3f 20 61  oc = nArg>=3 ? a
33fb0 7a 41 72 67 5b 32 5d 20 3a 20 30 3b 0a 20 20 20  zArg[2] : 0;.   
33fc0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
33fd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33fe0 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
33ff0 70 2d 3e 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50  p->db, zFile, zP
34000 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  roc, &zErrMsg);.
34010 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34020 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
34030 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
34040 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
34050 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
34060 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
34070 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72  ErrMsg);.      r
34080 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
34090 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69  else.#endif..  i
340a0 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 73 74 72  f( c=='l' && str
340b0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
340c0 6c 6f 67 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  log", n)==0 ){. 
340d0 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29     if( nArg!=2 )
340e0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
340f0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
34100 65 3a 20 2e 6c 6f 67 20 46 49 4c 45 4e 41 4d 45  e: .log FILENAME
34110 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
34120 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
34130 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
34140 2a 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31  *zFile = azArg[1
34150 5d 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f  ];.      output_
34160 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 70 4c  file_close(p->pL
34170 6f 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  og);.      p->pL
34180 6f 67 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65  og = output_file
34190 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 30 29 3b  _open(zFile, 0);
341a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
341b0 20 20 69 66 28 20 63 3d 3d 27 6d 27 20 26 26 20    if( c=='m' && 
341c0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
341d0 2c 20 22 6d 6f 64 65 22 2c 20 6e 29 3d 3d 30 20  , "mode", n)==0 
341e0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
341f0 72 20 2a 7a 4d 6f 64 65 20 3d 20 6e 41 72 67 3e  r *zMode = nArg>
34200 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20  =2 ? azArg[1] : 
34210 22 22 3b 0a 20 20 20 20 69 6e 74 20 6e 32 20 3d  "";.    int n2 =
34220 20 73 74 72 6c 65 6e 33 30 28 7a 4d 6f 64 65 29   strlen30(zMode)
34230 3b 0a 20 20 20 20 69 6e 74 20 63 32 20 3d 20 7a  ;.    int c2 = z
34240 4d 6f 64 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28  Mode[0];.    if(
34250 20 63 32 3d 3d 27 6c 27 20 26 26 20 6e 32 3e 32   c2=='l' && n2>2
34260 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
34270 67 5b 31 5d 2c 22 6c 69 6e 65 73 22 2c 6e 32 29  g[1],"lines",n2)
34280 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
34290 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65  mode = MODE_Line
342a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
342b0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
342c0 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
342d0 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
342e0 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20  r, SEP_Row);.   
342f0 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
34300 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  c' && strncmp(az
34310 41 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d 6e 73 22  Arg[1],"columns"
34320 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
34330 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
34340 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 73 71  Column;.      sq
34350 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
34360 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
34370 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65  rator), p->rowSe
34380 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77  parator, SEP_Row
34390 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
343a0 20 63 32 3d 3d 27 6c 27 20 26 26 20 6e 32 3e 32   c2=='l' && n2>2
343b0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
343c0 67 5b 31 5d 2c 22 6c 69 73 74 22 2c 6e 32 29 3d  g[1],"list",n2)=
343d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
343e0 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b  ode = MODE_List;
343f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
34400 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
34410 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c  ->colSeparator),
34420 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
34430 2c 20 53 45 50 5f 43 6f 6c 75 6d 6e 29 3b 0a 20  , SEP_Column);. 
34440 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
34450 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
34460 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70  rowSeparator), p
34470 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
34480 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65  SEP_Row);.    }e
34490 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 68 27 20  lse if( c2=='h' 
344a0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
344b0 5b 31 5d 2c 22 68 74 6d 6c 22 2c 6e 32 29 3d 3d  [1],"html",n2)==
344c0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
344d0 64 65 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a  de = MODE_Html;.
344e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
344f0 3d 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d 70  =='t' && strncmp
34500 28 61 7a 41 72 67 5b 31 5d 2c 22 74 63 6c 22 2c  (azArg[1],"tcl",
34510 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
34520 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 54  p->mode = MODE_T
34530 63 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  cl;.      sqlite
34540 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
34550 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  f(p->colSeparato
34560 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  r), p->colSepara
34570 74 6f 72 2c 20 53 45 50 5f 53 70 61 63 65 29 3b  tor, SEP_Space);
34580 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
34590 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
345a0 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c  ->rowSeparator),
345b0 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
345c0 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20  , SEP_Row);.    
345d0 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 63  }else if( c2=='c
345e0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
345f0 72 67 5b 31 5d 2c 22 63 73 76 22 2c 6e 32 29 3d  rg[1],"csv",n2)=
34600 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
34610 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a  ode = MODE_Csv;.
34620 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
34630 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
34640 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20  >colSeparator), 
34650 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
34660 20 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a 20 20 20   SEP_Comma);.   
34670 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
34680 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f  ntf(sizeof(p->ro
34690 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  wSeparator), p->
346a0 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45  rowSeparator, SE
346b0 50 5f 43 72 4c 66 29 3b 0a 20 20 20 20 7d 65 6c  P_CrLf);.    }el
346c0 73 65 20 69 66 28 20 63 32 3d 3d 27 74 27 20 26  se if( c2=='t' &
346d0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
346e0 31 5d 2c 22 74 61 62 73 22 2c 6e 32 29 3d 3d 30  1],"tabs",n2)==0
346f0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
34700 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20  e = MODE_List;. 
34710 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
34720 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
34730 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70  colSeparator), p
34740 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20  ->colSeparator, 
34750 53 45 50 5f 54 61 62 29 3b 0a 20 20 20 20 7d 65  SEP_Tab);.    }e
34760 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 69 27 20  lse if( c2=='i' 
34770 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
34780 5b 31 5d 2c 22 69 6e 73 65 72 74 22 2c 6e 32 29  [1],"insert",n2)
34790 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
347a0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65  mode = MODE_Inse
347b0 72 74 3b 0a 20 20 20 20 20 20 73 65 74 5f 74 61  rt;.      set_ta
347c0 62 6c 65 5f 6e 61 6d 65 28 70 2c 20 6e 41 72 67  ble_name(p, nArg
347d0 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a  >=3 ? azArg[2] :
347e0 20 22 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 7d   "table");.    }
347f0 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 71 27  else if( c2=='q'
34800 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
34810 67 5b 31 5d 2c 22 71 75 6f 74 65 22 2c 6e 32 29  g[1],"quote",n2)
34820 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
34830 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 51 75 6f 74  mode = MODE_Quot
34840 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  e;.    }else if(
34850 20 63 32 3d 3d 27 61 27 20 26 26 20 73 74 72 6e   c2=='a' && strn
34860 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61 73  cmp(azArg[1],"as
34870 63 69 69 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  cii",n2)==0 ){. 
34880 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
34890 4f 44 45 5f 41 73 63 69 69 3b 0a 20 20 20 20 20  ODE_Ascii;.     
348a0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
348b0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53  f(sizeof(p->colS
348c0 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f  eparator), p->co
348d0 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  lSeparator, SEP_
348e0 55 6e 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Unit);.      sql
348f0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
34900 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
34910 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70  ator), p->rowSep
34920 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 65 63 6f  arator, SEP_Reco
34930 72 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  rd);.    }else i
34940 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20  f( nArg==1 ){.  
34950 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
34960 2d 3e 6f 75 74 2c 20 22 63 75 72 72 65 6e 74 20  ->out, "current 
34970 6f 75 74 70 75 74 20 6d 6f 64 65 3a 20 25 73 5c  output mode: %s\
34980 6e 22 2c 20 6d 6f 64 65 44 65 73 63 72 5b 70 2d  n", modeDescr[p-
34990 3e 6d 6f 64 65 5d 29 3b 0a 20 20 20 20 7d 65 6c  >mode]);.    }el
349a0 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
349b0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
349c0 72 6f 72 3a 20 6d 6f 64 65 20 73 68 6f 75 6c 64  ror: mode should
349d0 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20   be one of: ".  
349e0 20 20 20 20 20 20 20 22 61 73 63 69 69 20 63 6f         "ascii co
349f0 6c 75 6d 6e 20 63 73 76 20 68 74 6d 6c 20 69 6e  lumn csv html in
34a00 73 65 72 74 20 6c 69 6e 65 20 6c 69 73 74 20 71  sert line list q
34a10 75 6f 74 65 20 74 61 62 73 20 74 63 6c 5c 6e 22  uote tabs tcl\n"
34a20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
34a30 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 63 4d  .    }.    p->cM
34a40 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ode = p->mode;. 
34a50 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
34a60 3d 27 6e 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='n' && strncmp(
34a70 61 7a 41 72 67 5b 30 5d 2c 20 22 6e 75 6c 6c 76  azArg[0], "nullv
34a80 61 6c 75 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  alue", n)==0 ){.
34a90 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
34aa0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
34ab0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
34ac0 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 2c 20  (p->nullValue), 
34ad0 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c 0a 20 20  p->nullValue,.  
34ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34af0 20 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e       "%.*s", (in
34b00 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 6e  t)ArraySize(p->n
34b10 75 6c 6c 56 61 6c 75 65 29 2d 31 2c 20 61 7a 41  ullValue)-1, azA
34b20 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  rg[1]);.    }els
34b30 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
34b40 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
34b50 67 65 3a 20 2e 6e 75 6c 6c 76 61 6c 75 65 20 53  ge: .nullvalue S
34b60 54 52 49 4e 47 5c 6e 22 29 3b 0a 20 20 20 20 20  TRING\n");.     
34b70 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
34b80 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
34b90 3d 27 6f 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='o' && strncmp(
34ba0 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 70 65 6e 22  azArg[0], "open"
34bb0 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d 32 20  , n)==0 && n>=2 
34bc0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65  ){.    char *zNe
34bd0 77 46 69 6c 65 6e 61 6d 65 3b 20 20 2f 2a 20 4e  wFilename;  /* N
34be0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
34bf0 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
34c00 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4e 61 6d   */.    int iNam
34c10 65 20 3d 20 31 3b 20 20 20 20 20 20 20 2f 2a 20  e = 1;       /* 
34c20 49 6e 64 65 78 20 69 6e 20 61 7a 41 72 67 5b 5d  Index in azArg[]
34c30 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   of the filename
34c40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 77 46   */.    int newF
34c50 6c 61 67 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  lag = 0;     /* 
34c60 54 72 75 65 20 74 6f 20 64 65 6c 65 74 65 20 66  True to delete f
34c70 69 6c 65 20 62 65 66 6f 72 65 20 6f 70 65 6e 69  ile before openi
34c80 6e 67 20 2a 2f 0a 20 20 20 20 2f 2a 20 43 6c 6f  ng */.    /* Clo
34c90 73 65 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  se the existing 
34ca0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
34cb0 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c  session_close_al
34cc0 6c 28 70 29 3b 0a 20 20 20 20 63 6c 6f 73 65 5f  l(p);.    close_
34cd0 64 62 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70  db(p->db);.    p
34ce0 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 20 20 70 2d  ->db = 0;.    p-
34cf0 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20 30  >zDbFilename = 0
34d00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
34d10 65 65 28 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f  ee(p->zFreeOnClo
34d20 73 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 46 72 65  se);.    p->zFre
34d30 65 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b 0a 20 20  eOnClose = 0;.  
34d40 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20    p->openMode = 
34d50 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45  SHELL_OPEN_UNSPE
34d60 43 3b 0a 20 20 20 20 70 2d 3e 73 7a 4d 61 78 20  C;.    p->szMax 
34d70 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 43 68 65 63  = 0;.    /* Chec
34d80 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 2d 6c 69  k for command-li
34d90 6e 65 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  ne arguments */.
34da0 20 20 20 20 66 6f 72 28 69 4e 61 6d 65 3d 31 3b      for(iName=1;
34db0 20 69 4e 61 6d 65 3c 6e 41 72 67 20 26 26 20 61   iName<nArg && a
34dc0 7a 41 72 67 5b 69 4e 61 6d 65 5d 5b 30 5d 3d 3d  zArg[iName][0]==
34dd0 27 2d 27 3b 20 69 4e 61 6d 65 2b 2b 29 7b 0a 20  '-'; iName++){. 
34de0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
34df0 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 4e 61 6d 65  *z = azArg[iName
34e00 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 74  ];.      if( opt
34e10 69 6f 6e 4d 61 74 63 68 28 7a 2c 22 6e 65 77 22  ionMatch(z,"new"
34e20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77  ) ){.        new
34e30 46 6c 61 67 20 3d 20 31 3b 0a 23 69 66 64 65 66  Flag = 1;.#ifdef
34e40 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49   SQLITE_HAVE_ZLI
34e50 42 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  B.      }else if
34e60 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c  ( optionMatch(z,
34e70 20 22 7a 69 70 22 29 20 29 7b 0a 20 20 20 20 20   "zip") ){.     
34e80 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d     p->openMode =
34e90 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46   SHELL_OPEN_ZIPF
34ea0 49 4c 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ILE;.#endif.    
34eb0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69    }else if( opti
34ec0 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 61 70 70 65  onMatch(z, "appe
34ed0 6e 64 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nd") ){.        
34ee0 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48  p->openMode = SH
34ef0 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56  ELL_OPEN_APPENDV
34f00 46 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  FS;.      }else 
34f10 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28  if( optionMatch(
34f20 7a 2c 20 22 72 65 61 64 6f 6e 6c 79 22 29 20 29  z, "readonly") )
34f30 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65  {.        p->ope
34f40 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50  nMode = SHELL_OP
34f50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 69 66  EN_READONLY;.#if
34f60 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
34f70 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a 20 20  E_DESERIALIZE.  
34f80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
34f90 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 64 65  tionMatch(z, "de
34fa0 73 65 72 69 61 6c 69 7a 65 22 29 20 29 7b 0a 20  serialize") ){. 
34fb0 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f         p->openMo
34fc0 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  de = SHELL_OPEN_
34fd0 44 45 53 45 52 49 41 4c 49 5a 45 3b 0a 20 20 20  DESERIALIZE;.   
34fe0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 74     }else if( opt
34ff0 69 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 68 65 78  ionMatch(z, "hex
35000 64 62 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20  db") ){.        
35010 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48  p->openMode = SH
35020 45 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44 42 3b 0a  ELL_OPEN_HEXDB;.
35030 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
35040 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20 22  optionMatch(z, "
35050 6d 61 78 73 69 7a 65 22 29 20 26 26 20 69 4e 61  maxsize") && iNa
35060 6d 65 2b 31 3c 6e 41 72 67 20 29 7b 0a 20 20 20  me+1<nArg ){.   
35070 20 20 20 20 20 70 2d 3e 73 7a 4d 61 78 20 3d 20       p->szMax = 
35080 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41  integerValue(azA
35090 72 67 5b 2b 2b 69 4e 61 6d 65 5d 29 3b 0a 23 65  rg[++iName]);.#e
350a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
350b0 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a  NABLE_DESERIALIZ
350c0 45 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  E */.      }else
350d0 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29   if( z[0]=='-' )
350e0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
350f0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
35100 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25  nknown option: %
35110 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  s\n", z);.      
35120 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
35130 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
35140 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
35150 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  }.    }.    /* I
35160 66 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  f a filename is 
35170 73 70 65 63 69 66 69 65 64 2c 20 74 72 79 20 74  specified, try t
35180 6f 20 6f 70 65 6e 20 69 74 20 66 69 72 73 74 20  o open it first 
35190 2a 2f 0a 20 20 20 20 7a 4e 65 77 46 69 6c 65 6e  */.    zNewFilen
351a0 61 6d 65 20 3d 20 6e 41 72 67 3e 69 4e 61 6d 65  ame = nArg>iName
351b0 20 3f 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   ? sqlite3_mprin
351c0 74 66 28 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  tf("%s", azArg[i
351d0 4e 61 6d 65 5d 29 20 3a 20 30 3b 0a 20 20 20 20  Name]) : 0;.    
351e0 69 66 28 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65  if( zNewFilename
351f0 20 7c 7c 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d   || p->openMode=
35200 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44  =SHELL_OPEN_HEXD
35210 42 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  B ){.      if( n
35220 65 77 46 6c 61 67 20 29 20 73 68 65 6c 6c 44 65  ewFlag ) shellDe
35230 6c 65 74 65 46 69 6c 65 28 7a 4e 65 77 46 69 6c  leteFile(zNewFil
35240 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d  ename);.      p-
35250 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20 7a  >zDbFilename = z
35260 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  NewFilename;.   
35270 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 4f 50     open_db(p, OP
35280 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45 29  EN_DB_KEEPALIVE)
35290 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 64  ;.      if( p->d
352a0 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
352b0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
352c0 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rr, "Error: cann
352d0 6f 74 20 6f 70 65 6e 20 27 25 73 27 5c 6e 22 2c  ot open '%s'\n",
352e0 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a   zNewFilename);.
352f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
35300 66 72 65 65 28 7a 4e 65 77 46 69 6c 65 6e 61 6d  free(zNewFilenam
35310 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
35320 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 72 65  .        p->zFre
35330 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 4e 65 77 46  eOnClose = zNewF
35340 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ilename;.      }
35350 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
35360 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->db==0 ){.     
35370 20 2f 2a 20 41 73 20 61 20 66 61 6c 6c 2d 62 61   /* As a fall-ba
35380 63 6b 20 6f 70 65 6e 20 61 20 54 45 4d 50 20 64  ck open a TEMP d
35390 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
353a0 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20   p->zDbFilename 
353b0 3d 20 30 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f  = 0;.      open_
353c0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  db(p, 0);.    }.
353d0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 28    }else..  if( (
353e0 63 3d 3d 27 6f 27 0a 20 20 20 20 20 20 20 20 26  c=='o'.        &
353f0 26 20 28 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  & (strncmp(azArg
35400 5b 30 5d 2c 20 22 6f 75 74 70 75 74 22 2c 20 6e  [0], "output", n
35410 29 3d 3d 30 7c 7c 73 74 72 6e 63 6d 70 28 61 7a  )==0||strncmp(az
35420 41 72 67 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c 20  Arg[0], "once", 
35430 6e 29 3d 3d 30 29 29 0a 20 20 20 7c 7c 20 28 63  n)==0)).   || (c
35440 3d 3d 27 65 27 20 26 26 20 6e 3d 3d 35 20 26 26  =='e' && n==5 &&
35450 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 30 5d   strcmp(azArg[0]
35460 2c 22 65 78 63 65 6c 22 29 3d 3d 30 29 0a 20 20  ,"excel")==0).  
35470 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
35480 72 20 2a 7a 46 69 6c 65 20 3d 20 6e 41 72 67 3e  r *zFile = nArg>
35490 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20  =2 ? azArg[1] : 
354a0 22 73 74 64 6f 75 74 22 3b 0a 20 20 20 20 69 6e  "stdout";.    in
354b0 74 20 62 54 78 74 4d 6f 64 65 20 3d 20 30 3b 0a  t bTxtMode = 0;.
354c0 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 30 5d      if( azArg[0]
354d0 5b 30 5d 3d 3d 27 65 27 20 29 7b 0a 20 20 20 20  [0]=='e' ){.    
354e0 20 20 2f 2a 20 54 72 61 6e 73 66 6f 72 6d 20 74    /* Transform t
354f0 68 65 20 22 2e 65 78 63 65 6c 22 20 63 6f 6d 6d  he ".excel" comm
35500 61 6e 64 20 69 6e 74 6f 20 22 2e 6f 6e 63 65 20  and into ".once 
35510 2d 78 22 20 2a 2f 0a 20 20 20 20 20 20 6e 41 72  -x" */.      nAr
35520 67 20 3d 20 32 3b 0a 20 20 20 20 20 20 61 7a 41  g = 2;.      azA
35530 72 67 5b 30 5d 20 3d 20 22 6f 6e 63 65 22 3b 0a  rg[0] = "once";.
35540 20 20 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a        zFile = az
35550 41 72 67 5b 31 5d 20 3d 20 22 2d 78 22 3b 0a 20  Arg[1] = "-x";. 
35560 20 20 20 20 20 6e 20 3d 20 34 3b 0a 20 20 20 20       n = 4;.    
35570 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 32  }.    if( nArg>2
35580 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
35590 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
355a0 73 61 67 65 3a 20 2e 25 73 20 5b 2d 65 7c 2d 78  sage: .%s [-e|-x
355b0 7c 46 49 4c 45 5d 5c 6e 22 2c 20 61 7a 41 72 67  |FILE]\n", azArg
355c0 5b 30 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  [0]);.      rc =
355d0 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
355e0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
355f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
35600 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61  n>1 && strncmp(a
35610 7a 41 72 67 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c  zArg[0], "once",
35620 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   n)==0 ){.      
35630 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20  if( nArg<2 ){.  
35640 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
35650 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
35660 20 2e 6f 6e 63 65 20 28 2d 65 7c 2d 78 7c 46 49   .once (-e|-x|FI
35670 4c 45 29 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  LE)\n");.       
35680 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
35690 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
356a0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
356b0 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75  .      p->outCou
356c0 6e 74 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73  nt = 2;.    }els
356d0 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 43  e{.      p->outC
356e0 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ount = 0;.    }.
356f0 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74      output_reset
35700 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  (p);.    if( zFi
35710 6c 65 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 46  le[0]=='-' && zF
35720 69 6c 65 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 46  ile[1]=='-' ) zF
35730 69 6c 65 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53  ile++;.#ifndef S
35740 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53  QLITE_NOHAVE_SYS
35750 54 45 4d 0a 20 20 20 20 69 66 28 20 73 74 72 63  TEM.    if( strc
35760 6d 70 28 7a 46 69 6c 65 2c 20 22 2d 65 22 29 3d  mp(zFile, "-e")=
35770 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 46 69  =0 || strcmp(zFi
35780 6c 65 2c 20 22 2d 78 22 29 3d 3d 30 20 29 7b 0a  le, "-x")==0 ){.
35790 20 20 20 20 20 20 70 2d 3e 64 6f 58 64 67 4f 70        p->doXdgOp
357a0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 6f 75  en = 1;.      ou
357b0 74 70 75 74 4d 6f 64 65 50 75 73 68 28 70 29 3b  tputModePush(p);
357c0 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65  .      if( zFile
357d0 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20  [1]=='x' ){.    
357e0 20 20 20 20 6e 65 77 54 65 6d 70 46 69 6c 65 28      newTempFile(
357f0 70 2c 20 22 63 73 76 22 29 3b 0a 20 20 20 20 20  p, "csv");.     
35800 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
35810 45 5f 43 73 76 3b 0a 20 20 20 20 20 20 20 20 73  E_Csv;.        s
35820 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
35830 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70  sizeof(p->colSep
35840 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53  arator), p->colS
35850 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f  eparator, SEP_Co
35860 6d 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 73 71  mma);.        sq
35870 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
35880 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
35890 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65  rator), p->rowSe
358a0 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c  parator, SEP_CrL
358b0 66 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  f);.      }else{
358c0 0a 20 20 20 20 20 20 20 20 6e 65 77 54 65 6d 70  .        newTemp
358d0 46 69 6c 65 28 70 2c 20 22 74 78 74 22 29 3b 0a  File(p, "txt");.
358e0 20 20 20 20 20 20 20 20 62 54 78 74 4d 6f 64 65          bTxtMode
358f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
35900 20 20 20 20 7a 46 69 6c 65 20 3d 20 70 2d 3e 7a      zFile = p->z
35910 54 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 7d 0a  TempFile;.    }.
35920 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
35930 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 20 2a  _NOHAVE_SYSTEM *
35940 2f 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b  /.    if( zFile[
35950 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 64 65  0]=='|' ){.#ifde
35960 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f  f SQLITE_OMIT_PO
35970 50 45 4e 0a 20 20 20 20 20 20 72 61 77 5f 70 72  PEN.      raw_pr
35980 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
35990 72 6f 72 3a 20 70 69 70 65 73 20 61 72 65 20 6e  ror: pipes are n
359a0 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20  ot supported in 
359b0 74 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20 20 20  this OS\n");.   
359c0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
359d0 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74   p->out = stdout
359e0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 2d  ;.#else.      p-
359f0 3e 6f 75 74 20 3d 20 70 6f 70 65 6e 28 7a 46 69  >out = popen(zFi
35a00 6c 65 20 2b 20 31 2c 20 22 77 22 29 3b 0a 20 20  le + 1, "w");.  
35a10 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d 3d      if( p->out==
35a20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
35a30 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
35a40 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
35a50 70 65 6e 20 70 69 70 65 20 5c 22 25 73 5c 22 5c  pen pipe \"%s\"\
35a60 6e 22 2c 20 7a 46 69 6c 65 20 2b 20 31 29 3b 0a  n", zFile + 1);.
35a70 20 20 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d          p->out =
35a80 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 20   stdout;.       
35a90 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
35aa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
35ab0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
35ac0 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65  izeof(p->outfile
35ad0 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22  ), p->outfile, "
35ae0 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20  %s", zFile);.   
35af0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
35b00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
35b10 6f 75 74 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c  out = output_fil
35b20 65 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 62 54  e_open(zFile, bT
35b30 78 74 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 69  xtMode);.      i
35b40 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a  f( p->out==0 ){.
35b50 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
35b60 6d 70 28 7a 46 69 6c 65 2c 22 6f 66 66 22 29 21  mp(zFile,"off")!
35b70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
35b80 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
35b90 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  rr,"Error: canno
35ba0 74 20 77 72 69 74 65 20 74 6f 20 5c 22 25 73 5c  t write to \"%s\
35bb0 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  "\n", zFile);.  
35bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35bd0 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b  p->out = stdout;
35be0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
35bf0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
35c00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
35c10 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
35c20 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e  p->outfile), p->
35c30 6f 75 74 66 69 6c 65 2c 20 22 25 73 22 2c 20 7a  outfile, "%s", z
35c40 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  File);.      }. 
35c50 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
35c60 69 66 28 20 63 3d 3d 27 70 27 20 26 26 20 6e 3e  if( c=='p' && n>
35c70 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
35c80 41 72 67 5b 30 5d 2c 20 22 70 72 69 6e 74 22 2c  Arg[0], "print",
35c90 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e   n)==0 ){.    in
35ca0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  t i;.    for(i=1
35cb0 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
35cc0 20 20 20 20 20 20 69 66 28 20 69 3e 31 20 29 20        if( i>1 ) 
35cd0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
35ce0 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 20 20 75  t, " ");.      u
35cf0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
35d00 74 2c 20 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  t, "%s", azArg[i
35d10 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61  ]);.    }.    ra
35d20 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
35d30 20 22 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 0a   "\n");.  }else.
35d40 0a 20 20 69 66 28 20 63 3d 3d 27 70 27 20 26 26  .  if( c=='p' &&
35d50 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
35d60 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70 72 6f 67  (azArg[0], "prog
35d70 72 65 73 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  ress", n)==0 ){.
35d80 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
35d90 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 70 2d  nt n = 0;.    p-
35da0 3e 66 6c 67 50 72 6f 67 72 65 73 73 20 3d 20 30  >flgProgress = 0
35db0 3b 0a 20 20 20 20 70 2d 3e 6d 78 50 72 6f 67 72  ;.    p->mxProgr
35dc0 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ess = 0;.    p->
35dd0 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  nProgress = 0;. 
35de0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41     for(i=1; i<nA
35df0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
35e00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
35e10 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
35e20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b  if( z[0]=='-' ){
35e30 0a 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20  .        z++;.  
35e40 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
35e50 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20  '-' ) z++;.     
35e60 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
35e70 22 71 75 69 65 74 22 29 3d 3d 30 20 7c 7c 20 73  "quiet")==0 || s
35e80 74 72 63 6d 70 28 7a 2c 22 71 22 29 3d 3d 30 20  trcmp(z,"q")==0 
35e90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
35ea0 66 6c 67 50 72 6f 67 72 65 73 73 20 7c 3d 20 50  flgProgress |= P
35eb0 52 4f 47 52 45 53 53 5f 51 55 49 45 54 3b 0a 20  ROGRESS_QUIET;. 
35ec0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
35ed0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
35ee0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
35ef0 7a 2c 22 72 65 73 65 74 22 29 3d 3d 30 20 29 7b  z,"reset")==0 ){
35f00 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 66 6c  .          p->fl
35f10 67 50 72 6f 67 72 65 73 73 20 7c 3d 20 50 52 4f  gProgress |= PRO
35f20 47 52 45 53 53 5f 52 45 53 45 54 3b 0a 20 20 20  GRESS_RESET;.   
35f30 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
35f40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35f50 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
35f60 22 6f 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  "once")==0 ){.  
35f70 20 20 20 20 20 20 20 20 70 2d 3e 66 6c 67 50 72          p->flgPr
35f80 6f 67 72 65 73 73 20 7c 3d 20 50 52 4f 47 52 45  ogress |= PROGRE
35f90 53 53 5f 4f 4e 43 45 3b 0a 20 20 20 20 20 20 20  SS_ONCE;.       
35fa0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
35fb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
35fc0 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6c 69 6d  f( strcmp(z,"lim
35fd0 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  it")==0 ){.     
35fe0 20 20 20 20 20 69 66 28 20 69 2b 31 3e 3d 6e 41       if( i+1>=nA
35ff0 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rg ){.          
36000 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
36010 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 69  derr, "Error: mi
36020 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f  ssing argument o
36030 6e 20 2d 2d 6c 69 6d 69 74 5c 6e 22 29 3b 0a 20  n --limit\n");. 
36040 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
36050 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  1;.            g
36060 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
36070 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
36080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
36090 20 20 20 20 70 2d 3e 6d 78 50 72 6f 67 72 65 73      p->mxProgres
360a0 73 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72  s = (int)integer
360b0 56 61 6c 75 65 28 61 7a 41 72 67 5b 2b 2b 69 5d  Value(azArg[++i]
360c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
360d0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
360e0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
360f0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
36100 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
36110 20 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a   unknown option:
36120 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
36130 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  g[i]);.        r
36140 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
36150 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
36160 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c  _exit;.      }el
36170 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20  se{.        n = 
36180 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75  (int)integerValu
36190 65 28 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e(z);.      }.  
361a0 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28    }.    open_db(
361b0 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, 0);.    sqlit
361c0 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
361d0 6c 65 72 28 70 2d 3e 64 62 2c 20 6e 2c 20 70 72  ler(p->db, n, pr
361e0 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 2c 20  ogress_handler, 
361f0 70 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  p);.  }else..  i
36200 66 28 20 63 3d 3d 27 70 27 20 26 26 20 73 74 72  f( c=='p' && str
36210 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
36220 70 72 6f 6d 70 74 22 2c 20 6e 29 3d 3d 30 20 29  prompt", n)==0 )
36230 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 20 3e  {.    if( nArg >
36240 3d 20 32 29 20 7b 0a 20 20 20 20 20 20 73 74 72  = 2) {.      str
36250 6e 63 70 79 28 6d 61 69 6e 50 72 6f 6d 70 74 2c  ncpy(mainPrompt,
36260 61 7a 41 72 67 5b 31 5d 2c 28 69 6e 74 29 41 72  azArg[1],(int)Ar
36270 72 61 79 53 69 7a 65 28 6d 61 69 6e 50 72 6f 6d  raySize(mainProm
36280 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  pt)-1);.    }.  
36290 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 33 29    if( nArg >= 3)
362a0 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79   {.      strncpy
362b0 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 2c  (continuePrompt,
362c0 61 7a 41 72 67 5b 32 5d 2c 28 69 6e 74 29 41 72  azArg[2],(int)Ar
362d0 72 61 79 53 69 7a 65 28 63 6f 6e 74 69 6e 75 65  raySize(continue
362e0 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20  Prompt)-1);.    
362f0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
36300 20 63 3d 3d 27 71 27 20 26 26 20 73 74 72 6e 63   c=='q' && strnc
36310 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 71 75  mp(azArg[0], "qu
36320 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  it", n)==0 ){.  
36330 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73    rc = 2;.  }els
36340 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72 27 20  e..  if( c=='r' 
36350 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
36360 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65  mp(azArg[0], "re
36370 61 64 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ad", n)==0 ){.  
36380 20 20 46 49 4c 45 20 2a 69 6e 53 61 76 65 64 20    FILE *inSaved 
36390 3d 20 70 2d 3e 69 6e 3b 0a 20 20 20 20 69 6e 74  = p->in;.    int
363a0 20 73 61 76 65 64 4c 69 6e 65 6e 6f 20 3d 20 70   savedLineno = p
363b0 2d 3e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 69 66  ->lineno;.    if
363c0 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20  ( nArg!=2 ){.   
363d0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
363e0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 72  derr, "Usage: .r
363f0 65 61 64 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20  ead FILE\n");.  
36400 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
36410 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
36420 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
36430 20 20 20 20 70 2d 3e 69 6e 20 3d 20 66 6f 70 65      p->in = fope
36440 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 72 62 22  n(azArg[1], "rb"
36450 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  );.    if( p->in
36460 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
36470 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
36480 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
36490 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61  pen \"%s\"\n", a
364a0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
364b0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
364c0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72  e{.      rc = pr
364d0 6f 63 65 73 73 5f 69 6e 70 75 74 28 70 29 3b 0a  ocess_input(p);.
364e0 20 20 20 20 20 20 66 63 6c 6f 73 65 28 70 2d 3e        fclose(p->
364f0 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  in);.    }.    p
36500 2d 3e 69 6e 20 3d 20 69 6e 53 61 76 65 64 3b 0a  ->in = inSaved;.
36510 20 20 20 20 70 2d 3e 6c 69 6e 65 6e 6f 20 3d 20      p->lineno = 
36520 73 61 76 65 64 4c 69 6e 65 6e 6f 3b 0a 20 20 7d  savedLineno;.  }
36530 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
36540 72 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  r' && n>=3 && st
36550 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
36560 22 72 65 73 74 6f 72 65 22 2c 20 6e 29 3d 3d 30  "restore", n)==0
36570 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
36580 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20  ar *zSrcFile;.  
36590 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
365a0 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  b;.    sqlite3 *
365b0 70 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65  pSrc;.    sqlite
365c0 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
365d0 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d 65  p;.    int nTime
365e0 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  out = 0;..    if
365f0 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
36600 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 61 7a     zSrcFile = az
36610 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 7a 44  Arg[1];.      zD
36620 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20  b = "main";.    
36630 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d 3d  }else if( nArg==
36640 33 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 46  3 ){.      zSrcF
36650 69 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a  ile = azArg[2];.
36660 20 20 20 20 20 20 7a 44 62 20 3d 20 61 7a 41 72        zDb = azAr
36670 67 5b 31 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  g[1];.    }else{
36680 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
36690 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
366a0 3a 20 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f 20  : .restore ?DB? 
366b0 46 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20  FILE\n");.      
366c0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
366d0 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
366e0 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
366f0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
36700 6e 28 7a 53 72 63 46 69 6c 65 2c 20 26 70 53 72  n(zSrcFile, &pSr
36710 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  c);.    if( rc!=
36720 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36730 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
36740 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63  tderr, "Error: c
36750 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
36760 22 5c 6e 22 2c 20 7a 53 72 63 46 69 6c 65 29 3b  "\n", zSrcFile);
36770 0a 20 20 20 20 20 20 63 6c 6f 73 65 5f 64 62 28  .      close_db(
36780 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  pSrc);.      ret
36790 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
367a0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
367b0 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71      pBackup = sq
367c0 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69  lite3_backup_ini
367d0 74 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 70 53  t(p->db, zDb, pS
367e0 72 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20  rc, "main");.   
367f0 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20   if( pBackup==0 
36800 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
36810 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
36820 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
36830 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
36840 29 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 5f  ));.      close_
36850 64 62 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20  db(pSrc);.      
36860 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
36870 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d      while( (rc =
36880 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
36890 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30  step(pBackup,100
368a0 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ))==SQLITE_OK.  
368b0 20 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53          || rc==S
368c0 51 4c 49 54 45 5f 42 55 53 59 20 20 29 7b 0a 20  QLITE_BUSY  ){. 
368d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
368e0 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
368f0 20 20 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74      if( nTimeout
36900 2b 2b 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b  ++ >= 3 ) break;
36910 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
36920 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20  _sleep(100);.   
36930 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
36940 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69  qlite3_backup_fi
36950 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20  nish(pBackup);. 
36960 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36970 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
36980 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  rc = 0;.    }els
36990 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
369a0 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c  _BUSY || rc==SQL
369b0 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  ITE_LOCKED ){.  
369c0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
369d0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 73  tderr, "Error: s
369e0 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20 69  ource database i
369f0 73 20 62 75 73 79 5c 6e 22 29 3b 0a 20 20 20 20  s busy\n");.    
36a00 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65    rc = 1;.    }e
36a10 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  lse{.      utf8_
36a20 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
36a30 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
36a40 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
36a50 64 62 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  db));.      rc =
36a60 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c   1;.    }.    cl
36a70 6f 73 65 5f 64 62 28 70 53 72 63 29 3b 0a 20 20  ose_db(pSrc);.  
36a80 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
36a90 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
36aa0 7a 41 72 67 5b 30 5d 2c 20 22 73 63 61 6e 73 74  zArg[0], "scanst
36ab0 61 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ats", n)==0 ){. 
36ac0 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
36ad0 7b 0a 20 20 20 20 20 20 70 2d 3e 73 63 61 6e 73  {.      p->scans
36ae0 74 61 74 73 4f 6e 20 3d 20 28 75 38 29 62 6f 6f  tatsOn = (u8)boo
36af0 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
36b00 31 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  1]);.#ifndef SQL
36b10 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
36b20 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 20  SCANSTATUS.     
36b30 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
36b40 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20 2e 73  rr, "Warning: .s
36b50 63 61 6e 73 74 61 74 73 20 6e 6f 74 20 61 76 61  canstats not ava
36b60 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
36b70 75 69 6c 64 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69  uild.\n");.#endi
36b80 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
36b90 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
36ba0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73  derr, "Usage: .s
36bb0 63 61 6e 73 74 61 74 73 20 6f 6e 7c 6f 66 66 5c  canstats on|off\
36bc0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
36bd0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
36be0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ..  if( c=='s' &
36bf0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
36c00 30 5d 2c 20 22 73 63 68 65 6d 61 22 2c 20 6e 29  0], "schema", n)
36c10 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  ==0 ){.    Shell
36c20 54 65 78 74 20 73 53 65 6c 65 63 74 3b 0a 20 20  Text sSelect;.  
36c30 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74    ShellState dat
36c40 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  a;.    char *zEr
36c50 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 63 6f  rMsg = 0;.    co
36c60 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 76 20 3d  nst char *zDiv =
36c70 20 22 28 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20   "(";.    const 
36c80 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
36c90 0a 20 20 20 20 69 6e 74 20 69 53 63 68 65 6d 61  .    int iSchema
36ca0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 62 44   = 0;.    int bD
36cb0 65 62 75 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ebug = 0;.    in
36cc0 74 20 69 69 3b 0a 0a 20 20 20 20 6f 70 65 6e 5f  t ii;..    open_
36cd0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65  db(p, 0);.    me
36ce0 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73  mcpy(&data, p, s
36cf0 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20  izeof(data));.  
36d00 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65    data.showHeade
36d10 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e  r = 0;.    data.
36d20 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64  cMode = data.mod
36d30 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20  e = MODE_Semi;. 
36d40 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 53 65     initText(&sSe
36d50 6c 65 63 74 29 3b 0a 20 20 20 20 66 6f 72 28 69  lect);.    for(i
36d60 69 3d 31 3b 20 69 69 3c 6e 41 72 67 3b 20 69 69  i=1; ii<nArg; ii
36d70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  ++){.      if( o
36d80 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72 67  ptionMatch(azArg
36d90 5b 69 69 5d 2c 22 69 6e 64 65 6e 74 22 29 20 29  [ii],"indent") )
36da0 7b 0a 20 20 20 20 20 20 20 20 64 61 74 61 2e 63  {.        data.c
36db0 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65  Mode = data.mode
36dc0 20 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79 3b 0a   = MODE_Pretty;.
36dd0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
36de0 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72  optionMatch(azAr
36df0 67 5b 69 69 5d 2c 22 64 65 62 75 67 22 29 20 29  g[ii],"debug") )
36e00 7b 0a 20 20 20 20 20 20 20 20 62 44 65 62 75 67  {.        bDebug
36e10 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
36e20 65 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29  e if( zName==0 )
36e30 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  {.        zName 
36e40 3d 20 61 7a 41 72 67 5b 69 69 5d 3b 0a 20 20 20  = azArg[ii];.   
36e50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36e60 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
36e70 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 63  err, "Usage: .sc
36e80 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20  hema ?--indent? 
36e90 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e  ?LIKE-PATTERN?\n
36ea0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
36eb0 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
36ec0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
36ed0 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
36ee0 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 21  }.    if( zName!
36ef0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
36f00 69 73 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74  isMaster = sqlit
36f10 65 33 5f 73 74 72 6c 69 6b 65 28 7a 4e 61 6d 65  e3_strlike(zName
36f20 2c 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  , "sqlite_master
36f30 22 2c 20 27 5c 5c 27 29 3d 3d 30 3b 0a 20 20 20  ", '\\')==0;.   
36f40 20 20 20 69 66 28 20 69 73 4d 61 73 74 65 72 20     if( isMaster 
36f50 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  || sqlite3_strli
36f60 6b 65 28 7a 4e 61 6d 65 2c 22 73 71 6c 69 74 65  ke(zName,"sqlite
36f70 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 2c 20 27  _temp_master", '
36f80 5c 5c 27 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  \\')==0 ){.     
36f90 20 20 20 63 68 61 72 20 2a 6e 65 77 5f 61 72 67     char *new_arg
36fa0 76 5b 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b  v[2], *new_colv[
36fb0 32 5d 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f  2];.        new_
36fc0 61 72 67 76 5b 30 5d 20 3d 20 73 71 6c 69 74 65  argv[0] = sqlite
36fd0 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
36fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ff0 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
37000 73 20 28 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  s (\n".         
37010 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
37020 74 79 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  type text,\n".  
37030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37040 20 20 20 20 22 20 20 6e 61 6d 65 20 74 65 78 74      "  name text
37050 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ,\n".           
37060 20 20 20 20 20 20 20 20 20 20 20 22 20 20 74 62             "  tb
37070 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a  l_name text,\n".
37080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37090 20 20 20 20 20 20 22 20 20 72 6f 6f 74 70 61 67        "  rootpag
370a0 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20  e integer,\n".  
370b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
370c0 20 20 20 20 22 20 20 73 71 6c 20 74 65 78 74 5c      "  sql text\
370d0 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
370e0 20 20 20 20 20 20 20 20 20 22 29 22 2c 20 69 73           ")", is
370f0 4d 61 73 74 65 72 20 3f 20 22 73 71 6c 69 74 65  Master ? "sqlite
37100 5f 6d 61 73 74 65 72 22 20 3a 20 22 73 71 6c 69  _master" : "sqli
37110 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 29  te_temp_master")
37120 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72  ;.        new_ar
37130 67 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  gv[1] = 0;.     
37140 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d     new_colv[0] =
37150 20 22 73 71 6c 22 3b 0a 20 20 20 20 20 20 20 20   "sql";.        
37160 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b  new_colv[1] = 0;
37170 0a 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63  .        callbac
37180 6b 28 26 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f  k(&data, 1, new_
37190 61 72 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b  argv, new_colv);
371a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
371b0 5f 66 72 65 65 28 6e 65 77 5f 61 72 67 76 5b 30  _free(new_argv[0
371c0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
371d0 7d 0a 20 20 20 20 69 66 28 20 7a 44 69 76 20 29  }.    if( zDiv )
371e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
371f0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
37200 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
37210 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
37220 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 6e 61  ->db, "SELECT na
37230 6d 65 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64  me FROM pragma_d
37240 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20  atabase_list",. 
37250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37260 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
37270 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
37280 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
37290 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
372a0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
372b0 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
372c0 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
372d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
372e0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
372f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
37300 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
37310 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
37320 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
37330 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
37340 63 74 2c 20 22 53 45 4c 45 43 54 20 73 71 6c 20  ct, "SELECT sql 
37350 46 52 4f 4d 22 2c 20 30 29 3b 0a 20 20 20 20 20  FROM", 0);.     
37360 20 69 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20   iSchema = 0;.  
37370 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
37380 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
37390 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
373a0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
373b0 20 2a 7a 44 62 20 3d 20 28 63 6f 6e 73 74 20 63   *zDb = (const c
373c0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
373d0 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
373e0 30 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  0);.        char
373f0 20 7a 53 63 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20   zScNum[30];.   
37400 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
37410 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53 63  rintf(sizeof(zSc
37420 4e 75 6d 29 2c 20 7a 53 63 4e 75 6d 2c 20 22 25  Num), zScNum, "%
37430 64 22 2c 20 2b 2b 69 53 63 68 65 6d 61 29 3b 0a  d", ++iSchema);.
37440 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
37450 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44 69  xt(&sSelect, zDi
37460 76 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a  v, 0);.        z
37470 44 69 76 20 3d 20 22 20 55 4e 49 4f 4e 20 41 4c  Div = " UNION AL
37480 4c 20 22 3b 0a 20 20 20 20 20 20 20 20 61 70 70  L ";.        app
37490 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
374a0 2c 20 22 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f  , "SELECT shell_
374b0 61 64 64 5f 73 63 68 65 6d 61 28 73 71 6c 2c 22  add_schema(sql,"
374c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
374d0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
374e0 70 28 7a 44 62 2c 20 22 6d 61 69 6e 22 29 21 3d  p(zDb, "main")!=
374f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
37500 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
37510 63 74 2c 20 7a 44 62 2c 20 27 22 27 29 3b 0a 20  ct, zDb, '"');. 
37520 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
37530 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
37540 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 4e 55  xt(&sSelect, "NU
37550 4c 4c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  LL", 0);.       
37560 20 7d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e   }.        appen
37570 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
37580 22 2c 6e 61 6d 65 29 20 41 53 20 73 71 6c 2c 20  ",name) AS sql, 
37590 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20  type, tbl_name, 
375a0 6e 61 6d 65 2c 20 72 6f 77 69 64 2c 22 2c 20 30  name, rowid,", 0
375b0 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  );.        appen
375c0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
375d0 7a 53 63 4e 75 6d 2c 20 30 29 3b 0a 20 20 20 20  zScNum, 0);.    
375e0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
375f0 73 53 65 6c 65 63 74 2c 20 22 20 41 53 20 73 6e  sSelect, " AS sn
37600 75 6d 2c 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  um, ", 0);.     
37610 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
37620 53 65 6c 65 63 74 2c 20 7a 44 62 2c 20 27 5c 27  Select, zDb, '\'
37630 27 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  ');.        appe
37640 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
37650 20 22 20 41 53 20 73 6e 61 6d 65 20 46 52 4f 4d   " AS sname FROM
37660 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   ", 0);.        
37670 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
37680 65 63 74 2c 20 7a 44 62 2c 20 27 22 27 29 3b 0a  ect, zDb, '"');.
37690 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
376a0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2e 73  xt(&sSelect, ".s
376b0 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 30  qlite_master", 0
376c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
376d0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
376e0 65 28 70 53 74 6d 74 29 3b 0a 23 69 66 64 65 66  e(pStmt);.#ifdef
376f0 20 53 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45   SQLITE_INTROSPE
37700 43 54 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20  CTION_PRAGMAS.  
37710 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b      if( zName ){
37720 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
37730 65 78 74 28 26 73 53 65 6c 65 63 74 2c 0a 20 20  ext(&sSelect,.  
37740 20 20 20 20 20 20 20 20 20 22 20 55 4e 49 4f 4e           " UNION
37750 20 41 4c 4c 20 53 45 4c 45 43 54 20 73 68 65 6c   ALL SELECT shel
37760 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61 28  l_module_schema(
37770 6e 61 6d 65 29 2c 22 0a 20 20 20 20 20 20 20 20  name),".        
37780 20 20 20 22 20 27 74 61 62 6c 65 27 2c 20 6e 61     " 'table', na
37790 6d 65 2c 20 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20  me, name, name, 
377a0 39 65 2b 39 39 2c 20 27 6d 61 69 6e 27 20 46 52  9e+99, 'main' FR
377b0 4f 4d 20 70 72 61 67 6d 61 5f 6d 6f 64 75 6c 65  OM pragma_module
377c0 5f 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20  _list", 0);.    
377d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
377e0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
377f0 6c 65 63 74 2c 20 22 29 20 57 48 45 52 45 20 22  lect, ") WHERE "
37800 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
37810 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
37820 20 63 68 61 72 20 2a 7a 51 61 72 67