/ Hex Artifact Content
Login

Artifact 1f0819e69fb1ebd2eb44695530dc43936608bf9b752981a0ffd4e2e4a9e3883d:


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 75 6e 64 65 66 20 70 6f 70 65 6e 0a 23 20  # undef popen.# 
0de0: 64 65 66 69 6e 65 20 70 6f 70 65 6e 20 5f 70 6f  define popen _po
0df0: 70 65 6e 0a 23 20 75 6e 64 65 66 20 70 63 6c 6f  pen.# undef pclo
0e00: 73 65 0a 23 20 64 65 66 69 6e 65 20 70 63 6c 6f  se.# define pclo
0e10: 73 65 20 5f 70 63 6c 6f 73 65 0a 23 65 6c 73 65  se _pclose.#else
0e20: 0a 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69  . /* Make sure i
0e30: 73 61 74 74 79 28 29 20 68 61 73 20 61 20 70 72  satty() has a pr
0e40: 6f 74 6f 74 79 70 65 2e 20 2a 2f 0a 20 65 78 74  ototype. */. ext
0e50: 65 72 6e 20 69 6e 74 20 69 73 61 74 74 79 28 69  ern int isatty(i
0e60: 6e 74 29 3b 0a 0a 23 20 69 66 20 21 64 65 66 69  nt);..# if !defi
0e70: 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 26 26 20  ned(__RTP__) && 
0e80: 21 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45  !defined(_WRS_KE
0e90: 52 4e 45 4c 29 0a 20 20 2f 2a 20 70 6f 70 65 6e  RNEL).  /* popen
0ea0: 20 61 6e 64 20 70 63 6c 6f 73 65 20 61 72 65 20   and pclose are 
0eb0: 6e 6f 74 20 43 38 39 20 66 75 6e 63 74 69 6f 6e  not C89 function
0ec0: 73 20 61 6e 64 20 73 6f 20 61 72 65 0a 20 20 2a  s and so are.  *
0ed0: 2a 20 73 6f 6d 65 74 69 6d 65 73 20 6f 6d 69 74  * sometimes omit
0ee0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 3c 73 74  ted from the <st
0ef0: 64 69 6f 2e 68 3e 20 68 65 61 64 65 72 20 2a 2f  dio.h> header */
0f00: 0a 20 20 20 65 78 74 65 72 6e 20 46 49 4c 45 20  .   extern FILE 
0f10: 2a 70 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  *popen(const cha
0f20: 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  r*,const char*);
0f30: 0a 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 70  .   extern int p
0f40: 63 6c 6f 73 65 28 46 49 4c 45 2a 29 3b 0a 23 20  close(FILE*);.# 
0f50: 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 53  else.#  define S
0f60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e  QLITE_OMIT_POPEN
0f70: 20 31 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69   1.# endif.#endi
0f80: 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
0f90: 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 20 57 69  WIN32_WCE)./* Wi
0fa0: 6e 64 6f 77 73 20 43 45 20 28 61 72 6d 2d 77 69  ndows CE (arm-wi
0fb0: 6e 63 65 2d 6d 69 6e 67 77 33 32 63 65 2d 67 63  nce-mingw32ce-gc
0fc0: 63 29 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76  c) does not prov
0fd0: 69 64 65 20 69 73 61 74 74 79 28 29 0a 20 2a 20  ide isatty(). * 
0fe0: 74 68 75 73 20 77 65 20 61 6c 77 61 79 73 20 61  thus we always a
0ff0: 73 73 75 6d 65 20 74 68 61 74 20 77 65 20 68 61  ssume that we ha
1000: 76 65 20 61 20 63 6f 6e 73 6f 6c 65 2e 20 54 68  ve a console. Th
1010: 61 74 20 63 61 6e 20 62 65 0a 20 2a 20 6f 76 65  at can be. * ove
1020: 72 72 69 64 64 65 6e 20 77 69 74 68 20 74 68 65  rridden with the
1030: 20 2d 62 61 74 63 68 20 63 6f 6d 6d 61 6e 64 20   -batch command 
1040: 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a 20 2a 2f  line option.. */
1050: 0a 23 64 65 66 69 6e 65 20 69 73 61 74 74 79 28  .#define isatty(
1060: 78 29 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  x) 1.#endif../* 
1070: 63 74 79 70 65 20 6d 61 63 72 6f 73 20 74 68 61  ctype macros tha
1080: 74 20 77 6f 72 6b 20 77 69 74 68 20 73 69 67 6e  t work with sign
1090: 65 64 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  ed characters */
10a0: 0a 23 64 65 66 69 6e 65 20 49 73 53 70 61 63 65  .#define IsSpace
10b0: 28 58 29 20 20 69 73 73 70 61 63 65 28 28 75 6e  (X)  isspace((un
10c0: 73 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a 23  signed char)X).#
10d0: 64 65 66 69 6e 65 20 49 73 44 69 67 69 74 28 58  define IsDigit(X
10e0: 29 20 20 69 73 64 69 67 69 74 28 28 75 6e 73 69  )  isdigit((unsi
10f0: 67 6e 65 64 20 63 68 61 72 29 58 29 0a 23 64 65  gned char)X).#de
1100: 66 69 6e 65 20 54 6f 4c 6f 77 65 72 28 58 29 20  fine ToLower(X) 
1110: 20 28 63 68 61 72 29 74 6f 6c 6f 77 65 72 28 28   (char)tolower((
1120: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58 29  unsigned char)X)
1130: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  ..#if defined(_W
1140: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
1150: 28 57 49 4e 33 32 29 0a 23 69 6e 63 6c 75 64 65  (WIN32).#include
1160: 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 0a 2f 2a   <windows.h>../*
1170: 20 73 74 72 69 6e 67 20 63 6f 6e 76 65 72 73 69   string conversi
1180: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 6f 6e 6c 79  on routines only
1190: 20 6e 65 65 64 65 64 20 6f 6e 20 57 69 6e 33 32   needed on Win32
11a0: 20 2a 2f 0a 65 78 74 65 72 6e 20 63 68 61 72 20   */.extern char 
11b0: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75  *sqlite3_win32_u
11c0: 6e 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28 4c  nicode_to_utf8(L
11d0: 50 43 57 53 54 52 29 3b 0a 65 78 74 65 72 6e 20  PCWSTR);.extern 
11e0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
11f0: 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
1200: 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  _v2(const char *
1210: 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20 63  , int);.extern c
1220: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e  har *sqlite3_win
1230: 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 5f  32_utf8_to_mbcs_
1240: 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c  v2(const char *,
1250: 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20 4c 50   int);.extern LP
1260: 57 53 54 52 20 73 71 6c 69 74 65 33 5f 77 69 6e  WSTR sqlite3_win
1270: 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f  32_utf8_to_unico
1280: 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  de(const char *z
1290: 54 65 78 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  Text);.#endif../
12a0: 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65  * On Windows, we
12b0: 20 6e 6f 72 6d 61 6c 6c 79 20 72 75 6e 20 77 69   normally run wi
12c0: 74 68 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 6f  th output mode o
12d0: 66 20 54 45 58 54 20 73 6f 20 74 68 61 74 20 5c  f TEXT so that \
12e0: 6e 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20  n characters.** 
12f0: 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
1300: 79 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  y translated int
1310: 6f 20 5c 72 5c 6e 2e 20 20 48 6f 77 65 76 65 72  o \r\n.  However
1320: 2c 20 74 68 69 73 20 62 65 68 61 76 69 6f 72 20  , this behavior 
1330: 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20 64  needs.** to be d
1340: 69 73 61 62 6c 65 64 20 69 6e 20 73 6f 6d 65 20  isabled in some 
1350: 63 61 73 65 73 20 28 65 78 3a 20 77 68 65 6e 20  cases (ex: when 
1360: 67 65 6e 65 72 61 74 69 6e 67 20 43 53 56 20 6f  generating CSV o
1370: 75 74 70 75 74 20 61 6e 64 20 77 68 65 6e 0a 2a  utput and when.*
1380: 2a 20 72 65 6e 64 65 72 69 6e 67 20 71 75 6f 74  * rendering quot
1390: 65 64 20 73 74 72 69 6e 67 73 20 74 68 61 74 20  ed strings that 
13a0: 63 6f 6e 74 61 69 6e 20 5c 6e 20 63 68 61 72 61  contain \n chara
13b0: 63 74 65 72 73 29 2e 20 20 54 68 65 20 66 6f 6c  cters).  The fol
13c0: 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e  lowing.** routin
13d0: 65 73 20 74 61 6b 65 20 63 61 72 65 20 6f 66 20  es take care of 
13e0: 74 68 61 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  that..*/.#if def
13f0: 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20  ined(_WIN32) || 
1400: 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 73  defined(WIN32).s
1410: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 42 69  tatic void setBi
1420: 6e 61 72 79 4d 6f 64 65 28 46 49 4c 45 20 2a 66  naryMode(FILE *f
1430: 69 6c 65 2c 20 69 6e 74 20 69 73 4f 75 74 70 75  ile, int isOutpu
1440: 74 29 7b 0a 20 20 69 66 28 20 69 73 4f 75 74 70  t){.  if( isOutp
1450: 75 74 20 29 20 66 66 6c 75 73 68 28 66 69 6c 65  ut ) fflush(file
1460: 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65 28 5f 66  );.  _setmode(_f
1470: 69 6c 65 6e 6f 28 66 69 6c 65 29 2c 20 5f 4f 5f  ileno(file), _O_
1480: 42 49 4e 41 52 59 29 3b 0a 7d 0a 73 74 61 74 69  BINARY);.}.stati
1490: 63 20 76 6f 69 64 20 73 65 74 54 65 78 74 4d 6f  c void setTextMo
14a0: 64 65 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20 69  de(FILE *file, i
14b0: 6e 74 20 69 73 4f 75 74 70 75 74 29 7b 0a 20 20  nt isOutput){.  
14c0: 69 66 28 20 69 73 4f 75 74 70 75 74 20 29 20 66  if( isOutput ) f
14d0: 66 6c 75 73 68 28 66 69 6c 65 29 3b 0a 20 20 5f  flush(file);.  _
14e0: 73 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f 28  setmode(_fileno(
14f0: 66 69 6c 65 29 2c 20 5f 4f 5f 54 45 58 54 29 3b  file), _O_TEXT);
1500: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
1510: 65 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28  e setBinaryMode(
1520: 58 2c 59 29 0a 23 20 64 65 66 69 6e 65 20 73 65  X,Y).# define se
1530: 74 54 65 78 74 4d 6f 64 65 28 58 2c 59 29 0a 23  tTextMode(X,Y).#
1540: 65 6e 64 69 66 0a 0a 0a 2f 2a 20 54 72 75 65 20  endif.../* True 
1550: 69 66 20 74 68 65 20 74 69 6d 65 72 20 69 73 20  if the timer is 
1560: 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74 69  enabled */.stati
1570: 63 20 69 6e 74 20 65 6e 61 62 6c 65 54 69 6d 65  c int enableTime
1580: 72 20 3d 20 30 3b 0a 0a 2f 2a 20 52 65 74 75 72  r = 0;../* Retur
1590: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 61  n the current wa
15a0: 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 2a 2f  ll-clock time */
15b0: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
15c0: 69 6e 74 36 34 20 74 69 6d 65 4f 66 44 61 79 28  int64 timeOfDay(
15d0: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
15e0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 63 6c 6f  sqlite3_vfs *clo
15f0: 63 6b 56 66 73 20 3d 20 30 3b 0a 20 20 73 71 6c  ckVfs = 0;.  sql
1600: 69 74 65 33 5f 69 6e 74 36 34 20 74 3b 0a 20 20  ite3_int64 t;.  
1610: 69 66 28 20 63 6c 6f 63 6b 56 66 73 3d 3d 30 20  if( clockVfs==0 
1620: 29 20 63 6c 6f 63 6b 56 66 73 20 3d 20 73 71 6c  ) clockVfs = sql
1630: 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
1640: 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66 73  ;.  if( clockVfs
1650: 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32 20 26 26  ->iVersion>=2 &&
1660: 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72   clockVfs->xCurr
1670: 65 6e 74 54 69 6d 65 49 6e 74 36 34 21 3d 30 20  entTimeInt64!=0 
1680: 29 7b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d  ){.    clockVfs-
1690: 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  >xCurrentTimeInt
16a0: 36 34 28 63 6c 6f 63 6b 56 66 73 2c 20 26 74 29  64(clockVfs, &t)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
16c0: 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 63 6c 6f  ouble r;.    clo
16d0: 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54  ckVfs->xCurrentT
16e0: 69 6d 65 28 63 6c 6f 63 6b 56 66 73 2c 20 26 72  ime(clockVfs, &r
16f0: 29 3b 0a 20 20 20 20 74 20 3d 20 28 73 71 6c 69  );.    t = (sqli
1700: 74 65 33 5f 69 6e 74 36 34 29 28 72 2a 38 36 34  te3_int64)(r*864
1710: 30 30 30 30 30 2e 30 29 3b 0a 20 20 7d 0a 20 20  00000.0);.  }.  
1720: 72 65 74 75 72 6e 20 74 3b 0a 7d 0a 0a 23 69 66  return t;.}..#if
1730: 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   !defined(_WIN32
1740: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 57 49  ) && !defined(WI
1750: 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  N32) && !defined
1760: 28 5f 5f 6d 69 6e 75 78 29 0a 23 69 6e 63 6c 75  (__minux).#inclu
1770: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
1780: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65  #include <sys/re
1790: 73 6f 75 72 63 65 2e 68 3e 0a 0a 2f 2a 20 56 78  source.h>../* Vx
17a0: 57 6f 72 6b 73 20 64 6f 65 73 20 6e 6f 74 20 73  Works does not s
17b0: 75 70 70 6f 72 74 20 67 65 74 72 75 73 61 67 65  upport getrusage
17c0: 28 29 20 61 73 20 66 61 72 20 61 73 20 77 65 20  () as far as we 
17d0: 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 20 2a 2f  can determine */
17e0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 52  .#if defined(_WR
17f0: 53 5f 4b 45 52 4e 45 4c 29 20 7c 7c 20 64 65 66  S_KERNEL) || def
1800: 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 0a 73 74  ined(__RTP__).st
1810: 72 75 63 74 20 72 75 73 61 67 65 20 7b 0a 20 20  ruct rusage {.  
1820: 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 72  struct timeval r
1830: 75 5f 75 74 69 6d 65 3b 20 2f 2a 20 75 73 65 72  u_utime; /* user
1840: 20 43 50 55 20 74 69 6d 65 20 75 73 65 64 20 2a   CPU time used *
1850: 2f 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76  /.  struct timev
1860: 61 6c 20 72 75 5f 73 74 69 6d 65 3b 20 2f 2a 20  al ru_stime; /* 
1870: 73 79 73 74 65 6d 20 43 50 55 20 74 69 6d 65 20  system CPU time 
1880: 75 73 65 64 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69  used */.};.#defi
1890: 6e 65 20 67 65 74 72 75 73 61 67 65 28 41 2c 42  ne getrusage(A,B
18a0: 29 20 6d 65 6d 73 65 74 28 42 2c 30 2c 73 69 7a  ) memset(B,0,siz
18b0: 65 6f 66 28 2a 42 29 29 0a 23 65 6e 64 69 66 0a  eof(*B)).#endif.
18c0: 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75 72  ./* Saved resour
18d0: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ce information f
18e0: 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  or the beginning
18f0: 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e   of an operation
1900: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
1910: 74 20 72 75 73 61 67 65 20 73 42 65 67 69 6e 3b  t rusage sBegin;
1920: 20 20 2f 2a 20 43 50 55 20 74 69 6d 65 20 61 74    /* CPU time at
1930: 20 73 74 61 72 74 20 2a 2f 0a 73 74 61 74 69 63   start */.static
1940: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1950: 42 65 67 69 6e 3b 20 20 2f 2a 20 57 61 6c 6c 2d  Begin;  /* Wall-
1960: 63 6c 6f 63 6b 20 74 69 6d 65 20 61 74 20 73 74  clock time at st
1970: 61 72 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 65  art */../*.** Be
1980: 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f 70  gin timing an op
1990: 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  eration.*/.stati
19a0: 63 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d 65  c void beginTime
19b0: 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65  r(void){.  if( e
19c0: 6e 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20 20  nableTimer ){.  
19d0: 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53 41    getrusage(RUSA
19e0: 47 45 5f 53 45 4c 46 2c 20 26 73 42 65 67 69 6e  GE_SELF, &sBegin
19f0: 29 3b 0a 20 20 20 20 69 42 65 67 69 6e 20 3d 20  );.    iBegin = 
1a00: 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20 7d  timeOfDay();.  }
1a10: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68  .}../* Return th
1a20: 65 20 64 69 66 66 65 72 65 6e 63 65 20 6f 66 20  e difference of 
1a30: 74 77 6f 20 74 69 6d 65 5f 73 74 72 75 63 74 73  two time_structs
1a40: 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 73   in seconds */.s
1a50: 74 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69 6d  tatic double tim
1a60: 65 44 69 66 66 28 73 74 72 75 63 74 20 74 69 6d  eDiff(struct tim
1a70: 65 76 61 6c 20 2a 70 53 74 61 72 74 2c 20 73 74  eval *pStart, st
1a80: 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70 45  ruct timeval *pE
1a90: 6e 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  nd){.  return (p
1aa0: 45 6e 64 2d 3e 74 76 5f 75 73 65 63 20 2d 20 70  End->tv_usec - p
1ab0: 53 74 61 72 74 2d 3e 74 76 5f 75 73 65 63 29 2a  Start->tv_usec)*
1ac0: 30 2e 30 30 30 30 30 31 20 2b 0a 20 20 20 20 20  0.000001 +.     
1ad0: 20 20 20 20 28 64 6f 75 62 6c 65 29 28 70 45 6e      (double)(pEn
1ae0: 64 2d 3e 74 76 5f 73 65 63 20 2d 20 70 53 74 61  d->tv_sec - pSta
1af0: 72 74 2d 3e 74 76 5f 73 65 63 29 3b 0a 7d 0a 0a  rt->tv_sec);.}..
1b00: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
1b10: 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e 0a  timing results..
1b20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1b30: 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20  ndTimer(void){. 
1b40: 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65 72   if( enableTimer
1b50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1b60: 69 6e 74 36 34 20 69 45 6e 64 20 3d 20 74 69 6d  int64 iEnd = tim
1b70: 65 4f 66 44 61 79 28 29 3b 0a 20 20 20 20 73 74  eOfDay();.    st
1b80: 72 75 63 74 20 72 75 73 61 67 65 20 73 45 6e 64  ruct rusage sEnd
1b90: 3b 0a 20 20 20 20 67 65 74 72 75 73 61 67 65 28  ;.    getrusage(
1ba0: 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73 45  RUSAGE_SELF, &sE
1bb0: 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  nd);.    printf(
1bc0: 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c 20  "Run Time: real 
1bd0: 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79 73  %.3f user %f sys
1be0: 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20 28   %f\n",.       (
1bf0: 69 45 6e 64 20 2d 20 69 42 65 67 69 6e 29 2a 30  iEnd - iBegin)*0
1c00: 2e 30 30 31 2c 0a 20 20 20 20 20 20 20 74 69 6d  .001,.       tim
1c10: 65 44 69 66 66 28 26 73 42 65 67 69 6e 2e 72 75  eDiff(&sBegin.ru
1c20: 5f 75 74 69 6d 65 2c 20 26 73 45 6e 64 2e 72 75  _utime, &sEnd.ru
1c30: 5f 75 74 69 6d 65 29 2c 0a 20 20 20 20 20 20 20  _utime),.       
1c40: 74 69 6d 65 44 69 66 66 28 26 73 42 65 67 69 6e  timeDiff(&sBegin
1c50: 2e 72 75 5f 73 74 69 6d 65 2c 20 26 73 45 6e 64  .ru_stime, &sEnd
1c60: 2e 72 75 5f 73 74 69 6d 65 29 29 3b 0a 20 20 7d  .ru_stime));.  }
1c70: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47 49  .}..#define BEGI
1c80: 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69 6d  N_TIMER beginTim
1c90: 65 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e 44  er().#define END
1ca0: 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72 28  _TIMER endTimer(
1cb0: 29 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54 49  ).#define HAS_TI
1cc0: 4d 45 52 20 31 0a 0a 23 65 6c 69 66 20 28 64 65  MER 1..#elif (de
1cd0: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
1ce0: 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29   defined(WIN32))
1cf0: 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75  ../* Saved resou
1d00: 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  rce information 
1d10: 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  for the beginnin
1d20: 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  g of an operatio
1d30: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 48 41 4e 44  n */.static HAND
1d40: 4c 45 20 68 50 72 6f 63 65 73 73 3b 0a 73 74 61  LE hProcess;.sta
1d50: 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74 4b  tic FILETIME ftK
1d60: 65 72 6e 65 6c 42 65 67 69 6e 3b 0a 73 74 61 74  ernelBegin;.stat
1d70: 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74 55 73  ic FILETIME ftUs
1d80: 65 72 42 65 67 69 6e 3b 0a 73 74 61 74 69 63 20  erBegin;.static 
1d90: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 74  sqlite3_int64 ft
1da0: 57 61 6c 6c 42 65 67 69 6e 3b 0a 74 79 70 65 64  WallBegin;.typed
1db0: 65 66 20 42 4f 4f 4c 20 28 57 49 4e 41 50 49 20  ef BOOL (WINAPI 
1dc0: 2a 47 45 54 50 52 4f 43 54 49 4d 45 53 29 28 48  *GETPROCTIMES)(H
1dd0: 41 4e 44 4c 45 2c 20 4c 50 46 49 4c 45 54 49 4d  ANDLE, LPFILETIM
1de0: 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 2c 0a 20  E, LPFILETIME,. 
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 2c 20 4c     LPFILETIME, L
1e20: 50 46 49 4c 45 54 49 4d 45 29 3b 0a 73 74 61 74  PFILETIME);.stat
1e30: 69 63 20 47 45 54 50 52 4f 43 54 49 4d 45 53 20  ic GETPROCTIMES 
1e40: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
1e50: 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 0a  ddr = NULL;../*.
1e60: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
1e70: 69 66 20 77 65 20 68 61 76 65 20 74 69 6d 65 72  if we have timer
1e80: 20 73 75 70 70 6f 72 74 2e 20 20 52 65 74 75 72   support.  Retur
1e90: 6e 20 31 20 69 66 20 6e 65 63 65 73 73 61 72 79  n 1 if necessary
1ea0: 0a 2a 2a 20 73 75 70 70 6f 72 74 20 66 6f 75 6e  .** support foun
1eb0: 64 20 28 6f 72 20 66 6f 75 6e 64 20 70 72 65 76  d (or found prev
1ec0: 69 6f 75 73 6c 79 29 2e 0a 2a 2f 0a 73 74 61 74  iously)..*/.stat
1ed0: 69 63 20 69 6e 74 20 68 61 73 54 69 6d 65 72 28  ic int hasTimer(
1ee0: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 67 65 74  void){.  if( get
1ef0: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
1f00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1f10: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
1f20: 20 2f 2a 20 47 65 74 50 72 6f 63 65 73 73 54 69   /* GetProcessTi
1f30: 6d 65 73 28 29 20 69 73 6e 27 74 20 73 75 70 70  mes() isn't supp
1f40: 6f 72 74 65 64 20 69 6e 20 57 49 4e 39 35 20 61  orted in WIN95 a
1f50: 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72 20 57 69  nd some other Wi
1f60: 6e 64 6f 77 73 0a 20 20 20 20 2a 2a 20 76 65 72  ndows.    ** ver
1f70: 73 69 6f 6e 73 2e 20 53 65 65 20 69 66 20 74 68  sions. See if th
1f80: 65 20 76 65 72 73 69 6f 6e 20 77 65 20 61 72 65  e version we are
1f90: 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 68 61 73 20   running on has 
1fa0: 69 74 2c 20 61 6e 64 20 69 66 20 69 74 0a 20 20  it, and if it.  
1fb0: 20 20 2a 2a 20 64 6f 65 73 2c 20 73 61 76 65 20    ** does, save 
1fc0: 6f 66 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  off a pointer to
1fd0: 20 69 74 20 61 6e 64 20 74 68 65 20 63 75 72 72   it and the curr
1fe0: 65 6e 74 20 70 72 6f 63 65 73 73 20 68 61 6e 64  ent process hand
1ff0: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 68  le..    */.    h
2000: 50 72 6f 63 65 73 73 20 3d 20 47 65 74 43 75 72  Process = GetCur
2010: 72 65 6e 74 50 72 6f 63 65 73 73 28 29 3b 0a 20  rentProcess();. 
2020: 20 20 20 69 66 28 20 68 50 72 6f 63 65 73 73 20     if( hProcess 
2030: 29 7b 0a 20 20 20 20 20 20 48 49 4e 53 54 41 4e  ){.      HINSTAN
2040: 43 45 20 68 69 6e 73 74 4c 69 62 20 3d 20 4c 6f  CE hinstLib = Lo
2050: 61 64 4c 69 62 72 61 72 79 28 54 45 58 54 28 22  adLibrary(TEXT("
2060: 4b 65 72 6e 65 6c 33 32 2e 64 6c 6c 22 29 29 3b  Kernel32.dll"));
2070: 0a 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c 20  .      if( NULL 
2080: 21 3d 20 68 69 6e 73 74 4c 69 62 20 29 7b 0a 20  != hinstLib ){. 
2090: 20 20 20 20 20 20 20 67 65 74 50 72 6f 63 65 73         getProces
20a0: 73 54 69 6d 65 73 41 64 64 72 20 3d 0a 20 20 20  sTimesAddr =.   
20b0: 20 20 20 20 20 20 20 20 20 28 47 45 54 50 52 4f           (GETPRO
20c0: 43 54 49 4d 45 53 29 20 47 65 74 50 72 6f 63 41  CTIMES) GetProcA
20d0: 64 64 72 65 73 73 28 68 69 6e 73 74 4c 69 62 2c  ddress(hinstLib,
20e0: 20 22 47 65 74 50 72 6f 63 65 73 73 54 69 6d 65   "GetProcessTime
20f0: 73 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  s");.        if(
2100: 20 4e 55 4c 4c 20 21 3d 20 67 65 74 50 72 6f 63   NULL != getProc
2110: 65 73 73 54 69 6d 65 73 41 64 64 72 20 29 7b 0a  essTimesAddr ){.
2120: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2130: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2140: 20 20 20 20 20 20 46 72 65 65 4c 69 62 72 61 72        FreeLibrar
2150: 79 28 68 69 6e 73 74 4c 69 62 29 3b 0a 20 20 20  y(hinstLib);.   
2160: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2170: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2180: 0a 2a 2a 20 42 65 67 69 6e 20 74 69 6d 69 6e 67  .** Begin timing
2190: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2f   an operation.*/
21a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 67  .static void beg
21b0: 69 6e 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20  inTimer(void){. 
21c0: 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65 72   if( enableTimer
21d0: 20 26 26 20 67 65 74 50 72 6f 63 65 73 73 54 69   && getProcessTi
21e0: 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20 46  mesAddr ){.    F
21f0: 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74 69  ILETIME ftCreati
2200: 6f 6e 2c 20 66 74 45 78 69 74 3b 0a 20 20 20 20  on, ftExit;.    
2210: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
2220: 64 64 72 28 68 50 72 6f 63 65 73 73 2c 26 66 74  ddr(hProcess,&ft
2230: 43 72 65 61 74 69 6f 6e 2c 26 66 74 45 78 69 74  Creation,&ftExit
2240: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2250: 20 20 20 20 20 20 20 20 20 20 26 66 74 4b 65 72            &ftKer
2260: 6e 65 6c 42 65 67 69 6e 2c 26 66 74 55 73 65 72  nelBegin,&ftUser
2270: 42 65 67 69 6e 29 3b 0a 20 20 20 20 66 74 57 61  Begin);.    ftWa
2280: 6c 6c 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f 66  llBegin = timeOf
2290: 44 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Day();.  }.}../*
22a0: 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 66 66   Return the diff
22b0: 65 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 46 49  erence of two FI
22c0: 4c 45 54 49 4d 45 20 73 74 72 75 63 74 73 20 69  LETIME structs i
22d0: 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 73 74 61  n seconds */.sta
22e0: 74 69 63 20 64 6f 75 62 6c 65 20 74 69 6d 65 44  tic double timeD
22f0: 69 66 66 28 46 49 4c 45 54 49 4d 45 20 2a 70 53  iff(FILETIME *pS
2300: 74 61 72 74 2c 20 46 49 4c 45 54 49 4d 45 20 2a  tart, FILETIME *
2310: 70 45 6e 64 29 7b 0a 20 20 73 71 6c 69 74 65 5f  pEnd){.  sqlite_
2320: 69 6e 74 36 34 20 69 36 34 53 74 61 72 74 20 3d  int64 i64Start =
2330: 20 2a 28 28 73 71 6c 69 74 65 5f 69 6e 74 36 34   *((sqlite_int64
2340: 20 2a 29 20 70 53 74 61 72 74 29 3b 0a 20 20 73   *) pStart);.  s
2350: 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 36 34 45  qlite_int64 i64E
2360: 6e 64 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f 69  nd = *((sqlite_i
2370: 6e 74 36 34 20 2a 29 20 70 45 6e 64 29 3b 0a 20  nt64 *) pEnd);. 
2380: 20 72 65 74 75 72 6e 20 28 64 6f 75 62 6c 65 29   return (double)
2390: 20 28 28 69 36 34 45 6e 64 20 2d 20 69 36 34 53   ((i64End - i64S
23a0: 74 61 72 74 29 20 2f 20 31 30 30 30 30 30 30 30  tart) / 10000000
23b0: 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  .0);.}../*.** Pr
23c0: 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67 20 72  int the timing r
23d0: 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  esults..*/.stati
23e0: 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65 72 28  c void endTimer(
23f0: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e 61  void){.  if( ena
2400: 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74 50  bleTimer && getP
2410: 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 29  rocessTimesAddr)
2420: 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45 20 66  {.    FILETIME f
2430: 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45 78 69  tCreation, ftExi
2440: 74 2c 20 66 74 4b 65 72 6e 65 6c 45 6e 64 2c 20  t, ftKernelEnd, 
2450: 66 74 55 73 65 72 45 6e 64 3b 0a 20 20 20 20 73  ftUserEnd;.    s
2460: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 74 57  qlite3_int64 ftW
2470: 61 6c 6c 45 6e 64 20 3d 20 74 69 6d 65 4f 66 44  allEnd = timeOfD
2480: 61 79 28 29 3b 0a 20 20 20 20 67 65 74 50 72 6f  ay();.    getPro
2490: 63 65 73 73 54 69 6d 65 73 41 64 64 72 28 68 50  cessTimesAddr(hP
24a0: 72 6f 63 65 73 73 2c 26 66 74 43 72 65 61 74 69  rocess,&ftCreati
24b0: 6f 6e 2c 26 66 74 45 78 69 74 2c 26 66 74 4b 65  on,&ftExit,&ftKe
24c0: 72 6e 65 6c 45 6e 64 2c 26 66 74 55 73 65 72 45  rnelEnd,&ftUserE
24d0: 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  nd);.    printf(
24e0: 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c 20  "Run Time: real 
24f0: 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79 73  %.3f user %f sys
2500: 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20 28   %f\n",.       (
2510: 66 74 57 61 6c 6c 45 6e 64 20 2d 20 66 74 57 61  ftWallEnd - ftWa
2520: 6c 6c 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c 0a  llBegin)*0.001,.
2530: 20 20 20 20 20 20 20 74 69 6d 65 44 69 66 66 28         timeDiff(
2540: 26 66 74 55 73 65 72 42 65 67 69 6e 2c 20 26 66  &ftUserBegin, &f
2550: 74 55 73 65 72 45 6e 64 29 2c 0a 20 20 20 20 20  tUserEnd),.     
2560: 20 20 74 69 6d 65 44 69 66 66 28 26 66 74 4b 65    timeDiff(&ftKe
2570: 72 6e 65 6c 42 65 67 69 6e 2c 20 26 66 74 4b 65  rnelBegin, &ftKe
2580: 72 6e 65 6c 45 6e 64 29 29 3b 0a 20 20 7d 0a 7d  rnelEnd));.  }.}
2590: 0a 0a 23 64 65 66 69 6e 65 20 42 45 47 49 4e 5f  ..#define BEGIN_
25a0: 54 49 4d 45 52 20 62 65 67 69 6e 54 69 6d 65 72  TIMER beginTimer
25b0: 28 29 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f 54  ().#define END_T
25c0: 49 4d 45 52 20 65 6e 64 54 69 6d 65 72 28 29 0a  IMER endTimer().
25d0: 23 64 65 66 69 6e 65 20 48 41 53 5f 54 49 4d 45  #define HAS_TIME
25e0: 52 20 68 61 73 54 69 6d 65 72 28 29 0a 0a 23 65  R hasTimer()..#e
25f0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 42 45 47 49  lse.#define BEGI
2600: 4e 5f 54 49 4d 45 52 0a 23 64 65 66 69 6e 65 20  N_TIMER.#define 
2610: 45 4e 44 5f 54 49 4d 45 52 0a 23 64 65 66 69 6e  END_TIMER.#defin
2620: 65 20 48 41 53 5f 54 49 4d 45 52 20 30 0a 23 65  e HAS_TIMER 0.#e
2630: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64  ndif../*.** Used
2640: 20 74 6f 20 70 72 65 76 65 6e 74 20 77 61 72 6e   to prevent warn
2650: 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73 65  ings about unuse
2660: 64 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2f 0a  d parameters.*/.
2670: 23 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f 50  #define UNUSED_P
2680: 41 52 41 4d 45 54 45 52 28 78 29 20 28 76 6f 69  ARAMETER(x) (voi
2690: 64 29 28 78 29 0a 0a 2f 2a 0a 2a 2a 20 4e 75 6d  d)(x)../*.** Num
26a0: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
26b0: 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2f 0a 23  in an array.*/.#
26c0: 64 65 66 69 6e 65 20 41 72 72 61 79 53 69 7a 65  define ArraySize
26d0: 28 58 29 20 20 28 69 6e 74 29 28 73 69 7a 65 6f  (X)  (int)(sizeo
26e0: 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30 5d  f(X)/sizeof(X[0]
26f0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  ))../*.** If the
2700: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6c 61 67 20   following flag 
2710: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 63 6f 6d  is set, then com
2720: 6d 61 6e 64 20 65 78 65 63 75 74 69 6f 6e 20 73  mand execution s
2730: 74 6f 70 73 0a 2a 2a 20 61 74 20 61 6e 20 65 72  tops.** at an er
2740: 72 6f 72 20 69 66 20 77 65 20 61 72 65 20 6e 6f  ror if we are no
2750: 74 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a 2a  t interactive..*
2760: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 69  /.static int bai
2770: 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 30 3b 0a  l_on_error = 0;.
2780: 0a 2f 2a 0a 2a 2a 20 54 68 72 65 61 74 20 73 74  ./*.** Threat st
2790: 64 69 6e 20 61 73 20 61 6e 20 69 6e 74 65 72 61  din as an intera
27a0: 63 74 69 76 65 20 69 6e 70 75 74 20 69 66 20 74  ctive input if t
27b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
27c0: 69 61 62 6c 65 0a 2a 2a 20 69 73 20 74 72 75 65  iable.** is true
27d0: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73  .  Otherwise, as
27e0: 73 75 6d 65 20 73 74 64 69 6e 20 69 73 20 63 6f  sume stdin is co
27f0: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 66 69 6c  nnected to a fil
2800: 65 20 6f 72 20 70 69 70 65 2e 0a 2a 2f 0a 73 74  e or pipe..*/.st
2810: 61 74 69 63 20 69 6e 74 20 73 74 64 69 6e 5f 69  atic int stdin_i
2820: 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d 20  s_interactive = 
2830: 31 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 57 69 6e  1;../*.** On Win
2840: 64 6f 77 73 20 73 79 73 74 65 6d 73 20 77 65 20  dows systems we 
2850: 68 61 76 65 20 74 6f 20 6b 6e 6f 77 20 69 66 20  have to know if 
2860: 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 20  standard output 
2870: 69 73 20 61 20 63 6f 6e 73 6f 6c 65 0a 2a 2a 20  is a console.** 
2880: 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 72 61 6e  in order to tran
2890: 73 6c 61 74 65 20 55 54 46 2d 38 20 69 6e 74 6f  slate UTF-8 into
28a0: 20 4d 42 43 53 2e 20 20 54 68 65 20 66 6f 6c 6c   MBCS.  The foll
28b0: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69  owing variable i
28c0: 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 72 61  s.** true if tra
28d0: 6e 73 6c 61 74 69 6f 6e 20 69 73 20 72 65 71 75  nslation is requ
28e0: 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ired..*/.static 
28f0: 69 6e 74 20 73 74 64 6f 75 74 5f 69 73 5f 63 6f  int stdout_is_co
2900: 6e 73 6f 6c 65 20 3d 20 31 3b 0a 0a 2f 2a 0a 2a  nsole = 1;../*.*
2910: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2920: 69 73 20 74 68 65 20 6f 70 65 6e 20 53 51 4c 69  is the open SQLi
2930: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 57 65  te database.  We
2940: 20 6d 61 6b 65 20 61 20 70 6f 69 6e 74 65 72 0a   make a pointer.
2950: 2a 2a 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ** to this datab
2960: 61 73 65 20 61 20 73 74 61 74 69 63 20 76 61 72  ase a static var
2970: 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 69 74  iable so that it
2980: 20 63 61 6e 20 62 65 20 61 63 63 65 73 73 65 64   can be accessed
2990: 0a 2a 2a 20 62 79 20 74 68 65 20 53 49 47 49 4e  .** by the SIGIN
29a0: 54 20 68 61 6e 64 6c 65 72 20 74 6f 20 69 6e 74  T handler to int
29b0: 65 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  errupt database 
29c0: 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 73  processing..*/.s
29d0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 20 2a 67  tatic sqlite3 *g
29e0: 6c 6f 62 61 6c 44 62 20 3d 20 30 3b 0a 0a 2f 2a  lobalDb = 0;../*
29f0: 0a 2a 2a 20 54 72 75 65 20 69 66 20 61 6e 20 69  .** True if an i
2a00: 6e 74 65 72 72 75 70 74 20 28 43 6f 6e 74 72 6f  nterrupt (Contro
2a10: 6c 2d 43 29 20 68 61 73 20 62 65 65 6e 20 72 65  l-C) has been re
2a20: 63 65 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ceived..*/.stati
2a30: 63 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 73  c volatile int s
2a40: 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 30  eenInterrupt = 0
2a50: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  ;../*.** This is
2a60: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 6f 75 72   the name of our
2a70: 20 70 72 6f 67 72 61 6d 2e 20 49 74 20 69 73 20   program. It is 
2a80: 73 65 74 20 69 6e 20 6d 61 69 6e 28 29 2c 20 75  set in main(), u
2a90: 73 65 64 0a 2a 2a 20 69 6e 20 61 20 6e 75 6d 62  sed.** in a numb
2aa0: 65 72 20 6f 66 20 6f 74 68 65 72 20 70 6c 61 63  er of other plac
2ab0: 65 73 2c 20 6d 6f 73 74 6c 79 20 66 6f 72 20 65  es, mostly for e
2ac0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
2ad0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 41  /.static char *A
2ae0: 72 67 76 30 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  rgv0;../*.** Pro
2af0: 6d 70 74 20 73 74 72 69 6e 67 73 2e 20 49 6e 69  mpt strings. Ini
2b00: 74 69 61 6c 69 7a 65 64 20 69 6e 20 6d 61 69 6e  tialized in main
2b10: 2e 20 53 65 74 74 61 62 6c 65 20 77 69 74 68 0a  . Settable with.
2b20: 2a 2a 20 20 20 2e 70 72 6f 6d 70 74 20 6d 61 69  **   .prompt mai
2b30: 6e 20 63 6f 6e 74 69 6e 75 65 0a 2a 2f 0a 73 74  n continue.*/.st
2b40: 61 74 69 63 20 63 68 61 72 20 6d 61 69 6e 50 72  atic char mainPr
2b50: 6f 6d 70 74 5b 32 30 5d 3b 20 20 20 20 20 2f 2a  ompt[20];     /*
2b60: 20 46 69 72 73 74 20 6c 69 6e 65 20 70 72 6f 6d   First line prom
2b70: 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 73 71  pt. default: "sq
2b80: 6c 69 74 65 3e 20 22 2a 2f 0a 73 74 61 74 69 63  lite> "*/.static
2b90: 20 63 68 61 72 20 63 6f 6e 74 69 6e 75 65 50 72   char continuePr
2ba0: 6f 6d 70 74 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6e  ompt[20]; /* Con
2bb0: 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70 74  tinuation prompt
2bc0: 2e 20 64 65 66 61 75 6c 74 3a 20 22 20 20 20 2e  . default: "   .
2bd0: 2e 2e 3e 20 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ..> " */../*.** 
2be0: 52 65 6e 64 65 72 20 6f 75 74 70 75 74 20 6c 69  Render output li
2bf0: 6b 65 20 66 70 72 69 6e 74 66 28 29 2e 20 20 45  ke fprintf().  E
2c00: 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 75  xcept, if the ou
2c10: 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f  tput is going to
2c20: 20 74 68 65 0a 2a 2a 20 63 6f 6e 73 6f 6c 65 20   the.** console 
2c30: 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 72  and if this is r
2c40: 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 57 69 6e 64  unning on a Wind
2c50: 6f 77 73 20 6d 61 63 68 69 6e 65 2c 20 74 72 61  ows machine, tra
2c60: 6e 73 6c 61 74 65 20 74 68 65 0a 2a 2a 20 6f 75  nslate the.** ou
2c70: 74 70 75 74 20 66 72 6f 6d 20 55 54 46 2d 38 20  tput from UTF-8 
2c80: 69 6e 74 6f 20 4d 42 43 53 2e 0a 2a 2f 0a 23 69  into MBCS..*/.#i
2c90: 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
2ca0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
2cb0: 33 32 29 0a 76 6f 69 64 20 75 74 66 38 5f 70 72  32).void utf8_pr
2cc0: 69 6e 74 66 28 46 49 4c 45 20 2a 6f 75 74 2c 20  intf(FILE *out, 
2cd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
2ce0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
2cf0: 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
2d00: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
2d10: 3b 0a 20 20 69 66 28 20 73 74 64 6f 75 74 5f 69  ;.  if( stdout_i
2d20: 73 5f 63 6f 6e 73 6f 6c 65 20 26 26 20 28 6f 75  s_console && (ou
2d30: 74 3d 3d 73 74 64 6f 75 74 20 7c 7c 20 6f 75 74  t==stdout || out
2d40: 3d 3d 73 74 64 65 72 72 29 20 29 7b 0a 20 20 20  ==stderr) ){.   
2d50: 20 63 68 61 72 20 2a 7a 31 20 3d 20 73 71 6c 69   char *z1 = sqli
2d60: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
2d70: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 63  rmat, ap);.    c
2d80: 68 61 72 20 2a 7a 32 20 3d 20 73 71 6c 69 74 65  har *z2 = sqlite
2d90: 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
2da0: 6d 62 63 73 5f 76 32 28 7a 31 2c 20 30 29 3b 0a  mbcs_v2(z1, 0);.
2db0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2dc0: 28 7a 31 29 3b 0a 20 20 20 20 66 70 75 74 73 28  (z1);.    fputs(
2dd0: 7a 32 2c 20 6f 75 74 29 3b 0a 20 20 20 20 73 71  z2, out);.    sq
2de0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 32 29 3b 0a  lite3_free(z2);.
2df0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 66 70    }else{.    vfp
2e00: 72 69 6e 74 66 28 6f 75 74 2c 20 7a 46 6f 72 6d  rintf(out, zForm
2e10: 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 20 20 76  at, ap);.  }.  v
2e20: 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65 6c  a_end(ap);.}.#el
2e30: 69 66 20 21 64 65 66 69 6e 65 64 28 75 74 66 38  if !defined(utf8
2e40: 5f 70 72 69 6e 74 66 29 0a 23 20 64 65 66 69 6e  _printf).# defin
2e50: 65 20 75 74 66 38 5f 70 72 69 6e 74 66 20 66 70  e utf8_printf fp
2e60: 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rintf.#endif../*
2e70: 0a 2a 2a 20 52 65 6e 64 65 72 20 6f 75 74 70 75  .** Render outpu
2e80: 74 20 6c 69 6b 65 20 66 70 72 69 6e 74 66 28 29  t like fprintf()
2e90: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  .  This should n
2ea0: 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 61 6e  ot be used on an
2eb0: 79 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 69  ything that.** i
2ec0: 6e 63 6c 75 64 65 73 20 73 74 72 69 6e 67 20 66  ncludes string f
2ed0: 6f 72 6d 61 74 74 69 6e 67 20 28 65 2e 67 2e 20  ormatting (e.g. 
2ee0: 22 25 73 22 29 2e 0a 2a 2f 0a 23 69 66 20 21 64  "%s")..*/.#if !d
2ef0: 65 66 69 6e 65 64 28 72 61 77 5f 70 72 69 6e 74  efined(raw_print
2f00: 66 29 0a 23 20 64 65 66 69 6e 65 20 72 61 77 5f  f).# define raw_
2f10: 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66 0a 23  printf fprintf.#
2f20: 65 6e 64 69 66 0a 0a 2f 2a 20 49 6e 64 69 63 61  endif../* Indica
2f30: 74 65 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  te out-of-memory
2f40: 20 61 6e 64 20 65 78 69 74 2e 20 2a 2f 0a 73 74   and exit. */.st
2f50: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 5f  atic void shell_
2f60: 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 76 6f  out_of_memory(vo
2f70: 69 64 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e 74  id){.  raw_print
2f80: 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
2f90: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e   out of memory\n
2fa0: 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d  ");.  exit(1);.}
2fb0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49 2f  ../*.** Write I/
2fc0: 4f 20 74 72 61 63 65 73 20 74 6f 20 74 68 65 20  O traces to the 
2fd0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61 6d  following stream
2fe0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
2ff0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
3000: 45 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 69  E.static FILE *i
3010: 6f 74 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64  otrace = 0;.#end
3020: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
3030: 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b  outine works lik
3040: 65 20 70 72 69 6e 74 66 20 69 6e 20 74 68 61 74  e printf in that
3050: 20 69 74 73 20 66 69 72 73 74 20 61 72 67 75 6d   its first argum
3060: 65 6e 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72 6d  ent is a.** form
3070: 61 74 20 73 74 72 69 6e 67 20 61 6e 64 20 73 75  at string and su
3080: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
3090: 74 73 20 61 72 65 20 76 61 6c 75 65 73 20 74 6f  ts are values to
30a0: 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 0a   be substituted.
30b0: 2a 2a 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 25  ** in place of %
30c0: 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 72 65   fields.  The re
30d0: 73 75 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74 69  sult of formatti
30e0: 6e 67 20 74 68 69 73 20 73 74 72 69 6e 67 0a 2a  ng this string.*
30f0: 2a 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  * is written to 
3100: 69 6f 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66 64  iotrace..*/.#ifd
3110: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
3120: 5f 49 4f 54 52 41 43 45 0a 73 74 61 74 69 63 20  _IOTRACE.static 
3130: 76 6f 69 64 20 53 51 4c 49 54 45 5f 43 44 45 43  void SQLITE_CDEC
3140: 4c 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66 28  L iotracePrintf(
3150: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
3160: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
3170: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
3180: 2a 7a 3b 0a 20 20 69 66 28 20 69 6f 74 72 61 63  *z;.  if( iotrac
3190: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
31a0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
31b0: 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71  ormat);.  z = sq
31c0: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
31d0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
31e0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 75 74 66  a_end(ap);.  utf
31f0: 38 5f 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65  8_printf(iotrace
3200: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73 71  , "%s", z);.  sq
3210: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 7d  lite3_free(z);.}
3220: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
3230: 75 74 70 75 74 20 73 74 72 69 6e 67 20 7a 55 74  utput string zUt
3240: 66 20 74 6f 20 73 74 72 65 61 6d 20 70 4f 75 74  f to stream pOut
3250: 20 61 73 20 77 20 63 68 61 72 61 63 74 65 72 73   as w characters
3260: 2e 20 20 49 66 20 77 20 69 73 20 6e 65 67 61 74  .  If w is negat
3270: 69 76 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 69 67  ive,.** then rig
3280: 68 74 2d 6a 75 73 74 69 66 79 20 74 68 65 20 74  ht-justify the t
3290: 65 78 74 2e 20 20 57 20 69 73 20 74 68 65 20 77  ext.  W is the w
32a0: 69 64 74 68 20 69 6e 20 55 54 46 2d 38 20 63 68  idth in UTF-8 ch
32b0: 61 72 61 63 74 65 72 73 2c 20 6e 6f 74 0a 2a 2a  aracters, not.**
32c0: 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 69 73   in bytes.  This
32d0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
32e0: 6f 6d 20 74 68 65 20 25 2a 2e 2a 73 20 73 70 65  om the %*.*s spe
32f0: 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 70 72  cification in pr
3300: 69 6e 74 66 0a 2a 2a 20 73 69 6e 63 65 20 77 69  intf.** since wi
3310: 74 68 20 25 2a 2e 2a 73 20 74 68 65 20 77 69 64  th %*.*s the wid
3320: 74 68 20 69 73 20 6d 65 61 73 75 72 65 64 20 69  th is measured i
3330: 6e 20 62 79 74 65 73 2c 20 6e 6f 74 20 63 68 61  n bytes, not cha
3340: 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  racters..*/.stat
3350: 69 63 20 76 6f 69 64 20 75 74 66 38 5f 77 69 64  ic void utf8_wid
3360: 74 68 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a 70  th_print(FILE *p
3370: 4f 75 74 2c 20 69 6e 74 20 77 2c 20 63 6f 6e 73  Out, int w, cons
3380: 74 20 63 68 61 72 20 2a 7a 55 74 66 29 7b 0a 20  t char *zUtf){. 
3390: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 3b   int i;.  int n;
33a0: 0a 20 20 69 6e 74 20 61 77 20 3d 20 77 3c 30 20  .  int aw = w<0 
33b0: 3f 20 2d 77 20 3a 20 77 3b 0a 20 20 63 68 61 72  ? -w : w;.  char
33c0: 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 69   zBuf[1000];.  i
33d0: 66 28 20 61 77 3e 28 69 6e 74 29 73 69 7a 65 6f  f( aw>(int)sizeo
33e0: 66 28 7a 42 75 66 29 2f 33 20 29 20 61 77 20 3d  f(zBuf)/3 ) aw =
33f0: 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42 75   (int)sizeof(zBu
3400: 66 29 2f 33 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d  f)/3;.  for(i=n=
3410: 30 3b 20 7a 55 74 66 5b 69 5d 3b 20 69 2b 2b 29  0; zUtf[i]; i++)
3420: 7b 0a 20 20 20 20 69 66 28 20 28 7a 55 74 66 5b  {.    if( (zUtf[
3430: 69 5d 26 30 78 63 30 29 21 3d 30 78 38 30 20 29  i]&0xc0)!=0x80 )
3440: 7b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  {.      n++;.   
3450: 20 20 20 69 66 28 20 6e 3d 3d 61 77 20 29 7b 0a     if( n==aw ){.
3460: 20 20 20 20 20 20 20 20 64 6f 7b 20 69 2b 2b 3b          do{ i++;
3470: 20 7d 77 68 69 6c 65 28 20 28 7a 55 74 66 5b 69   }while( (zUtf[i
3480: 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29 3b  ]&0xc0)==0x80 );
3490: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
34a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
34b0: 7d 0a 20 20 69 66 28 20 6e 3e 3d 61 77 20 29 7b  }.  if( n>=aw ){
34c0: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
34d0: 28 70 4f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69  (pOut, "%.*s", i
34e0: 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73 65  , zUtf);.  }else
34f0: 20 69 66 28 20 77 3c 30 20 29 7b 0a 20 20 20 20   if( w<0 ){.    
3500: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 4f 75 74  utf8_printf(pOut
3510: 2c 20 22 25 2a 73 25 73 22 2c 20 61 77 2d 6e 2c  , "%*s%s", aw-n,
3520: 20 22 22 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65   "", zUtf);.  }e
3530: 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  lse{.    utf8_pr
3540: 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 25 2a  intf(pOut, "%s%*
3550: 73 22 2c 20 7a 55 74 66 2c 20 61 77 2d 6e 2c 20  s", zUtf, aw-n, 
3560: 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  "");.  }.}.../*.
3570: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 73 20 69 66  ** Determines if
3580: 20 61 20 73 74 72 69 6e 67 20 69 73 20 61 20 6e   a string is a n
3590: 75 6d 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a 2f  umber of not..*/
35a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e 75  .static int isNu
35b0: 6d 62 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  mber(const char 
35c0: 2a 7a 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75 6d  *z, int *realnum
35d0: 29 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27  ){.  if( *z=='-'
35e0: 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a 2b   || *z=='+' ) z+
35f0: 2b 3b 0a 20 20 69 66 28 20 21 49 73 44 69 67 69  +;.  if( !IsDigi
3600: 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65 74  t(*z) ){.    ret
3610: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b 2b  urn 0;.  }.  z++
3620: 3b 0a 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20  ;.  if( realnum 
3630: 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b 0a  ) *realnum = 0;.
3640: 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69 74    while( IsDigit
3650: 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  (*z) ){ z++; }. 
3660: 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a   if( *z=='.' ){.
3670: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28      z++;.    if(
3680: 20 21 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20   !IsDigit(*z) ) 
3690: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68  return 0;.    wh
36a0: 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29  ile( IsDigit(*z)
36b0: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69   ){ z++; }.    i
36c0: 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65  f( realnum ) *re
36d0: 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20  alnum = 1;.  }. 
36e0: 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20   if( *z=='e' || 
36f0: 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 7a  *z=='E' ){.    z
3700: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  ++;.    if( *z==
3710: 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 29  '+' || *z=='-' )
3720: 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 49   z++;.    if( !I
3730: 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74  sDigit(*z) ) ret
3740: 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  urn 0;.    while
3750: 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29 7b  ( IsDigit(*z) ){
3760: 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20   z++; }.    if( 
3770: 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e  realnum ) *realn
3780: 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  um = 1;.  }.  re
3790: 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f  turn *z==0;.}../
37a0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
37b0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68 61  tring length tha
37c0: 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20  t is limited to 
37d0: 77 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72  what can be stor
37e0: 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33  ed in.** lower 3
37f0: 30 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d 62  0 bits of a 32-b
3800: 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  it signed intege
3810: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
3820: 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74 20   strlen30(const 
3830: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73  char *z){.  cons
3840: 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a  t char *z2 = z;.
3850: 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 20    while( *z2 ){ 
3860: 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e  z2++; }.  return
3870: 20 30 78 33 66 66 66 66 66 66 66 20 26 20 28 69   0x3fffffff & (i
3880: 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a  nt)(z2 - z);.}..
3890: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
38a0: 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 73 74 72   length of a str
38b0: 69 6e 67 20 69 6e 20 63 68 61 72 61 63 74 65 72  ing in character
38c0: 73 2e 20 20 4d 75 6c 74 69 62 79 74 65 20 55 54  s.  Multibyte UT
38d0: 46 38 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a  F8 characters.**
38e0: 20 63 6f 75 6e 74 20 61 73 20 61 20 73 69 6e 67   count as a sing
38f0: 6c 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  le character..*/
3900: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c  .static int strl
3910: 65 6e 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61  enChar(const cha
3920: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  r *z){.  int n =
3930: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20   0;.  while( *z 
3940: 29 7b 0a 20 20 20 20 69 66 28 20 28 30 78 63 30  ){.    if( (0xc0
3950: 26 2a 28 7a 2b 2b 29 29 21 3d 30 78 38 30 20 29  &*(z++))!=0x80 )
3960: 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75   n++;.  }.  retu
3970: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn n;.}../*.** T
3980: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64  his routine read
3990: 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74  s a line of text
39a0: 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73   from FILE in, s
39b0: 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78  tores.** the tex
39c0: 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  t in memory obta
39d0: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
39e0: 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  () and returns a
39f0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
3a00: 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69  he text.  NULL i
3a10: 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e  s returned at en
3a20: 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66  d of file, or if
3a30: 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69   malloc().** fai
3a40: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c 69  ls..**.** If zLi
3a50: 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  ne is not NULL t
3a60: 68 65 6e 20 69 74 20 69 73 20 61 20 6d 61 6c 6c  hen it is a mall
3a70: 6f 63 65 64 20 62 75 66 66 65 72 20 72 65 74 75  oced buffer retu
3a80: 72 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70  rned from.** a p
3a90: 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20  revious call to 
3aa0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 68 61  this routine tha
3ab0: 74 20 6d 61 79 20 62 65 20 72 65 75 73 65 64 2e  t may be reused.
3ac0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
3ad0: 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63  *local_getline(c
3ae0: 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c 45  har *zLine, FILE
3af0: 20 2a 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c 69   *in){.  int nLi
3b00: 6e 65 20 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f 20  ne = zLine==0 ? 
3b10: 30 20 3a 20 31 30 30 3b 0a 20 20 69 6e 74 20 6e  0 : 100;.  int n
3b20: 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
3b30: 31 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31  1 ){.    if( n+1
3b40: 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20  00>nLine ){.    
3b50: 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a    nLine = nLine*
3b60: 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a  2 + 100;.      z
3b70: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a  Line = realloc(z
3b80: 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20  Line, nLine);.  
3b90: 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30      if( zLine==0
3ba0: 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
3bb0: 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a  memory();.    }.
3bc0: 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26 7a      if( fgets(&z
3bd0: 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d  Line[n], nLine -
3be0: 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20   n, in)==0 ){.  
3bf0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
3c00: 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69          free(zLi
3c10: 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ne);.        ret
3c20: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
3c30: 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20       zLine[n] = 
3c40: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
3c50: 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
3c60: 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b 3b   zLine[n] ) n++;
3c70: 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
3c80: 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27  zLine[n-1]=='\n'
3c90: 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20   ){.      n--;. 
3ca0: 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20       if( n>0 && 
3cb0: 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72 27  zLine[n-1]=='\r'
3cc0: 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c   ) n--;.      zL
3cd0: 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[n] = 0;.    
3ce0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3cf0: 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f   }.#if defined(_
3d00: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
3d10: 64 28 57 49 4e 33 32 29 0a 20 20 2f 2a 20 46 6f  d(WIN32).  /* Fo
3d20: 72 20 69 6e 74 65 72 61 63 74 69 76 65 20 69 6e  r interactive in
3d30: 70 75 74 20 6f 6e 20 57 69 6e 64 6f 77 73 20 73  put on Windows s
3d40: 79 73 74 65 6d 73 2c 20 74 72 61 6e 73 6c 61 74  ystems, translat
3d50: 65 20 74 68 65 0a 20 20 2a 2a 20 6d 75 6c 74 69  e the.  ** multi
3d60: 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72 73  -byte characters
3d70: 65 74 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  et characters in
3d80: 74 6f 20 55 54 46 2d 38 2e 20 2a 2f 0a 20 20 69  to UTF-8. */.  i
3d90: 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65  f( stdin_is_inte
3da0: 72 61 63 74 69 76 65 20 26 26 20 69 6e 3d 3d 73  ractive && in==s
3db0: 74 64 69 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  tdin ){.    char
3dc0: 20 2a 7a 54 72 61 6e 73 20 3d 20 73 71 6c 69 74   *zTrans = sqlit
3dd0: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
3de0: 5f 75 74 66 38 5f 76 32 28 7a 4c 69 6e 65 2c 20  _utf8_v2(zLine, 
3df0: 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 72 61  0);.    if( zTra
3e00: 6e 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ns ){.      int 
3e10: 6e 54 72 61 6e 73 20 3d 20 73 74 72 6c 65 6e 33  nTrans = strlen3
3e20: 30 28 7a 54 72 61 6e 73 29 2b 31 3b 0a 20 20 20  0(zTrans)+1;.   
3e30: 20 20 20 69 66 28 20 6e 54 72 61 6e 73 3e 6e 4c     if( nTrans>nL
3e40: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ine ){.        z
3e50: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a  Line = realloc(z
3e60: 4c 69 6e 65 2c 20 6e 54 72 61 6e 73 29 3b 0a 20  Line, nTrans);. 
3e70: 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65         if( zLine
3e80: 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f  ==0 ) shell_out_
3e90: 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20  of_memory();.   
3ea0: 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70     }.      memcp
3eb0: 79 28 7a 4c 69 6e 65 2c 20 7a 54 72 61 6e 73 2c  y(zLine, zTrans,
3ec0: 20 6e 54 72 61 6e 73 29 3b 0a 20 20 20 20 20 20   nTrans);.      
3ed0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 72  sqlite3_free(zTr
3ee0: 61 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ans);.    }.  }.
3ef0: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
3f00: 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
3f10: 69 6e 65 64 28 57 49 4e 33 32 29 20 2a 2f 0a 20  ined(WIN32) */. 
3f20: 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d   return zLine;.}
3f30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
3f40: 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f   a single line o
3f50: 66 20 69 6e 70 75 74 20 74 65 78 74 2e 0a 2a 2a  f input text..**
3f60: 0a 2a 2a 20 49 66 20 69 6e 3d 3d 30 20 74 68 65  .** If in==0 the
3f70: 6e 20 72 65 61 64 20 66 72 6f 6d 20 73 74 61 6e  n read from stan
3f80: 64 61 72 64 20 69 6e 70 75 74 20 61 6e 64 20 70  dard input and p
3f90: 72 6f 6d 70 74 20 62 65 66 6f 72 65 20 65 61 63  rompt before eac
3fa0: 68 20 6c 69 6e 65 2e 0a 2a 2a 20 49 66 20 69 73  h line..** If is
3fb0: 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69 73 20  Continuation is 
3fc0: 74 72 75 65 2c 20 74 68 65 6e 20 61 20 63 6f 6e  true, then a con
3fd0: 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70 74  tinuation prompt
3fe0: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   is appropriate.
3ff0: 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69 6e 75  .** If isContinu
4000: 61 74 69 6f 6e 20 69 73 20 7a 65 72 6f 2c 20 74  ation is zero, t
4010: 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  hen the main pro
4020: 6d 70 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  mpt should be us
4030: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 50 72  ed..**.** If zPr
4040: 69 6f 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ior is not NULL 
4050: 74 68 65 6e 20 69 74 20 69 73 20 61 20 62 75 66  then it is a buf
4060: 66 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  fer from a prior
4070: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 2a 2a   call to this.**
4080: 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 63 61   routine that ca
4090: 6e 20 62 65 20 72 65 75 73 65 64 2e 0a 2a 2a 0a  n be reused..**.
40a0: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  ** The result is
40b0: 20 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63 65   stored in space
40c0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
40d0: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
40e0: 20 65 69 74 68 65 72 0a 2a 2a 20 62 65 20 66 72   either.** be fr
40f0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
4100: 72 20 6f 72 20 65 6c 73 65 20 70 61 73 73 65 64  r or else passed
4110: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 69 73 20   back into this 
4120: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 68 65 0a  routine via the.
4130: 2a 2a 20 7a 50 72 69 6f 72 20 61 72 67 75 6d 65  ** zPrior argume
4140: 6e 74 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f  nt for reuse..*/
4150: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6f 6e  .static char *on
4160: 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 46 49 4c  e_input_line(FIL
4170: 45 20 2a 69 6e 2c 20 63 68 61 72 20 2a 7a 50 72  E *in, char *zPr
4180: 69 6f 72 2c 20 69 6e 74 20 69 73 43 6f 6e 74 69  ior, int isConti
4190: 6e 75 61 74 69 6f 6e 29 7b 0a 20 20 63 68 61 72  nuation){.  char
41a0: 20 2a 7a 50 72 6f 6d 70 74 3b 0a 20 20 63 68 61   *zPrompt;.  cha
41b0: 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20 69 66  r *zResult;.  if
41c0: 28 20 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20 7a  ( in!=0 ){.    z
41d0: 52 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f 67  Result = local_g
41e0: 65 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20 69  etline(zPrior, i
41f0: 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n);.  }else{.   
4200: 20 7a 50 72 6f 6d 70 74 20 3d 20 69 73 43 6f 6e   zPrompt = isCon
4210: 74 69 6e 75 61 74 69 6f 6e 20 3f 20 63 6f 6e 74  tinuation ? cont
4220: 69 6e 75 65 50 72 6f 6d 70 74 20 3a 20 6d 61 69  inuePrompt : mai
4230: 6e 50 72 6f 6d 70 74 3b 0a 23 69 66 20 53 48 45  nPrompt;.#if SHE
4240: 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c 5f 47 45 54  LL_USE_LOCAL_GET
4250: 4c 49 4e 45 0a 20 20 20 20 70 72 69 6e 74 66 28  LINE.    printf(
4260: 22 25 73 22 2c 20 7a 50 72 6f 6d 70 74 29 3b 0a  "%s", zPrompt);.
4270: 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75      fflush(stdou
4280: 74 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20  t);.    zResult 
4290: 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28  = local_getline(
42a0: 7a 50 72 69 6f 72 2c 20 73 74 64 69 6e 29 3b 0a  zPrior, stdin);.
42b0: 23 65 6c 73 65 0a 20 20 20 20 66 72 65 65 28 7a  #else.    free(z
42c0: 50 72 69 6f 72 29 3b 0a 20 20 20 20 7a 52 65 73  Prior);.    zRes
42d0: 75 6c 74 20 3d 20 73 68 65 6c 6c 5f 72 65 61 64  ult = shell_read
42e0: 6c 69 6e 65 28 7a 50 72 6f 6d 70 74 29 3b 0a 20  line(zPrompt);. 
42f0: 20 20 20 69 66 28 20 7a 52 65 73 75 6c 74 20 26     if( zResult &
4300: 26 20 2a 7a 52 65 73 75 6c 74 20 29 20 73 68 65  & *zResult ) she
4310: 6c 6c 5f 61 64 64 5f 68 69 73 74 6f 72 79 28 7a  ll_add_history(z
4320: 52 65 73 75 6c 74 29 3b 0a 23 65 6e 64 69 66 0a  Result);.#endif.
4330: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65    }.  return zRe
4340: 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  sult;.}.../*.** 
4350: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
4360: 20 6f 66 20 61 20 68 65 78 61 64 65 63 69 6d 61   of a hexadecima
4370: 6c 20 64 69 67 69 74 2e 20 20 52 65 74 75 72 6e  l digit.  Return
4380: 20 2d 31 20 69 66 20 74 68 65 20 69 6e 70 75 74   -1 if the input
4390: 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 68 65 78  .** is not a hex
43a0: 20 64 69 67 69 74 2e 0a 2a 2f 0a 73 74 61 74 69   digit..*/.stati
43b0: 63 20 69 6e 74 20 68 65 78 44 69 67 69 74 56 61  c int hexDigitVa
43c0: 6c 75 65 28 63 68 61 72 20 63 29 7b 0a 20 20 69  lue(char c){.  i
43d0: 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d  f( c>='0' && c<=
43e0: 27 39 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d  '9' ) return c -
43f0: 20 27 30 27 3b 0a 20 20 69 66 28 20 63 3e 3d 27   '0';.  if( c>='
4400: 61 27 20 26 26 20 63 3c 3d 27 66 27 20 29 20 72  a' && c<='f' ) r
4410: 65 74 75 72 6e 20 63 20 2d 20 27 61 27 20 2b 20  eturn c - 'a' + 
4420: 31 30 3b 0a 20 20 69 66 28 20 63 3e 3d 27 41 27  10;.  if( c>='A'
4430: 20 26 26 20 63 3c 3d 27 46 27 20 29 20 72 65 74   && c<='F' ) ret
4440: 75 72 6e 20 63 20 2d 20 27 41 27 20 2b 20 31 30  urn c - 'A' + 10
4450: 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ;.  return -1;.}
4460: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65  ../*.** Interpre
4470: 74 20 7a 41 72 67 20 61 73 20 61 6e 20 69 6e 74  t zArg as an int
4480: 65 67 65 72 20 76 61 6c 75 65 2c 20 70 6f 73 73  eger value, poss
4490: 69 62 6c 79 20 77 69 74 68 20 73 75 66 66 69 78  ibly with suffix
44a0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  es..*/.static sq
44b0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 6e 74 65  lite3_int64 inte
44c0: 67 65 72 56 61 6c 75 65 28 63 6f 6e 73 74 20 63  gerValue(const c
44d0: 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73 71  har *zArg){.  sq
44e0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 20 3d 20  lite3_int64 v = 
44f0: 30 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  0;.  static cons
4500: 74 20 73 74 72 75 63 74 20 7b 20 63 68 61 72 20  t struct { char 
4510: 2a 7a 53 75 66 66 69 78 3b 20 69 6e 74 20 69 4d  *zSuffix; int iM
4520: 75 6c 74 3b 20 7d 20 61 4d 75 6c 74 5b 5d 20 3d  ult; } aMult[] =
4530: 20 7b 0a 20 20 20 20 7b 20 22 4b 69 42 22 2c 20   {.    { "KiB", 
4540: 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4d  1024 },.    { "M
4550: 69 42 22 2c 20 31 30 32 34 2a 31 30 32 34 20 7d  iB", 1024*1024 }
4560: 2c 0a 20 20 20 20 7b 20 22 47 69 42 22 2c 20 31  ,.    { "GiB", 1
4570: 30 32 34 2a 31 30 32 34 2a 31 30 32 34 20 7d 2c  024*1024*1024 },
4580: 0a 20 20 20 20 7b 20 22 4b 42 22 2c 20 20 31 30  .    { "KB",  10
4590: 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 42 22  00 },.    { "MB"
45a0: 2c 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20 20  ,  1000000 },.  
45b0: 20 20 7b 20 22 47 42 22 2c 20 20 31 30 30 30 30    { "GB",  10000
45c0: 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22  00000 },.    { "
45d0: 4b 22 2c 20 20 20 31 30 30 30 20 7d 2c 0a 20 20  K",   1000 },.  
45e0: 20 20 7b 20 22 4d 22 2c 20 20 20 31 30 30 30 30    { "M",   10000
45f0: 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 22 2c  00 },.    { "G",
4600: 20 20 20 31 30 30 30 30 30 30 30 30 30 20 7d 2c     1000000000 },
4610: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
4620: 20 69 6e 74 20 69 73 4e 65 67 20 3d 20 30 3b 0a   int isNeg = 0;.
4630: 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27    if( zArg[0]=='
4640: 2d 27 20 29 7b 0a 20 20 20 20 69 73 4e 65 67 20  -' ){.    isNeg 
4650: 3d 20 31 3b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b  = 1;.    zArg++;
4660: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 41 72  .  }else if( zAr
4670: 67 5b 30 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20 20  g[0]=='+' ){.   
4680: 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 0a 20 20 69   zArg++;.  }.  i
4690: 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20  f( zArg[0]=='0' 
46a0: 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20  && zArg[1]=='x' 
46b0: 29 7b 0a 20 20 20 20 69 6e 74 20 78 3b 0a 20 20  ){.    int x;.  
46c0: 20 20 7a 41 72 67 20 2b 3d 20 32 3b 0a 20 20 20    zArg += 2;.   
46d0: 20 77 68 69 6c 65 28 20 28 78 20 3d 20 68 65 78   while( (x = hex
46e0: 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67 5b  DigitValue(zArg[
46f0: 30 5d 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  0]))>=0 ){.     
4700: 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20 78 3b   v = (v<<4) + x;
4710: 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20  .      zArg++;. 
4720: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
4730: 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69 74    while( IsDigit
4740: 28 7a 41 72 67 5b 30 5d 29 20 29 7b 0a 20 20 20  (zArg[0]) ){.   
4750: 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 7a 41     v = v*10 + zA
4760: 72 67 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20 20  rg[0] - '0';.   
4770: 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d     zArg++;.    }
4780: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
4790: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 75 6c  i<ArraySize(aMul
47a0: 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  t); i++){.    if
47b0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
47c0: 70 28 61 4d 75 6c 74 5b 69 5d 2e 7a 53 75 66 66  p(aMult[i].zSuff
47d0: 69 78 2c 20 7a 41 72 67 29 3d 3d 30 20 29 7b 0a  ix, zArg)==0 ){.
47e0: 20 20 20 20 20 20 76 20 2a 3d 20 61 4d 75 6c 74        v *= aMult
47f0: 5b 69 5d 2e 69 4d 75 6c 74 3b 0a 20 20 20 20 20  [i].iMult;.     
4800: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4810: 7d 0a 20 20 72 65 74 75 72 6e 20 69 73 4e 65 67  }.  return isNeg
4820: 3f 20 2d 76 20 3a 20 76 3b 0a 7d 0a 0a 2f 2a 0a  ? -v : v;.}../*.
4830: 2a 2a 20 41 20 76 61 72 69 61 62 6c 65 20 6c 65  ** A variable le
4840: 6e 67 74 68 20 73 74 72 69 6e 67 20 74 6f 20 77  ngth string to w
4850: 68 69 63 68 20 6f 6e 65 20 63 61 6e 20 61 70 70  hich one can app
4860: 65 6e 64 20 74 65 78 74 2e 0a 2a 2f 0a 74 79 70  end text..*/.typ
4870: 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65 6c  edef struct Shel
4880: 6c 54 65 78 74 20 53 68 65 6c 6c 54 65 78 74 3b  lText ShellText;
4890: 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 54 65 78  .struct ShellTex
48a0: 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  t {.  char *z;. 
48b0: 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e 41   int n;.  int nA
48c0: 6c 6c 6f 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  lloc;.};../*.** 
48d0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64  Initialize and d
48e0: 65 73 74 72 6f 79 20 61 20 53 68 65 6c 6c 54 65  estroy a ShellTe
48f0: 78 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61  xt object.*/.sta
4900: 74 69 63 20 76 6f 69 64 20 69 6e 69 74 54 65 78  tic void initTex
4910: 74 28 53 68 65 6c 6c 54 65 78 74 20 2a 70 29 7b  t(ShellText *p){
4920: 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
4930: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a 73  sizeof(*p));.}.s
4940: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54  tatic void freeT
4950: 65 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a 70  ext(ShellText *p
4960: 29 7b 0a 20 20 66 72 65 65 28 70 2d 3e 7a 29 3b  ){.  free(p->z);
4970: 0a 20 20 69 6e 69 74 54 65 78 74 28 70 29 3b 0a  .  initText(p);.
4980: 7d 0a 0a 2f 2a 20 7a 49 6e 20 69 73 20 65 69 74  }../* zIn is eit
4990: 68 65 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  her a pointer to
49a0: 20 61 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74   a NULL-terminat
49b0: 65 64 20 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d  ed string in mem
49c0: 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20  ory obtained.** 
49d0: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20 6f  from malloc(), o
49e0: 72 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  r a NULL pointer
49f0: 2e 20 54 68 65 20 73 74 72 69 6e 67 20 70 6f 69  . The string poi
4a00: 6e 74 65 64 20 74 6f 20 62 79 20 7a 41 70 70 65  nted to by zAppe
4a10: 6e 64 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 74  nd is.** added t
4a20: 6f 20 7a 49 6e 2c 20 61 6e 64 20 74 68 65 20 72  o zIn, and the r
4a30: 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20 69  esult returned i
4a40: 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
4a50: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e  d from malloc().
4a60: 0a 2a 2a 20 7a 49 6e 2c 20 69 66 20 69 74 20 77  .** zIn, if it w
4a70: 61 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73 20  as not NULL, is 
4a80: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  freed..**.** If 
4a90: 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
4aa0: 6e 74 2c 20 71 75 6f 74 65 2c 20 69 73 20 6e 6f  nt, quote, is no
4ab0: 74 20 27 5c 30 27 2c 20 74 68 65 6e 20 69 74 20  t '\0', then it 
4ac0: 69 73 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20  is used as a.** 
4ad0: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20  quote character 
4ae0: 66 6f 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f 0a  for zAppend..*/.
4af0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70 65  static void appe
4b00: 6e 64 54 65 78 74 28 53 68 65 6c 6c 54 65 78 74  ndText(ShellText
4b10: 20 2a 70 2c 20 63 68 61 72 20 63 6f 6e 73 74 20   *p, char const 
4b20: 2a 7a 41 70 70 65 6e 64 2c 20 63 68 61 72 20 71  *zAppend, char q
4b30: 75 6f 74 65 29 7b 0a 20 20 69 6e 74 20 6c 65 6e  uote){.  int len
4b40: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
4b50: 20 6e 41 70 70 65 6e 64 20 3d 20 73 74 72 6c 65   nAppend = strle
4b60: 6e 33 30 28 7a 41 70 70 65 6e 64 29 3b 0a 0a 20  n30(zAppend);.. 
4b70: 20 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b 70   len = nAppend+p
4b80: 2d 3e 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75 6f  ->n+1;.  if( quo
4b90: 74 65 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b 3d  te ){.    len +=
4ba0: 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   2;.    for(i=0;
4bb0: 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29   i<nAppend; i++)
4bc0: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70 70  {.      if( zApp
4bd0: 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 20  end[i]==quote ) 
4be0: 6c 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  len++;.    }.  }
4bf0: 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 6c 65 6e  ..  if( p->n+len
4c00: 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  >=p->nAlloc ){. 
4c10: 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70     p->nAlloc = p
4c20: 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6c 65 6e  ->nAlloc*2 + len
4c30: 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 7a 20   + 20;.    p->z 
4c40: 3d 20 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20  = realloc(p->z, 
4c50: 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  p->nAlloc);.    
4c60: 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73 68  if( p->z==0 ) sh
4c70: 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  ell_out_of_memor
4c80: 79 28 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  y();.  }..  if( 
4c90: 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 68 61  quote ){.    cha
4ca0: 72 20 2a 7a 43 73 72 20 3d 20 70 2d 3e 7a 2b 70  r *zCsr = p->z+p
4cb0: 2d 3e 6e 3b 0a 20 20 20 20 2a 7a 43 73 72 2b 2b  ->n;.    *zCsr++
4cc0: 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 66 6f   = quote;.    fo
4cd0: 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e 64  r(i=0; i<nAppend
4ce0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 7a  ; i++){.      *z
4cf0: 43 73 72 2b 2b 20 3d 20 7a 41 70 70 65 6e 64 5b  Csr++ = zAppend[
4d00: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  i];.      if( zA
4d10: 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20  ppend[i]==quote 
4d20: 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74  ) *zCsr++ = quot
4d30: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a 43  e;.    }.    *zC
4d40: 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20  sr++ = quote;.  
4d50: 20 20 70 2d 3e 6e 20 3d 20 28 69 6e 74 29 28 7a    p->n = (int)(z
4d60: 43 73 72 20 2d 20 70 2d 3e 7a 29 3b 0a 20 20 20  Csr - p->z);.   
4d70: 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a 20   *zCsr = '\0';. 
4d80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 63   }else{.    memc
4d90: 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e 2c 20 7a 41  py(p->z+p->n, zA
4da0: 70 70 65 6e 64 2c 20 6e 41 70 70 65 6e 64 29 3b  ppend, nAppend);
4db0: 0a 20 20 20 20 70 2d 3e 6e 20 2b 3d 20 6e 41 70  .    p->n += nAp
4dc0: 70 65 6e 64 3b 0a 20 20 20 20 70 2d 3e 7a 5b 70  pend;.    p->z[p
4dd0: 2d 3e 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  ->n] = '\0';.  }
4de0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
4df0: 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  t to determine i
4e00: 66 20 69 64 65 6e 74 69 66 69 65 72 20 7a 4e 61  f identifier zNa
4e10: 6d 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 71  me needs to be q
4e20: 75 6f 74 65 64 2c 20 65 69 74 68 65 72 0a 2a 2a  uoted, either.**
4e30: 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e 74   because it cont
4e40: 61 69 6e 73 20 6e 6f 6e 2d 61 6c 70 68 61 6e 75  ains non-alphanu
4e50: 6d 65 72 69 63 20 63 68 61 72 61 63 74 65 72 73  meric characters
4e60: 2c 20 6f 72 20 62 65 63 61 75 73 65 20 69 74 20  , or because it 
4e70: 69 73 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20  is an.** SQLite 
4e80: 6b 65 79 77 6f 72 64 2e 20 20 42 65 20 63 6f 6e  keyword.  Be con
4e90: 73 65 72 76 61 74 69 76 65 20 69 6e 20 74 68 69  servative in thi
4ea0: 73 20 65 73 74 69 6d 61 74 65 3a 20 20 57 68 65  s estimate:  Whe
4eb0: 6e 20 69 6e 20 64 6f 75 62 74 20 61 73 73 75 6d  n in doubt assum
4ec0: 65 0a 2a 2a 20 74 68 61 74 20 71 75 6f 74 69 6e  e.** that quotin
4ed0: 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  g is required..*
4ee0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 27 22 27 20  *.** Return '"' 
4ef0: 69 66 20 71 75 6f 74 69 6e 67 20 69 73 20 72 65  if quoting is re
4f00: 71 75 69 72 65 64 2e 20 20 52 65 74 75 72 6e 20  quired.  Return 
4f10: 30 20 69 66 20 6e 6f 20 71 75 6f 74 69 6e 67 20  0 if no quoting 
4f20: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  is required..*/.
4f30: 73 74 61 74 69 63 20 63 68 61 72 20 71 75 6f 74  static char quot
4f40: 65 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61 72  eChar(const char
4f50: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
4f60: 69 3b 0a 20 20 69 66 28 20 21 69 73 61 6c 70 68  i;.  if( !isalph
4f70: 61 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  a((unsigned char
4f80: 29 7a 4e 61 6d 65 5b 30 5d 29 20 26 26 20 7a 4e  )zName[0]) && zN
4f90: 61 6d 65 5b 30 5d 21 3d 27 5f 27 20 29 20 72 65  ame[0]!='_' ) re
4fa0: 74 75 72 6e 20 27 22 27 3b 0a 20 20 66 6f 72 28  turn '"';.  for(
4fb0: 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69  i=0; zName[i]; i
4fc0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73  ++){.    if( !is
4fd0: 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64 20  alnum((unsigned 
4fe0: 63 68 61 72 29 7a 4e 61 6d 65 5b 69 5d 29 20 26  char)zName[i]) &
4ff0: 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20  & zName[i]!='_' 
5000: 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20 20  ) return '"';.  
5010: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
5020: 65 33 5f 6b 65 79 77 6f 72 64 5f 63 68 65 63 6b  e3_keyword_check
5030: 28 7a 4e 61 6d 65 2c 20 69 29 20 3f 20 27 22 27  (zName, i) ? '"'
5040: 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   : 0;.}../*.** C
5050: 6f 6e 73 74 72 75 63 74 20 61 20 66 61 6b 65 20  onstruct a fake 
5060: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61 6e 64 20  object name and 
5070: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20 64  column list to d
5080: 65 73 63 72 69 62 65 20 74 68 65 20 73 74 72 75  escribe the stru
5090: 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74 68 65 20  cture.** of the 
50a0: 76 69 65 77 2c 20 76 69 72 74 75 61 6c 20 74 61  view, virtual ta
50b0: 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65 20 76 61  ble, or table va
50c0: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 7a 53  lued function zS
50d0: 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f 0a  chema.zName..*/.
50e0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 68 65  static char *she
50f0: 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 0a 20 20  llFakeSchema(.  
5100: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
5110: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
5120: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5130: 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  on containing th
5140: 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f 6e 73  e vtab */.  cons
5150: 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 2c  t char *zSchema,
5160: 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66      /* Schema of
5170: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 6f   the database ho
5180: 6c 64 69 6e 67 20 74 68 65 20 76 74 61 62 20 2a  lding the vtab *
5190: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
51a0: 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f 2a 20 54  zName       /* T
51b0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
51c0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
51d0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
51e0: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
51f0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53 68  char *zSql;.  Sh
5200: 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 63 68 61  ellText s;.  cha
5210: 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72  r cQuote;.  char
5220: 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20 20   *zDiv = "(";.  
5230: 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a 20  int nRow = 0;.. 
5240: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
5250: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
5260: 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f 69 6e 66  \"%w\".table_inf
5270: 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20 20 20 20  o=%Q;",.        
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5290: 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53 63 68 65   zSchema ? zSche
52a0: 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e 61  ma : "main", zNa
52b0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  me);.  sqlite3_p
52c0: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
52d0: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
52e0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
52f0: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 6e 69 74  ee(zSql);.  init
5300: 54 65 78 74 28 26 73 29 3b 0a 20 20 69 66 28 20  Text(&s);.  if( 
5310: 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 63  zSchema ){.    c
5320: 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61  Quote = quoteCha
5330: 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  r(zSchema);.    
5340: 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73 71  if( cQuote && sq
5350: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53  lite3_stricmp(zS
5360: 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 3d 3d 30  chema,"temp")==0
5370: 20 29 20 63 51 75 6f 74 65 20 3d 20 30 3b 0a 20   ) cQuote = 0;. 
5380: 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
5390: 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51 75 6f 74  , zSchema, cQuot
53a0: 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  e);.    appendTe
53b0: 78 74 28 26 73 2c 20 22 2e 22 2c 20 30 29 3b 0a  xt(&s, ".", 0);.
53c0: 20 20 7d 0a 20 20 63 51 75 6f 74 65 20 3d 20 71    }.  cQuote = q
53d0: 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b  uoteChar(zName);
53e0: 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73  .  appendText(&s
53f0: 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f 74 65 29  , zName, cQuote)
5400: 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ;.  while( sqlit
5410: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
5420: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
5430: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
5440: 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ol = (const char
5450: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
5460: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b  _text(pStmt, 1);
5470: 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20  .    nRow++;.   
5480: 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
5490: 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 7a 44  zDiv, 0);.    zD
54a0: 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20 20 63 51  iv = ",";.    cQ
54b0: 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72  uote = quoteChar
54c0: 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70 65  (zCol);.    appe
54d0: 6e 64 54 65 78 74 28 26 73 2c 20 7a 43 6f 6c 2c  ndText(&s, zCol,
54e0: 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d 0a 20 20   cQuote);.  }.  
54f0: 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22  appendText(&s, "
5500: 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  )", 0);.  sqlite
5510: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
5520: 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77 3d 3d 30  );.  if( nRow==0
5530: 20 29 7b 0a 20 20 20 20 66 72 65 65 54 65 78 74   ){.    freeText
5540: 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a 20 3d 20  (&s);.    s.z = 
5550: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
5560: 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  s.z;.}../*.** SQ
5570: 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65  L function:  she
5580: 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61  ll_module_schema
5590: 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  (X).**.** Return
55a0: 20 61 20 66 61 6b 65 20 73 63 68 65 6d 61 20 66   a fake schema f
55b0: 6f 72 20 74 68 65 20 74 61 62 6c 65 2d 76 61 6c  or the table-val
55c0: 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20  ued function or 
55d0: 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61  eponymous virtua
55e0: 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e 0a 2a 2f  l.** table X..*/
55f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
5600: 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 28 0a  llModuleSchema(.
5610: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5620: 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e  t *pCtx,.  int n
5630: 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Val,.  sqlite3_v
5640: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a  alue **apVal.){.
5650: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
5660: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
5670: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
5680: 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b  _text(apVal[0]);
5690: 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d  .  char *zFake =
56a0: 20 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61   shellFakeSchema
56b0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
56c0: 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29  _db_handle(pCtx)
56d0: 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 55  , 0, zName);.  U
56e0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
56f0: 6e 56 61 6c 29 3b 0a 20 20 69 66 28 20 7a 46 61  nVal);.  if( zFa
5700: 6b 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ke ){.    sqlite
5710: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
5720: 74 78 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  tx, sqlite3_mpri
5730: 6e 74 66 28 22 2f 2a 20 25 73 20 2a 2f 22 2c 20  ntf("/* %s */", 
5740: 7a 46 61 6b 65 29 2c 0a 20 20 20 20 20 20 20 20  zFake),.        
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
5770: 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 46 61 6b  );.    free(zFak
5780: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
5790: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20   SQL function:  
57a0: 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61  shell_add_schema
57b0: 28 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41 64 64 20  (S,X).**.** Add 
57c0: 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65 20  the schema name 
57d0: 58 20 74 6f 20 74 68 65 20 43 52 45 41 54 45 20  X to the CREATE 
57e0: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 53 20 61  statement in S a
57f0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  nd return the re
5800: 73 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65  sult..** Example
5810: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41  s:.**.**    CREA
5820: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 20 20  TE TABLE t1(x)  
5830: 20 2d 3e 20 20 20 43 52 45 41 54 45 20 54 41 42   ->   CREATE TAB
5840: 4c 45 20 78 79 7a 2e 74 31 28 78 29 3b 0a 2a 2a  LE xyz.t1(x);.**
5850: 0a 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b 73 20 6f  .** Also works o
5860: 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  n.**.**    CREAT
5870: 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43 52  E INDEX.**    CR
5880: 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45  EATE UNIQUE INDE
5890: 58 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20 56  X.**    CREATE V
58a0: 49 45 57 0a 2a 2a 20 20 20 20 43 52 45 41 54 45  IEW.**    CREATE
58b0: 20 54 52 49 47 47 45 52 0a 2a 2a 20 20 20 20 43   TRIGGER.**    C
58c0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
58d0: 42 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 55  BLE.**.** This U
58e0: 44 46 20 69 73 20 75 73 65 64 20 62 79 20 74 68  DF is used by th
58f0: 65 20 2e 73 63 68 65 6d 61 20 63 6f 6d 6d 61 6e  e .schema comman
5900: 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  d to insert the 
5910: 73 63 68 65 6d 61 20 6e 61 6d 65 20 6f 66 0a 2a  schema name of.*
5920: 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
5930: 61 73 65 73 20 69 6e 74 6f 20 74 68 65 20 6d 69  ases into the mi
5940: 64 64 6c 65 20 6f 66 20 74 68 65 20 73 71 6c 69  ddle of the sqli
5950: 74 65 5f 6d 61 73 74 65 72 2e 73 71 6c 20 66 69  te_master.sql fi
5960: 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  eld..*/.static v
5970: 6f 69 64 20 73 68 65 6c 6c 41 64 64 53 63 68 65  oid shellAddSche
5980: 6d 61 4e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  maName(.  sqlite
5990: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
59a0: 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73  .  int nVal,.  s
59b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
59c0: 70 56 61 6c 0a 29 7b 0a 20 20 73 74 61 74 69 63  pVal.){.  static
59d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 50 72   const char *aPr
59e0: 65 66 69 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  efix[] = {.     
59f0: 22 54 41 42 4c 45 22 2c 0a 20 20 20 20 20 22 49  "TABLE",.     "I
5a00: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 55 4e 49  NDEX",.     "UNI
5a10: 51 55 45 20 49 4e 44 45 58 22 2c 0a 20 20 20 20  QUE INDEX",.    
5a20: 20 22 56 49 45 57 22 2c 0a 20 20 20 20 20 22 54   "VIEW",.     "T
5a30: 52 49 47 47 45 52 22 2c 0a 20 20 20 20 20 22 56  RIGGER",.     "V
5a40: 49 52 54 55 41 4c 20 54 41 42 4c 45 22 0a 20 20  IRTUAL TABLE".  
5a50: 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  };.  int i = 0;.
5a60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
5a70: 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  n = (const char*
5a80: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
5a90: 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20  ext(apVal[0]);. 
5aa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63   const char *zSc
5ab0: 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74 20 63 68  hema = (const ch
5ac0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
5ad0: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d 29  e_text(apVal[1])
5ae0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
5af0: 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
5b00: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
5b10: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d  ue_text(apVal[2]
5b20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  );.  sqlite3 *db
5b30: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
5b40: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74  xt_db_handle(pCt
5b50: 78 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  x);.  UNUSED_PAR
5b60: 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b 0a 20 20  AMETER(nVal);.  
5b70: 69 66 28 20 7a 49 6e 21 3d 30 20 26 26 20 73 74  if( zIn!=0 && st
5b80: 72 6e 63 6d 70 28 7a 49 6e 2c 20 22 43 52 45 41  rncmp(zIn, "CREA
5b90: 54 45 20 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  TE ", 7)==0 ){. 
5ba0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 69     for(i=0; i<(i
5bb0: 6e 74 29 28 73 69 7a 65 6f 66 28 61 50 72 65 66  nt)(sizeof(aPref
5bc0: 69 78 29 2f 73 69 7a 65 6f 66 28 61 50 72 65 66  ix)/sizeof(aPref
5bd0: 69 78 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20  ix[0])); i++){. 
5be0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72       int n = str
5bf0: 6c 65 6e 33 30 28 61 50 72 65 66 69 78 5b 69 5d  len30(aPrefix[i]
5c00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  );.      if( str
5c10: 6e 63 6d 70 28 7a 49 6e 2b 37 2c 20 61 50 72 65  ncmp(zIn+7, aPre
5c20: 66 69 78 5b 69 5d 2c 20 6e 29 3d 3d 30 20 26 26  fix[i], n)==0 &&
5c30: 20 7a 49 6e 5b 6e 2b 37 5d 3d 3d 27 20 27 20 29   zIn[n+7]==' ' )
5c40: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
5c50: 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  z = 0;.        c
5c60: 68 61 72 20 2a 7a 46 61 6b 65 20 3d 20 30 3b 0a  har *zFake = 0;.
5c70: 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68          if( zSch
5c80: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ema ){.         
5c90: 20 63 68 61 72 20 63 51 75 6f 74 65 20 3d 20 71   char cQuote = q
5ca0: 75 6f 74 65 43 68 61 72 28 7a 53 63 68 65 6d 61  uoteChar(zSchema
5cb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
5cc0: 20 63 51 75 6f 74 65 20 26 26 20 73 71 6c 69 74   cQuote && sqlit
5cd0: 65 33 5f 73 74 72 69 63 6d 70 28 7a 53 63 68 65  e3_stricmp(zSche
5ce0: 6d 61 2c 22 74 65 6d 70 22 29 21 3d 30 20 29 7b  ma,"temp")!=0 ){
5cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  .            z =
5d00: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
5d10: 28 22 25 2e 2a 73 20 5c 22 25 77 5c 22 2e 25 73  ("%.*s \"%w\".%s
5d20: 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63  ", n+7, zIn, zSc
5d30: 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a  hema, zIn+n+8);.
5d40: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
5d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  .            z =
5d60: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
5d70: 28 22 25 2e 2a 73 20 25 73 2e 25 73 22 2c 20 6e  ("%.*s %s.%s", n
5d80: 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65 6d 61  +7, zIn, zSchema
5d90: 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20 20 20  , zIn+n+8);.    
5da0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5db0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  }.        if( zN
5dc0: 61 6d 65 0a 20 20 20 20 20 20 20 20 20 26 26 20  ame.         && 
5dd0: 61 50 72 65 66 69 78 5b 69 5d 5b 30 5d 3d 3d 27  aPrefix[i][0]=='
5de0: 56 27 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  V'.         && (
5df0: 7a 46 61 6b 65 20 3d 20 73 68 65 6c 6c 46 61 6b  zFake = shellFak
5e00: 65 53 63 68 65 6d 61 28 64 62 2c 20 7a 53 63 68  eSchema(db, zSch
5e10: 65 6d 61 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 0a  ema, zName))!=0.
5e20: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
5e30: 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b       if( z==0 ){
5e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  .            z =
5e50: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
5e60: 28 22 25 73 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c  ("%s\n/* %s */",
5e70: 20 7a 49 6e 2c 20 7a 46 61 6b 65 29 3b 0a 20 20   zIn, zFake);.  
5e80: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5e90: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 73             z = s
5ea0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
5eb0: 25 7a 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c 20 7a  %z\n/* %s */", z
5ec0: 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20 20  , zFake);.      
5ed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5ee0: 66 72 65 65 28 7a 46 61 6b 65 29 3b 0a 20 20 20  free(zFake);.   
5ef0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
5f00: 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  f( z ){.        
5f10: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5f20: 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d  _text(pCtx, z, -
5f30: 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  1, sqlite3_free)
5f40: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
5f50: 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rn;.        }.  
5f60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5f70: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5f80: 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70 56  _value(pCtx, apV
5f90: 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  al[0]);.}../*.**
5fa0: 20 54 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65   The source code
5fb0: 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 75 6e   for several run
5fc0: 2d 74 69 6d 65 20 6c 6f 61 64 61 62 6c 65 20 65  -time loadable e
5fd0: 78 74 65 6e 73 69 6f 6e 73 20 69 73 20 69 6e 73  xtensions is ins
5fe0: 65 72 74 65 64 0a 2a 2a 20 62 65 6c 6f 77 20 62  erted.** below b
5ff0: 79 20 74 68 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b  y the ../tool/mk
6000: 73 68 65 6c 6c 63 2e 74 63 6c 20 73 63 72 69 70  shellc.tcl scrip
6010: 74 2e 20 20 42 65 66 6f 72 65 20 70 72 6f 63 65  t.  Before proce
6020: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 63 6c 75  ssing that inclu
6030: 64 65 64 0a 2a 2a 20 63 6f 64 65 2c 20 77 65 20  ded.** code, we 
6040: 6e 65 65 64 20 74 6f 20 6f 76 65 72 72 69 64 65  need to override
6050: 20 73 6f 6d 65 20 6d 61 63 72 6f 73 20 74 6f 20   some macros to 
6060: 6d 61 6b 65 20 74 68 65 20 69 6e 63 6c 75 64 65  make the include
6070: 64 20 70 72 6f 67 72 61 6d 20 63 6f 64 65 0a 2a  d program code.*
6080: 2a 20 77 6f 72 6b 20 68 65 72 65 20 69 6e 20 74  * work here in t
6090: 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 69  he middle of thi
60a0: 73 20 72 65 67 75 6c 61 72 20 70 72 6f 67 72 61  s regular progra
60b0: 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51  m..*/.#define SQ
60c0: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
60d0: 4e 49 54 31 0a 23 64 65 66 69 6e 65 20 53 51 4c  NIT1.#define SQL
60e0: 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e  ITE_EXTENSION_IN
60f0: 49 54 32 28 58 29 20 28 76 6f 69 64 29 28 58 29  IT2(X) (void)(X)
6100: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  ..#if defined(_W
6110: 49 4e 33 32 29 20 26 26 20 64 65 66 69 6e 65 64  IN32) && defined
6120: 28 5f 4d 53 43 5f 56 45 52 29 0a 49 4e 43 4c 55  (_MSC_VER).INCLU
6130: 44 45 20 74 65 73 74 5f 77 69 6e 64 69 72 65 6e  DE test_windiren
6140: 74 2e 68 0a 49 4e 43 4c 55 44 45 20 74 65 73 74  t.h.INCLUDE test
6150: 5f 77 69 6e 64 69 72 65 6e 74 2e 63 0a 23 64 65  _windirent.c.#de
6160: 66 69 6e 65 20 64 69 72 65 6e 74 20 44 49 52 45  fine dirent DIRE
6170: 4e 54 0a 23 65 6e 64 69 66 0a 49 4e 43 4c 55 44  NT.#endif.INCLUD
6180: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73 68  E ../ext/misc/sh
6190: 61 74 68 72 65 65 2e 63 0a 49 4e 43 4c 55 44 45  athree.c.INCLUDE
61a0: 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 66 69 6c   ../ext/misc/fil
61b0: 65 69 6f 2e 63 0a 49 4e 43 4c 55 44 45 20 2e 2e  eio.c.INCLUDE ..
61c0: 2f 65 78 74 2f 6d 69 73 63 2f 63 6f 6d 70 6c 65  /ext/misc/comple
61d0: 74 69 6f 6e 2e 63 0a 49 4e 43 4c 55 44 45 20 2e  tion.c.INCLUDE .
61e0: 2e 2f 65 78 74 2f 6d 69 73 63 2f 61 70 70 65 6e  ./ext/misc/appen
61f0: 64 76 66 73 2e 63 0a 23 69 66 64 65 66 20 53 51  dvfs.c.#ifdef SQ
6200: 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 49  LITE_HAVE_ZLIB.I
6210: 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69  NCLUDE ../ext/mi
6220: 73 63 2f 7a 69 70 66 69 6c 65 2e 63 0a 49 4e 43  sc/zipfile.c.INC
6230: 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63  LUDE ../ext/misc
6240: 2f 73 71 6c 61 72 2e 63 0a 23 65 6e 64 69 66 0a  /sqlar.c.#endif.
6250: 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 65  INCLUDE ../ext/e
6260: 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65 78 70  xpert/sqlite3exp
6270: 65 72 74 2e 68 0a 49 4e 43 4c 55 44 45 20 2e 2e  ert.h.INCLUDE ..
6280: 2f 65 78 74 2f 65 78 70 65 72 74 2f 73 71 6c 69  /ext/expert/sqli
6290: 74 65 33 65 78 70 65 72 74 2e 63 0a 0a 23 69 66  te3expert.c..#if
62a0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
62b0: 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
62c0: 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f  /*.** State info
62d0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 73 69  rmation for a si
62e0: 6e 67 6c 65 20 6f 70 65 6e 20 73 65 73 73 69 6f  ngle open sessio
62f0: 6e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  n.*/.typedef str
6300: 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  uct OpenSession 
6310: 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 73 74 72  OpenSession;.str
6320: 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  uct OpenSession 
6330: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
6340: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6350: 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 66 6f  Symbolic name fo
6360: 72 20 74 68 69 73 20 73 65 73 73 69 6f 6e 20 2a  r this session *
6370: 2f 0a 20 20 69 6e 74 20 6e 46 69 6c 74 65 72 3b  /.  int nFilter;
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6390: 4e 75 6d 62 65 72 20 6f 66 20 78 46 69 6c 74 65  Number of xFilte
63a0: 72 20 72 65 6a 65 63 74 69 6f 6e 20 47 4c 4f 42  r rejection GLOB
63b0: 20 70 61 74 74 65 72 6e 73 20 2a 2f 0a 20 20 63   patterns */.  c
63c0: 68 61 72 20 2a 2a 61 7a 46 69 6c 74 65 72 3b 20  har **azFilter; 
63d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
63e0: 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65 6a 65   of xFilter reje
63f0: 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74 74 65  ction GLOB patte
6400: 72 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rns */.  sqlite3
6410: 5f 73 65 73 73 69 6f 6e 20 2a 70 3b 20 20 20 20  _session *p;    
6420: 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20 73 65    /* The open se
6430: 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 65 6e 64  ssion */.};.#end
6440: 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 65 6c 6c 20  if../*.** Shell 
6450: 6f 75 74 70 75 74 20 6d 6f 64 65 20 69 6e 66 6f  output mode info
6460: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65 66  rmation from bef
6470: 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e  ore ".explain on
6480: 22 2c 0a 2a 2a 20 73 61 76 65 64 20 73 6f 20 74  ",.** saved so t
6490: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65  hat it can be re
64a0: 73 74 6f 72 65 64 20 62 79 20 22 2e 65 78 70 6c  stored by ".expl
64b0: 61 69 6e 20 6f 66 66 22 0a 2a 2f 0a 74 79 70 65  ain off".*/.type
64c0: 64 65 66 20 73 74 72 75 63 74 20 53 61 76 65 64  def struct Saved
64d0: 4d 6f 64 65 49 6e 66 6f 20 53 61 76 65 64 4d 6f  ModeInfo SavedMo
64e0: 64 65 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 53  deInfo;.struct S
64f0: 61 76 65 64 4d 6f 64 65 49 6e 66 6f 20 7b 0a 20  avedModeInfo {. 
6500: 20 69 6e 74 20 76 61 6c 69 64 3b 20 20 20 20 20   int valid;     
6510: 20 20 20 20 20 2f 2a 20 49 73 20 74 68 65 72 65       /* Is there
6520: 20 6c 65 67 69 74 20 64 61 74 61 20 69 6e 20 68   legit data in h
6530: 65 72 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f  ere? */.  int mo
6540: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
6550: 20 4d 6f 64 65 20 70 72 69 6f 72 20 74 6f 20 22   Mode prior to "
6560: 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a  .explain on" */.
6570: 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72    int showHeader
6580: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 22 2e 68  ;     /* The ".h
6590: 65 61 64 65 72 22 20 73 65 74 74 69 6e 67 20 70  eader" setting p
65a0: 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61 69  rior to ".explai
65b0: 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 63  n on" */.  int c
65c0: 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f  olWidth[100];  /
65d0: 2a 20 43 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20  * Column widths 
65e0: 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61  prior to ".expla
65f0: 69 6e 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a 74 79  in on" */.};..ty
6600: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 78 70  pedef struct Exp
6610: 65 72 74 49 6e 66 6f 20 45 78 70 65 72 74 49 6e  ertInfo ExpertIn
6620: 66 6f 3b 0a 73 74 72 75 63 74 20 45 78 70 65 72  fo;.struct Exper
6630: 74 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74 65  tInfo {.  sqlite
6640: 33 65 78 70 65 72 74 20 2a 70 45 78 70 65 72 74  3expert *pExpert
6650: 3b 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65  ;.  int bVerbose
6660: 3b 0a 7d 3b 0a 0a 2f 2a 20 41 20 73 69 6e 67 6c  ;.};../* A singl
6670: 65 20 6c 69 6e 65 20 69 6e 20 74 68 65 20 45 51  e line in the EQ
6680: 50 20 6f 75 74 70 75 74 20 2a 2f 0a 74 79 70 65  P output */.type
6690: 64 65 66 20 73 74 72 75 63 74 20 45 51 50 47 72  def struct EQPGr
66a0: 61 70 68 52 6f 77 20 45 51 50 47 72 61 70 68 52  aphRow EQPGraphR
66b0: 6f 77 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72  ow;.struct EQPGr
66c0: 61 70 68 52 6f 77 20 7b 0a 20 20 69 6e 74 20 69  aphRow {.  int i
66d0: 45 71 70 49 64 3b 20 20 20 20 20 20 20 20 20 20  EqpId;          
66e0: 20 2f 2a 20 49 44 20 66 6f 72 20 74 68 69 73 20   /* ID for this 
66f0: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  row */.  int iPa
6700: 72 65 6e 74 49 64 3b 20 20 20 20 20 20 20 20 2f  rentId;        /
6710: 2a 20 49 44 20 6f 66 20 74 68 65 20 70 61 72 65  * ID of the pare
6720: 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 45 51 50 47  nt row */.  EQPG
6730: 72 61 70 68 52 6f 77 20 2a 70 4e 65 78 74 3b 20  raphRow *pNext; 
6740: 20 20 2f 2a 20 4e 65 78 74 20 72 6f 77 20 69 6e    /* Next row in
6750: 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 63   sequence */.  c
6760: 68 61 72 20 7a 54 65 78 74 5b 31 5d 3b 20 20 20  har zText[1];   
6770: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20       /* Text to 
6780: 64 69 73 70 6c 61 79 20 66 6f 72 20 74 68 69 73  display for this
6790: 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41   row */.};../* A
67a0: 6c 6c 20 45 51 50 20 6f 75 74 70 75 74 20 69 73  ll EQP output is
67b0: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
67c0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
67d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
67e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45  typedef struct E
67f0: 51 50 47 72 61 70 68 20 45 51 50 47 72 61 70 68  QPGraph EQPGraph
6800: 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72 61 70  ;.struct EQPGrap
6810: 68 20 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f  h {.  EQPGraphRo
6820: 77 20 2a 70 52 6f 77 3b 20 20 20 20 2f 2a 20 4c  w *pRow;    /* L
6830: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c  inked list of al
6840: 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 45 51  l rows of the EQ
6850: 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 45 51  P output */.  EQ
6860: 50 47 72 61 70 68 52 6f 77 20 2a 70 4c 61 73 74  PGraphRow *pLast
6870: 3b 20 20 20 2f 2a 20 4c 61 73 74 20 65 6c 65 6d  ;   /* Last elem
6880: 65 6e 74 20 6f 66 20 74 68 65 20 70 52 6f 77 20  ent of the pRow 
6890: 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 7a  list */.  char z
68a0: 50 72 65 66 69 78 5b 31 30 30 5d 3b 20 20 20 20  Prefix[100];    
68b0: 2f 2a 20 47 72 61 70 68 20 70 72 65 66 69 78 20  /* Graph prefix 
68c0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  */.};../*.** Sta
68d0: 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
68e0: 62 6f 75 74 20 74 68 65 20 64 61 74 61 62 61 73  bout the databas
68f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
6900: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 6e 0a  contained in an.
6910: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ** instance of t
6920: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
6930: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
6940: 65 66 20 73 74 72 75 63 74 20 53 68 65 6c 6c 53  ef struct ShellS
6950: 74 61 74 65 20 53 68 65 6c 6c 53 74 61 74 65 3b  tate ShellState;
6960: 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 53 74 61  .struct ShellSta
6970: 74 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  te {.  sqlite3 *
6980: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
6990: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   The database */
69a0: 0a 20 20 75 38 20 61 75 74 6f 45 78 70 6c 61 69  .  u8 autoExplai
69b0: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74  n;        /* Aut
69c0: 6f 6d 61 74 69 63 61 6c 6c 79 20 74 75 72 6e 20  omatically turn 
69d0: 6f 6e 20 2e 65 78 70 6c 61 69 6e 20 6d 6f 64 65  on .explain mode
69e0: 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50   */.  u8 autoEQP
69f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6a00: 52 75 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52  Run EXPLAIN QUER
6a10: 59 20 50 4c 41 4e 20 70 72 69 6f 72 20 74 6f 20  Y PLAN prior to 
6a20: 73 65 61 63 68 20 53 51 4c 20 73 74 6d 74 20 2a  seach SQL stmt *
6a30: 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50 74 65  /.  u8 autoEQPte
6a40: 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 61 75  st;        /* au
6a50: 74 6f 45 51 50 20 69 73 20 69 6e 20 74 65 73 74  toEQP is in test
6a60: 20 6d 6f 64 65 20 2a 2f 0a 20 20 75 38 20 73 74   mode */.  u8 st
6a70: 61 74 73 4f 6e 3b 20 20 20 20 20 20 20 20 20 20  atsOn;          
6a80: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 69 73    /* True to dis
6a90: 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73 74 61 74  play memory stat
6aa0: 73 20 62 65 66 6f 72 65 20 65 61 63 68 20 66 69  s before each fi
6ab0: 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 75 38 20 73  nalize */.  u8 s
6ac0: 63 61 6e 73 74 61 74 73 4f 6e 3b 20 20 20 20 20  canstatsOn;     
6ad0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 69     /* True to di
6ae0: 73 70 6c 61 79 20 73 63 61 6e 20 73 74 61 74 73  splay scan stats
6af0: 20 62 65 66 6f 72 65 20 65 61 63 68 20 66 69 6e   before each fin
6b00: 61 6c 69 7a 65 20 2a 2f 0a 20 20 75 38 20 6f 70  alize */.  u8 op
6b10: 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  enMode;         
6b20: 20 20 2f 2a 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f    /* SHELL_OPEN_
6b30: 4e 4f 52 4d 41 4c 2c 20 5f 41 50 50 45 4e 44 56  NORMAL, _APPENDV
6b40: 46 53 2c 20 6f 72 20 5f 5a 49 50 46 49 4c 45 20  FS, or _ZIPFILE 
6b50: 2a 2f 0a 20 20 75 38 20 64 6f 58 64 67 4f 70 65  */.  u8 doXdgOpe
6b60: 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  n;          /* I
6b70: 6e 76 6f 6b 65 20 73 74 61 72 74 2f 6f 70 65 6e  nvoke start/open
6b80: 2f 78 64 67 2d 6f 70 65 6e 20 69 6e 20 6f 75 74  /xdg-open in out
6b90: 70 75 74 5f 72 65 73 65 74 28 29 20 2a 2f 0a 20  put_reset() */. 
6ba0: 20 75 38 20 6e 45 71 70 4c 65 76 65 6c 3b 20 20   u8 nEqpLevel;  
6bb0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 70 74 68          /* Depth
6bc0: 20 6f 66 20 74 68 65 20 45 51 50 20 6f 75 74 70   of the EQP outp
6bd0: 75 74 20 67 72 61 70 68 20 2a 2f 0a 20 20 75 38  ut graph */.  u8
6be0: 20 65 54 72 61 63 65 54 79 70 65 3b 20 20 20 20   eTraceType;    
6bf0: 20 20 20 20 20 2f 2a 20 53 48 45 4c 4c 5f 54 52       /* SHELL_TR
6c00: 41 43 45 5f 2a 20 76 61 6c 75 65 20 66 6f 72 20  ACE_* value for 
6c10: 74 79 70 65 20 6f 66 20 74 72 61 63 65 20 2a 2f  type of trace */
6c20: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d 45 71 70  .  unsigned mEqp
6c30: 4c 69 6e 65 73 3b 20 20 20 20 2f 2a 20 4d 61 73  Lines;    /* Mas
6c40: 6b 20 6f 66 20 76 65 72 69 74 69 63 61 6c 20 6c  k of veritical l
6c50: 69 6e 65 73 20 69 6e 20 74 68 65 20 45 51 50 20  ines in the EQP 
6c60: 6f 75 74 70 75 74 20 67 72 61 70 68 20 2a 2f 0a  output graph */.
6c70: 20 20 69 6e 74 20 6f 75 74 43 6f 75 6e 74 3b 20    int outCount; 
6c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 76 65           /* Reve
6c90: 72 74 20 74 6f 20 73 74 64 6f 75 74 20 77 68 65  rt to stdout whe
6ca0: 6e 20 72 65 61 63 68 69 6e 67 20 7a 65 72 6f 20  n reaching zero 
6cb0: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20  */.  int cnt;   
6cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6cd0: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
6ce0: 20 64 69 73 70 6c 61 79 65 64 20 73 6f 20 66 61   displayed so fa
6cf0: 72 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74  r */.  FILE *out
6d00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
6d10: 20 57 72 69 74 65 20 72 65 73 75 6c 74 73 20 68   Write results h
6d20: 65 72 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 74  ere */.  FILE *t
6d30: 72 61 63 65 4f 75 74 3b 20 20 20 20 20 20 20 20  raceOut;        
6d40: 2f 2a 20 4f 75 74 70 75 74 20 66 6f 72 20 73 71  /* Output for sq
6d50: 6c 69 74 65 33 5f 74 72 61 63 65 28 29 20 2a 2f  lite3_trace() */
6d60: 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20  .  int nErr;    
6d70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6d80: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65  ber of errors se
6d90: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65  en */.  int mode
6da0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
6db0: 2a 20 41 6e 20 6f 75 74 70 75 74 20 6d 6f 64 65  * An output mode
6dc0: 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 69 6e   setting */.  in
6dd0: 74 20 6d 6f 64 65 50 72 69 6f 72 3b 20 20 20 20  t modePrior;    
6de0: 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 6d 6f       /* Saved mo
6df0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 4d 6f 64  de */.  int cMod
6e00: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
6e10: 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 75 74 70  * temporary outp
6e20: 75 74 20 6d 6f 64 65 20 66 6f 72 20 74 68 65 20  ut mode for the 
6e30: 63 75 72 72 65 6e 74 20 71 75 65 72 79 20 2a 2f  current query */
6e40: 0a 20 20 69 6e 74 20 6e 6f 72 6d 61 6c 4d 6f 64  .  int normalMod
6e50: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74  e;        /* Out
6e60: 70 75 74 20 6d 6f 64 65 20 62 65 66 6f 72 65 20  put mode before 
6e70: 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f  ".explain on" */
6e80: 0a 20 20 69 6e 74 20 77 72 69 74 61 62 6c 65 53  .  int writableS
6e90: 63 68 65 6d 61 3b 20 20 20 20 2f 2a 20 54 72 75  chema;    /* Tru
6ea0: 65 20 69 66 20 50 52 41 47 4d 41 20 77 72 69 74  e if PRAGMA writ
6eb0: 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 2a  able_schema=ON *
6ec0: 2f 0a 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64  /.  int showHead
6ed0: 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  er;        /* Tr
6ee0: 75 65 20 74 6f 20 73 68 6f 77 20 63 6f 6c 75 6d  ue to show colum
6ef0: 6e 20 6e 61 6d 65 73 20 69 6e 20 4c 69 73 74 20  n names in List 
6f00: 6f 72 20 43 6f 6c 75 6d 6e 20 6d 6f 64 65 20 2a  or Column mode *
6f10: 2f 0a 20 20 69 6e 74 20 6e 43 68 65 63 6b 3b 20  /.  int nCheck; 
6f20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6f30: 6d 62 65 72 20 6f 66 20 22 2e 63 68 65 63 6b 22  mber of ".check"
6f40: 20 63 6f 6d 6d 61 6e 64 73 20 72 75 6e 20 2a 2f   commands run */
6f50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 68 65 6c  .  unsigned shel
6f60: 6c 46 6c 67 73 3b 20 20 20 20 2f 2a 20 56 61 72  lFlgs;    /* Var
6f70: 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 20 20  ious flags */.  
6f80: 63 68 61 72 20 2a 7a 44 65 73 74 54 61 62 6c 65  char *zDestTable
6f90: 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ;      /* Name o
6fa0: 66 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61  f destination ta
6fb0: 62 6c 65 20 77 68 65 6e 20 4d 4f 44 45 5f 49 6e  ble when MODE_In
6fc0: 73 65 72 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  sert */.  char *
6fd0: 7a 54 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20  zTempFile;      
6fe0: 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 66 69   /* Temporary fi
6ff0: 6c 65 20 74 68 61 74 20 6d 69 67 68 74 20 6e 65  le that might ne
7000: 65 64 20 64 65 6c 65 74 69 6e 67 20 2a 2f 0a 20  ed deleting */. 
7010: 20 63 68 61 72 20 7a 54 65 73 74 63 61 73 65 5b   char zTestcase[
7020: 33 30 5d 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  30];    /* Name 
7030: 6f 66 20 63 75 72 72 65 6e 74 20 74 65 73 74 20  of current test 
7040: 63 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  case */.  char c
7050: 6f 6c 53 65 70 61 72 61 74 6f 72 5b 32 30 5d 3b  olSeparator[20];
7060: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 73 65 70 61 72   /* Column separ
7070: 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 66  ator character f
7080: 6f 72 20 73 65 76 65 72 61 6c 20 6d 6f 64 65 73  or several modes
7090: 20 2a 2f 0a 20 20 63 68 61 72 20 72 6f 77 53 65   */.  char rowSe
70a0: 70 61 72 61 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20  parator[20]; /* 
70b0: 52 6f 77 20 73 65 70 61 72 61 74 6f 72 20 63 68  Row separator ch
70c0: 61 72 61 63 74 65 72 20 66 6f 72 20 4d 4f 44 45  aracter for MODE
70d0: 5f 41 73 63 69 69 20 2a 2f 0a 20 20 63 68 61 72  _Ascii */.  char
70e0: 20 63 6f 6c 53 65 70 50 72 69 6f 72 5b 32 30 5d   colSepPrior[20]
70f0: 3b 20 20 2f 2a 20 53 61 76 65 64 20 63 6f 6c 75  ;  /* Saved colu
7100: 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a  mn separator */.
7110: 20 20 63 68 61 72 20 72 6f 77 53 65 70 50 72 69    char rowSepPri
7120: 6f 72 5b 32 30 5d 3b 20 20 2f 2a 20 53 61 76 65  or[20];  /* Save
7130: 64 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20  d row separator 
7140: 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c 57 69 64 74  */.  int colWidt
7150: 68 5b 31 30 30 5d 3b 20 20 20 20 20 2f 2a 20 52  h[100];     /* R
7160: 65 71 75 65 73 74 65 64 20 77 69 64 74 68 20 6f  equested width o
7170: 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 77 68  f each column wh
7180: 65 6e 20 69 6e 20 63 6f 6c 75 6d 6e 20 6d 6f 64  en in column mod
7190: 65 2a 2f 0a 20 20 69 6e 74 20 61 63 74 75 61 6c  e*/.  int actual
71a0: 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20  Width[100];  /* 
71b0: 41 63 74 75 61 6c 20 77 69 64 74 68 20 6f 66 20  Actual width of 
71c0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  each column */. 
71d0: 20 63 68 61 72 20 6e 75 6c 6c 56 61 6c 75 65 5b   char nullValue[
71e0: 32 30 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74  20];    /* The t
71f0: 65 78 74 20 74 6f 20 70 72 69 6e 74 20 77 68 65  ext to print whe
7200: 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62  n a NULL comes b
7210: 61 63 6b 20 66 72 6f 6d 0a 20 20 20 20 20 20 20  ack from.       
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7230: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
7240: 65 20 2a 2f 0a 20 20 63 68 61 72 20 6f 75 74 66  e */.  char outf
7250: 69 6c 65 5b 46 49 4c 45 4e 41 4d 45 5f 4d 41 58  ile[FILENAME_MAX
7260: 5d 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 66  ]; /* Filename f
7270: 6f 72 20 2a 6f 75 74 20 2a 2f 0a 20 20 63 6f 6e  or *out */.  con
7280: 73 74 20 63 68 61 72 20 2a 7a 44 62 46 69 6c 65  st char *zDbFile
7290: 6e 61 6d 65 3b 20 20 20 20 2f 2a 20 6e 61 6d 65  name;    /* name
72a0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
72b0: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
72c0: 2a 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 3b 20 20  *zFreeOnClose;  
72d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61         /* Filena
72e0: 6d 65 20 74 6f 20 66 72 65 65 20 77 68 65 6e 20  me to free when 
72f0: 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e  closing */.  con
7300: 73 74 20 63 68 61 72 20 2a 7a 56 66 73 3b 20 20  st char *zVfs;  
7310: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
7320: 20 6f 66 20 56 46 53 20 74 6f 20 75 73 65 20 2a   of VFS to use *
7330: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
7340: 20 2a 70 53 74 6d 74 3b 20 20 20 2f 2a 20 43 75   *pStmt;   /* Cu
7350: 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
7360: 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 46 49 4c  if any. */.  FIL
7370: 45 20 2a 70 4c 6f 67 3b 20 20 20 20 20 20 20 20  E *pLog;        
7380: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6c 6f 67      /* Write log
7390: 20 6f 75 74 70 75 74 20 68 65 72 65 20 2a 2f 0a   output here */.
73a0: 20 20 69 6e 74 20 2a 61 69 49 6e 64 65 6e 74 3b    int *aiIndent;
73b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
73c0: 79 20 6f 66 20 69 6e 64 65 6e 74 73 20 75 73 65  y of indents use
73d0: 64 20 69 6e 20 4d 4f 44 45 5f 45 78 70 6c 61 69  d in MODE_Explai
73e0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 64 65  n */.  int nInde
73f0: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nt;           /*
7400: 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
7410: 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 20 20 69  iIndent[] */.  i
7420: 6e 74 20 69 49 6e 64 65 6e 74 3b 20 20 20 20 20  nt iIndent;     
7430: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
7440: 66 20 63 75 72 72 65 6e 74 20 6f 70 20 69 6e 20  f current op in 
7450: 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 20 20  aiIndent[] */.  
7460: 45 51 50 47 72 61 70 68 20 73 47 72 61 70 68 3b  EQPGraph sGraph;
7470: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d         /* Inform
7480: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
7490: 61 70 68 69 63 61 6c 20 45 58 50 4c 41 49 4e 20  aphical EXPLAIN 
74a0: 51 55 45 52 59 20 50 4c 41 4e 20 2a 2f 0a 23 69  QUERY PLAN */.#i
74b0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
74c0: 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29  _ENABLE_SESSION)
74d0: 0a 20 20 69 6e 74 20 6e 53 65 73 73 69 6f 6e 3b  .  int nSession;
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
74f0: 4e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 76 65  Number of active
7500: 20 73 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 4f   sessions */.  O
7510: 70 65 6e 53 65 73 73 69 6f 6e 20 61 53 65 73 73  penSession aSess
7520: 69 6f 6e 5b 34 5d 3b 20 20 2f 2a 20 41 72 72 61  ion[4];  /* Arra
7530: 79 20 6f 66 20 73 65 73 73 69 6f 6e 73 2e 20 20  y of sessions.  
7540: 5b 30 5d 20 69 73 20 69 6e 20 66 6f 63 75 73 2e  [0] is in focus.
7550: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 45 78 70   */.#endif.  Exp
7560: 65 72 74 49 6e 66 6f 20 65 78 70 65 72 74 3b 20  ertInfo expert; 
7570: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20         /* Valid 
7580: 69 66 20 70 72 65 76 69 6f 75 73 20 63 6f 6d 6d  if previous comm
7590: 61 6e 64 20 77 61 73 20 22 2e 65 78 70 65 72 74  and was ".expert
75a0: 20 4f 50 54 2e 2e 2e 22 20 2a 2f 0a 7d 3b 0a 0a   OPT..." */.};..
75b0: 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  ./* Allowed valu
75c0: 65 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61 74  es for ShellStat
75d0: 65 2e 61 75 74 6f 45 51 50 0a 2a 2f 0a 23 64 65  e.autoEQP.*/.#de
75e0: 66 69 6e 65 20 41 55 54 4f 45 51 50 5f 6f 66 66  fine AUTOEQP_off
75f0: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
7600: 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 45    /* Automatic E
7610: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
7620: 4e 20 69 73 20 6f 66 66 20 2a 2f 0a 23 64 65 66  N is off */.#def
7630: 69 6e 65 20 41 55 54 4f 45 51 50 5f 6f 6e 20 20  ine AUTOEQP_on  
7640: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
7650: 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 45 51   /* Automatic EQ
7660: 50 20 69 73 20 6f 6e 20 2a 2f 0a 23 64 65 66 69  P is on */.#defi
7670: 6e 65 20 41 55 54 4f 45 51 50 5f 74 72 69 67 67  ne AUTOEQP_trigg
7680: 65 72 20 20 32 20 20 20 20 20 20 20 20 20 20 20  er  2           
7690: 2f 2a 20 4f 6e 20 61 6e 64 20 61 6c 73 6f 20 73  /* On and also s
76a0: 68 6f 77 20 70 6c 61 6e 73 20 66 6f 72 20 74 72  how plans for tr
76b0: 69 67 67 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e  iggers */.#defin
76c0: 65 20 41 55 54 4f 45 51 50 5f 66 75 6c 6c 20 20  e AUTOEQP_full  
76d0: 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 2f     3           /
76e0: 2a 20 53 68 6f 77 20 66 75 6c 6c 20 45 58 50 4c  * Show full EXPL
76f0: 41 49 4e 20 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 77  AIN */../* Allow
7700: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53 68  ed values for Sh
7710: 65 6c 6c 53 74 61 74 65 2e 6f 70 65 6e 4d 6f 64  ellState.openMod
7720: 65 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45  e.*/.#define SHE
7730: 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 20 20  LL_OPEN_UNSPEC  
7740: 20 20 20 20 30 20 20 20 20 20 20 2f 2a 20 4e 6f      0      /* No
7750: 20 6f 70 65 6e 2d 6d 6f 64 65 20 73 70 65 63 69   open-mode speci
7760: 66 69 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  fied */.#define 
7770: 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41  SHELL_OPEN_NORMA
7780: 4c 20 20 20 20 20 20 31 20 20 20 20 20 20 2f 2a  L      1      /*
7790: 20 4e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   Normal database
77a0: 20 66 69 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65   file */.#define
77b0: 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45   SHELL_OPEN_APPE
77c0: 4e 44 56 46 53 20 20 20 32 20 20 20 20 20 20 2f  NDVFS   2      /
77d0: 2a 20 55 73 65 20 61 70 70 65 6e 64 76 66 73 20  * Use appendvfs 
77e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c  */.#define SHELL
77f0: 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 20 20 20  _OPEN_ZIPFILE   
7800: 20 20 33 20 20 20 20 20 20 2f 2a 20 55 73 65 20    3      /* Use 
7810: 74 68 65 20 7a 69 70 66 69 6c 65 20 76 69 72 74  the zipfile virt
7820: 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65  ual table */.#de
7830: 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  fine SHELL_OPEN_
7840: 52 45 41 44 4f 4e 4c 59 20 20 20 20 34 20 20 20  READONLY    4   
7850: 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 6e 6f 72     /* Open a nor
7860: 6d 61 6c 20 64 61 74 61 62 61 73 65 20 72 65 61  mal database rea
7870: 64 2d 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e  d-only */.#defin
7880: 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53  e SHELL_OPEN_DES
7890: 45 52 49 41 4c 49 5a 45 20 35 20 20 20 20 20 20  ERIALIZE 5      
78a0: 2f 2a 20 4f 70 65 6e 20 75 73 69 6e 67 20 73 71  /* Open using sq
78b0: 6c 69 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a  lite3_deserializ
78c0: 65 28 29 20 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 77  e() */../* Allow
78d0: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53 68  ed values for Sh
78e0: 65 6c 6c 53 74 61 74 65 2e 65 54 72 61 63 65 54  ellState.eTraceT
78f0: 79 70 65 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ype.*/.#define S
7900: 48 45 4c 4c 5f 54 52 41 43 45 5f 50 4c 41 49 4e  HELL_TRACE_PLAIN
7910: 20 20 20 20 20 20 30 20 20 20 20 20 20 2f 2a 20        0      /* 
7920: 53 68 6f 77 20 69 6e 70 75 74 20 53 51 4c 20 74  Show input SQL t
7930: 65 78 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ext */.#define S
7940: 48 45 4c 4c 5f 54 52 41 43 45 5f 45 58 50 41 4e  HELL_TRACE_EXPAN
7950: 44 45 44 20 20 20 31 20 20 20 20 20 20 2f 2a 20  DED   1      /* 
7960: 53 68 6f 77 20 65 78 70 61 6e 64 65 64 20 53 51  Show expanded SQ
7970: 4c 20 74 65 78 74 20 2a 2f 0a 23 64 65 66 69 6e  L text */.#defin
7980: 65 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f 4e 4f  e SHELL_TRACE_NO
7990: 52 4d 41 4c 49 5a 45 44 20 32 20 20 20 20 20 20  RMALIZED 2      
79a0: 2f 2a 20 53 68 6f 77 20 6e 6f 72 6d 61 6c 69 7a  /* Show normaliz
79b0: 65 64 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 0a  ed SQL text */..
79c0: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  /*.** These are 
79d0: 74 68 65 20 61 6c 6c 6f 77 65 64 20 73 68 65 6c  the allowed shel
79e0: 6c 46 6c 67 73 20 76 61 6c 75 65 73 0a 2a 2f 0a  lFlgs values.*/.
79f0: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 61  #define SHFLG_Pa
7a00: 67 65 63 61 63 68 65 20 20 20 20 20 20 30 78 30  gecache      0x0
7a10: 30 30 30 30 30 30 31 20 2f 2a 20 54 68 65 20 2d  0000001 /* The -
7a20: 2d 70 61 67 65 63 61 63 68 65 20 6f 70 74 69 6f  -pagecache optio
7a30: 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65  n is used */.#de
7a40: 66 69 6e 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61  fine SHFLG_Looka
7a50: 73 69 64 65 20 20 20 20 20 20 30 78 30 30 30 30  side      0x0000
7a60: 30 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61 73 69 64  0002 /* Lookasid
7a70: 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64  e memory is used
7a80: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c   */.#define SHFL
7a90: 47 5f 42 61 63 6b 73 6c 61 73 68 20 20 20 20 20  G_Backslash     
7aa0: 20 30 78 30 30 30 30 30 30 30 34 20 2f 2a 20 54   0x00000004 /* T
7ab0: 68 65 20 2d 2d 62 61 63 6b 73 6c 61 73 68 20 6f  he --backslash o
7ac0: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f  ption is used */
7ad0: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50  .#define SHFLG_P
7ae0: 72 65 73 65 72 76 65 52 6f 77 69 64 20 20 30 78  reserveRowid  0x
7af0: 30 30 30 30 30 30 30 38 20 2f 2a 20 2e 64 75 6d  00000008 /* .dum
7b00: 70 20 70 72 65 73 65 72 76 65 73 20 72 6f 77 69  p preserves rowi
7b10: 64 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66  d values */.#def
7b20: 69 6e 65 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e  ine SHFLG_Newlin
7b30: 65 73 20 20 20 20 20 20 20 30 78 30 30 30 30 30  es       0x00000
7b40: 30 31 30 20 2f 2a 20 2e 64 75 6d 70 20 2d 2d 6e  010 /* .dump --n
7b50: 65 77 6c 69 6e 65 20 66 6c 61 67 20 2a 2f 0a 23  ewline flag */.#
7b60: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 43 6f 75  define SHFLG_Cou
7b70: 6e 74 43 68 61 6e 67 65 73 20 20 20 30 78 30 30  ntChanges   0x00
7b80: 30 30 30 30 32 30 20 2f 2a 20 2e 63 68 61 6e 67  000020 /* .chang
7b90: 65 73 20 73 65 74 74 69 6e 67 20 2a 2f 0a 23 64  es setting */.#d
7ba0: 65 66 69 6e 65 20 53 48 46 4c 47 5f 45 63 68 6f  efine SHFLG_Echo
7bb0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30             0x000
7bc0: 30 30 30 34 30 20 2f 2a 20 2e 65 63 68 6f 20 6f  00040 /* .echo o
7bd0: 72 20 2d 2d 65 63 68 6f 20 73 65 74 74 69 6e 67  r --echo setting
7be0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f   */../*.** Macro
7bf0: 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  s for testing an
7c00: 64 20 73 65 74 74 69 6e 67 20 73 68 65 6c 6c 46  d setting shellF
7c10: 6c 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  lgs.*/.#define S
7c20: 68 65 6c 6c 48 61 73 46 6c 61 67 28 50 2c 58 29  hellHasFlag(P,X)
7c30: 20 20 20 20 28 28 28 50 29 2d 3e 73 68 65 6c 6c      (((P)->shell
7c40: 46 6c 67 73 20 26 20 28 58 29 29 21 3d 30 29 0a  Flgs & (X))!=0).
7c50: 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 53 65 74  #define ShellSet
7c60: 46 6c 61 67 28 50 2c 58 29 20 20 20 20 28 28 50  Flag(P,X)    ((P
7c70: 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d 28 58  )->shellFlgs|=(X
7c80: 29 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c  )).#define Shell
7c90: 43 6c 65 61 72 46 6c 61 67 28 50 2c 58 29 20 20  ClearFlag(P,X)  
7ca0: 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 26  ((P)->shellFlgs&
7cb0: 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a 20  =(~(X)))../*.** 
7cc0: 54 68 65 73 65 20 61 72 65 20 74 68 65 20 61 6c  These are the al
7cd0: 6c 6f 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a  lowed modes..*/.
7ce0: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e  #define MODE_Lin
7cf0: 65 20 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20  e     0  /* One 
7d00: 63 6f 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e  column per line.
7d10: 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74    Blank line bet
7d20: 77 65 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a  ween records */.
7d30: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c  #define MODE_Col
7d40: 75 6d 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20  umn   1  /* One 
7d50: 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20  record per line 
7d60: 69 6e 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20  in neat columns 
7d70: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7d80: 4c 69 73 74 20 20 20 20 20 32 20 20 2f 2a 20 4f  List     2  /* O
7d90: 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69  ne record per li
7da0: 6e 65 20 77 69 74 68 20 61 20 73 65 70 61 72 61  ne with a separa
7db0: 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  tor */.#define M
7dc0: 4f 44 45 5f 53 65 6d 69 20 20 20 20 20 33 20 20  ODE_Semi     3  
7dd0: 2f 2a 20 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f  /* Same as MODE_
7de0: 4c 69 73 74 20 62 75 74 20 61 70 70 65 6e 64 20  List but append 
7df0: 22 3b 22 20 74 6f 20 65 61 63 68 20 6c 69 6e 65  ";" to each line
7e00: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
7e10: 5f 48 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20  _Html     4  /* 
7e20: 47 65 6e 65 72 61 74 65 20 61 6e 20 58 48 54 4d  Generate an XHTM
7e30: 4c 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69  L table */.#defi
7e40: 6e 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20  ne MODE_Insert  
7e50: 20 35 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   5  /* Generate 
7e60: 53 51 4c 20 22 69 6e 73 65 72 74 22 20 73 74 61  SQL "insert" sta
7e70: 74 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69  tements */.#defi
7e80: 6e 65 20 4d 4f 44 45 5f 51 75 6f 74 65 20 20 20  ne MODE_Quote   
7e90: 20 36 20 20 2f 2a 20 51 75 6f 74 65 20 76 61 6c   6  /* Quote val
7ea0: 75 65 73 20 61 73 20 66 6f 72 20 53 51 4c 20 2a  ues as for SQL *
7eb0: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54  /.#define MODE_T
7ec0: 63 6c 20 20 20 20 20 20 37 20 20 2f 2a 20 47 65  cl      7  /* Ge
7ed0: 6e 65 72 61 74 65 20 41 4e 53 49 2d 43 20 6f 72  nerate ANSI-C or
7ee0: 20 54 43 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d   TCL quoted elem
7ef0: 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ents */.#define 
7f00: 4d 4f 44 45 5f 43 73 76 20 20 20 20 20 20 38 20  MODE_Csv      8 
7f10: 20 2f 2a 20 51 75 6f 74 65 20 73 74 72 69 6e 67   /* Quote string
7f20: 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 70  s, numbers are p
7f30: 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lain */.#define 
7f40: 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20 39 20  MODE_Explain  9 
7f50: 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f   /* Like MODE_Co
7f60: 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74  lumn, but do not
7f70: 20 74 72 75 6e 63 61 74 65 20 64 61 74 61 20 2a   truncate data *
7f80: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 41  /.#define MODE_A
7f90: 73 63 69 69 20 20 20 31 30 20 20 2f 2a 20 55 73  scii   10  /* Us
7fa0: 65 20 41 53 43 49 49 20 75 6e 69 74 20 61 6e 64  e ASCII unit and
7fb0: 20 72 65 63 6f 72 64 20 73 65 70 61 72 61 74 6f   record separato
7fc0: 72 73 20 28 30 78 31 46 2f 30 78 31 45 29 20 2a  rs (0x1F/0x1E) *
7fd0: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 50  /.#define MODE_P
7fe0: 72 65 74 74 79 20 20 31 31 20 20 2f 2a 20 50 72  retty  11  /* Pr
7ff0: 65 74 74 79 2d 70 72 69 6e 74 20 73 63 68 65 6d  etty-print schem
8000: 61 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  as */.#define MO
8010: 44 45 5f 45 51 50 20 20 20 20 20 31 32 20 20 2f  DE_EQP     12  /
8020: 2a 20 43 6f 6e 76 65 72 74 73 20 45 58 50 4c 41  * Converts EXPLA
8030: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 6f 75  IN QUERY PLAN ou
8040: 74 70 75 74 20 69 6e 74 6f 20 61 20 67 72 61 70  tput into a grap
8050: 68 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e  h */..static con
8060: 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 44 65 73  st char *modeDes
8070: 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65  cr[] = {.  "line
8080: 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20  ",.  "column",. 
8090: 20 22 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d 69   "list",.  "semi
80a0: 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22  ",.  "html",.  "
80b0: 69 6e 73 65 72 74 22 2c 0a 20 20 22 71 75 6f 74  insert",.  "quot
80c0: 65 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20 22  e",.  "tcl",.  "
80d0: 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61 69 6e  csv",.  "explain
80e0: 22 2c 0a 20 20 22 61 73 63 69 69 22 2c 0a 20 20  ",.  "ascii",.  
80f0: 22 70 72 65 74 74 79 70 72 69 6e 74 22 2c 0a 20  "prettyprint",. 
8100: 20 22 65 71 70 22 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   "eqp".};../*.**
8110: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 63   These are the c
8120: 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69 6e 65 20 73  olumn/row/line s
8130: 65 70 61 72 61 74 6f 72 73 20 75 73 65 64 20 62  eparators used b
8140: 79 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a  y the various.**
8150: 20 69 6d 70 6f 72 74 2f 65 78 70 6f 72 74 20 6d   import/export m
8160: 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  odes..*/.#define
8170: 20 53 45 50 5f 43 6f 6c 75 6d 6e 20 20 20 20 22   SEP_Column    "
8180: 7c 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 52  |".#define SEP_R
8190: 6f 77 20 20 20 20 20 20 20 22 5c 6e 22 0a 23 64  ow       "\n".#d
81a0: 65 66 69 6e 65 20 53 45 50 5f 54 61 62 20 20 20  efine SEP_Tab   
81b0: 20 20 20 20 22 5c 74 22 0a 23 64 65 66 69 6e 65      "\t".#define
81c0: 20 53 45 50 5f 53 70 61 63 65 20 20 20 20 20 22   SEP_Space     "
81d0: 20 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43   ".#define SEP_C
81e0: 6f 6d 6d 61 20 20 20 20 20 22 2c 22 0a 23 64 65  omma     ",".#de
81f0: 66 69 6e 65 20 53 45 50 5f 43 72 4c 66 20 20 20  fine SEP_CrLf   
8200: 20 20 20 22 5c 72 5c 6e 22 0a 23 64 65 66 69 6e     "\r\n".#defin
8210: 65 20 53 45 50 5f 55 6e 69 74 20 20 20 20 20 20  e SEP_Unit      
8220: 22 5c 78 31 46 22 0a 23 64 65 66 69 6e 65 20 53  "\x1F".#define S
8230: 45 50 5f 52 65 63 6f 72 64 20 20 20 20 22 5c 78  EP_Record    "\x
8240: 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  1E"../*.** A cal
8250: 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71  lback for the sq
8260: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69 6e 74 65  lite3_log() inte
8270: 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rface..*/.static
8280: 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67 28 76   void shellLog(v
8290: 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 69  oid *pArg, int i
82a0: 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63  ErrCode, const c
82b0: 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 53 68  har *zMsg){.  Sh
82c0: 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53  ellState *p = (S
82d0: 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b  hellState*)pArg;
82e0: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67 3d 3d  .  if( p->pLog==
82f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 75 74  0 ) return;.  ut
8300: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 70 4c 6f  f8_printf(p->pLo
8310: 67 2c 20 22 28 25 64 29 20 25 73 5c 6e 22 2c 20  g, "(%d) %s\n", 
8320: 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67 29 3b  iErrCode, zMsg);
8330: 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e 70 4c 6f  .  fflush(p->pLo
8340: 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  g);.}../*.** SQL
8350: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65 6c   function:  shel
8360: 6c 5f 70 75 74 73 6e 6c 28 58 29 0a 2a 2a 0a 2a  l_putsnl(X).**.*
8370: 2a 20 57 72 69 74 65 20 74 68 65 20 74 65 78 74  * Write the text
8380: 20 58 20 74 6f 20 74 68 65 20 73 63 72 65 65 6e   X to the screen
8390: 20 28 6f 72 20 77 68 61 74 65 76 65 72 20 6f 75   (or whatever ou
83a0: 74 70 75 74 20 69 73 20 62 65 69 6e 67 20 64 69  tput is being di
83b0: 72 65 63 74 65 64 29 0a 2a 2a 20 61 64 64 69 6e  rected).** addin
83c0: 67 20 61 20 6e 65 77 6c 69 6e 65 20 61 74 20 74  g a newline at t
83d0: 68 65 20 65 6e 64 2c 20 61 6e 64 20 74 68 65 6e  he end, and then
83e0: 20 72 65 74 75 72 6e 20 58 2e 0a 2a 2f 0a 73 74   return X..*/.st
83f0: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50  atic void shellP
8400: 75 74 73 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  utsFunc(.  sqlit
8410: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
8420: 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20  ,.  int nVal,.  
8430: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
8440: 61 70 56 61 6c 0a 29 7b 0a 20 20 53 68 65 6c 6c  apVal.){.  Shell
8450: 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c  State *p = (Shel
8460: 6c 53 74 61 74 65 2a 29 73 71 6c 69 74 65 33 5f  lState*)sqlite3_
8470: 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b  user_data(pCtx);
8480: 0a 20 20 28 76 6f 69 64 29 6e 56 61 6c 3b 0a 20  .  (void)nVal;. 
8490: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
84a0: 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  out, "%s\n", sql
84b0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
84c0: 61 70 56 61 6c 5b 30 5d 29 29 3b 0a 20 20 73 71  apVal[0]));.  sq
84d0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
84e0: 75 65 28 70 43 74 78 2c 20 61 70 56 61 6c 5b 30  ue(pCtx, apVal[0
84f0: 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  ]);.}../*.** SQL
8500: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20 65 64 69   function:   edi
8510: 74 28 56 41 4c 55 45 29 0a 2a 2a 20 20 20 20 20  t(VALUE).**     
8520: 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69 74              edit
8530: 28 56 41 4c 55 45 2c 45 44 49 54 4f 52 29 0a 2a  (VALUE,EDITOR).*
8540: 2a 0a 2a 2a 20 54 68 65 73 65 20 73 74 65 70 73  *.** These steps
8550: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
8560: 57 72 69 74 65 20 56 41 4c 55 45 20 69 6e 74 6f  Write VALUE into
8570: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
8580: 65 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 75  e..**     (2) Ru
8590: 6e 20 70 72 6f 67 72 61 6d 20 45 44 49 54 4f 52  n program EDITOR
85a0: 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
85b0: 72 79 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20  ry file..**     
85c0: 28 33 29 20 52 65 61 64 20 74 68 65 20 74 65 6d  (3) Read the tem
85d0: 70 6f 72 61 72 79 20 66 69 6c 65 20 62 61 63 6b  porary file back
85e0: 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 73 20   and return its 
85f0: 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 65 20 72  content as the r
8600: 65 73 75 6c 74 2e 0a 2a 2a 20 20 20 20 20 28 34  esult..**     (4
8610: 29 20 44 65 6c 65 74 65 20 74 68 65 20 74 65 6d  ) Delete the tem
8620: 70 6f 72 61 72 79 20 66 69 6c 65 0a 2a 2a 0a 2a  porary file.**.*
8630: 2a 20 49 66 20 74 68 65 20 45 44 49 54 4f 52 20  * If the EDITOR 
8640: 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 6d 69 74  argument is omit
8650: 74 65 64 2c 20 75 73 65 20 74 68 65 20 76 61 6c  ted, use the val
8660: 75 65 20 69 6e 20 74 68 65 20 56 49 53 55 41 4c  ue in the VISUAL
8670: 0a 2a 2a 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  .** environment 
8680: 76 61 72 69 61 62 6c 65 2e 20 20 49 66 20 73 74  variable.  If st
8690: 69 6c 6c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ill there is no 
86a0: 45 44 49 54 4f 52 2c 20 74 68 72 6f 75 67 68 20  EDITOR, through 
86b0: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
86c0: 41 6c 73 6f 20 74 68 72 6f 77 20 61 6e 20 65 72  Also throw an er
86d0: 72 6f 72 20 69 66 20 74 68 65 20 45 44 49 54 4f  ror if the EDITO
86e0: 52 20 70 72 6f 67 72 61 6d 20 72 65 74 75 72 6e  R program return
86f0: 73 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 65 78 69  s a non-zero exi
8700: 74 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 6e 64  t code..*/.#ifnd
8710: 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  ef SQLITE_NOHAVE
8720: 5f 53 59 53 54 45 4d 0a 73 74 61 74 69 63 20 76  _SYSTEM.static v
8730: 6f 69 64 20 65 64 69 74 46 75 6e 63 28 0a 20 20  oid editFunc(.  
8740: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8750: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
8760: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
8770: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
8780: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
8790: 64 69 74 6f 72 3b 0a 20 20 63 68 61 72 20 2a 7a  ditor;.  char *z
87a0: 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  TempFile = 0;.  
87b0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
87c0: 68 61 72 20 2a 7a 43 6d 64 20 3d 20 30 3b 0a 20  har *zCmd = 0;. 
87d0: 20 69 6e 74 20 62 42 69 6e 3b 0a 20 20 69 6e 74   int bBin;.  int
87e0: 20 72 63 3b 0a 20 20 69 6e 74 20 68 61 73 43 52   rc;.  int hasCR
87f0: 4e 4c 20 3d 20 30 3b 0a 20 20 46 49 4c 45 20 2a  NL = 0;.  FILE *
8800: 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  f = 0;.  sqlite3
8810: 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 73 71 6c  _int64 sz;.  sql
8820: 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20  ite3_int64 x;.  
8830: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
8840: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67   = 0;..  if( arg
8850: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 45 64 69  c==2 ){.    zEdi
8860: 74 6f 72 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  tor = (const cha
8870: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
8880: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
8890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45 64    }else{.    zEd
88a0: 69 74 6f 72 20 3d 20 67 65 74 65 6e 76 28 22 56  itor = getenv("V
88b0: 49 53 55 41 4c 22 29 3b 0a 20 20 7d 0a 20 20 69  ISUAL");.  }.  i
88c0: 66 28 20 7a 45 64 69 74 6f 72 3d 3d 30 20 29 7b  f( zEditor==0 ){
88d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
88e0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
88f0: 74 2c 20 22 6e 6f 20 65 64 69 74 6f 72 20 66 6f  t, "no editor fo
8900: 72 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b 0a  r edit()", -1);.
8910: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8920: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
8930: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
8940: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )==SQLITE_NULL )
8950: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8960: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
8970: 78 74 2c 20 22 4e 55 4c 4c 20 69 6e 70 75 74 20  xt, "NULL input 
8980: 74 6f 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b  to edit()", -1);
8990: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
89a0: 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  .  db = sqlite3_
89b0: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
89c0: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7a 54  e(context);.  zT
89d0: 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73  empFile = 0;.  s
89e0: 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
89f0: 72 6f 6c 28 64 62 2c 20 30 2c 20 53 51 4c 49 54  rol(db, 0, SQLIT
8a00: 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45  E_FCNTL_TEMPFILE
8a10: 4e 41 4d 45 2c 20 26 7a 54 65 6d 70 46 69 6c 65  NAME, &zTempFile
8a20: 29 3b 0a 20 20 69 66 28 20 7a 54 65 6d 70 46 69  );.  if( zTempFi
8a30: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  le==0 ){.    sql
8a40: 69 74 65 33 5f 75 69 6e 74 36 34 20 72 20 3d 20  ite3_uint64 r = 
8a50: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  0;.    sqlite3_r
8a60: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
8a70: 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 7a 54  (r), &r);.    zT
8a80: 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  empFile = sqlite
8a90: 33 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d 70 25  3_mprintf("temp%
8aa0: 6c 6c 78 22 2c 20 72 29 3b 0a 20 20 20 20 69 66  llx", r);.    if
8ab0: 28 20 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29  ( zTempFile==0 )
8ac0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
8ad0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
8ae0: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
8af0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8b00: 0a 20 20 7d 0a 20 20 62 42 69 6e 20 3d 20 73 71  .  }.  bBin = sq
8b10: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
8b20: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
8b30: 45 5f 42 4c 4f 42 3b 0a 20 20 2f 2a 20 57 68 65  E_BLOB;.  /* Whe
8b40: 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  n writing the fi
8b50: 6c 65 20 74 6f 20 62 65 20 65 64 69 74 65 64 2c  le to be edited,
8b60: 20 64 6f 20 5c 6e 20 74 6f 20 5c 72 5c 6e 20 63   do \n to \r\n c
8b70: 6f 6e 76 65 72 73 69 6f 6e 73 20 6f 6e 20 73 79  onversions on sy
8b80: 73 74 65 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20  stems.  ** that 
8b90: 77 61 6e 74 20 5c 72 5c 6e 20 6c 69 6e 65 20 65  want \r\n line e
8ba0: 6e 64 69 6e 67 73 20 2a 2f 0a 20 20 66 20 3d 20  ndings */.  f = 
8bb0: 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69 6c 65 2c  fopen(zTempFile,
8bc0: 20 62 42 69 6e 20 3f 20 22 77 62 22 20 3a 20 22   bBin ? "wb" : "
8bd0: 77 22 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20  w");.  if( f==0 
8be0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
8bf0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
8c00: 65 78 74 2c 20 22 65 64 69 74 28 29 20 63 61 6e  ext, "edit() can
8c10: 6e 6f 74 20 6f 70 65 6e 20 74 65 6d 70 20 66 69  not open temp fi
8c20: 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f  le", -1);.    go
8c30: 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64  to edit_func_end
8c40: 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20 73 71 6c  ;.  }.  sz = sql
8c50: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
8c60: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
8c70: 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 78 20 3d   bBin ){.    x =
8c80: 20 66 77 72 69 74 65 28 73 71 6c 69 74 65 33 5f   fwrite(sqlite3_
8c90: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
8ca0: 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a  0]), 1, sz, f);.
8cb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
8cc0: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
8cd0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
8ce0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
8cf0: 76 5b 30 5d 29 3b 0a 20 20 20 20 2f 2a 20 52 65  v[0]);.    /* Re
8d00: 6d 65 6d 62 65 72 20 77 68 65 74 68 65 72 20 6f  member whether o
8d10: 72 20 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20  r not the value 
8d20: 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 74 61  originally conta
8d30: 69 6e 65 64 20 5c 72 5c 6e 20 2a 2f 0a 20 20 20  ined \r\n */.   
8d40: 20 69 66 28 20 7a 20 26 26 20 73 74 72 73 74 72   if( z && strstr
8d50: 28 7a 2c 22 5c 72 5c 6e 22 29 21 3d 30 20 29 20  (z,"\r\n")!=0 ) 
8d60: 68 61 73 43 52 4e 4c 20 3d 20 31 3b 0a 20 20 20  hasCRNL = 1;.   
8d70: 20 78 20 3d 20 66 77 72 69 74 65 28 73 71 6c 69   x = fwrite(sqli
8d80: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
8d90: 72 67 76 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20  rgv[0]), 1, sz, 
8da0: 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  f);.  }.  fclose
8db0: 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20  (f);.  f = 0;.  
8dc0: 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20  if( x!=sz ){.   
8dd0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8de0: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
8df0: 65 64 69 74 28 29 20 63 6f 75 6c 64 20 6e 6f 74  edit() could not
8e00: 20 77 72 69 74 65 20 74 68 65 20 77 68 6f 6c 65   write the whole
8e10: 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20   file", -1);.   
8e20: 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f   goto edit_func_
8e30: 65 6e 64 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20  end;.  }.  zCmd 
8e40: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
8e50: 66 28 22 25 73 20 5c 22 25 73 5c 22 22 2c 20 7a  f("%s \"%s\"", z
8e60: 45 64 69 74 6f 72 2c 20 7a 54 65 6d 70 46 69 6c  Editor, zTempFil
8e70: 65 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d  e);.  if( zCmd==
8e80: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
8e90: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
8ea0: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
8eb0: 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63    goto edit_func
8ec0: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _end;.  }.  rc =
8ed0: 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20   system(zCmd);. 
8ee0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
8ef0: 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  md);.  if( rc ){
8f00: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
8f10: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
8f20: 74 2c 20 22 45 44 49 54 4f 52 20 72 65 74 75 72  t, "EDITOR retur
8f30: 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20 2d  ned non-zero", -
8f40: 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69  1);.    goto edi
8f50: 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a  t_func_end;.  }.
8f60: 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d    f = fopen(zTem
8f70: 70 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20  pFile, "rb");.  
8f80: 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20  if( f==0 ){.    
8f90: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
8fa0: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 0a 20 20  rror(context,.  
8fb0: 20 20 20 20 22 65 64 69 74 28 29 20 63 61 6e 6e      "edit() cann
8fc0: 6f 74 20 72 65 6f 70 65 6e 20 74 65 6d 70 20 66  ot reopen temp f
8fd0: 69 6c 65 20 61 66 74 65 72 20 65 64 69 74 22 2c  ile after edit",
8fe0: 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65   -1);.    goto e
8ff0: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20  dit_func_end;.  
9000: 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 30 2c 20  }.  fseek(f, 0, 
9010: 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a 20  SEEK_END);.  sz 
9020: 3d 20 66 74 65 6c 6c 28 66 29 3b 0a 20 20 72 65  = ftell(f);.  re
9030: 77 69 6e 64 28 66 29 3b 0a 20 20 70 20 3d 20 73  wind(f);.  p = s
9040: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
9050: 20 73 7a 2b 28 62 42 69 6e 3d 3d 30 29 20 29 3b   sz+(bBin==0) );
9060: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
9070: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
9080: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
9090: 6e 74 65 78 74 29 3b 0a 20 20 20 20 67 6f 74 6f  ntext);.    goto
90a0: 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a   edit_func_end;.
90b0: 20 20 7d 0a 20 20 78 20 3d 20 66 72 65 61 64 28    }.  x = fread(
90c0: 70 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20  p, 1, sz, f);.  
90d0: 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 66 20 3d  fclose(f);.  f =
90e0: 20 30 3b 0a 20 20 69 66 28 20 78 21 3d 73 7a 20   0;.  if( x!=sz 
90f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
9100: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
9110: 65 78 74 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20  ext, "could not 
9120: 72 65 61 64 20 62 61 63 6b 20 74 68 65 20 77 68  read back the wh
9130: 6f 6c 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a  ole file", -1);.
9140: 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75      goto edit_fu
9150: 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  nc_end;.  }.  if
9160: 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 73 71  ( bBin ){.    sq
9170: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
9180: 62 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2c 20  b64(context, p, 
9190: 73 7a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  sz, sqlite3_free
91a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
91b0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 2c  sqlite3_int64 i,
91c0: 20 6a 3b 0a 20 20 20 20 69 66 28 20 68 61 73 43   j;.    if( hasC
91d0: 52 4e 4c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  RNL ){.      /* 
91e0: 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
91f0: 63 6f 6e 74 61 69 6e 73 20 5c 72 5c 6e 20 74 68  contains \r\n th
9200: 65 6e 20 64 6f 20 6e 6f 20 63 6f 6e 76 65 72 73  en do no convers
9210: 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 5c 6e 20  ions back to \n 
9220: 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20 73 7a 3b  */.      j = sz;
9230: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9240: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
9250: 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
9260: 6c 6c 79 20 63 6f 6e 74 61 69 6e 20 5c 72 5c 6e  lly contain \r\n
9270: 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 61 6e   then convert an
9280: 79 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20 5c  y new.      ** \
9290: 72 5c 6e 20 62 61 63 6b 20 69 6e 74 6f 20 5c 6e  r\n back into \n
92a0: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
92b0: 6a 3d 30 3b 20 69 3c 73 7a 3b 20 69 2b 2b 29 7b  j=0; i<sz; i++){
92c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 5b 69  .        if( p[i
92d0: 5d 3d 3d 27 5c 72 27 20 26 26 20 70 5b 69 2b 31  ]=='\r' && p[i+1
92e0: 5d 3d 3d 27 5c 6e 27 20 29 20 69 2b 2b 3b 0a 20  ]=='\n' ) i++;. 
92f0: 20 20 20 20 20 20 20 70 5b 6a 2b 2b 5d 20 3d 20         p[j++] = 
9300: 70 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  p[i];.      }.  
9310: 20 20 20 20 73 7a 20 3d 20 6a 3b 0a 20 20 20 20      sz = j;.    
9320: 20 20 70 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 20    p[sz] = 0;.   
9330: 20 7d 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   } .    sqlite3_
9340: 72 65 73 75 6c 74 5f 74 65 78 74 36 34 28 63 6f  result_text64(co
9350: 6e 74 65 78 74 2c 20 28 63 6f 6e 73 74 20 63 68  ntext, (const ch
9360: 61 72 2a 29 70 2c 20 73 7a 2c 0a 20 20 20 20 20  ar*)p, sz,.     
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9380: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9390: 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  e, SQLITE_UTF8);
93a0: 0a 20 20 7d 0a 20 20 70 20 3d 20 30 3b 0a 0a 65  .  }.  p = 0;..e
93b0: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3a 0a 20 20  dit_func_end:.  
93c0: 69 66 28 20 66 20 29 20 66 63 6c 6f 73 65 28 66  if( f ) fclose(f
93d0: 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 54 65 6d  );.  unlink(zTem
93e0: 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  pFile);.  sqlite
93f0: 33 5f 66 72 65 65 28 7a 54 65 6d 70 46 69 6c 65  3_free(zTempFile
9400: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
9410: 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  e(p);.}.#endif /
9420: 2a 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f  * SQLITE_NOHAVE_
9430: 53 59 53 54 45 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SYSTEM */../*.**
9440: 20 53 61 76 65 20 6f 72 20 72 65 73 74 6f 72 65   Save or restore
9450: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 75 74   the current out
9460: 70 75 74 20 6d 6f 64 65 0a 2a 2f 0a 73 74 61 74  put mode.*/.stat
9470: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f  ic void outputMo
9480: 64 65 50 75 73 68 28 53 68 65 6c 6c 53 74 61 74  dePush(ShellStat
9490: 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65  e *p){.  p->mode
94a0: 50 72 69 6f 72 20 3d 20 70 2d 3e 6d 6f 64 65 3b  Prior = p->mode;
94b0: 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c  .  memcpy(p->col
94c0: 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e 63 6f 6c  SepPrior, p->col
94d0: 53 65 70 61 72 61 74 6f 72 2c 20 73 69 7a 65 6f  Separator, sizeo
94e0: 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  f(p->colSeparato
94f0: 72 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d  r));.  memcpy(p-
9500: 3e 72 6f 77 53 65 70 50 72 69 6f 72 2c 20 70 2d  >rowSepPrior, p-
9510: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 73  >rowSeparator, s
9520: 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
9530: 72 61 74 6f 72 29 29 3b 0a 7d 0a 73 74 61 74 69  rator));.}.stati
9540: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64  c void outputMod
9550: 65 50 6f 70 28 53 68 65 6c 6c 53 74 61 74 65 20  ePop(ShellState 
9560: 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 20 3d  *p){.  p->mode =
9570: 20 70 2d 3e 6d 6f 64 65 50 72 69 6f 72 3b 0a 20   p->modePrior;. 
9580: 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65   memcpy(p->colSe
9590: 70 61 72 61 74 6f 72 2c 20 70 2d 3e 63 6f 6c 53  parator, p->colS
95a0: 65 70 50 72 69 6f 72 2c 20 73 69 7a 65 6f 66 28  epPrior, sizeof(
95b0: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
95c0: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72  );.  memcpy(p->r
95d0: 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 70 2d 3e  owSeparator, p->
95e0: 72 6f 77 53 65 70 50 72 69 6f 72 2c 20 73 69 7a  rowSepPrior, siz
95f0: 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
9600: 74 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tor));.}../*.** 
9610: 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  Output the given
9620: 20 73 74 72 69 6e 67 20 61 73 20 61 20 68 65 78   string as a hex
9630: 2d 65 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28 65  -encoded blob (e
9640: 67 2e 20 58 27 31 32 33 34 27 20 29 0a 2a 2f 0a  g. X'1234' ).*/.
9650: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
9660: 75 74 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c 45  ut_hex_blob(FILE
9670: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69   *out, const voi
9680: 64 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42  d *pBlob, int nB
9690: 6c 6f 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  lob){.  int i;. 
96a0: 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 28   char *zBlob = (
96b0: 63 68 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20 20  char *)pBlob;.  
96c0: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
96d0: 58 27 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  X'");.  for(i=0;
96e0: 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20   i<nBlob; i++){ 
96f0: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
9700: 25 30 32 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30  %02x",zBlob[i]&0
9710: 78 66 66 29 3b 20 7d 0a 20 20 72 61 77 5f 70 72  xff); }.  raw_pr
9720: 69 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a 7d  intf(out,"'");.}
9730: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 73  ../*.** Find a s
9740: 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f  tring that is no
9750: 74 20 66 6f 75 6e 64 20 61 6e 79 77 68 65 72 65  t found anywhere
9760: 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e   in z[].  Return
9770: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
9780: 20 74 68 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2a   that string..**
9790: 0a 2a 2a 20 54 72 79 20 74 6f 20 75 73 65 20 7a  .** Try to use z
97a0: 41 20 61 6e 64 20 7a 42 20 66 69 72 73 74 2e 20  A and zB first. 
97b0: 20 49 66 20 62 6f 74 68 20 6f 66 20 74 68 6f 73   If both of thos
97c0: 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 66 6f  e are already fo
97d0: 75 6e 64 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68  und in z[].** th
97e0: 65 6e 20 6d 61 6b 65 20 75 70 20 73 6f 6d 65 20  en make up some 
97f0: 73 74 72 69 6e 67 20 61 6e 64 20 73 74 6f 72 65  string and store
9800: 20 69 74 20 69 6e 20 74 68 65 20 62 75 66 66 65   it in the buffe
9810: 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  r zBuf..*/.stati
9820: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
9830: 75 73 65 64 5f 73 74 72 69 6e 67 28 0a 20 20 63  used_string(.  c
9840: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20  onst char *z,   
9850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9860: 20 2f 2a 20 52 65 73 75 6c 74 20 6d 75 73 74 20   /* Result must 
9870: 6e 6f 74 20 61 70 70 65 61 72 20 61 6e 79 77 68  not appear anywh
9880: 65 72 65 20 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f  ere in z */.  co
9890: 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f  nst char *zA, co
98a0: 6e 73 74 20 63 68 61 72 20 2a 7a 42 2c 20 20 20  nst char *zB,   
98b0: 2f 2a 20 54 72 79 20 74 68 65 73 65 20 66 69 72  /* Try these fir
98c0: 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42  st */.  char *zB
98d0: 75 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  uf              
98e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
98f0: 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 67 65  ce to store a ge
9900: 6e 65 72 61 74 65 64 20 73 74 72 69 6e 67 20 2a  nerated string *
9910: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
9920: 69 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 74 72  i = 0;.  if( str
9930: 73 74 72 28 7a 2c 20 7a 41 29 3d 3d 30 20 29 20  str(z, zA)==0 ) 
9940: 72 65 74 75 72 6e 20 7a 41 3b 0a 20 20 69 66 28  return zA;.  if(
9950: 20 73 74 72 73 74 72 28 7a 2c 20 7a 42 29 3d 3d   strstr(z, zB)==
9960: 30 20 29 20 72 65 74 75 72 6e 20 7a 42 3b 0a 20  0 ) return zB;. 
9970: 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
9980: 5f 73 6e 70 72 69 6e 74 66 28 32 30 2c 7a 42 75  _snprintf(20,zBu
9990: 66 2c 22 28 25 73 25 75 29 22 2c 20 7a 41 2c 20  f,"(%s%u)", zA, 
99a0: 69 2b 2b 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  i++);.  }while( 
99b0: 73 74 72 73 74 72 28 7a 2c 7a 42 75 66 29 21 3d  strstr(z,zBuf)!=
99c0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42  0 );.  return zB
99d0: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  uf;.}../*.** Out
99e0: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
99f0: 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64  ring as a quoted
9a00: 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51   string using SQ
9a10: 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e  L quoting conven
9a20: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  tions..**.** See
9a30: 20 61 6c 73 6f 3a 20 6f 75 74 70 75 74 5f 71 75   also: output_qu
9a40: 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72  oted_escaped_str
9a50: 69 6e 67 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ing().*/.static 
9a60: 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74  void output_quot
9a70: 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  ed_string(FILE *
9a80: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
9a90: 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *z){.  int i;.  
9aa0: 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e  char c;.  setBin
9ab0: 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b  aryMode(out, 1);
9ac0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d  .  for(i=0; (c =
9ad0: 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d   z[i])!=0 && c!=
9ae0: 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69  '\''; i++){}.  i
9af0: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75  f( c==0 ){.    u
9b00: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  tf8_printf(out,"
9b10: 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73  '%s'",z);.  }els
9b20: 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  e{.    raw_print
9b30: 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20  f(out, "'");.   
9b40: 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
9b50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20      for(i=0; (c 
9b60: 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21  = z[i])!=0 && c!
9b70: 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\''; i++){}.  
9b80: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20      if( c=='\'' 
9b90: 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ) i++;.      if(
9ba0: 20 69 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74   i ){.        ut
9bb0: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
9bc0: 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20  %.*s", i, z);.  
9bd0: 20 20 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20        z += i;.  
9be0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9bf0: 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20  c=='\'' ){.     
9c00: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
9c10: 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20  t, "'");.       
9c20: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9c30: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
9c40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  0 ){.        bre
9c50: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
9c60: 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20    z++;.    }.   
9c70: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
9c80: 20 22 27 22 29 3b 0a 20 20 7d 0a 20 20 73 65 74   "'");.  }.  set
9c90: 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29  TextMode(out, 1)
9ca0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  ;.}../*.** Outpu
9cb0: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
9cc0: 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73  ng as a quoted s
9cd0: 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20  tring using SQL 
9ce0: 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69  quoting conventi
9cf0: 6f 6e 73 2e 0a 2a 2a 20 41 64 64 69 74 69 6f 6e  ons..** Addition
9d00: 61 6c 6c 6c 79 20 2c 20 65 73 63 61 70 65 20 74  allly , escape t
9d10: 68 65 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22  he "\n" and "\r"
9d20: 20 63 68 61 72 61 63 74 65 72 73 20 73 6f 20 74   characters so t
9d30: 68 61 74 20 74 68 65 79 20 64 6f 20 6e 6f 74 0a  hat they do not.
9d40: 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74 65 64  ** get corrupted
9d50: 20 62 79 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20   by end-of-line 
9d60: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 66 61 63 69  translation faci
9d70: 6c 69 74 69 65 73 20 69 6e 20 73 6f 6d 65 20 6f  lities in some o
9d80: 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74  perating.** syst
9d90: 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ems..**.** This 
9da0: 69 73 20 6c 69 6b 65 20 6f 75 74 70 75 74 5f 71  is like output_q
9db0: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 29 20 62  uoted_string() b
9dc0: 75 74 20 77 69 74 68 20 74 68 65 20 61 64 64 69  ut with the addi
9dd0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 5c 72 5c 6e  tion of the \r\n
9de0: 0a 2a 2a 20 65 73 63 61 70 65 20 6d 65 63 68 61  .** escape mecha
9df0: 6e 69 73 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nism..*/.static 
9e00: 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74  void output_quot
9e10: 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e  ed_escaped_strin
9e20: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
9e30: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
9e40: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a  nt i;.  char c;.
9e50: 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28    setBinaryMode(
9e60: 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69  out, 1);.  for(i
9e70: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
9e80: 30 20 26 26 20 63 21 3d 27 5c 27 27 20 26 26 20  0 && c!='\'' && 
9e90: 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c  c!='\n' && c!='\
9ea0: 72 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28  r'; i++){}.  if(
9eb0: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66   c==0 ){.    utf
9ec0: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25  8_printf(out,"'%
9ed0: 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  s'",z);.  }else{
9ee0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
9ef0: 2a 7a 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 63 6f  *zNL = 0;.    co
9f00: 6e 73 74 20 63 68 61 72 20 2a 7a 43 52 20 3d 20  nst char *zCR = 
9f10: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d  0;.    int nNL =
9f20: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 52 20   0;.    int nCR 
9f30: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 7a 42  = 0;.    char zB
9f40: 75 66 31 5b 32 30 5d 2c 20 7a 42 75 66 32 5b 32  uf1[20], zBuf2[2
9f50: 30 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  0];.    for(i=0;
9f60: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
9f70: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e     if( z[i]=='\n
9f80: 27 20 29 20 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20  ' ) nNL++;.     
9f90: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20   if( z[i]=='\r' 
9fa0: 29 20 6e 43 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ) nCR++;.    }. 
9fb0: 20 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20     if( nNL ){.  
9fc0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
9fd0: 75 74 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b  ut, "replace(");
9fe0: 0a 20 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75  .      zNL = unu
9ff0: 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c  sed_string(z, "\
a000: 5c 6e 22 2c 20 22 5c 5c 30 31 32 22 2c 20 7a 42  \n", "\\012", zB
a010: 75 66 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  uf1);.    }.    
a020: 69 66 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20  if( nCR ){.     
a030: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a040: 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20   "replace(");.  
a050: 20 20 20 20 7a 43 52 20 3d 20 75 6e 75 73 65 64      zCR = unused
a060: 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 72 22  _string(z, "\\r"
a070: 2c 20 22 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32  , "\\015", zBuf2
a080: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77  );.    }.    raw
a090: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22  _printf(out, "'"
a0a0: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a  );.    while( *z
a0b0: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
a0c0: 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  0; (c = z[i])!=0
a0d0: 20 26 26 20 63 21 3d 27 5c 6e 27 20 26 26 20 63   && c!='\n' && c
a0e0: 21 3d 27 5c 72 27 20 26 26 20 63 21 3d 27 5c 27  !='\r' && c!='\'
a0f0: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  '; i++){}.      
a100: 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b  if( c=='\'' ) i+
a110: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29  +;.      if( i )
a120: 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
a130: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73  rintf(out, "%.*s
a140: 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20  ", i, z);.      
a150: 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20    z += i;.      
a160: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
a170: 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72  \'' ){.        r
a180: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a190: 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  '");.        con
a1a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
a1b0: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
a1c0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
a1d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b        }.      z+
a1e0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  +;.      if( c==
a1f0: 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\n' ){.        
a200: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
a210: 22 25 73 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20  "%s", zNL);.    
a220: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
a230: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f      }.      raw_
a240: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
a250: 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20  , zCR);.    }.  
a260: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a270: 2c 20 22 27 22 29 3b 0a 20 20 20 20 69 66 28 20  , "'");.    if( 
a280: 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72 61 77  nCR ){.      raw
a290: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27  _printf(out, ",'
a2a0: 25 73 27 2c 63 68 61 72 28 31 33 29 29 22 2c 20  %s',char(13))", 
a2b0: 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zCR);.    }.    
a2c0: 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20  if( nNL ){.     
a2d0: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a2e0: 20 22 2c 27 25 73 27 2c 63 68 61 72 28 31 30 29   ",'%s',char(10)
a2f0: 29 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a  )", zNL);.    }.
a300: 20 20 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64    }.  setTextMod
a310: 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  e(out, 1);.}../*
a320: 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67  .** Output the g
a330: 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61  iven string as a
a340: 20 71 75 6f 74 65 64 20 61 63 63 6f 72 64 69 6e   quoted accordin
a350: 67 20 74 6f 20 43 20 6f 72 20 54 43 4c 20 71 75  g to C or TCL qu
a360: 6f 74 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a  oting rules..*/.
a370: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
a380: 75 74 5f 63 5f 73 74 72 69 6e 67 28 46 49 4c 45  ut_c_string(FILE
a390: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
a3a0: 72 20 2a 7a 29 7b 0a 20 20 75 6e 73 69 67 6e 65  r *z){.  unsigne
a3b0: 64 20 69 6e 74 20 63 3b 0a 20 20 66 70 75 74 63  d int c;.  fputc
a3c0: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 77 68  ('"', out);.  wh
a3d0: 69 6c 65 28 20 28 63 20 3d 20 2a 28 7a 2b 2b 29  ile( (c = *(z++)
a3e0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
a3f0: 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  c=='\\' ){.     
a400: 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a   fputc(c, out);.
a410: 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f        fputc(c, o
a420: 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ut);.    }else i
a430: 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20  f( c=='"' ){.   
a440: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a450: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a460: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('"', out);.    
a470: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 74  }else if( c=='\t
a480: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a490: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a4a0: 20 20 20 66 70 75 74 63 28 27 74 27 2c 20 6f 75     fputc('t', ou
a4b0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a4c0: 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  ( c=='\n' ){.   
a4d0: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a4e0: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a4f0: 28 27 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('n', out);.    
a500: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 72  }else if( c=='\r
a510: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a520: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a530: 20 20 20 66 70 75 74 63 28 27 72 27 2c 20 6f 75     fputc('r', ou
a540: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a550: 28 20 21 69 73 70 72 69 6e 74 28 63 26 30 78 66  ( !isprint(c&0xf
a560: 66 29 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  f) ){.      raw_
a570: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 5c 25  printf(out, "\\%
a580: 30 33 6f 22 2c 20 63 26 30 78 66 66 29 3b 0a 20  03o", c&0xff);. 
a590: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a5a0: 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20  fputc(c, out);. 
a5b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 75 74 63     }.  }.  fputc
a5c0: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f  ('"', out);.}../
a5d0: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
a5e0: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 77 69 74  given string wit
a5f0: 68 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  h characters tha
a600: 74 20 61 72 65 20 73 70 65 63 69 61 6c 20 74 6f  t are special to
a610: 0a 2a 2a 20 48 54 4d 4c 20 65 73 63 61 70 65 64  .** HTML escaped
a620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a630: 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72   output_html_str
a640: 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  ing(FILE *out, c
a650: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
a660: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 3d   int i;.  if( z=
a670: 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 77  =0 ) z = "";.  w
a680: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
a690: 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a  for(i=0;   z[i].
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a              && z
a6b0: 5b 69 5d 21 3d 27 3c 27 0a 20 20 20 20 20 20 20  [i]!='<'.       
a6c0: 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 26       && z[i]!='&
a6d0: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  '.            &&
a6e0: 20 7a 5b 69 5d 21 3d 27 3e 27 0a 20 20 20 20 20   z[i]!='>'.     
a6f0: 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d         && z[i]!=
a700: 27 5c 22 27 0a 20 20 20 20 20 20 20 20 20 20 20  '\"'.           
a710: 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a   && z[i]!='\'';.
a720: 20 20 20 20 20 20 20 20 69 2b 2b 29 7b 7d 0a 20          i++){}. 
a730: 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20     if( i>0 ){.  
a740: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
a750: 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b  out,"%.*s",i,z);
a760: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
a770: 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20  [i]=='<' ){.    
a780: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a790: 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65  ,"&lt;");.    }e
a7a0: 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26  lse if( z[i]=='&
a7b0: 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ' ){.      raw_p
a7c0: 72 69 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b  rintf(out,"&amp;
a7d0: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ");.    }else if
a7e0: 28 20 7a 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20  ( z[i]=='>' ){. 
a7f0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
a800: 6f 75 74 2c 22 26 67 74 3b 22 29 3b 0a 20 20 20  out,"&gt;");.   
a810: 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d   }else if( z[i]=
a820: 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 72  ='\"' ){.      r
a830: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26  aw_printf(out,"&
a840: 71 75 6f 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c  quot;");.    }el
a850: 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27  se if( z[i]=='\'
a860: 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ' ){.      raw_p
a870: 72 69 6e 74 66 28 6f 75 74 2c 22 26 23 33 39 3b  rintf(out,"&#39;
a880: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
a890: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a8a0: 7d 0a 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31  }.    z += i + 1
a8b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
a8c0: 66 20 61 20 66 69 65 6c 64 20 63 6f 6e 74 61 69  f a field contai
a8d0: 6e 73 20 61 6e 79 20 63 68 61 72 61 63 74 65 72  ns any character
a8e0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 61   identified by a
a8f0: 20 31 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   1 in the follow
a900: 69 6e 67 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68  ing.** array, th
a910: 65 6e 20 74 68 65 20 73 74 72 69 6e 67 20 6d 75  en the string mu
a920: 73 74 20 62 65 20 71 75 6f 74 65 64 20 66 6f 72  st be quoted for
a930: 20 43 53 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   CSV..*/.static 
a940: 63 6f 6e 73 74 20 63 68 61 72 20 6e 65 65 64 43  const char needC
a950: 73 76 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20  svQuote[] = {.  
a960: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a970: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
a980: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a990: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
a9a0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
a9b0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a9c0: 31 2c 20 31 2c 0a 20 20 31 2c 20 30 2c 20 31 2c  1, 1,.  1, 0, 1,
a9d0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20   0, 0, 0, 0, 1, 
a9e0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
a9f0: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
aa00: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
aa10: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
aa20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
aa30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
aa40: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
aa50: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
aa60: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
aa70: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
aa80: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
aa90: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
aaa0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
aab0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
aac0: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
aad0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
aae0: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
aaf0: 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 0a 20 20  , 0, 0, 0, 1,.  
ab00: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
ab10: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
ab20: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
ab30: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
ab40: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
ab50: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ab60: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
ab70: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ab80: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
ab90: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
aba0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
abb0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
abc0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
abd0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
abe0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
abf0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
ac00: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
ac10: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
ac20: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ac30: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
ac40: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ac50: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
ac60: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
ac70: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
ac80: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
ac90: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 7d 3b  , 1, 1, 1, 1,.};
aca0: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61  ../*.** Output a
acb0: 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
acc0: 43 53 56 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20  CSV.  Actually, 
acd0: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 20  p->colSeparator 
ace0: 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
acf0: 68 65 20 73 65 70 61 72 61 74 6f 72 2c 20 77 68  he separator, wh
ad00: 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
ad10: 6f 74 20 62 65 20 61 20 63 6f 6d 6d 61 2e 20 20  ot be a comma.  
ad20: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 20 69 73 0a  p->nullValue is.
ad30: 2a 2a 20 74 68 65 20 6e 75 6c 6c 20 76 61 6c 75  ** the null valu
ad40: 65 2e 20 20 53 74 72 69 6e 67 73 20 61 72 65 20  e.  Strings are 
ad50: 71 75 6f 74 65 64 20 69 66 20 6e 65 63 65 73 73  quoted if necess
ad60: 61 72 79 2e 20 20 54 68 65 20 73 65 70 61 72 61  ary.  The separa
ad70: 74 6f 72 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 69  tor.** is only i
ad80: 73 73 75 65 64 20 69 66 20 62 53 65 70 20 69 73  ssued if bSep is
ad90: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
ada0: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 73 76   void output_csv
adb0: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
adc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
add0: 6e 74 20 62 53 65 70 29 7b 0a 20 20 46 49 4c 45  nt bSep){.  FILE
ade0: 20 2a 6f 75 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a   *out = p->out;.
adf0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
ae00: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
ae10: 74 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61  t,"%s",p->nullVa
ae20: 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lue);.  }else{. 
ae30: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
ae40: 74 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33  t nSep = strlen3
ae50: 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  0(p->colSeparato
ae60: 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  r);.    for(i=0;
ae70: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
ae80: 20 20 20 69 66 28 20 6e 65 65 64 43 73 76 51 75     if( needCsvQu
ae90: 6f 74 65 5b 28 28 75 6e 73 69 67 6e 65 64 20 63  ote[((unsigned c
aea0: 68 61 72 2a 29 7a 29 5b 69 5d 5d 0a 20 20 20 20  har*)z)[i]].    
aeb0: 20 20 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70       || (z[i]==p
aec0: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30  ->colSeparator[0
aed0: 5d 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  ] &&.           
aee0: 20 20 28 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d 65    (nSep==1 || me
aef0: 6d 63 6d 70 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65  mcmp(z, p->colSe
af00: 70 61 72 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d  parator, nSep)==
af10: 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
af20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72   = 0;.        br
af30: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
af40: 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20   }.    if( i==0 
af50: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
af60: 51 75 6f 74 65 64 20 3d 20 73 71 6c 69 74 65 33  Quoted = sqlite3
af70: 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22  _mprintf("\"%w\"
af80: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 75 74 66  ", z);.      utf
af90: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
afa0: 73 22 2c 20 7a 51 75 6f 74 65 64 29 3b 0a 20 20  s", zQuoted);.  
afb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
afc0: 28 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 7d  (zQuoted);.    }
afd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38  else{.      utf8
afe0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
aff0: 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ", z);.    }.  }
b000: 0a 20 20 69 66 28 20 62 53 65 70 20 29 7b 0a 20  .  if( bSep ){. 
b010: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
b020: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
b030: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
b040: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
b050: 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 77 68   routine runs wh
b060: 65 6e 20 74 68 65 20 75 73 65 72 20 70 72 65 73  en the user pres
b070: 73 65 73 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74  ses Ctrl-C.*/.st
b080: 61 74 69 63 20 76 6f 69 64 20 69 6e 74 65 72 72  atic void interr
b090: 75 70 74 5f 68 61 6e 64 6c 65 72 28 69 6e 74 20  upt_handler(int 
b0a0: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
b0b0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
b0c0: 55 73 65 64 29 3b 0a 20 20 73 65 65 6e 49 6e 74  Used);.  seenInt
b0d0: 65 72 72 75 70 74 2b 2b 3b 0a 20 20 69 66 28 20  errupt++;.  if( 
b0e0: 73 65 65 6e 49 6e 74 65 72 72 75 70 74 3e 32 20  seenInterrupt>2 
b0f0: 29 20 65 78 69 74 28 31 29 3b 0a 20 20 69 66 28  ) exit(1);.  if(
b100: 20 67 6c 6f 62 61 6c 44 62 20 29 20 73 71 6c 69   globalDb ) sqli
b110: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 67 6c  te3_interrupt(gl
b120: 6f 62 61 6c 44 62 29 3b 0a 7d 0a 0a 23 69 66 20  obalDb);.}..#if 
b130: 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29  (defined(_WIN32)
b140: 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
b150: 32 29 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  2)) && !defined(
b160: 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 0a 2a  _WIN32_WCE)./*.*
b170: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
b180: 75 6e 73 20 66 6f 72 20 63 6f 6e 73 6f 6c 65 20  uns for console 
b190: 65 76 65 6e 74 73 20 28 65 2e 67 2e 20 43 74 72  events (e.g. Ctr
b1a0: 6c 2d 43 29 20 6f 6e 20 57 69 6e 33 32 0a 2a 2f  l-C) on Win32.*/
b1b0: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 57 49 4e  .static BOOL WIN
b1c0: 41 50 49 20 43 6f 6e 73 6f 6c 65 43 74 72 6c 48  API ConsoleCtrlH
b1d0: 61 6e 64 6c 65 72 28 0a 20 20 44 57 4f 52 44 20  andler(.  DWORD 
b1e0: 64 77 43 74 72 6c 54 79 70 65 20 2f 2a 20 4f 6e  dwCtrlType /* On
b1f0: 65 20 6f 66 20 74 68 65 20 43 54 52 4c 5f 2a 5f  e of the CTRL_*_
b200: 45 56 45 4e 54 20 63 6f 6e 73 74 61 6e 74 73 20  EVENT constants 
b210: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 64 77 43 74  */.){.  if( dwCt
b220: 72 6c 54 79 70 65 3d 3d 43 54 52 4c 5f 43 5f 45  rlType==CTRL_C_E
b230: 56 45 4e 54 20 29 7b 0a 20 20 20 20 69 6e 74 65  VENT ){.    inte
b240: 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 30 29  rrupt_handler(0)
b250: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55  ;.    return TRU
b260: 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
b270: 46 41 4c 53 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a  FALSE;.}.#endif.
b280: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b290: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
b2a0: 4f 4e 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  ON./*.** When th
b2b0: 65 20 22 2e 61 75 74 68 20 4f 4e 22 20 69 73 20  e ".auth ON" is 
b2c0: 73 65 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  set, the followi
b2d0: 6e 67 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61  ng authorizer ca
b2e0: 6c 6c 62 61 63 6b 20 69 73 0a 2a 2a 20 69 6e 76  llback is.** inv
b2f0: 6f 6b 65 64 2e 20 20 49 74 20 61 6c 77 61 79 73  oked.  It always
b300: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
b310: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
b320: 74 20 73 68 65 6c 6c 41 75 74 68 28 0a 20 20 76  t shellAuth(.  v
b330: 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61  oid *pClientData
b340: 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f  ,.  int op,.  co
b350: 6e 73 74 20 63 68 61 72 20 2a 7a 41 31 2c 0a 20  nst char *zA1,. 
b360: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 32   const char *zA2
b370: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b380: 7a 41 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  zA3,.  const cha
b390: 72 20 2a 7a 41 34 0a 29 7b 0a 20 20 53 68 65 6c  r *zA4.){.  Shel
b3a0: 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65  lState *p = (She
b3b0: 6c 6c 53 74 61 74 65 2a 29 70 43 6c 69 65 6e 74  llState*)pClient
b3c0: 44 61 74 61 3b 0a 20 20 73 74 61 74 69 63 20 63  Data;.  static c
b3d0: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 63 74  onst char *azAct
b3e0: 69 6f 6e 5b 5d 20 3d 20 7b 20 30 2c 0a 20 20 20  ion[] = { 0,.   
b3f0: 20 20 22 43 52 45 41 54 45 5f 49 4e 44 45 58 22    "CREATE_INDEX"
b400: 2c 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  ,         "CREAT
b410: 45 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20  E_TABLE",       
b420: 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 49    "CREATE_TEMP_I
b430: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 43 52 45  NDEX",.     "CRE
b440: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c  ATE_TEMP_TABLE",
b450: 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50      "CREATE_TEMP
b460: 5f 54 52 49 47 47 45 52 22 2c 20 20 22 43 52 45  _TRIGGER",  "CRE
b470: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a  ATE_TEMP_VIEW",.
b480: 20 20 20 20 20 22 43 52 45 41 54 45 5f 54 52 49       "CREATE_TRI
b490: 47 47 45 52 22 2c 20 20 20 20 20 20 20 22 43 52  GGER",       "CR
b4a0: 45 41 54 45 5f 56 49 45 57 22 2c 20 20 20 20 20  EATE_VIEW",     
b4b0: 20 20 20 20 20 22 44 45 4c 45 54 45 22 2c 0a 20       "DELETE",. 
b4c0: 20 20 20 20 22 44 52 4f 50 5f 49 4e 44 45 58 22      "DROP_INDEX"
b4d0: 2c 20 20 20 20 20 20 20 20 20 20 20 22 44 52 4f  ,           "DRO
b4e0: 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20  P_TABLE",       
b4f0: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 49      "DROP_TEMP_I
b500: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 44 52 4f  NDEX",.     "DRO
b510: 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20  P_TEMP_TABLE",  
b520: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54      "DROP_TEMP_T
b530: 52 49 47 47 45 52 22 2c 20 20 20 20 22 44 52 4f  RIGGER",    "DRO
b540: 50 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20  P_TEMP_VIEW",.  
b550: 20 20 20 22 44 52 4f 50 5f 54 52 49 47 47 45 52     "DROP_TRIGGER
b560: 22 2c 20 20 20 20 20 20 20 20 20 22 44 52 4f 50  ",         "DROP
b570: 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20 20 20  _VIEW",         
b580: 20 20 20 22 49 4e 53 45 52 54 22 2c 0a 20 20 20     "INSERT",.   
b590: 20 20 22 50 52 41 47 4d 41 22 2c 20 20 20 20 20    "PRAGMA",     
b5a0: 20 20 20 20 20 20 20 20 20 20 22 52 45 41 44 22            "READ"
b5b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b5c0: 20 20 22 53 45 4c 45 43 54 22 2c 0a 20 20 20 20    "SELECT",.    
b5d0: 20 22 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20   "TRANSACTION", 
b5e0: 20 20 20 20 20 20 20 20 20 22 55 50 44 41 54 45           "UPDATE
b5f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
b600: 20 22 41 54 54 41 43 48 22 2c 0a 20 20 20 20 20   "ATTACH",.     
b610: 22 44 45 54 41 43 48 22 2c 20 20 20 20 20 20 20  "DETACH",       
b620: 20 20 20 20 20 20 20 20 22 41 4c 54 45 52 5f 54          "ALTER_T
b630: 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20  ABLE",          
b640: 22 52 45 49 4e 44 45 58 22 2c 0a 20 20 20 20 20  "REINDEX",.     
b650: 22 41 4e 41 4c 59 5a 45 22 2c 20 20 20 20 20 20  "ANALYZE",      
b660: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f          "CREATE_
b670: 56 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20  VTABLE",        
b680: 22 44 52 4f 50 5f 56 54 41 42 4c 45 22 2c 0a 20  "DROP_VTABLE",. 
b690: 20 20 20 20 22 46 55 4e 43 54 49 4f 4e 22 2c 20      "FUNCTION", 
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 41 56              "SAV
b6b0: 45 50 4f 49 4e 54 22 2c 20 20 20 20 20 20 20 20  EPOINT",        
b6c0: 20 20 20 20 22 52 45 43 55 52 53 49 56 45 22 0a      "RECURSIVE".
b6d0: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
b6e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b 34  const char *az[4
b6f0: 5d 3b 0a 20 20 61 7a 5b 30 5d 20 3d 20 7a 41 31  ];.  az[0] = zA1
b700: 3b 0a 20 20 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b  ;.  az[1] = zA2;
b710: 0a 20 20 61 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a  .  az[2] = zA3;.
b720: 20 20 61 7a 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20    az[3] = zA4;. 
b730: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
b740: 6f 75 74 2c 20 22 61 75 74 68 6f 72 69 7a 65 72  out, "authorizer
b750: 3a 20 25 73 22 2c 20 61 7a 41 63 74 69 6f 6e 5b  : %s", azAction[
b760: 6f 70 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  op]);.  for(i=0;
b770: 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<4; i++){.    
b780: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
b790: 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 69 66 28  t, " ");.    if(
b7a0: 20 61 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20   az[i] ){.      
b7b0: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
b7c0: 70 2d 3e 6f 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a  p->out, az[i]);.
b7d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b7e0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
b7f0: 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20  ut, "NULL");.   
b800: 20 7d 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69   }.  }.  raw_pri
b810: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22  ntf(p->out, "\n"
b820: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
b830: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
b840: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  ./*.** Print a s
b850: 63 68 65 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e  chema statement.
b860: 20 20 50 61 72 74 20 6f 66 20 4d 4f 44 45 5f 53    Part of MODE_S
b870: 65 6d 69 20 61 6e 64 20 4d 4f 44 45 5f 50 72 65  emi and MODE_Pre
b880: 74 74 79 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a  tty output..**.*
b890: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
b8a0: 6f 6e 76 65 72 74 73 20 73 6f 6d 65 20 43 52 45  onverts some CRE
b8b0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
b8c0: 65 6e 74 73 20 66 6f 72 20 73 68 61 64 6f 77 20  ents for shadow 
b8d0: 74 61 62 6c 65 73 0a 2a 2a 20 69 6e 20 46 54 53  tables.** in FTS
b8e0: 33 2f 34 2f 35 20 69 6e 74 6f 20 43 52 45 41 54  3/4/5 into CREAT
b8f0: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
b900: 58 49 53 54 53 20 73 74 61 74 65 6d 65 6e 74 73  XISTS statements
b910: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b920: 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65   printSchemaLine
b930: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73  (FILE *out, cons
b940: 74 20 63 68 61 72 20 2a 7a 2c 20 63 6f 6e 73 74  t char *z, const
b950: 20 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20   char *zTail){. 
b960: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
b970: 67 6c 6f 62 28 22 43 52 45 41 54 45 20 54 41 42  glob("CREATE TAB
b980: 4c 45 20 5b 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d  LE ['\"]*", z)==
b990: 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
b9a0: 69 6e 74 66 28 6f 75 74 2c 20 22 43 52 45 41 54  intf(out, "CREAT
b9b0: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
b9c0: 58 49 53 54 53 20 25 73 25 73 22 2c 20 7a 2b 31  XISTS %s%s", z+1
b9d0: 33 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 65 6c  3, zTail);.  }el
b9e0: 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  se{.    utf8_pri
b9f0: 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73 22 2c  ntf(out, "%s%s",
ba00: 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a   z, zTail);.  }.
ba10: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  }.static void pr
ba20: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 46  intSchemaLineN(F
ba30: 49 4c 45 20 2a 6f 75 74 2c 20 63 68 61 72 20 2a  ILE *out, char *
ba40: 7a 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20  z, int n, const 
ba50: 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20  char *zTail){.  
ba60: 63 68 61 72 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20  char c = z[n];. 
ba70: 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 70 72 69   z[n] = 0;.  pri
ba80: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 6f 75 74  ntSchemaLine(out
ba90: 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7a  , z, zTail);.  z
baa0: 5b 6e 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  [n] = c;.}../*.*
bab0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
bac0: 20 73 74 72 69 6e 67 20 7a 5b 5d 20 68 61 73 20   string z[] has 
bad0: 6e 6f 74 68 69 6e 67 20 62 75 74 20 77 68 69 74  nothing but whit
bae0: 65 73 70 61 63 65 20 61 6e 64 20 63 6f 6d 6d 65  espace and comme
baf0: 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  nts to the.** en
bb00: 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6c  d of the first l
bb10: 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
bb20: 6e 74 20 77 73 54 6f 45 6f 6c 28 63 6f 6e 73 74  nt wsToEol(const
bb30: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
bb40: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a   i;.  for(i=0; z
bb50: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
bb60: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20  f( z[i]=='\n' ) 
bb70: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
bb80: 28 20 49 73 53 70 61 63 65 28 7a 5b 69 5d 29 20  ( IsSpace(z[i]) 
bb90: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
bba0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 2d 27 20 26 26  if( z[i]=='-' &&
bbb0: 20 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 20 72   z[i+1]=='-' ) r
bbc0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74  eturn 1;.    ret
bbd0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
bbe0: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
bbf0: 41 64 64 20 61 20 6e 65 77 20 65 6e 74 72 79 20  Add a new entry 
bc00: 74 6f 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51  to the EXPLAIN Q
bc10: 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61 0a 2a  UERY PLAN data.*
bc20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 71  /.static void eq
bc30: 70 5f 61 70 70 65 6e 64 28 53 68 65 6c 6c 53 74  p_append(ShellSt
bc40: 61 74 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70  ate *p, int iEqp
bc50: 49 64 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73  Id, int p2, cons
bc60: 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a  t char *zText){.
bc70: 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70    EQPGraphRow *p
bc80: 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 54 65 78 74  New;.  int nText
bc90: 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54 65 78   = strlen30(zTex
bca0: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 75 74  t);.  if( p->aut
bcb0: 6f 45 51 50 74 65 73 74 20 29 7b 0a 20 20 20 20  oEQPtest ){.    
bcc0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
bcd0: 75 74 2c 20 22 25 64 2c 25 64 2c 25 73 5c 6e 22  ut, "%d,%d,%s\n"
bce0: 2c 20 69 45 71 70 49 64 2c 20 70 32 2c 20 7a 54  , iEqpId, p2, zT
bcf0: 65 78 74 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  ext);.  }.  pNew
bd00: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
bd10: 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  c64( sizeof(*pNe
bd20: 77 29 20 2b 20 6e 54 65 78 74 20 29 3b 0a 20 20  w) + nText );.  
bd30: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 73 68  if( pNew==0 ) sh
bd40: 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  ell_out_of_memor
bd50: 79 28 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 71  y();.  pNew->iEq
bd60: 70 49 64 20 3d 20 69 45 71 70 49 64 3b 0a 20 20  pId = iEqpId;.  
bd70: 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 49 64 20  pNew->iParentId 
bd80: 3d 20 70 32 3b 0a 20 20 6d 65 6d 63 70 79 28 70  = p2;.  memcpy(p
bd90: 4e 65 77 2d 3e 7a 54 65 78 74 2c 20 7a 54 65 78  New->zText, zTex
bda0: 74 2c 20 6e 54 65 78 74 2b 31 29 3b 0a 20 20 70  t, nText+1);.  p
bdb0: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  New->pNext = 0;.
bdc0: 20 20 69 66 28 20 70 2d 3e 73 47 72 61 70 68 2e    if( p->sGraph.
bdd0: 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pLast ){.    p->
bde0: 73 47 72 61 70 68 2e 70 4c 61 73 74 2d 3e 70 4e  sGraph.pLast->pN
bdf0: 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 65  ext = pNew;.  }e
be00: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 73 47 72 61  lse{.    p->sGra
be10: 70 68 2e 70 52 6f 77 20 3d 20 70 4e 65 77 3b 0a  ph.pRow = pNew;.
be20: 20 20 7d 0a 20 20 70 2d 3e 73 47 72 61 70 68 2e    }.  p->sGraph.
be30: 70 4c 61 73 74 20 3d 20 70 4e 65 77 3b 0a 7d 0a  pLast = pNew;.}.
be40: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 64 20  ./*.** Free and 
be50: 72 65 73 65 74 20 74 68 65 20 45 58 50 4c 41 49  reset the EXPLAI
be60: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 64 61 74  N QUERY PLAN dat
be70: 61 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  a that has been 
be80: 63 6f 6c 6c 65 63 74 65 64 0a 2a 2a 20 69 6e 20  collected.** in 
be90: 70 2d 3e 73 47 72 61 70 68 2e 0a 2a 2f 0a 73 74  p->sGraph..*/.st
bea0: 61 74 69 63 20 76 6f 69 64 20 65 71 70 5f 72 65  atic void eqp_re
beb0: 73 65 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  set(ShellState *
bec0: 70 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f  p){.  EQPGraphRo
bed0: 77 20 2a 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b  w *pRow, *pNext;
bee0: 0a 20 20 66 6f 72 28 70 52 6f 77 20 3d 20 70 2d  .  for(pRow = p-
bef0: 3e 73 47 72 61 70 68 2e 70 52 6f 77 3b 20 70 52  >sGraph.pRow; pR
bf00: 6f 77 3b 20 70 52 6f 77 20 3d 20 70 4e 65 78 74  ow; pRow = pNext
bf10: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
bf20: 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Row->pNext;.    
bf30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 6f  sqlite3_free(pRo
bf40: 77 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  w);.  }.  memset
bf50: 28 26 70 2d 3e 73 47 72 61 70 68 2c 20 30 2c 20  (&p->sGraph, 0, 
bf60: 73 69 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70 68  sizeof(p->sGraph
bf70: 29 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  ));.}../* Return
bf80: 20 74 68 65 20 6e 65 78 74 20 45 58 50 4c 41 49   the next EXPLAI
bf90: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 6c 69 6e  N QUERY PLAN lin
bfa0: 65 20 77 69 74 68 20 69 45 71 70 49 64 20 74 68  e with iEqpId th
bfb0: 61 74 20 6f 63 63 75 72 73 20 61 66 74 65 72 0a  at occurs after.
bfc0: 2a 2a 20 70 4f 6c 64 2c 20 6f 72 20 72 65 74 75  ** pOld, or retu
bfd0: 72 6e 20 74 68 65 20 66 69 72 73 74 20 73 75 63  rn the first suc
bfe0: 68 20 6c 69 6e 65 20 69 66 20 70 4f 6c 64 20 69  h line if pOld i
bff0: 73 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63  s NULL.*/.static
c000: 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 65 71   EQPGraphRow *eq
c010: 70 5f 6e 65 78 74 5f 72 6f 77 28 53 68 65 6c 6c  p_next_row(Shell
c020: 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 69 45  State *p, int iE
c030: 71 70 49 64 2c 20 45 51 50 47 72 61 70 68 52 6f  qpId, EQPGraphRo
c040: 77 20 2a 70 4f 6c 64 29 7b 0a 20 20 45 51 50 47  w *pOld){.  EQPG
c050: 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d 20  raphRow *pRow = 
c060: 70 4f 6c 64 20 3f 20 70 4f 6c 64 2d 3e 70 4e 65  pOld ? pOld->pNe
c070: 78 74 20 3a 20 70 2d 3e 73 47 72 61 70 68 2e 70  xt : p->sGraph.p
c080: 52 6f 77 3b 0a 20 20 77 68 69 6c 65 28 20 70 52  Row;.  while( pR
c090: 6f 77 20 26 26 20 70 52 6f 77 2d 3e 69 50 61 72  ow && pRow->iPar
c0a0: 65 6e 74 49 64 21 3d 69 45 71 70 49 64 20 29 20  entId!=iEqpId ) 
c0b0: 70 52 6f 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65  pRow = pRow->pNe
c0c0: 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 6f  xt;.  return pRo
c0d0: 77 3b 0a 7d 0a 0a 2f 2a 20 52 65 6e 64 65 72 20  w;.}../* Render 
c0e0: 61 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f  a single level o
c0f0: 66 20 74 68 65 20 67 72 61 70 68 20 74 68 61 74  f the graph that
c100: 20 68 61 73 20 69 45 71 70 49 64 20 61 73 20 69   has iEqpId as i
c110: 74 73 20 70 61 72 65 6e 74 2e 20 20 43 61 6c 6c  ts parent.  Call
c120: 65 64 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 6c  ed.** recursivel
c130: 79 20 74 6f 20 72 65 6e 64 65 72 20 73 75 62 6c  y to render subl
c140: 65 76 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  evels..*/.static
c150: 20 76 6f 69 64 20 65 71 70 5f 72 65 6e 64 65 72   void eqp_render
c160: 5f 6c 65 76 65 6c 28 53 68 65 6c 6c 53 74 61 74  _level(ShellStat
c170: 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70 49 64  e *p, int iEqpId
c180: 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77  ){.  EQPGraphRow
c190: 20 2a 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a   *pRow, *pNext;.
c1a0: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
c1b0: 33 30 28 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72  30(p->sGraph.zPr
c1c0: 65 66 69 78 29 3b 0a 20 20 63 68 61 72 20 2a 7a  efix);.  char *z
c1d0: 3b 0a 20 20 66 6f 72 28 70 52 6f 77 20 3d 20 65  ;.  for(pRow = e
c1e0: 71 70 5f 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69  qp_next_row(p, i
c1f0: 45 71 70 49 64 2c 20 30 29 3b 20 70 52 6f 77 3b  EqpId, 0); pRow;
c200: 20 70 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b 0a   pRow = pNext){.
c210: 20 20 20 20 70 4e 65 78 74 20 3d 20 65 71 70 5f      pNext = eqp_
c220: 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69 45 71 70  next_row(p, iEqp
c230: 49 64 2c 20 70 52 6f 77 29 3b 0a 20 20 20 20 7a  Id, pRow);.    z
c240: 20 3d 20 70 52 6f 77 2d 3e 7a 54 65 78 74 3b 0a   = pRow->zText;.
c250: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
c260: 70 2d 3e 6f 75 74 2c 20 22 25 73 25 73 25 73 5c  p->out, "%s%s%s\
c270: 6e 22 2c 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50  n", p->sGraph.zP
c280: 72 65 66 69 78 2c 20 70 4e 65 78 74 20 3f 20 22  refix, pNext ? "
c290: 7c 2d 2d 22 20 3a 20 22 60 2d 2d 22 2c 20 7a 29  |--" : "`--", z)
c2a0: 3b 0a 20 20 20 20 69 66 28 20 6e 3c 28 69 6e 74  ;.    if( n<(int
c2b0: 29 73 69 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70  )sizeof(p->sGrap
c2c0: 68 2e 7a 50 72 65 66 69 78 29 2d 37 20 29 7b 0a  h.zPrefix)-7 ){.
c2d0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2d        memcpy(&p-
c2e0: 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b  >sGraph.zPrefix[
c2f0: 6e 5d 2c 20 70 4e 65 78 74 20 3f 20 22 7c 20 20  n], pNext ? "|  
c300: 22 20 3a 20 22 20 20 20 22 2c 20 34 29 3b 0a 20  " : "   ", 4);. 
c310: 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72 5f       eqp_render_
c320: 6c 65 76 65 6c 28 70 2c 20 70 52 6f 77 2d 3e 69  level(p, pRow->i
c330: 45 71 70 49 64 29 3b 0a 20 20 20 20 20 20 70 2d  EqpId);.      p-
c340: 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b  >sGraph.zPrefix[
c350: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  n] = 0;.    }.  
c360: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c  }.}../*.** Displ
c370: 61 79 20 61 6e 64 20 72 65 73 65 74 20 74 68 65  ay and reset the
c380: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
c390: 4c 41 4e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74  LAN data.*/.stat
c3a0: 69 63 20 76 6f 69 64 20 65 71 70 5f 72 65 6e 64  ic void eqp_rend
c3b0: 65 72 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  er(ShellState *p
c3c0: 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77  ){.  EQPGraphRow
c3d0: 20 2a 70 52 6f 77 20 3d 20 70 2d 3e 73 47 72 61   *pRow = p->sGra
c3e0: 70 68 2e 70 52 6f 77 3b 0a 20 20 69 66 28 20 70  ph.pRow;.  if( p
c3f0: 52 6f 77 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Row ){.    if( p
c400: 52 6f 77 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27  Row->zText[0]=='
c410: 2d 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  -' ){.      if( 
c420: 70 52 6f 77 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  pRow->pNext==0 )
c430: 7b 0a 20 20 20 20 20 20 20 20 65 71 70 5f 72 65  {.        eqp_re
c440: 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20  set(p);.        
c450: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
c460: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
c470: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  f(p->out, "%s\n"
c480: 2c 20 70 52 6f 77 2d 3e 7a 54 65 78 74 2b 33 29  , pRow->zText+3)
c490: 3b 0a 20 20 20 20 20 20 70 2d 3e 73 47 72 61 70  ;.      p->sGrap
c4a0: 68 2e 70 52 6f 77 20 3d 20 70 52 6f 77 2d 3e 70  h.pRow = pRow->p
c4b0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
c4c0: 74 65 33 5f 66 72 65 65 28 70 52 6f 77 29 3b 0a  te3_free(pRow);.
c4d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c4e0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
c4f0: 6f 75 74 2c 20 22 51 55 45 52 59 20 50 4c 41 4e  out, "QUERY PLAN
c500: 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  \n");.    }.    
c510: 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69  p->sGraph.zPrefi
c520: 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 65 71  x[0] = 0;.    eq
c530: 70 5f 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 70  p_render_level(p
c540: 2c 20 30 29 3b 0a 20 20 20 20 65 71 70 5f 72 65  , 0);.    eqp_re
c550: 73 65 74 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  set(p);.  }.}../
c560: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
c570: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
c580: 65 20 74 68 61 74 20 74 68 65 20 73 68 65 6c 6c  e that the shell
c590: 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20  .** invokes for 
c5a0: 65 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71 75  each row of a qu
c5b0: 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73  ery result..*/.s
c5c0: 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f  tatic int shell_
c5d0: 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64  callback(.  void
c5e0: 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 6e 41   *pArg,.  int nA
c5f0: 72 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  rg,        /* Nu
c600: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
c610: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63 68 61 72  olumns */.  char
c620: 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 2f 2a 20   **azArg,    /* 
c630: 54 65 78 74 20 6f 66 20 65 61 63 68 20 72 65 73  Text of each res
c640: 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ult column */.  
c650: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c 20 20 20  char **azCol,   
c660: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73   /* Column names
c670: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 54 79 70   */.  int *aiTyp
c680: 65 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  e      /* Column
c690: 20 74 79 70 65 73 20 2a 2f 0a 29 7b 0a 20 20 69   types */.){.  i
c6a0: 6e 74 20 69 3b 0a 20 20 53 68 65 6c 6c 53 74 61  nt i;.  ShellSta
c6b0: 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74  te *p = (ShellSt
c6c0: 61 74 65 2a 29 70 41 72 67 3b 0a 0a 20 20 69 66  ate*)pArg;..  if
c6d0: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74  ( azArg==0 ) ret
c6e0: 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28  urn 0;.  switch(
c6f0: 20 70 2d 3e 63 4d 6f 64 65 20 29 7b 0a 20 20 20   p->cMode ){.   
c700: 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69 6e 65 3a   case MODE_Line:
c710: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 20 3d   {.      int w =
c720: 20 35 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a   5;.      if( az
c730: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
c740: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
c750: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
c760: 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73       int len = s
c770: 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d  trlen30(azCol[i]
c780: 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22   ? azCol[i] : ""
c790: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
c7a0: 65 6e 3e 77 20 29 20 77 20 3d 20 6c 65 6e 3b 0a  en>w ) w = len;.
c7b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
c7c0: 28 20 70 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20 75  ( p->cnt++>0 ) u
c7d0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
c7e0: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53  t, "%s", p->rowS
c7f0: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
c800: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
c810: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
c820: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
c830: 75 74 2c 22 25 2a 73 20 3d 20 25 73 25 73 22 2c  ut,"%*s = %s%s",
c840: 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20   w, azCol[i],.  
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
c860: 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69  Arg[i] ? azArg[i
c870: 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  ] : p->nullValue
c880: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
c890: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
c8a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c8b0: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 45 78 70     case MODE_Exp
c8c0: 6c 61 69 6e 3a 0a 20 20 20 20 63 61 73 65 20 4d  lain:.    case M
c8d0: 4f 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20  ODE_Column: {.  
c8e0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
c8f0: 20 69 6e 74 20 61 45 78 70 6c 61 69 6e 57 69 64   int aExplainWid
c900: 74 68 73 5b 5d 20 3d 20 7b 34 2c 20 31 33 2c 20  ths[] = {4, 13, 
c910: 34 2c 20 34 2c 20 34 2c 20 31 33 2c 20 32 2c 20  4, 4, 4, 13, 2, 
c920: 31 33 7d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  13};.      const
c930: 20 69 6e 74 20 2a 63 6f 6c 57 69 64 74 68 3b 0a   int *colWidth;.
c940: 20 20 20 20 20 20 69 6e 74 20 73 68 6f 77 48 64        int showHd
c950: 72 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 72  r;.      char *r
c960: 6f 77 53 65 70 3b 0a 20 20 20 20 20 20 69 66 28  owSep;.      if(
c970: 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f   p->cMode==MODE_
c980: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
c990: 20 20 63 6f 6c 57 69 64 74 68 20 3d 20 70 2d 3e    colWidth = p->
c9a0: 63 6f 6c 57 69 64 74 68 3b 0a 20 20 20 20 20 20  colWidth;.      
c9b0: 20 20 73 68 6f 77 48 64 72 20 3d 20 70 2d 3e 73    showHdr = p->s
c9c0: 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 20  howHeader;.     
c9d0: 20 20 20 72 6f 77 53 65 70 20 3d 20 70 2d 3e 72     rowSep = p->r
c9e0: 6f 77 53 65 70 61 72 61 74 6f 72 3b 0a 20 20 20  owSeparator;.   
c9f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ca00: 20 20 63 6f 6c 57 69 64 74 68 20 3d 20 61 45 78    colWidth = aEx
ca10: 70 6c 61 69 6e 57 69 64 74 68 73 3b 0a 20 20 20  plainWidths;.   
ca20: 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d 20 31       showHdr = 1
ca30: 3b 0a 20 20 20 20 20 20 20 20 72 6f 77 53 65 70  ;.        rowSep
ca40: 20 3d 20 53 45 50 5f 52 6f 77 3b 0a 20 20 20 20   = SEP_Row;.    
ca50: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
ca60: 3e 63 6e 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20  >cnt++==0 ){.   
ca70: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
ca80: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
ca90: 20 20 20 20 20 20 69 6e 74 20 77 2c 20 6e 3b 0a        int w, n;.
caa0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
cab0: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c  ArraySize(p->col
cac0: 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20  Width) ){.      
cad0: 20 20 20 20 20 20 77 20 3d 20 63 6f 6c 57 69 64        w = colWid
cae0: 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  th[i];.         
caf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
cb00: 20 20 20 20 77 20 3d 20 30 3b 0a 20 20 20 20 20      w = 0;.     
cb10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
cb20: 20 69 66 28 20 77 3d 3d 30 20 29 7b 0a 20 20 20   if( w==0 ){.   
cb30: 20 20 20 20 20 20 20 20 20 77 20 3d 20 73 74 72           w = str
cb40: 6c 65 6e 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d  lenChar(azCol[i]
cb50: 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22   ? azCol[i] : ""
cb60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
cb70: 66 28 20 77 3c 31 30 20 29 20 77 20 3d 20 31 30  f( w<10 ) w = 10
cb80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20  ;.            n 
cb90: 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 41  = strlenChar(azA
cba0: 72 67 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 3f  rg && azArg[i] ?
cbb0: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
cbc0: 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullValue);.     
cbd0: 20 20 20 20 20 20 20 69 66 28 20 77 3c 6e 20 29         if( w<n )
cbe0: 20 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20   w = n;.        
cbf0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
cc00: 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d  ( i<ArraySize(p-
cc10: 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b  >actualWidth) ){
cc20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
cc30: 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 20 3d  actualWidth[i] =
cc40: 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   w;.          }.
cc50: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 68            if( sh
cc60: 6f 77 48 64 72 20 29 7b 0a 20 20 20 20 20 20 20  owHdr ){.       
cc70: 20 20 20 20 20 75 74 66 38 5f 77 69 64 74 68 5f       utf8_width_
cc80: 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20 77 2c  print(p->out, w,
cc90: 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20   azCol[i]);.    
cca0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
ccb0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
ccc0: 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f  , i==nArg-1 ? ro
ccd0: 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20  wSep : "  ");.  
cce0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ccf0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
cd00: 73 68 6f 77 48 64 72 20 29 7b 0a 20 20 20 20 20  showHdr ){.     
cd10: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
cd20: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
cd30: 20 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20          int w;. 
cd40: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
cd50: 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63  <ArraySize(p->ac
cd60: 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20  tualWidth) ){.  
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d               w =
cd80: 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b   p->actualWidth[
cd90: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
cda0: 20 20 20 69 66 28 20 77 3c 30 20 29 20 77 20 3d     if( w<0 ) w =
cdb0: 20 2d 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -w;.           
cdc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
cdd0: 20 20 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20         w = 10;. 
cde0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
cdf0: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
ce00: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a  intf(p->out,"%-*
ce10: 2e 2a 73 25 73 22 2c 77 2c 77 2c 0a 20 20 20 20  .*s%s",w,w,.    
ce20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
ce30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20 20 20 20  ----------".    
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
ce80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ceb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20 20  ----------",.   
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77   i==nArg-1 ? row
cee0: 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20  Sep : "  ");.   
cef0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cf00: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
cf10: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
cf20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72  break;.      for
cf30: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
cf40: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
cf50: 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  w;.        if( i
cf60: 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63  <ArraySize(p->ac
cf70: 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20  tualWidth) ){.  
cf80: 20 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d 3e           w = p->
cf90: 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a  actualWidth[i];.
cfa0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
cfb0: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 31 30            w = 10
cfc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cfd0: 20 20 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65      if( p->cMode
cfe0: 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 26  ==MODE_Explain &
cff0: 26 20 61 7a 41 72 67 5b 69 5d 20 26 26 20 73 74  & azArg[i] && st
d000: 72 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 5b 69  rlenChar(azArg[i
d010: 5d 29 3e 77 20 29 7b 0a 20 20 20 20 20 20 20 20  ])>w ){.        
d020: 20 20 77 20 3d 20 73 74 72 6c 65 6e 43 68 61 72    w = strlenChar
d030: 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20  (azArg[i]);.    
d040: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
d050: 28 20 69 3d 3d 31 20 26 26 20 70 2d 3e 61 69 49  ( i==1 && p->aiI
d060: 6e 64 65 6e 74 20 26 26 20 70 2d 3e 70 53 74 6d  ndent && p->pStm
d070: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t ){.          i
d080: 66 28 20 70 2d 3e 69 49 6e 64 65 6e 74 3c 70 2d  f( p->iIndent<p-
d090: 3e 6e 49 6e 64 65 6e 74 20 29 7b 0a 20 20 20 20  >nIndent ){.    
d0a0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
d0b0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2a 2e  ntf(p->out, "%*.
d0c0: 73 22 2c 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b  s", p->aiIndent[
d0d0: 70 2d 3e 69 49 6e 64 65 6e 74 5d 2c 20 22 22 29  p->iIndent], "")
d0e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d0f0: 20 20 20 20 20 20 20 20 70 2d 3e 69 49 6e 64 65          p->iInde
d100: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nt++;.        }.
d110: 20 20 20 20 20 20 20 20 75 74 66 38 5f 77 69 64          utf8_wid
d120: 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c  th_print(p->out,
d130: 20 77 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61   w, azArg[i] ? a
d140: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
d150: 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20  lValue);.       
d160: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
d170: 6f 75 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e 41  out, "%s", i==nA
d180: 72 67 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a 20  rg-1 ? rowSep : 
d190: 22 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "  ");.      }. 
d1a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d1b0: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
d1c0: 53 65 6d 69 3a 20 7b 20 20 20 2f 2a 20 2e 73 63  Semi: {   /* .sc
d1d0: 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63  hema and .fullsc
d1e0: 68 65 6d 61 20 6f 75 74 70 75 74 20 2a 2f 0a 20  hema output */. 
d1f0: 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61       printSchema
d200: 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 61 7a 41  Line(p->out, azA
d210: 72 67 5b 30 5d 2c 20 22 3b 5c 6e 22 29 3b 0a 20  rg[0], ";\n");. 
d220: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d230: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
d240: 50 72 65 74 74 79 3a 20 7b 20 20 2f 2a 20 2e 73  Pretty: {  /* .s
d250: 63 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73  chema and .fulls
d260: 63 68 65 6d 61 20 77 69 74 68 20 2d 2d 69 6e 64  chema with --ind
d270: 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  ent */.      cha
d280: 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20  r *z;.      int 
d290: 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61  j;.      int nPa
d2a0: 72 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ren = 0;.      c
d2b0: 68 61 72 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20  har cEnd = 0;.  
d2c0: 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20      char c;.    
d2d0: 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 30 3b    int nLine = 0;
d2e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
d2f0: 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Arg==1 );.      
d300: 69 66 28 20 61 7a 41 72 67 5b 30 5d 3d 3d 30 20  if( azArg[0]==0 
d310: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
d320: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  f( sqlite3_strli
d330: 6b 65 28 22 43 52 45 41 54 45 20 56 49 45 57 25  ke("CREATE VIEW%
d340: 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d  ", azArg[0], 0)=
d350: 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  =0.       || sql
d360: 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 43 52  ite3_strlike("CR
d370: 45 41 54 45 20 54 52 49 47 25 22 2c 20 61 7a 41  EATE TRIG%", azA
d380: 72 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a 20 20 20  rg[0], 0)==0.   
d390: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74     ){.        ut
d3a0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
d3b0: 2c 20 22 25 73 3b 5c 6e 22 2c 20 61 7a 41 72 67  , "%s;\n", azArg
d3c0: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72  [0]);.        br
d3d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
d3e0: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
d3f0: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 41  printf("%s", azA
d400: 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 6a 20  rg[0]);.      j 
d410: 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  = 0;.      for(i
d420: 3d 30 3b 20 49 73 53 70 61 63 65 28 7a 5b 69 5d  =0; IsSpace(z[i]
d430: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  ); i++){}.      
d440: 66 6f 72 28 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  for(; (c = z[i])
d450: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  !=0; i++){.     
d460: 20 20 20 69 66 28 20 49 73 53 70 61 63 65 28 63     if( IsSpace(c
d470: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
d480: 66 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 5c 72 27 20  f( z[j-1]=='\r' 
d490: 29 20 7a 5b 6a 2d 31 5d 20 3d 20 27 5c 6e 27 3b  ) z[j-1] = '\n';
d4a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
d4b0: 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 7c  sSpace(z[j-1]) |
d4c0: 7c 20 7a 5b 6a 2d 31 5d 3d 3d 27 28 27 20 29 20  | z[j-1]=='(' ) 
d4d0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
d4e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d    }else if( (c==
d4f0: 27 28 27 20 7c 7c 20 63 3d 3d 27 29 27 29 20 26  '(' || c==')') &
d500: 26 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63 65  & j>0 && IsSpace
d510: 28 7a 5b 6a 2d 31 5d 29 20 29 7b 0a 20 20 20 20  (z[j-1]) ){.    
d520: 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20        j--;.     
d530: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a     }.        z[j
d540: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d  ++] = c;.      }
d550: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e  .      while( j>
d560: 30 20 26 26 20 49 73 53 70 61 63 65 28 7a 5b 6a  0 && IsSpace(z[j
d570: 2d 31 5d 29 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20  -1]) ){ j--; }. 
d580: 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20       z[j] = 0;. 
d590: 20 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e 33       if( strlen3
d5a0: 30 28 7a 29 3e 3d 37 39 20 29 7b 0a 20 20 20 20  0(z)>=79 ){.    
d5b0: 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28      for(i=j=0; (
d5c0: 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b  c = z[i])!=0; i+
d5d0: 2b 29 7b 20 20 2f 2a 20 43 6f 70 79 20 63 68 61  +){  /* Copy cha
d5e0: 6e 67 65 73 20 66 72 6f 6d 20 7a 5b 69 5d 20 62  nges from z[i] b
d5f0: 61 63 6b 20 74 6f 20 7a 5b 6a 5d 20 2a 2f 0a 20  ack to z[j] */. 
d600: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
d610: 63 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  cEnd ){.        
d620: 20 20 20 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20      cEnd = 0;.  
d630: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
d640: 28 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27  ( c=='"' || c=='
d650: 5c 27 27 20 7c 7c 20 63 3d 3d 27 60 27 20 29 7b  \'' || c=='`' ){
d660: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 45 6e  .            cEn
d670: 64 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  d = c;.         
d680: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b   }else if( c=='[
d690: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
d6a0: 20 63 45 6e 64 20 3d 20 27 5d 27 3b 0a 20 20 20   cEnd = ']';.   
d6b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
d6c0: 20 63 3d 3d 27 2d 27 20 26 26 20 7a 5b 69 2b 31   c=='-' && z[i+1
d6d0: 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
d6e0: 20 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5c 6e        cEnd = '\n
d6f0: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  ';.          }el
d700: 73 65 20 69 66 28 20 63 3d 3d 27 28 27 20 29 7b  se if( c=='(' ){
d710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 61  .            nPa
d720: 72 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  ren++;.         
d730: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 29   }else if( c==')
d740: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
d750: 20 6e 50 61 72 65 6e 2d 2d 3b 0a 20 20 20 20 20   nParen--;.     
d760: 20 20 20 20 20 20 20 69 66 28 20 6e 4c 69 6e 65         if( nLine
d770: 3e 30 20 26 26 20 6e 50 61 72 65 6e 3d 3d 30 20  >0 && nParen==0 
d780: 26 26 20 6a 3e 30 20 29 7b 0a 20 20 20 20 20 20  && j>0 ){.      
d790: 20 20 20 20 20 20 20 20 70 72 69 6e 74 53 63 68          printSch
d7a0: 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c  emaLineN(p->out,
d7b0: 20 7a 2c 20 6a 2c 20 22 5c 6e 22 29 3b 0a 20 20   z, j, "\n");.  
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20              j = 
d7d0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
d7e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d7f0: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
d800: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  c;.          if(
d810: 20 6e 50 61 72 65 6e 3d 3d 31 20 26 26 20 63 45   nParen==1 && cE
d820: 6e 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  nd==0.          
d830: 20 26 26 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63   && (c=='(' || c
d840: 3d 3d 27 5c 6e 27 20 7c 7c 20 28 63 3d 3d 27 2c  =='\n' || (c==',
d850: 27 20 26 26 20 21 77 73 54 6f 45 6f 6c 28 7a 2b  ' && !wsToEol(z+
d860: 69 2b 31 29 29 29 0a 20 20 20 20 20 20 20 20 20  i+1))).         
d870: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d880: 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6a 2d  if( c=='\n' ) j-
d890: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  -;.            p
d8a0: 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28  rintSchemaLineN(
d8b0: 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c  p->out, z, j, "\
d8c0: 6e 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  n  ");.         
d8d0: 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20     j = 0;.      
d8e0: 20 20 20 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20        nLine++;. 
d8f0: 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65             while
d900: 28 20 49 73 53 70 61 63 65 28 7a 5b 69 2b 31 5d  ( IsSpace(z[i+1]
d910: 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ i++; }.    
d920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d930: 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 5d 20 3d  }.        z[j] =
d940: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
d950: 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e    printSchemaLin
d960: 65 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 22 3b 5c  e(p->out, z, ";\
d970: 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n");.      sqlit
d980: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20  e3_free(z);.    
d990: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d9a0: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69 73     case MODE_Lis
d9b0: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
d9c0: 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d  ->cnt++==0 && p-
d9d0: 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20  >showHeader ){. 
d9e0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
d9f0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
da00: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
da10: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73  ntf(p->out,"%s%s
da20: 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20  ",azCol[i],.    
da30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 3d                i=
da40: 3d 6e 41 72 67 2d 31 20 3f 20 70 2d 3e 72 6f 77  =nArg-1 ? p->row
da50: 53 65 70 61 72 61 74 6f 72 20 3a 20 70 2d 3e 63  Separator : p->c
da60: 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
da70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
da80: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
da90: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
daa0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
dab0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
dac0: 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67   char *z = azArg
dad0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
dae0: 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 2d 3e 6e   z==0 ) z = p->n
daf0: 75 6c 6c 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  ullValue;.      
db00: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
db10: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  >out, "%s", z);.
db20: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 41          if( i<nA
db30: 72 67 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rg-1 ){.        
db40: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
db50: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63  >out, "%s", p->c
db60: 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
db70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
db80: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
db90: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
dba0: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
dbb0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
dbc0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
dbd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
dbe0: 20 4d 4f 44 45 5f 48 74 6d 6c 3a 20 7b 0a 20 20   MODE_Html: {.  
dbf0: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
dc00: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
dc10: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
dc20: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
dc30: 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20  t,"<TR>");.     
dc40: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
dc50: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
dc60: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
dc70: 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22 29 3b 0a 20  ->out,"<TH>");. 
dc80: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
dc90: 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  html_string(p->o
dca0: 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20  ut, azCol[i]);. 
dcb0: 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
dcc0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 48  ntf(p->out,"</TH
dcd0: 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  >\n");.        }
dce0: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
dcf0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52  ntf(p->out,"</TR
dd00: 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  >\n");.      }. 
dd10: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
dd20: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
dd30: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
dd40: 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20  ut,"<TR>");.    
dd50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
dd60: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
dd70: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
dd80: 75 74 2c 22 3c 54 44 3e 22 29 3b 0a 20 20 20 20  ut,"<TD>");.    
dd90: 20 20 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f      output_html_
dda0: 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61  string(p->out, a
ddb0: 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b  zArg[i] ? azArg[
ddc0: 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75  i] : p->nullValu
ddd0: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  e);.        raw_
dde0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
ddf0: 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  /TD>\n");.      
de00: 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  }.      raw_prin
de10: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e  tf(p->out,"</TR>
de20: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
de30: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
de40: 65 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20 20  e MODE_Tcl: {.  
de50: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
de60: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
de70: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
de80: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
de90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
dea0: 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
deb0: 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69 5d  (p->out,azCol[i]
dec0: 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22   ? azCol[i] : ""
ded0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
dee0: 69 3c 6e 41 72 67 2d 31 29 20 75 74 66 38 5f 70  i<nArg-1) utf8_p
def0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
df00: 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  s", p->colSepara
df10: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tor);.        }.
df20: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
df30: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
df40: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
df50: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
df60: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
df70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f   break;.      fo
df80: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
df90: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6f 75 74  ++){.        out
dfa0: 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e  put_c_string(p->
dfb0: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20  out, azArg[i] ? 
dfc0: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
dfd0: 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
dfe0: 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75    if(i<nArg-1) u
dff0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e000: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
e010: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
e020: 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72   }.      utf8_pr
e030: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
e040: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
e050: 6f 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  or);.      break
e060: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e070: 20 4d 4f 44 45 5f 43 73 76 3a 20 7b 0a 20 20 20   MODE_Csv: {.   
e080: 20 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65     setBinaryMode
e090: 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20  (p->out, 1);.   
e0a0: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d     if( p->cnt++=
e0b0: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
e0c0: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66  der ){.        f
e0d0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
e0e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
e0f0: 6f 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61 7a  output_csv(p, az
e100: 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69  Col[i] ? azCol[i
e110: 5d 20 3a 20 22 22 2c 20 69 3c 6e 41 72 67 2d 31  ] : "", i<nArg-1
e120: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e130: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
e140: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
e150: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
e160: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
e170: 66 28 20 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20  f( nArg>0 ){.   
e180: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
e190: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
e1a0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76        output_csv
e1b0: 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 69 3c  (p, azArg[i], i<
e1c0: 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20  nArg-1);.       
e1d0: 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f   }.        utf8_
e1e0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e1f0: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
e200: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
e210: 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64 65       setTextMode
e220: 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20  (p->out, 1);.   
e230: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e240: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 49 6e      case MODE_In
e250: 73 65 72 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  sert: {.      if
e260: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
e270: 61 6b 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  ak;.      utf8_p
e280: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 49 4e  rintf(p->out,"IN
e290: 53 45 52 54 20 49 4e 54 4f 20 25 73 22 2c 70 2d  SERT INTO %s",p-
e2a0: 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20 20  >zDestTable);.  
e2b0: 20 20 20 20 69 66 28 20 70 2d 3e 73 68 6f 77 48      if( p->showH
e2c0: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
e2d0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e2e0: 75 74 2c 22 28 22 29 3b 0a 20 20 20 20 20 20 20  ut,"(");.       
e2f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
e300: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
e310: 20 20 69 66 28 20 69 3e 30 20 29 20 72 61 77 5f    if( i>0 ) raw_
e320: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e330: 2c 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ,");.          i
e340: 66 28 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43  f( quoteChar(azC
e350: 6f 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  ol[i]) ){.      
e360: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
e370: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
e380: 22 5c 22 25 77 5c 22 22 2c 20 61 7a 43 6f 6c 5b  "\"%w\"", azCol[
e390: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
e3a0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
e3b0: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
e3c0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
e3d0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20  e3_free(z);.    
e3e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e3f0: 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
e400: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
e410: 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  , azCol[i]);.   
e420: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e430: 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70   }.        raw_p
e440: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29 22  rintf(p->out,")"
e450: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e460: 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20   p->cnt++;.     
e470: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
e480: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
e490: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
e4a0: 74 2c 20 69 3e 30 20 3f 20 22 2c 22 20 3a 20 22  t, i>0 ? "," : "
e4b0: 20 56 41 4c 55 45 53 28 22 29 3b 0a 20 20 20 20   VALUES(");.    
e4c0: 20 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b 69      if( (azArg[i
e4d0: 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70 65  ]==0) || (aiType
e4e0: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
e4f0: 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20  QLITE_NULL) ){. 
e500: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
e510: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c  intf(p->out,"NUL
e520: 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  L");.        }el
e530: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
e540: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
e550: 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  TE_TEXT ){.     
e560: 20 20 20 20 20 69 66 28 20 53 68 65 6c 6c 48 61       if( ShellHa
e570: 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e  sFlag(p, SHFLG_N
e580: 65 77 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20 20  ewlines) ){.    
e590: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71          output_q
e5a0: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  uoted_string(p->
e5b0: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
e5c0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
e5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74  .            out
e5e0: 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70  put_quoted_escap
e5f0: 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ed_string(p->out
e600: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
e610: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e620: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
e630: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
e640: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29  SQLITE_INTEGER )
e650: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
e660: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e670: 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  %s", azArg[i]);.
e680: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
e690: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
e6a0: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c  pe[i]==SQLITE_FL
e6b0: 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OAT ){.         
e6c0: 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20 20   char z[50];.   
e6d0: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20         double r 
e6e0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
e6f0: 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d 74  _double(p->pStmt
e700: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
e710: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 75  sqlite3_uint64 u
e720: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  r;.          mem
e730: 63 70 79 28 26 75 72 2c 26 72 2c 73 69 7a 65 6f  cpy(&ur,&r,sizeo
e740: 66 28 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20  f(r));.         
e750: 20 69 66 28 20 75 72 3d 3d 30 78 37 66 66 30 30   if( ur==0x7ff00
e760: 30 30 30 30 30 30 30 30 30 30 30 4c 4c 20 29 7b  00000000000LL ){
e770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77  .            raw
e780: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e790: 22 31 65 39 39 39 22 29 3b 0a 20 20 20 20 20 20  "1e999");.      
e7a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75 72      }else if( ur
e7b0: 3d 3d 30 78 66 66 66 30 30 30 30 30 30 30 30 30  ==0xfff000000000
e7c0: 30 30 30 30 4c 4c 20 29 7b 0a 20 20 20 20 20 20  0000LL ){.      
e7d0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e7e0: 28 70 2d 3e 6f 75 74 2c 20 22 2d 31 65 39 39 39  (p->out, "-1e999
e7f0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ");.          }e
e800: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
e810: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
e820: 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c  f(50,z,"%!.20g",
e830: 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   r);.           
e840: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e850: 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20  ut, "%s", z);.  
e860: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e870: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
e880: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
e890: 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20  =SQLITE_BLOB && 
e8a0: 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  p->pStmt ){.    
e8b0: 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64        const void
e8c0: 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65   *pBlob = sqlite
e8d0: 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d  3_column_blob(p-
e8e0: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
e8f0: 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20        int nBlob 
e900: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
e910: 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74 2c  _bytes(p->pStmt,
e920: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f   i);.          o
e930: 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 70  utput_hex_blob(p
e940: 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e 42  ->out, pBlob, nB
e950: 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  lob);.        }e
e960: 6c 73 65 20 69 66 28 20 69 73 4e 75 6d 62 65 72  lse if( isNumber
e970: 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b  (azArg[i], 0) ){
e980: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
e990: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
e9a0: 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  s", azArg[i]);. 
e9b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
e9c0: 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c   ShellHasFlag(p,
e9d0: 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29   SHFLG_Newlines)
e9e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75   ){.          ou
e9f0: 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69  tput_quoted_stri
ea00: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
ea10: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
ea20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  lse{.          o
ea30: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63  utput_quoted_esc
ea40: 61 70 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  aped_string(p->o
ea50: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  ut, azArg[i]);. 
ea60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ea70: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
ea80: 66 28 70 2d 3e 6f 75 74 2c 22 29 3b 5c 6e 22 29  f(p->out,");\n")
ea90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
eaa0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
eab0: 44 45 5f 51 75 6f 74 65 3a 20 7b 0a 20 20 20 20  DE_Quote: {.    
eac0: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
ead0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
eae0: 28 20 70 2d 3e 63 6e 74 3d 3d 30 20 26 26 20 70  ( p->cnt==0 && p
eaf0: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
eb00: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
eb10: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
eb20: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
eb30: 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d   ) raw_printf(p-
eb40: 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20  >out, ",");.    
eb50: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f        output_quo
eb60: 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  ted_string(p->ou
eb70: 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  t, azCol[i]);.  
eb80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
eb90: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
eba0: 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  t,"\n");.      }
ebb0: 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b  .      p->cnt++;
ebc0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
ebd0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
ebe0: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20        if( i>0 ) 
ebf0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
ec00: 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20  t, ",");.       
ec10: 20 69 66 28 20 28 61 7a 41 72 67 5b 69 5d 3d 3d   if( (azArg[i]==
ec20: 30 29 20 7c 7c 20 28 61 69 54 79 70 65 20 26 26  0) || (aiType &&
ec30: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
ec40: 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  TE_NULL) ){.    
ec50: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
ec60: 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22 29  f(p->out,"NULL")
ec70: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
ec80: 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69  if( aiType && ai
ec90: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
eca0: 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20  TEXT ){.        
ecb0: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
ecc0: 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61  string(p->out, a
ecd0: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
ece0: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
ecf0: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
ed00: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
ed10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
ed20: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
ed30: 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  "%s", azArg[i]);
ed40: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
ed50: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
ed60: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46  ype[i]==SQLITE_F
ed70: 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
ed80: 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20    char z[50];.  
ed90: 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72          double r
eda0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
edb0: 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d  n_double(p->pStm
edc0: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
edd0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
ede0: 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c  f(50,z,"%!.20g",
edf0: 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   r);.          r
ee00: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
ee10: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  , "%s", z);.    
ee20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
ee30: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
ee40: 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26  ]==SQLITE_BLOB &
ee50: 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  & p->pStmt ){.  
ee60: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f          const vo
ee70: 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69  id *pBlob = sqli
ee80: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
ee90: 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  p->pStmt, i);.  
eea0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f          int nBlo
eeb0: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  b = sqlite3_colu
eec0: 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d  mn_bytes(p->pStm
eed0: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
eee0: 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62   output_hex_blob
eef0: 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20  (p->out, pBlob, 
ef00: 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20  nBlob);.        
ef10: 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d 62  }else if( isNumb
ef20: 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20  er(azArg[i], 0) 
ef30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
ef40: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
ef50: 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  "%s", azArg[i]);
ef60: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
ef70: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
ef80: 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70  _quoted_string(p
ef90: 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29  ->out, azArg[i])
efa0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
efb0: 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72    }.      raw_pr
efc0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22  intf(p->out,"\n"
efd0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
efe0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
eff0: 4f 44 45 5f 41 73 63 69 69 3a 20 7b 0a 20 20 20  ODE_Ascii: {.   
f000: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d     if( p->cnt++=
f010: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
f020: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66  der ){.        f
f030: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
f040: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
f050: 69 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70  if( i>0 ) utf8_p
f060: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
f070: 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  s", p->colSepara
f080: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tor);.          
f090: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
f0a0: 75 74 2c 22 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d  ut,"%s",azCol[i]
f0b0: 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22   ? azCol[i] : ""
f0c0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f0d0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
f0e0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
f0f0: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
f100: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f110: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
f120: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  eak;.      for(i
f130: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
f140: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  {.        if( i>
f150: 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  0 ) utf8_printf(
f160: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
f170: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
f180: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
f190: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c  ntf(p->out,"%s",
f1a0: 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67  azArg[i] ? azArg
f1b0: 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c  [i] : p->nullVal
f1c0: 75 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ue);.      }.   
f1d0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
f1e0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
f1f0: 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  rowSeparator);. 
f200: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f210: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
f220: 45 51 50 3a 20 7b 0a 20 20 20 20 20 20 65 71 70  EQP: {.      eqp
f230: 5f 61 70 70 65 6e 64 28 70 2c 20 61 74 6f 69 28  _append(p, atoi(
f240: 61 7a 41 72 67 5b 30 5d 29 2c 20 61 74 6f 69 28  azArg[0]), atoi(
f250: 61 7a 41 72 67 5b 31 5d 29 2c 20 61 7a 41 72 67  azArg[1]), azArg
f260: 5b 33 5d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  [3]);.      brea
f270: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
f280: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
f290: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
f2a0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74  llback routine t
f2b0: 68 61 74 20 74 68 65 20 53 51 4c 69 74 65 20 6c  hat the SQLite l
f2c0: 69 62 72 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b 65  ibrary.** invoke
f2d0: 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  s for each row o
f2e0: 66 20 61 20 71 75 65 72 79 20 72 65 73 75 6c 74  f a query result
f2f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f300: 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  callback(void *p
f310: 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63  Arg, int nArg, c
f320: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61  har **azArg, cha
f330: 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 2f 2a  r **azCol){.  /*
f340: 20 73 69 6e 63 65 20 77 65 20 64 6f 6e 27 74 20   since we don't 
f350: 68 61 76 65 20 74 79 70 65 20 69 6e 66 6f 2c 20  have type info, 
f360: 63 61 6c 6c 20 74 68 65 20 73 68 65 6c 6c 5f 63  call the shell_c
f370: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 61 20 4e  allback with a N
f380: 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 72  ULL value */.  r
f390: 65 74 75 72 6e 20 73 68 65 6c 6c 5f 63 61 6c 6c  eturn shell_call
f3a0: 62 61 63 6b 28 70 41 72 67 2c 20 6e 41 72 67 2c  back(pArg, nArg,
f3b0: 20 61 7a 41 72 67 2c 20 61 7a 43 6f 6c 2c 20 4e   azArg, azCol, N
f3c0: 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ULL);.}../*.** T
f3d0: 68 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62  his is the callb
f3e0: 61 63 6b 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d  ack routine from
f3f0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20   sqlite3_exec() 
f400: 74 68 61 74 20 61 70 70 65 6e 64 73 20 61 6c 6c  that appends all
f410: 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 6e 74 6f 20  .** output onto 
f420: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 53 68 65  the end of a She
f430: 6c 6c 54 65 78 74 20 6f 62 6a 65 63 74 2e 0a 2a  llText object..*
f440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 70  /.static int cap
f450: 74 75 72 65 4f 75 74 70 75 74 43 61 6c 6c 62 61  tureOutputCallba
f460: 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  ck(void *pArg, i
f470: 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a  nt nArg, char **
f480: 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a  azArg, char **az
f490: 29 7b 0a 20 20 53 68 65 6c 6c 54 65 78 74 20 2a  ){.  ShellText *
f4a0: 70 20 3d 20 28 53 68 65 6c 6c 54 65 78 74 2a 29  p = (ShellText*)
f4b0: 70 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pArg;.  int i;. 
f4c0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
f4d0: 52 28 61 7a 29 3b 0a 20 20 69 66 28 20 61 7a 41  R(az);.  if( azA
f4e0: 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rg==0 ) return 0
f4f0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 20 29 20 61  ;.  if( p->n ) a
f500: 70 70 65 6e 64 54 65 78 74 28 70 2c 20 22 7c 22  ppendText(p, "|"
f510: 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  , 0);.  for(i=0;
f520: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
f530: 20 20 20 69 66 28 20 69 20 29 20 61 70 70 65 6e     if( i ) appen
f540: 64 54 65 78 74 28 70 2c 20 22 2c 22 2c 20 30 29  dText(p, ",", 0)
f550: 3b 0a 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b  ;.    if( azArg[
f560: 69 5d 20 29 20 61 70 70 65 6e 64 54 65 78 74 28  i] ) appendText(
f570: 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 30 29 3b  p, azArg[i], 0);
f580: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
f590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
f5a0: 74 65 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  te an appropriat
f5b0: 65 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65  e SELFTEST table
f5c0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
f5d0: 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
f5e0: 20 76 6f 69 64 20 63 72 65 61 74 65 53 65 6c 66   void createSelf
f5f0: 74 65 73 74 54 61 62 6c 65 28 53 68 65 6c 6c 53  testTable(ShellS
f600: 74 61 74 65 20 2a 70 29 7b 0a 20 20 63 68 61 72  tate *p){.  char
f610: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
f620: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
f630: 3e 64 62 2c 0a 20 20 20 20 22 53 41 56 45 50 4f  >db,.    "SAVEPO
f640: 49 4e 54 20 73 65 6c 66 74 65 73 74 5f 69 6e 69  INT selftest_ini
f650: 74 3b 5c 6e 22 0a 20 20 20 20 22 43 52 45 41 54  t;\n".    "CREAT
f660: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
f670: 58 49 53 54 53 20 73 65 6c 66 74 65 73 74 28 5c  XISTS selftest(\
f680: 6e 22 0a 20 20 20 20 22 20 20 74 6e 6f 20 49 4e  n".    "  tno IN
f690: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
f6a0: 59 2c 5c 6e 22 20 20 20 2f 2a 20 54 65 73 74 20  Y,\n"   /* Test 
f6b0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 22 20  number */.    " 
f6c0: 20 6f 70 20 54 45 58 54 2c 5c 6e 22 20 20 20 20   op TEXT,\n"    
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f6e0: 2a 20 4f 70 65 72 61 74 6f 72 3a 20 20 6d 65 6d  * Operator:  mem
f6f0: 6f 20 72 75 6e 20 2a 2f 0a 20 20 20 20 22 20 20  o run */.    "  
f700: 63 6d 64 20 54 45 58 54 2c 5c 6e 22 20 20 20 20  cmd TEXT,\n"    
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f720: 20 43 6f 6d 6d 61 6e 64 20 74 65 78 74 20 2a 2f   Command text */
f730: 0a 20 20 20 20 22 20 20 61 6e 73 20 54 45 58 54  .    "  ans TEXT
f740: 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  \n"             
f750: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64        /* Desired
f760: 20 61 6e 73 77 65 72 20 2a 2f 0a 20 20 20 20 22   answer */.    "
f770: 29 3b 22 0a 20 20 20 20 22 43 52 45 41 54 45 20  );".    "CREATE 
f780: 54 45 4d 50 20 54 41 42 4c 45 20 5b 5f 73 68 65  TEMP TABLE [_she
f790: 6c 6c 24 73 65 6c 66 5d 28 6f 70 2c 63 6d 64 2c  ll$self](op,cmd,
f7a0: 61 6e 73 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e  ans);\n".    "IN
f7b0: 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c  SERT INTO [_shel
f7c0: 6c 24 73 65 6c 66 5d 28 72 6f 77 69 64 2c 6f 70  l$self](rowid,op
f7d0: 2c 63 6d 64 29 5c 6e 22 0a 20 20 20 20 22 20 20  ,cmd)\n".    "  
f7e0: 56 41 4c 55 45 53 28 63 6f 61 6c 65 73 63 65 28  VALUES(coalesce(
f7f0: 28 53 45 4c 45 43 54 20 28 6d 61 78 28 74 6e 6f  (SELECT (max(tno
f800: 29 2b 31 30 30 29 2f 31 30 20 46 52 4f 4d 20 73  )+100)/10 FROM s
f810: 65 6c 66 74 65 73 74 29 2c 31 30 29 2c 5c 6e 22  elftest),10),\n"
f820: 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20 27  .    "         '
f830: 6d 65 6d 6f 27 2c 27 54 65 73 74 73 20 67 65 6e  memo','Tests gen
f840: 65 72 61 74 65 64 20 62 79 20 2d 2d 69 6e 69 74  erated by --init
f850: 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45  ');\n".    "INSE
f860: 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24  RT INTO [_shell$
f870: 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20  self]\n".    "  
f880: 53 45 4c 45 43 54 20 27 72 75 6e 27 2c 5c 6e 22  SELECT 'run',\n"
f890: 0a 20 20 20 20 22 20 20 20 20 27 53 45 4c 45 43  .    "    'SELEC
f8a0: 54 20 68 65 78 28 73 68 61 33 5f 71 75 65 72 79  T hex(sha3_query
f8b0: 28 27 27 53 45 4c 45 43 54 20 74 79 70 65 2c 6e  (''SELECT type,n
f8c0: 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c  ame,tbl_name,sql
f8d0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8f0: 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65      "FROM sqlite
f900: 5f 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42 59  _master ORDER BY
f910: 20 32 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a   2'',224))',\n".
f920: 20 20 20 20 22 20 20 20 20 68 65 78 28 73 68 61      "    hex(sha
f930: 33 5f 71 75 65 72 79 28 27 53 45 4c 45 43 54 20  3_query('SELECT 
f940: 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61  type,name,tbl_na
f950: 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20  me,sql ".       
f960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f970: 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f     "FROM sqlite_
f980: 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20  master ORDER BY 
f990: 32 27 2c 32 32 34 29 29 3b 5c 6e 22 0a 20 20 20  2',224));\n".   
f9a0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f   "INSERT INTO [_
f9b0: 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20  shell$self]\n". 
f9c0: 20 20 20 22 20 20 53 45 4c 45 43 54 20 27 72 75     "  SELECT 'ru
f9d0: 6e 27 2c 22 0a 20 20 20 20 22 20 20 20 20 27 53  n',".    "    'S
f9e0: 45 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f 71  ELECT hex(sha3_q
f9f0: 75 65 72 79 28 27 27 53 45 4c 45 43 54 20 2a 20  uery(''SELECT * 
fa00: 46 52 4f 4d 20 5c 22 27 20 7c 7c 22 0a 20 20 20  FROM \"' ||".   
fa10: 20 22 20 20 20 20 20 20 20 20 70 72 69 6e 74 66   "        printf
fa20: 28 27 25 77 27 2c 6e 61 6d 65 29 20 7c 7c 20 27  ('%w',name) || '
fa30: 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 27 27  \" NOT INDEXED''
fa40: 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20 20 20 20  ,224))',\n".    
fa50: 22 20 20 20 20 68 65 78 28 73 68 61 33 5f 71 75  "    hex(sha3_qu
fa60: 65 72 79 28 70 72 69 6e 74 66 28 27 53 45 4c 45  ery(printf('SELE
fa70: 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22  CT * FROM \"%w\"
fa80: 20 4e 4f 54 20 49 4e 44 45 58 45 44 27 2c 6e 61   NOT INDEXED',na
fa90: 6d 65 29 2c 32 32 34 29 29 5c 6e 22 0a 20 20 20  me),224))\n".   
faa0: 20 22 20 20 46 52 4f 4d 20 28 5c 6e 22 0a 20 20   "  FROM (\n".  
fab0: 20 20 22 20 20 20 20 53 45 4c 45 43 54 20 6e 61    "    SELECT na
fac0: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
fad0: 61 73 74 65 72 5c 6e 22 0a 20 20 20 20 22 20 20  aster\n".    "  
fae0: 20 20 20 57 48 45 52 45 20 74 79 70 65 3d 27 74     WHERE type='t
faf0: 61 62 6c 65 27 5c 6e 22 0a 20 20 20 20 22 20 20  able'\n".    "  
fb00: 20 20 20 20 20 41 4e 44 20 6e 61 6d 65 3c 3e 27       AND name<>'
fb10: 73 65 6c 66 74 65 73 74 27 5c 6e 22 0a 20 20 20  selftest'\n".   
fb20: 20 22 20 20 20 20 20 20 20 41 4e 44 20 63 6f 61   "       AND coa
fb30: 6c 65 73 63 65 28 72 6f 6f 74 70 61 67 65 2c 30  lesce(rootpage,0
fb40: 29 3e 30 5c 6e 22 0a 20 20 20 20 22 20 20 29 5c  )>0\n".    "  )\
fb50: 6e 22 0a 20 20 20 20 22 20 4f 52 44 45 52 20 42  n".    " ORDER B
fb60: 59 20 6e 61 6d 65 3b 5c 6e 22 0a 20 20 20 20 22  Y name;\n".    "
fb70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68  INSERT INTO [_sh
fb80: 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20  ell$self]\n".   
fb90: 20 22 20 20 56 41 4c 55 45 53 28 27 72 75 6e 27   "  VALUES('run'
fba0: 2c 27 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  ,'PRAGMA integri
fbb0: 74 79 5f 63 68 65 63 6b 27 2c 27 6f 6b 27 29 3b  ty_check','ok');
fbc0: 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20  \n".    "INSERT 
fbd0: 49 4e 54 4f 20 73 65 6c 66 74 65 73 74 28 74 6e  INTO selftest(tn
fbe0: 6f 2c 6f 70 2c 63 6d 64 2c 61 6e 73 29 22 0a 20  o,op,cmd,ans)". 
fbf0: 20 20 20 22 20 20 53 45 4c 45 43 54 20 72 6f 77     "  SELECT row
fc00: 69 64 2a 31 30 2c 6f 70 2c 63 6d 64 2c 61 6e 73  id*10,op,cmd,ans
fc10: 20 46 52 4f 4d 20 5b 5f 73 68 65 6c 6c 24 73 65   FROM [_shell$se
fc20: 6c 66 5d 3b 5c 6e 22 0a 20 20 20 20 22 44 52 4f  lf];\n".    "DRO
fc30: 50 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c 24  P TABLE [_shell$
fc40: 73 65 6c 66 5d 3b 22 0a 20 20 20 20 2c 30 2c 30  self];".    ,0,0
fc50: 2c 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66  ,&zErrMsg);.  if
fc60: 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
fc70: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
fc80: 65 72 72 2c 20 22 53 45 4c 46 54 45 53 54 20 69  err, "SELFTEST i
fc90: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61  nitialization fa
fca0: 69 6c 75 72 65 3a 20 25 73 5c 6e 22 2c 20 7a 45  ilure: %s\n", zE
fcb0: 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
fcc0: 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
fcd0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
fce0: 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45  _exec(p->db, "RE
fcf0: 4c 45 41 53 45 20 73 65 6c 66 74 65 73 74 5f 69  LEASE selftest_i
fd00: 6e 69 74 22 2c 30 2c 30 2c 30 29 3b 0a 7d 0a 0a  nit",0,0,0);.}..
fd10: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64  ./*.** Set the d
fd20: 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65  estination table
fd30: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 53 68   field of the Sh
fd40: 65 6c 6c 53 74 61 74 65 20 73 74 72 75 63 74 75  ellState structu
fd50: 72 65 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d  re to.** the nam
fd60: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 67  e of the table g
fd70: 69 76 65 6e 2e 20 20 45 73 63 61 70 65 20 61 6e  iven.  Escape an
fd80: 79 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  y quote characte
fd90: 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62  rs in the.** tab
fda0: 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  le name..*/.stat
fdb0: 69 63 20 76 6f 69 64 20 73 65 74 5f 74 61 62 6c  ic void set_tabl
fdc0: 65 5f 6e 61 6d 65 28 53 68 65 6c 6c 53 74 61 74  e_name(ShellStat
fdd0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
fde0: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
fdf0: 69 2c 20 6e 3b 0a 20 20 63 68 61 72 20 63 51 75  i, n;.  char cQu
fe00: 6f 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  ote;.  char *z;.
fe10: 0a 20 20 69 66 28 20 70 2d 3e 7a 44 65 73 74 54  .  if( p->zDestT
fe20: 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 72 65 65  able ){.    free
fe30: 28 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b  (p->zDestTable);
fe40: 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62  .    p->zDestTab
fe50: 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  le = 0;.  }.  if
fe60: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
fe70: 75 72 6e 3b 0a 20 20 63 51 75 6f 74 65 20 3d 20  urn;.  cQuote = 
fe80: 71 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29  quoteChar(zName)
fe90: 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  ;.  n = strlen30
fea0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 63  (zName);.  if( c
feb0: 51 75 6f 74 65 20 29 20 6e 20 2b 3d 20 6e 2b 32  Quote ) n += n+2
fec0: 3b 0a 20 20 7a 20 3d 20 70 2d 3e 7a 44 65 73 74  ;.  z = p->zDest
fed0: 54 61 62 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  Table = malloc( 
fee0: 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  n+1 );.  if( z==
fef0: 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66  0 ) shell_out_of
ff00: 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 6e 20 3d  _memory();.  n =
ff10: 20 30 3b 0a 20 20 69 66 28 20 63 51 75 6f 74 65   0;.  if( cQuote
ff20: 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f   ) z[n++] = cQuo
ff30: 74 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a  te;.  for(i=0; z
ff40: 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  Name[i]; i++){. 
ff50: 20 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d     z[n++] = zNam
ff60: 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 4e  e[i];.    if( zN
ff70: 61 6d 65 5b 69 5d 3d 3d 63 51 75 6f 74 65 20 29  ame[i]==cQuote )
ff80: 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65   z[n++] = cQuote
ff90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 51 75 6f  ;.  }.  if( cQuo
ffa0: 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51  te ) z[n++] = cQ
ffb0: 75 6f 74 65 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30  uote;.  z[n] = 0
ffc0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  ;.}.../*.** Exec
ffd0: 75 74 65 20 61 20 71 75 65 72 79 20 73 74 61 74  ute a query stat
ffe0: 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20  ement that will 
fff0: 67 65 6e 65 72 61 74 65 20 53 51 4c 20 6f 75 74  generate SQL out
10000 70 75 74 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 74  put.  Print.** t
10010 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  he result column
10020 73 2c 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61 74  s, comma-separat
10030 65 64 2c 20 6f 6e 20 61 20 6c 69 6e 65 20 61 6e  ed, on a line an
10040 64 20 74 68 65 6e 20 61 64 64 20 61 0a 2a 2a 20  d then add a.** 
10050 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e  semicolon termin
10060 61 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  ator to the end 
10070 6f 66 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a  of that line..**
10080 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
10090 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 73 20  r of columns is 
100a0 31 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d  1 and that colum
100b0 6e 20 63 6f 6e 74 61 69 6e 73 20 74 65 78 74 20  n contains text 
100c0 22 2d 2d 22 0a 2a 2a 20 74 68 65 6e 20 77 72 69  "--".** then wri
100d0 74 65 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f 6e  te the semicolon
100e0 20 6f 6e 20 61 20 73 65 70 61 72 61 74 65 20 6c   on a separate l
100f0 69 6e 65 2e 20 20 54 68 61 74 20 77 61 79 2c 20  ine.  That way, 
10100 69 66 20 61 0a 2a 2a 20 22 2d 2d 22 20 63 6f 6d  if a.** "--" com
10110 6d 65 6e 74 20 6f 63 63 75 72 73 20 61 74 20 74  ment occurs at t
10120 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 74  he end of the st
10130 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 63 6f 6d  atement, the com
10140 6d 65 6e 74 0a 2a 2a 20 77 6f 6e 27 74 20 63 6f  ment.** won't co
10150 6e 73 75 6d 65 20 74 68 65 20 73 65 6d 69 63 6f  nsume the semico
10160 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  lon terminator..
10170 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75  */.static int ru
10180 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65  n_table_dump_que
10190 72 79 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ry(.  ShellState
101a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
101b0 2a 20 51 75 65 72 79 20 63 6f 6e 74 65 78 74 20  * Query context 
101c0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
101d0 2a 7a 53 65 6c 65 63 74 2c 20 20 20 20 20 2f 2a  *zSelect,     /*
101e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
101f0 74 20 74 6f 20 65 78 74 72 61 63 74 20 63 6f 6e  t to extract con
10200 74 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tent */.  const 
10210 63 68 61 72 20 2a 7a 46 69 72 73 74 52 6f 77 20  char *zFirstRow 
10220 20 20 20 2f 2a 20 50 72 69 6e 74 20 62 65 66 6f     /* Print befo
10230 72 65 20 66 69 72 73 74 20 72 6f 77 2c 20 69 66  re first row, if
10240 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a   not NULL */.){.
10250 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
10260 70 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74 20 72  pSelect;.  int r
10270 63 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  c;.  int nResult
10280 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
10290 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 72 63  st char *z;.  rc
102a0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
102b0 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 65  re_v2(p->db, zSe
102c0 6c 65 63 74 2c 20 2d 31 2c 20 26 70 53 65 6c 65  lect, -1, &pSele
102d0 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ct, 0);.  if( rc
102e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
102f0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 75  pSelect ){.    u
10300 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
10310 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a  t, "/**** ERROR:
10320 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c   (%d) %s *****/\
10330 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20 20 20 20  n", rc,.        
10340 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10350 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
10360 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66      if( (rc&0xff
10370 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  )!=SQLITE_CORRUP
10380 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  T ) p->nErr++;. 
10390 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
103a0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
103b0 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b 0a  _step(pSelect);.
103c0 20 20 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c 69    nResult = sqli
103d0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
103e0 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 77 68 69  (pSelect);.  whi
103f0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52  le( rc==SQLITE_R
10400 4f 57 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 46  OW ){.    if( zF
10410 69 72 73 74 52 6f 77 20 29 7b 0a 20 20 20 20 20  irstRow ){.     
10420 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
10430 6f 75 74 2c 20 22 25 73 22 2c 20 7a 46 69 72 73  out, "%s", zFirs
10440 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 7a 46 69  tRow);.      zFi
10450 72 73 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  rstRow = 0;.    
10460 7d 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74  }.    z = (const
10470 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
10480 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65  olumn_text(pSele
10490 63 74 2c 20 30 29 3b 0a 20 20 20 20 75 74 66 38  ct, 0);.    utf8
104a0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
104b0 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 66 6f  "%s", z);.    fo
104c0 72 28 69 3d 31 3b 20 69 3c 6e 52 65 73 75 6c 74  r(i=1; i<nResult
104d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 74  ; i++){.      ut
104e0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
104f0 2c 20 22 2c 25 73 22 2c 20 73 71 6c 69 74 65 33  , ",%s", sqlite3
10500 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65  _column_text(pSe
10510 6c 65 63 74 2c 20 69 29 29 3b 0a 20 20 20 20 7d  lect, i));.    }
10520 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  .    if( z==0 ) 
10530 7a 20 3d 20 22 22 3b 0a 20 20 20 20 77 68 69 6c  z = "";.    whil
10540 65 28 20 7a 5b 30 5d 20 26 26 20 28 7a 5b 30 5d  e( z[0] && (z[0]
10550 21 3d 27 2d 27 20 7c 7c 20 7a 5b 31 5d 21 3d 27  !='-' || z[1]!='
10560 2d 27 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69  -') ) z++;.    i
10570 66 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  f( z[0] ){.     
10580 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
10590 75 74 2c 20 22 5c 6e 3b 5c 6e 22 29 3b 0a 20 20  ut, "\n;\n");.  
105a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
105b0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
105c0 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a  , ";\n");.    }.
105d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
105e0 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b 0a  _step(pSelect);.
105f0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
10600 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 65 6c  e3_finalize(pSel
10610 65 63 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ect);.  if( rc!=
10620 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10630 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
10640 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f  out, "/**** ERRO
10650 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a  R: (%d) %s *****
10660 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20 20  /\n", rc,.      
10670 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10680 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
10690 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78  ;.    if( (rc&0x
106a0 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52  ff)!=SQLITE_CORR
106b0 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b  UPT ) p->nErr++;
106c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
106d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
106e0 61 74 65 20 73 70 61 63 65 20 61 6e 64 20 73 61  ate space and sa
106f0 76 65 20 6f 66 66 20 63 75 72 72 65 6e 74 20 65  ve off current e
10700 72 72 6f 72 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  rror string..*/.
10710 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 61 76  static char *sav
10720 65 5f 65 72 72 5f 6d 73 67 28 0a 20 20 73 71 6c  e_err_msg(.  sql
10730 69 74 65 33 20 2a 64 62 20 20 20 20 20 20 20 20  ite3 *db        
10740 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
10750 74 6f 20 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20  to query */.){. 
10760 20 69 6e 74 20 6e 45 72 72 4d 73 67 20 3d 20 31   int nErrMsg = 1
10770 2b 73 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  +strlen30(sqlite
10780 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
10790 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
107a0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
107b0 34 28 6e 45 72 72 4d 73 67 29 3b 0a 20 20 69 66  4(nErrMsg);.  if
107c0 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
107d0 20 6d 65 6d 63 70 79 28 7a 45 72 72 4d 73 67 2c   memcpy(zErrMsg,
107e0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
107f0 64 62 29 2c 20 6e 45 72 72 4d 73 67 29 3b 0a 20  db), nErrMsg);. 
10800 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72   }.  return zErr
10810 4d 73 67 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 5f  Msg;.}..#ifdef _
10820 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20 41  _linux__./*.** A
10830 74 74 65 6d 70 74 20 74 6f 20 64 69 73 70 6c 61  ttempt to displa
10840 79 20 49 2f 4f 20 73 74 61 74 73 20 6f 6e 20 4c  y I/O stats on L
10850 69 6e 75 78 20 75 73 69 6e 67 20 2f 70 72 6f 63  inux using /proc
10860 2f 50 49 44 2f 69 6f 0a 2a 2f 0a 73 74 61 74 69  /PID/io.*/.stati
10870 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 4c 69  c void displayLi
10880 6e 75 78 49 6f 53 74 61 74 73 28 46 49 4c 45 20  nuxIoStats(FILE 
10890 2a 6f 75 74 29 7b 0a 20 20 46 49 4c 45 20 2a 69  *out){.  FILE *i
108a0 6e 3b 0a 20 20 63 68 61 72 20 7a 5b 32 30 30 5d  n;.  char z[200]
108b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
108c0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
108d0 7a 2c 20 22 2f 70 72 6f 63 2f 25 64 2f 69 6f 22  z, "/proc/%d/io"
108e0 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 69  , getpid());.  i
108f0 6e 20 3d 20 66 6f 70 65 6e 28 7a 2c 20 22 72 62  n = fopen(z, "rb
10900 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  ");.  if( in==0 
10910 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c  ) return;.  whil
10920 65 28 20 66 67 65 74 73 28 7a 2c 20 73 69 7a 65  e( fgets(z, size
10930 6f 66 28 7a 29 2c 20 69 6e 29 21 3d 30 20 29 7b  of(z), in)!=0 ){
10940 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
10950 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  t struct {.     
10960 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
10970 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 63 6f 6e  ttern;.      con
10980 73 74 20 63 68 61 72 20 2a 7a 44 65 73 63 3b 0a  st char *zDesc;.
10990 20 20 20 20 7d 20 61 54 72 61 6e 73 5b 5d 20 3d      } aTrans[] =
109a0 20 7b 0a 20 20 20 20 20 20 7b 20 22 72 63 68 61   {.      { "rcha
109b0 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20  r: ",           
109c0 20 20 20 20 20 20 20 22 42 79 74 65 73 20 72 65         "Bytes re
109d0 63 65 69 76 65 64 20 62 79 20 72 65 61 64 28 29  ceived by read()
109e0 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77  :" },.      { "w
109f0 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20 20 20  char: ",        
10a00 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73            "Bytes
10a10 20 73 65 6e 74 20 74 6f 20 77 72 69 74 65 28 29   sent to write()
10a20 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b  :"    },.      {
10a30 20 22 73 79 73 63 72 3a 20 22 2c 20 20 20 20 20   "syscr: ",     
10a40 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 65               "Re
10a50 61 64 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  ad() system call
10a60 73 3a 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  s:"      },.    
10a70 20 20 7b 20 22 73 79 73 63 77 3a 20 22 2c 20 20    { "syscw: ",  
10a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a90 22 57 72 69 74 65 28 29 20 73 79 73 74 65 6d 20  "Write() system 
10aa0 63 61 6c 6c 73 3a 22 20 20 20 20 20 7d 2c 0a 20  calls:"     },. 
10ab0 20 20 20 20 20 7b 20 22 72 65 61 64 5f 62 79 74       { "read_byt
10ac0 65 73 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20  es: ",          
10ad0 20 20 20 22 42 79 74 65 73 20 72 65 61 64 20 66     "Bytes read f
10ae0 72 6f 6d 20 73 74 6f 72 61 67 65 3a 22 20 20 7d  rom storage:"  }
10af0 2c 0a 20 20 20 20 20 20 7b 20 22 77 72 69 74 65  ,.      { "write
10b00 5f 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20 20  _bytes: ",      
10b10 20 20 20 20 20 20 22 42 79 74 65 73 20 77 72 69        "Bytes wri
10b20 74 74 65 6e 20 74 6f 20 73 74 6f 72 61 67 65 3a  tten to storage:
10b30 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 61  " },.      { "ca
10b40 6e 63 65 6c 6c 65 64 5f 77 72 69 74 65 5f 62 79  ncelled_write_by
10b50 74 65 73 3a 20 22 2c 20 20 22 43 61 6e 63 65 6c  tes: ",  "Cancel
10b60 6c 65 64 20 77 72 69 74 65 20 62 79 74 65 73 3a  led write bytes:
10b70 22 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20  "    },.    };. 
10b80 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
10b90 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
10ba0 7a 65 28 61 54 72 61 6e 73 29 3b 20 69 2b 2b 29  ze(aTrans); i++)
10bb0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
10bc0 73 74 72 6c 65 6e 33 30 28 61 54 72 61 6e 73 5b  strlen30(aTrans[
10bd0 69 5d 2e 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  i].zPattern);.  
10be0 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
10bf0 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65  aTrans[i].zPatte
10c00 72 6e 2c 20 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a  rn, z, n)==0 ){.
10c10 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
10c20 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20  ntf(out, "%-36s 
10c30 25 73 22 2c 20 61 54 72 61 6e 73 5b 69 5d 2e 7a  %s", aTrans[i].z
10c40 44 65 73 63 2c 20 26 7a 5b 6e 5d 29 3b 0a 20 20  Desc, &z[n]);.  
10c50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10c60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
10c70 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 7d 0a 23   fclose(in);.}.#
10c80 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  endif../*.** Dis
10c90 70 6c 61 79 20 61 20 73 69 6e 67 6c 65 20 6c 69  play a single li
10ca0 6e 65 20 6f 66 20 73 74 61 74 75 73 20 75 73 69  ne of status usi
10cb0 6e 67 20 36 34 2d 62 69 74 20 76 61 6c 75 65 73  ng 64-bit values
10cc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10cd0 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
10ce0 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
10cf0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
10d00 20 54 68 65 20 73 68 65 6c 6c 20 63 6f 6e 74 65   The shell conte
10d10 78 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4c  xt */.  char *zL
10d20 61 62 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  abel,           
10d30 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
10d40 68 69 73 20 6f 6e 65 20 6c 69 6e 65 20 2a 2f 0a  his one line */.
10d50 20 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c    char *zFormat,
10d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
10d70 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 72 65  ormat for the re
10d80 73 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53  sult */.  int iS
10d90 74 61 74 75 73 43 74 72 6c 2c 20 20 20 20 20 20  tatusCtrl,      
10da0 20 20 20 20 2f 2a 20 57 68 69 63 68 20 73 74 61      /* Which sta
10db0 74 75 73 20 74 6f 20 64 69 73 70 6c 61 79 20 2a  tus to display *
10dc0 2f 0a 20 20 69 6e 74 20 62 52 65 73 65 74 20 20  /.  int bReset  
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10de0 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 74   True to reset t
10df0 68 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20  he stats */.){. 
10e00 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
10e10 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69  Cur = -1;.  sqli
10e20 74 65 33 5f 69 6e 74 36 34 20 69 48 69 77 74 72  te3_int64 iHiwtr
10e30 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 2c 20   = -1;.  int i, 
10e40 6e 50 65 72 63 65 6e 74 3b 0a 20 20 63 68 61 72  nPercent;.  char
10e50 20 7a 4c 69 6e 65 5b 32 30 30 5d 3b 0a 20 20 73   zLine[200];.  s
10e60 71 6c 69 74 65 33 5f 73 74 61 74 75 73 36 34 28  qlite3_status64(
10e70 69 53 74 61 74 75 73 43 74 72 6c 2c 20 26 69 43  iStatusCtrl, &iC
10e80 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
10e90 73 65 74 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  set);.  for(i=0,
10ea0 20 6e 50 65 72 63 65 6e 74 3d 30 3b 20 7a 46 6f   nPercent=0; zFo
10eb0 72 6d 61 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  rmat[i]; i++){. 
10ec0 20 20 20 69 66 28 20 7a 46 6f 72 6d 61 74 5b 69     if( zFormat[i
10ed0 5d 3d 3d 27 25 27 20 29 20 6e 50 65 72 63 65 6e  ]=='%' ) nPercen
10ee0 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  t++;.  }.  if( n
10ef0 50 65 72 63 65 6e 74 3e 31 20 29 7b 0a 20 20 20  Percent>1 ){.   
10f00 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
10f10 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c  f(sizeof(zLine),
10f20 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c   zLine, zFormat,
10f30 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a   iCur, iHiwtr);.
10f40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
10f50 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
10f60 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69  zeof(zLine), zLi
10f70 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 69 48 69  ne, zFormat, iHi
10f80 77 74 72 29 3b 0a 20 20 7d 0a 20 20 72 61 77 5f  wtr);.  }.  raw_
10f90 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
10fa0 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 4c 61  %-36s %s\n", zLa
10fb0 62 65 6c 2c 20 7a 4c 69 6e 65 29 3b 0a 7d 0a 0a  bel, zLine);.}..
10fc0 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 6d 65  /*.** Display me
10fd0 6d 6f 72 79 20 73 74 61 74 73 2e 0a 2a 2f 0a 73  mory stats..*/.s
10fe0 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61  tatic int displa
10ff0 79 5f 73 74 61 74 73 28 0a 20 20 73 71 6c 69 74  y_stats(.  sqlit
11000 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
11010 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
11020 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20  se to query */. 
11030 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72   ShellState *pAr
11040 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
11050 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c  Pointer to Shell
11060 53 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 62  State */.  int b
11070 52 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20  Reset           
11080 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
11090 6f 20 72 65 73 65 74 20 74 68 65 20 73 74 61 74  o reset the stat
110a0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43  s */.){.  int iC
110b0 75 72 3b 0a 20 20 69 6e 74 20 69 48 69 77 74 72  ur;.  int iHiwtr
110c0 3b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20  ;.  FILE *out;. 
110d0 20 69 66 28 20 70 41 72 67 3d 3d 30 20 7c 7c 20   if( pArg==0 || 
110e0 70 41 72 67 2d 3e 6f 75 74 3d 3d 30 20 29 20 72  pArg->out==0 ) r
110f0 65 74 75 72 6e 20 30 3b 0a 20 20 6f 75 74 20 3d  eturn 0;.  out =
11100 20 70 41 72 67 2d 3e 6f 75 74 3b 0a 0a 20 20 69   pArg->out;..  i
11110 66 28 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 26  f( pArg->pStmt &
11120 26 20 28 70 41 72 67 2d 3e 73 74 61 74 73 4f 6e  & (pArg->statsOn
11130 20 26 20 32 29 20 29 7b 0a 20 20 20 20 69 6e 74   & 2) ){.    int
11140 20 6e 43 6f 6c 2c 20 69 2c 20 78 3b 0a 20 20 20   nCol, i, x;.   
11150 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
11160 53 74 6d 74 20 3d 20 70 41 72 67 2d 3e 70 53 74  Stmt = pArg->pSt
11170 6d 74 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31  mt;.    char z[1
11180 30 30 5d 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  00];.    nCol = 
11190 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
111a0 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
111b0 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
111c0 20 22 25 2d 33 36 73 20 25 64 5c 6e 22 2c 20 22   "%-36s %d\n", "
111d0 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  Number of output
111e0 20 63 6f 6c 75 6d 6e 73 3a 22 2c 20 6e 43 6f 6c   columns:", nCol
111f0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
11200 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
11210 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
11220 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 7a  intf(sizeof(z),z
11230 2c 22 43 6f 6c 75 6d 6e 20 25 64 20 25 6e 6e 61  ,"Column %d %nna
11240 6d 65 3a 22 2c 20 69 2c 20 26 78 29 3b 0a 20 20  me:", i, &x);.  
11250 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
11260 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e  out, "%-36s %s\n
11270 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f  ", z, sqlite3_co
11280 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  lumn_name(pStmt,
11290 69 29 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  i));.#ifndef SQL
112a0 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
112b0 45 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  E.      sqlite3_
112c0 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78  snprintf(30, z+x
112d0 2c 20 22 64 65 63 6c 61 72 65 64 20 74 79 70 65  , "declared type
112e0 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  :");.      utf8_
112f0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
11300 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c  6s %s\n", z, sql
11310 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c  ite3_column_decl
11320 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29 29 3b  type(pStmt, i));
11330 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
11340 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
11350 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
11360 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
11370 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22 64 61  ntf(30, z+x, "da
11380 74 61 62 61 73 65 20 6e 61 6d 65 3a 22 29 3b 0a  tabase name:");.
11390 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
113a0 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73  f(out, "%-36s %s
113b0 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f  \n", z, sqlite3_
113c0 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f  column_database_
113d0 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a  name(pStmt,i));.
113e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
113f0 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20  printf(30, z+x, 
11400 22 74 61 62 6c 65 20 6e 61 6d 65 3a 22 29 3b 0a  "table name:");.
11410 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
11420 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73  f(out, "%-36s %s
11430 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f  \n", z, sqlite3_
11440 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d  column_table_nam
11450 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20  e(pStmt,i));.   
11460 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
11470 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22 6f 72  ntf(30, z+x, "or
11480 69 67 69 6e 20 6e 61 6d 65 3a 22 29 3b 0a 20 20  igin name:");.  
11490 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
114a0 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e  out, "%-36s %s\n
114b0 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f  ", z, sqlite3_co
114c0 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65  lumn_origin_name
114d0 28 70 53 74 6d 74 2c 69 29 29 3b 0a 23 65 6e 64  (pStmt,i));.#end
114e0 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
114f0 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28  displayStatLine(
11500 70 41 72 67 2c 20 22 4d 65 6d 6f 72 79 20 55 73  pArg, "Memory Us
11510 65 64 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64  ed:",.     "%lld
11520 20 28 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65   (max %lld) byte
11530 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55  s", SQLITE_STATU
11540 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 62  S_MEMORY_USED, b
11550 52 65 73 65 74 29 3b 0a 20 20 64 69 73 70 6c 61  Reset);.  displa
11560 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20  yStatLine(pArg, 
11570 22 4e 75 6d 62 65 72 20 6f 66 20 4f 75 74 73 74  "Number of Outst
11580 61 6e 64 69 6e 67 20 41 6c 6c 6f 63 61 74 69 6f  anding Allocatio
11590 6e 73 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64  ns:",.     "%lld
115a0 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c 20 53 51   (max %lld)", SQ
115b0 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c  LITE_STATUS_MALL
115c0 4f 43 5f 43 4f 55 4e 54 2c 20 62 52 65 73 65 74  OC_COUNT, bReset
115d0 29 3b 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 73  );.  if( pArg->s
115e0 68 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47  hellFlgs & SHFLG
115f0 5f 50 61 67 65 63 61 63 68 65 20 29 7b 0a 20 20  _Pagecache ){.  
11600 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e    displayStatLin
11610 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20  e(pArg, "Number 
11620 6f 66 20 50 63 61 63 68 65 20 50 61 67 65 73 20  of Pcache Pages 
11630 55 73 65 64 3a 22 2c 0a 20 20 20 20 20 20 20 22  Used:",.       "
11640 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20  %lld (max %lld) 
11650 70 61 67 65 73 22 2c 20 53 51 4c 49 54 45 5f 53  pages", SQLITE_S
11660 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f  TATUS_PAGECACHE_
11670 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20  USED, bReset);. 
11680 20 7d 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74   }.  displayStat
11690 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62  Line(pArg, "Numb
116a0 65 72 20 6f 66 20 50 63 61 63 68 65 20 4f 76 65  er of Pcache Ove
116b0 72 66 6c 6f 77 20 42 79 74 65 73 3a 22 2c 0a 20  rflow Bytes:",. 
116c0 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25      "%lld (max %
116d0 6c 6c 64 29 20 62 79 74 65 73 22 2c 20 53 51 4c  lld) bytes", SQL
116e0 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43  ITE_STATUS_PAGEC
116f0 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57 2c 20 62  ACHE_OVERFLOW, b
11700 52 65 73 65 74 29 3b 0a 20 20 64 69 73 70 6c 61  Reset);.  displa
11710 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20  yStatLine(pArg, 
11720 22 4c 61 72 67 65 73 74 20 41 6c 6c 6f 63 61 74  "Largest Allocat
11730 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c  ion:",.     "%ll
11740 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45  d bytes", SQLITE
11750 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53  _STATUS_MALLOC_S
11760 49 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  IZE, bReset);.  
11770 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28  displayStatLine(
11780 70 41 72 67 2c 20 22 4c 61 72 67 65 73 74 20 50  pArg, "Largest P
11790 63 61 63 68 65 20 41 6c 6c 6f 63 61 74 69 6f 6e  cache Allocation
117a0 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 62  :",.     "%lld b
117b0 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54  ytes", SQLITE_ST
117c0 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 53  ATUS_PAGECACHE_S
117d0 49 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a 23 69  IZE, bReset);.#i
117e0 66 64 65 66 20 59 59 54 52 41 43 4b 4d 41 58 53  fdef YYTRACKMAXS
117f0 54 41 43 4b 44 45 50 54 48 0a 20 20 64 69 73 70  TACKDEPTH.  disp
11800 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67  layStatLine(pArg
11810 2c 20 22 44 65 65 70 65 73 74 20 50 61 72 73 65  , "Deepest Parse
11820 72 20 53 74 61 63 6b 3a 22 2c 0a 20 20 20 20 20  r Stack:",.     
11830 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29  "%lld (max %lld)
11840 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53  ", SQLITE_STATUS
11850 5f 50 41 52 53 45 52 5f 53 54 41 43 4b 2c 20 62  _PARSER_STACK, b
11860 52 65 73 65 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  Reset);.#endif..
11870 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20    if( db ){.    
11880 69 66 28 20 70 41 72 67 2d 3e 73 68 65 6c 6c 46  if( pArg->shellF
11890 6c 67 73 20 26 20 53 48 46 4c 47 5f 4c 6f 6f 6b  lgs & SHFLG_Look
118a0 61 73 69 64 65 20 29 7b 0a 20 20 20 20 20 20 69  aside ){.      i
118b0 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
118c0 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
118d0 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
118e0 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c  QLITE_DBSTATUS_L
118f0 4f 4f 4b 41 53 49 44 45 5f 55 53 45 44 2c 0a 20  OOKASIDE_USED,. 
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11910 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69         &iCur, &i
11920 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
11930 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
11940 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20  (pArg->out,.    
11950 20 20 20 20 20 20 20 20 20 20 22 4c 6f 6f 6b 61            "Looka
11960 73 69 64 65 20 53 6c 6f 74 73 20 55 73 65 64 3a  side Slots Used:
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 25 64 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c 0a  %d (max %d)\n",.
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
119a0 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20  ur, iHiwtr);.   
119b0 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
119c0 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
119d0 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49  DBSTATUS_LOOKASI
119e0 44 45 5f 48 49 54 2c 0a 20 20 20 20 20 20 20 20  DE_HIT,.        
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a00 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
11a10 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72  bReset);.      r
11a20 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
11a30 6f 75 74 2c 20 22 53 75 63 63 65 73 73 66 75 6c  out, "Successful
11a40 20 6c 6f 6f 6b 61 73 69 64 65 20 61 74 74 65 6d   lookaside attem
11a50 70 74 73 3a 20 20 20 20 20 20 20 25 64 5c 6e 22  pts:       %d\n"
11a60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11a70 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20 73  iHiwtr);.      s
11a80 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
11a90 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  (db, SQLITE_DBST
11aa0 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d  ATUS_LOOKASIDE_M
11ab0 49 53 53 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20  ISS_SIZE,.      
11ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ad0 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72    &iCur, &iHiwtr
11ae0 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20  , bReset);.     
11af0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
11b00 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64  ->out, "Lookasid
11b10 65 20 66 61 69 6c 75 72 65 73 20 64 75 65 20 74  e failures due t
11b20 6f 20 73 69 7a 65 3a 20 20 20 20 20 20 25 64 5c  o size:      %d\
11b30 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
11b40 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20    iHiwtr);.     
11b50 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
11b60 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
11b70 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45  STATUS_LOOKASIDE
11b80 5f 4d 49 53 53 5f 46 55 4c 4c 2c 0a 20 20 20 20  _MISS_FULL,.    
11b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ba0 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77      &iCur, &iHiw
11bb0 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
11bc0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
11bd0 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73  rg->out, "Lookas
11be0 69 64 65 20 66 61 69 6c 75 72 65 73 20 64 75 65  ide failures due
11bf0 20 74 6f 20 4f 4f 4d 3a 20 20 20 20 20 20 20 25   to OOM:       %
11c00 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
11c10 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20      iHiwtr);.   
11c20 20 7d 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20   }.    iHiwtr = 
11c30 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73  iCur = -1;.    s
11c40 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
11c50 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  (db, SQLITE_DBST
11c60 41 54 55 53 5f 43 41 43 48 45 5f 55 53 45 44 2c  ATUS_CACHE_USED,
11c70 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
11c80 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61   bReset);.    ra
11c90 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
11ca0 75 74 2c 20 22 50 61 67 65 72 20 48 65 61 70 20  ut, "Pager Heap 
11cb0 55 73 61 67 65 3a 20 20 20 20 20 20 20 20 20 20  Usage:          
11cc0 20 20 20 20 20 20 20 20 20 20 25 64 20 62 79 74            %d byt
11cd0 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
11ce0 20 20 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48     iCur);.    iH
11cf0 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
11d00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
11d10 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
11d20 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
11d30 45 5f 48 49 54 2c 20 26 69 43 75 72 2c 20 26 69  E_HIT, &iCur, &i
11d40 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72  Hiwtr, 1);.    r
11d50 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
11d60 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65  out, "Page cache
11d70 20 68 69 74 73 3a 20 20 20 20 20 20 20 20 20 20   hits:          
11d80 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
11d90 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69  , iCur);.    iHi
11da0 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
11db0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
11dc0 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
11dd0 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45  E_DBSTATUS_CACHE
11de0 5f 4d 49 53 53 2c 20 26 69 43 75 72 2c 20 26 69  _MISS, &iCur, &i
11df0 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72  Hiwtr, 1);.    r
11e00 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
11e10 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65  out, "Page cache
11e20 20 6d 69 73 73 65 73 3a 20 20 20 20 20 20 20 20   misses:        
11e30 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
11e40 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69  , iCur);.    iHi
11e50 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
11e60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
11e70 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
11e80 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45  E_DBSTATUS_CACHE
11e90 5f 57 52 49 54 45 2c 20 26 69 43 75 72 2c 20 26  _WRITE, &iCur, &
11ea0 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20  iHiwtr, 1);.    
11eb0 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
11ec0 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68  >out, "Page cach
11ed0 65 20 77 72 69 74 65 73 3a 20 20 20 20 20 20 20  e writes:       
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
11ef0 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48  ", iCur);.    iH
11f00 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
11f10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
11f20 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
11f30 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
11f40 45 5f 53 50 49 4c 4c 2c 20 26 69 43 75 72 2c 20  E_SPILL, &iCur, 
11f50 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20  &iHiwtr, 1);.   
11f60 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
11f70 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63  ->out, "Page cac
11f80 68 65 20 73 70 69 6c 6c 73 3a 20 20 20 20 20 20  he spills:      
11f90 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
11fa0 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
11fb0 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
11fc0 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  1;.    sqlite3_d
11fd0 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
11fe0 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53 43 48  ITE_DBSTATUS_SCH
11ff0 45 4d 41 5f 55 53 45 44 2c 20 26 69 43 75 72 2c  EMA_USED, &iCur,
12000 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
12010 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
12020 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 63  f(pArg->out, "Sc
12030 68 65 6d 61 20 48 65 61 70 20 55 73 61 67 65 3a  hema Heap Usage:
12040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12050 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a     %d bytes\n",.
12060 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72              iCur
12070 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20  );.    iHiwtr = 
12080 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73  iCur = -1;.    s
12090 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
120a0 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  (db, SQLITE_DBST
120b0 41 54 55 53 5f 53 54 4d 54 5f 55 53 45 44 2c 20  ATUS_STMT_USED, 
120c0 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
120d0 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
120e0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
120f0 74 2c 20 22 53 74 61 74 65 6d 65 6e 74 20 48 65  t, "Statement He
12100 61 70 2f 4c 6f 6f 6b 61 73 69 64 65 20 55 73 61  ap/Lookaside Usa
12110 67 65 3a 20 20 20 20 20 20 25 64 20 62 79 74 65  ge:      %d byte
12120 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
12130 20 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20    iCur);.  }..  
12140 69 66 28 20 70 41 72 67 2d 3e 70 53 74 6d 74 20  if( pArg->pStmt 
12150 29 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  ){.    iCur = sq
12160 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
12170 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
12180 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
12190 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 0a  _FULLSCAN_STEP,.
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
121c0 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
121d0 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
121e0 2c 20 22 46 75 6c 6c 73 63 61 6e 20 53 74 65 70  , "Fullscan Step
121f0 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s:              
12200 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
12210 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d  Cur);.    iCur =
12220 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
12230 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74  atus(pArg->pStmt
12240 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
12250 54 55 53 5f 53 4f 52 54 2c 20 62 52 65 73 65 74  TUS_SORT, bReset
12260 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
12270 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 6f  f(pArg->out, "So
12280 72 74 20 4f 70 65 72 61 74 69 6f 6e 73 3a 20 20  rt Operations:  
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122a0 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
122b0 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
122c0 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
122d0 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
122e0 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41  ITE_STMTSTATUS_A
122f0 55 54 4f 49 4e 44 45 58 2c 62 52 65 73 65 74 29  UTOINDEX,bReset)
12300 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
12310 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 41 75 74  (pArg->out, "Aut
12320 6f 69 6e 64 65 78 20 49 6e 73 65 72 74 73 3a 20  oindex Inserts: 
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12340 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
12350 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74      iCur = sqlit
12360 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
12370 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49  Arg->pStmt, SQLI
12380 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d  TE_STMTSTATUS_VM
12390 5f 53 54 45 50 2c 20 62 52 65 73 65 74 29 3b 0a  _STEP, bReset);.
123a0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
123b0 41 72 67 2d 3e 6f 75 74 2c 20 22 56 69 72 74 75  Arg->out, "Virtu
123c0 61 6c 20 4d 61 63 68 69 6e 65 20 53 74 65 70 73  al Machine Steps
123d0 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
123e0 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
123f0 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33    iCur = sqlite3
12400 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72  _stmt_status(pAr
12410 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45  g->pStmt, SQLITE
12420 5f 53 54 4d 54 53 54 41 54 55 53 5f 52 45 50 52  _STMTSTATUS_REPR
12430 45 50 41 52 45 2c 20 62 52 65 73 65 74 29 3b 0a  EPARE, bReset);.
12440 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
12450 41 72 67 2d 3e 6f 75 74 2c 20 22 52 65 70 72 65  Arg->out, "Repre
12460 70 61 72 65 20 6f 70 65 72 61 74 69 6f 6e 73 3a  pare operations:
12470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12480 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
12490 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33    iCur = sqlite3
124a0 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72  _stmt_status(pAr
124b0 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45  g->pStmt, SQLITE
124c0 5f 53 54 4d 54 53 54 41 54 55 53 5f 52 55 4e 2c  _STMTSTATUS_RUN,
124d0 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61   bReset);.    ra
124e0 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
124f0 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 74  ut, "Number of t
12500 69 6d 65 73 20 72 75 6e 3a 20 20 20 20 20 20 20  imes run:       
12510 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
12520 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72   iCur);.    iCur
12530 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
12540 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74  status(pArg->pSt
12550 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  mt, SQLITE_STMTS
12560 54 41 54 55 53 5f 4d 45 4d 55 53 45 44 2c 20 62  TATUS_MEMUSED, b
12570 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
12580 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12590 2c 20 22 4d 65 6d 6f 72 79 20 75 73 65 64 20 62  , "Memory used b
125a0 79 20 70 72 65 70 61 72 65 64 20 73 74 6d 74 3a  y prepared stmt:
125b0 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
125c0 43 75 72 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  Cur);.  }..#ifde
125d0 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 20 20 64 69  f __linux__.  di
125e0 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61 74  splayLinuxIoStat
125f0 73 28 70 41 72 67 2d 3e 6f 75 74 29 3b 0a 23 65  s(pArg->out);.#e
12600 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  ndif..  /* Do no
12610 74 20 72 65 6d 6f 76 65 20 74 68 69 73 20 6d 61  t remove this ma
12620 63 68 69 6e 65 20 72 65 61 64 61 62 6c 65 20 63  chine readable c
12630 6f 6d 6d 65 6e 74 3a 20 65 78 74 72 61 2d 73 74  omment: extra-st
12640 61 74 73 2d 6f 75 74 70 75 74 2d 68 65 72 65 20  ats-output-here 
12650 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  */..  return 0;.
12660 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79  }../*.** Display
12670 20 73 63 61 6e 20 73 74 61 74 73 2e 0a 2a 2f 0a   scan stats..*/.
12680 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70  static void disp
12690 6c 61 79 5f 73 63 61 6e 73 74 61 74 73 28 0a 20  lay_scanstats(. 
126a0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126c0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20   /* Database to 
126d0 71 75 65 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c  query */.  Shell
126e0 53 74 61 74 65 20 2a 70 41 72 67 20 20 20 20 20  State *pArg     
126f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
12700 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74  inter to ShellSt
12710 61 74 65 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ate */.){.#ifnde
12720 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
12730 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
12740 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
12750 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44  ER(db);.  UNUSED
12760 5f 50 41 52 41 4d 45 54 45 52 28 70 41 72 67 29  _PARAMETER(pArg)
12770 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 69 2c  ;.#else.  int i,
12780 20 6b 2c 20 6e 2c 20 6d 78 3b 0a 20 20 72 61 77   k, n, mx;.  raw
12790 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
127a0 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 63 61  t, "-------- sca
127b0 6e 73 74 61 74 73 20 2d 2d 2d 2d 2d 2d 2d 2d 5c  nstats --------\
127c0 6e 22 29 3b 0a 20 20 6d 78 20 3d 20 30 3b 0a 20  n");.  mx = 0;. 
127d0 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 3d 6d 78 3b   for(k=0; k<=mx;
127e0 20 6b 2b 2b 29 7b 0a 20 20 20 20 64 6f 75 62 6c   k++){.    doubl
127f0 65 20 72 45 73 74 4c 6f 6f 70 20 3d 20 31 2e 30  e rEstLoop = 1.0
12800 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b  ;.    for(i=n=0;
12810 20 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20   1; i++){.      
12820 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 20  sqlite3_stmt *p 
12830 3d 20 70 41 72 67 2d 3e 70 53 74 6d 74 3b 0a 20  = pArg->pStmt;. 
12840 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
12850 36 34 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73 69 74  64 nLoop, nVisit
12860 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72  ;.      double r
12870 45 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Est;.      int i
12880 53 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  Sid;.      const
12890 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b   char *zExplain;
128a0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
128b0 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
128c0 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f  us(p, i, SQLITE_
128d0 53 43 41 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20  SCANSTAT_NLOOP, 
128e0 28 76 6f 69 64 2a 29 26 6e 4c 6f 6f 70 29 20 29  (void*)&nLoop) )
128f0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
12900 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
12910 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
12920 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c  status(p, i, SQL
12930 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 53 45 4c  ITE_SCANSTAT_SEL
12940 45 43 54 49 44 2c 20 28 76 6f 69 64 2a 29 26 69  ECTID, (void*)&i
12950 53 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Sid);.      if( 
12960 69 53 69 64 3e 6d 78 20 29 20 6d 78 20 3d 20 69  iSid>mx ) mx = i
12970 53 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69  Sid;.      if( i
12980 53 69 64 21 3d 6b 20 29 20 63 6f 6e 74 69 6e 75  Sid!=k ) continu
12990 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  e;.      if( n==
129a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 45 73  0 ){.        rEs
129b0 74 4c 6f 6f 70 20 3d 20 28 64 6f 75 62 6c 65 29  tLoop = (double)
129c0 6e 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69  nLoop;.        i
129d0 66 28 20 6b 3e 30 20 29 20 72 61 77 5f 70 72 69  f( k>0 ) raw_pri
129e0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
129f0 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75 62 71 75 65 72  -------- subquer
12a00 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c  y %d -------\n",
12a10 20 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   k);.      }.   
12a20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 73 71     n++;.      sq
12a30 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
12a40 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49  tatus(p, i, SQLI
12a50 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56 49 53  TE_SCANSTAT_NVIS
12a60 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56 69 73  IT, (void*)&nVis
12a70 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  it);.      sqlit
12a80 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
12a90 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f  us(p, i, SQLITE_
12aa0 53 43 41 4e 53 54 41 54 5f 45 53 54 2c 20 28 76  SCANSTAT_EST, (v
12ab0 6f 69 64 2a 29 26 72 45 73 74 29 3b 0a 20 20 20  oid*)&rEst);.   
12ac0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
12ad0 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c  scanstatus(p, i,
12ae0 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54   SQLITE_SCANSTAT
12af0 5f 45 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a  _EXPLAIN, (void*
12b00 29 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20  )&zExplain);.   
12b10 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
12b20 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 70 20  Arg->out, "Loop 
12b30 25 32 64 3a 20 25 73 5c 6e 22 2c 20 6e 2c 20 7a  %2d: %s\n", n, z
12b40 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20  Explain);.      
12b50 72 45 73 74 4c 6f 6f 70 20 2a 3d 20 72 45 73 74  rEstLoop *= rEst
12b60 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
12b70 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20  tf(pArg->out,.  
12b80 20 20 20 20 20 20 20 20 22 20 20 20 20 20 20 20          "       
12b90 20 20 6e 4c 6f 6f 70 3d 25 2d 38 6c 6c 64 20 6e    nLoop=%-8lld n
12ba0 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f  Row=%-8lld estRo
12bb0 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77 2f  w=%-8lld estRow/
12bc0 4c 6f 6f 70 3d 25 2d 38 67 5c 6e 22 2c 0a 20 20  Loop=%-8g\n",.  
12bd0 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70 2c 20 6e          nLoop, n
12be0 56 69 73 69 74 2c 20 28 73 71 6c 69 74 65 33 5f  Visit, (sqlite3_
12bf0 69 6e 74 36 34 29 28 72 45 73 74 4c 6f 6f 70 2b  int64)(rEstLoop+
12c00 30 2e 35 29 2c 20 72 45 73 74 0a 20 20 20 20 20  0.5), rEst.     
12c10 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
12c20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
12c30 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d  >out, "---------
12c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c50 2d 2d 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 7d  --\n");.#endif.}
12c60 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
12c70 72 20 61 7a 41 72 72 61 79 20 70 6f 69 6e 74 73  r azArray points
12c80 20 74 6f 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69   to a zero-termi
12c90 6e 61 74 65 64 20 61 72 72 61 79 20 6f 66 20 73  nated array of s
12ca0 74 72 69 6e 67 73 2e 20 7a 53 74 72 0a 2a 2a 20  trings. zStr.** 
12cb0 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 69 6e 67  points to a sing
12cc0 6c 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  le nul-terminate
12cd0 64 20 73 74 72 69 6e 67 2e 20 52 65 74 75 72 6e  d string. Return
12ce0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 7a 53 74   non-zero if zSt
12cf0 72 0a 2a 2a 20 69 73 20 65 71 75 61 6c 2c 20 61  r.** is equal, a
12d00 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 74 72 63  ccording to strc
12d10 6d 70 28 29 2c 20 74 6f 20 61 6e 79 20 6f 66 20  mp(), to any of 
12d20 74 68 65 20 73 74 72 69 6e 67 73 20 69 6e 20 74  the strings in t
12d30 68 65 20 61 72 72 61 79 2e 0a 2a 2a 20 4f 74 68  he array..** Oth
12d40 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 7a  erwise, return z
12d50 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
12d60 6e 74 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28  nt str_in_array(
12d70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72  const char *zStr
12d80 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61  , const char **a
12d90 7a 41 72 72 61 79 29 7b 0a 20 20 69 6e 74 20 69  zArray){.  int i
12da0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 61 7a 41  ;.  for(i=0; azA
12db0 72 72 61 79 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  rray[i]; i++){. 
12dc0 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
12dd0 28 7a 53 74 72 2c 20 61 7a 41 72 72 61 79 5b 69  (zStr, azArray[i
12de0 5d 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ]) ) return 1;. 
12df0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
12e00 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70 69  ../*.** If compi
12e10 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 20 70 53  led statement pS
12e20 71 6c 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ql appears to be
12e30 20 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61 74   an EXPLAIN stat
12e40 65 6d 65 6e 74 2c 20 61 6c 6c 6f 63 61 74 65 0a  ement, allocate.
12e50 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  ** and populate 
12e60 74 68 65 20 53 68 65 6c 6c 53 74 61 74 65 2e 61  the ShellState.a
12e70 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79 20  iIndent[] array 
12e80 77 69 74 68 20 74 68 65 20 6e 75 6d 62 65 72 20  with the number 
12e90 6f 66 0a 2a 2a 20 73 70 61 63 65 73 20 65 61 63  of.** spaces eac
12ea0 68 20 6f 70 63 6f 64 65 20 73 68 6f 75 6c 64 20  h opcode should 
12eb0 62 65 20 69 6e 64 65 6e 74 65 64 20 62 65 66 6f  be indented befo
12ec0 72 65 20 69 74 20 69 73 20 6f 75 74 70 75 74 2e  re it is output.
12ed0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 6e  .**.** The inden
12ee0 74 69 6e 67 20 72 75 6c 65 73 20 61 72 65 3a 0a  ting rules are:.
12ef0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20  **.**     * For 
12f00 65 61 63 68 20 22 4e 65 78 74 22 2c 20 22 50 72  each "Next", "Pr
12f10 65 76 22 2c 20 22 56 4e 65 78 74 22 20 6f 72 20  ev", "VNext" or 
12f20 22 56 50 72 65 76 22 20 69 6e 73 74 72 75 63 74  "VPrev" instruct
12f30 69 6f 6e 2c 20 69 6e 64 65 6e 74 0a 2a 2a 20 20  ion, indent.**  
12f40 20 20 20 20 20 61 6c 6c 20 6f 70 63 6f 64 65 73       all opcodes
12f50 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 74 77   that occur betw
12f60 65 65 6e 20 74 68 65 20 70 32 20 6a 75 6d 70 20  een the p2 jump 
12f70 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 6e 64 20  destination and 
12f80 74 68 65 20 6f 70 63 6f 64 65 0a 2a 2a 20 20 20  the opcode.**   
12f90 20 20 20 20 69 74 73 65 6c 66 20 62 79 20 32 20      itself by 2 
12fa0 73 70 61 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  spaces..**.**   
12fb0 20 20 2a 20 46 6f 72 20 65 61 63 68 20 22 47 6f    * For each "Go
12fc0 74 6f 22 2c 20 69 66 20 74 68 65 20 6a 75 6d 70  to", if the jump
12fd0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
12fe0 65 61 72 6c 69 65 72 20 69 6e 20 74 68 65 20 70  earlier in the p
12ff0 72 6f 67 72 61 6d 0a 2a 2a 20 20 20 20 20 20 20  rogram.**       
13000 61 6e 64 20 65 6e 64 73 20 6f 6e 20 6f 6e 65 20  and ends on one 
13010 6f 66 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  of:.**          
13020 59 69 65 6c 64 20 20 53 65 65 6b 47 74 20 20 53  Yield  SeekGt  S
13030 65 65 6b 4c 74 20 20 52 6f 77 53 65 74 52 65 61  eekLt  RowSetRea
13040 64 20 20 52 65 77 69 6e 64 0a 2a 2a 20 20 20 20  d  Rewind.**    
13050 20 20 20 6f 72 20 69 66 20 74 68 65 20 50 31 20     or if the P1 
13060 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 6e 65  parameter is one
13070 20 69 6e 73 74 65 61 64 20 6f 66 20 7a 65 72 6f   instead of zero
13080 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 6e 20  ,.**       then 
13090 69 6e 64 65 6e 74 20 61 6c 6c 20 6f 70 63 6f 64  indent all opcod
130a0 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 65  es between the e
130b0 61 72 6c 69 65 72 20 69 6e 73 74 72 75 63 74 69  arlier instructi
130c0 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20  on.**       and 
130d0 22 47 6f 74 6f 22 20 62 79 20 32 20 73 70 61 63  "Goto" by 2 spac
130e0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
130f0 69 64 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f  id explain_data_
13100 70 72 65 70 61 72 65 28 53 68 65 6c 6c 53 74 61  prepare(ShellSta
13110 74 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73  te *p, sqlite3_s
13120 74 6d 74 20 2a 70 53 71 6c 29 7b 0a 20 20 63 6f  tmt *pSql){.  co
13130 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20  nst char *zSql; 
13140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13150 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
13160 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
13170 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
13180 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
13190 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 63      /* Used to c
131a0 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20  heck if this is 
131b0 61 6e 20 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20  an EXPLAIN */.  
131c0 69 6e 74 20 2a 61 62 59 69 65 6c 64 20 3d 20 30  int *abYield = 0
131d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
131e0 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 20 69 73  /* True if op is
131f0 20 61 6e 20 4f 50 5f 59 69 65 6c 64 20 2a 2f 0a   an OP_Yield */.
13200 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30    int nAlloc = 0
13210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13220 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
13230 69 7a 65 20 6f 66 20 70 2d 3e 61 69 49 6e 64 65  ize of p->aiInde
13240 6e 74 5b 5d 2c 20 61 62 59 69 65 6c 64 20 2a 2f  nt[], abYield */
13250 0a 20 20 69 6e 74 20 69 4f 70 3b 20 20 20 20 20  .  int iOp;     
13260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13270 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6f     /* Index of o
13280 70 65 72 61 74 69 6f 6e 20 69 6e 20 70 2d 3e 61  peration in p->a
13290 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 0a 20 20  iIndent[] */..  
132a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4e 65  const char *azNe
132b0 78 74 5b 5d 20 3d 20 7b 20 22 4e 65 78 74 22 2c  xt[] = { "Next",
132c0 20 22 50 72 65 76 22 2c 20 22 56 50 72 65 76 22   "Prev", "VPrev"
132d0 2c 20 22 56 4e 65 78 74 22 2c 20 22 53 6f 72 74  , "VNext", "Sort
132e0 65 72 4e 65 78 74 22 2c 20 30 20 7d 3b 0a 20 20  erNext", 0 };.  
132f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 59 69  const char *azYi
13300 65 6c 64 5b 5d 20 3d 20 7b 20 22 59 69 65 6c 64  eld[] = { "Yield
13310 22 2c 20 22 53 65 65 6b 4c 54 22 2c 20 22 53 65  ", "SeekLT", "Se
13320 65 6b 47 54 22 2c 20 22 52 6f 77 53 65 74 52 65  ekGT", "RowSetRe
13330 61 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ad",.           
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13350 20 22 52 65 77 69 6e 64 22 2c 20 30 20 7d 3b 0a   "Rewind", 0 };.
13360 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
13370 47 6f 74 6f 5b 5d 20 3d 20 7b 20 22 47 6f 74 6f  Goto[] = { "Goto
13380 22 2c 20 30 20 7d 3b 0a 0a 20 20 2f 2a 20 54 72  ", 0 };..  /* Tr
13390 79 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  y to figure out 
133a0 69 66 20 74 68 69 73 20 69 73 20 72 65 61 6c 6c  if this is reall
133b0 79 20 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61  y an EXPLAIN sta
133c0 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 69 73 0a  tement. If this.
133d0 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 76    ** cannot be v
133e0 65 72 69 66 69 65 64 2c 20 72 65 74 75 72 6e 20  erified, return 
133f0 65 61 72 6c 79 2e 20 20 2a 2f 0a 20 20 69 66 28  early.  */.  if(
13400 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
13410 63 6f 75 6e 74 28 70 53 71 6c 29 21 3d 38 20 29  count(pSql)!=8 )
13420 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d  {.    p->cMode =
13430 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65   p->mode;.    re
13440 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c  turn;.  }.  zSql
13450 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70   = sqlite3_sql(p
13460 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  Sql);.  if( zSql
13470 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
13480 66 6f 72 28 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d 3d  for(z=zSql; *z==
13490 27 20 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27 20  ' ' || *z=='\t' 
134a0 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27 20 7c 7c 20 2a  || *z=='\n' || *
134b0 7a 3d 3d 27 5c 66 27 20 7c 7c 20 2a 7a 3d 3d 27  z=='\f' || *z=='
134c0 5c 72 27 3b 20 7a 2b 2b 29 3b 0a 20 20 69 66 28  \r'; z++);.  if(
134d0 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
134e0 70 28 7a 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20  p(z, "explain", 
134f0 37 29 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f  7) ){.    p->cMo
13500 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
13510 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
13520 20 66 6f 72 28 69 4f 70 3d 30 3b 20 53 51 4c 49   for(iOp=0; SQLI
13530 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
13540 73 74 65 70 28 70 53 71 6c 29 3b 20 69 4f 70 2b  step(pSql); iOp+
13550 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  +){.    int i;. 
13560 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
13570 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
13580 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20  t(pSql, 0);.    
13590 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
135a0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
135b0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
135c0 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a 0a 20 20  xt(pSql, 1);..  
135d0 20 20 2f 2a 20 53 65 74 20 70 32 20 74 6f 20 74    /* Set p2 to t
135e0 68 65 20 50 32 20 66 69 65 6c 64 20 6f 66 20 74  he P2 field of t
135f0 68 65 20 63 75 72 72 65 6e 74 20 6f 70 63 6f 64  he current opcod
13600 65 2e 20 54 68 65 6e 2c 20 61 73 73 75 6d 69 6e  e. Then, assumin
13610 67 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 70 32  g that.    ** p2
13620 20 69 73 20 61 6e 20 69 6e 73 74 72 75 63 74 69   is an instructi
13630 6f 6e 20 61 64 64 72 65 73 73 2c 20 73 65 74 20  on address, set 
13640 76 61 72 69 61 62 6c 65 20 70 32 6f 70 20 74 6f  variable p2op to
13650 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
13660 61 74 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  at.    ** instru
13670 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 69 49  ction in the aiI
13680 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79 2e 20 70  ndent[] array. p
13690 32 20 61 6e 64 20 70 32 6f 70 20 6d 61 79 20 62  2 and p2op may b
136a0 65 20 64 69 66 66 65 72 65 6e 74 20 69 66 0a 20  e different if. 
136b0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
136c0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  t instruction is
136d0 20 70 61 72 74 20 6f 66 20 61 20 73 75 62 2d 70   part of a sub-p
136e0 72 6f 67 72 61 6d 20 67 65 6e 65 72 61 74 65 64  rogram generated
136f0 20 62 79 20 61 6e 0a 20 20 20 20 2a 2a 20 53 51   by an.    ** SQ
13700 4c 20 74 72 69 67 67 65 72 20 6f 72 20 66 6f 72  L trigger or for
13710 65 69 67 6e 20 6b 65 79 2e 20 20 2a 2f 0a 20 20  eign key.  */.  
13720 20 20 69 6e 74 20 70 32 20 3d 20 73 71 6c 69 74    int p2 = sqlit
13730 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
13740 71 6c 2c 20 33 29 3b 0a 20 20 20 20 69 6e 74 20  ql, 3);.    int 
13750 70 32 6f 70 20 3d 20 28 70 32 20 2b 20 28 69 4f  p2op = (p2 + (iO
13760 70 2d 69 41 64 64 72 29 29 3b 0a 0a 20 20 20 20  p-iAddr));..    
13770 2f 2a 20 47 72 6f 77 20 74 68 65 20 70 2d 3e 61  /* Grow the p->a
13780 69 49 6e 64 65 6e 74 20 61 72 72 61 79 20 61 73  iIndent array as
13790 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
137a0 20 69 66 28 20 69 4f 70 3e 3d 6e 41 6c 6c 6f 63   if( iOp>=nAlloc
137b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 4f   ){.      if( iO
137c0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p==0 ){.        
137d0 2f 2a 20 44 6f 20 66 75 72 74 68 65 72 20 76 65  /* Do further ve
137e0 72 66 69 63 61 74 69 6f 6e 20 74 68 61 74 20 74  rfication that t
137f0 68 69 73 20 69 73 20 65 78 70 6c 61 69 6e 20 6f  his is explain o
13800 75 74 70 75 74 2e 20 20 41 62 6f 72 74 20 69 66  utput.  Abort if
13810 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69  .        ** it i
13820 73 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20  s not */.       
13830 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
13840 61 72 20 2a 65 78 70 6c 61 69 6e 43 6f 6c 73 5b  ar *explainCols[
13850 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
13860 20 22 61 64 64 72 22 2c 20 22 6f 70 63 6f 64 65   "addr", "opcode
13870 22 2c 20 22 70 31 22 2c 20 22 70 32 22 2c 20 22  ", "p1", "p2", "
13880 70 33 22 2c 20 22 70 34 22 2c 20 22 70 35 22 2c  p3", "p4", "p5",
13890 20 22 63 6f 6d 6d 65 6e 74 22 20 7d 3b 0a 20 20   "comment" };.  
138a0 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20        int jj;.  
138b0 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20        for(jj=0; 
138c0 6a 6a 3c 41 72 72 61 79 53 69 7a 65 28 65 78 70  jj<ArraySize(exp
138d0 6c 61 69 6e 43 6f 6c 73 29 3b 20 6a 6a 2b 2b 29  lainCols); jj++)
138e0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
138f0 73 74 72 63 6d 70 28 73 71 6c 69 74 65 33 5f 63  strcmp(sqlite3_c
13900 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 71 6c 2c  olumn_name(pSql,
13910 6a 6a 29 2c 65 78 70 6c 61 69 6e 43 6f 6c 73 5b  jj),explainCols[
13920 6a 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  jj])!=0 ){.     
13930 20 20 20 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20         p->cMode 
13940 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20  = p->mode;.     
13950 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
13960 65 73 65 74 28 70 53 71 6c 29 3b 0a 20 20 20 20  eset(pSql);.    
13970 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
13980 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13990 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
139a0 20 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31 30      nAlloc += 10
139b0 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 69 49 6e  0;.      p->aiIn
139c0 64 65 6e 74 20 3d 20 28 69 6e 74 2a 29 73 71 6c  dent = (int*)sql
139d0 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70  ite3_realloc64(p
139e0 2d 3e 61 69 49 6e 64 65 6e 74 2c 20 6e 41 6c 6c  ->aiIndent, nAll
139f0 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b  oc*sizeof(int));
13a00 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 69  .      if( p->ai
13a10 49 6e 64 65 6e 74 3d 3d 30 20 29 20 73 68 65 6c  Indent==0 ) shel
13a20 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28  l_out_of_memory(
13a30 29 3b 0a 20 20 20 20 20 20 61 62 59 69 65 6c 64  );.      abYield
13a40 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33   = (int*)sqlite3
13a50 5f 72 65 61 6c 6c 6f 63 36 34 28 61 62 59 69 65  _realloc64(abYie
13a60 6c 64 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  ld, nAlloc*sizeo
13a70 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 69  f(int));.      i
13a80 66 28 20 61 62 59 69 65 6c 64 3d 3d 30 20 29 20  f( abYield==0 ) 
13a90 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d  shell_out_of_mem
13aa0 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ory();.    }.   
13ab0 20 61 62 59 69 65 6c 64 5b 69 4f 70 5d 20 3d 20   abYield[iOp] = 
13ac0 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70  str_in_array(zOp
13ad0 2c 20 61 7a 59 69 65 6c 64 29 3b 0a 20 20 20 20  , azYield);.    
13ae0 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 4f 70 5d  p->aiIndent[iOp]
13af0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 49 6e   = 0;.    p->nIn
13b00 64 65 6e 74 20 3d 20 69 4f 70 2b 31 3b 0a 0a 20  dent = iOp+1;.. 
13b10 20 20 20 69 66 28 20 73 74 72 5f 69 6e 5f 61 72     if( str_in_ar
13b20 72 61 79 28 7a 4f 70 2c 20 61 7a 4e 65 78 74 29  ray(zOp, azNext)
13b30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
13b40 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b  p2op; i<iOp; i++
13b50 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d  ) p->aiIndent[i]
13b60 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20   += 2;.    }.   
13b70 20 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61   if( str_in_arra
13b80 79 28 7a 4f 70 2c 20 61 7a 47 6f 74 6f 29 20 26  y(zOp, azGoto) &
13b90 26 20 70 32 6f 70 3c 70 2d 3e 6e 49 6e 64 65 6e  & p2op<p->nInden
13ba0 74 0a 20 20 20 20 20 26 26 20 28 61 62 59 69 65  t.     && (abYie
13bb0 6c 64 5b 70 32 6f 70 5d 20 7c 7c 20 73 71 6c 69  ld[p2op] || sqli
13bc0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
13bd0 53 71 6c 2c 20 32 29 29 0a 20 20 20 20 29 7b 0a  Sql, 2)).    ){.
13be0 20 20 20 20 20 20 66 6f 72 28 69 3d 70 32 6f 70        for(i=p2op
13bf0 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d  ; i<iOp; i++) p-
13c00 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20  >aiIndent[i] += 
13c10 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  2;.    }.  }..  
13c20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a  p->iIndent = 0;.
13c30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
13c40 62 59 69 65 6c 64 29 3b 0a 20 20 73 71 6c 69 74  bYield);.  sqlit
13c50 65 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b 0a  e3_reset(pSql);.
13c60 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
13c70 65 20 61 72 72 61 79 20 61 6c 6c 6f 63 61 74 65  e array allocate
13c80 64 20 62 79 20 65 78 70 6c 61 69 6e 5f 64 61 74  d by explain_dat
13c90 61 5f 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a  a_prepare()..*/.
13ca0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
13cb0 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28  ain_data_delete(
13cc0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
13cd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13ce0 2d 3e 61 69 49 6e 64 65 6e 74 29 3b 0a 20 20 70  ->aiIndent);.  p
13cf0 2d 3e 61 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a  ->aiIndent = 0;.
13d00 20 20 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 30    p->nIndent = 0
13d10 3b 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d  ;.  p->iIndent =
13d20 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73   0;.}../*.** Dis
13d30 61 62 6c 65 20 61 6e 64 20 72 65 73 74 6f 72 65  able and restore
13d40 20 2e 77 68 65 72 65 74 72 61 63 65 20 61 6e 64   .wheretrace and
13d50 20 2e 73 65 6c 65 63 74 74 72 61 63 65 20 73 65   .selecttrace se
13d60 74 74 69 6e 67 73 2e 0a 2a 2f 0a 23 69 66 20 64  ttings..*/.#if d
13d70 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
13d80 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
13d90 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
13da0 4c 45 43 54 54 52 41 43 45 29 0a 65 78 74 65 72  LECTTRACE).exter
13db0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  n int sqlite3Sel
13dc0 65 63 74 54 72 61 63 65 3b 0a 73 74 61 74 69 63  ectTrace;.static
13dd0 20 69 6e 74 20 73 61 76 65 64 53 65 6c 65 63 74   int savedSelect
13de0 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69  Trace;.#endif.#i
13df0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
13e00 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
13e10 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
13e20 5f 57 48 45 52 45 54 52 41 43 45 29 0a 65 78 74  _WHERETRACE).ext
13e30 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57  ern int sqlite3W
13e40 68 65 72 65 54 72 61 63 65 3b 0a 73 74 61 74 69  hereTrace;.stati
13e50 63 20 69 6e 74 20 73 61 76 65 64 57 68 65 72 65  c int savedWhere
13e60 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 73 74  Trace;.#endif.st
13e70 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c  atic void disabl
13e80 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f  e_debug_trace_mo
13e90 64 65 73 28 76 6f 69 64 29 7b 0a 23 69 66 20 64  des(void){.#if d
13ea0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
13eb0 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
13ec0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
13ed0 4c 45 43 54 54 52 41 43 45 29 0a 20 20 73 61 76  LECTTRACE).  sav
13ee0 65 64 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20  edSelectTrace = 
13ef0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
13f00 63 65 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  ce;.  sqlite3Sel
13f10 65 63 74 54 72 61 63 65 20 3d 20 30 3b 0a 23 65  ectTrace = 0;.#e
13f20 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
13f30 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26  (SQLITE_DEBUG) &
13f40 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
13f50 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41  _ENABLE_WHERETRA
13f60 43 45 29 0a 20 20 73 61 76 65 64 57 68 65 72 65  CE).  savedWhere
13f70 54 72 61 63 65 20 3d 20 73 71 6c 69 74 65 33 57  Trace = sqlite3W
13f80 68 65 72 65 54 72 61 63 65 3b 0a 20 20 73 71 6c  hereTrace;.  sql
13f90 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
13fa0 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61   0;.#endif.}.sta
13fb0 74 69 63 20 76 6f 69 64 20 72 65 73 74 6f 72 65  tic void restore
13fc0 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64  _debug_trace_mod
13fd0 65 73 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65  es(void){.#if de
13fe0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
13ff0 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
14000 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c  QLITE_ENABLE_SEL
14010 45 43 54 54 52 41 43 45 29 0a 20 20 73 71 6c 69  ECTTRACE).  sqli
14020 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d  te3SelectTrace =
14030 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61 63   savedSelectTrac
14040 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  e;.#endif.#if de
14050 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
14060 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
14070 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45  QLITE_ENABLE_WHE
14080 52 45 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74  RETRACE).  sqlit
14090 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 73  e3WhereTrace = s
140a0 61 76 65 64 57 68 65 72 65 54 72 61 63 65 3b 0a  avedWhereTrace;.
140b0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
140c0 52 75 6e 20 61 20 70 72 65 70 61 72 65 64 20 73  Run a prepared s
140d0 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74  tatement.*/.stat
140e0 69 63 20 76 6f 69 64 20 65 78 65 63 5f 70 72 65  ic void exec_pre
140f0 70 61 72 65 64 5f 73 74 6d 74 28 0a 20 20 53 68  pared_stmt(.  Sh
14100 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20  ellState *pArg, 
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14130 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65  * Pointer to She
14140 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 73 71 6c  llState */.  sql
14150 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
14160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14180 20 53 74 61 74 6d 65 6e 74 20 74 6f 20 72 75 6e   Statment to run
14190 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
141a0 0a 0a 20 20 2f 2a 20 70 65 72 66 6f 72 6d 20 74  ..  /* perform t
141b0 68 65 20 66 69 72 73 74 20 73 74 65 70 2e 20 20  he first step.  
141c0 74 68 69 73 20 77 69 6c 6c 20 74 65 6c 6c 20 75  this will tell u
141d0 73 20 69 66 20 77 65 0a 20 20 2a 2a 20 68 61 76  s if we.  ** hav
141e0 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 20 6f  e a result set o
141f0 72 20 6e 6f 74 20 61 6e 64 20 68 6f 77 20 77 69  r not and how wi
14200 64 65 20 69 74 20 69 73 2e 0a 20 20 2a 2f 0a 20  de it is..  */. 
14210 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
14220 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a 20  ep(pStmt);.  /* 
14230 69 66 20 77 65 20 68 61 76 65 20 61 20 72 65 73  if we have a res
14240 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f 0a 20 20  ult set... */.  
14250 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d  if( SQLITE_ROW =
14260 3d 20 72 63 20 29 7b 0a 20 20 20 20 2f 2a 20 61  = rc ){.    /* a
14270 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
14280 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74 72 2c 20  r col name ptr, 
14290 76 61 6c 75 65 20 70 74 72 2c 20 61 6e 64 20 74  value ptr, and t
142a0 79 70 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ype */.    int n
142b0 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
142c0 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
142d0 29 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  );.    void *pDa
142e0 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ta = sqlite3_mal
142f0 6c 6f 63 36 34 28 33 2a 6e 43 6f 6c 2a 73 69 7a  loc64(3*nCol*siz
14300 65 6f 66 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  eof(const char*)
14310 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21   + 1);.    if( !
14320 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 72  pData ){.      r
14330 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
14340 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14350 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 73     char **azCols
14360 20 3d 20 28 63 68 61 72 20 2a 2a 29 70 44 61 74   = (char **)pDat
14370 61 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73  a;      /* Names
14380 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
14390 6e 73 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  ns */.      char
143a0 20 2a 2a 61 7a 56 61 6c 73 20 3d 20 26 61 7a 43   **azVals = &azC
143b0 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20 20 20 20  ols[nCol];      
143c0 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a 2f 0a 20   /* Results */. 
143d0 20 20 20 20 20 69 6e 74 20 2a 61 69 54 79 70 65       int *aiType
143e0 73 20 3d 20 28 69 6e 74 20 2a 29 26 61 7a 56 61  s = (int *)&azVa
143f0 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20 52 65 73  ls[nCol]; /* Res
14400 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a 20 20 20  ult types */.   
14410 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20 20     int i, x;.   
14420 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66     assert(sizeof
14430 28 69 6e 74 29 20 3c 3d 20 73 69 7a 65 6f 66 28  (int) <= sizeof(
14440 63 68 61 72 20 2a 29 29 3b 0a 20 20 20 20 20 20  char *));.      
14450 2f 2a 20 73 61 76 65 20 6f 66 66 20 70 74 72 73  /* save off ptrs
14460 20 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   to column names
14470 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
14480 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
14490 0a 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 73 5b  .        azCols[
144a0 69 5d 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  i] = (char *)sql
144b0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
144c0 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
144d0 20 20 7d 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20    }.      do{.  
144e0 20 20 20 20 20 20 2f 2a 20 65 78 74 72 61 63 74        /* extract
144f0 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 64 61   the data and da
14500 74 61 20 74 79 70 65 73 20 2a 2f 0a 20 20 20 20  ta types */.    
14510 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
14520 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
14530 20 20 20 20 20 61 69 54 79 70 65 73 5b 69 5d 20       aiTypes[i] 
14540 3d 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  = x = sqlite3_co
14550 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c  lumn_type(pStmt,
14560 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   i);.          i
14570 66 28 20 78 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  f( x==SQLITE_BLO
14580 42 20 26 26 20 70 41 72 67 20 26 26 20 70 41 72  B && pArg && pAr
14590 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 49  g->cMode==MODE_I
145a0 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 20 20 20  nsert ){.       
145b0 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d       azVals[i] =
145c0 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   "";.          }
145d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
145e0 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 28 63    azVals[i] = (c
145f0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
14600 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
14610 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  i);.          }.
14620 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 61            if( !a
14630 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28 61 69 54  zVals[i] && (aiT
14640 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49 54 45 5f  ypes[i]!=SQLITE_
14650 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  NULL) ){.       
14660 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14670 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
14680 20 20 20 20 62 72 65 61 6b 3b 20 2f 2a 20 66 72      break; /* fr
14690 6f 6d 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20  om for */.      
146a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
146b0 2f 2a 20 65 6e 64 20 66 6f 72 20 2a 2f 0a 0a 20  /* end for */.. 
146c0 20 20 20 20 20 20 20 2f 2a 20 69 66 20 64 61 74         /* if dat
146d0 61 20 61 6e 64 20 74 79 70 65 73 20 65 78 74 72  a and types extr
146e0 61 63 74 65 64 20 73 75 63 63 65 73 73 66 75 6c  acted successful
146f0 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ly... */.       
14700 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20   if( SQLITE_ROW 
14710 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  == rc ){.       
14720 20 20 20 2f 2a 20 63 61 6c 6c 20 74 68 65 20 73     /* call the s
14730 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b  upplied callback
14740 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c 74   with the result
14750 20 72 6f 77 20 64 61 74 61 20 2a 2f 0a 20 20 20   row data */.   
14760 20 20 20 20 20 20 20 69 66 28 20 73 68 65 6c 6c         if( shell
14770 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20  _callback(pArg, 
14780 6e 43 6f 6c 2c 20 61 7a 56 61 6c 73 2c 20 61 7a  nCol, azVals, az
14790 43 6f 6c 73 2c 20 61 69 54 79 70 65 73 29 20 29  Cols, aiTypes) )
147a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
147b0 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b   = SQLITE_ABORT;
147c0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
147d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
147e0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
147f0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
14800 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
14810 20 20 20 20 7d 20 77 68 69 6c 65 28 20 53 51 4c      } while( SQL
14820 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 3b  ITE_ROW == rc );
14830 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
14840 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20  ree(pData);.    
14850 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
14860 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
14870 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
14880 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
14890 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
148a0 73 73 20 53 51 4c 20 69 66 20 74 68 65 20 70 72  ss SQL if the pr
148b0 65 76 69 6f 75 73 20 73 68 65 6c 6c 20 63 6f 6d  evious shell com
148c0 6d 61 6e 64 0a 2a 2a 20 77 61 73 20 22 2e 65 78  mand.** was ".ex
148d0 70 65 72 74 22 2e 20 49 74 20 70 61 73 73 65 73  pert". It passes
148e0 20 74 68 65 20 53 51 4c 20 69 6e 20 74 68 65 20   the SQL in the 
148f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
14900 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 74  directly to.** t
14910 68 65 20 73 71 6c 69 74 65 33 65 78 70 65 72 74  he sqlite3expert
14920 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 49   object..**.** I
14930 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
14940 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
14950 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
14960 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a  an SQLite error.
14970 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74 68 69 73  ** code. In this
14980 20 63 61 73 65 2c 20 28 2a 70 7a 45 72 72 29 20   case, (*pzErr) 
14990 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f  may be set to po
149a0 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
149b0 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e  containing.** an
149c0 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
149d0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
149e0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
149f0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
14a00 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
14a10 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68  entually free th
14a20 69 73 20 62 75 66 66 65 72 20 75 73 69 6e 67 20  is buffer using 
14a30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
14a40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
14a50 70 65 72 74 48 61 6e 64 6c 65 53 51 4c 28 0a 20  pertHandleSQL(. 
14a60 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74   ShellState *pSt
14a70 61 74 65 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  ate, .  const ch
14a80 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 63 68 61  ar *zSql, .  cha
14a90 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 61  r **pzErr.){.  a
14aa0 73 73 65 72 74 28 20 70 53 74 61 74 65 2d 3e 65  ssert( pState->e
14ab0 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 29 3b  xpert.pExpert );
14ac0 0a 20 20 61 73 73 65 72 74 28 20 70 7a 45 72 72  .  assert( pzErr
14ad0 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30  ==0 || *pzErr==0
14ae0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
14af0 69 74 65 33 5f 65 78 70 65 72 74 5f 73 71 6c 28  ite3_expert_sql(
14b00 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
14b10 45 78 70 65 72 74 2c 20 7a 53 71 6c 2c 20 70 7a  Expert, zSql, pz
14b20 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Err);.}../*.** T
14b30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
14b40 63 61 6c 6c 65 64 20 65 69 74 68 65 72 20 74 6f  called either to
14b50 20 73 69 6c 65 6e 74 6c 79 20 63 6c 65 61 6e 20   silently clean 
14b60 75 70 20 74 68 65 20 6f 62 6a 65 63 74 0a 2a 2a  up the object.**
14b70 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
14b80 22 2e 65 78 70 65 72 74 22 20 63 6f 6d 6d 61 6e  ".expert" comman
14b90 64 20 28 69 66 20 62 43 61 6e 63 65 6c 3d 3d 31  d (if bCancel==1
14ba0 29 2c 20 6f 72 20 74 6f 20 67 65 6e 65 72 61 74  ), or to generat
14bb0 65 20 61 20 0a 2a 2a 20 72 65 70 6f 72 74 20 66  e a .** report f
14bc0 72 6f 6d 20 69 74 20 61 6e 64 20 74 68 65 6e 20  rom it and then 
14bd0 63 6c 65 61 6e 20 69 74 20 75 70 20 28 69 66 20  clean it up (if 
14be0 62 43 61 6e 63 65 6c 3d 3d 30 29 2e 0a 2a 2a 0a  bCancel==0)..**.
14bf0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
14c00 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
14c10 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
14c20 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
14c30 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20  ror.** code. In 
14c40 74 68 69 73 20 63 61 73 65 2c 20 28 2a 70 7a 45  this case, (*pzE
14c50 72 72 29 20 6d 61 79 20 62 65 20 73 65 74 20 74  rr) may be set t
14c60 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
14c70 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  fer containing.*
14c80 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e  * an English lan
14c90 67 75 61 67 65 20 65 72 72 6f 72 20 6d 65 73 73  guage error mess
14ca0 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  age. It is the r
14cb0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
14cc0 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74   the.** caller t
14cd0 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  o eventually fre
14ce0 65 20 74 68 69 73 20 62 75 66 66 65 72 20 75 73  e this buffer us
14cf0 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
14d00 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
14d10 74 20 65 78 70 65 72 74 46 69 6e 69 73 68 28 0a  t expertFinish(.
14d20 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
14d30 74 61 74 65 2c 0a 20 20 69 6e 74 20 62 43 61 6e  tate,.  int bCan
14d40 63 65 6c 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  cel,.  char **pz
14d50 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  Err.){.  int rc 
14d60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
14d70 71 6c 69 74 65 33 65 78 70 65 72 74 20 2a 70 20  qlite3expert *p 
14d80 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74  = pState->expert
14d90 2e 70 45 78 70 65 72 74 3b 0a 20 20 61 73 73 65  .pExpert;.  asse
14da0 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72  rt( p );.  asser
14db0 74 28 20 62 43 61 6e 63 65 6c 20 7c 7c 20 70 7a  t( bCancel || pz
14dc0 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72  Err==0 || *pzErr
14dd0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 62 43 61  ==0 );.  if( bCa
14de0 6e 63 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 46  ncel==0 ){.    F
14df0 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53 74 61 74  ILE *out = pStat
14e00 65 2d 3e 6f 75 74 3b 0a 20 20 20 20 69 6e 74 20  e->out;.    int 
14e10 62 56 65 72 62 6f 73 65 20 3d 20 70 53 74 61 74  bVerbose = pStat
14e20 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62 6f  e->expert.bVerbo
14e30 73 65 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  se;..    rc = sq
14e40 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 61 6e 61  lite3_expert_ana
14e50 6c 79 7a 65 28 70 2c 20 70 7a 45 72 72 29 3b 0a  lyze(p, pzErr);.
14e60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14e70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
14e80 6e 74 20 6e 51 75 65 72 79 20 3d 20 73 71 6c 69  nt nQuery = sqli
14e90 74 65 33 5f 65 78 70 65 72 74 5f 63 6f 75 6e 74  te3_expert_count
14ea0 28 70 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  (p);.      int i
14eb0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 62 56 65  ;..      if( bVe
14ec0 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20  rbose ){.       
14ed0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61   const char *zCa
14ee0 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  nd = sqlite3_exp
14ef0 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 30 2c 45  ert_report(p,0,E
14f00 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 43 41 4e  XPERT_REPORT_CAN
14f10 44 49 44 41 54 45 53 29 3b 0a 20 20 20 20 20 20  DIDATES);.      
14f20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
14f30 2c 20 22 2d 2d 20 43 61 6e 64 69 64 61 74 65 73  , "-- Candidates
14f40 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
14f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  --------------\n
14f60 22 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  ");.        raw_
14f70 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c  printf(out, "%s\
14f80 6e 22 2c 20 7a 43 61 6e 64 29 3b 0a 20 20 20 20  n", zCand);.    
14f90 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
14fa0 30 3b 20 69 3c 6e 51 75 65 72 79 3b 20 69 2b 2b  0; i<nQuery; i++
14fb0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
14fc0 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71   char *zSql = sq
14fd0 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70  lite3_expert_rep
14fe0 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45 52 54  ort(p, i, EXPERT
14ff0 5f 52 45 50 4f 52 54 5f 53 51 4c 29 3b 0a 20 20  _REPORT_SQL);.  
15000 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
15010 20 2a 7a 49 64 78 20 3d 20 73 71 6c 69 74 65 33   *zIdx = sqlite3
15020 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70  _expert_report(p
15030 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f  , i, EXPERT_REPO
15040 52 54 5f 49 4e 44 45 58 45 53 29 3b 0a 20 20 20  RT_INDEXES);.   
15050 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
15060 2a 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33 5f  *zEQP = sqlite3_
15070 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c  expert_report(p,
15080 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f 52   i, EXPERT_REPOR
15090 54 5f 50 4c 41 4e 29 3b 0a 20 20 20 20 20 20 20  T_PLAN);.       
150a0 20 69 66 28 20 7a 49 64 78 3d 3d 30 20 29 20 7a   if( zIdx==0 ) z
150b0 49 64 78 20 3d 20 22 28 6e 6f 20 6e 65 77 20 69  Idx = "(no new i
150c0 6e 64 65 78 65 73 29 5c 6e 22 3b 0a 20 20 20 20  ndexes)\n";.    
150d0 20 20 20 20 69 66 28 20 62 56 65 72 62 6f 73 65      if( bVerbose
150e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61   ){.          ra
150f0 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d  w_printf(out, "-
15100 2d 20 51 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d  - Query %d -----
15110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 69  -----------\n",i
15130 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  +1);.          r
15140 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
15150 25 73 5c 6e 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a  %s\n\n", zSql);.
15160 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15170 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
15180 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 64 78 29 3b  , "%s\n", zIdx);
15190 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
151a0 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  ntf(out, "%s\n",
151b0 20 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 7d 0a   zEQP);.      }.
151c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
151d0 74 65 33 5f 65 78 70 65 72 74 5f 64 65 73 74 72  te3_expert_destr
151e0 6f 79 28 70 29 3b 0a 20 20 70 53 74 61 74 65 2d  oy(p);.  pState-
151f0 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20  >expert.pExpert 
15200 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
15210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
15220 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 65  mentation of ".e
15230 78 70 65 72 74 22 20 64 6f 74 20 63 6f 6d 6d 61  xpert" dot comma
15240 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
15250 74 20 65 78 70 65 72 74 44 6f 74 43 6f 6d 6d 61  t expertDotComma
15260 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  nd(.  ShellState
15270 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20 20   *pState,       
15280 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
15290 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74   shell tool stat
152a0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  e */.  char **az
152b0 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
152c0 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
152d0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  of arguments pas
152e0 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61  sed to dot comma
152f0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  nd */.  int nArg
15300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15310 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15320 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
15330 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20  azArg[] */.){.  
15340 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15350 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  OK;.  char *zErr
15360 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
15370 20 69 6e 74 20 69 53 61 6d 70 6c 65 20 3d 20 30   int iSample = 0
15380 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 74  ;..  assert( pSt
15390 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70  ate->expert.pExp
153a0 65 72 74 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73  ert==0 );.  mems
153b0 65 74 28 26 70 53 74 61 74 65 2d 3e 65 78 70 65  et(&pState->expe
153c0 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  rt, 0, sizeof(Ex
153d0 70 65 72 74 49 6e 66 6f 29 29 3b 0a 0a 20 20 66  pertInfo));..  f
153e0 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49  or(i=1; rc==SQLI
153f0 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41 72 67 3b  TE_OK && i<nArg;
15400 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
15410 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20  *z = azArg[i];. 
15420 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66     int n;.    if
15430 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a  ( z[0]=='-' && z
15440 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a  [1]=='-' ) z++;.
15450 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30      n = strlen30
15460 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d  (z);.    if( n>=
15470 32 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28  2 && 0==strncmp(
15480 7a 2c 20 22 2d 76 65 72 62 6f 73 65 22 2c 20 6e  z, "-verbose", n
15490 29 20 29 7b 0a 20 20 20 20 20 20 70 53 74 61 74  ) ){.      pStat
154a0 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62 6f  e->expert.bVerbo
154b0 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  se = 1;.    }.  
154c0 20 20 65 6c 73 65 20 69 66 28 20 6e 3e 3d 32 20    else if( n>=2 
154d0 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28 7a 2c  && 0==strncmp(z,
154e0 20 22 2d 73 61 6d 70 6c 65 22 2c 20 6e 29 20 29   "-sample", n) )
154f0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 28  {.      if( i==(
15500 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20  nArg-1) ){.     
15510 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
15520 64 65 72 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65  derr, "option re
15530 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65  quires an argume
15540 6e 74 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  nt: %s\n", z);. 
15550 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
15560 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
15570 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
15580 53 61 6d 70 6c 65 20 3d 20 28 69 6e 74 29 69 6e  Sample = (int)in
15590 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
155a0 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  [++i]);.        
155b0 69 66 28 20 69 53 61 6d 70 6c 65 3c 30 20 7c 7c  if( iSample<0 ||
155c0 20 69 53 61 6d 70 6c 65 3e 31 30 30 20 29 7b 0a   iSample>100 ){.
155d0 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
155e0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 76 61  intf(stderr, "va
155f0 6c 75 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  lue out of range
15600 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 69  : %s\n", azArg[i
15610 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ]);.          rc
15620 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
15630 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15640 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73   }.    }.    els
15650 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
15660 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b  ntf(stderr, "unk
15670 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c  nown option: %s\
15680 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 63  n", z);.      rc
15690 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
156a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
156b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
156c0 29 7b 0a 20 20 20 20 70 53 74 61 74 65 2d 3e 65  ){.    pState->e
156d0 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 3d 20  xpert.pExpert = 
156e0 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 6e  sqlite3_expert_n
156f0 65 77 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26  ew(pState->db, &
15700 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 70  zErr);.    if( p
15710 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45  State->expert.pE
15720 78 70 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  xpert==0 ){.    
15730 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
15740 65 72 72 2c 20 22 73 71 6c 69 74 65 33 5f 65 78  err, "sqlite3_ex
15750 70 65 72 74 5f 6e 65 77 3a 20 25 73 5c 6e 22 2c  pert_new: %s\n",
15760 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 72 63   zErr);.      rc
15770 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
15780 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15790 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74    sqlite3_expert
157a0 5f 63 6f 6e 66 69 67 28 0a 20 20 20 20 20 20 20  _config(.       
157b0 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72     pState->exper
157c0 74 2e 70 45 78 70 65 72 74 2c 20 45 58 50 45 52  t.pExpert, EXPER
157d0 54 5f 43 4f 4e 46 49 47 5f 53 41 4d 50 4c 45 2c  T_CONFIG_SAMPLE,
157e0 20 69 53 61 6d 70 6c 65 0a 20 20 20 20 20 20 29   iSample.      )
157f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
15800 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
15810 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  if /* ifndef SQL
15820 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
15830 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
15840 45 78 65 63 75 74 65 20 61 20 73 74 61 74 65 6d  Execute a statem
15850 65 6e 74 20 6f 72 20 73 65 74 20 6f 66 20 73 74  ent or set of st
15860 61 74 65 6d 65 6e 74 73 2e 20 20 50 72 69 6e 74  atements.  Print
15870 0a 2a 2a 20 61 6e 79 20 72 65 73 75 6c 74 20 72  .** any result r
15880 6f 77 73 2f 63 6f 6c 75 6d 6e 73 20 64 65 70 65  ows/columns depe
15890 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 63 75 72  nding on the cur
158a0 72 65 6e 74 20 6d 6f 64 65 0a 2a 2a 20 73 65 74  rent mode.** set
158b0 20 76 69 61 20 74 68 65 20 73 75 70 70 6c 69 65   via the supplie
158c0 64 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  d callback..**.*
158d0 2a 20 54 68 69 73 20 69 73 20 76 65 72 79 20 73  * This is very s
158e0 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c 69 74 65  imilar to SQLite
158f0 27 73 20 62 75 69 6c 74 2d 69 6e 20 73 71 6c 69  's built-in sqli
15900 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66 75  te3_exec().** fu
15910 6e 63 74 69 6f 6e 20 65 78 63 65 70 74 20 69 74  nction except it
15920 20 74 61 6b 65 73 20 61 20 73 6c 69 67 68 74 6c   takes a slightl
15930 79 20 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c  y different call
15940 62 61 63 6b 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c  back.** and call
15950 62 61 63 6b 20 64 61 74 61 20 61 72 67 75 6d 65  back data argume
15960 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
15970 74 20 73 68 65 6c 6c 5f 65 78 65 63 28 0a 20 20  t shell_exec(.  
15980 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67  ShellState *pArg
15990 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
159a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
159b0 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61  nter to ShellSta
159c0 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  te */.  const ch
159d0 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20  ar *zSql,       
159e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159f0 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20 65    /* SQL to be e
15a00 76 61 6c 75 61 74 65 64 20 2a 2f 0a 20 20 63 68  valuated */.  ch
15a10 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20  ar **pzErrMsg   
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a30 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
15a40 20 6d 73 67 20 77 72 69 74 74 65 6e 20 68 65 72   msg written her
15a50 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
15a60 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
15a70 4e 55 4c 4c 3b 20 20 20 20 20 2f 2a 20 53 74 61  NULL;     /* Sta
15a80 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74  tement to execut
15a90 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  e. */.  int rc =
15aa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
15ab0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
15ac0 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
15ad0 72 63 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rc2;.  const cha
15ae0 72 20 2a 7a 4c 65 66 74 6f 76 65 72 3b 20 20 20  r *zLeftover;   
15af0 20 20 20 20 20 20 20 2f 2a 20 54 61 69 6c 20 6f         /* Tail o
15b00 66 20 75 6e 70 72 6f 63 65 73 73 65 64 20 53 51  f unprocessed SQ
15b10 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  L */.  sqlite3 *
15b20 64 62 20 3d 20 70 41 72 67 2d 3e 64 62 3b 0a 0a  db = pArg->db;..
15b30 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29    if( pzErrMsg )
15b40 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20  {.    *pzErrMsg 
15b50 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 23 69 66  = NULL;.  }..#if
15b60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15b70 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
15b80 69 66 28 20 70 41 72 67 2d 3e 65 78 70 65 72 74  if( pArg->expert
15b90 2e 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20 20  .pExpert ){.    
15ba0 72 63 20 3d 20 65 78 70 65 72 74 48 61 6e 64 6c  rc = expertHandl
15bb0 65 53 51 4c 28 70 41 72 67 2c 20 7a 53 71 6c 2c  eSQL(pArg, zSql,
15bc0 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   pzErrMsg);.    
15bd0 72 65 74 75 72 6e 20 65 78 70 65 72 74 46 69 6e  return expertFin
15be0 69 73 68 28 70 41 72 67 2c 20 28 72 63 21 3d 53  ish(pArg, (rc!=S
15bf0 51 4c 49 54 45 5f 4f 4b 29 2c 20 70 7a 45 72 72  QLITE_OK), pzErr
15c00 4d 73 67 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Msg);.  }.#endif
15c10 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c 5b  ..  while( zSql[
15c20 30 5d 20 26 26 20 28 53 51 4c 49 54 45 5f 4f 4b  0] && (SQLITE_OK
15c30 20 3d 3d 20 72 63 29 20 29 7b 0a 20 20 20 20 73   == rc) ){.    s
15c40 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
15c50 20 2a 7a 53 74 6d 74 53 71 6c 3b 0a 20 20 20 20   *zStmtSql;.    
15c60 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
15c70 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
15c80 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a  , -1, &pStmt, &z
15c90 4c 65 66 74 6f 76 65 72 29 3b 0a 20 20 20 20 69  Leftover);.    i
15ca0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 20 21 3d 20  f( SQLITE_OK != 
15cb0 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rc ){.      if( 
15cc0 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  pzErrMsg ){.    
15cd0 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
15ce0 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62 29  save_err_msg(db)
15cf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
15d00 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
15d10 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
15d20 20 2f 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73   /* this happens
15d30 20 66 6f 72 20 61 20 63 6f 6d 6d 65 6e 74 20 6f   for a comment o
15d40 72 20 77 68 69 74 65 2d 73 70 61 63 65 20 2a 2f  r white-space */
15d50 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  .        zSql = 
15d60 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20 20  zLeftover;.     
15d70 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63     while( IsSpac
15d80 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71  e(zSql[0]) ) zSq
15d90 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  l++;.        con
15da0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
15db0 20 20 20 20 20 7a 53 74 6d 74 53 71 6c 20 3d 20       zStmtSql = 
15dc0 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d  sqlite3_sql(pStm
15dd0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53  t);.      if( zS
15de0 74 6d 74 53 71 6c 3d 3d 30 20 29 20 7a 53 74 6d  tmtSql==0 ) zStm
15df0 74 53 71 6c 20 3d 20 22 22 3b 0a 20 20 20 20 20  tSql = "";.     
15e00 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28   while( IsSpace(
15e10 7a 53 74 6d 74 53 71 6c 5b 30 5d 29 20 29 20 7a  zStmtSql[0]) ) z
15e20 53 74 6d 74 53 71 6c 2b 2b 3b 0a 0a 20 20 20 20  StmtSql++;..    
15e30 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 74 68    /* save off th
15e40 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 6d  e prepared statm
15e50 65 6e 74 20 68 61 6e 64 6c 65 20 61 6e 64 20 72  ent handle and r
15e60 65 73 65 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a  eset row count *
15e70 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67  /.      if( pArg
15e80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67   ){.        pArg
15e90 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b  ->pStmt = pStmt;
15ea0 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63  .        pArg->c
15eb0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  nt = 0;.      }.
15ec0 0a 20 20 20 20 20 20 2f 2a 20 65 63 68 6f 20 74  .      /* echo t
15ed0 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74  he sql statement
15ee0 20 69 66 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a 20   if echo on */. 
15ef0 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26       if( pArg &&
15f00 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 41   ShellHasFlag(pA
15f10 72 67 2c 20 53 48 46 4c 47 5f 45 63 68 6f 29 20  rg, SHFLG_Echo) 
15f20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
15f30 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
15f40 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 74 6d 74 53  , "%s\n", zStmtS
15f50 71 6c 20 3f 20 7a 53 74 6d 74 53 71 6c 20 3a 20  ql ? zStmtSql : 
15f60 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  zSql);.      }..
15f70 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 74 68        /* Show th
15f80 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  e EXPLAIN QUERY 
15f90 50 4c 41 4e 20 69 66 20 2e 65 71 70 20 69 73 20  PLAN if .eqp is 
15fa0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  on */.      if( 
15fb0 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 61 75  pArg && pArg->au
15fc0 74 6f 45 51 50 20 26 26 20 73 71 6c 69 74 65 33  toEQP && sqlite3
15fd0 5f 73 74 72 6c 69 6b 65 28 22 45 58 50 4c 41 49  _strlike("EXPLAI
15fe0 4e 25 22 2c 7a 53 74 6d 74 53 71 6c 2c 30 29 21  N%",zStmtSql,0)!
15ff0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
16000 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70  lite3_stmt *pExp
16010 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 63 68  lain;.        ch
16020 61 72 20 2a 7a 45 51 50 3b 0a 20 20 20 20 20 20  ar *zEQP;.      
16030 20 20 69 6e 74 20 74 72 69 67 67 65 72 45 51 50    int triggerEQP
16040 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 64 69   = 0;.        di
16050 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63  sable_debug_trac
16060 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20  e_modes();.     
16070 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f     sqlite3_db_co
16080 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  nfig(db, SQLITE_
16090 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52  DBCONFIG_TRIGGER
160a0 5f 45 51 50 2c 20 2d 31 2c 20 26 74 72 69 67 67  _EQP, -1, &trigg
160b0 65 72 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20  erEQP);.        
160c0 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51  if( pArg->autoEQ
160d0 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67  P>=AUTOEQP_trigg
160e0 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
160f0 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
16100 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43  g(db, SQLITE_DBC
16110 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51  ONFIG_TRIGGER_EQ
16120 50 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  P, 1, 0);.      
16130 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 45 51 50    }.        zEQP
16140 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
16150 74 66 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52  tf("EXPLAIN QUER
16160 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53 74 6d  Y PLAN %s", zStm
16170 74 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72  tSql);.        r
16180 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
16190 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c  are_v2(db, zEQP,
161a0 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20   -1, &pExplain, 
161b0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
161c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
161d0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
161e0 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
161f0 45 78 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45  Explain)==SQLITE
16200 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
16210 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
16220 7a 45 51 50 4c 69 6e 65 20 3d 20 28 63 6f 6e 73  zEQPLine = (cons
16230 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
16240 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70  column_text(pExp
16250 6c 61 69 6e 2c 33 29 3b 0a 20 20 20 20 20 20 20  lain,3);.       
16260 20 20 20 20 20 69 6e 74 20 69 45 71 70 49 64 20       int iEqpId 
16270 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
16280 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30  _int(pExplain, 0
16290 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
162a0 6e 74 20 69 50 61 72 65 6e 74 49 64 20 3d 20 73  nt iParentId = s
162b0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
162c0 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a  t(pExplain, 1);.
162d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
162e0 7a 45 51 50 4c 69 6e 65 5b 30 5d 3d 3d 27 2d 27  zEQPLine[0]=='-'
162f0 20 29 20 65 71 70 5f 72 65 6e 64 65 72 28 70 41   ) eqp_render(pA
16300 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rg);.           
16310 20 65 71 70 5f 61 70 70 65 6e 64 28 70 41 72 67   eqp_append(pArg
16320 2c 20 69 45 71 70 49 64 2c 20 69 50 61 72 65 6e  , iEqpId, iParen
16330 74 49 64 2c 20 7a 45 51 50 4c 69 6e 65 29 3b 0a  tId, zEQPLine);.
16340 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16350 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72        eqp_render
16360 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20  (pArg);.        
16370 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
16380 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c  3_finalize(pExpl
16390 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ain);.        sq
163a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 51 50 29  lite3_free(zEQP)
163b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  ;.        if( pA
163c0 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54  rg->autoEQP>=AUT
163d0 4f 45 51 50 5f 66 75 6c 6c 20 29 7b 0a 20 20 20  OEQP_full ){.   
163e0 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 64         /* Also d
163f0 6f 20 61 6e 20 45 58 50 4c 41 49 4e 20 66 6f 72  o an EXPLAIN for
16400 20 22 2e 65 71 70 20 66 75 6c 6c 22 20 6d 6f 64   ".eqp full" mod
16410 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a  e */.          z
16420 45 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  EQP = sqlite3_mp
16430 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 25  rintf("EXPLAIN %
16440 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20  s", zStmtSql);. 
16450 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
16460 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
16470 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26  (db, zEQP, -1, &
16480 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
16490 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
164a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
164b0 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63           pArg->c
164c0 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c  Mode = MODE_Expl
164d0 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ain;.           
164e0 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72   explain_data_pr
164f0 65 70 61 72 65 28 70 41 72 67 2c 20 70 45 78 70  epare(pArg, pExp
16500 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  lain);.         
16510 20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64     exec_prepared
16520 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 45 78 70  _stmt(pArg, pExp
16530 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  lain);.         
16540 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f     explain_data_
16550 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a 20 20  delete(pArg);.  
16560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16570 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
16580 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a  lize(pExplain);.
16590 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
165a0 33 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20  3_free(zEQP);.  
165b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
165c0 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51  if( pArg->autoEQ
165d0 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67  P>=AUTOEQP_trigg
165e0 65 72 20 26 26 20 74 72 69 67 67 65 72 45 51 50  er && triggerEQP
165f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
16600 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
16610 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  ig(db, SQLITE_DB
16620 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45  CONFIG_TRIGGER_E
16630 51 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  QP, 0, 0);.     
16640 20 20 20 20 20 2f 2a 20 52 65 70 72 65 70 61 72       /* Reprepar
16650 65 20 70 53 74 6d 74 20 62 65 66 6f 72 65 20 72  e pStmt before r
16660 65 61 63 74 69 76 69 6e 67 20 74 72 61 63 65 20  eactiving trace 
16670 6d 6f 64 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  modes */.       
16680 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
16690 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
166a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
166b0 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
166c0 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
166d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
166e0 20 70 41 72 67 20 29 20 70 41 72 67 2d 3e 70 53   pArg ) pArg->pS
166f0 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20  tmt = pStmt;.   
16700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
16710 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61  estore_debug_tra
16720 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20  ce_modes();.    
16730 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
16740 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Arg ){.        p
16750 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 70 41 72  Arg->cMode = pAr
16760 67 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  g->mode;.       
16770 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45   if( pArg->autoE
16780 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20  xplain ){.      
16790 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
167a0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
167b0 6d 74 29 3d 3d 38 0a 20 20 20 20 20 20 20 20 20  mt)==8.         
167c0 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72    && sqlite3_str
167d0 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e 25 22 2c  like("EXPLAIN%",
167e0 20 7a 53 74 6d 74 53 71 6c 2c 30 29 3d 3d 30 0a   zStmtSql,0)==0.
167f0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
16800 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63           pArg->c
16810 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c  Mode = MODE_Expl
16820 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ain;.          }
16830 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
16840 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
16850 75 6e 74 28 70 53 74 6d 74 29 3d 3d 34 0a 20 20  unt(pStmt)==4.  
16860 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
16870 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 45 58 50  te3_strlike("EXP
16880 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 25  LAIN QUERY PLAN%
16890 22 2c 20 7a 53 74 6d 74 53 71 6c 2c 30 29 3d 3d  ", zStmtSql,0)==
168a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
168b0 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d   pArg->cMode = M
168c0 4f 44 45 5f 45 51 50 3b 0a 20 20 20 20 20 20 20  ODE_EQP;.       
168d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
168e0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
168f0 65 20 73 68 65 6c 6c 20 69 73 20 63 75 72 72 65  e shell is curre
16900 6e 74 6c 79 20 69 6e 20 22 2e 65 78 70 6c 61 69  ntly in ".explai
16910 6e 22 20 6d 6f 64 65 2c 20 67 61 74 68 65 72 20  n" mode, gather 
16920 74 68 65 20 65 78 74 72 61 0a 20 20 20 20 20 20  the extra.      
16930 20 20 2a 2a 20 64 61 74 61 20 72 65 71 75 69 72    ** data requir
16940 65 64 20 74 6f 20 61 64 64 20 69 6e 64 65 6e 74  ed to add indent
16950 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  s to the output.
16960 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
16970 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45  Arg->cMode==MODE
16980 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  _Explain ){.    
16990 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61        explain_da
169a0 74 61 5f 70 72 65 70 61 72 65 28 70 41 72 67 2c  ta_prepare(pArg,
169b0 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20   pStmt);.       
169c0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
169d0 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f    exec_prepared_
169e0 73 74 6d 74 28 70 41 72 67 2c 20 70 53 74 6d 74  stmt(pArg, pStmt
169f0 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
16a00 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70 41 72  _data_delete(pAr
16a10 67 29 3b 0a 20 20 20 20 20 20 65 71 70 5f 72 65  g);.      eqp_re
16a20 6e 64 65 72 28 70 41 72 67 29 3b 0a 0a 20 20 20  nder(pArg);..   
16a30 20 20 20 2f 2a 20 70 72 69 6e 74 20 75 73 61 67     /* print usag
16a40 65 20 73 74 61 74 73 20 69 66 20 73 74 61 74 73  e stats if stats
16a50 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28   on */.      if(
16a60 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73   pArg && pArg->s
16a70 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20 20  tatsOn ){.      
16a80 20 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73 28    display_stats(
16a90 64 62 2c 20 70 41 72 67 2c 20 30 29 3b 0a 20 20  db, pArg, 0);.  
16aa0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
16ab0 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f 75 6e 74  print loop-count
16ac0 65 72 73 20 69 66 20 72 65 71 75 69 72 65 64 20  ers if required 
16ad0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
16ae0 67 20 26 26 20 70 41 72 67 2d 3e 73 63 61 6e 73  g && pArg->scans
16af0 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20 20  tatsOn ){.      
16b00 20 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73 74    display_scanst
16b10 61 74 73 28 64 62 2c 20 70 41 72 67 29 3b 0a 20  ats(db, pArg);. 
16b20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
16b30 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 73 74   Finalize the st
16b40 61 74 65 6d 65 6e 74 20 6a 75 73 74 20 65 78 65  atement just exe
16b50 63 75 74 65 64 2e 20 49 66 20 74 68 69 73 20 66  cuted. If this f
16b60 61 69 6c 73 2c 20 73 61 76 65 20 61 0a 20 20 20  ails, save a.   
16b70 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68     ** copy of th
16b80 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
16b90 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
16ba0 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74 20 74 6f  zSql to point to
16bb0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65   the.      ** ne
16bc0 78 74 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  xt statement to 
16bd0 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20 20 20  execute. */.    
16be0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
16bf0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
16c00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
16c10 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 72 63  QLITE_NOMEM ) rc
16c20 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 69 66   = rc2;.      if
16c30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16c40 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20  ){.        zSql 
16c50 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20  = zLeftover;.   
16c60 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70       while( IsSp
16c70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a  ace(zSql[0]) ) z
16c80 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  Sql++;.      }el
16c90 73 65 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20  se if( pzErrMsg 
16ca0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  ){.        *pzEr
16cb0 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72 5f  rMsg = save_err_
16cc0 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  msg(db);.      }
16cd0 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c 65 61 72  ..      /* clear
16ce0 20 73 61 76 65 64 20 73 74 6d 74 20 68 61 6e 64   saved stmt hand
16cf0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  le */.      if( 
16d00 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  pArg ){.        
16d10 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 4e 55  pArg->pStmt = NU
16d20 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LL;.      }.    
16d30 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20 77 68 69  }.  } /* end whi
16d40 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20  le */..  return 
16d50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
16d60 65 61 73 65 20 6d 65 6d 6f 72 79 20 70 72 65 76  ease memory prev
16d70 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
16d80 20 62 79 20 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c   by tableColumnL
16d90 69 73 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ist()..*/.static
16da0 20 76 6f 69 64 20 66 72 65 65 43 6f 6c 75 6d 6e   void freeColumn
16db0 4c 69 73 74 28 63 68 61 72 20 2a 2a 61 7a 43 6f  List(char **azCo
16dc0 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
16dd0 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d  or(i=1; azCol[i]
16de0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
16df0 74 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c 5b 69  te3_free(azCol[i
16e00 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 61 7a 43  ]);.  }.  /* azC
16e10 6f 6c 5b 30 5d 20 69 73 20 61 20 73 74 61 74 69  ol[0] is a stati
16e20 63 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 73 71  c string */.  sq
16e30 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c  lite3_free(azCol
16e40 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
16e50 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 6f 69  rn a list of poi
16e60 6e 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67 73  nters to strings
16e70 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20 6e   which are the n
16e80 61 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a 2a 20 63  ames of all.** c
16e90 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20  olumns in table 
16ea0 7a 54 61 62 2e 20 20 20 54 68 65 20 6d 65 6d 6f  zTab.   The memo
16eb0 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  ry to hold the n
16ec0 61 6d 65 73 20 69 73 20 64 79 6e 61 6d 69 63 61  ames is dynamica
16ed0 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  lly.** allocated
16ee0 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 65 6c   and must be rel
16ef0 65 61 73 65 64 20 62 79 20 74 68 65 20 63 61 6c  eased by the cal
16f00 6c 65 72 20 75 73 69 6e 67 20 61 20 73 75 62 73  ler using a subs
16f10 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74  equent call.** t
16f20 6f 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74  o freeColumnList
16f30 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 7a  ()..**.** The az
16f40 43 6f 6c 5b 30 5d 20 65 6e 74 72 79 20 69 73 20  Col[0] entry is 
16f50 75 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 48  usually NULL.  H
16f60 6f 77 65 76 65 72 2c 20 69 66 20 7a 54 61 62 20  owever, if zTab 
16f70 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77 69 64  contains a rowid
16f80 0a 2a 2a 20 76 61 6c 75 65 20 74 68 61 74 20 6e  .** value that n
16f90 65 65 64 73 20 74 6f 20 62 65 20 70 72 65 73 65  eeds to be prese
16fa0 72 76 65 64 2c 20 74 68 65 6e 20 61 7a 43 6f 6c  rved, then azCol
16fb0 5b 30 5d 20 69 73 20 66 69 6c 6c 65 64 20 69 6e  [0] is filled in
16fc0 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6e 61 6d   with the.** nam
16fd0 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 63  e of the rowid c
16fe0 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  olumn..**.** The
16ff0 20 66 69 72 73 74 20 72 65 67 75 6c 61 72 20 63   first regular c
17000 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62  olumn in the tab
17010 6c 65 20 69 73 20 61 7a 43 6f 6c 5b 31 5d 2e 20  le is azCol[1]. 
17020 20 54 68 65 20 6c 69 73 74 20 69 73 20 74 65 72   The list is ter
17030 6d 69 6e 61 74 65 64 0a 2a 2a 20 62 79 20 61 6e  minated.** by an
17040 20 65 6e 74 72 79 20 77 69 74 68 20 61 7a 43 6f   entry with azCo
17050 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74  l[i]==0..*/.stat
17060 69 63 20 63 68 61 72 20 2a 2a 74 61 62 6c 65 43  ic char **tableC
17070 6f 6c 75 6d 6e 4c 69 73 74 28 53 68 65 6c 6c 53  olumnList(ShellS
17080 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tate *p, const c
17090 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20 63 68  har *zTab){.  ch
170a0 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20 30 3b 0a  ar **azCol = 0;.
170b0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
170c0 70 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  pStmt;.  char *z
170d0 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  Sql;.  int nCol 
170e0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f  = 0;.  int nAllo
170f0 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 4b  c = 0;.  int nPK
17100 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
17110 75 6d 62 65 72 20 6f 66 20 50 52 49 4d 41 52 59  umber of PRIMARY
17120 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 73 65 65   KEY columns see
17130 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 50 4b  n */.  int isIPK
17140 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75   = 0;     /* Tru
17150 65 20 69 66 20 6f 6e 65 20 50 52 49 4d 41 52 59  e if one PRIMARY
17160 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   KEY column of t
17170 79 70 65 20 49 4e 54 45 47 45 52 20 2a 2f 0a 20  ype INTEGER */. 
17180 20 69 6e 74 20 70 72 65 73 65 72 76 65 52 6f 77   int preserveRow
17190 69 64 20 3d 20 53 68 65 6c 6c 48 61 73 46 6c 61  id = ShellHasFla
171a0 67 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73 65  g(p, SHFLG_Prese
171b0 72 76 65 52 6f 77 69 64 29 3b 0a 20 20 69 6e 74  rveRowid);.  int
171c0 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73   rc;..  zSql = s
171d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
171e0 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66  PRAGMA table_inf
171f0 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b 0a 20 20  o=%Q", zTab);.  
17200 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
17210 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
17220 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
17230 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
17240 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28  ree(zSql);.  if(
17250 20 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   rc ) return 0;.
17260 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
17270 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
17280 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
17290 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c 6c 6f 63  if( nCol>=nAlloc
172a0 2d 32 20 29 7b 0a 20 20 20 20 20 20 6e 41 6c 6c  -2 ){.      nAll
172b0 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32 20 2b 20  oc = nAlloc*2 + 
172c0 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20 20 20 20 20  nCol + 10;.     
172d0 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33   azCol = sqlite3
172e0 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f 6c 2c 20  _realloc(azCol, 
172f0 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 61 7a  nAlloc*sizeof(az
17300 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  Col[0]));.      
17310 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 73  if( azCol==0 ) s
17320 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
17330 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ry();.    }.    
17340 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d 20 3d 20  azCol[++nCol] = 
17350 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
17360 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f  "%s", sqlite3_co
17370 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
17380 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 73 71   1));.    if( sq
17390 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
173a0 28 70 53 74 6d 74 2c 20 35 29 20 29 7b 0a 20 20  (pStmt, 5) ){.  
173b0 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20 20 20 20      nPK++;.     
173c0 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20 20 20 20   if( nPK==1.    
173d0 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74     && sqlite3_st
173e0 72 69 63 6d 70 28 28 63 6f 6e 73 74 20 63 68 61  ricmp((const cha
173f0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
17400 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29 2c  n_text(pStmt,2),
17410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17420 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 54 45             "INTE
17430 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 29  GER")==0.      )
17440 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50 4b 20  {.        isIPK 
17450 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
17460 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50 4b 20  {.        isIPK 
17470 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
17480 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
17490 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
174a0 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30  ;.  if( azCol==0
174b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
174c0 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 61  zCol[0] = 0;.  a
174d0 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20 3d 20 30  zCol[nCol+1] = 0
174e0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 63 69  ;..  /* The deci
174f0 73 69 6f 6e 20 6f 66 20 77 68 65 74 68 65 72 20  sion of whether 
17500 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69 64 20 72  or not a rowid r
17510 65 61 6c 6c 79 20 6e 65 65 64 73 20 74 6f 20 62  eally needs to b
17520 65 20 70 72 65 73 65 72 76 65 64 0a 20 20 2a 2a  e preserved.  **
17530 20 69 73 20 74 72 69 63 6b 79 2e 20 20 57 65 20   is tricky.  We 
17540 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 70 72  never need to pr
17550 65 73 65 72 76 65 20 61 20 72 6f 77 69 64 20 66  eserve a rowid f
17560 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  or a WITHOUT ROW
17570 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 72  ID table.  ** or
17580 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 61 6e   a table with an
17590 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
175a0 20 4b 45 59 2e 20 20 57 65 20 61 72 65 20 75 6e   KEY.  We are un
175b0 61 62 6c 65 20 74 6f 20 70 72 65 73 65 72 76 65  able to preserve
175c0 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20 6f 6e 20  .  ** rowids on 
175d0 74 61 62 6c 65 73 20 77 68 65 72 65 20 74 68 65  tables where the
175e0 20 72 6f 77 69 64 20 69 73 20 69 6e 61 63 63 65   rowid is inacce
175f0 73 73 69 62 6c 65 20 62 65 63 61 75 73 65 20 74  ssible because t
17600 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 0a 20  here are other. 
17610 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   ** columns in t
17620 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22  he table named "
17630 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69 64 5f  rowid", "_rowid_
17640 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e 0a 20 20  ", and "oid"..  
17650 2a 2f 0a 20 20 69 66 28 20 70 72 65 73 65 72 76  */.  if( preserv
17660 65 52 6f 77 69 64 20 26 26 20 69 73 49 50 4b 20  eRowid && isIPK 
17670 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 73  ){.    /* If a s
17680 69 6e 67 6c 65 20 50 52 49 4d 41 52 59 20 4b 45  ingle PRIMARY KE
17690 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 74 79  Y column with ty
176a0 70 65 20 49 4e 54 45 47 45 52 20 77 61 73 20 73  pe INTEGER was s
176b0 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a 20 20 20  een, then it.   
176c0 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 61 6e 20   ** might be an 
176d0 61 6c 69 73 65 20 66 6f 72 20 74 68 65 20 52 4f  alise for the RO
176e0 57 49 44 2e 20 20 42 75 74 20 69 74 20 6d 69 67  WID.  But it mig
176f0 68 74 20 61 6c 73 6f 20 62 65 20 61 20 57 49 54  ht also be a WIT
17700 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 20 20 2a  HOUT ROWID.    *
17710 2a 20 74 61 62 6c 65 20 6f 72 20 61 20 49 4e 54  * table or a INT
17720 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
17730 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c 20 6e 65   DESC column, ne
17740 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 61  ither of which a
17750 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57 49 44 20  re.    ** ROWID 
17760 61 6c 69 61 73 65 73 2e 20 20 54 6f 20 64 69 73  aliases.  To dis
17770 74 69 6e 67 75 69 73 68 20 74 68 65 73 65 20 63  tinguish these c
17780 61 73 65 73 2c 20 63 68 65 63 6b 20 74 6f 20 73  ases, check to s
17790 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65  ee if.    ** the
177a0 72 65 20 69 73 20 61 20 22 70 6b 22 20 65 6e 74  re is a "pk" ent
177b0 72 79 20 69 6e 20 22 50 52 41 47 4d 41 20 69 6e  ry in "PRAGMA in
177c0 64 65 78 5f 6c 69 73 74 22 2e 20 20 54 68 65 72  dex_list".  Ther
177d0 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a  e will be.    **
177e0 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65 78 20 69   no "pk" index i
177f0 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
17800 59 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 61  Y really is an a
17810 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52 4f 57  lias for the ROW
17820 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a  ID..    */.    z
17830 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
17840 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 31 20  rintf("SELECT 1 
17850 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69 6e 64 65  FROM pragma_inde
17860 78 5f 6c 69 73 74 28 25 51 29 22 0a 20 20 20 20  x_list(%Q)".    
17870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17880 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6f         " WHERE o
17890 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20 7a 54 61  rigin='pk'", zTa
178a0 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  b);.    rc = sql
178b0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
178c0 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
178d0 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
178e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
178f0 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ql);.    if( rc 
17900 29 7b 0a 20 20 20 20 20 20 66 72 65 65 43 6f 6c  ){.      freeCol
17910 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b 0a  umnList(azCol);.
17920 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
17930 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
17940 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
17950 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
17960 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
17970 0a 20 20 20 20 70 72 65 73 65 72 76 65 52 6f 77  .    preserveRow
17980 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f  id = rc==SQLITE_
17990 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ROW;.  }.  if( p
179a0 72 65 73 65 72 76 65 52 6f 77 69 64 20 29 7b 0a  reserveRowid ){.
179b0 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70 72 65 73      /* Only pres
179c0 65 72 76 65 20 74 68 65 20 72 6f 77 69 64 20 69  erve the rowid i
179d0 66 20 77 65 20 63 61 6e 20 66 69 6e 64 20 61 20  f we can find a 
179e0 6e 61 6d 65 20 74 6f 20 75 73 65 20 66 6f 72 20  name to use for 
179f0 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64  the.    ** rowid
17a00 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
17a10 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b 5d 20 3d  har *azRowid[] =
17a20 20 7b 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f   { "rowid", "_ro
17a30 77 69 64 5f 22 2c 20 22 6f 69 64 22 20 7d 3b 0a  wid_", "oid" };.
17a40 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
17a50 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
17a60 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  j++){.      for(
17a70 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b 20 69 2b  i=1; i<=nCol; i+
17a80 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
17a90 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
17aa0 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a 43 6f 6c  azRowid[j],azCol
17ab0 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  [i])==0 ) break;
17ac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17ad0 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  f( i>nCol ){.   
17ae0 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
17af0 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74  point, we know t
17b00 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a 5d 20 69  hat azRowid[j] i
17b10 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f  s not the name o
17b20 66 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a  f any.        **
17b30 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c 75 6d 6e   ordinary column
17b40 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
17b50 56 65 72 69 66 79 20 74 68 61 74 20 61 7a 52 6f  Verify that azRo
17b60 77 69 64 5b 6a 5d 20 69 73 20 61 20 76 61 6c 69  wid[j] is a vali
17b70 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 61 6d  d.        ** nam
17b80 65 20 66 6f 72 20 74 68 65 20 72 6f 77 69 64 20  e for the rowid 
17b90 62 65 66 6f 72 65 20 61 64 64 69 6e 67 20 69 74  before adding it
17ba0 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e 20 20 57   to azCol[0].  W
17bb0 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 20  ITHOUT ROWID.   
17bc0 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 77       ** tables w
17bd0 69 6c 6c 20 66 61 69 6c 20 74 68 69 73 20 6c 61  ill fail this la
17be0 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20 20 20 20  st check */.    
17bf0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17c00 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
17c10 74 61 64 61 74 61 28 70 2d 3e 64 62 2c 30 2c 7a  tadata(p->db,0,z
17c20 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a 5d 2c 30  Tab,azRowid[j],0
17c30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20  ,0,0,0,0);.     
17c40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17c50 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b 30 5d 20  E_OK ) azCol[0] 
17c60 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b 0a 20 20  = azRowid[j];.  
17c70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17c80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
17c90 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c 3b 0a 7d   return azCol;.}
17ca0 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c 65 20 74  ../*.** Toggle t
17cb0 68 65 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64  he reverse_unord
17cc0 65 72 65 64 5f 73 65 6c 65 63 74 73 20 73 65 74  ered_selects set
17cd0 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ting..*/.static 
17ce0 76 6f 69 64 20 74 6f 67 67 6c 65 53 65 6c 65 63  void toggleSelec
17cf0 74 4f 72 64 65 72 28 73 71 6c 69 74 65 33 20 2a  tOrder(sqlite3 *
17d00 64 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  db){.  sqlite3_s
17d10 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
17d20 20 20 69 6e 74 20 69 53 65 74 74 69 6e 67 20 3d    int iSetting =
17d30 20 30 3b 0a 20 20 63 68 61 72 20 7a 53 74 6d 74   0;.  char zStmt
17d40 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  [100];.  sqlite3
17d50 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
17d60 22 50 52 41 47 4d 41 20 72 65 76 65 72 73 65 5f  "PRAGMA reverse_
17d70 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74  unordered_select
17d80 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  s", -1, &pStmt, 
17d90 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  0);.  if( sqlite
17da0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
17db0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
17dc0 20 69 53 65 74 74 69 6e 67 20 3d 20 73 71 6c 69   iSetting = sqli
17dd0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
17de0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Stmt, 0);.  }.  
17df0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
17e00 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74  (pStmt);.  sqlit
17e10 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
17e20 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53 74 6d 74  of(zStmt), zStmt
17e30 2c 0a 20 20 20 20 20 20 20 22 50 52 41 47 4d 41  ,.       "PRAGMA
17e40 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64 65 72   reverse_unorder
17e50 65 64 5f 73 65 6c 65 63 74 73 28 25 64 29 22 2c  ed_selects(%d)",
17e60 20 21 69 53 65 74 74 69 6e 67 29 3b 0a 20 20 73   !iSetting);.  s
17e70 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
17e80 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20 30 29 3b  zStmt, 0, 0, 0);
17e90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
17ea0 73 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 61  s a different ca
17eb0 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 75  llback routine u
17ec0 73 65 64 20 66 6f 72 20 64 75 6d 70 69 6e 67 20  sed for dumping 
17ed0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
17ee0 20 45 61 63 68 20 72 6f 77 20 72 65 63 65 69 76   Each row receiv
17ef0 65 64 20 62 79 20 74 68 69 73 20 63 61 6c 6c 62  ed by this callb
17f00 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ack consists of 
17f10 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a  a table name,.**
17f20 20 74 68 65 20 74 61 62 6c 65 20 74 79 70 65 20   the table type 
17f30 28 22 69 6e 64 65 78 22 20 6f 72 20 22 74 61 62  ("index" or "tab
17f40 6c 65 22 29 20 61 6e 64 20 53 51 4c 20 74 6f 20  le") and SQL to 
17f50 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
17f60 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
17f70 65 20 73 68 6f 75 6c 64 20 70 72 69 6e 74 20 74  e should print t
17f80 65 78 74 20 73 75 66 66 69 63 69 65 6e 74 20 74  ext sufficient t
17f90 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20 74  o recreate the t
17fa0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
17fb0 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  int dump_callbac
17fc0 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  k(void *pArg, in
17fd0 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  t nArg, char **a
17fe0 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 4e  zArg, char **azN
17ff0 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e 74 20 72  otUsed){.  int r
18000 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  c;.  const char 
18010 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f 6e 73 74  *zTable;.  const
18020 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20   char *zType;.  
18030 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
18040 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  ;.  ShellState *
18050 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 20  p = (ShellState 
18060 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e 55 53 45  *)pArg;..  UNUSE
18070 44 5f 50 41 52 41 4d 45 54 45 52 28 61 7a 4e 6f  D_PARAMETER(azNo
18080 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 6e 41  tUsed);.  if( nA
18090 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72 67 3d 3d  rg!=3 || azArg==
180a0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
180b0 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b 30  zTable = azArg[0
180c0 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20 61 7a 41  ];.  zType = azA
180d0 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20 3d 20  rg[1];.  zSql = 
180e0 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20 69 66 28  azArg[2];..  if(
180f0 20 73 74 72 63 6d 70 28 7a 54 61 62 6c 65 2c 20   strcmp(zTable, 
18100 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  "sqlite_sequence
18110 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77  ")==0 ){.    raw
18120 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
18130 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 71 6c  "DELETE FROM sql
18140 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c 6e 22  ite_sequence;\n"
18150 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
18160 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22  qlite3_strglob("
18170 73 71 6c 69 74 65 5f 73 74 61 74 3f 22 2c 20 7a  sqlite_stat?", z
18180 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Table)==0 ){.   
18190 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
181a0 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c  ut, "ANALYZE sql
181b0 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b  ite_master;\n");
181c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
181d0 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71  ncmp(zTable, "sq
181e0 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29 7b  lite_", 7)==0 ){
181f0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
18200 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63   }else if( strnc
18210 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45 41 54 45  mp(zSql, "CREATE
18220 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22 2c   VIRTUAL TABLE",
18230 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63   20)==0 ){.    c
18240 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20 20 20 69  har *zIns;.    i
18250 66 28 20 21 70 2d 3e 77 72 69 74 61 62 6c 65 53  f( !p->writableS
18260 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 72  chema ){.      r
18270 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
18280 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
18290 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c 6e 22  le_schema=ON;\n"
182a0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69 74  );.      p->writ
182b0 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 31 3b 0a  ableSchema = 1;.
182c0 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e 73 20 3d      }.    zIns =
182d0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
182e0 28 0a 20 20 20 20 20 20 20 22 49 4e 53 45 52 54  (.       "INSERT
182f0 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73   INTO sqlite_mas
18300 74 65 72 28 74 79 70 65 2c 6e 61 6d 65 2c 74 62  ter(type,name,tb
18310 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61 67 65 2c  l_name,rootpage,
18320 73 71 6c 29 22 0a 20 20 20 20 20 20 20 22 56 41  sql)".       "VA
18330 4c 55 45 53 28 27 74 61 62 6c 65 27 2c 27 25 71  LUES('table','%q
18340 27 2c 27 25 71 27 2c 30 2c 27 25 71 27 29 3b 22  ','%q',0,'%q');"
18350 2c 0a 20 20 20 20 20 20 20 7a 54 61 62 6c 65 2c  ,.       zTable,
18360 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c 29 3b 0a   zTable, zSql);.
18370 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
18380 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
18390 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  zIns);.    sqlit
183a0 65 33 5f 66 72 65 65 28 7a 49 6e 73 29 3b 0a 20  e3_free(zIns);. 
183b0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
183c0 65 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e 74 53  else{.    printS
183d0 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74  chemaLine(p->out
183e0 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22 29 3b 0a  , zSql, ";\n");.
183f0 20 20 7d 0a 0a 20 20 69 66 28 20 73 74 72 63 6d    }..  if( strcm
18400 70 28 7a 54 79 70 65 2c 20 22 74 61 62 6c 65 22  p(zType, "table"
18410 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c  )==0 ){.    Shel
18420 6c 54 65 78 74 20 73 53 65 6c 65 63 74 3b 0a 20  lText sSelect;. 
18430 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 54 61     ShellText sTa
18440 62 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a  ble;.    char **
18450 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 69  azCol;.    int i
18460 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 61 76 65  ;.    char *save
18470 64 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20  dDestTable;.    
18480 69 6e 74 20 73 61 76 65 64 4d 6f 64 65 3b 0a 0a  int savedMode;..
18490 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74 61 62 6c      azCol = tabl
184a0 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 2c 20 7a  eColumnList(p, z
184b0 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
184c0 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  azCol==0 ){.    
184d0 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20    p->nErr++;.   
184e0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
184f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79   }..    /* Alway
18500 73 20 71 75 6f 74 65 20 74 68 65 20 74 61 62 6c  s quote the tabl
18510 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20 69 66 20  e name, even if 
18520 69 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  it appears to be
18530 20 70 75 72 65 20 61 73 63 69 69 2c 0a 20 20 20   pure ascii,.   
18540 20 2a 2a 20 69 6e 20 63 61 73 65 20 69 74 20 69   ** in case it i
18550 73 20 61 20 6b 65 79 77 6f 72 64 2e 20 45 78 3a  s a keyword. Ex:
18560 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 22 74    INSERT INTO "t
18570 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a 20 20 20  able" ... */.   
18580 20 69 6e 69 74 54 65 78 74 28 26 73 54 61 62 6c   initText(&sTabl
18590 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  e);.    appendTe
185a0 78 74 28 26 73 54 61 62 6c 65 2c 20 7a 54 61 62  xt(&sTable, zTab
185b0 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28 7a 54  le, quoteChar(zT
185c0 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f 2a 20 49  able));.    /* I
185d0 66 20 70 72 65 73 65 72 76 69 6e 67 20 74 68 65  f preserving the
185e0 20 72 6f 77 69 64 2c 20 61 64 64 20 61 20 63 6f   rowid, add a co
185f0 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74 65 72 20  lumn list after 
18600 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a  the table name..
18610 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72 20      ** In other 
18620 77 6f 72 64 73 3a 20 20 22 49 4e 53 45 52 54 20  words:  "INSERT 
18630 49 4e 54 4f 20 74 61 62 28 72 6f 77 69 64 2c 61  INTO tab(rowid,a
18640 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c 55 45 53  ,b,c,...) VALUES
18650 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 69 6e  (...)".    ** in
18660 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
18670 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  al "INSERT INTO 
18680 74 61 62 20 56 41 4c 55 45 53 28 2e 2e 2e 29 22  tab VALUES(...)"
18690 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
186a0 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20   azCol[0] ){.   
186b0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
186c0 54 61 62 6c 65 2c 20 22 28 22 2c 20 30 29 3b 0a  Table, "(", 0);.
186d0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
186e0 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b  (&sTable, azCol[
186f0 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f  0], 0);.      fo
18700 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b  r(i=1; azCol[i];
18710 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   i++){.        a
18720 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c  ppendText(&sTabl
18730 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20  e, ",", 0);.    
18740 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
18750 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b 69 5d  sTable, azCol[i]
18760 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43 6f  , quoteChar(azCo
18770 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a  l[i]));.      }.
18780 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
18790 28 26 73 54 61 62 6c 65 2c 20 22 29 22 2c 20 30  (&sTable, ")", 0
187a0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
187b0 20 42 75 69 6c 64 20 61 6e 20 61 70 70 72 6f 70   Build an approp
187c0 72 69 61 74 65 20 53 45 4c 45 43 54 20 73 74 61  riate SELECT sta
187d0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
187e0 69 74 54 65 78 74 28 26 73 53 65 6c 65 63 74 29  itText(&sSelect)
187f0 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
18800 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45 4c 45  (&sSelect, "SELE
18810 43 54 20 22 2c 20 30 29 3b 0a 20 20 20 20 69 66  CT ", 0);.    if
18820 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20  ( azCol[0] ){.  
18830 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
18840 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b 30  sSelect, azCol[0
18850 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 70 70  ], 0);.      app
18860 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
18870 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 7d  , ",", 0);.    }
18880 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a  .    for(i=1; az
18890 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  Col[i]; i++){.  
188a0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
188b0 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b 69  sSelect, azCol[i
188c0 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43  ], quoteChar(azC
188d0 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20 69  ol[i]));.      i
188e0 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d 20 29 7b  f( azCol[i+1] ){
188f0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
18900 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2c  ext(&sSelect, ",
18910 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ", 0);.      }. 
18920 20 20 20 7d 0a 20 20 20 20 66 72 65 65 43 6f 6c     }.    freeCol
18930 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b 0a  umnList(azCol);.
18940 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
18950 73 53 65 6c 65 63 74 2c 20 22 20 46 52 4f 4d 20  sSelect, " FROM 
18960 22 2c 20 30 29 3b 0a 20 20 20 20 61 70 70 65 6e  ", 0);.    appen
18970 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
18980 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61  zTable, quoteCha
18990 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a 20 20 20  r(zTable));..   
189a0 20 73 61 76 65 64 44 65 73 74 54 61 62 6c 65 20   savedDestTable 
189b0 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 3b  = p->zDestTable;
189c0 0a 20 20 20 20 73 61 76 65 64 4d 6f 64 65 20 3d  .    savedMode =
189d0 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 70 2d   p->mode;.    p-
189e0 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 73 54  >zDestTable = sT
189f0 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70 2d 3e 6d  able.z;.    p->m
18a00 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64 65 20 3d  ode = p->cMode =
18a10 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20   MODE_Insert;.  
18a20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65 78 65    rc = shell_exe
18a30 63 28 70 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20  c(p, sSelect.z, 
18a40 30 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26  0);.    if( (rc&
18a50 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
18a60 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 72  RRUPT ){.      r
18a70 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
18a80 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55  , "/****** CORRU
18a90 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a  PTION ERROR ****
18aa0 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ***/\n");.      
18ab0 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64 65  toggleSelectOrde
18ac0 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  r(p->db);.      
18ad0 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c 20 73 53  shell_exec(p, sS
18ae0 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a 20 20 20  elect.z, 0);.   
18af0 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f     toggleSelectO
18b00 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20  rder(p->db);.   
18b10 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74 54   }.    p->zDestT
18b20 61 62 6c 65 20 3d 20 73 61 76 65 64 44 65 73 74  able = savedDest
18b30 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d 3e 6d 6f  Table;.    p->mo
18b40 64 65 20 3d 20 73 61 76 65 64 4d 6f 64 65 3b 0a  de = savedMode;.
18b50 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73 54      freeText(&sT
18b60 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 65 65 54  able);.    freeT
18b70 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20  ext(&sSelect);. 
18b80 20 20 20 69 66 28 20 72 63 20 29 20 70 2d 3e 6e     if( rc ) p->n
18b90 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  Err++;.  }.  ret
18ba0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
18bb0 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55 73 65  Run zQuery.  Use
18bc0 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 29   dump_callback()
18bd0 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   as the callback
18be0 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74   routine so that
18bf0 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
18c00 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 61 72   of the query ar
18c10 65 20 6f 75 74 70 75 74 20 61 73 20 53 51 4c 20  e output as SQL 
18c20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
18c30 2a 20 49 66 20 77 65 20 67 65 74 20 61 20 53 51  * If we get a SQ
18c40 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
18c50 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20 71 75  or, rerun the qu
18c60 65 72 79 20 61 66 74 65 72 20 61 70 70 65 6e 64  ery after append
18c70 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20 42 59  ing.** "ORDER BY
18c80 20 72 6f 77 69 64 20 44 45 53 43 22 20 74 6f 20   rowid DESC" to 
18c90 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74  the end..*/.stat
18ca0 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68 65 6d  ic int run_schem
18cb0 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20 20  a_dump_query(.  
18cc0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20  ShellState *p,. 
18cd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 75   const char *zQu
18ce0 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ery.){.  int rc;
18cf0 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  .  char *zErr = 
18d00 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
18d10 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51  3_exec(p->db, zQ
18d20 75 65 72 79 2c 20 64 75 6d 70 5f 63 61 6c 6c 62  uery, dump_callb
18d30 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a  ack, p, &zErr);.
18d40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18d50 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20  _CORRUPT ){.    
18d60 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20 20 69  char *zQ2;.    i
18d70 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33  nt len = strlen3
18d80 30 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 72  0(zQuery);.    r
18d90 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
18da0 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55  , "/****** CORRU
18db0 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a  PTION ERROR ****
18dc0 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 69 66  ***/\n");.    if
18dd0 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ( zErr ){.      
18de0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
18df0 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 25 73 20  ut, "/****** %s 
18e00 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72  ******/\n", zErr
18e10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18e20 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20  _free(zErr);.   
18e30 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20     zErr = 0;.   
18e40 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20 6d 61 6c   }.    zQ2 = mal
18e50 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20 29 3b 0a  loc( len+100 );.
18e60 20 20 20 20 69 66 28 20 7a 51 32 3d 3d 30 20 29      if( zQ2==0 )
18e70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18e80 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
18e90 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32 2c 20 22  (len+100, zQ2, "
18ea0 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  %s ORDER BY rowi
18eb0 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72 79 29  d DESC", zQuery)
18ec0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
18ed0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
18ee0 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  Q2, dump_callbac
18ef0 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20 20  k, p, &zErr);.  
18f00 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
18f10 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
18f20 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 45  >out, "/****** E
18f30 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f  RROR: %s ******/
18f40 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20  \n", zErr);.    
18f50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
18f60 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
18f70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
18f80 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
18f90 20 20 20 20 66 72 65 65 28 7a 51 32 29 3b 0a 20      free(zQ2);. 
18fa0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18fb0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f 66  }../*.** Text of
18fc0 20 68 65 6c 70 20 6d 65 73 73 61 67 65 73 2e 0a   help messages..
18fd0 2a 2a 0a 2a 2a 20 54 68 65 20 68 65 6c 70 20 74  **.** The help t
18fe0 65 78 74 20 66 6f 72 20 65 61 63 68 20 69 6e 64  ext for each ind
18ff0 69 76 69 64 75 61 6c 20 63 6f 6d 6d 61 6e 64 20  ividual command 
19000 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 6c 69  begins with a li
19010 6e 65 20 74 68 61 74 20 73 74 61 72 74 73 0a 2a  ne that starts.*
19020 2a 20 77 69 74 68 20 22 2e 22 2e 20 20 53 75 62  * with ".".  Sub
19030 73 65 71 75 65 6e 74 20 6c 69 6e 65 73 20 61 72  sequent lines ar
19040 65 20 73 75 70 70 6c 69 6d 65 6e 74 61 6c 20 69  e supplimental i
19050 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
19060 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
19070 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 70 61 63  two or more spac
19080 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 65  es between the e
19090 6e 64 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e  nd of the comman
190a0 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 73 74 61  d and the.** sta
190b0 72 74 20 6f 66 20 74 68 65 20 64 65 73 63 72 69  rt of the descri
190c0 70 74 69 6f 6e 20 6f 66 20 77 68 61 74 20 74 68  ption of what th
190d0 61 74 20 63 6f 6d 6d 61 6e 64 20 64 6f 65 73 2e  at command does.
190e0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
190f0 20 63 68 61 72 20 2a 28 61 7a 48 65 6c 70 5b 5d   char *(azHelp[]
19100 29 20 3d 20 7b 0a 23 69 66 20 64 65 66 69 6e 65  ) = {.#if define
19110 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c  d(SQLITE_HAVE_ZL
19120 49 42 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  IB) && !defined(
19130 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
19140 55 41 4c 54 41 42 4c 45 29 0a 20 20 22 2e 61 72  UALTABLE).  ".ar
19150 63 68 69 76 65 20 2e 2e 2e 20 20 20 20 20 20 20  chive ...       
19160 20 20 20 20 20 20 4d 61 6e 61 67 65 20 53 51 4c        Manage SQL
19170 20 61 72 63 68 69 76 65 73 22 2c 0a 20 20 22 20   archives",.  " 
19180 20 20 45 61 63 68 20 63 6f 6d 6d 61 6e 64 20 6d    Each command m
19190 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79  ust have exactly
191a0 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
191b0 6f 77 69 6e 67 20 6f 70 74 69 6f 6e 73 3a 22 2c  owing options:",
191c0 0a 20 20 22 20 20 20 20 20 2d 63 2c 20 2d 2d 63  .  "     -c, --c
191d0 72 65 61 74 65 20 20 20 20 20 20 20 20 20 20 20  reate           
191e0 20 20 20 20 43 72 65 61 74 65 20 61 20 6e 65 77      Create a new
191f0 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20 20   archive",.  "  
19200 20 20 20 2d 75 2c 20 2d 2d 75 70 64 61 74 65 20     -u, --update 
19210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 70                Up
19220 64 61 74 65 20 6f 72 20 61 64 64 20 66 69 6c 65  date or add file
19230 73 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e 67  s to an existing
19240 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20 20   archive",.  "  
19250 20 20 20 2d 74 2c 20 2d 2d 6c 69 73 74 20 20 20     -t, --list   
19260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69                Li
19270 73 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  st contents of a
19280 72 63 68 69 76 65 22 2c 0a 20 20 22 20 20 20 20  rchive",.  "    
19290 20 2d 78 2c 20 2d 2d 65 78 74 72 61 63 74 20 20   -x, --extract  
192a0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 74 72              Extr
192b0 61 63 74 20 66 69 6c 65 73 20 66 72 6f 6d 20 61  act files from a
192c0 72 63 68 69 76 65 22 2c 0a 20 20 22 20 20 20 4f  rchive",.  "   O
192d0 70 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74  ptional argument
192e0 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d 76 2c  s:",.  "     -v,
192f0 20 2d 2d 76 65 72 62 6f 73 65 20 20 20 20 20 20   --verbose      
19300 20 20 20 20 20 20 20 20 50 72 69 6e 74 20 65 61          Print ea
19310 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 73 20 69  ch filename as i
19320 74 20 69 73 20 70 72 6f 63 65 73 73 65 64 22 2c  t is processed",
19330 0a 20 20 22 20 20 20 20 20 2d 66 20 46 49 4c 45  .  "     -f FILE
19340 2c 20 2d 2d 66 69 6c 65 20 46 49 4c 45 20 20 20  , --file FILE   
19350 20 20 20 20 4f 70 65 72 61 74 65 20 6f 6e 20 61      Operate on a
19360 72 63 68 69 76 65 20 46 49 4c 45 20 28 64 65 66  rchive FILE (def
19370 61 75 6c 74 20 69 73 20 63 75 72 72 65 6e 74 20  ault is current 
19380 64 62 29 22 2c 0a 20 20 22 20 20 20 20 20 2d 61  db)",.  "     -a
19390 20 46 49 4c 45 2c 20 2d 2d 61 70 70 65 6e 64 20   FILE, --append 
193a0 46 49 4c 45 20 20 20 20 20 4f 70 65 72 61 74 65  FILE     Operate
193b0 20 6f 6e 20 46 49 4c 45 20 6f 70 65 6e 65 64 20   on FILE opened 
193c0 75 73 69 6e 67 20 74 68 65 20 61 70 6e 64 76 66  using the apndvf
193d0 73 20 56 46 53 22 2c 0a 20 20 22 20 20 20 20 20  s VFS",.  "     
193e0 2d 43 20 44 49 52 2c 20 2d 2d 64 69 72 65 63 74  -C DIR, --direct
193f0 6f 72 79 20 44 49 52 20 20 20 20 43 68 61 6e 67  ory DIR    Chang
19400 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20 44  e to directory D
19410 49 52 20 74 6f 20 72 65 61 64 2f 65 78 74 72 61  IR to read/extra
19420 63 74 20 66 69 6c 65 73 22 2c 0a 20 20 22 20 20  ct files",.  "  
19430 20 20 20 2d 6e 2c 20 2d 2d 64 72 79 72 75 6e 20     -n, --dryrun 
19440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68                Sh
19450 6f 77 20 74 68 65 20 53 51 4c 20 74 68 61 74 20  ow the SQL that 
19460 77 6f 75 6c 64 20 68 61 76 65 20 6f 63 63 75 72  would have occur
19470 72 65 64 22 2c 0a 20 20 22 20 20 20 45 78 61 6d  red",.  "   Exam
19480 70 6c 65 73 3a 22 2c 0a 20 20 22 20 20 20 20 20  ples:",.  "     
19490 2e 61 72 20 2d 63 66 20 61 72 63 68 69 76 65 2e  .ar -cf archive.
194a0 73 61 72 20 66 6f 6f 20 62 61 72 20 20 23 20 43  sar foo bar  # C
194b0 72 65 61 74 65 20 61 72 63 68 69 76 65 2e 73 61  reate archive.sa
194c0 72 20 66 72 6f 6d 20 66 69 6c 65 73 20 66 6f 6f  r from files foo
194d0 20 61 6e 64 20 62 61 72 22 2c 0a 20 20 22 20 20   and bar",.  "  
194e0 20 20 20 2e 61 72 20 2d 74 66 20 61 72 63 68 69     .ar -tf archi
194f0 76 65 2e 73 61 72 20 20 20 20 20 20 20 20 20 20  ve.sar          
19500 23 20 4c 69 73 74 20 6d 65 6d 62 65 72 73 20 6f  # List members o
19510 66 20 61 72 63 68 69 76 65 2e 73 61 72 22 2c 0a  f archive.sar",.
19520 20 20 22 20 20 20 20 20 2e 61 72 20 2d 78 76 66    "     .ar -xvf
19530 20 61 72 63 68 69 76 65 2e 73 61 72 20 20 20 20   archive.sar    
19540 20 20 20 20 20 23 20 56 65 72 62 6f 73 65 6c 79       # Verbosely
19550 20 65 78 74 72 61 63 74 20 66 69 6c 65 73 20 66   extract files f
19560 72 6f 6d 20 61 72 63 68 69 76 65 2e 73 61 72 22  rom archive.sar"
19570 2c 0a 20 20 22 20 20 20 53 65 65 20 61 6c 73 6f  ,.  "   See also
19580 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 68 74 74  :",.  "      htt
19590 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 63  p://sqlite.org/c
195a0 6c 69 2e 68 74 6d 6c 23 73 71 6c 61 72 5f 61 72  li.html#sqlar_ar
195b0 63 68 69 76 65 5f 73 75 70 70 6f 72 74 22 2c 0a  chive_support",.
195c0 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
195d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
195e0 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e 61 75 74  RIZATION.  ".aut
195f0 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20 20 20  h ON|OFF        
19600 20 20 20 20 20 53 68 6f 77 20 61 75 74 68 6f 72       Show author
19610 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 73 22 2c  izer callbacks",
19620 0a 23 65 6e 64 69 66 0a 20 20 22 2e 62 61 63 6b  .#endif.  ".back
19630 75 70 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20  up ?DB? FILE    
19640 20 20 20 20 42 61 63 6b 75 70 20 44 42 20 28 64      Backup DB (d
19650 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29  efault \"main\")
19660 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20   to FILE",.  "  
19670 20 20 20 20 20 2d 2d 61 70 70 65 6e 64 20 20 20       --append   
19680 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68 65           Use the
19690 20 61 70 70 65 6e 64 76 66 73 22 2c 0a 20 20 22   appendvfs",.  "
196a0 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66 20 20 20 20  .bail on|off    
196b0 20 20 20 20 20 20 20 20 20 53 74 6f 70 20 61 66           Stop af
196c0 74 65 72 20 68 69 74 74 69 6e 67 20 61 6e 20 65  ter hitting an e
196d0 72 72 6f 72 2e 20 20 44 65 66 61 75 6c 74 20 4f  rror.  Default O
196e0 46 46 22 2c 0a 20 20 22 2e 62 69 6e 61 72 79 20  FF",.  ".binary 
196f0 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20  on|off          
19700 20 54 75 72 6e 20 62 69 6e 61 72 79 20 6f 75 74   Turn binary out
19710 70 75 74 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20  put on or off.  
19720 44 65 66 61 75 6c 74 20 4f 46 46 22 2c 0a 20 20  Default OFF",.  
19730 22 2e 63 64 20 44 49 52 45 43 54 4f 52 59 20 20  ".cd DIRECTORY  
19740 20 20 20 20 20 20 20 20 20 20 43 68 61 6e 67 65            Change
19750 20 74 68 65 20 77 6f 72 6b 69 6e 67 20 64 69 72   the working dir
19760 65 63 74 6f 72 79 20 74 6f 20 44 49 52 45 43 54  ectory to DIRECT
19770 4f 52 59 22 2c 0a 20 20 22 2e 63 68 61 6e 67 65  ORY",.  ".change
19780 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20  s on|off        
19790 20 20 53 68 6f 77 20 6e 75 6d 62 65 72 20 6f 66    Show number of
197a0 20 72 6f 77 73 20 63 68 61 6e 67 65 64 20 62 79   rows changed by
197b0 20 53 51 4c 22 2c 0a 20 20 22 2e 63 68 65 63 6b   SQL",.  ".check
197c0 20 47 4c 4f 42 20 20 20 20 20 20 20 20 20 20 20   GLOB           
197d0 20 20 20 46 61 69 6c 20 69 66 20 6f 75 74 70 75     Fail if outpu
197e0 74 20 73 69 6e 63 65 20 2e 74 65 73 74 63 61 73  t since .testcas
197f0 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
19800 22 2c 0a 20 20 22 2e 63 6c 6f 6e 65 20 4e 45 57  ",.  ".clone NEW
19810 44 42 20 20 20 20 20 20 20 20 20 20 20 20 20 43  DB             C
19820 6c 6f 6e 65 20 64 61 74 61 20 69 6e 74 6f 20 4e  lone data into N
19830 45 57 44 42 20 66 72 6f 6d 20 74 68 65 20 65 78  EWDB from the ex
19840 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 22  isting database"
19850 2c 0a 20 20 22 2e 64 61 74 61 62 61 73 65 73 20  ,.  ".databases 
19860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69                Li
19870 73 74 20 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c  st names and fil
19880 65 73 20 6f 66 20 61 74 74 61 63 68 65 64 20 64  es of attached d
19890 61 74 61 62 61 73 65 73 22 2c 0a 20 20 22 2e 64  atabases",.  ".d
198a0 62 63 6f 6e 66 69 67 20 3f 6f 70 3f 20 3f 76 61  bconfig ?op? ?va
198b0 6c 3f 20 20 20 20 20 4c 69 73 74 20 6f 72 20 63  l?     List or c
198c0 68 61 6e 67 65 20 73 71 6c 69 74 65 33 5f 64 62  hange sqlite3_db
198d0 5f 63 6f 6e 66 69 67 28 29 20 6f 70 74 69 6f 6e  _config() option
198e0 73 22 2c 0a 20 20 22 2e 64 62 69 6e 66 6f 20 3f  s",.  ".dbinfo ?
198f0 44 42 3f 20 20 20 20 20 20 20 20 20 20 20 20 20  DB?             
19900 53 68 6f 77 20 73 74 61 74 75 73 20 69 6e 66 6f  Show status info
19910 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
19920 65 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 22  e database",.  "
19930 2e 64 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e  .dump ?TABLE? ..
19940 2e 20 20 20 20 20 20 20 20 52 65 6e 64 65 72 20  .        Render 
19950 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e  all database con
19960 74 65 6e 74 20 61 73 20 53 51 4c 22 2c 0a 20 20  tent as SQL",.  
19970 22 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20  "   Options:",. 
19980 20 22 20 20 20 20 20 2d 2d 70 72 65 73 65 72 76   "     --preserv
19990 65 2d 72 6f 77 69 64 73 20 20 20 20 20 20 49 6e  e-rowids      In
199a0 63 6c 75 64 65 20 52 4f 57 49 44 20 76 61 6c 75  clude ROWID valu
199b0 65 73 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  es in the output
199c0 22 2c 0a 20 20 22 20 20 20 20 20 2d 2d 6e 65 77  ",.  "     --new
199d0 6c 69 6e 65 73 20 20 20 20 20 20 20 20 20 20 20  lines           
199e0 20 20 41 6c 6c 6f 77 20 75 6e 65 73 63 61 70 65    Allow unescape
199f0 64 20 6e 65 77 6c 69 6e 65 20 63 68 61 72 61 63  d newline charac
19a00 74 65 72 73 20 69 6e 20 6f 75 74 70 75 74 22 2c  ters in output",
19a10 0a 20 20 22 20 20 20 54 41 42 4c 45 20 69 73 20  .  "   TABLE is 
19a20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 66 6f 72  LIKE pattern for
19a30 20 74 68 65 20 74 61 62 6c 65 73 20 74 6f 20 64   the tables to d
19a40 75 6d 70 22 2c 0a 20 20 22 2e 65 63 68 6f 20 6f  ump",.  ".echo o
19a50 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 20  n|off           
19a60 20 20 54 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 65    Turn command e
19a70 63 68 6f 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a  cho on or off",.
19a80 20 20 22 2e 65 71 70 20 6f 6e 7c 6f 66 66 7c 66    ".eqp on|off|f
19a90 75 6c 6c 20 20 20 20 20 20 20 20 20 45 6e 61 62  ull         Enab
19aa0 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 61 75  le or disable au
19ab0 74 6f 6d 61 74 69 63 20 45 58 50 4c 41 49 4e 20  tomatic EXPLAIN 
19ac0 51 55 45 52 59 20 50 4c 41 4e 22 2c 0a 20 20 22  QUERY PLAN",.  "
19ad0 2e 65 78 63 65 6c 20 20 20 20 20 20 20 20 20 20  .excel          
19ae0 20 20 20 20 20 20 20 20 20 44 69 73 70 6c 61 79           Display
19af0 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 6e   the output of n
19b00 65 78 74 20 63 6f 6d 6d 61 6e 64 20 69 6e 20 61  ext command in a
19b10 20 73 70 72 65 61 64 73 68 65 65 74 22 2c 0a 20   spreadsheet",. 
19b20 20 22 2e 65 78 69 74 20 3f 43 4f 44 45 3f 20 20   ".exit ?CODE?  
19b30 20 20 20 20 20 20 20 20 20 20 20 45 78 69 74 20             Exit 
19b40 74 68 69 73 20 70 72 6f 67 72 61 6d 20 77 69 74  this program wit
19b50 68 20 72 65 74 75 72 6e 2d 63 6f 64 65 20 43 4f  h return-code CO
19b60 44 45 22 2c 0a 20 20 22 2e 65 78 70 65 72 74 20  DE",.  ".expert 
19b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b80 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 2e 20 53   EXPERIMENTAL. S
19b90 75 67 67 65 73 74 20 69 6e 64 65 78 65 73 20 66  uggest indexes f
19ba0 6f 72 20 73 70 65 63 69 66 69 65 64 20 71 75 65  or specified que
19bb0 72 69 65 73 22 2c 0a 2f 2a 20 42 65 63 61 75 73  ries",./* Becaus
19bc0 65 20 65 78 70 6c 61 69 6e 20 6d 6f 64 65 20 63  e explain mode c
19bd0 6f 6d 65 73 20 6f 6e 20 61 75 74 6f 6d 61 74 69  omes on automati
19be0 63 61 6c 6c 79 20 6e 6f 77 2c 20 74 68 65 20 22  cally now, the "
19bf0 2e 65 78 70 6c 61 69 6e 22 20 6d 6f 64 65 0a 2a  .explain" mode.*
19c00 2a 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  * is removed fro
19c10 6d 20 74 68 65 20 68 65 6c 70 20 73 63 72 65 65  m the help scree
19c20 6e 2e 20 20 49 74 20 69 73 20 73 74 69 6c 6c 20  n.  It is still 
19c30 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 6c 65  supported for le
19c40 67 61 63 79 2c 20 68 6f 77 65 76 65 72 20 2a 2f  gacy, however */
19c50 0a 2f 2a 22 2e 65 78 70 6c 61 69 6e 20 3f 6f 6e  ./*".explain ?on
19c60 7c 6f 66 66 7c 61 75 74 6f 3f 20 20 20 54 75 72  |off|auto?   Tur
19c70 6e 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75 74  n EXPLAIN output
19c80 20 6d 6f 64 65 20 6f 6e 20 6f 72 20 6f 66 66 20   mode on or off 
19c90 6f 72 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 22  or to automatic"
19ca0 2c 2a 2f 0a 20 20 22 2e 66 75 6c 6c 73 63 68 65  ,*/.  ".fullsche
19cb0 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20 20 20  ma ?--indent?   
19cc0 53 68 6f 77 20 73 63 68 65 6d 61 20 61 6e 64 20  Show schema and 
19cd0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 73  the content of s
19ce0 71 6c 69 74 65 5f 73 74 61 74 20 74 61 62 6c 65  qlite_stat table
19cf0 73 22 2c 0a 20 20 22 2e 68 65 61 64 65 72 73 20  s",.  ".headers 
19d00 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20  on|off          
19d10 54 75 72 6e 20 64 69 73 70 6c 61 79 20 6f 66 20  Turn display of 
19d20 68 65 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f 66  headers on or of
19d30 66 22 2c 0a 20 20 22 2e 68 65 6c 70 20 3f 2d 61  f",.  ".help ?-a
19d40 6c 6c 3f 20 3f 50 41 54 54 45 52 4e 3f 20 20 20  ll? ?PATTERN?   
19d50 53 68 6f 77 20 68 65 6c 70 20 74 65 78 74 20 66  Show help text f
19d60 6f 72 20 50 41 54 54 45 52 4e 22 2c 0a 20 20 22  or PATTERN",.  "
19d70 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41 42  .import FILE TAB
19d80 4c 45 20 20 20 20 20 20 20 49 6d 70 6f 72 74 20  LE       Import 
19d90 64 61 74 61 20 66 72 6f 6d 20 46 49 4c 45 20 69  data from FILE i
19da0 6e 74 6f 20 54 41 42 4c 45 22 2c 0a 23 69 66 6e  nto TABLE",.#ifn
19db0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19dc0 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 0a 20 20 22  TEST_CONTROL.  "
19dd0 2e 69 6d 70 6f 73 74 65 72 20 49 4e 44 45 58 20  .imposter INDEX 
19de0 54 41 42 4c 45 20 20 20 20 43 72 65 61 74 65 20  TABLE    Create 
19df0 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 54  imposter table T
19e00 41 42 4c 45 20 6f 6e 20 69 6e 64 65 78 20 49 4e  ABLE on index IN
19e10 44 45 58 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22  DEX",.#endif.  "
19e20 2e 69 6e 64 65 78 65 73 20 3f 54 41 42 4c 45 3f  .indexes ?TABLE?
19e30 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 6e 61           Show na
19e40 6d 65 73 20 6f 66 20 69 6e 64 65 78 65 73 22 2c  mes of indexes",
19e50 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
19e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
19e70 66 20 54 41 42 4c 45 20 69 73 20 73 70 65 63 69  f TABLE is speci
19e80 66 69 65 64 2c 20 6f 6e 6c 79 20 73 68 6f 77 20  fied, only show 
19e90 69 6e 64 65 78 65 73 20 66 6f 72 22 2c 0a 20 20  indexes for",.  
19ea0 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
19eb0 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c              tabl
19ec0 65 73 20 6d 61 74 63 68 69 6e 67 20 54 41 42 4c  es matching TABL
19ed0 45 20 75 73 69 6e 67 20 74 68 65 20 4c 49 4b 45  E using the LIKE
19ee0 20 6f 70 65 72 61 74 6f 72 2e 22 2c 0a 23 69 66   operator.",.#if
19ef0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
19f00 45 5f 49 4f 54 52 41 43 45 0a 20 20 22 2e 69 6f  E_IOTRACE.  ".io
19f10 74 72 61 63 65 20 46 49 4c 45 20 20 20 20 20 20  trace FILE      
19f20 20 20 20 20 20 20 45 6e 61 62 6c 65 20 49 2f 4f        Enable I/O
19f30 20 64 69 61 67 6e 6f 73 74 69 63 20 6c 6f 67 67   diagnostic logg
19f40 69 6e 67 20 74 6f 20 46 49 4c 45 22 2c 0a 23 65  ing to FILE",.#e
19f50 6e 64 69 66 0a 20 20 22 2e 6c 69 6d 69 74 20 3f  ndif.  ".limit ?
19f60 4c 49 4d 49 54 3f 20 3f 56 41 4c 3f 20 20 20 20  LIMIT? ?VAL?    
19f70 20 44 69 73 70 6c 61 79 20 6f 72 20 63 68 61 6e   Display or chan
19f80 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
19f90 61 6e 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 22  an SQLITE_LIMIT"
19fa0 2c 0a 20 20 22 2e 6c 69 6e 74 20 4f 50 54 49 4f  ,.  ".lint OPTIO
19fb0 4e 53 20 20 20 20 20 20 20 20 20 20 20 20 52 65  NS            Re
19fc0 70 6f 72 74 20 70 6f 74 65 6e 74 69 61 6c 20 73  port potential s
19fd0 63 68 65 6d 61 20 69 73 73 75 65 73 2e 22 2c 0a  chema issues.",.
19fe0 20 20 22 20 20 20 20 20 4f 70 74 69 6f 6e 73 3a    "     Options:
19ff0 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 66 6b  ",.  "        fk
1a000 65 79 2d 69 6e 64 65 78 65 73 20 20 20 20 20 46  ey-indexes     F
1a010 69 6e 64 20 6d 69 73 73 69 6e 67 20 66 6f 72 65  ind missing fore
1a020 69 67 6e 20 6b 65 79 20 69 6e 64 65 78 65 73 22  ign key indexes"
1a030 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
1a040 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
1a050 53 49 4f 4e 0a 20 20 22 2e 6c 6f 61 64 20 46 49  SION.  ".load FI
1a060 4c 45 20 3f 45 4e 54 52 59 3f 20 20 20 20 20 20  LE ?ENTRY?      
1a070 20 4c 6f 61 64 20 61 6e 20 65 78 74 65 6e 73 69   Load an extensi
1a080 6f 6e 20 6c 69 62 72 61 72 79 22 2c 0a 23 65 6e  on library",.#en
1a090 64 69 66 0a 20 20 22 2e 6c 6f 67 20 46 49 4c 45  dif.  ".log FILE
1a0a0 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 20  |off            
1a0b0 54 75 72 6e 20 6c 6f 67 67 69 6e 67 20 6f 6e 20  Turn logging on 
1a0c0 6f 72 20 6f 66 66 2e 20 20 46 49 4c 45 20 63 61  or off.  FILE ca
1a0d0 6e 20 62 65 20 73 74 64 65 72 72 2f 73 74 64 6f  n be stderr/stdo
1a0e0 75 74 22 2c 0a 20 20 22 2e 6d 6f 64 65 20 4d 4f  ut",.  ".mode MO
1a0f0 44 45 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 20  DE ?TABLE?      
1a100 20 53 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65   Set output mode
1a110 22 2c 0a 20 20 22 20 20 20 4d 4f 44 45 20 69 73  ",.  "   MODE is
1a120 20 6f 6e 65 20 6f 66 3a 22 2c 0a 20 20 22 20 20   one of:",.  "  
1a130 20 20 20 61 73 63 69 69 20 20 20 20 43 6f 6c 75     ascii    Colu
1a140 6d 6e 73 2f 72 6f 77 73 20 64 65 6c 69 6d 69 74  mns/rows delimit
1a150 65 64 20 62 79 20 30 78 31 46 20 61 6e 64 20 30  ed by 0x1F and 0
1a160 78 31 45 22 2c 0a 20 20 22 20 20 20 20 20 63 73  x1E",.  "     cs
1a170 76 20 20 20 20 20 20 43 6f 6d 6d 61 2d 73 65 70  v      Comma-sep
1a180 61 72 61 74 65 64 20 76 61 6c 75 65 73 22 2c 0a  arated values",.
1a190 20 20 22 20 20 20 20 20 63 6f 6c 75 6d 6e 20 20    "     column  
1a1a0 20 4c 65 66 74 2d 61 6c 69 67 6e 65 64 20 63 6f   Left-aligned co
1a1b0 6c 75 6d 6e 73 2e 20 20 28 53 65 65 20 2e 77 69  lumns.  (See .wi
1a1c0 64 74 68 29 22 2c 0a 20 20 22 20 20 20 20 20 68  dth)",.  "     h
1a1d0 74 6d 6c 20 20 20 20 20 48 54 4d 4c 20 3c 74 61  tml     HTML <ta
1a1e0 62 6c 65 3e 20 63 6f 64 65 22 2c 0a 20 20 22 20  ble> code",.  " 
1a1f0 20 20 20 20 69 6e 73 65 72 74 20 20 20 53 51 4c      insert   SQL
1a200 20 69 6e 73 65 72 74 20 73 74 61 74 65 6d 65 6e   insert statemen
1a210 74 73 20 66 6f 72 20 54 41 42 4c 45 22 2c 0a 20  ts for TABLE",. 
1a220 20 22 20 20 20 20 20 6c 69 6e 65 20 20 20 20 20   "     line     
1a230 4f 6e 65 20 76 61 6c 75 65 20 70 65 72 20 6c 69  One value per li
1a240 6e 65 22 2c 0a 20 20 22 20 20 20 20 20 6c 69 73  ne",.  "     lis
1a250 74 20 20 20 20 20 56 61 6c 75 65 73 20 64 65 6c  t     Values del
1a260 69 6d 69 74 65 64 20 62 79 20 5c 22 7c 5c 22 22  imited by \"|\""
1a270 2c 0a 20 20 22 20 20 20 20 20 71 75 6f 74 65 20  ,.  "     quote 
1a280 20 20 20 45 73 63 61 70 65 20 61 6e 73 77 65 72     Escape answer
1a290 73 20 61 73 20 66 6f 72 20 53 51 4c 22 2c 0a 20  s as for SQL",. 
1a2a0 20 22 20 20 20 20 20 74 61 62 73 20 20 20 20 20   "     tabs     
1a2b0 54 61 62 2d 73 65 70 61 72 61 74 65 64 20 76 61  Tab-separated va
1a2c0 6c 75 65 73 22 2c 0a 20 20 22 20 20 20 20 20 74  lues",.  "     t
1a2d0 63 6c 20 20 20 20 20 20 54 43 4c 20 6c 69 73 74  cl      TCL list
1a2e0 20 65 6c 65 6d 65 6e 74 73 22 2c 0a 20 20 22 2e   elements",.  ".
1a2f0 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52 49 4e 47  nullvalue STRING
1a300 20 20 20 20 20 20 20 20 55 73 65 20 53 54 52 49          Use STRI
1a310 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 4e  NG in place of N
1a320 55 4c 4c 20 76 61 6c 75 65 73 22 2c 0a 20 20 22  ULL values",.  "
1a330 2e 6f 6e 63 65 20 28 2d 65 7c 2d 78 7c 46 49 4c  .once (-e|-x|FIL
1a340 45 29 20 20 20 20 20 20 20 4f 75 74 70 75 74 20  E)       Output 
1a350 66 6f 72 20 74 68 65 20 6e 65 78 74 20 53 51 4c  for the next SQL
1a360 20 63 6f 6d 6d 61 6e 64 20 6f 6e 6c 79 20 74 6f   command only to
1a370 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 20 20   FILE",.  "     
1a380 49 66 20 46 49 4c 45 20 62 65 67 69 6e 73 20 77  If FILE begins w
1a390 69 74 68 20 27 7c 27 20 74 68 65 6e 20 6f 70 65  ith '|' then ope
1a3a0 6e 20 61 73 20 61 20 70 69 70 65 22 2c 0a 20 20  n as a pipe",.  
1a3b0 22 20 20 20 20 20 4f 74 68 65 72 20 6f 70 74 69  "     Other opti
1a3c0 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20  ons:",.  "      
1a3d0 20 2d 65 20 20 20 20 49 6e 76 6f 6b 65 20 73 79   -e    Invoke sy
1a3e0 73 74 65 6d 20 74 65 78 74 20 65 64 69 74 6f 72  stem text editor
1a3f0 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 78 20  ",.  "       -x 
1a400 20 20 20 4f 70 65 6e 20 69 6e 20 61 20 73 70 72     Open in a spr
1a410 65 61 64 73 68 65 65 74 22 2c 0a 20 20 22 2e 6f  eadsheet",.  ".o
1a420 70 65 6e 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f 46  pen ?OPTIONS? ?F
1a430 49 4c 45 3f 20 20 20 43 6c 6f 73 65 20 65 78 69  ILE?   Close exi
1a440 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 61  sting database a
1a450 6e 64 20 72 65 6f 70 65 6e 20 46 49 4c 45 22 2c  nd reopen FILE",
1a460 0a 20 20 22 20 20 20 20 20 4f 70 74 69 6f 6e 73  .  "     Options
1a470 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d  :",.  "        -
1a480 2d 61 70 70 65 6e 64 20 20 20 20 20 20 20 20 55  -append        U
1a490 73 65 20 61 70 70 65 6e 64 76 66 73 20 74 6f 20  se appendvfs to 
1a4a0 61 70 70 65 6e 64 20 64 61 74 61 62 61 73 65 20  append database 
1a4b0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 46 49  to the end of FI
1a4c0 4c 45 22 2c 0a 23 69 66 64 65 66 20 53 51 4c 49  LE",.#ifdef SQLI
1a4d0 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49  TE_ENABLE_DESERI
1a4e0 41 4c 49 5a 45 0a 20 20 22 20 20 20 20 20 20 20  ALIZE.  "       
1a4f0 20 2d 2d 64 65 73 65 72 69 61 6c 69 7a 65 20 20   --deserialize  
1a500 20 4c 6f 61 64 20 69 6e 74 6f 20 6d 65 6d 6f 72   Load into memor
1a510 79 20 75 73 65 69 6e 67 20 73 71 6c 69 74 65 33  y useing sqlite3
1a520 5f 64 65 73 65 72 69 61 6c 69 7a 65 28 29 22 2c  _deserialize()",
1a530 0a 23 65 6e 64 69 66 0a 20 20 22 20 20 20 20 20  .#endif.  "     
1a540 20 20 20 2d 2d 6e 65 77 20 20 20 20 20 20 20 20     --new        
1a550 20 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 46 49     Initialize FI
1a560 4c 45 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 64  LE to an empty d
1a570 61 74 61 62 61 73 65 22 2c 0a 20 20 22 20 20 20  atabase",.  "   
1a580 20 20 20 20 20 2d 2d 72 65 61 64 6f 6e 6c 79 20       --readonly 
1a590 20 20 20 20 20 4f 70 65 6e 20 46 49 4c 45 20 72       Open FILE r
1a5a0 65 61 64 6f 6e 6c 79 22 2c 0a 20 20 22 20 20 20  eadonly",.  "   
1a5b0 20 20 20 20 20 2d 2d 7a 69 70 20 20 20 20 20 20       --zip      
1a5c0 20 20 20 20 20 46 49 4c 45 20 69 73 20 61 20 5a       FILE is a Z
1a5d0 49 50 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22  IP archive",.  "
1a5e0 2e 6f 75 74 70 75 74 20 3f 46 49 4c 45 3f 20 20  .output ?FILE?  
1a5f0 20 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75           Send ou
1a600 74 70 75 74 20 74 6f 20 46 49 4c 45 20 6f 72 20  tput to FILE or 
1a610 73 74 64 6f 75 74 20 69 66 20 46 49 4c 45 20 69  stdout if FILE i
1a620 73 20 6f 6d 69 74 74 65 64 22 2c 0a 20 20 22 20  s omitted",.  " 
1a630 20 20 20 20 49 66 20 46 49 4c 45 20 62 65 67 69      If FILE begi
1a640 6e 73 20 77 69 74 68 20 27 7c 27 20 74 68 65 6e  ns with '|' then
1a650 20 6f 70 65 6e 20 69 74 20 61 73 20 61 20 70 69   open it as a pi
1a660 70 65 2e 22 2c 0a 20 20 22 2e 70 72 69 6e 74 20  pe.",.  ".print 
1a670 53 54 52 49 4e 47 2e 2e 2e 20 20 20 20 20 20 20  STRING...       
1a680 20 20 50 72 69 6e 74 20 6c 69 74 65 72 61 6c 20    Print literal 
1a690 53 54 52 49 4e 47 22 2c 0a 20 20 22 2e 70 72 6f  STRING",.  ".pro
1a6a0 6d 70 74 20 4d 41 49 4e 20 43 4f 4e 54 49 4e 55  mpt MAIN CONTINU
1a6b0 45 20 20 20 20 52 65 70 6c 61 63 65 20 74 68 65  E    Replace the
1a6c0 20 73 74 61 6e 64 61 72 64 20 70 72 6f 6d 70 74   standard prompt
1a6d0 73 22 2c 0a 20 20 22 2e 71 75 69 74 20 20 20 20  s",.  ".quit    
1a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6f0 45 78 69 74 20 74 68 69 73 20 70 72 6f 67 72 61  Exit this progra
1a700 6d 22 2c 0a 20 20 22 2e 72 65 61 64 20 46 49 4c  m",.  ".read FIL
1a710 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
1a720 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20  Read input from 
1a730 46 49 4c 45 22 2c 0a 20 20 22 2e 72 65 73 74 6f  FILE",.  ".resto
1a740 72 65 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20  re ?DB? FILE    
1a750 20 20 20 52 65 73 74 6f 72 65 20 63 6f 6e 74 65     Restore conte
1a760 6e 74 20 6f 66 20 44 42 20 28 64 65 66 61 75 6c  nt of DB (defaul
1a770 74 20 5c 22 6d 61 69 6e 5c 22 29 20 66 72 6f 6d  t \"main\") from
1a780 20 46 49 4c 45 22 2c 0a 20 20 22 2e 73 61 76 65   FILE",.  ".save
1a790 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20   FILE           
1a7a0 20 20 20 20 57 72 69 74 65 20 69 6e 2d 6d 65 6d      Write in-mem
1a7b0 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 6e 74  ory database int
1a7c0 6f 20 46 49 4c 45 22 2c 0a 20 20 22 2e 73 63 61  o FILE",.  ".sca
1a7d0 6e 73 74 61 74 73 20 6f 6e 7c 6f 66 66 20 20 20  nstats on|off   
1a7e0 20 20 20 20 20 54 75 72 6e 20 73 71 6c 69 74 65       Turn sqlite
1a7f0 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
1a800 73 28 29 20 6d 65 74 72 69 63 73 20 6f 6e 20 6f  s() metrics on o
1a810 72 20 6f 66 66 22 2c 0a 20 20 22 2e 73 63 68 65  r off",.  ".sche
1a820 6d 61 20 3f 50 41 54 54 45 52 4e 3f 20 20 20 20  ma ?PATTERN?    
1a830 20 20 20 20 53 68 6f 77 20 74 68 65 20 43 52 45      Show the CRE
1a840 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6d  ATE statements m
1a850 61 74 63 68 69 6e 67 20 50 41 54 54 45 52 4e 22  atching PATTERN"
1a860 2c 0a 20 20 22 20 20 20 20 20 4f 70 74 69 6f 6e  ,.  "     Option
1a870 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20  s:",.  "        
1a880 20 2d 2d 69 6e 64 65 6e 74 20 20 20 20 20 20 20   --indent       
1a890 20 20 20 20 20 54 72 79 20 74 6f 20 70 72 65 74       Try to pret
1a8a0 74 79 2d 70 72 69 6e 74 20 74 68 65 20 73 63 68  ty-print the sch
1a8b0 65 6d 61 22 2c 0a 20 20 22 2e 73 65 6c 66 74 65  ema",.  ".selfte
1a8c0 73 74 20 3f 4f 50 54 49 4f 4e 53 3f 20 20 20 20  st ?OPTIONS?    
1a8d0 20 20 52 75 6e 20 74 65 73 74 73 20 64 65 66 69    Run tests defi
1a8e0 6e 65 64 20 69 6e 20 74 68 65 20 53 45 4c 46 54  ned in the SELFT
1a8f0 45 53 54 20 74 61 62 6c 65 22 2c 0a 20 20 22 20  EST table",.  " 
1a900 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20     Options:",.  
1a910 22 20 20 20 20 20 20 20 2d 2d 69 6e 69 74 20 20  "       --init  
1a920 20 20 20 20 20 20 20 20 20 20 20 20 20 43 72 65               Cre
1a930 61 74 65 20 61 20 6e 65 77 20 53 45 4c 46 54 45  ate a new SELFTE
1a940 53 54 20 74 61 62 6c 65 22 2c 0a 20 20 22 20 20  ST table",.  "  
1a950 20 20 20 20 20 2d 76 20 20 20 20 20 20 20 20 20       -v         
1a960 20 20 20 20 20 20 20 20 20 20 56 65 72 62 6f 73            Verbos
1a970 65 20 6f 75 74 70 75 74 22 2c 0a 20 20 22 2e 73  e output",.  ".s
1a980 65 70 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52 4f  eparator COL ?RO
1a990 57 3f 20 20 20 20 20 43 68 61 6e 67 65 20 74 68  W?     Change th
1a9a0 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 6f 77  e column and row
1a9b0 20 73 65 70 61 72 61 74 6f 72 73 22 2c 0a 23 69   separators",.#i
1a9c0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1a9d0 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29  _ENABLE_SESSION)
1a9e0 0a 20 20 22 2e 73 65 73 73 69 6f 6e 20 3f 4e 41  .  ".session ?NA
1a9f0 4d 45 3f 20 43 4d 44 20 2e 2e 2e 20 20 43 72 65  ME? CMD ...  Cre
1aa00 61 74 65 20 6f 72 20 63 6f 6e 74 72 6f 6c 20 73  ate or control s
1aa10 65 73 73 69 6f 6e 73 22 2c 0a 20 20 22 20 20 20  essions",.  "   
1aa20 53 75 62 63 6f 6d 6d 61 6e 64 73 3a 22 2c 0a 20  Subcommands:",. 
1aa30 20 22 20 20 20 20 20 61 74 74 61 63 68 20 54 41   "     attach TA
1aa40 42 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  BLE             
1aa50 41 74 74 61 63 68 20 54 41 42 4c 45 22 2c 0a 20  Attach TABLE",. 
1aa60 20 22 20 20 20 20 20 63 68 61 6e 67 65 73 65 74   "     changeset
1aa70 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20   FILE           
1aa80 57 72 69 74 65 20 61 20 63 68 61 6e 67 65 73 65  Write a changese
1aa90 74 20 69 6e 74 6f 20 46 49 4c 45 22 2c 0a 20 20  t into FILE",.  
1aaa0 22 20 20 20 20 20 63 6c 6f 73 65 20 20 20 20 20  "     close     
1aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
1aac0 6c 6f 73 65 20 6f 6e 65 20 73 65 73 73 69 6f 6e  lose one session
1aad0 22 2c 0a 20 20 22 20 20 20 20 20 65 6e 61 62 6c  ",.  "     enabl
1aae0 65 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20  e ?BOOLEAN?     
1aaf0 20 20 20 20 53 65 74 20 6f 72 20 71 75 65 72 79      Set or query
1ab00 20 74 68 65 20 65 6e 61 62 6c 65 20 62 69 74 22   the enable bit"
1ab10 2c 0a 20 20 22 20 20 20 20 20 66 69 6c 74 65 72  ,.  "     filter
1ab20 20 47 4c 4f 42 2e 2e 2e 20 20 20 20 20 20 20 20   GLOB...        
1ab30 20 20 20 52 65 6a 65 63 74 20 74 61 62 6c 65 73     Reject tables
1ab40 20 6d 61 74 63 68 69 6e 67 20 47 4c 4f 42 73 22   matching GLOBs"
1ab50 2c 0a 20 20 22 20 20 20 20 20 69 6e 64 69 72 65  ,.  "     indire
1ab60 63 74 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20  ct ?BOOLEAN?    
1ab70 20 20 20 4d 61 72 6b 20 6f 72 20 71 75 65 72 79     Mark or query
1ab80 20 74 68 65 20 69 6e 64 69 72 65 63 74 20 73 74   the indirect st
1ab90 61 74 75 73 22 2c 0a 20 20 22 20 20 20 20 20 69  atus",.  "     i
1aba0 73 65 6d 70 74 79 20 20 20 20 20 20 20 20 20 20  sempty          
1abb0 20 20 20 20 20 20 20 20 51 75 65 72 79 20 77 68          Query wh
1abc0 65 74 68 65 72 20 74 68 65 20 73 65 73 73 69 6f  ether the sessio
1abd0 6e 20 69 73 20 65 6d 70 74 79 22 2c 0a 20 20 22  n is empty",.  "
1abe0 20 20 20 20 20 6c 69 73 74 20 20 20 20 20 20 20       list       
1abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69                Li
1ac00 73 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  st currently ope
1ac10 6e 20 73 65 73 73 69 6f 6e 20 6e 61 6d 65 73 22  n session names"
1ac20 2c 0a 20 20 22 20 20 20 20 20 6f 70 65 6e 20 44  ,.  "     open D
1ac30 42 20 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  B NAME          
1ac40 20 20 20 4f 70 65 6e 20 61 20 6e 65 77 20 73 65     Open a new se
1ac50 73 73 69 6f 6e 20 6f 6e 20 44 42 22 2c 0a 20 20  ssion on DB",.  
1ac60 22 20 20 20 20 20 70 61 74 63 68 73 65 74 20 46  "     patchset F
1ac70 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 57  ILE            W
1ac80 72 69 74 65 20 61 20 70 61 74 63 68 73 65 74 20  rite a patchset 
1ac90 69 6e 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20  into FILE",.  " 
1aca0 20 20 49 66 20 3f 4e 41 4d 45 3f 20 69 73 20 6f    If ?NAME? is o
1acb0 6d 69 74 74 65 64 2c 20 74 68 65 20 66 69 72 73  mitted, the firs
1acc0 74 20 64 65 66 69 6e 65 64 20 73 65 73 73 69 6f  t defined sessio
1acd0 6e 20 69 73 20 75 73 65 64 2e 22 2c 0a 23 65 6e  n is used.",.#en
1ace0 64 69 66 0a 20 20 22 2e 73 68 61 33 73 75 6d 20  dif.  ".sha3sum 
1acf0 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1ad00 43 6f 6d 70 75 74 65 20 61 20 53 48 41 33 20 68  Compute a SHA3 h
1ad10 61 73 68 20 6f 66 20 64 61 74 61 62 61 73 65 20  ash of database 
1ad20 63 6f 6e 74 65 6e 74 22 2c 0a 20 20 22 20 20 20  content",.  "   
1ad30 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20   Options:",.  " 
1ad40 20 20 20 20 20 2d 2d 73 63 68 65 6d 61 20 20 20       --schema   
1ad50 20 20 20 20 20 20 20 20 20 20 20 41 6c 73 6f 20             Also 
1ad60 68 61 73 68 20 74 68 65 20 73 71 6c 69 74 65 5f  hash the sqlite_
1ad70 6d 61 73 74 65 72 20 74 61 62 6c 65 22 2c 0a 20  master table",. 
1ad80 20 22 20 20 20 20 20 20 2d 2d 73 68 61 33 2d 32   "      --sha3-2
1ad90 32 34 20 20 20 20 20 20 20 20 20 20 20 20 55 73  24            Us
1ada0 65 20 74 68 65 20 73 68 61 33 2d 32 32 34 20 61  e the sha3-224 a
1adb0 6c 67 6f 72 69 74 68 6d 22 2c 0a 20 20 22 20 20  lgorithm",.  "  
1adc0 20 20 20 20 2d 2d 73 68 61 33 2d 32 35 36 20 20      --sha3-256  
1add0 20 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68            Use th
1ade0 65 20 73 68 61 33 2d 32 35 36 20 61 6c 67 6f 72  e sha3-256 algor
1adf0 69 74 68 6d 2e 20 20 54 68 69 73 20 69 73 20 74  ithm.  This is t
1ae00 68 65 20 64 65 66 61 75 6c 74 2e 22 2c 0a 20 20  he default.",.  
1ae10 22 20 20 20 20 20 20 2d 2d 73 68 61 33 2d 33 38  "      --sha3-38
1ae20 34 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65  4            Use
1ae30 20 74 68 65 20 73 68 61 33 2d 33 38 34 20 61 6c   the sha3-384 al
1ae40 67 6f 72 69 74 68 6d 22 2c 0a 20 20 22 20 20 20  gorithm",.  "   
1ae50 20 20 20 2d 2d 73 68 61 33 2d 35 31 32 20 20 20     --sha3-512   
1ae60 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68 65           Use the
1ae70 20 73 68 61 33 2d 35 31 32 20 61 6c 67 6f 72 69   sha3-512 algori
1ae80 74 68 6d 22 2c 0a 20 20 22 20 20 20 20 41 6e 79  thm",.  "    Any
1ae90 20 6f 74 68 65 72 20 61 72 67 75 6d 65 6e 74 20   other argument 
1aea0 69 73 20 61 20 4c 49 4b 45 20 70 61 74 74 65 72  is a LIKE patter
1aeb0 6e 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20  n for tables to 
1aec0 68 61 73 68 22 2c 0a 23 69 66 6e 64 65 66 20 53  hash",.#ifndef S
1aed0 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53  QLITE_NOHAVE_SYS
1aee0 54 45 4d 0a 20 20 22 2e 73 68 65 6c 6c 20 43 4d  TEM.  ".shell CM
1aef0 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 20 20 20  D ARGS...       
1af00 52 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20  Run CMD ARGS... 
1af10 69 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c  in a system shel
1af20 6c 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73  l",.#endif.  ".s
1af30 68 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 20  how             
1af40 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20         Show the 
1af50 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66  current values f
1af60 6f 72 20 76 61 72 69 6f 75 73 20 73 65 74 74 69  or various setti
1af70 6e 67 73 22 2c 0a 20 20 22 2e 73 74 61 74 73 20  ngs",.  ".stats 
1af80 3f 6f 6e 7c 6f 66 66 3f 20 20 20 20 20 20 20 20  ?on|off?        
1af90 20 20 53 68 6f 77 20 73 74 61 74 73 20 6f 72 20    Show stats or 
1afa0 74 75 72 6e 20 73 74 61 74 73 20 6f 6e 20 6f 72  turn stats on or
1afb0 20 6f 66 66 22 2c 0a 23 69 66 6e 64 65 66 20 53   off",.#ifndef S
1afc0 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53  QLITE_NOHAVE_SYS
1afd0 54 45 4d 0a 20 20 22 2e 73 79 73 74 65 6d 20 43  TEM.  ".system C
1afe0 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 20 20  MD ARGS...      
1aff0 52 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20  Run CMD ARGS... 
1b000 69 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c  in a system shel
1b010 6c 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 74  l",.#endif.  ".t
1b020 61 62 6c 65 73 20 3f 54 41 42 4c 45 3f 20 20 20  ables ?TABLE?   
1b030 20 20 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65         List name
1b040 73 20 6f 66 20 74 61 62 6c 65 73 20 6d 61 74 63  s of tables matc
1b050 68 69 6e 67 20 4c 49 4b 45 20 70 61 74 74 65 72  hing LIKE patter
1b060 6e 20 54 41 42 4c 45 22 2c 0a 20 20 22 2e 74 65  n TABLE",.  ".te
1b070 73 74 63 61 73 65 20 4e 41 4d 45 20 20 20 20 20  stcase NAME     
1b080 20 20 20 20 20 20 42 65 67 69 6e 20 72 65 64 69        Begin redi
1b090 72 65 63 74 69 6e 67 20 6f 75 74 70 75 74 20 74  recting output t
1b0a0 6f 20 27 74 65 73 74 63 61 73 65 2d 6f 75 74 2e  o 'testcase-out.
1b0b0 74 78 74 27 22 2c 0a 20 20 22 2e 74 69 6d 65 6f  txt'",.  ".timeo
1b0c0 75 74 20 4d 53 20 20 20 20 20 20 20 20 20 20 20  ut MS           
1b0d0 20 20 20 54 72 79 20 6f 70 65 6e 69 6e 67 20 6c     Try opening l
1b0e0 6f 63 6b 65 64 20 74 61 62 6c 65 73 20 66 6f 72  ocked tables for
1b0f0 20 4d 53 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   MS milliseconds
1b100 22 2c 0a 20 20 22 2e 74 69 6d 65 72 20 6f 6e 7c  ",.  ".timer on|
1b110 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 20 54  off            T
1b120 75 72 6e 20 53 51 4c 20 74 69 6d 65 72 20 6f 6e  urn SQL timer on
1b130 20 6f 72 20 6f 66 66 22 2c 0a 23 69 66 6e 64 65   or off",.#ifnde
1b140 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
1b150 41 43 45 0a 20 20 22 2e 74 72 61 63 65 20 3f 4f  ACE.  ".trace ?O
1b160 50 54 49 4f 4e 53 3f 20 20 20 20 20 20 20 20 20  PTIONS?         
1b170 4f 75 74 70 75 74 20 65 61 63 68 20 53 51 4c 20  Output each SQL 
1b180 73 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74 20  statement as it 
1b190 69 73 20 72 75 6e 22 2c 0a 20 20 22 20 20 20 20  is run",.  "    
1b1a0 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  FILE            
1b1b0 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74          Send out
1b1c0 70 75 74 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20  put to FILE",.  
1b1d0 22 20 20 20 20 73 74 64 6f 75 74 20 20 20 20 20  "    stdout     
1b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 65 6e               Sen
1b1f0 64 20 6f 75 74 70 75 74 20 74 6f 20 73 74 64 6f  d output to stdo
1b200 75 74 22 2c 0a 20 20 22 20 20 20 20 73 74 64 65  ut",.  "    stde
1b210 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rr              
1b220 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20      Send output 
1b230 74 6f 20 73 74 64 65 72 72 22 2c 0a 20 20 22 20  to stderr",.  " 
1b240 20 20 20 6f 66 66 20 20 20 20 20 20 20 20 20 20     off          
1b250 20 20 20 20 20 20 20 20 20 20 20 44 69 73 61 62             Disab
1b260 6c 65 20 74 72 61 63 69 6e 67 22 2c 0a 20 20 22  le tracing",.  "
1b270 20 20 20 20 2d 2d 65 78 70 61 6e 64 65 64 20 20      --expanded  
1b280 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 61              Expa
1b290 6e 64 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  nd query paramet
1b2a0 65 72 73 22 2c 0a 23 69 66 64 65 66 20 53 51 4c  ers",.#ifdef SQL
1b2b0 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41  ITE_ENABLE_NORMA
1b2c0 4c 49 5a 45 0a 20 20 22 20 20 20 20 2d 2d 6e 6f  LIZE.  "    --no
1b2d0 72 6d 61 6c 69 7a 65 64 20 20 20 20 20 20 20 20  rmalized        
1b2e0 20 20 20 20 4e 6f 72 6d 61 6c 20 74 68 65 20 53      Normal the S
1b2f0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 22 2c 0a  QL statements",.
1b300 23 65 6e 64 69 66 0a 20 20 22 20 20 20 20 2d 2d  #endif.  "    --
1b310 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20 20  plain           
1b320 20 20 20 20 20 20 53 68 6f 77 20 53 51 4c 20 61        Show SQL a
1b330 73 20 69 74 20 69 73 20 69 6e 70 75 74 22 2c 0a  s it is input",.
1b340 20 20 22 20 20 20 20 2d 2d 73 74 6d 74 20 20 20    "    --stmt   
1b350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
1b360 72 61 63 65 20 73 74 61 74 65 6d 65 6e 74 20 65  race statement e
1b370 78 65 63 75 74 69 6f 6e 20 28 53 51 4c 49 54 45  xecution (SQLITE
1b380 5f 54 52 41 43 45 5f 53 54 4d 54 29 22 2c 0a 20  _TRACE_STMT)",. 
1b390 20 22 20 20 20 20 2d 2d 70 72 6f 66 69 6c 65 20   "    --profile 
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 72                Pr
1b3b0 6f 66 69 6c 65 20 73 74 61 74 65 6d 65 6e 74 73  ofile statements
1b3c0 20 28 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 50   (SQLITE_TRACE_P
1b3d0 52 4f 46 49 4c 45 29 22 2c 0a 20 20 22 20 20 20  ROFILE)",.  "   
1b3e0 20 2d 2d 72 6f 77 20 20 20 20 20 20 20 20 20 20   --row          
1b3f0 20 20 20 20 20 20 20 20 20 54 72 61 63 65 20 65           Trace e
1b400 61 63 68 20 72 6f 77 20 28 53 51 4c 49 54 45 5f  ach row (SQLITE_
1b410 54 52 41 43 45 5f 52 4f 57 29 22 2c 0a 20 20 22  TRACE_ROW)",.  "
1b420 20 20 20 20 2d 2d 63 6c 6f 73 65 20 20 20 20 20      --close     
1b430 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
1b440 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 6f  e connection clo
1b450 73 65 20 28 53 51 4c 49 54 45 5f 54 52 41 43 45  se (SQLITE_TRACE
1b460 5f 43 4c 4f 53 45 29 22 2c 0a 23 65 6e 64 69 66  _CLOSE)",.#endif
1b470 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1b480 54 52 41 43 45 20 2a 2f 0a 20 20 22 2e 76 66 73  TRACE */.  ".vfs
1b490 69 6e 66 6f 20 3f 41 55 58 3f 20 20 20 20 20 20  info ?AUX?      
1b4a0 20 20 20 20 20 49 6e 66 6f 72 6d 61 74 69 6f 6e       Information
1b4b0 20 61 62 6f 75 74 20 74 68 65 20 74 6f 70 2d 6c   about the top-l
1b4c0 65 76 65 6c 20 56 46 53 22 2c 0a 20 20 22 2e 76  evel VFS",.  ".v
1b4d0 66 73 6c 69 73 74 20 20 20 20 20 20 20 20 20 20  fslist          
1b4e0 20 20 20 20 20 20 20 4c 69 73 74 20 61 6c 6c 20         List all 
1b4f0 61 76 61 69 6c 61 62 6c 65 20 56 46 53 65 73 22  available VFSes"
1b500 2c 0a 20 20 22 2e 76 66 73 6e 61 6d 65 20 3f 41  ,.  ".vfsname ?A
1b510 55 58 3f 20 20 20 20 20 20 20 20 20 20 20 50 72  UX?           Pr
1b520 69 6e 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  int the name of 
1b530 74 68 65 20 56 46 53 20 73 74 61 63 6b 22 2c 0a  the VFS stack",.
1b540 20 20 22 2e 77 69 64 74 68 20 4e 55 4d 31 20 4e    ".width NUM1 N
1b550 55 4d 32 20 2e 2e 2e 20 20 20 20 20 53 65 74 20  UM2 ...     Set 
1b560 63 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20 66 6f  column widths fo
1b570 72 20 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64  r \"column\" mod
1b580 65 22 2c 0a 20 20 22 20 20 20 20 20 4e 65 67 61  e",.  "     Nega
1b590 74 69 76 65 20 76 61 6c 75 65 73 20 72 69 67 68  tive values righ
1b5a0 74 2d 6a 75 73 74 69 66 79 22 2c 0a 7d 3b 0a 0a  t-justify",.};..
1b5b0 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 68 65 6c  /*.** Output hel
1b5c0 70 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 7a 50  p text..**.** zP
1b5d0 61 74 74 65 72 6e 20 64 65 73 63 72 69 62 65 73  attern describes
1b5e0 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6d 6d   the set of comm
1b5f0 61 6e 64 73 20 66 6f 72 20 77 68 69 63 68 20 68  ands for which h
1b600 65 6c 70 20 74 65 78 74 20 69 73 20 70 72 6f 76  elp text is prov
1b610 69 64 65 64 2e 0a 2a 2a 20 49 66 20 7a 50 61 74  ided..** If zPat
1b620 74 65 72 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68  tern is NULL, th
1b630 65 6e 20 73 68 6f 77 20 61 6c 6c 20 63 6f 6d 6d  en show all comm
1b640 61 6e 64 73 2c 20 62 75 74 20 6f 6e 6c 79 20 67  ands, but only g
1b650 69 76 65 20 61 20 6f 6e 65 2d 6c 69 6e 65 0a 2a  ive a one-line.*
1b660 2a 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * description of
1b670 20 65 61 63 68 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   each..**.** Ret
1b680 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1b690 66 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74  f matches..*/.st
1b6a0 61 74 69 63 20 69 6e 74 20 73 68 6f 77 48 65 6c  atic int showHel
1b6b0 70 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  p(FILE *out, con
1b6c0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72  st char *zPatter
1b6d0 6e 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b  n){.  int i = 0;
1b6e0 0a 20 20 69 6e 74 20 6a 20 3d 20 30 3b 0a 20 20  .  int j = 0;.  
1b6f0 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 63 68 61  int n = 0;.  cha
1b700 72 20 2a 7a 50 61 74 3b 0a 20 20 69 66 28 20 7a  r *zPat;.  if( z
1b710 50 61 74 74 65 72 6e 3d 3d 30 0a 20 20 20 7c 7c  Pattern==0.   ||
1b720 20 7a 50 61 74 74 65 72 6e 5b 30 5d 3d 3d 27 30   zPattern[0]=='0
1b730 27 0a 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a  '.   || strcmp(z
1b740 50 61 74 74 65 72 6e 2c 22 2d 61 22 29 3d 3d 30  Pattern,"-a")==0
1b750 0a 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 50  .   || strcmp(zP
1b760 61 74 74 65 72 6e 2c 22 2d 61 6c 6c 22 29 3d 3d  attern,"-all")==
1b770 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 68  0.  ){.    /* Sh
1b780 6f 77 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73 2c  ow all commands,
1b790 20 62 75 74 20 6f 6e 6c 79 20 6f 6e 65 20 6c 69   but only one li
1b7a0 6e 65 20 70 65 72 20 63 6f 6d 6d 61 6e 64 20 2a  ne per command *
1b7b0 2f 0a 20 20 20 20 69 66 28 20 7a 50 61 74 74 65  /.    if( zPatte
1b7c0 72 6e 3d 3d 30 20 29 20 7a 50 61 74 74 65 72 6e  rn==0 ) zPattern
1b7d0 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72 28 69   = "";.    for(i
1b7e0 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
1b7f0 61 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20  azHelp); i++){. 
1b800 20 20 20 20 20 69 66 28 20 61 7a 48 65 6c 70 5b       if( azHelp[
1b810 69 5d 5b 30 5d 3d 3d 27 2e 27 20 7c 7c 20 7a 50  i][0]=='.' || zP
1b820 61 74 74 65 72 6e 5b 30 5d 20 29 7b 0a 20 20 20  attern[0] ){.   
1b830 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1b840 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a  (out, "%s\n", az
1b850 48 65 6c 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Help[i]);.      
1b860 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    n++;.      }. 
1b870 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1b880 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 63 6f    /* Look for co
1b890 6d 6d 61 6e 64 73 20 74 68 61 74 20 66 6f 72 20  mmands that for 
1b8a0 77 68 69 63 68 20 7a 50 61 74 74 65 72 6e 20 69  which zPattern i
1b8b0 73 20 61 6e 20 65 78 61 63 74 20 70 72 65 66 69  s an exact prefi
1b8c0 78 20 2a 2f 0a 20 20 20 20 7a 50 61 74 20 3d 20  x */.    zPat = 
1b8d0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1b8e0 22 2e 25 73 2a 22 2c 20 7a 50 61 74 74 65 72 6e  ".%s*", zPattern
1b8f0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1b900 69 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65  i<ArraySize(azHe
1b910 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  lp); i++){.     
1b920 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
1b930 67 6c 6f 62 28 7a 50 61 74 2c 20 61 7a 48 65 6c  glob(zPat, azHel
1b940 70 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p[i])==0 ){.    
1b950 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1b960 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48  out, "%s\n", azH
1b970 65 6c 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  elp[i]);.       
1b980 20 6a 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20   j = i+1;.      
1b990 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    n++;.      }. 
1b9a0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1b9b0 5f 66 72 65 65 28 7a 50 61 74 29 3b 0a 20 20 20  _free(zPat);.   
1b9c0 20 69 66 28 20 6e 20 29 7b 0a 20 20 20 20 20 20   if( n ){.      
1b9d0 69 66 28 20 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  if( n==1 ){.    
1b9e0 20 20 20 20 2f 2a 20 77 68 65 6e 20 7a 50 61 74      /* when zPat
1b9f0 74 65 72 6e 20 69 73 20 61 20 70 72 65 66 69 78  tern is a prefix
1ba00 20 6f 66 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   of exactly one 
1ba10 63 6f 6d 6d 61 6e 64 2c 20 74 68 65 6e 20 69 6e  command, then in
1ba20 63 6c 75 64 65 20 74 68 65 0a 20 20 20 20 20 20  clude the.      
1ba30 20 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66 20    ** details of 
1ba40 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2c 20 77 68  that command, wh
1ba50 69 63 68 20 73 68 6f 75 6c 64 20 62 65 67 69 6e  ich should begin
1ba60 20 61 74 20 6f 66 66 73 65 74 20 6a 20 2a 2f 0a   at offset j */.
1ba70 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a          while( j
1ba80 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c  <ArraySize(azHel
1ba90 70 29 2d 31 20 26 26 20 61 7a 48 65 6c 70 5b 6a  p)-1 && azHelp[j
1baa0 5d 5b 30 5d 21 3d 27 2e 27 20 29 7b 0a 20 20 20  ][0]!='.' ){.   
1bab0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
1bac0 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  tf(out, "%s\n", 
1bad0 61 7a 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20  azHelp[j]);.    
1bae0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
1baf0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1bb00 20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 20     return n;.   
1bb10 20 7d 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66   }.    /* Look f
1bb20 6f 72 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74  or commands that
1bb30 20 63 6f 6e 74 61 69 6e 20 7a 50 61 74 74 65 72   contain zPatter
1bb40 6e 20 61 6e 79 77 68 65 72 65 2e 20 20 53 68 6f  n anywhere.  Sho
1bb50 77 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 0a 20  w the complete. 
1bb60 20 20 20 2a 2a 20 74 65 78 74 20 6f 66 20 61 6c     ** text of al
1bb70 6c 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20  l commands that 
1bb80 6d 61 74 63 68 2e 20 2a 2f 0a 20 20 20 20 7a 50  match. */.    zP
1bb90 61 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  at = sqlite3_mpr
1bba0 69 6e 74 66 28 22 25 25 25 73 25 25 22 2c 20 7a  intf("%%%s%%", z
1bbb0 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 66 6f  Pattern);.    fo
1bbc0 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
1bbd0 7a 65 28 61 7a 48 65 6c 70 29 3b 20 69 2b 2b 29  ze(azHelp); i++)
1bbe0 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 48 65  {.      if( azHe
1bbf0 6c 70 5b 69 5d 5b 30 5d 3d 3d 27 2e 27 20 29 20  lp[i][0]=='.' ) 
1bc00 6a 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28  j = i;.      if(
1bc10 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65   sqlite3_strlike
1bc20 28 7a 50 61 74 2c 20 61 7a 48 65 6c 70 5b 69 5d  (zPat, azHelp[i]
1bc30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)==0 ){.     
1bc40 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
1bc50 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65  ut, "%s\n", azHe
1bc60 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20  lp[j]);.        
1bc70 77 68 69 6c 65 28 20 6a 3c 41 72 72 61 79 53 69  while( j<ArraySi
1bc80 7a 65 28 61 7a 48 65 6c 70 29 2d 31 20 26 26 20  ze(azHelp)-1 && 
1bc90 61 7a 48 65 6c 70 5b 6a 2b 31 5d 5b 30 5d 21 3d  azHelp[j+1][0]!=
1bca0 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '.' ){.         
1bcb0 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
1bcc0 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
1bcd0 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b   "%s\n", azHelp[
1bce0 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  j]);.        }. 
1bcf0 20 20 20 20 20 20 20 69 20 3d 20 6a 3b 0a 20 20         i = j;.  
1bd00 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
1bd10 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
1bd20 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 29 3b  ite3_free(zPat);
1bd30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
1bd40 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
1bd50 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
1bd60 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 5f 69  ic int process_i
1bd70 6e 70 75 74 28 53 68 65 6c 6c 53 74 61 74 65 20  nput(ShellState 
1bd80 2a 70 2c 20 46 49 4c 45 20 2a 69 6e 29 3b 0a 0a  *p, FILE *in);..
1bd90 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63  /*.** Read the c
1bda0 6f 6e 74 65 6e 74 20 6f 66 20 66 69 6c 65 20 7a  ontent of file z
1bdb0 4e 61 6d 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  Name into memory
1bdc0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
1bdd0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
1bde0 29 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20  ).** and return 
1bdf0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1be00 20 62 75 66 66 65 72 2e 20 54 68 65 20 63 61 6c   buffer. The cal
1be10 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
1be20 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67 0a 2a  le for freeing.*
1be30 2a 20 74 68 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2a  * the memory..**
1be40 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
1be50 20 70 6e 42 79 74 65 20 69 73 20 6e 6f 74 20 4e   pnByte is not N
1be60 55 4c 4c 2c 20 28 2a 70 6e 42 79 74 65 29 20 69  ULL, (*pnByte) i
1be70 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
1be80 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20  ber of bytes.** 
1be90 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  read..**.** For 
1bea0 63 6f 6e 76 65 6e 69 65 6e 63 65 2c 20 61 20 6e  convenience, a n
1beb0 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
1bec0 74 65 20 69 73 20 61 6c 77 61 79 73 20 61 70 70  te is always app
1bed0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 64 61 74  ended to the dat
1bee0 61 20 72 65 61 64 0a 2a 2a 20 66 72 6f 6d 20 74  a read.** from t
1bef0 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  he file before t
1bf00 68 65 20 62 75 66 66 65 72 20 69 73 20 72 65 74  he buffer is ret
1bf10 75 72 6e 65 64 2e 20 54 68 69 73 20 62 79 74 65  urned. This byte
1bf20 20 69 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 64   is not included
1bf30 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c   in.** the final
1bf40 20 76 61 6c 75 65 20 6f 66 20 28 2a 70 6e 42 79   value of (*pnBy
1bf50 74 65 29 2c 20 69 66 20 61 70 70 6c 69 63 61 62  te), if applicab
1bf60 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 55 4c 4c 20 69  le..**.** NULL i
1bf70 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 6e  s returned if an
1bf80 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  y error is encou
1bf90 6e 74 65 72 65 64 2e 20 54 68 65 20 66 69 6e 61  ntered. The fina
1bfa0 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70 6e 42 79  l value of *pnBy
1bfb0 74 65 0a 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e  te.** is undefin
1bfc0 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
1bfd0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1bfe0 2a 72 65 61 64 46 69 6c 65 28 63 6f 6e 73 74 20  *readFile(const 
1bff0 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
1c000 20 2a 70 6e 42 79 74 65 29 7b 0a 20 20 46 49 4c   *pnByte){.  FIL
1c010 45 20 2a 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 4e  E *in = fopen(zN
1c020 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 6c 6f  ame, "rb");.  lo
1c030 6e 67 20 6e 49 6e 3b 0a 20 20 73 69 7a 65 5f 74  ng nIn;.  size_t
1c040 20 6e 52 65 61 64 3b 0a 20 20 63 68 61 72 20 2a   nRead;.  char *
1c050 70 42 75 66 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  pBuf;.  if( in==
1c060 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1c070 66 73 65 65 6b 28 69 6e 2c 20 30 2c 20 53 45 45  fseek(in, 0, SEE
1c080 4b 5f 45 4e 44 29 3b 0a 20 20 6e 49 6e 20 3d 20  K_END);.  nIn = 
1c090 66 74 65 6c 6c 28 69 6e 29 3b 0a 20 20 72 65 77  ftell(in);.  rew
1c0a0 69 6e 64 28 69 6e 29 3b 0a 20 20 70 42 75 66 20  ind(in);.  pBuf 
1c0b0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1c0c0 36 34 28 20 6e 49 6e 2b 31 20 29 3b 0a 20 20 69  64( nIn+1 );.  i
1c0d0 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 20 66 63  f( pBuf==0 ){ fc
1c0e0 6c 6f 73 65 28 69 6e 29 3b 20 72 65 74 75 72 6e  lose(in); return
1c0f0 20 30 3b 20 7d 0a 20 20 6e 52 65 61 64 20 3d 20   0; }.  nRead = 
1c100 66 72 65 61 64 28 70 42 75 66 2c 20 6e 49 6e 2c  fread(pBuf, nIn,
1c110 20 31 2c 20 69 6e 29 3b 0a 20 20 66 63 6c 6f 73   1, in);.  fclos
1c120 65 28 69 6e 29 3b 0a 20 20 69 66 28 20 6e 52 65  e(in);.  if( nRe
1c130 61 64 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c  ad!=1 ){.    sql
1c140 69 74 65 33 5f 66 72 65 65 28 70 42 75 66 29 3b  ite3_free(pBuf);
1c150 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1c160 20 7d 0a 20 20 70 42 75 66 5b 6e 49 6e 5d 20 3d   }.  pBuf[nIn] =
1c170 20 30 3b 0a 20 20 69 66 28 20 70 6e 42 79 74 65   0;.  if( pnByte
1c180 20 29 20 2a 70 6e 42 79 74 65 20 3d 20 6e 49 6e   ) *pnByte = nIn
1c190 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b  ;.  return pBuf;
1c1a0 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
1c1b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
1c1c0 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 43 6c 6f  SSION)./*.** Clo
1c1d0 73 65 20 61 20 73 69 6e 67 6c 65 20 4f 70 65 6e  se a single Open
1c1e0 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61  Session object a
1c1f0 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 6f  nd release all o
1c200 66 20 69 74 73 20 61 73 73 6f 63 69 61 74 65 64  f its associated
1c210 0a 2a 2a 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a  .** resources..*
1c220 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
1c230 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 4f 70 65 6e  ssion_close(Open
1c240 53 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f  Session *pSessio
1c250 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  n){.  int i;.  s
1c260 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 64 65  qlite3session_de
1c270 6c 65 74 65 28 70 53 65 73 73 69 6f 6e 2d 3e 70  lete(pSession->p
1c280 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1c290 65 28 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d  e(pSession->zNam
1c2a0 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e);.  for(i=0; i
1c2b0 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74  <pSession->nFilt
1c2c0 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  er; i++){.    sq
1c2d0 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73  lite3_free(pSess
1c2e0 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d  ion->azFilter[i]
1c2f0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1c300 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e  _free(pSession->
1c310 61 7a 46 69 6c 74 65 72 29 3b 0a 20 20 6d 65 6d  azFilter);.  mem
1c320 73 65 74 28 70 53 65 73 73 69 6f 6e 2c 20 30 2c  set(pSession, 0,
1c330 20 73 69 7a 65 6f 66 28 4f 70 65 6e 53 65 73 73   sizeof(OpenSess
1c340 69 6f 6e 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ion));.}.#endif.
1c350 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
1c360 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a   OpenSession obj
1c370 65 63 74 73 20 61 6e 64 20 72 65 6c 65 61 73 65  ects and release
1c380 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
1c390 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 23 69  resources..*/.#i
1c3a0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1c3b0 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29  _ENABLE_SESSION)
1c3c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 73  .static void ses
1c3d0 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 53  sion_close_all(S
1c3e0 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
1c3f0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1c400 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e  0; i<p->nSession
1c410 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 65 73 73  ; i++){.    sess
1c420 69 6f 6e 5f 63 6c 6f 73 65 28 26 70 2d 3e 61 53  ion_close(&p->aS
1c430 65 73 73 69 6f 6e 5b 69 5d 29 3b 0a 20 20 7d 0a  ession[i]);.  }.
1c440 20 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 3d 20    p->nSession = 
1c450 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  0;.}.#else.# def
1c460 69 6e 65 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73  ine session_clos
1c470 65 5f 61 6c 6c 28 58 29 0a 23 65 6e 64 69 66 0a  e_all(X).#endif.
1c480 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1c490 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 46 69  ation of the xFi
1c4a0 6c 74 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  lter function fo
1c4b0 72 20 61 6e 20 6f 70 65 6e 20 73 65 73 73 69 6f  r an open sessio
1c4c0 6e 2e 20 20 4f 6d 69 74 0a 2a 2a 20 61 6e 79 20  n.  Omit.** any 
1c4d0 74 61 62 6c 65 73 20 6e 61 6d 65 64 20 62 79 20  tables named by 
1c4e0 22 2e 73 65 73 73 69 6f 6e 20 66 69 6c 74 65 72  ".session filter
1c4f0 22 20 62 75 74 20 6c 65 74 20 61 6c 6c 20 6f 74  " but let all ot
1c500 68 65 72 20 74 61 62 6c 65 20 74 68 72 6f 75 67  her table throug
1c510 68 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  h..*/.#if define
1c520 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1c530 53 45 53 53 49 4f 4e 29 0a 73 74 61 74 69 63 20  SESSION).static 
1c540 69 6e 74 20 73 65 73 73 69 6f 6e 5f 66 69 6c 74  int session_filt
1c550 65 72 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 63  er(void *pCtx, c
1c560 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29  onst char *zTab)
1c570 7b 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  {.  OpenSession 
1c580 2a 70 53 65 73 73 69 6f 6e 20 3d 20 28 4f 70 65  *pSession = (Ope
1c590 6e 53 65 73 73 69 6f 6e 2a 29 70 43 74 78 3b 0a  nSession*)pCtx;.
1c5a0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1c5b0 3d 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e  =0; i<pSession->
1c5c0 6e 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20  nFilter; i++){. 
1c5d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
1c5e0 74 72 67 6c 6f 62 28 70 53 65 73 73 69 6f 6e 2d  trglob(pSession-
1c5f0 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 2c 20 7a 54  >azFilter[i], zT
1c600 61 62 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ab)==0 ) return 
1c610 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1c620 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  1;.}.#endif../*.
1c630 2a 2a 20 54 72 79 20 74 6f 20 64 65 64 75 63 65  ** Try to deduce
1c640 20 74 68 65 20 74 79 70 65 20 6f 66 20 66 69 6c   the type of fil
1c650 65 20 66 6f 72 20 7a 4e 61 6d 65 20 62 61 73 65  e for zName base
1c660 64 20 6f 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74  d on its content
1c670 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 6f 6e 65  .  Return.** one
1c680 20 6f 66 20 74 68 65 20 53 48 45 4c 4c 5f 4f 50   of the SHELL_OP
1c690 45 4e 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 0a  EN_* constants..
1c6a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
1c6b0 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
1c6c0 20 6f 72 20 69 73 20 65 6d 70 74 79 20 62 75 74   or is empty but
1c6d0 20 69 74 73 20 6e 61 6d 65 20 6c 6f 6f 6b 73 20   its name looks 
1c6e0 6c 69 6b 65 20 61 20 5a 49 50 0a 2a 2a 20 61 72  like a ZIP.** ar
1c6f0 63 68 69 76 65 20 61 6e 64 20 74 68 65 20 64 66  chive and the df
1c700 6c 74 5a 69 70 20 66 6c 61 67 20 69 73 20 74 72  ltZip flag is tr
1c710 75 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20  ue, then assume 
1c720 69 74 20 69 73 20 61 20 5a 49 50 20 61 72 63 68  it is a ZIP arch
1c730 69 76 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ive..** Otherwis
1c740 65 2c 20 61 73 73 75 6d 65 20 61 6e 20 6f 72 64  e, assume an ord
1c750 69 6e 61 72 79 20 64 61 74 61 62 61 73 65 20 72  inary database r
1c760 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
1c770 20 66 69 6c 65 6e 61 6d 65 20 69 66 0a 2a 2a 20   filename if.** 
1c780 74 68 65 20 74 79 70 65 20 63 61 6e 6e 6f 74 20  the type cannot 
1c790 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20 66 72  be determined fr
1c7a0 6f 6d 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69  om content..*/.i
1c7b0 6e 74 20 64 65 64 75 63 65 44 61 74 61 62 61 73  nt deduceDatabas
1c7c0 65 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72  eType(const char
1c7d0 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 64 66 6c   *zName, int dfl
1c7e0 74 5a 69 70 29 7b 0a 20 20 46 49 4c 45 20 2a 66  tZip){.  FILE *f
1c7f0 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20   = fopen(zName, 
1c800 22 72 62 22 29 3b 0a 20 20 73 69 7a 65 5f 74 20  "rb");.  size_t 
1c810 6e 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 48  n;.  int rc = SH
1c820 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3b  ELL_OPEN_UNSPEC;
1c830 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
1c840 5d 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20 29 7b  ];.  if( f==0 ){
1c850 0a 20 20 20 20 69 66 28 20 64 66 6c 74 5a 69 70  .    if( dfltZip
1c860 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c   && sqlite3_strl
1c870 69 6b 65 28 22 25 2e 7a 69 70 22 2c 7a 4e 61 6d  ike("%.zip",zNam
1c880 65 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  e,0)==0 ){.     
1c890 20 20 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f    return SHELL_O
1c8a0 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20  PEN_ZIPFILE;.   
1c8b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 72   }else{.       r
1c8c0 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e  eturn SHELL_OPEN
1c8d0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20  _NORMAL;.    }. 
1c8e0 20 7d 0a 20 20 6e 20 3d 20 66 72 65 61 64 28 7a   }.  n = fread(z
1c8f0 42 75 66 2c 20 31 36 2c 20 31 2c 20 66 29 3b 0a  Buf, 16, 1, f);.
1c900 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 6d 65    if( n==1 && me
1c910 6d 63 6d 70 28 7a 42 75 66 2c 20 22 53 51 4c 69  mcmp(zBuf, "SQLi
1c920 74 65 20 66 6f 72 6d 61 74 20 33 22 2c 20 31 36  te format 3", 16
1c930 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 63 6c 6f  )==0 ){.    fclo
1c940 73 65 28 66 29 3b 0a 20 20 20 20 72 65 74 75 72  se(f);.    retur
1c950 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52  n SHELL_OPEN_NOR
1c960 4d 41 4c 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b  MAL;.  }.  fseek
1c970 28 66 2c 20 2d 32 35 2c 20 53 45 45 4b 5f 45 4e  (f, -25, SEEK_EN
1c980 44 29 3b 0a 20 20 6e 20 3d 20 66 72 65 61 64 28  D);.  n = fread(
1c990 7a 42 75 66 2c 20 32 35 2c 20 31 2c 20 66 29 3b  zBuf, 25, 1, f);
1c9a0 0a 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 6d  .  if( n==1 && m
1c9b0 65 6d 63 6d 70 28 7a 42 75 66 2c 20 22 53 74 61  emcmp(zBuf, "Sta
1c9c0 72 74 2d 4f 66 2d 53 51 4c 69 74 65 33 2d 22 2c  rt-Of-SQLite3-",
1c9d0 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72   17)==0 ){.    r
1c9e0 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41  c = SHELL_OPEN_A
1c9f0 50 50 45 4e 44 56 46 53 3b 0a 20 20 7d 65 6c 73  PPENDVFS;.  }els
1ca00 65 7b 0a 20 20 20 20 66 73 65 65 6b 28 66 2c 20  e{.    fseek(f, 
1ca10 2d 32 32 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a  -22, SEEK_END);.
1ca20 20 20 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42      n = fread(zB
1ca30 75 66 2c 20 32 32 2c 20 31 2c 20 66 29 3b 0a 20  uf, 22, 1, f);. 
1ca40 20 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 7a     if( n==1 && z
1ca50 42 75 66 5b 30 5d 3d 3d 30 78 35 30 20 26 26 20  Buf[0]==0x50 && 
1ca60 7a 42 75 66 5b 31 5d 3d 3d 30 78 34 62 20 26 26  zBuf[1]==0x4b &&
1ca70 20 7a 42 75 66 5b 32 5d 3d 3d 30 78 30 35 0a 20   zBuf[2]==0x05. 
1ca80 20 20 20 20 20 20 26 26 20 7a 42 75 66 5b 33 5d        && zBuf[3]
1ca90 3d 3d 30 78 30 36 20 29 7b 0a 20 20 20 20 20 20  ==0x06 ){.      
1caa0 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  rc = SHELL_OPEN_
1cab0 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d 65 6c  ZIPFILE;.    }el
1cac0 73 65 20 69 66 28 20 6e 3d 3d 30 20 26 26 20 64  se if( n==0 && d
1cad0 66 6c 74 5a 69 70 20 26 26 20 73 71 6c 69 74 65  fltZip && sqlite
1cae0 33 5f 73 74 72 6c 69 6b 65 28 22 25 2e 7a 69 70  3_strlike("%.zip
1caf0 22 2c 7a 4e 61 6d 65 2c 30 29 3d 3d 30 20 29 7b  ",zName,0)==0 ){
1cb00 0a 20 20 20 20 20 20 72 63 20 3d 20 53 48 45 4c  .      rc = SHEL
1cb10 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a  L_OPEN_ZIPFILE;.
1cb20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f      }.  }.  fclo
1cb30 73 65 28 66 29 3b 0a 20 20 72 65 74 75 72 6e 20  se(f);.  return 
1cb40 72 63 3b 20 20 0a 7d 0a 0a 2f 2a 20 46 6c 61 67  rc;  .}../* Flag
1cb50 73 20 66 6f 72 20 6f 70 65 6e 5f 64 62 28 29 2e  s for open_db().
1cb60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
1cb70 6c 74 20 62 65 68 61 76 69 6f 72 20 6f 66 20 6f  lt behavior of o
1cb80 70 65 6e 5f 64 62 28 29 20 69 73 20 74 6f 20 65  pen_db() is to e
1cb90 78 69 74 28 31 29 20 69 66 20 74 68 65 20 64 61  xit(1) if the da
1cba0 74 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f 0a  tabase fails to.
1cbb0 2a 2a 20 6f 70 65 6e 2e 20 20 54 68 65 20 4f 50  ** open.  The OP
1cbc0 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45 20  EN_DB_KEEPALIVE 
1cbd0 66 6c 61 67 20 63 68 61 6e 67 65 73 20 74 68 61  flag changes tha
1cbe0 74 20 73 6f 20 74 68 61 74 20 69 74 20 70 72 69  t so that it pri
1cbf0 6e 74 73 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20  nts an error.** 
1cc00 62 75 74 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  but still return
1cc10 73 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e  s without callin
1cc20 67 20 65 78 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  g exit..**.** Th
1cc30 65 20 4f 50 45 4e 5f 44 42 5f 5a 49 50 46 49 4c  e OPEN_DB_ZIPFIL
1cc40 45 20 66 6c 61 67 20 63 61 75 73 65 73 20 6f 70  E flag causes op
1cc50 65 6e 5f 64 62 28 29 20 74 6f 20 70 72 65 66 65  en_db() to prefe
1cc60 72 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 73 20  r to open files 
1cc70 61 73 20 61 0a 2a 2a 20 5a 49 50 20 61 72 63 68  as a.** ZIP arch
1cc80 69 76 65 20 69 66 20 74 68 65 20 66 69 6c 65 20  ive if the file 
1cc90 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f  does not exist o
1cca0 72 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20 69  r is empty and i
1ccb0 74 73 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 0a  ts name matches.
1ccc0 2a 2a 20 74 68 65 20 2a 2e 7a 69 70 20 70 61 74  ** the *.zip pat
1ccd0 74 65 72 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  tern..*/.#define
1cce0 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49   OPEN_DB_KEEPALI
1ccf0 56 45 20 20 20 30 78 30 30 31 20 20 20 2f 2a 20  VE   0x001   /* 
1cd00 52 65 74 75 72 6e 20 61 66 74 65 72 20 65 72 72  Return after err
1cd10 6f 72 20 69 66 20 74 72 75 65 20 2a 2f 0a 23 64  or if true */.#d
1cd20 65 66 69 6e 65 20 4f 50 45 4e 5f 44 42 5f 5a 49  efine OPEN_DB_ZI
1cd30 50 46 49 4c 45 20 20 20 20 20 30 78 30 30 32 20  PFILE     0x002 
1cd40 20 20 2f 2a 20 4f 70 65 6e 20 61 73 20 5a 49 50    /* Open as ZIP
1cd50 20 69 66 20 6e 61 6d 65 20 6d 61 74 63 68 65 73   if name matches
1cd60 20 2a 2e 7a 69 70 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   *.zip */../*.**
1cd70 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64   Make sure the d
1cd80 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 2e  atabase is open.
1cd90 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
1cda0 74 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49  then open it.  I
1cdb0 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
1cdc0 65 20 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c  e fails to open,
1cdd0 20 70 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20   print an error 
1cde0 6d 65 73 73 61 67 65 20 61 6e 64 20 65 78 69 74  message and exit
1cdf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ce00 20 6f 70 65 6e 5f 64 62 28 53 68 65 6c 6c 53 74   open_db(ShellSt
1ce10 61 74 65 20 2a 70 2c 20 69 6e 74 20 6f 70 65 6e  ate *p, int open
1ce20 46 6c 61 67 73 29 7b 0a 20 20 69 66 28 20 70 2d  Flags){.  if( p-
1ce30 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  >db==0 ){.    if
1ce40 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53  ( p->openMode==S
1ce50 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43  HELL_OPEN_UNSPEC
1ce60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
1ce70 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  >zDbFilename==0 
1ce80 7c 7c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  || p->zDbFilenam
1ce90 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  e[0]==0 ){.     
1cea0 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d     p->openMode =
1ceb0 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d   SHELL_OPEN_NORM
1cec0 41 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  AL;.      }else{
1ced0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e  .        p->open
1cee0 4d 6f 64 65 20 3d 20 28 75 38 29 64 65 64 75 63  Mode = (u8)deduc
1cef0 65 44 61 74 61 62 61 73 65 54 79 70 65 28 70 2d  eDatabaseType(p-
1cf00 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  >zDbFilename, . 
1cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf20 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 70 65              (ope
1cf30 6e 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f 44 42  nFlags & OPEN_DB
1cf40 5f 5a 49 50 46 49 4c 45 29 21 3d 30 29 3b 0a 20  _ZIPFILE)!=0);. 
1cf50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1cf60 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 65 6e   switch( p->open
1cf70 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61  Mode ){.      ca
1cf80 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50  se SHELL_OPEN_AP
1cf90 50 45 4e 44 56 46 53 3a 20 7b 0a 20 20 20 20 20  PENDVFS: {.     
1cfa0 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f     sqlite3_open_
1cfb0 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  v2(p->zDbFilenam
1cfc0 65 2c 20 26 70 2d 3e 64 62 2c 20 0a 20 20 20 20  e, &p->db, .    
1cfd0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1cfe0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
1cff0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
1d000 20 22 61 70 6e 64 76 66 73 22 29 3b 0a 20 20 20   "apndvfs");.   
1d010 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d020 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53    }.      case S
1d030 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49  HELL_OPEN_DESERI
1d040 41 4c 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 20  ALIZE: {.       
1d050 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 30 2c   sqlite3_open(0,
1d060 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20   &p->db);.      
1d070 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1d080 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c  .      case SHEL
1d090 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3a 20  L_OPEN_ZIPFILE: 
1d0a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d0b0 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a  3_open(":memory:
1d0c0 22 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20  ", &p->db);.    
1d0d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d0e0 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48   }.      case SH
1d0f0 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ELL_OPEN_READONL
1d100 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  Y: {.        sql
1d110 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e  ite3_open_v2(p->
1d120 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d  zDbFilename, &p-
1d130 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  >db, SQLITE_OPEN
1d140 5f 52 45 41 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20  _READONLY, 0);. 
1d150 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1d160 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
1d170 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50   SHELL_OPEN_UNSP
1d180 45 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 53  EC:.      case S
1d190 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c  HELL_OPEN_NORMAL
1d1a0 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
1d1b0 74 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44 62 46  te3_open(p->zDbF
1d1c0 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 29  ilename, &p->db)
1d1d0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1d1e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d1f0 20 20 20 67 6c 6f 62 61 6c 44 62 20 3d 20 70 2d     globalDb = p-
1d200 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  >db;.    if( p->
1d210 64 62 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f  db==0 || SQLITE_
1d220 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63  OK!=sqlite3_errc
1d230 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20  ode(p->db) ){.  
1d240 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1d250 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 75  stderr,"Error: u
1d260 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
1d270 74 61 62 61 73 65 20 5c 22 25 73 5c 22 3a 20 25  tabase \"%s\": %
1d280 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1d290 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  p->zDbFilename, 
1d2a0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
1d2b0 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66  ->db));.      if
1d2c0 28 20 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 50  ( openFlags & OP
1d2d0 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45 20  EN_DB_KEEPALIVE 
1d2e0 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
1d2f0 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 23  exit(1);.    }.#
1d300 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d310 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
1d320 4e 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e  N.    sqlite3_en
1d330 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
1d340 69 6f 6e 28 70 2d 3e 64 62 2c 20 31 29 3b 0a 23  ion(p->db, 1);.#
1d350 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
1d360 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28 70 2d  3_fileio_init(p-
1d370 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
1d380 73 71 6c 69 74 65 33 5f 73 68 61 74 68 72 65 65  sqlite3_shathree
1d390 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20  _init(p->db, 0, 
1d3a0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
1d3b0 63 6f 6d 70 6c 65 74 69 6f 6e 5f 69 6e 69 74 28  completion_init(
1d3c0 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 69  p->db, 0, 0);.#i
1d3d0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45  fdef SQLITE_HAVE
1d3e0 5f 5a 4c 49 42 0a 20 20 20 20 73 71 6c 69 74 65  _ZLIB.    sqlite
1d3f0 33 5f 7a 69 70 66 69 6c 65 5f 69 6e 69 74 28 70  3_zipfile_init(p
1d400 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
1d410 20 73 71 6c 69 74 65 33 5f 73 71 6c 61 72 5f 69   sqlite3_sqlar_i
1d420 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29  nit(p->db, 0, 0)
1d430 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
1d440 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1d450 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65  tion(p->db, "she
1d460 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61 22 2c 20  ll_add_schema", 
1d470 33 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  3, SQLITE_UTF8, 
1d480 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1d490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1d4a0 68 65 6c 6c 41 64 64 53 63 68 65 6d 61 4e 61 6d  hellAddSchemaNam
1d4b0 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  e, 0, 0);.    sq
1d4c0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1d4d0 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68  ction(p->db, "sh
1d4e0 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d  ell_module_schem
1d4f0 61 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  a", 1, SQLITE_UT
1d500 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  F8, 0,.         
1d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d520 20 20 20 73 68 65 6c 6c 4d 6f 64 75 6c 65 53 63     shellModuleSc
1d530 68 65 6d 61 2c 20 30 2c 20 30 29 3b 0a 20 20 20  hema, 0, 0);.   
1d540 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1d550 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20  function(p->db, 
1d560 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20  "shell_putsnl", 
1d570 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
1d580 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
1d590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1d5a0 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c 20 30 2c  hellPutsFunc, 0,
1d5b0 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
1d5c0 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45  ITE_NOHAVE_SYSTE
1d5d0 4d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  M.    sqlite3_cr
1d5e0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d  eate_function(p-
1d5f0 3e 64 62 2c 20 22 65 64 69 74 22 2c 20 31 2c 20  >db, "edit", 1, 
1d600 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_UTF8, 0,.
1d610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d620 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69 74              edit
1d630 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Func, 0, 0);.   
1d640 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1d650 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20  function(p->db, 
1d660 22 65 64 69 74 22 2c 20 32 2c 20 53 51 4c 49 54  "edit", 2, SQLIT
1d670 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20  E_UTF8, 0,.     
1d680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d690 20 20 20 20 20 20 20 65 64 69 74 46 75 6e 63 2c         editFunc,
1d6a0 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
1d6b0 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f     if( p->openMo
1d6c0 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a  de==SHELL_OPEN_Z
1d6d0 49 50 46 49 4c 45 20 29 7b 0a 20 20 20 20 20 20  IPFILE ){.      
1d6e0 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c  char *zSql = sql
1d6f0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
1d700 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 56         "CREATE V
1d710 49 52 54 55 41 4c 20 54 41 42 4c 45 20 7a 69 70  IRTUAL TABLE zip
1d720 20 55 53 49 4e 47 20 7a 69 70 66 69 6c 65 28 25   USING zipfile(%
1d730 51 29 3b 22 2c 20 70 2d 3e 7a 44 62 46 69 6c 65  Q);", p->zDbFile
1d740 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  name);.      sql
1d750 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
1d760 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b   zSql, 0, 0, 0);
1d770 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1d780 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ree(zSql);.    }
1d790 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1d7a0 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a  NABLE_DESERIALIZ
1d7b0 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  E.    else if( p
1d7c0 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c  ->openMode==SHEL
1d7d0 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c 49  L_OPEN_DESERIALI
1d7e0 5a 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ZE ){.      int 
1d7f0 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 20  nData = 0;.     
1d800 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1d810 61 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65  aData = (unsigne
1d820 64 20 63 68 61 72 2a 29 72 65 61 64 46 69 6c 65  d char*)readFile
1d830 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c  (p->zDbFilename,
1d840 20 26 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20   &nData);.      
1d850 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
1d860 5f 64 65 73 65 72 69 61 6c 69 7a 65 28 70 2d 3e  _deserialize(p->
1d870 64 62 2c 20 22 6d 61 69 6e 22 2c 20 61 44 61 74  db, "main", aDat
1d880 61 2c 20 6e 44 61 74 61 2c 20 6e 44 61 74 61 2c  a, nData, nData,
1d890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d8a0 20 20 20 20 53 51 4c 49 54 45 5f 44 45 53 45 52      SQLITE_DESER
1d8b0 49 41 4c 49 5a 45 5f 52 45 53 49 5a 45 41 42 4c  IALIZE_RESIZEABL
1d8c0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
1d8d0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
1d8e0 53 45 52 49 41 4c 49 5a 45 5f 46 52 45 45 4f 4e  SERIALIZE_FREEON
1d8f0 43 4c 4f 53 45 29 3b 0a 20 20 20 20 20 20 69 66  CLOSE);.      if
1d900 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1d910 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1d920 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 71 6c 69  rr, "Error: sqli
1d930 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a 65 28  te3_deserialize(
1d940 29 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c  ) returns %d\n",
1d950 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc);.      }.  
1d960 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
1d970 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
1d980 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 61 74  to close the dat
1d990 61 62 61 65 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  abaes connection
1d9a0 2e 20 20 52 65 70 6f 72 74 20 65 72 72 6f 72 73  .  Report errors
1d9b0 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6c 6f 73 65 5f  ..*/.void close_
1d9c0 64 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  db(sqlite3 *db){
1d9d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
1d9e0 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20  te3_close(db);. 
1d9f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75   if( rc ){.    u
1da00 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1da10 72 2c 20 22 45 72 72 6f 72 3a 20 73 71 6c 69 74  r, "Error: sqlit
1da20 65 33 5f 63 6c 6f 73 65 28 29 20 72 65 74 75 72  e3_close() retur
1da30 6e 73 20 25 64 3a 20 25 73 5c 6e 22 2c 0a 20 20  ns %d: %s\n",.  
1da40 20 20 20 20 20 20 72 63 2c 20 73 71 6c 69 74 65        rc, sqlite
1da50 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
1da60 20 7d 20 0a 7d 0a 0a 23 69 66 20 48 41 56 45 5f   } .}..#if HAVE_
1da70 52 45 41 44 4c 49 4e 45 20 7c 7c 20 48 41 56 45  READLINE || HAVE
1da80 5f 45 44 49 54 4c 49 4e 45 0a 2f 2a 0a 2a 2a 20  _EDITLINE./*.** 
1da90 52 65 61 64 6c 69 6e 65 20 63 6f 6d 70 6c 65 74  Readline complet
1daa0 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2f  ion callbacks.*/
1dab0 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 65  .static char *re
1dac0 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f  adline_completio
1dad0 6e 5f 67 65 6e 65 72 61 74 6f 72 28 63 6f 6e 73  n_generator(cons
1dae0 74 20 63 68 61 72 20 2a 74 65 78 74 2c 20 69 6e  t char *text, in
1daf0 74 20 73 74 61 74 65 29 7b 0a 20 20 73 74 61 74  t state){.  stat
1db00 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ic sqlite3_stmt 
1db10 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
1db20 61 72 20 2a 7a 52 65 74 3b 0a 20 20 69 66 28 20  ar *zRet;.  if( 
1db30 73 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  state==0 ){.    
1db40 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20  char *zSql;.    
1db50 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1db60 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71  (pStmt);.    zSq
1db70 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
1db80 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49 53 54  ntf("SELECT DIST
1db90 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20 43  INCT candidate C
1dba0 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20  OLLATE nocase". 
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbc0 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f            "  FRO
1dbd0 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 29  M completion(%Q)
1dbe0 20 4f 52 44 45 52 20 42 59 20 31 22 2c 20 74 65   ORDER BY 1", te
1dbf0 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  xt);.    sqlite3
1dc00 5f 70 72 65 70 61 72 65 5f 76 32 28 67 6c 6f 62  _prepare_v2(glob
1dc10 61 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  alDb, zSql, -1, 
1dc20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
1dc30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
1dc40 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  l);.  }.  if( sq
1dc50 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
1dc60 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
1dc70 0a 20 20 20 20 7a 52 65 74 20 3d 20 73 74 72 64  .    zRet = strd
1dc80 75 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  up((const char*)
1dc90 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1dca0 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a  ext(pStmt, 0));.
1dcb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1dcc0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
1dcd0 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20  tmt);.    pStmt 
1dce0 3d 20 30 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20  = 0;.    zRet = 
1dcf0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1dd00 7a 52 65 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63  zRet;.}.static c
1dd10 68 61 72 20 2a 2a 72 65 61 64 6c 69 6e 65 5f 63  har **readline_c
1dd20 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20  ompletion(const 
1dd30 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74  char *zText, int
1dd40 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 45 6e   iStart, int iEn
1dd50 64 29 7b 0a 20 20 72 6c 5f 61 74 74 65 6d 70 74  d){.  rl_attempt
1dd60 65 64 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6f 76  ed_completion_ov
1dd70 65 72 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  er = 1;.  return
1dd80 20 72 6c 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6d   rl_completion_m
1dd90 61 74 63 68 65 73 28 7a 54 65 78 74 2c 20 72 65  atches(zText, re
1dda0 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f  adline_completio
1ddb0 6e 5f 67 65 6e 65 72 61 74 6f 72 29 3b 0a 7d 0a  n_generator);.}.
1ddc0 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c 49 4e 45  .#elif HAVE_LINE
1ddd0 4e 4f 49 53 45 0a 2f 2a 0a 2a 2a 20 4c 69 6e 65  NOISE./*.** Line
1dde0 6e 6f 69 73 65 20 63 6f 6d 70 6c 65 74 69 6f 6e  noise completion
1ddf0 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74 61   callback.*/.sta
1de00 74 69 63 20 76 6f 69 64 20 6c 69 6e 65 6e 6f 69  tic void linenoi
1de10 73 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f  se_completion(co
1de20 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e 65 2c  nst char *zLine,
1de30 20 6c 69 6e 65 6e 6f 69 73 65 43 6f 6d 70 6c 65   linenoiseComple
1de40 74 69 6f 6e 73 20 2a 6c 63 29 7b 0a 20 20 69 6e  tions *lc){.  in
1de50 74 20 6e 4c 69 6e 65 20 3d 20 73 74 72 6c 65 6e  t nLine = strlen
1de60 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 69 6e 74  30(zLine);.  int
1de70 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 73 71   i, iStart;.  sq
1de80 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1de90 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  t = 0;.  char *z
1dea0 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  Sql;.  char zBuf
1deb0 5b 31 30 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6e  [1000];..  if( n
1dec0 4c 69 6e 65 3e 73 69 7a 65 6f 66 28 7a 42 75 66  Line>sizeof(zBuf
1ded0 29 2d 33 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )-30 ) return;. 
1dee0 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27   if( zLine[0]=='
1def0 2e 27 20 7c 7c 20 7a 4c 69 6e 65 5b 30 5d 3d 3d  .' || zLine[0]==
1df00 27 23 27 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  '#') return;.  f
1df10 6f 72 28 69 3d 6e 4c 69 6e 65 2d 31 3b 20 69 3e  or(i=nLine-1; i>
1df20 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 7a  =0 && (isalnum(z
1df30 4c 69 6e 65 5b 69 5d 29 20 7c 7c 20 7a 4c 69 6e  Line[i]) || zLin
1df40 65 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69 2d 2d 29  e[i]=='_'); i--)
1df50 7b 7d 0a 20 20 69 66 28 20 69 3d 3d 6e 4c 69 6e  {}.  if( i==nLin
1df60 65 2d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  e-1 ) return;.  
1df70 69 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20  iStart = i+1;.  
1df80 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69  memcpy(zBuf, zLi
1df90 6e 65 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 7a  ne, iStart);.  z
1dfa0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
1dfb0 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49  rintf("SELECT DI
1dfc0 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65  STINCT candidate
1dfd0 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22   COLLATE nocase"
1dfe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dff0 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f            "  FRO
1e000 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 2c  M completion(%Q,
1e010 25 51 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c  %Q) ORDER BY 1",
1e020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e030 20 20 20 20 20 20 20 20 20 20 26 7a 4c 69 6e 65            &zLine
1e040 5b 69 53 74 61 72 74 5d 2c 20 7a 4c 69 6e 65 29  [iStart], zLine)
1e050 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ;.  sqlite3_prep
1e060 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c  are_v2(globalDb,
1e070 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
1e080 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
1e090 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73  _free(zSql);.  s
1e0a0 71 6c 69 74 65 33 5f 65 78 65 63 28 67 6c 6f 62  qlite3_exec(glob
1e0b0 61 6c 44 62 2c 20 22 50 52 41 47 4d 41 20 70 61  alDb, "PRAGMA pa
1e0c0 67 65 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 30 2c  ge_count", 0, 0,
1e0d0 20 30 29 3b 20 2f 2a 20 4c 6f 61 64 20 74 68 65   0); /* Load the
1e0e0 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 77 68 69   schema */.  whi
1e0f0 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
1e100 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
1e110 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ROW ){.    const
1e120 20 63 68 61 72 20 2a 7a 43 6f 6d 70 6c 65 74 69   char *zCompleti
1e130 6f 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  on = (const char
1e140 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
1e150 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b  _text(pStmt, 0);
1e160 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6d 70 6c 65  .    int nComple
1e170 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63  tion = sqlite3_c
1e180 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
1e190 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69  t, 0);.    if( i
1e1a0 53 74 61 72 74 2b 6e 43 6f 6d 70 6c 65 74 69 6f  Start+nCompletio
1e1b0 6e 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29  n < sizeof(zBuf)
1e1c0 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  -1 ){.      memc
1e1d0 70 79 28 7a 42 75 66 2b 69 53 74 61 72 74 2c 20  py(zBuf+iStart, 
1e1e0 7a 43 6f 6d 70 6c 65 74 69 6f 6e 2c 20 6e 43 6f  zCompletion, nCo
1e1f0 6d 70 6c 65 74 69 6f 6e 2b 31 29 3b 0a 20 20 20  mpletion+1);.   
1e200 20 20 20 6c 69 6e 65 6e 6f 69 73 65 41 64 64 43     linenoiseAddC
1e210 6f 6d 70 6c 65 74 69 6f 6e 28 6c 63 2c 20 7a 42  ompletion(lc, zB
1e220 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  uf);.    }.  }. 
1e230 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1e240 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 23 65 6e 64  e(pStmt);.}.#end
1e250 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d 6c  if../*.** Do C-l
1e260 61 6e 67 75 61 67 65 20 73 74 79 6c 65 20 64 65  anguage style de
1e270 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  quoting..**.**  
1e280 20 20 5c 61 20 20 20 20 2d 3e 20 61 6c 61 72 6d    \a    -> alarm
1e290 0a 2a 2a 20 20 20 20 5c 62 20 20 20 20 2d 3e 20  .**    \b    -> 
1e2a0 62 61 63 6b 73 70 61 63 65 0a 2a 2a 20 20 20 20  backspace.**    
1e2b0 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a 2a 2a 20  \t    -> tab.** 
1e2c0 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e 65 77 6c     \n    -> newl
1e2d0 69 6e 65 0a 2a 2a 20 20 20 20 5c 76 20 20 20 20  ine.**    \v    
1e2e0 2d 3e 20 76 65 72 74 69 63 61 6c 20 74 61 62 0a  -> vertical tab.
1e2f0 2a 2a 20 20 20 20 5c 66 20 20 20 20 2d 3e 20 66  **    \f    -> f
1e300 6f 72 6d 20 66 65 65 64 0a 2a 2a 20 20 20 20 5c  orm feed.**    \
1e310 72 20 20 20 20 2d 3e 20 63 61 72 72 69 61 67 65  r    -> carriage
1e320 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 20 5c 73   return.**    \s
1e330 20 20 20 20 2d 3e 20 73 70 61 63 65 0a 2a 2a 20      -> space.** 
1e340 20 20 20 5c 22 20 20 20 20 2d 3e 20 22 0a 2a 2a     \"    -> ".**
1e350 20 20 20 20 5c 27 20 20 20 20 2d 3e 20 27 0a 2a      \'    -> '.*
1e360 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e 20 62 61  *    \\    -> ba
1e370 63 6b 73 6c 61 73 68 0a 2a 2a 20 20 20 20 5c 4e  ckslash.**    \N
1e380 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20 63 68 61  NN  -> ascii cha
1e390 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e 20 6f 63  racter NNN in oc
1e3a0 74 61 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  tal.*/.static vo
1e3b0 69 64 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73  id resolve_backs
1e3c0 6c 61 73 68 65 73 28 63 68 61 72 20 2a 7a 29 7b  lashes(char *z){
1e3d0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  .  int i, j;.  c
1e3e0 68 61 72 20 63 3b 0a 20 20 77 68 69 6c 65 28 20  har c;.  while( 
1e3f0 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 5c 27 20 29  *z && *z!='\\' )
1e400 20 7a 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d   z++;.  for(i=j=
1e410 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  0; (c = z[i])!=0
1e420 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
1e430 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 26 26 20   if( c=='\\' && 
1e440 7a 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a 20 20 20  z[i+1]!=0 ){.   
1e450 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20     c = z[++i];. 
1e460 20 20 20 20 20 69 66 28 20 63 3d 3d 27 61 27 20       if( c=='a' 
1e470 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
1e480 5c 61 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \a';.      }else
1e490 20 69 66 28 20 63 3d 3d 27 62 27 20 29 7b 0a 20   if( c=='b' ){. 
1e4a0 20 20 20 20 20 20 20 63 20 3d 20 27 5c 62 27 3b         c = '\b';
1e4b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1e4c0 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20   c=='t' ){.     
1e4d0 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20 20     c = '\t';.   
1e4e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
1e4f0 27 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  'n' ){.        c
1e500 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 7d   = '\n';.      }
1e510 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 76 27 20  else if( c=='v' 
1e520 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
1e530 5c 76 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \v';.      }else
1e540 20 69 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20   if( c=='f' ){. 
1e550 20 20 20 20 20 20 20 63 20 3d 20 27 5c 66 27 3b         c = '\f';
1e560 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1e570 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20   c=='r' ){.     
1e580 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20     c = '\r';.   
1e590 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
1e5a0 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  '"' ){.        c
1e5b0 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 7d 65   = '"';.      }e
1e5c0 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20  lse if( c=='\'' 
1e5d0 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
1e5e0 5c 27 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \'';.      }else
1e5f0 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a   if( c=='\\' ){.
1e600 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 5c 27          c = '\\'
1e610 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1e620 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27  ( c>='0' && c<='
1e630 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  7' ){.        c 
1e640 2d 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20  -= '0';.        
1e650 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20  if( z[i+1]>='0' 
1e660 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29  && z[i+1]<='7' )
1e670 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b  {.          i++;
1e680 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 28  .          c = (
1e690 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27  c<<3) + z[i] - '
1e6a0 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0';.          if
1e6b0 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26  ( z[i+1]>='0' &&
1e6c0 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a   z[i+1]<='7' ){.
1e6d0 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b              i++;
1e6e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d  .            c =
1e6f0 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d   (c<<3) + z[i] -
1e700 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '0';.          
1e710 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1e720 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
1e730 6a 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66  j] = c;.  }.  if
1e740 28 20 6a 3c 69 20 29 20 7a 5b 6a 5d 20 3d 20 30  ( j<i ) z[j] = 0
1e750 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  ;.}../*.** Inter
1e760 70 72 65 74 20 7a 41 72 67 20 61 73 20 65 69 74  pret zArg as eit
1e770 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  her an integer o
1e780 72 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  r a boolean valu
1e790 65 2e 20 20 52 65 74 75 72 6e 20 31 20 6f 72 20  e.  Return 1 or 
1e7a0 30 0a 2a 2a 20 66 6f 72 20 54 52 55 45 20 61 6e  0.** for TRUE an
1e7b0 64 20 46 41 4c 53 45 2e 20 20 52 65 74 75 72 6e  d FALSE.  Return
1e7c0 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
1e7d0 75 65 20 69 66 20 61 70 70 72 6f 70 72 69 61 74  ue if appropriat
1e7e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1e7f0 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 63 6f   booleanValue(co
1e800 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b  nst char *zArg){
1e810 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1e820 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20  zArg[0]=='0' && 
1e830 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a  zArg[1]=='x' ){.
1e840 20 20 20 20 66 6f 72 28 69 3d 32 3b 20 68 65 78      for(i=2; hex
1e850 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67 5b  DigitValue(zArg[
1e860 69 5d 29 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20  i])>=0; i++){}. 
1e870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
1e880 69 3d 30 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27 30  i=0; zArg[i]>='0
1e890 27 20 26 26 20 7a 41 72 67 5b 69 5d 3c 3d 27 39  ' && zArg[i]<='9
1e8a0 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 0a 20 20  '; i++){}.  }.  
1e8b0 69 66 28 20 69 3e 30 20 26 26 20 7a 41 72 67 5b  if( i>0 && zArg[
1e8c0 69 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28  i]==0 ) return (
1e8d0 69 6e 74 29 28 69 6e 74 65 67 65 72 56 61 6c 75  int)(integerValu
1e8e0 65 28 7a 41 72 67 29 20 26 20 30 78 66 66 66 66  e(zArg) & 0xffff
1e8f0 66 66 66 66 29 3b 0a 20 20 69 66 28 20 73 71 6c  ffff);.  if( sql
1e900 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
1e910 67 2c 20 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20 73  g, "on")==0 || s
1e920 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
1e930 41 72 67 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b  Arg,"yes")==0 ){
1e940 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
1e950 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
1e960 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22  _stricmp(zArg, "
1e970 6f 66 66 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69  off")==0 || sqli
1e980 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67  te3_stricmp(zArg
1e990 2c 22 6e 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ,"no")==0 ){.   
1e9a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1e9b0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1e9c0 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 74  err, "ERROR: Not
1e9d0 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
1e9e0 3a 20 5c 22 25 73 5c 22 2e 20 41 73 73 75 6d 69  : \"%s\". Assumi
1e9f0 6e 67 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20  ng \"no\".\n",. 
1ea00 20 20 20 20 20 20 20 20 20 7a 41 72 67 29 3b 0a           zArg);.
1ea10 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1ea20 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61  *.** Set or clea
1ea30 72 20 61 20 73 68 65 6c 6c 20 66 6c 61 67 20 61  r a shell flag a
1ea40 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 20 62 6f  ccording to a bo
1ea50 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a  olean value..*/.
1ea60 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4f  static void setO
1ea70 72 43 6c 65 61 72 46 6c 61 67 28 53 68 65 6c 6c  rClearFlag(Shell
1ea80 53 74 61 74 65 20 2a 70 2c 20 75 6e 73 69 67 6e  State *p, unsign
1ea90 65 64 20 6d 46 6c 61 67 2c 20 63 6f 6e 73 74 20  ed mFlag, const 
1eaa0 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69  char *zArg){.  i
1eab0 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28  f( booleanValue(
1eac0 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 53 68 65  zArg) ){.    She
1ead0 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 6d 46 6c  llSetFlag(p, mFl
1eae0 61 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ag);.  }else{.  
1eaf0 20 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67    ShellClearFlag
1eb00 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 0a  (p, mFlag);.  }.
1eb10 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
1eb20 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2c 20 61  n output file, a
1eb30 73 73 75 6d 69 6e 67 20 69 74 20 69 73 20 6e 6f  ssuming it is no
1eb40 74 20 73 74 64 65 72 72 20 6f 72 20 73 74 64 6f  t stderr or stdo
1eb50 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ut.*/.static voi
1eb60 64 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c  d output_file_cl
1eb70 6f 73 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20  ose(FILE *f){.  
1eb80 69 66 28 20 66 20 26 26 20 66 21 3d 73 74 64 6f  if( f && f!=stdo
1eb90 75 74 20 26 26 20 66 21 3d 73 74 64 65 72 72 20  ut && f!=stderr 
1eba0 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a  ) fclose(f);.}..
1ebb0 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 70 65  /*.** Try to ope
1ebc0 6e 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65  n an output file
1ebd0 2e 20 20 20 54 68 65 20 6e 61 6d 65 73 20 22 73  .   The names "s
1ebe0 74 64 6f 75 74 22 20 61 6e 64 20 22 73 74 64 65  tdout" and "stde
1ebf0 72 72 22 20 61 72 65 0a 2a 2a 20 72 65 63 6f 67  rr" are.** recog
1ec00 6e 69 7a 65 64 20 61 6e 64 20 64 6f 20 74 68 65  nized and do the
1ec10 20 72 69 67 68 74 20 74 68 69 6e 67 2e 20 20 4e   right thing.  N
1ec20 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
1ec30 69 66 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  if the output.**
1ec40 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 22 6f 66   filename is "of
1ec50 66 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 49  f"..*/.static FI
1ec60 4c 45 20 2a 6f 75 74 70 75 74 5f 66 69 6c 65 5f  LE *output_file_
1ec70 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  open(const char 
1ec80 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 62 54 65 78  *zFile, int bTex
1ec90 74 4d 6f 64 65 29 7b 0a 20 20 46 49 4c 45 20 2a  tMode){.  FILE *
1eca0 66 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  f;.  if( strcmp(
1ecb0 7a 46 69 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d  zFile,"stdout")=
1ecc0 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74  =0 ){.    f = st
1ecd0 64 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  dout;.  }else if
1ece0 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20  ( strcmp(zFile, 
1ecf0 22 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a  "stderr")==0 ){.
1ed00 20 20 20 20 66 20 3d 20 73 74 64 65 72 72 3b 0a      f = stderr;.
1ed10 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1ed20 6d 70 28 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29  mp(zFile, "off")
1ed30 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 30  ==0 ){.    f = 0
1ed40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
1ed50 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20   = fopen(zFile, 
1ed60 62 54 65 78 74 4d 6f 64 65 20 3f 20 22 77 22 20  bTextMode ? "w" 
1ed70 3a 20 22 77 62 22 29 3b 0a 20 20 20 20 69 66 28  : "wb");.    if(
1ed80 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75   f==0 ){.      u
1ed90 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1eda0 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
1edb0 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
1edc0 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  , zFile);.    }.
1edd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 3b 0a    }.  return f;.
1ede0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1edf0 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a  E_OMIT_TRACE./*.
1ee00 2a 2a 20 41 20 72 6f 75 74 69 6e 65 20 66 6f 72  ** A routine for
1ee10 20 68 61 6e 64 6c 69 6e 67 20 6f 75 74 70 75 74   handling output
1ee20 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 74 72   from sqlite3_tr
1ee30 61 63 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ace()..*/.static
1ee40 20 69 6e 74 20 73 71 6c 5f 74 72 61 63 65 5f 63   int sql_trace_c
1ee50 61 6c 6c 62 61 63 6b 28 0a 20 20 75 6e 73 69 67  allback(.  unsig
1ee60 6e 65 64 20 6d 54 79 70 65 2c 20 20 20 20 20 20  ned mType,      
1ee70 20 20 20 2f 2a 20 54 68 65 20 74 72 61 63 65 20     /* The trace 
1ee80 74 79 70 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  type */.  void *
1ee90 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  pArg,           
1eea0 20 20 2f 2a 20 54 68 65 20 53 68 65 6c 6c 53 74    /* The ShellSt
1eeb0 61 74 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ate pointer */. 
1eec0 20 76 6f 69 64 20 2a 70 50 2c 20 20 20 20 20 20   void *pP,      
1eed0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 75 61           /* Usua
1eee0 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
1eef0 20 73 71 6c 69 74 65 5f 73 74 6d 74 20 2a 2f 0a   sqlite_stmt */.
1ef00 20 20 76 6f 69 64 20 2a 70 58 20 20 20 20 20 20    void *pX      
1ef10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75 78            /* Aux
1ef20 69 6c 69 61 72 79 20 6f 75 74 70 75 74 20 2a 2f  iliary output */
1ef30 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  .){.  ShellState
1ef40 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74   *p = (ShellStat
1ef50 65 2a 29 70 41 72 67 3b 0a 20 20 73 71 6c 69 74  e*)pArg;.  sqlit
1ef60 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1ef70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1ef80 71 6c 3b 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 0a  ql;.  int nSql;.
1ef90 20 20 69 66 28 20 70 2d 3e 74 72 61 63 65 4f 75    if( p->traceOu
1efa0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
1efb0 0a 20 20 69 66 28 20 6d 54 79 70 65 3d 3d 53 51  .  if( mType==SQ
1efc0 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45  LITE_TRACE_CLOSE
1efd0 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
1efe0 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c  ntf(p->traceOut,
1eff0 20 22 2d 2d 20 63 6c 6f 73 69 6e 67 20 64 61 74   "-- closing dat
1f000 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1f010 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  \n");.    return
1f020 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 54   0;.  }.  if( mT
1f030 79 70 65 21 3d 53 51 4c 49 54 45 5f 54 52 41 43  ype!=SQLITE_TRAC
1f040 45 5f 52 4f 57 20 26 26 20 28 28 63 6f 6e 73 74  E_ROW && ((const
1f050 20 63 68 61 72 2a 29 70 58 29 5b 30 5d 3d 3d 27   char*)pX)[0]=='
1f060 2d 27 20 29 7b 0a 20 20 20 20 7a 53 71 6c 20 3d  -' ){.    zSql =
1f070 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 58   (const char*)pX
1f080 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1f090 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65 33 5f  Stmt = (sqlite3_
1f0a0 73 74 6d 74 2a 29 70 50 3b 0a 20 20 20 20 73 77  stmt*)pP;.    sw
1f0b0 69 74 63 68 28 20 70 2d 3e 65 54 72 61 63 65 54  itch( p->eTraceT
1f0c0 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
1f0d0 65 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f 45 58  e SHELL_TRACE_EX
1f0e0 50 41 4e 44 45 44 3a 20 7b 0a 20 20 20 20 20 20  PANDED: {.      
1f0f0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
1f100 5f 65 78 70 61 6e 64 65 64 5f 73 71 6c 28 70 53  _expanded_sql(pS
1f110 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  tmt);.        br
1f120 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  eak;.      }.#if
1f130 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1f140 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 20 20  E_NORMALIZE.    
1f150 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 54 52 41    case SHELL_TRA
1f160 43 45 5f 4e 4f 52 4d 41 4c 49 5a 45 44 3a 20 7b  CE_NORMALIZED: {
1f170 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  .        zSql = 
1f180 73 71 6c 69 74 65 33 5f 6e 6f 72 6d 61 6c 69 7a  sqlite3_normaliz
1f190 65 64 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20  ed_sql(pStmt);. 
1f1a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1f1b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1f1c0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
1f1d0 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
1f1e0 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b  ite3_sql(pStmt);
1f1f0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1f200 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f210 7d 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  }.  if( zSql==0 
1f220 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 53  ) return 0;.  nS
1f230 71 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53  ql = strlen30(zS
1f240 71 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53  ql);.  while( nS
1f250 71 6c 3e 30 20 26 26 20 7a 53 71 6c 5b 6e 53 71  ql>0 && zSql[nSq
1f260 6c 2d 31 5d 3d 3d 27 3b 27 20 29 7b 20 6e 53 71  l-1]==';' ){ nSq
1f270 6c 2d 2d 3b 20 7d 0a 20 20 73 77 69 74 63 68 28  l--; }.  switch(
1f280 20 6d 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61   mType ){.    ca
1f290 73 65 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f  se SQLITE_TRACE_
1f2a0 52 4f 57 3a 0a 20 20 20 20 63 61 73 65 20 53 51  ROW:.    case SQ
1f2b0 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54 3a  LITE_TRACE_STMT:
1f2c0 20 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72   {.      utf8_pr
1f2d0 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75 74  intf(p->traceOut
1f2e0 2c 20 22 25 2e 2a 73 3b 5c 6e 22 2c 20 6e 53 71  , "%.*s;\n", nSq
1f2f0 6c 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  l, zSql);.      
1f300 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f310 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41   case SQLITE_TRA
1f320 43 45 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20  CE_PROFILE: {.  
1f330 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
1f340 34 20 6e 4e 61 6e 6f 73 65 63 20 3d 20 2a 28 73  4 nNanosec = *(s
1f350 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 58  qlite3_int64*)pX
1f360 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
1f370 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c  ntf(p->traceOut,
1f380 20 22 25 2e 2a 73 3b 20 2d 2d 20 25 6c 6c 64 20   "%.*s; -- %lld 
1f390 6e 73 5c 6e 22 2c 20 6e 53 71 6c 2c 20 7a 53 71  ns\n", nSql, zSq
1f3a0 6c 2c 20 6e 4e 61 6e 6f 73 65 63 29 3b 0a 20 20  l, nNanosec);.  
1f3b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f3c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1f3d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1f3e0 20 41 20 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65   A no-op routine
1f3f0 20 74 68 61 74 20 72 75 6e 73 20 77 69 74 68 20   that runs with 
1f400 74 68 65 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74  the ".breakpoint
1f410 22 20 64 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20 20  " doc-command.  
1f420 54 68 69 73 20 69 73 0a 2a 2a 20 61 20 75 73 65  This is.** a use
1f430 66 75 6c 20 73 70 6f 74 20 74 6f 20 73 65 74 20  ful spot to set 
1f440 61 20 64 65 62 75 67 67 65 72 20 62 72 65 61 6b  a debugger break
1f450 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
1f460 20 76 6f 69 64 20 74 65 73 74 5f 62 72 65 61 6b   void test_break
1f470 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73  point(void){.  s
1f480 74 61 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20  tatic int nCall 
1f490 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a  = 0;.  nCall++;.
1f4a0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65  }../*.** An obje
1f4b0 63 74 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  ct used to read 
1f4c0 61 20 43 53 56 20 61 6e 64 20 6f 74 68 65 72 20  a CSV and other 
1f4d0 66 69 6c 65 73 20 66 6f 72 20 69 6d 70 6f 72 74  files for import
1f4e0 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
1f4f0 75 63 74 20 49 6d 70 6f 72 74 43 74 78 20 49 6d  uct ImportCtx Im
1f500 70 6f 72 74 43 74 78 3b 0a 73 74 72 75 63 74 20  portCtx;.struct 
1f510 49 6d 70 6f 72 74 43 74 78 20 7b 0a 20 20 63 6f  ImportCtx {.  co
1f520 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  nst char *zFile;
1f530 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1f540 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
1f550 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20   FILE *in;      
1f560 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65       /* Read the
1f570 20 43 53 56 20 74 65 78 74 20 66 72 6f 6d 20 74   CSV text from t
1f580 68 69 73 20 69 6e 70 75 74 20 73 74 72 65 61 6d  his input stream
1f590 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
1f5a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63            /* Acc
1f5b0 75 6d 75 6c 61 74 65 64 20 74 65 78 74 20 66 6f  umulated text fo
1f5c0 72 20 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69  r a field */.  i
1f5d0 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
1f5e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f5f0 62 79 74 65 73 20 69 6e 20 7a 20 2a 2f 0a 20 20  bytes in z */.  
1f600 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20  int nAlloc;     
1f610 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c      /* Space all
1f620 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20 2a  ocated for z[] *
1f630 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20  /.  int nLine;  
1f640 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1f650 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a  nt line number *
1f660 2f 0a 20 20 69 6e 74 20 62 4e 6f 74 46 69 72 73  /.  int bNotFirs
1f670 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  t;      /* True 
1f680 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62  if one or more b
1f690 79 74 65 73 20 61 6c 72 65 61 64 79 20 72 65 61  ytes already rea
1f6a0 64 20 2a 2f 0a 20 20 69 6e 74 20 63 54 65 72 6d  d */.  int cTerm
1f6b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ;          /* Ch
1f6c0 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72  aracter that ter
1f6d0 6d 69 6e 61 74 65 64 20 74 68 65 20 6d 6f 73 74  minated the most
1f6e0 20 72 65 63 65 6e 74 20 66 69 65 6c 64 20 2a 2f   recent field */
1f6f0 0a 20 20 69 6e 74 20 63 43 6f 6c 53 65 70 3b 20  .  int cColSep; 
1f700 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1f710 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 63  lumn separator c
1f720 68 61 72 61 63 74 65 72 2e 20 20 28 55 73 75 61  haracter.  (Usua
1f730 6c 6c 79 20 22 2c 22 29 20 2a 2f 0a 20 20 69 6e  lly ",") */.  in
1f740 74 20 63 52 6f 77 53 65 70 3b 20 20 20 20 20 20  t cRowSep;      
1f750 20 20 2f 2a 20 54 68 65 20 72 6f 77 20 73 65 70    /* The row sep
1f760 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
1f770 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 5c 6e 22  .  (Usually "\n"
1f780 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70 65  ) */.};../* Appe
1f790 6e 64 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  nd a single byte
1f7a0 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74 69   to z[] */.stati
1f7b0 63 20 76 6f 69 64 20 69 6d 70 6f 72 74 5f 61 70  c void import_ap
1f7c0 70 65 6e 64 5f 63 68 61 72 28 49 6d 70 6f 72 74  pend_char(Import
1f7d0 43 74 78 20 2a 70 2c 20 69 6e 74 20 63 29 7b 0a  Ctx *p, int c){.
1f7e0 20 20 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70 2d    if( p->n+1>=p-
1f7f0 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70  >nAlloc ){.    p
1f800 2d 3e 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e 6e  ->nAlloc += p->n
1f810 41 6c 6c 6f 63 20 2b 20 31 30 30 3b 0a 20 20 20  Alloc + 100;.   
1f820 20 70 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33 5f   p->z = sqlite3_
1f830 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c 20  realloc64(p->z, 
1f840 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  p->nAlloc);.    
1f850 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73 68  if( p->z==0 ) sh
1f860 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  ell_out_of_memor
1f870 79 28 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a 5b  y();.  }.  p->z[
1f880 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61 72 29  p->n++] = (char)
1f890 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20  c;.}../* Read a 
1f8a0 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66 20  single field of 
1f8b0 43 53 56 20 74 65 78 74 2e 20 20 43 6f 6d 70 61  CSV text.  Compa
1f8c0 74 69 62 6c 65 20 77 69 74 68 20 72 66 63 34 31  tible with rfc41
1f8d0 38 30 20 61 6e 64 20 65 78 74 65 6e 64 65 64 0a  80 and extended.
1f8e0 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 70 74 69  ** with the opti
1f8f0 6f 6e 20 6f 66 20 68 61 76 69 6e 67 20 61 20 73  on of having a s
1f900 65 70 61 72 61 74 6f 72 20 6f 74 68 65 72 20 74  eparator other t
1f910 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20 20  han ","..**.**  
1f920 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65 73 20   +  Input comes 
1f930 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20  from p->in..**  
1f940 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74   +  Store result
1f950 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e  s in p->z of len
1f960 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65  gth p->n.  Space
1f970 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f   to hold p->z co
1f980 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  mes.**      from
1f990 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
1f9a0 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65  4()..**   +  Use
1f9b0 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68 65 20   p->cSep as the 
1f9c0 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
1f9d0 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
1f9e0 73 20 22 2c 22 2e 0a 2a 2a 20 20 20 2b 20 20 55  s ","..**   +  U
1f9f0 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74 68  se p->rSep as th
1fa00 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e  e row separator.
1fa10 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
1fa20 20 22 5c 6e 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b   "\n"..**   +  K
1fa30 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
1fa40 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e 20   line number in 
1fa50 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b  p->nLine..**   +
1fa60 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61 72    Store the char
1fa70 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d 69  acter that termi
1fa80 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64 20  nates the field 
1fa90 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74  in p->cTerm.  St
1faa0 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20  ore.**      EOF 
1fab0 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a  on end-of-file..
1fac0 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20 73  **   +  Report s
1fad0 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e 20  yntax errors on 
1fae0 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63  stderr.*/.static
1faf0 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43 44   char *SQLITE_CD
1fb00 45 43 4c 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65  ECL csv_read_one
1fb10 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43 74 78  _field(ImportCtx
1fb20 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20   *p){.  int c;. 
1fb30 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e 63   int cSep = p->c
1fb40 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72 53  ColSep;.  int rS
1fb50 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b  ep = p->cRowSep;
1fb60 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63  .  p->n = 0;.  c
1fb70 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b   = fgetc(p->in);
1fb80 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c  .  if( c==EOF ||
1fb90 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29   seenInterrupt )
1fba0 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d  {.    p->cTerm =
1fbb0 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 72 6e   EOF;.    return
1fbc0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d   0;.  }.  if( c=
1fbd0 3d 27 22 27 20 29 7b 0a 20 20 20 20 69 6e 74 20  ='"' ){.    int 
1fbe0 70 63 2c 20 70 70 63 3b 0a 20 20 20 20 69 6e 74  pc, ppc;.    int
1fbf0 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 70 2d 3e   startLine = p->
1fc00 6e 4c 69 6e 65 3b 0a 20 20 20 20 69 6e 74 20 63  nLine;.    int c
1fc10 51 75 6f 74 65 20 3d 20 63 3b 0a 20 20 20 20 70  Quote = c;.    p
1fc20 63 20 3d 20 70 70 63 20 3d 20 30 3b 0a 20 20 20  c = ppc = 0;.   
1fc30 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
1fc40 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e     c = fgetc(p->
1fc50 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  in);.      if( c
1fc60 3d 3d 72 53 65 70 20 29 20 70 2d 3e 6e 4c 69 6e  ==rSep ) p->nLin
1fc70 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63  e++;.      if( c
1fc80 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20 20 20  ==cQuote ){.    
1fc90 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51 75 6f      if( pc==cQuo
1fca0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
1fcb0 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pc = 0;.        
1fcc0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1fcd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1fce0 20 20 20 20 69 66 28 20 28 63 3d 3d 63 53 65 70      if( (c==cSep
1fcf0 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a   && pc==cQuote).
1fd00 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53         || (c==rS
1fd10 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65  ep && pc==cQuote
1fd20 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d  ).       || (c==
1fd30 72 53 65 70 20 26 26 20 70 63 3d 3d 27 5c 72 27  rSep && pc=='\r'
1fd40 20 26 26 20 70 70 63 3d 3d 63 51 75 6f 74 65 29   && ppc==cQuote)
1fd50 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 45  .       || (c==E
1fd60 4f 46 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65  OF && pc==cQuote
1fd70 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
1fd80 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d     do{ p->n--; }
1fd90 77 68 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e 6e  while( p->z[p->n
1fda0 5d 21 3d 63 51 75 6f 74 65 20 29 3b 0a 20 20 20  ]!=cQuote );.   
1fdb0 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20       p->cTerm = 
1fdc0 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  c;.        break
1fdd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fde0 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20 26  if( pc==cQuote &
1fdf0 26 20 63 21 3d 27 5c 72 27 20 29 7b 0a 20 20 20  & c!='\r' ){.   
1fe00 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1fe10 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
1fe20 20 75 6e 65 73 63 61 70 65 64 20 25 63 20 63 68   unescaped %c ch
1fe30 61 72 61 63 74 65 72 5c 6e 22 2c 0a 20 20 20 20  aracter\n",.    
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
1fe50 46 69 6c 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c 20  File, p->nLine, 
1fe60 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 7d  cQuote);.      }
1fe70 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 45 4f  .      if( c==EO
1fe80 46 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  F ){.        utf
1fe90 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1fea0 20 22 25 73 3a 25 64 3a 20 75 6e 74 65 72 6d 69   "%s:%d: untermi
1feb0 6e 61 74 65 64 20 25 63 2d 71 75 6f 74 65 64 20  nated %c-quoted 
1fec0 66 69 65 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20  field\n",.      
1fed0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 69            p->zFi
1fee0 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 63  le, startLine, c
1fef0 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 20 20  Quote);.        
1ff00 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20  p->cTerm = c;.  
1ff10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ff20 20 20 20 7d 0a 20 20 20 20 20 20 69 6d 70 6f 72     }.      impor
1ff30 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c  t_append_char(p,
1ff40 20 63 29 3b 0a 20 20 20 20 20 20 70 70 63 20 3d   c);.      ppc =
1ff50 20 70 63 3b 0a 20 20 20 20 20 20 70 63 20 3d 20   pc;.      pc = 
1ff60 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  c;.    }.  }else
1ff70 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
1ff80 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66 69   is the first fi
1ff90 65 6c 64 20 62 65 69 6e 67 20 70 61 72 73 65 64  eld being parsed
1ffa0 20 61 6e 64 20 69 74 20 62 65 67 69 6e 73 20 77   and it begins w
1ffb0 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 55  ith the.    ** U
1ffc0 54 46 2d 38 20 42 4f 4d 20 20 28 30 78 45 46 20  TF-8 BOM  (0xEF 
1ffd0 42 42 20 42 46 29 20 74 68 65 6e 20 73 6b 69 70  BB BF) then skip
1ffe0 20 74 68 65 20 42 4f 4d 20 2a 2f 0a 20 20 20 20   the BOM */.    
1fff0 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78  if( (c&0xff)==0x
20000 65 66 20 26 26 20 70 2d 3e 62 4e 6f 74 46 69 72  ef && p->bNotFir
20010 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  st==0 ){.      i
20020 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
20030 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 63  r(p, c);.      c
20040 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b   = fgetc(p->in);
20050 0a 20 20 20 20 20 20 69 66 28 20 28 63 26 30 78  .      if( (c&0x
20060 66 66 29 3d 3d 30 78 62 62 20 29 7b 0a 20 20 20  ff)==0xbb ){.   
20070 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65       import_appe
20080 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20  nd_char(p, c);. 
20090 20 20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63         c = fgetc
200a0 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20  (p->in);.       
200b0 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30   if( (c&0xff)==0
200c0 78 62 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xbf ){.         
200d0 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20   p->bNotFirst = 
200e0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  1;.          p->
200f0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
20100 20 72 65 74 75 72 6e 20 63 73 76 5f 72 65 61 64   return csv_read
20110 5f 6f 6e 65 5f 66 69 65 6c 64 28 70 29 3b 0a 20  _one_field(p);. 
20120 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20130 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
20140 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d 63  ( c!=EOF && c!=c
20150 53 65 70 20 26 26 20 63 21 3d 72 53 65 70 20 29  Sep && c!=rSep )
20160 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61  {.      import_a
20170 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29  ppend_char(p, c)
20180 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65 74  ;.      c = fget
20190 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d 0a  c(p->in);.    }.
201a0 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20      if( c==rSep 
201b0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6e  ){.      p->nLin
201c0 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
201d0 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b 70 2d  ->n>0 && p->z[p-
201e0 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 70 2d  >n-1]=='\r' ) p-
201f0 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >n--;.    }.    
20200 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20  p->cTerm = c;.  
20210 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70  }.  if( p->z ) p
20220 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  ->z[p->n] = 0;. 
20230 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20   p->bNotFirst = 
20240 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a  1;.  return p->z
20250 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73  ;.}../* Read a s
20260 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66 20 41  ingle field of A
20270 53 43 49 49 20 64 65 6c 69 6d 69 74 65 64 20 74  SCII delimited t
20280 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20  ext..**.**   +  
20290 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d  Input comes from
202a0 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20   p->in..**   +  
202b0 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e  Store results in
202c0 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20   p->z of length 
202d0 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  p->n.  Space to 
202e0 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a  hold p->z comes.
202f0 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71 6c  **      from sql
20300 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e  ite3_malloc64().
20310 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e  .**   +  Use p->
20320 63 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c 75  cSep as the colu
20330 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54  mn separator.  T
20340 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c  he default is "\
20350 78 31 46 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73  x1F"..**   +  Us
20360 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74 68 65  e p->rSep as the
20370 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20   row separator. 
20380 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
20390 22 5c 78 31 45 22 2e 0a 2a 2a 20 20 20 2b 20 20  "\x1E"..**   +  
203a0 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
203b0 65 20 72 6f 77 20 6e 75 6d 62 65 72 20 69 6e 20  e row number in 
203c0 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b  p->nLine..**   +
203d0 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61 72    Store the char
203e0 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d 69  acter that termi
203f0 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64 20  nates the field 
20400 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74  in p->cTerm.  St
20410 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20  ore.**      EOF 
20420 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a  on end-of-file..
20430 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20 73  **   +  Report s
20440 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e 20  yntax errors on 
20450 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63  stderr.*/.static
20460 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43 44   char *SQLITE_CD
20470 45 43 4c 20 61 73 63 69 69 5f 72 65 61 64 5f 6f  ECL ascii_read_o
20480 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43  ne_field(ImportC
20490 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b  tx *p){.  int c;
204a0 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d  .  int cSep = p-
204b0 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20  >cColSep;.  int 
204c0 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65  rSep = p->cRowSe
204d0 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20  p;.  p->n = 0;. 
204e0 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
204f0 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20  );.  if( c==EOF 
20500 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  || seenInterrupt
20510 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d   ){.    p->cTerm
20520 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75   = EOF;.    retu
20530 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  rn 0;.  }.  whil
20540 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d  e( c!=EOF && c!=
20550 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70 20  cSep && c!=rSep 
20560 29 7b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61 70  ){.    import_ap
20570 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b  pend_char(p, c);
20580 0a 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70  .    c = fgetc(p
20590 2d 3e 69 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ->in);.  }.  if(
205a0 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20 20   c==rSep ){.    
205b0 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 7d 0a  p->nLine++;.  }.
205c0 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a    p->cTerm = c;.
205d0 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e    if( p->z ) p->
205e0 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 72  z[p->n] = 0;.  r
205f0 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f  eturn p->z;.}../
20600 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72 61 6e  *.** Try to tran
20610 73 66 65 72 20 64 61 74 61 20 66 6f 72 20 74 61  sfer data for ta
20620 62 6c 65 20 7a 54 61 62 6c 65 2e 20 20 49 66 20  ble zTable.  If 
20630 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e  an error is seen
20640 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e 67   while.** moving
20650 20 66 6f 72 77 61 72 64 2c 20 74 72 79 20 74 6f   forward, try to
20660 20 67 6f 20 62 61 63 6b 77 61 72 64 73 2e 20 20   go backwards.  
20670 54 68 65 20 62 61 63 6b 77 61 72 64 73 20 6d 6f  The backwards mo
20680 76 65 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a 20  vement won't.** 
20690 77 6f 72 6b 20 66 6f 72 20 57 49 54 48 4f 55 54  work for WITHOUT
206a0 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e 0a 2a   ROWID tables..*
206b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72  /.static void tr
206c0 79 54 6f 43 6c 6f 6e 65 44 61 74 61 28 0a 20 20  yToCloneData(.  
206d0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20  ShellState *p,. 
206e0 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c   sqlite3 *newDb,
206f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
20700 54 61 62 6c 65 0a 29 7b 0a 20 20 73 71 6c 69 74  Table.){.  sqlit
20710 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79 20  e3_stmt *pQuery 
20720 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
20730 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20 30  tmt *pInsert = 0
20740 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79  ;.  char *zQuery
20750 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 49   = 0;.  char *zI
20760 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74  nsert = 0;.  int
20770 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c   rc;.  int i, j,
20780 20 6e 3b 0a 20 20 69 6e 74 20 6e 54 61 62 6c 65   n;.  int nTable
20790 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54 61 62   = strlen30(zTab
207a0 6c 65 29 3b 0a 20 20 69 6e 74 20 6b 20 3d 20 30  le);.  int k = 0
207b0 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
207c0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 70 69  .  const int spi
207d0 6e 52 61 74 65 20 3d 20 31 30 30 30 30 3b 0a 0a  nRate = 10000;..
207e0 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74    zQuery = sqlit
207f0 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
20800 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22  CT * FROM \"%w\"
20810 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 72 63  ", zTable);.  rc
20820 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
20830 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75  re_v2(p->db, zQu
20840 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79  ery, -1, &pQuery
20850 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
20860 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
20870 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
20880 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c   %d: %s on [%s]\
20890 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
208a0 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
208b0 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c  _errcode(p->db),
208c0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
208d0 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20  p->db),.        
208e0 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20      zQuery);.   
208f0 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78   goto end_data_x
20900 66 65 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  fer;.  }.  n = s
20910 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
20920 75 6e 74 28 70 51 75 65 72 79 29 3b 0a 20 20 7a  unt(pQuery);.  z
20930 49 6e 73 65 72 74 20 3d 20 73 71 6c 69 74 65 33  Insert = sqlite3
20940 5f 6d 61 6c 6c 6f 63 36 34 28 32 30 30 20 2b 20  _malloc64(200 + 
20950 6e 54 61 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a 20  nTable + n*3);. 
20960 20 69 66 28 20 7a 49 6e 73 65 72 74 3d 3d 30 20   if( zInsert==0 
20970 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d  ) shell_out_of_m
20980 65 6d 6f 72 79 28 29 3b 0a 20 20 73 71 6c 69 74  emory();.  sqlit
20990 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 30 2b  e3_snprintf(200+
209a0 6e 54 61 62 6c 65 2c 7a 49 6e 73 65 72 74 2c 0a  nTable,zInsert,.
209b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209c0 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47     "INSERT OR IG
209d0 4e 4f 52 45 20 49 4e 54 4f 20 5c 22 25 73 5c 22  NORE INTO \"%s\"
209e0 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62   VALUES(?", zTab
209f0 6c 65 29 3b 0a 20 20 69 20 3d 20 73 74 72 6c 65  le);.  i = strle
20a00 6e 33 30 28 7a 49 6e 73 65 72 74 29 3b 0a 20 20  n30(zInsert);.  
20a10 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=1; j<n; j+
20a20 2b 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  +){.    memcpy(z
20a30 49 6e 73 65 72 74 2b 69 2c 20 22 2c 3f 22 2c 20  Insert+i, ",?", 
20a40 32 29 3b 0a 20 20 20 20 69 20 2b 3d 20 32 3b 0a  2);.    i += 2;.
20a50 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 49 6e    }.  memcpy(zIn
20a60 73 65 72 74 2b 69 2c 20 22 29 3b 22 2c 20 33 29  sert+i, ");", 3)
20a70 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
20a80 5f 70 72 65 70 61 72 65 5f 76 32 28 6e 65 77 44  _prepare_v2(newD
20a90 62 2c 20 7a 49 6e 73 65 72 74 2c 20 2d 31 2c 20  b, zInsert, -1, 
20aa0 26 70 49 6e 73 65 72 74 2c 20 30 29 3b 0a 20 20  &pInsert, 0);.  
20ab0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74  if( rc ){.    ut
20ac0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
20ad0 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 20  , "Error %d: %s 
20ae0 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20  on [%s]\n",.    
20af0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
20b00 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
20b10 28 6e 65 77 44 62 29 2c 20 73 71 6c 69 74 65 33  (newDb), sqlite3
20b20 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29 2c 0a  _errmsg(newDb),.
20b30 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
20b40 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  ry);.    goto en
20b50 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d  d_data_xfer;.  }
20b60 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 32 3b  .  for(k=0; k<2;
20b70 20 6b 2b 2b 29 7b 0a 20 20 20 20 77 68 69 6c 65   k++){.    while
20b80 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  ( (rc = sqlite3_
20b90 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d 53  step(pQuery))==S
20ba0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
20bb0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
20bc0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
20bd0 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63  witch( sqlite3_c
20be0 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 51 75 65 72  olumn_type(pQuer
20bf0 79 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20  y, i) ){.       
20c00 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
20c10 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ULL: {.         
20c20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
20c30 6e 75 6c 6c 28 70 49 6e 73 65 72 74 2c 20 69 2b  null(pInsert, i+
20c40 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
20c50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
20c60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   }.          cas
20c70 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
20c80 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
20c90 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
20ca0 36 34 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c  64(pInsert, i+1,
20cb0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
20cc0 69 6e 74 36 34 28 70 51 75 65 72 79 2c 69 29 29  int64(pQuery,i))
20cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
20ce0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
20cf0 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
20d00 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a  SQLITE_FLOAT: {.
20d10 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
20d20 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28  te3_bind_double(
20d30 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71  pInsert, i+1, sq
20d40 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
20d50 62 6c 65 28 70 51 75 65 72 79 2c 69 29 29 3b 0a  ble(pQuery,i));.
20d60 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
20d70 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
20d80 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
20d90 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20  LITE_TEXT: {.   
20da0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20db0 5f 62 69 6e 64 5f 74 65 78 74 28 70 49 6e 73 65  _bind_text(pInse
20dc0 72 74 2c 20 69 2b 31 2c 0a 20 20 20 20 20 20 20  rt, i+1,.       
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20de0 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61        (const cha
20df0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
20e00 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 69 29  n_text(pQuery,i)
20e10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
20e30 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
20e40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
20e50 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
20e60 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  }.          case
20e70 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a   SQLITE_BLOB: {.
20e80 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
20e90 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49  te3_bind_blob(pI
20ea0 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69  nsert, i+1, sqli
20eb0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
20ec0 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20  pQuery,i),.     
20ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ef0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
20f00 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 51 75 65  olumn_bytes(pQue
20f10 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20  ry,i),.         
20f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f40 20 20 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43     SQLITE_STATIC
20f50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
20f60 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
20f70 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
20f80 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 20 2a    } /* End for *
20f90 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
20fa0 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73 65 72  ite3_step(pInser
20fb0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
20fc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
20fd0 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26 26  c!=SQLITE_ROW &&
20fe0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
20ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
21000 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
21010 22 45 72 72 6f 72 20 25 64 3a 20 25 73 5c 6e 22  "Error %d: %s\n"
21020 2c 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  , sqlite3_extend
21030 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44 62  ed_errcode(newDb
21040 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
21050 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
21060 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29  e3_errmsg(newDb)
21070 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21080 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
21090 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20 63  Insert);.      c
210a0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
210b0 28 63 6e 74 25 73 70 69 6e 52 61 74 65 29 3d 3d  (cnt%spinRate)==
210c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69  0 ){.        pri
210d0 6e 74 66 28 22 25 63 5c 62 22 2c 20 22 7c 2f 2d  ntf("%c\b", "|/-
210e0 5c 5c 22 5b 28 63 6e 74 2f 73 70 69 6e 52 61 74  \\"[(cnt/spinRat
210f0 65 29 25 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  e)%4]);.        
21100 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
21110 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a        }.    } /*
21120 20 45 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 20 20   End while */.  
21130 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21140 5f 44 4f 4e 45 20 29 20 62 72 65 61 6b 3b 0a 20  _DONE ) break;. 
21150 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
21160 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 20  ize(pQuery);.   
21170 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
21180 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65 72  uery);.    zQuer
21190 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
211a0 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52  ntf("SELECT * FR
211b0 4f 4d 20 5c 22 25 77 5c 22 20 4f 52 44 45 52 20  OM \"%w\" ORDER 
211c0 42 59 20 72 6f 77 69 64 20 44 45 53 43 3b 22 2c  BY rowid DESC;",
211d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
211e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
211f0 61 62 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  able);.    rc = 
21200 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
21210 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79  v2(p->db, zQuery
21220 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30  , -1, &pQuery, 0
21230 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
21240 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
21250 74 66 28 73 74 64 65 72 72 2c 20 22 57 61 72 6e  tf(stderr, "Warn
21260 69 6e 67 3a 20 63 61 6e 6e 6f 74 20 73 74 65 70  ing: cannot step
21270 20 5c 22 25 73 5c 22 20 62 61 63 6b 77 61 72 64   \"%s\" backward
21280 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  s", zTable);.   
21290 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
212a0 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 28 6b    } /* End for(k
212b0 3d 30 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e 64 5f 64  =0...) */..end_d
212c0 61 74 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c 69  ata_xfer:.  sqli
212d0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75  te3_finalize(pQu
212e0 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ery);.  sqlite3_
212f0 66 69 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72 74  finalize(pInsert
21300 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
21310 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 73 71 6c  e(zQuery);.  sql
21320 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 65 72  ite3_free(zInser
21330 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72  t);.}.../*.** Tr
21340 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20 61 6c  y to transfer al
21350 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 73 63  l rows of the sc
21360 68 65 6d 61 20 74 68 61 74 20 6d 61 74 63 68 20  hema that match 
21370 7a 57 68 65 72 65 2e 20 20 46 6f 72 0a 2a 2a 20  zWhere.  For.** 
21380 65 61 63 68 20 72 6f 77 2c 20 69 6e 76 6f 6b 65  each row, invoke
21390 20 78 46 6f 72 45 61 63 68 28 29 20 6f 6e 20 74   xForEach() on t
213a0 68 65 20 6f 62 6a 65 63 74 20 64 65 66 69 6e 65  he object define
213b0 64 20 62 79 20 74 68 61 74 20 72 6f 77 2e 0a 2a  d by that row..*
213c0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  * If an error is
213d0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69   encountered whi
213e0 6c 65 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61 72  le moving forwar
213f0 64 20 74 68 72 6f 75 67 68 20 74 68 65 0a 2a 2a  d through the.**
21400 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
21410 61 62 6c 65 2c 20 74 72 79 20 61 67 61 69 6e 20  able, try again 
21420 6d 6f 76 69 6e 67 20 62 61 63 6b 77 61 72 64 73  moving backwards
21430 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21440 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d   tryToCloneSchem
21450 61 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  a(.  ShellState 
21460 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e  *p,.  sqlite3 *n
21470 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  ewDb,.  const ch
21480 61 72 20 2a 7a 57 68 65 72 65 2c 0a 20 20 76 6f  ar *zWhere,.  vo
21490 69 64 20 28 2a 78 46 6f 72 45 61 63 68 29 28 53  id (*xForEach)(S
214a0 68 65 6c 6c 53 74 61 74 65 2a 2c 73 71 6c 69 74  hellState*,sqlit
214b0 65 33 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  e3*,const char*)
214c0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
214d0 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a  mt *pQuery = 0;.
214e0 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20 3d    char *zQuery =
214f0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
21500 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
21510 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 6f  har *zName;.  co
21520 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
21530 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20  r *zSql;.  char 
21540 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20  *zErrMsg = 0;.. 
21550 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65   zQuery = sqlite
21560 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
21570 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f 4d  T name, sql FROM
21580 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a   sqlite_master".
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215a0 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
215b0 52 45 20 25 73 22 2c 20 7a 57 68 65 72 65 29 3b  RE %s", zWhere);
215c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
215d0 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
215e0 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70  , zQuery, -1, &p
215f0 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69 66 28  Query, 0);.  if(
21600 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f   rc ){.    utf8_
21610 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
21620 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f  Error: (%d) %s o
21630 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20  n [%s]\n",.     
21640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
21650 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
21660 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20  errcode(p->db), 
21670 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
21680 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20  ->db),.         
21690 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72             zQuer
216a0 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  y);.    goto end
216b0 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20  _schema_xfer;.  
216c0 7d 0a 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d  }.  while( (rc =
216d0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51   sqlite3_step(pQ
216e0 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52  uery))==SQLITE_R
216f0 4f 57 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  OW ){.    zName 
21700 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
21710 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 30 29  _text(pQuery, 0)
21720 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  ;.    zSql = sql
21730 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
21740 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20  (pQuery, 1);.   
21750 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22   printf("%s... "
21760 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68  , zName); fflush
21770 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 73 71  (stdout);.    sq
21780 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62  lite3_exec(newDb
21790 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  , (const char*)z
217a0 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72  Sql, 0, 0, &zErr
217b0 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  Msg);.    if( zE
217c0 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 75  rrMsg ){.      u
217d0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
217e0 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 53  r, "Error: %s\nS
217f0 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72  QL: [%s]\n", zEr
21800 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  rMsg, zSql);.   
21810 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21820 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
21830 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
21840 20 7d 0a 20 20 20 20 69 66 28 20 78 46 6f 72 45   }.    if( xForE
21850 61 63 68 20 29 7b 0a 20 20 20 20 20 20 78 46 6f  ach ){.      xFo
21860 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20  rEach(p, newDb, 
21870 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61  (const char*)zNa
21880 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
21890 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29 3b  rintf("done\n");
218a0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
218b0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
218c0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
218d0 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 20 20  ze(pQuery);.    
218e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75  sqlite3_free(zQu
218f0 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65 72 79  ery);.    zQuery
21900 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
21910 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c  tf("SELECT name,
21920 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
21930 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20  _master".       
21940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21950 20 20 20 20 20 20 22 20 57 48 45 52 45 20 25 73        " WHERE %s
21960 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20   ORDER BY rowid 
21970 44 45 53 43 22 2c 20 7a 57 68 65 72 65 29 3b 0a  DESC", zWhere);.
21980 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21990 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
219a0 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26  b, zQuery, -1, &
219b0 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20  pQuery, 0);.    
219c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
219d0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
219e0 72 72 2c 20 22 45 72 72 6f 72 3a 20 28 25 64 29  rr, "Error: (%d)
219f0 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a   %s on [%s]\n",.
21a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
21a20 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 70  tended_errcode(p
21a30 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65  ->db), sqlite3_e
21a40 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20 20  rrmsg(p->db),.  
21a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a60 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20      zQuery);.   
21a70 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65     goto end_sche
21a80 6d 61 5f 78 66 65 72 3b 0a 20 20 20 20 7d 0a 20  ma_xfer;.    }. 
21a90 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20     while( (rc = 
21aa0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75  sqlite3_step(pQu
21ab0 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  ery))==SQLITE_RO
21ac0 57 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65  W ){.      zName
21ad0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
21ae0 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 30  n_text(pQuery, 0
21af0 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  );.      zSql = 
21b00 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
21b10 65 78 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a  ext(pQuery, 1);.
21b20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73        printf("%s
21b30 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20 66  ... ", zName); f
21b40 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
21b50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65       sqlite3_exe
21b60 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20  c(newDb, (const 
21b70 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20 30  char*)zSql, 0, 0
21b80 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
21b90 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29     if( zErrMsg )
21ba0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
21bb0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
21bc0 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b  rror: %s\nSQL: [
21bd0 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c  %s]\n", zErrMsg,
21be0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20   zSql);.        
21bf0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
21c00 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7a  rMsg);.        z
21c10 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
21c20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 78 46    }.      if( xF
21c30 6f 72 45 61 63 68 20 29 7b 0a 20 20 20 20 20 20  orEach ){.      
21c40 20 20 78 46 6f 72 45 61 63 68 28 70 2c 20 6e 65    xForEach(p, ne
21c50 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  wDb, (const char
21c60 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  *)zName);.      
21c70 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  }.      printf("
21c80 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a  done\n");.    }.
21c90 20 20 7d 0a 65 6e 64 5f 73 63 68 65 6d 61 5f 78    }.end_schema_x
21ca0 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  fer:.  sqlite3_f
21cb0 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b  inalize(pQuery);
21cc0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
21cd0 7a 51 75 65 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  zQuery);.}../*.*
21ce0 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
21cf0 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64  abase file named
21d00 20 22 7a 4e 65 77 44 62 22 2e 20 20 54 72 79 20   "zNewDb".  Try 
21d10 74 6f 20 72 65 63 6f 76 65 72 20 61 73 20 6d 75  to recover as mu
21d20 63 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  ch information.*
21d30 2a 20 61 73 20 70 6f 73 73 69 62 6c 65 20 6f 75  * as possible ou
21d40 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61  t of the main da
21d50 74 61 62 61 73 65 20 28 77 68 69 63 68 20 6d 69  tabase (which mi
21d60 67 68 74 20 62 65 20 63 6f 72 72 75 70 74 29 20  ght be corrupt) 
21d70 61 6e 64 20 77 72 69 74 65 20 69 74 0a 2a 2a 20  and write it.** 
21d80 69 6e 74 6f 20 7a 4e 65 77 44 62 2e 0a 2a 2f 0a  into zNewDb..*/.
21d90 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54  static void tryT
21da0 6f 43 6c 6f 6e 65 28 53 68 65 6c 6c 53 74 61 74  oClone(ShellStat
21db0 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
21dc0 20 2a 7a 4e 65 77 44 62 29 7b 0a 20 20 69 6e 74   *zNewDb){.  int
21dd0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
21de0 6e 65 77 44 62 20 3d 20 30 3b 0a 20 20 69 66 28  newDb = 0;.  if(
21df0 20 61 63 63 65 73 73 28 7a 4e 65 77 44 62 2c 30   access(zNewDb,0
21e00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38  )==0 ){.    utf8
21e10 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
21e20 22 46 69 6c 65 20 5c 22 25 73 5c 22 20 61 6c 72  "File \"%s\" alr
21e30 65 61 64 79 20 65 78 69 73 74 73 2e 5c 6e 22 2c  eady exists.\n",
21e40 20 7a 4e 65 77 44 62 29 3b 0a 20 20 20 20 72 65   zNewDb);.    re
21e50 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  turn;.  }.  rc =
21e60 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 4e   sqlite3_open(zN
21e70 65 77 44 62 2c 20 26 6e 65 77 44 62 29 3b 0a 20  ewDb, &newDb);. 
21e80 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75   if( rc ){.    u
21e90 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
21ea0 72 2c 20 22 43 61 6e 6e 6f 74 20 63 72 65 61 74  r, "Cannot creat
21eb0 65 20 6f 75 74 70 75 74 20 64 61 74 61 62 61 73  e output databas
21ec0 65 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  e: %s\n",.      
21ed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
21ee0 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20  rmsg(newDb));.  
21ef0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
21f00 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
21f10 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
21f20 73 63 68 65 6d 61 3d 4f 4e 3b 22 2c 20 30 2c 20  schema=ON;", 0, 
21f30 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
21f40 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 22  e3_exec(newDb, "
21f50 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b  BEGIN EXCLUSIVE;
21f60 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
21f70 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d   tryToCloneSchem
21f80 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79 70  a(p, newDb, "typ
21f90 65 3d 27 74 61 62 6c 65 27 22 2c 20 74 72 79 54  e='table'", tryT
21fa0 6f 43 6c 6f 6e 65 44 61 74 61 29 3b 0a 20 20 20  oCloneData);.   
21fb0 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d   tryToCloneSchem
21fc0 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79 70  a(p, newDb, "typ
21fd0 65 21 3d 27 74 61 62 6c 65 27 22 2c 20 30 29 3b  e!='table'", 0);
21fe0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
21ff0 63 28 6e 65 77 44 62 2c 20 22 43 4f 4d 4d 49 54  c(newDb, "COMMIT
22000 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
22010 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
22020 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72  ->db, "PRAGMA wr
22030 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46  itable_schema=OF
22040 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  F;", 0, 0, 0);. 
22050 20 7d 0a 20 20 63 6c 6f 73 65 5f 64 62 28 6e 65   }.  close_db(ne
22060 77 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  wDb);.}../*.** C
22070 68 61 6e 67 65 20 74 68 65 20 6f 75 74 70 75 74  hange the output
22080 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 73 74   file back to st
22090 64 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  dout..**.** If t
220a0 68 65 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20  he p->doXdgOpen 
220b0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 61  flag is set, tha
220c0 74 20 6d 65 61 6e 73 20 74 68 65 20 6f 75 74 70  t means the outp
220d0 75 74 20 77 61 73 20 62 65 69 6e 67 0a 2a 2a 20  ut was being.** 
220e0 72 65 64 69 72 65 63 74 65 64 20 74 6f 20 61 20  redirected to a 
220f0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
22100 61 6d 65 64 20 62 79 20 70 2d 3e 7a 54 65 6d 70  amed by p->zTemp
22110 46 69 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63  File.  In that c
22120 61 73 65 2c 0a 2a 2a 20 6c 61 75 6e 63 68 20 73  ase,.** launch s
22130 74 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70  tart/open/xdg-op
22140 65 6e 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  en on that tempo
22150 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  rary file..*/.st
22160 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
22170 5f 72 65 73 65 74 28 53 68 65 6c 6c 53 74 61 74  _reset(ShellStat
22180 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
22190 6f 75 74 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20  outfile[0]=='|' 
221a0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
221b0 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20  E_OMIT_POPEN.   
221c0 20 70 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b   pclose(p->out);
221d0 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
221e0 0a 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c 65  .    output_file
221f0 5f 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a  _close(p->out);.
22200 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
22210 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 20  OHAVE_SYSTEM.   
22220 20 69 66 28 20 70 2d 3e 64 6f 58 64 67 4f 70 65   if( p->doXdgOpe
22230 6e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  n ){.      const
22240 20 63 68 61 72 20 2a 7a 58 64 67 4f 70 65 6e 43   char *zXdgOpenC
22250 6d 64 20 3d 0a 23 69 66 20 64 65 66 69 6e 65 64  md =.#if defined
22260 28 5f 57 49 4e 33 32 29 0a 20 20 20 20 20 20 22  (_WIN32).      "
22270 73 74 61 72 74 22 3b 0a 23 65 6c 69 66 20 64 65  start";.#elif de
22280 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
22290 0a 20 20 20 20 20 20 22 6f 70 65 6e 22 3b 0a 23  .      "open";.#
222a0 65 6c 73 65 0a 20 20 20 20 20 20 22 78 64 67 2d  else.      "xdg-
222b0 6f 70 65 6e 22 3b 0a 23 65 6e 64 69 66 0a 20 20  open";.#endif.  
222c0 20 20 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a      char *zCmd;.
222d0 20 20 20 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c        zCmd = sql
222e0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
222f0 20 25 73 22 2c 20 7a 58 64 67 4f 70 65 6e 43 6d   %s", zXdgOpenCm
22300 64 2c 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29  d, p->zTempFile)
22310 3b 0a 20 20 20 20 20 20 69 66 28 20 73 79 73 74  ;.      if( syst
22320 65 6d 28 7a 43 6d 64 29 20 29 7b 0a 20 20 20 20  em(zCmd) ){.    
22330 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
22340 73 74 64 65 72 72 2c 20 22 46 61 69 6c 65 64 3a  stderr, "Failed:
22350 20 5b 25 73 5d 5c 6e 22 2c 20 7a 43 6d 64 29 3b   [%s]\n", zCmd);
22360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
22370 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d 64  qlite3_free(zCmd
22380 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 4d  );.      outputM
22390 6f 64 65 50 6f 70 28 70 29 3b 0a 20 20 20 20 20  odePop(p);.     
223a0 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 3d 20   p->doXdgOpen = 
223b0 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  0;.    }.#endif 
223c0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
223d0 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d  TE_NOHAVE_SYSTEM
223e0 29 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 6f 75  ) */.  }.  p->ou
223f0 74 66 69 6c 65 5b 30 5d 20 3d 20 30 3b 0a 20 20  tfile[0] = 0;.  
22400 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b  p->out = stdout;
22410 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 6e  .}../*.** Run an
22420 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 61 6e 64   SQL command and
22430 20 72 65 74 75 72 6e 20 74 68 65 20 73 69 6e 67   return the sing
22440 6c 65 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c  le integer resul
22450 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
22460 20 64 62 5f 69 6e 74 28 53 68 65 6c 6c 53 74 61   db_int(ShellSta
22470 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  te *p, const cha
22480 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 73 71 6c 69  r *zSql){.  sqli
22490 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
224a0 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a  .  int res = 0;.
224b0 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
224c0 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
224d0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
224e0 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 26 26  ;.  if( pStmt &&
224f0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
22500 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
22510 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 73 71   ){.    res = sq
22520 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
22530 28 70 53 74 6d 74 2c 30 29 3b 0a 20 20 7d 0a 20  (pStmt,0);.  }. 
22540 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
22550 65 28 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75  e(pStmt);.  retu
22560 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
22570 20 43 6f 6e 76 65 72 74 20 61 20 32 2d 62 79 74   Convert a 2-byt
22580 65 20 6f 72 20 34 2d 62 79 74 65 20 62 69 67 2d  e or 4-byte big-
22590 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 69  endian integer i
225a0 6e 74 6f 20 61 20 6e 61 74 69 76 65 20 69 6e 74  nto a native int
225b0 65 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 75  eger.*/.static u
225c0 6e 73 69 67 6e 65 64 20 69 6e 74 20 67 65 74 32  nsigned int get2
225d0 62 79 74 65 49 6e 74 28 75 6e 73 69 67 6e 65 64  byteInt(unsigned
225e0 20 63 68 61 72 20 2a 61 29 7b 0a 20 20 72 65 74   char *a){.  ret
225f0 75 72 6e 20 28 61 5b 30 5d 3c 3c 38 29 20 2b 20  urn (a[0]<<8) + 
22600 61 5b 31 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75  a[1];.}.static u
22610 6e 73 69 67 6e 65 64 20 69 6e 74 20 67 65 74 34  nsigned int get4
22620 62 79 74 65 49 6e 74 28 75 6e 73 69 67 6e 65 64  byteInt(unsigned
22630 20 63 68 61 72 20 2a 61 29 7b 0a 20 20 72 65 74   char *a){.  ret
22640 75 72 6e 20 28 61 5b 30 5d 3c 3c 32 34 29 20 2b  urn (a[0]<<24) +
22650 20 28 61 5b 31 5d 3c 3c 31 36 29 20 2b 20 28 61   (a[1]<<16) + (a
22660 5b 32 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b 0a  [2]<<8) + a[3];.
22670 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
22680 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 22  ntation of the "
22690 2e 69 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64 2e 0a  .info" command..
226a0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f  **.** Return 1 o
226b0 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78  n error, 2 to ex
226c0 69 74 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77  it, and 0 otherw
226d0 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
226e0 6e 74 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f  nt shell_dbinfo_
226f0 63 6f 6d 6d 61 6e 64 28 53 68 65 6c 6c 53 74 61  command(ShellSta
22700 74 65 20 2a 70 2c 20 69 6e 74 20 6e 41 72 67 2c  te *p, int nArg,
22710 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 29 7b 0a   char **azArg){.
22720 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
22730 74 72 75 63 74 20 7b 20 63 6f 6e 73 74 20 63 68  truct { const ch
22740 61 72 20 2a 7a 4e 61 6d 65 3b 20 69 6e 74 20 6f  ar *zName; int o
22750 66 73 74 3b 20 7d 20 61 46 69 65 6c 64 5b 5d 20  fst; } aField[] 
22760 3d 20 7b 0a 20 20 20 20 20 7b 20 22 66 69 6c 65  = {.     { "file
22770 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 3a   change counter:
22780 22 2c 20 20 32 34 20 20 7d 2c 0a 20 20 20 20 20  ",  24  },.     
22790 7b 20 22 64 61 74 61 62 61 73 65 20 70 61 67 65  { "database page
227a0 20 63 6f 75 6e 74 3a 22 2c 20 20 32 38 20 20 7d   count:",  28  }
227b0 2c 0a 20 20 20 20 20 7b 20 22 66 72 65 65 6c 69  ,.     { "freeli
227c0 73 74 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c  st page count:",
227d0 20 20 33 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20    36  },.     { 
227e0 22 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 3a 22  "schema cookie:"
227f0 2c 20 20 20 20 20 20 20 20 34 30 20 20 7d 2c 0a  ,        40  },.
22800 20 20 20 20 20 7b 20 22 73 63 68 65 6d 61 20 66       { "schema f
22810 6f 72 6d 61 74 3a 22 2c 20 20 20 20 20 20 20 20  ormat:",        
22820 34 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64  44  },.     { "d
22830 65 66 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a  efault cache siz
22840 65 3a 22 2c 20 20 20 34 38 20 20 7d 2c 0a 20 20  e:",   48  },.  
22850 20 20 20 7b 20 22 61 75 74 6f 76 61 63 75 75 6d     { "autovacuum
22860 20 74 6f 70 20 72 6f 6f 74 3a 22 2c 20 20 35 32   top root:",  52
22870 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 69 6e 63    },.     { "inc
22880 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 3a  remental vacuum:
22890 22 2c 20 20 20 36 34 20 20 7d 2c 0a 20 20 20 20  ",   64  },.    
228a0 20 7b 20 22 74 65 78 74 20 65 6e 63 6f 64 69 6e   { "text encodin
228b0 67 3a 22 2c 20 20 20 20 20 20 20 20 35 36 20 20  g:",        56  
228c0 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73 65 72 20  },.     { "user 
228d0 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20 20  version:",      
228e0 20 20 20 36 30 20 20 7d 2c 0a 20 20 20 20 20 7b     60  },.     {
228f0 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 20 69 64   "application id
22900 3a 22 2c 20 20 20 20 20 20 20 36 38 20 20 7d 2c  :",       68  },
22910 0a 20 20 20 20 20 7b 20 22 73 6f 66 74 77 61 72  .     { "softwar
22920 65 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20  e version:",    
22930 20 39 36 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73   96  },.  };.  s
22940 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
22950 63 74 20 7b 20 63 6f 6e 73 74 20 63 68 61 72 20  ct { const char 
22960 2a 7a 4e 61 6d 65 3b 20 63 6f 6e 73 74 20 63 68  *zName; const ch
22970 61 72 20 2a 7a 53 71 6c 3b 20 7d 20 61 51 75 65  ar *zSql; } aQue
22980 72 79 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20  ry[] = {.     { 
22990 22 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65  "number of table
229a0 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c  s:",.       "SEL
229b0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
229c0 4d 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d  M %s WHERE type=
229d0 27 74 61 62 6c 65 27 22 20 7d 2c 0a 20 20 20 20  'table'" },.    
229e0 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 69 6e   { "number of in
229f0 64 65 78 65 73 3a 22 2c 0a 20 20 20 20 20 20 20  dexes:",.       
22a00 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
22a10 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74   FROM %s WHERE t
22a20 79 70 65 3d 27 69 6e 64 65 78 27 22 20 7d 2c 0a  ype='index'" },.
22a30 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f       { "number o
22a40 66 20 74 72 69 67 67 65 72 73 3a 22 2c 0a 20 20  f triggers:",.  
22a50 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75       "SELECT cou
22a60 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48  nt(*) FROM %s WH
22a70 45 52 45 20 74 79 70 65 3d 27 74 72 69 67 67 65  ERE type='trigge
22a80 72 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e  r'" },.     { "n
22a90 75 6d 62 65 72 20 6f 66 20 76 69 65 77 73 3a 22  umber of views:"
22aa0 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  ,.       "SELECT
22ab0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25   count(*) FROM %
22ac0 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 76 69  s WHERE type='vi
22ad0 65 77 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22  ew'" },.     { "
22ae0 73 63 68 65 6d 61 20 73 69 7a 65 3a 22 2c 0a 20  schema size:",. 
22af0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 74 6f        "SELECT to
22b00 74 61 6c 28 6c 65 6e 67 74 68 28 73 71 6c 29 29  tal(length(sql))
22b10 20 46 52 4f 4d 20 25 73 22 20 7d 2c 0a 20 20 7d   FROM %s" },.  }
22b20 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73  ;.  int i;.  uns
22b30 69 67 6e 65 64 20 69 44 61 74 61 56 65 72 73 69  igned iDataVersi
22b40 6f 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 63 68  on;.  char *zSch
22b50 65 6d 61 54 61 62 3b 0a 20 20 63 68 61 72 20 2a  emaTab;.  char *
22b60 7a 44 62 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20  zDb = nArg>=2 ? 
22b70 61 7a 41 72 67 5b 31 5d 20 3a 20 22 6d 61 69 6e  azArg[1] : "main
22b80 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ";.  sqlite3_stm
22b90 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
22ba0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 48  unsigned char aH
22bb0 64 72 5b 31 30 30 5d 3b 0a 20 20 6f 70 65 6e 5f  dr[100];.  open_
22bc0 64 62 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  db(p, 0);.  if( 
22bd0 70 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72  p->db==0 ) retur
22be0 6e 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  n 1;.  sqlite3_p
22bf0 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
22c00 22 53 45 4c 45 43 54 20 64 61 74 61 20 46 52 4f  "SELECT data FRO
22c10 4d 20 73 71 6c 69 74 65 5f 64 62 70 61 67 65 28  M sqlite_dbpage(
22c20 3f 31 29 20 57 48 45 52 45 20 70 67 6e 6f 3d 31  ?1) WHERE pgno=1
22c30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
22c40 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74          -1, &pSt
22c50 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
22c60 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
22c70 74 2c 20 31 2c 20 7a 44 62 2c 20 2d 31 2c 20 53  t, 1, zDb, -1, S
22c80 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
22c90 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
22ca0 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
22cb0 5f 52 4f 57 0a 20 20 20 26 26 20 73 71 6c 69 74  _ROW.   && sqlit
22cc0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
22cd0 70 53 74 6d 74 2c 30 29 3e 31 30 30 0a 20 20 29  pStmt,0)>100.  )
22ce0 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 61 48 64  {.    memcpy(aHd
22cf0 72 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r, sqlite3_colum
22d00 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 30 29 2c  n_blob(pStmt,0),
22d10 20 31 30 30 29 3b 0a 20 20 20 20 73 71 6c 69 74   100);.    sqlit
22d20 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
22d30 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
22d40 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
22d50 72 72 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 72  rr, "unable to r
22d60 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61  ead database hea
22d70 64 65 72 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c  der\n");.    sql
22d80 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
22d90 74 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  tmt);.    return
22da0 20 31 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 67 65   1;.  }.  i = ge
22db0 74 32 62 79 74 65 49 6e 74 28 61 48 64 72 2b 31  t2byteInt(aHdr+1
22dc0 36 29 3b 0a 20 20 69 66 28 20 69 3d 3d 31 20 29  6);.  if( i==1 )
22dd0 20 69 20 3d 20 36 35 35 33 36 3b 0a 20 20 75 74   i = 65536;.  ut
22de0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
22df0 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20  , "%-20s %d\n", 
22e00 22 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73  "database page s
22e10 69 7a 65 3a 22 2c 20 69 29 3b 0a 20 20 75 74 66  ize:", i);.  utf
22e20 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
22e30 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22   "%-20s %d\n", "
22e40 77 72 69 74 65 20 66 6f 72 6d 61 74 3a 22 2c 20  write format:", 
22e50 61 48 64 72 5b 31 38 5d 29 3b 0a 20 20 75 74 66  aHdr[18]);.  utf
22e60 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
22e70 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22   "%-20s %d\n", "
22e80 72 65 61 64 20 66 6f 72 6d 61 74 3a 22 2c 20 61  read format:", a
22e90 48 64 72 5b 31 39 5d 29 3b 0a 20 20 75 74 66 38  Hdr[19]);.  utf8
22ea0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
22eb0 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 72  "%-20s %d\n", "r
22ec0 65 73 65 72 76 65 64 20 62 79 74 65 73 3a 22 2c  eserved bytes:",
22ed0 20 61 48 64 72 5b 32 30 5d 29 3b 0a 20 20 66 6f   aHdr[20]);.  fo
22ee0 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
22ef0 7a 65 28 61 46 69 65 6c 64 29 3b 20 69 2b 2b 29  ze(aField); i++)
22f00 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 20 3d  {.    int ofst =
22f10 20 61 46 69 65 6c 64 5b 69 5d 2e 6f 66 73 74 3b   aField[i].ofst;
22f20 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
22f30 74 20 76 61 6c 20 3d 20 67 65 74 34 62 79 74 65  t val = get4byte
22f40 49 6e 74 28 61 48 64 72 20 2b 20 6f 66 73 74 29  Int(aHdr + ofst)
22f50 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
22f60 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73  f(p->out, "%-20s
22f70 20 25 75 22 2c 20 61 46 69 65 6c 64 5b 69 5d 2e   %u", aField[i].
22f80 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 20  zName, val);.   
22f90 20 73 77 69 74 63 68 28 20 6f 66 73 74 20 29 7b   switch( ofst ){
22fa0 0a 20 20 20 20 20 20 63 61 73 65 20 35 36 3a 20  .      case 56: 
22fb0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 61  {.        if( va
22fc0 6c 3d 3d 31 20 29 20 72 61 77 5f 70 72 69 6e 74  l==1 ) raw_print
22fd0 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66  f(p->out, " (utf
22fe0 38 29 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  8)");.        if
22ff0 28 20 76 61 6c 3d 3d 32 20 29 20 72 61 77 5f 70  ( val==2 ) raw_p
23000 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20  rintf(p->out, " 
23010 28 75 74 66 31 36 6c 65 29 22 29 3b 0a 20 20 20  (utf16le)");.   
23020 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 33 20       if( val==3 
23030 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e  ) raw_printf(p->
23040 6f 75 74 2c 20 22 20 28 75 74 66 31 36 62 65 29  out, " (utf16be)
23050 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
23060 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  }.    raw_printf
23070 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
23080 20 20 7d 0a 20 20 69 66 28 20 7a 44 62 3d 3d 30    }.  if( zDb==0
23090 20 29 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54   ){.    zSchemaT
230a0 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ab = sqlite3_mpr
230b0 69 6e 74 66 28 22 6d 61 69 6e 2e 73 71 6c 69 74  intf("main.sqlit
230c0 65 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d 65  e_master");.  }e
230d0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
230e0 44 62 2c 22 74 65 6d 70 22 29 3d 3d 30 20 29 7b  Db,"temp")==0 ){
230f0 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20  .    zSchemaTab 
23100 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
23110 66 28 22 25 73 22 2c 20 22 73 71 6c 69 74 65 5f  f("%s", "sqlite_
23120 74 65 6d 70 5f 6d 61 73 74 65 72 22 29 3b 0a 20  temp_master");. 
23130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 63 68   }else{.    zSch
23140 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33  emaTab = sqlite3
23150 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22  _mprintf("\"%w\"
23160 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c  .sqlite_master",
23170 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72   zDb);.  }.  for
23180 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
23190 65 28 61 51 75 65 72 79 29 3b 20 69 2b 2b 29 7b  e(aQuery); i++){
231a0 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20  .    char *zSql 
231b0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
231c0 66 28 61 51 75 65 72 79 5b 69 5d 2e 7a 53 71 6c  f(aQuery[i].zSql
231d0 2c 20 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a 20  , zSchemaTab);. 
231e0 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 64 62 5f     int val = db_
231f0 69 6e 74 28 70 2c 20 7a 53 71 6c 29 3b 0a 20 20  int(p, zSql);.  
23200 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23210 53 71 6c 29 3b 0a 20 20 20 20 75 74 66 38 5f 70  Sql);.    utf8_p
23220 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
23230 2d 32 30 73 20 25 64 5c 6e 22 2c 20 61 51 75 65  -20s %d\n", aQue
23240 72 79 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c  ry[i].zName, val
23250 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
23260 5f 66 72 65 65 28 7a 53 63 68 65 6d 61 54 61 62  _free(zSchemaTab
23270 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  );.  sqlite3_fil
23280 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c  e_control(p->db,
23290 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e   zDb, SQLITE_FCN
232a0 54 4c 5f 44 41 54 41 5f 56 45 52 53 49 4f 4e 2c  TL_DATA_VERSION,
232b0 20 26 69 44 61 74 61 56 65 72 73 69 6f 6e 29 3b   &iDataVersion);
232c0 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
232d0 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 75  ->out, "%-20s %u
232e0 5c 6e 22 2c 20 22 64 61 74 61 20 76 65 72 73 69  \n", "data versi
232f0 6f 6e 22 2c 20 69 44 61 74 61 56 65 72 73 69 6f  on", iDataVersio
23300 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  n);.  return 0;.
23310 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  }../*.** Print t
23320 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74  he current sqlit
23330 65 33 5f 65 72 72 6d 73 67 28 29 20 76 61 6c 75  e3_errmsg() valu
23340 65 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20  e to stderr and 
23350 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 73 74 61  return 1..*/.sta
23360 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 44 61 74  tic int shellDat
23370 61 62 61 73 65 45 72 72 6f 72 28 73 71 6c 69 74  abaseError(sqlit
23380 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74  e3 *db){.  const
23390 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 73 71   char *zErr = sq
233a0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
233b0 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
233c0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
233d0 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20  %s\n", zErr);.  
233e0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
233f0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 70  ** Compare the p
23400 61 74 74 65 72 6e 20 69 6e 20 7a 47 6c 6f 62 5b  attern in zGlob[
23410 5d 20 61 67 61 69 6e 73 74 20 74 68 65 20 74 65  ] against the te
23420 78 74 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75  xt in z[].  Retu
23430 72 6e 20 54 52 55 45 0a 2a 2a 20 69 66 20 74 68  rn TRUE.** if th
23440 65 79 20 6d 61 74 63 68 20 61 6e 64 20 46 41 4c  ey match and FAL
23450 53 45 20 28 30 29 20 69 66 20 74 68 65 79 20 64  SE (0) if they d
23460 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 0a  o not match..**.
23470 2a 2a 20 47 6c 6f 62 62 69 6e 67 20 72 75 6c 65  ** Globbing rule
23480 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 2a  s:.**.**      '*
23490 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20  '       Matches 
234a0 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20  any sequence of 
234b0 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61  zero or more cha
234c0 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20  racters..**.**  
234d0 20 20 20 20 27 3f 27 20 20 20 20 20 20 20 4d 61      '?'       Ma
234e0 74 63 68 65 73 20 65 78 61 63 74 6c 79 20 6f 6e  tches exactly on
234f0 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a  e character..**.
23500 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20 20 20 20  **     [...]    
23510 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68    Matches one ch
23520 61 72 61 63 74 65 72 20 66 72 6f 6d 20 74 68 65  aracter from the
23530 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 20 6f   enclosed list o
23540 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  f.**            
23550 20 20 20 20 63 68 61 72 61 63 74 65 72 73 2e 0a      characters..
23560 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d  **.**     [^...]
23570 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65       Matches one
23580 20 63 68 61 72 61 63 74 65 72 20 6e 6f 74 20 69   character not i
23590 6e 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c  n the enclosed l
235a0 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ist..**.**      
235b0 27 23 27 20 20 20 20 20 20 20 4d 61 74 63 68 65  '#'       Matche
235c0 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f  s any sequence o
235d0 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 64 69  f one or more di
235e0 67 69 74 73 20 77 69 74 68 20 61 6e 0a 2a 2a 20  gits with an.** 
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
23600 70 74 69 6f 6e 61 6c 20 2b 20 6f 72 20 2d 20 73  ptional + or - s
23610 69 67 6e 20 69 6e 20 66 72 6f 6e 74 0a 2a 2a 0a  ign in front.**.
23620 2a 2a 20 20 20 20 20 20 27 20 27 20 20 20 20 20  **      ' '     
23630 20 20 41 6e 79 20 73 70 61 6e 20 6f 66 20 77 68    Any span of wh
23640 69 74 65 73 70 61 63 65 20 6d 61 74 63 68 65 73  itespace matches
23650 20 61 6e 79 20 6f 74 68 65 72 20 73 70 61 6e 20   any other span 
23660 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  of.**           
23670 20 20 20 20 20 77 68 69 74 65 73 70 61 63 65 2e       whitespace.
23680 0a 2a 2a 0a 2a 2a 20 45 78 74 72 61 20 77 68 69  .**.** Extra whi
23690 74 65 73 70 61 63 65 20 61 74 20 74 68 65 20 65  tespace at the e
236a0 6e 64 20 6f 66 20 7a 5b 5d 20 69 73 20 69 67 6e  nd of z[] is ign
236b0 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ored..*/.static 
236c0 69 6e 74 20 74 65 73 74 63 61 73 65 5f 67 6c 6f  int testcase_glo
236d0 62 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47  b(const char *zG
236e0 6c 6f 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  lob, const char 
236f0 2a 7a 29 7b 0a 20 20 69 6e 74 20 63 2c 20 63 32  *z){.  int c, c2
23700 3b 0a 20 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a  ;.  int invert;.
23710 20 20 69 6e 74 20 73 65 65 6e 3b 0a 0a 20 20 77    int seen;..  w
23720 68 69 6c 65 28 20 28 63 20 3d 20 28 2a 28 7a 47  hile( (c = (*(zG
23730 6c 6f 62 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20  lob++)))!=0 ){. 
23740 20 20 20 69 66 28 20 49 73 53 70 61 63 65 28 63     if( IsSpace(c
23750 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ) ){.      if( !
23760 49 73 53 70 61 63 65 28 2a 7a 29 20 29 20 72 65  IsSpace(*z) ) re
23770 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 77 68  turn 0;.      wh
23780 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a 47  ile( IsSpace(*zG
23790 6c 6f 62 29 20 29 20 7a 47 6c 6f 62 2b 2b 3b 0a  lob) ) zGlob++;.
237a0 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53        while( IsS
237b0 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a  pace(*z) ) z++;.
237c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
237d0 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 77 68  ='*' ){.      wh
237e0 69 6c 65 28 20 28 63 3d 28 2a 28 7a 47 6c 6f 62  ile( (c=(*(zGlob
237f0 2b 2b 29 29 29 20 3d 3d 20 27 2a 27 20 7c 7c 20  ++))) == '*' || 
23800 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20  c=='?' ){.      
23810 20 20 69 66 28 20 63 3d 3d 27 3f 27 20 26 26 20    if( c=='?' && 
23820 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29 20 72 65  (*(z++))==0 ) re
23830 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
23840 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
23850 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
23860 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
23870 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20  if( c=='[' ){.  
23880 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20        while( *z 
23890 26 26 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62  && testcase_glob
238a0 28 7a 47 6c 6f 62 2d 31 2c 7a 29 3d 3d 30 20 29  (zGlob-1,z)==0 )
238b0 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 2b 2b 3b  {.          z++;
238c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
238d0 20 20 20 72 65 74 75 72 6e 20 28 2a 7a 29 21 3d     return (*z)!=
238e0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
238f0 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 28 2a   while( (c2 = (*
23900 28 7a 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20  (z++)))!=0 ){.  
23910 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 32 21        while( c2!
23920 3d 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =c ){.          
23930 63 32 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20  c2 = *(z++);.   
23940 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30         if( c2==0
23950 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
23960 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
23970 66 28 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62  f( testcase_glob
23980 28 7a 47 6c 6f 62 2c 7a 29 20 29 20 72 65 74 75  (zGlob,z) ) retu
23990 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
239a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
239b0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
239c0 3f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ?' ){.      if( 
239d0 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29 20 72 65  (*(z++))==0 ) re
239e0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
239f0 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a  e if( c=='[' ){.
23a00 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 5f        int prior_
23a10 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 65 65  c = 0;.      see
23a20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 76  n = 0;.      inv
23a30 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ert = 0;.      c
23a40 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20   = *(z++);.     
23a50 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75   if( c==0 ) retu
23a60 72 6e 20 30 3b 0a 20 20 20 20 20 20 63 32 20 3d  rn 0;.      c2 =
23a70 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20   *(zGlob++);.   
23a80 20 20 20 69 66 28 20 63 32 3d 3d 27 5e 27 20 29     if( c2=='^' )
23a90 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 65 72 74  {.        invert
23aa0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32   = 1;.        c2
23ab0 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20   = *(zGlob++);. 
23ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
23ad0 20 63 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20   c2==']' ){.    
23ae0 20 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29      if( c==']' )
23af0 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20   seen = 1;.     
23b00 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b     c2 = *(zGlob+
23b10 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +);.      }.    
23b20 20 20 77 68 69 6c 65 28 20 63 32 20 26 26 20 63    while( c2 && c
23b30 32 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20  2!=']' ){.      
23b40 20 20 69 66 28 20 63 32 3d 3d 27 2d 27 20 26 26    if( c2=='-' &&
23b50 20 7a 47 6c 6f 62 5b 30 5d 21 3d 27 5d 27 20 26   zGlob[0]!=']' &
23b60 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d 30 20 26 26  & zGlob[0]!=0 &&
23b70 20 70 72 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20   prior_c>0 ){.  
23b80 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a          c2 = *(z
23b90 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 20  Glob++);.       
23ba0 20 20 20 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f     if( c>=prior_
23bb0 63 20 26 26 20 63 3c 3d 63 32 20 29 20 73 65 65  c && c<=c2 ) see
23bc0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
23bd0 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20   prior_c = 0;.  
23be0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23bf0 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63 32         if( c==c2
23c00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23c10 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  seen = 1;.      
23c20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23c30 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20  prior_c = c2;.  
23c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23c50 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b  c2 = *(zGlob++);
23c60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23c70 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65 65  f( c2==0 || (see
23c80 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20 29  n ^ invert)==0 )
23c90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
23ca0 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 23 27 20  else if( c=='#' 
23cb0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 7a 5b  ){.      if( (z[
23cc0 30 5d 3d 3d 27 2d 27 20 7c 7c 20 7a 5b 30 5d 3d  0]=='-' || z[0]=
23cd0 3d 27 2b 27 29 20 26 26 20 49 73 44 69 67 69 74  ='+') && IsDigit
23ce0 28 7a 5b 31 5d 29 20 29 20 7a 2b 2b 3b 0a 20 20  (z[1]) ) z++;.  
23cf0 20 20 20 20 69 66 28 20 21 49 73 44 69 67 69 74      if( !IsDigit
23d00 28 7a 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 20  (z[0]) ) return 
23d10 30 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20  0;.      z++;.  
23d20 20 20 20 20 77 68 69 6c 65 28 20 49 73 44 69 67      while( IsDig
23d30 69 74 28 7a 5b 30 5d 29 20 29 7b 20 7a 2b 2b 3b  it(z[0]) ){ z++;
23d40 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
23d50 20 20 20 20 69 66 28 20 63 21 3d 28 2a 28 7a 2b      if( c!=(*(z+
23d60 2b 29 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  +)) ) return 0;.
23d70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c      }.  }.  whil
23d80 65 28 20 49 73 53 70 61 63 65 28 2a 7a 29 20 29  e( IsSpace(*z) )
23d90 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72  { z++; }.  retur
23da0 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  n *z==0;.}.../*.
23db0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 73  ** Compare the s
23dc0 74 72 69 6e 67 20 61 73 20 61 20 63 6f 6d 6d 61  tring as a comma
23dd0 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 77  nd-line option w
23de0 69 74 68 20 65 69 74 68 65 72 20 6f 6e 65 20 6f  ith either one o
23df0 72 20 74 77 6f 0a 2a 2a 20 69 6e 69 74 69 61 6c  r two.** initial
23e00 20 22 2d 22 20 63 68 61 72 61 63 74 65 72 73 2e   "-" characters.
23e10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
23e20 70 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74  ptionMatch(const
23e30 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 63 6f 6e   char *zStr, con
23e40 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 29 7b 0a  st char *zOpt){.
23e50 20 20 69 66 28 20 7a 53 74 72 5b 30 5d 21 3d 27    if( zStr[0]!='
23e60 2d 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  -' ) return 0;. 
23e70 20 7a 53 74 72 2b 2b 3b 0a 20 20 69 66 28 20 7a   zStr++;.  if( z
23e80 53 74 72 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 53  Str[0]=='-' ) zS
23e90 74 72 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73  tr++;.  return s
23ea0 74 72 63 6d 70 28 7a 53 74 72 2c 20 7a 4f 70 74  trcmp(zStr, zOpt
23eb0 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  )==0;.}../*.** D
23ec0 65 6c 65 74 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  elete a file..*/
23ed0 0a 69 6e 74 20 73 68 65 6c 6c 44 65 6c 65 74 65  .int shellDelete
23ee0 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  File(const char 
23ef0 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  *zFilename){.  i
23f00 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20 5f 57  nt rc;.#ifdef _W
23f10 49 4e 33 32 0a 20 20 77 63 68 61 72 5f 74 20 2a  IN32.  wchar_t *
23f20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  z = sqlite3_win3
23f30 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64  2_utf8_to_unicod
23f40 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
23f50 72 63 20 3d 20 5f 77 75 6e 6c 69 6e 6b 28 7a 29  rc = _wunlink(z)
23f60 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
23f70 28 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20  (z);.#else.  rc 
23f80 3d 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61  = unlink(zFilena
23f90 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  me);.#endif.  re
23fa0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23fb0 2a 20 54 72 79 20 74 6f 20 64 65 6c 65 74 65 20  * Try to delete 
23fc0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
23fd0 6c 65 20 28 69 66 20 74 68 65 72 65 20 69 73 20  le (if there is 
23fe0 6f 6e 65 29 20 61 6e 64 20 66 72 65 65 20 74 68  one) and free th
23ff0 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 75 73 65 64  e.** memory used
24000 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d   to hold the nam
24010 65 20 6f 66 20 74 68 65 20 74 65 6d 70 20 66 69  e of the temp fi
24020 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
24030 69 64 20 63 6c 65 61 72 54 65 6d 70 46 69 6c 65  id clearTempFile
24040 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
24050 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46  .  if( p->zTempF
24060 69 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ile==0 ) return;
24070 0a 20 20 69 66 28 20 70 2d 3e 64 6f 58 64 67 4f  .  if( p->doXdgO
24080 70 65 6e 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pen ) return;.  
24090 69 66 28 20 73 68 65 6c 6c 44 65 6c 65 74 65 46  if( shellDeleteF
240a0 69 6c 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  ile(p->zTempFile
240b0 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  ) ) return;.  sq
240c0 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54  lite3_free(p->zT
240d0 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a  empFile);.  p->z
240e0 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 7d 0a  TempFile = 0;.}.
240f0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
24100 6e 65 77 20 74 65 6d 70 20 66 69 6c 65 20 6e 61  new temp file na
24110 6d 65 20 77 69 74 68 20 74 68 65 20 67 69 76 65  me with the give
24120 6e 20 73 75 66 66 69 78 2e 0a 2a 2f 0a 73 74 61  n suffix..*/.sta
24130 74 69 63 20 76 6f 69 64 20 6e 65 77 54 65 6d 70  tic void newTemp
24140 46 69 6c 65 28 53 68 65 6c 6c 53 74 61 74 65 20  File(ShellState 
24150 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
24160 7a 53 75 66 66 69 78 29 7b 0a 20 20 63 6c 65 61  zSuffix){.  clea
24170 72 54 65 6d 70 46 69 6c 65 28 70 29 3b 0a 20 20  rTempFile(p);.  
24180 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
24190 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70 2d  zTempFile);.  p-
241a0 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a  >zTempFile = 0;.
241b0 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20    if( p->db ){. 
241c0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f     sqlite3_file_
241d0 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 30  control(p->db, 0
241e0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54  , SQLITE_FCNTL_T
241f0 45 4d 50 46 49 4c 45 4e 41 4d 45 2c 20 26 70 2d  EMPFILENAME, &p-
24200 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 7d  >zTempFile);.  }
24210 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46  .  if( p->zTempF
24220 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ile==0 ){.    sq
24230 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72 3b 0a  lite3_uint64 r;.
24240 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
24250 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29  omness(sizeof(r)
24260 2c 20 26 72 29 3b 0a 20 20 20 20 70 2d 3e 7a 54  , &r);.    p->zT
24270 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  empFile = sqlite
24280 33 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d 70 25  3_mprintf("temp%
24290 6c 6c 78 2e 25 73 22 2c 20 72 2c 20 7a 53 75 66  llx.%s", r, zSuf
242a0 66 69 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fix);.  }else{. 
242b0 20 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20     p->zTempFile 
242c0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
242d0 66 28 22 25 7a 2e 25 73 22 2c 20 70 2d 3e 7a 54  f("%z.%s", p->zT
242e0 65 6d 70 46 69 6c 65 2c 20 7a 53 75 66 66 69 78  empFile, zSuffix
242f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
24300 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a  zTempFile==0 ){.
24310 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
24320 74 64 65 72 72 2c 20 22 6f 75 74 20 6f 66 20 6d  tderr, "out of m
24330 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65  emory\n");.    e
24340 78 69 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  xit(1);.  }.}...
24350 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  /*.** The implem
24360 65 6e 74 61 74 69 6f 6e 20 6f 66 20 53 51 4c 20  entation of SQL 
24370 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  scalar function 
24380 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61  fkey_collate_cla
24390 75 73 65 28 29 2c 20 75 73 65 64 0a 2a 2a 20 62  use(), used.** b
243a0 79 20 74 68 65 20 22 2e 6c 69 6e 74 20 66 6b 65  y the ".lint fke
243b0 79 2d 69 6e 64 65 78 65 73 22 20 63 6f 6d 6d 61  y-indexes" comma
243c0 6e 64 2e 20 54 68 69 73 20 73 63 61 6c 61 72 20  nd. This scalar 
243d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 77 61  function is alwa
243e0 79 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74  ys.** called wit
243f0 68 20 66 6f 75 72 20 61 72 67 75 6d 65 6e 74 73  h four arguments
24400 20 2d 20 74 68 65 20 70 61 72 65 6e 74 20 74 61   - the parent ta
24410 62 6c 65 20 6e 61 6d 65 2c 20 74 68 65 20 70 61  ble name, the pa
24420 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  rent column name
24430 2c 0a 2a 2a 20 74 68 65 20 63 68 69 6c 64 20 74  ,.** the child t
24440 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
24450 65 20 63 68 69 6c 64 20 63 6f 6c 75 6d 6e 20 6e  e child column n
24460 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 6b 65  ame..**.**   fke
24470 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65  y_collate_clause
24480 28 27 70 61 72 65 6e 74 2d 74 61 62 27 2c 20 27  ('parent-tab', '
24490 70 61 72 65 6e 74 2d 63 6f 6c 27 2c 20 27 63 68  parent-col', 'ch
244a0 69 6c 64 2d 74 61 62 27 2c 20 27 63 68 69 6c 64  ild-tab', 'child
244b0 2d 63 6f 6c 27 29 0a 2a 2a 0a 2a 2a 20 49 66 20  -col').**.** If 
244c0 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 6e 61  either of the na
244d0 6d 65 64 20 74 61 62 6c 65 73 20 6f 72 20 63 6f  med tables or co
244e0 6c 75 6d 6e 73 20 64 6f 20 6e 6f 74 20 65 78 69  lumns do not exi
244f0 73 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  st, this functio
24500 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20  n.** returns an 
24510 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 41 6e  empty string. An
24520 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69 73   empty string is
24530 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
24540 66 20 62 6f 74 68 20 74 61 62 6c 65 73 0a 2a 2a  f both tables.**
24550 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 20 65 78 69   and columns exi
24560 73 74 20 62 75 74 20 68 61 76 65 20 74 68 65 20  st but have the 
24570 73 61 6d 65 20 64 65 66 61 75 6c 74 20 63 6f 6c  same default col
24580 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e  lation sequence.
24590 20 4f 72 2c 0a 2a 2a 20 69 66 20 62 6f 74 68 20   Or,.** if both 
245a0 65 78 69 73 74 20 62 75 74 20 74 68 65 20 64 65  exist but the de
245b0 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
245c0 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 64 69  sequences are di
245d0 66 66 65 72 65 6e 74 2c 20 74 68 69 73 0a 2a 2a  fferent, this.**
245e0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
245f0 73 20 74 68 65 20 73 74 72 69 6e 67 20 22 20 43  s the string " C
24600 4f 4c 4c 41 54 45 20 3c 70 61 72 65 6e 74 2d 63  OLLATE <parent-c
24610 6f 6c 6c 61 74 69 6f 6e 3e 22 2c 20 77 68 65 72  ollation>", wher
24620 65 0a 2a 2a 20 3c 70 61 72 65 6e 74 2d 63 6f 6c  e.** <parent-col
24630 6c 61 74 69 6f 6e 3e 20 69 73 20 74 68 65 20 64  lation> is the d
24640 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
24650 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65   sequence of the
24660 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 2e 0a   parent column..
24670 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
24680 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74 65 43  hellFkeyCollateC
24690 6c 61 75 73 65 28 0a 20 20 73 71 6c 69 74 65 33  lause(.  sqlite3
246a0 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a  _context *pCtx,.
246b0 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71    int nVal,.  sq
246c0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
246d0 56 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  Val.){.  sqlite3
246e0 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63   *db = sqlite3_c
246f0 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
24700 28 70 43 74 78 29 3b 0a 20 20 63 6f 6e 73 74 20  (pCtx);.  const 
24710 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 3b 0a 20  char *zParent;. 
24720 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
24730 72 65 6e 74 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74  rentCol;.  const
24740 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 53 65   char *zParentSe
24750 71 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  q;.  const char 
24760 2a 7a 43 68 69 6c 64 3b 0a 20 20 63 6f 6e 73 74  *zChild;.  const
24770 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 43 6f 6c   char *zChildCol
24780 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
24790 7a 43 68 69 6c 64 53 65 71 20 3d 20 30 3b 20 20  zChildSeq = 0;  
247a0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 6f  /* Initialize to
247b0 20 61 76 6f 69 64 20 66 61 6c 73 65 2d 70 6f 73   avoid false-pos
247c0 69 74 69 76 65 20 77 61 72 6e 69 6e 67 20 2a 2f  itive warning */
247d0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
247e0 73 65 72 74 28 20 6e 56 61 6c 3d 3d 34 20 29 3b  sert( nVal==4 );
247f0 0a 20 20 7a 50 61 72 65 6e 74 20 3d 20 28 63 6f  .  zParent = (co
24800 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
24810 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
24820 61 6c 5b 30 5d 29 3b 0a 20 20 7a 50 61 72 65 6e  al[0]);.  zParen
24830 74 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  tCol = (const ch
24840 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
24850 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d 29  e_text(apVal[1])
24860 3b 0a 20 20 7a 43 68 69 6c 64 20 3d 20 28 63 6f  ;.  zChild = (co
24870 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
24880 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
24890 61 6c 5b 32 5d 29 3b 0a 20 20 7a 43 68 69 6c 64  al[2]);.  zChild
248a0 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Col = (const cha
248b0 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
248c0 5f 74 65 78 74 28 61 70 56 61 6c 5b 33 5d 29 3b  _text(apVal[3]);
248d0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
248e0 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 22 22  lt_text(pCtx, ""
248f0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
24900 54 49 43 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  TIC);.  rc = sql
24910 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
24920 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20 20  n_metadata(.    
24930 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 50    db, "main", zP
24940 61 72 65 6e 74 2c 20 7a 50 61 72 65 6e 74 43 6f  arent, zParentCo
24950 6c 2c 20 30 2c 20 26 7a 50 61 72 65 6e 74 53 65  l, 0, &zParentSe
24960 71 2c 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b 0a  q, 0, 0, 0.  );.
24970 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24980 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
24990 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
249a0 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20  lumn_metadata(. 
249b0 20 20 20 20 20 20 20 64 62 2c 20 22 6d 61 69 6e         db, "main
249c0 22 2c 20 7a 43 68 69 6c 64 2c 20 7a 43 68 69 6c  ", zChild, zChil
249d0 64 43 6f 6c 2c 20 30 2c 20 26 7a 43 68 69 6c 64  dCol, 0, &zChild
249e0 53 65 71 2c 20 30 2c 20 30 2c 20 30 0a 20 20 20  Seq, 0, 0, 0.   
249f0 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72   );.  }..  if( r
24a00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
24a10 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
24a20 7a 50 61 72 65 6e 74 53 65 71 2c 20 7a 43 68 69  zParentSeq, zChi
24a30 6c 64 53 65 71 29 20 29 7b 0a 20 20 20 20 63 68  ldSeq) ){.    ch
24a40 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ar *z = sqlite3_
24a50 6d 70 72 69 6e 74 66 28 22 20 43 4f 4c 4c 41 54  mprintf(" COLLAT
24a60 45 20 25 73 22 2c 20 7a 50 61 72 65 6e 74 53 65  E %s", zParentSe
24a70 71 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  q);.    sqlite3_
24a80 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
24a90 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  , z, -1, SQLITE_
24aa0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
24ab0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
24ac0 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  .  }.}.../*.** T
24ad0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
24ae0 6e 20 6f 66 20 64 6f 74 2d 63 6f 6d 6d 61 6e 64  n of dot-command
24af0 20 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64   ".lint fkey-ind
24b00 65 78 65 73 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  exes"..*/.static
24b10 20 69 6e 74 20 6c 69 6e 74 46 6b 65 79 49 6e 64   int lintFkeyInd
24b20 65 78 65 73 28 0a 20 20 53 68 65 6c 6c 53 74 61  exes(.  ShellSta
24b30 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20  te *pState,     
24b40 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
24b50 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74  nt shell tool st
24b60 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ate */.  char **
24b70 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  azArg,          
24b80 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
24b90 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70  y of arguments p
24ba0 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d  assed to dot com
24bb0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  mand */.  int nA
24bc0 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
24bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24be0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
24bf0 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a  n azArg[] */.){.
24c00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
24c10 70 53 74 61 74 65 2d 3e 64 62 3b 20 20 20 20 20  pState->db;     
24c20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
24c30 6e 64 6c 65 20 74 6f 20 71 75 65 72 79 20 22 6d  ndle to query "m
24c40 61 69 6e 22 20 64 62 20 6f 66 20 2a 2f 0a 20 20  ain" db of */.  
24c50 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53 74 61  FILE *out = pSta
24c60 74 65 2d 3e 6f 75 74 3b 20 20 20 20 20 20 20 20  te->out;        
24c70 2f 2a 20 53 74 72 65 61 6d 20 74 6f 20 77 72 69  /* Stream to wri
24c80 74 65 20 6e 6f 6e 2d 65 72 72 6f 72 20 6f 75 74  te non-error out
24c90 70 75 74 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  put to */.  int 
24ca0 62 56 65 72 62 6f 73 65 20 3d 20 30 3b 20 20 20  bVerbose = 0;   
24cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
24cc0 66 20 2d 76 65 72 62 6f 73 65 20 69 73 20 70 72  f -verbose is pr
24cd0 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62  esent */.  int b
24ce0 47 72 6f 75 70 42 79 50 61 72 65 6e 74 20 3d 20  GroupByParent = 
24cf0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
24d00 20 2d 67 72 6f 75 70 62 79 70 61 72 65 6e 74 20   -groupbyparent 
24d10 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
24d20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
24d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d40 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74 68  /* To iterate th
24d50 72 6f 75 67 68 20 61 7a 41 72 67 5b 5d 20 2a 2f  rough azArg[] */
24d60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
24d70 49 6e 64 65 6e 74 20 3d 20 22 22 3b 20 20 20 20  Indent = "";    
24d80 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 74     /* How much t
24d90 6f 20 69 6e 64 65 6e 74 20 43 52 45 41 54 45 20  o indent CREATE 
24da0 49 4e 44 45 58 20 62 79 20 2a 2f 0a 20 20 69 6e  INDEX by */.  in
24db0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
24dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24dd0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
24de0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
24df0 70 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  pSql = 0;       
24e00 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 76 65    /* Compiled ve
24e10 72 73 69 6f 6e 20 6f 66 20 53 51 4c 20 73 74 61  rsion of SQL sta
24e20 74 65 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a  tement below */.
24e30 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  /*.  ** This 
24e40 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
24e50 20 72 65 74 75 72 6e 73 20 6f 6e 65 20 72 6f 77   returns one row
24e60 20 66 6f 72 20 65 61 63 68 20 66 6f 72 65 69 67   for each foreig
24e70 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
24e80 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 73 63 68  .  ** in the sch
24e90 65 6d 61 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ema of the main 
24ea0 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 63 6f  database. The co
24eb0 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 3a  lumn values are:
24ec0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 30 2e 20 54 68  .  **.  ** 0. Th
24ed0 65 20 74 65 78 74 20 6f 66 20 61 6e 20 53 51 4c  e text of an SQL
24ee0 20 73 74 61 74 65 6d 65 6e 74 20 73 69 6d 69 6c   statement simil
24ef0 61 72 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ar to:.  **.  **
24f00 20 20 20 20 20 20 22 45 58 50 4c 41 49 4e 20 51        "EXPLAIN Q
24f10 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43 54  UERY PLAN SELECT
24f20 20 31 20 46 52 4f 4d 20 63 68 69 6c 64 5f 74 61   1 FROM child_ta
24f30 62 6c 65 20 57 48 45 52 45 20 63 68 69 6c 64 5f  ble WHERE child_
24f40 6b 65 79 3d 3f 22 0a 20 20 2a 2a 0a 20 20 2a 2a  key=?".  **.  **
24f50 20 20 20 20 54 68 69 73 20 53 45 4c 45 43 54 20      This SELECT 
24f60 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68  is similar to th
24f70 65 20 6f 6e 65 20 74 68 61 74 20 74 68 65 20 66  e one that the f
24f80 6f 72 65 69 67 6e 20 6b 65 79 73 20 69 6d 70 6c  oreign keys impl
24f90 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 2a 2a 20  ementation.  ** 
24fa0 20 20 20 6e 65 65 64 73 20 74 6f 20 72 75 6e 20     needs to run 
24fb0 69 6e 74 65 72 6e 61 6c 6c 79 20 6f 6e 20 63 68  internally on ch
24fc0 69 6c 64 20 74 61 62 6c 65 73 2e 20 49 66 20 74  ild tables. If t
24fd0 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78  here is an index
24fe0 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 20   that can.  **  
24ff0 20 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70 74    be used to opt
25000 69 6d 69 7a 65 20 74 68 69 73 20 71 75 65 72 79  imize this query
25010 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20 61 6c  , then it can al
25020 73 6f 20 62 65 20 75 73 65 64 20 62 79 20 74 68  so be used by th
25030 65 20 46 4b 0a 20 20 2a 2a 20 20 20 20 69 6d 70  e FK.  **    imp
25040 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20 6f  lementation to o
25050 70 74 69 6d 69 7a 65 20 44 45 4c 45 54 45 20 6f  ptimize DELETE o
25060 72 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  r UPDATE stateme
25070 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 72 65 6e  nts on the paren
25080 74 0a 20 20 2a 2a 20 20 20 20 74 61 62 6c 65 2e  t.  **    table.
25090 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 2e 20 41 20  .  **.  ** 1. A 
250a0 47 4c 4f 42 20 70 61 74 74 65 72 6e 20 73 75 69  GLOB pattern sui
250b0 74 61 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  table for sqlite
250c0 33 5f 73 74 72 67 6c 6f 62 28 29 2e 20 49 66 20  3_strglob(). If 
250d0 74 68 65 20 70 6c 61 6e 20 6f 75 74 70 75 74 20  the plan output 
250e0 62 79 0a 20 20 2a 2a 20 20 20 20 74 68 65 20 45  by.  **    the E
250f0 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
25100 4e 20 63 6f 6d 6d 61 6e 64 20 6d 61 74 63 68 65  N command matche
25110 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20  s this pattern, 
25120 74 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 0a  then the schema.
25130 20 20 2a 2a 20 20 20 20 63 6f 6e 74 61 69 6e 73    **    contains
25140 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63   an index that c
25150 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70  an be used to op
25160 74 69 6d 69 7a 65 20 74 68 65 20 71 75 65 72 79  timize the query
25170 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 2e 20 48  ..  **.  ** 2. H
25180 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 74 65  uman readable te
25190 78 74 20 74 68 61 74 20 64 65 73 63 72 69 62 65  xt that describe
251a0 73 20 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c  s the child tabl
251b0 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65  e and columns. e
251c0 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  .g..  **.  **   
251d0 20 20 20 20 22 63 68 69 6c 64 5f 74 61 62 6c 65      "child_table
251e0 28 63 68 69 6c 64 5f 6b 65 79 31 2c 20 63 68 69  (child_key1, chi
251f0 6c 64 5f 6b 65 79 32 29 22 0a 20 20 2a 2a 0a 20  ld_key2)".  **. 
25200 20 2a 2a 20 33 2e 20 48 75 6d 61 6e 20 72 65 61   ** 3. Human rea
25210 64 61 62 6c 65 20 74 65 78 74 20 74 68 61 74 20  dable text that 
25220 64 65 73 63 72 69 62 65 73 20 74 68 65 20 70 61  describes the pa
25230 72 65 6e 74 20 74 61 62 6c 65 20 61 6e 64 20 63  rent table and c
25240 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a  olumns. e.g..  *
25250 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 70 61  *.  **       "pa
25260 72 65 6e 74 5f 74 61 62 6c 65 28 70 61 72 65 6e  rent_table(paren
25270 74 5f 6b 65 79 31 2c 20 70 61 72 65 6e 74 5f 6b  t_key1, parent_k
25280 65 79 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ey2)".  **.  ** 
25290 34 2e 20 41 20 66 75 6c 6c 20 43 52 45 41 54 45  4. A full CREATE
252a0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
252b0 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68   for an index th
252c0 61 74 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64  at could be used
252d0 20 74 6f 0a 20 20 2a 2a 20 20 20 20 6f 70 74 69   to.  **    opti
252e0 6d 69 7a 65 20 44 45 4c 45 54 45 20 6f 72 20 55  mize DELETE or U
252f0 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
25300 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74   on the parent t
25310 61 62 6c 65 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a  able. e.g..  **.
25320 20 20 2a 2a 20 20 20 20 20 20 20 22 43 52 45 41    **       "CREA
25330 54 45 20 49 4e 44 45 58 20 63 68 69 6c 64 5f 74  TE INDEX child_t
25340 61 62 6c 65 5f 63 68 69 6c 64 5f 6b 65 79 20 4f  able_child_key O
25350 4e 20 63 68 69 6c 64 5f 74 61 62 6c 65 28 63 68  N child_table(ch
25360 69 6c 64 5f 6b 65 79 29 22 0a 20 20 2a 2a 0a 20  ild_key)".  **. 
25370 20 2a 2a 20 35 2e 20 54 68 65 20 6e 61 6d 65 20   ** 5. The name 
25380 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  of the parent ta
25390 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ble..  **.  ** T
253a0 68 65 73 65 20 73 69 78 20 76 61 6c 75 65 73 20  hese six values 
253b0 61 72 65 20 75 73 65 64 20 62 79 20 74 68 65 20  are used by the 
253c0 43 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 74 6f  C logic below to
253d0 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 72 65   generate the re
253e0 70 6f 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e  port..  */.  con
253f0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 0a  st char *zSql =.
25400 20 20 22 53 45 4c 45 43 54 20 22 0a 20 20 20 20    "SELECT ".    
25410 22 20 20 20 20 20 27 45 58 50 4c 41 49 4e 20 51  "     'EXPLAIN Q
25420 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43 54  UERY PLAN SELECT
25430 20 31 20 46 52 4f 4d 20 27 20 7c 7c 20 71 75 6f   1 FROM ' || quo
25440 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 20  te(s.name) || ' 
25450 57 48 45 52 45 20 27 22 0a 20 20 20 20 22 20 20  WHERE '".    "  
25460 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
25470 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c  quote(s.name) ||
25480 20 27 2e 27 20 7c 7c 20 71 75 6f 74 65 28 66 2e   '.' || quote(f.
25490 5b 66 72 6f 6d 5d 29 20 7c 7c 20 27 3d 3f 27 20  [from]) || '=?' 
254a0 22 0a 20 20 20 20 22 20 20 7c 7c 20 66 6b 65 79  ".    "  || fkey
254b0 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28  _collate_clause(
254c0 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 66 2e  ".    "       f.
254d0 5b 74 61 62 6c 65 5d 2c 20 43 4f 41 4c 45 53 43  [table], COALESC
254e0 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d  E(f.[to], p.[nam
254f0 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e 5b  e]), s.name, f.[
25500 66 72 6f 6d 5d 29 2c 27 20 41 4e 44 20 27 29 22  from]),' AND ')"
25510 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20  .    ", ".    " 
25520 20 20 20 20 27 53 45 41 52 43 48 20 54 41 42 4c      'SEARCH TABL
25530 45 20 27 20 7c 7c 20 73 2e 6e 61 6d 65 20 7c 7c  E ' || s.name ||
25540 20 27 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e   ' USING COVERIN
25550 47 20 49 4e 44 45 58 2a 28 27 22 0a 20 20 20 20  G INDEX*('".    
25560 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  "  || group_conc
25570 61 74 28 27 2a 3d 3f 27 2c 20 27 20 41 4e 44 20  at('*=?', ' AND 
25580 27 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20 22  ') || ')'".    "
25590 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 73 2e  , ".    "     s.
255a0 6e 61 6d 65 20 20 7c 7c 20 27 28 27 20 7c 7c 20  name  || '(' || 
255b0 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66 2e 5b  group_concat(f.[
255c0 66 72 6f 6d 5d 2c 20 20 27 2c 20 27 29 20 7c 7c  from],  ', ') ||
255d0 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20   ')'".    ", ". 
255e0 20 20 20 22 20 20 20 20 20 66 2e 5b 74 61 62 6c     "     f.[tabl
255f0 65 5d 20 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f  e] || '(' || gro
25600 75 70 5f 63 6f 6e 63 61 74 28 43 4f 41 4c 45 53  up_concat(COALES
25610 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61  CE(f.[to], p.[na
25620 6d 65 5d 29 29 20 7c 7c 20 27 29 27 22 0a 20 20  me])) || ')'".  
25630 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20    ", ".    "    
25640 20 27 43 52 45 41 54 45 20 49 4e 44 45 58 20 27   'CREATE INDEX '
25650 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65   || quote(s.name
25660 20 7c 7c 27 5f 27 7c 7c 20 67 72 6f 75 70 5f 63   ||'_'|| group_c
25670 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20  oncat(f.[from], 
25680 27 5f 27 29 29 22 0a 20 20 20 20 22 20 20 7c 7c  '_'))".    "  ||
25690 20 27 20 4f 4e 20 27 20 7c 7c 20 71 75 6f 74 65   ' ON ' || quote
256a0 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 28 27 22  (s.name) || '('"
256b0 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70  .    "  || group
256c0 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28 66 2e  _concat(quote(f.
256d0 5b 66 72 6f 6d 5d 29 20 7c 7c 22 0a 20 20 20 20  [from]) ||".    
256e0 22 20 20 20 20 20 20 20 20 66 6b 65 79 5f 63 6f  "        fkey_co
256f0 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 22 0a 20  llate_clause(". 
25700 20 20 20 22 20 20 20 20 20 20 20 20 20 20 66 2e     "          f.
25710 5b 74 61 62 6c 65 5d 2c 20 43 4f 41 4c 45 53 43  [table], COALESC
25720 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d  E(f.[to], p.[nam
25730 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e 5b  e]), s.name, f.[
25740 66 72 6f 6d 5d 29 2c 20 27 2c 20 27 29 22 0a 20  from]), ', ')". 
25750 20 20 20 22 20 20 7c 7c 20 27 29 3b 27 22 0a 20     "  || ');'". 
25760 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20     ", ".    "   
25770 20 20 66 2e 5b 74 61 62 6c 65 5d 20 22 0a 20 20    f.[table] ".  
25780 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d    "FROM sqlite_m
25790 61 73 74 65 72 20 41 53 20 73 2c 20 70 72 61 67  aster AS s, prag
257a0 6d 61 5f 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 6c  ma_foreign_key_l
257b0 69 73 74 28 73 2e 6e 61 6d 65 29 20 41 53 20 66  ist(s.name) AS f
257c0 20 22 0a 20 20 20 20 22 4c 45 46 54 20 4a 4f 49   ".    "LEFT JOI
257d0 4e 20 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f 69  N pragma_table_i
257e0 6e 66 6f 20 41 53 20 70 20 4f 4e 20 28 70 6b 2d  nfo AS p ON (pk-
257f0 31 3d 73 65 71 20 41 4e 44 20 70 2e 61 72 67 3d  1=seq AND p.arg=
25800 66 2e 5b 74 61 62 6c 65 5d 29 20 22 0a 20 20 20  f.[table]) ".   
25810 20 22 47 52 4f 55 50 20 42 59 20 73 2e 6e 61 6d   "GROUP BY s.nam
25820 65 2c 20 66 2e 69 64 20 22 0a 20 20 20 20 22 4f  e, f.id ".    "O
25830 52 44 45 52 20 42 59 20 28 43 41 53 45 20 57 48  RDER BY (CASE WH
25840 45 4e 20 3f 20 54 48 45 4e 20 66 2e 5b 74 61 62  EN ? THEN f.[tab
25850 6c 65 5d 20 45 4c 53 45 20 73 2e 6e 61 6d 65 20  le] ELSE s.name 
25860 45 4e 44 29 22 0a 20 20 3b 0a 20 20 63 6f 6e 73  END)".  ;.  cons
25870 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 49 50 4b  t char *zGlobIPK
25880 20 3d 20 22 53 45 41 52 43 48 20 54 41 42 4c 45   = "SEARCH TABLE
25890 20 2a 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52   * USING INTEGER
258a0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 28 72 6f   PRIMARY KEY (ro
258b0 77 69 64 3d 3f 29 22 3b 0a 0a 20 20 66 6f 72 28  wid=?)";..  for(
258c0 69 3d 32 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=2; i<nArg; i++
258d0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  ){.    int n = s
258e0 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 69 5d  trlen30(azArg[i]
258f0 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 31 20 26  );.    if( n>1 &
25900 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  & sqlite3_strnic
25910 6d 70 28 22 2d 76 65 72 62 6f 73 65 22 2c 20 61  mp("-verbose", a
25920 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29  zArg[i], n)==0 )
25930 7b 0a 20 20 20 20 20 20 62 56 65 72 62 6f 73 65  {.      bVerbose
25940 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
25950 65 6c 73 65 20 69 66 28 20 6e 3e 31 20 26 26 20  else if( n>1 && 
25960 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
25970 28 22 2d 67 72 6f 75 70 62 79 70 61 72 65 6e 74  ("-groupbyparent
25980 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d  ", azArg[i], n)=
25990 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 47 72 6f  =0 ){.      bGro
259a0 75 70 42 79 50 61 72 65 6e 74 20 3d 20 31 3b 0a  upByParent = 1;.
259b0 20 20 20 20 20 20 7a 49 6e 64 65 6e 74 20 3d 20        zIndent = 
259c0 22 20 20 20 20 22 3b 0a 20 20 20 20 7d 0a 20 20  "    ";.    }.  
259d0 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61    else{.      ra
259e0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
259f0 20 22 55 73 61 67 65 3a 20 25 73 20 25 73 20 3f   "Usage: %s %s ?
25a00 2d 76 65 72 62 6f 73 65 3f 20 3f 2d 67 72 6f 75  -verbose? ?-grou
25a10 70 62 79 70 61 72 65 6e 74 3f 5c 6e 22 2c 0a 20  pbyparent?\n",. 
25a20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 30           azArg[0
25a30 5d 2c 20 61 7a 41 72 67 5b 31 5d 0a 20 20 20 20  ], azArg[1].    
25a40 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72    );.      retur
25a50 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
25a60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
25a70 52 65 67 69 73 74 65 72 20 74 68 65 20 66 6b 65  Register the fke
25a80 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65  y_collate_clause
25a90 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  () SQL function 
25aa0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
25ab0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
25ac0 6e 28 64 62 2c 20 22 66 6b 65 79 5f 63 6f 6c 6c  n(db, "fkey_coll
25ad0 61 74 65 5f 63 6c 61 75 73 65 22 2c 20 34 2c 20  ate_clause", 4, 
25ae0 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20  SQLITE_UTF8,.   
25af0 20 20 20 30 2c 20 73 68 65 6c 6c 46 6b 65 79 43     0, shellFkeyC
25b00 6f 6c 6c 61 74 65 43 6c 61 75 73 65 2c 20 30 2c  ollateClause, 0,
25b10 20 30 0a 20 20 29 3b 0a 0a 0a 20 20 69 66 28 20   0.  );...  if( 
25b20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25b30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
25b40 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
25b50 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 71 6c   zSql, -1, &pSql
25b60 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
25b70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25b80 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
25b90 64 5f 69 6e 74 28 70 53 71 6c 2c 20 31 2c 20 62  d_int(pSql, 1, b
25ba0 47 72 6f 75 70 42 79 50 61 72 65 6e 74 29 3b 0a  GroupByParent);.
25bb0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
25bc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25bd0 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 63 68 61  int rc2;.    cha
25be0 72 20 2a 7a 50 72 65 76 20 3d 20 30 3b 0a 20 20  r *zPrev = 0;.  
25bf0 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
25c00 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
25c10 70 28 70 53 71 6c 29 20 29 7b 0a 20 20 20 20 20  p(pSql) ){.     
25c20 20 69 6e 74 20 72 65 73 20 3d 20 2d 31 3b 0a 20   int res = -1;. 
25c30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
25c40 74 20 2a 70 45 78 70 6c 61 69 6e 20 3d 20 30 3b  t *pExplain = 0;
25c50 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
25c60 72 20 2a 7a 45 51 50 20 3d 20 28 63 6f 6e 73 74  r *zEQP = (const
25c70 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
25c80 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
25c90 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74   0);.      const
25ca0 20 63 68 61 72 20 2a 7a 47 6c 6f 62 20 3d 20 28   char *zGlob = (
25cb0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
25cc0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
25cd0 70 53 71 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20  pSql, 1);.      
25ce0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 72 6f  const char *zFro
25cf0 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  m = (const char*
25d00 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
25d10 74 65 78 74 28 70 53 71 6c 2c 20 32 29 3b 0a 20  text(pSql, 2);. 
25d20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
25d30 2a 7a 54 61 72 67 65 74 20 3d 20 28 63 6f 6e 73  *zTarget = (cons
25d40 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
25d50 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
25d60 2c 20 33 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , 3);.      cons
25d70 74 20 63 68 61 72 20 2a 7a 43 49 20 3d 20 28 63  t char *zCI = (c
25d80 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
25d90 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
25da0 53 71 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 63  Sql, 4);.      c
25db0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65  onst char *zPare
25dc0 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  nt = (const char
25dd0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
25de0 5f 74 65 78 74 28 70 53 71 6c 2c 20 35 29 3b 0a  _text(pSql, 5);.
25df0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
25e00 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
25e10 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45  b, zEQP, -1, &pE
25e20 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20  xplain, 0);.    
25e30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25e40 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  _OK ) break;.   
25e50 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
25e60 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
25e70 70 45 78 70 6c 61 69 6e 29 20 29 7b 0a 20 20 20  pExplain) ){.   
25e80 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
25e90 2a 7a 50 6c 61 6e 20 3d 20 28 63 6f 6e 73 74 20  *zPlan = (const 
25ea0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
25eb0 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c 61  lumn_text(pExpla
25ec0 69 6e 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20  in, 3);.        
25ed0 72 65 73 20 3d 20 28 0a 20 20 20 20 20 20 20 20  res = (.        
25ee0 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33        0==sqlite3
25ef0 5f 73 74 72 67 6c 6f 62 28 7a 47 6c 6f 62 2c 20  _strglob(zGlob, 
25f00 7a 50 6c 61 6e 29 0a 20 20 20 20 20 20 20 20 20  zPlan).         
25f10 20 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 5f    || 0==sqlite3_
25f20 73 74 72 67 6c 6f 62 28 7a 47 6c 6f 62 49 50 4b  strglob(zGlobIPK
25f30 2c 20 7a 50 6c 61 6e 29 0a 20 20 20 20 20 20 20  , zPlan).       
25f40 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
25f50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
25f60 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e  inalize(pExplain
25f70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
25f80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65  =SQLITE_OK ) bre
25f90 61 6b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72  ak;..      if( r
25fa0 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  es<0 ){.        
25fb0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
25fc0 72 2c 20 22 45 72 72 6f 72 3a 20 69 6e 74 65 72  r, "Error: inter
25fd0 6e 61 6c 20 65 72 72 6f 72 22 29 3b 0a 20 20 20  nal error");.   
25fe0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25ff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26000 20 69 66 28 20 62 47 72 6f 75 70 42 79 50 61 72   if( bGroupByPar
26010 65 6e 74 0a 20 20 20 20 20 20 20 20 26 26 20 28  ent.        && (
26020 62 56 65 72 62 6f 73 65 20 7c 7c 20 72 65 73 3d  bVerbose || res=
26030 3d 30 29 0a 20 20 20 20 20 20 20 20 26 26 20 28  =0).        && (
26040 7a 50 72 65 76 3d 3d 30 20 7c 7c 20 73 71 6c 69  zPrev==0 || sqli
26050 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 50 61 72  te3_stricmp(zPar
26060 65 6e 74 2c 20 7a 50 72 65 76 29 29 0a 20 20 20  ent, zPrev)).   
26070 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
26080 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
26090 2c 20 22 2d 2d 20 50 61 72 65 6e 74 20 74 61 62  , "-- Parent tab
260a0 6c 65 20 25 73 5c 6e 22 2c 20 7a 50 61 72 65 6e  le %s\n", zParen
260b0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  t);.          sq
260c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72 65 76  lite3_free(zPrev
260d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 50 72  );.          zPr
260e0 65 76 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ev = sqlite3_mpr
260f0 69 6e 74 66 28 22 25 73 22 2c 20 7a 50 61 72 65  intf("%s", zPare
26100 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  nt);.        }..
26110 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3d          if( res=
26120 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
26130 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
26140 22 25 73 25 73 20 2d 2d 3e 20 25 73 5c 6e 22 2c  "%s%s --> %s\n",
26150 20 7a 49 6e 64 65 6e 74 2c 20 7a 43 49 2c 20 7a   zIndent, zCI, z
26160 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  Target);.       
26170 20 7d 65 6c 73 65 20 69 66 28 20 62 56 65 72 62   }else if( bVerb
26180 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ose ){.         
26190 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
261a0 20 22 25 73 2f 2a 20 6e 6f 20 65 78 74 72 61 20   "%s/* no extra 
261b0 69 6e 64 65 78 65 73 20 72 65 71 75 69 72 65 64  indexes required
261c0 20 66 6f 72 20 25 73 20 2d 3e 20 25 73 20 2a 2f   for %s -> %s */
261d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
261e0 20 20 20 7a 49 6e 64 65 6e 74 2c 20 7a 46 72 6f     zIndent, zFro
261f0 6d 2c 20 7a 54 61 72 67 65 74 0a 20 20 20 20 20  m, zTarget.     
26200 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
26210 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
26220 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
26230 28 7a 50 72 65 76 29 3b 0a 0a 20 20 20 20 69 66  (zPrev);..    if
26240 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26250 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
26260 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c  ntf(stderr, "%s\
26270 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
26280 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 0a  sg(db));.    }..
26290 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
262a0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 71 6c 29  3_finalize(pSql)
262b0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
262c0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 32 21 3d  LITE_OK && rc2!=
262d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
262e0 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
262f0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
26300 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71  derr, "%s\n", sq
26310 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
26320 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
26330 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  {.    raw_printf
26340 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c  (stderr, "%s\n",
26350 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
26360 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  db));.  }..  ret
26370 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26380 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
26390 6f 66 20 22 2e 6c 69 6e 74 22 20 64 6f 74 20 63  of ".lint" dot c
263a0 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  ommand..*/.stati
263b0 63 20 69 6e 74 20 6c 69 6e 74 44 6f 74 43 6f 6d  c int lintDotCom
263c0 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61  mand(.  ShellSta
263d0 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20  te *pState,     
263e0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
263f0 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74  nt shell tool st
26400 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ate */.  char **
26410 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  azArg,          
26420 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
26430 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70  y of arguments p
26440 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d  assed to dot com
26450 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  mand */.  int nA
26460 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
26470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
26480 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
26490 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a  n azArg[] */.){.
264a0 20 20 69 6e 74 20 6e 3b 0a 20 20 6e 20 3d 20 28    int n;.  n = (
264b0 6e 41 72 67 3e 3d 32 20 3f 20 73 74 72 6c 65 6e  nArg>=2 ? strlen
264c0 33 30 28 61 7a 41 72 67 5b 31 5d 29 20 3a 20 30  30(azArg[1]) : 0
264d0 29 3b 0a 20 20 69 66 28 20 6e 3c 31 20 7c 7c 20  );.  if( n<1 || 
264e0 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
264f0 28 61 7a 41 72 67 5b 31 5d 2c 20 22 66 6b 65 79  (azArg[1], "fkey
26500 2d 69 6e 64 65 78 65 73 22 2c 20 6e 29 20 29 20  -indexes", n) ) 
26510 67 6f 74 6f 20 75 73 61 67 65 3b 0a 20 20 72 65  goto usage;.  re
26520 74 75 72 6e 20 6c 69 6e 74 46 6b 65 79 49 6e 64  turn lintFkeyInd
26530 65 78 65 73 28 70 53 74 61 74 65 2c 20 61 7a 41  exes(pState, azA
26540 72 67 2c 20 6e 41 72 67 29 3b 0a 0a 20 75 73 61  rg, nArg);.. usa
26550 67 65 3a 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  ge:.  raw_printf
26560 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 20  (stderr, "Usage 
26570 25 73 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 20 3f  %s sub-command ?
26580 73 77 69 74 63 68 65 73 2e 2e 2e 3f 5c 6e 22 2c  switches...?\n",
26590 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 72 61   azArg[0]);.  ra
265a0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
265b0 20 22 57 68 65 72 65 20 73 75 62 2d 63 6f 6d 6d   "Where sub-comm
265c0 61 6e 64 73 20 61 72 65 3a 5c 6e 22 29 3b 0a 20  ands are:\n");. 
265d0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
265e0 72 72 2c 20 22 20 20 20 20 66 6b 65 79 2d 69 6e  rr, "    fkey-in
265f0 64 65 78 65 73 5c 6e 22 29 3b 0a 20 20 72 65 74  dexes\n");.  ret
26600 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
26610 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
26620 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
26630 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64  RTUALTABLE) && d
26640 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
26650 56 45 5f 5a 4c 49 42 29 0a 2f 2a 2a 2a 2a 2a 2a  VE_ZLIB)./******
26660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
266a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
266b0 68 65 20 22 2e 61 72 63 68 69 76 65 22 20 6f 72  he ".archive" or
266c0 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a   ".ar" command..
266d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
266e0 68 65 6c 6c 50 72 65 70 61 72 65 28 0a 20 20 73  hellPrepare(.  s
266f0 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69  qlite3 *db, .  i
26700 6e 74 20 2a 70 52 63 2c 20 0a 20 20 63 6f 6e 73  nt *pRc, .  cons
26710 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20  t char *zSql, . 
26720 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a   sqlite3_stmt **
26730 70 70 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53  ppStmt.){.  *ppS
26740 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a  tmt = 0;.  if( *
26750 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
26760 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
26770 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
26780 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  2(db, zSql, -1, 
26790 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  ppStmt, 0);.    
267a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
267b0 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  K ){.      raw_p
267c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73  rintf(stderr, "s
267d0 71 6c 20 65 72 72 6f 72 3a 20 25 73 20 28 25 64  ql error: %s (%d
267e0 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  )\n", .         
267f0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
26800 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  db), sqlite3_err
26810 63 6f 64 65 28 64 62 29 0a 20 20 20 20 20 20 29  code(db).      )
26820 3b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 72  ;.      *pRc = r
26830 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  c;.    }.  }.}..
26840 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
26850 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 0a  lPreparePrintf(.
26860 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
26870 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73    int *pRc, .  s
26880 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
26890 53 74 6d 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Stmt,.  const ch
268a0 61 72 20 2a 7a 46 6d 74 2c 20 0a 20 20 2e 2e 2e  ar *zFmt, .  ...
268b0 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20  .){.  *ppStmt = 
268c0 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  0;.  if( *pRc==S
268d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
268e0 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20  va_list ap;.    
268f0 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 76 61 5f  char *z;.    va_
26900 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b  start(ap, zFmt);
26910 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
26920 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20  _vmprintf(zFmt, 
26930 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
26940 61 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  ap);.    if( z==
26950 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20  0 ){.      *pRc 
26960 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
26970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26980 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 64 62   shellPrepare(db
26990 2c 20 70 52 63 2c 20 7a 2c 20 70 70 53 74 6d 74  , pRc, z, ppStmt
269a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
269b0 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d 0a  _free(z);.    }.
269c0 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
269d0 69 64 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65  id shellFinalize
269e0 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20  (.  int *pRc, . 
269f0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
26a00 53 74 6d 74 0a 29 7b 0a 20 20 69 66 28 20 70 53  Stmt.){.  if( pS
26a10 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tmt ){.    sqlit
26a20 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
26a30 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74  _db_handle(pStmt
26a40 29 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  );.    int rc = 
26a50 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
26a60 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
26a70 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
26a80 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
26a90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26aa0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
26ab0 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 20 65  f(stderr, "SQL e
26ac0 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
26ad0 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
26ae0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26af0 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d  *pRc = rc;.    }
26b00 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
26b10 6f 69 64 20 73 68 65 6c 6c 52 65 73 65 74 28 0a  oid shellReset(.
26b20 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73    int *pRc, .  s
26b30 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
26b40 6d 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  mt.){.  int rc =
26b50 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
26b60 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 2a 70 52  Stmt);.  if( *pR
26b70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26b80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
26b90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
26ba0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
26bb0 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70  ite3_db_handle(p
26bc0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 61 77  Stmt);.      raw
26bd0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
26be0 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e  "SQL error: %s\n
26bf0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
26c00 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20  g(db));.    }.  
26c10 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 7d    *pRc = rc;.  }
26c20 0a 7d 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75  .}./*.** Structu
26c30 72 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  re representing 
26c40 61 20 73 69 6e 67 6c 65 20 22 2e 61 72 22 20 63  a single ".ar" c
26c50 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 74 79 70 65 64  ommand..*/.typed
26c60 65 66 20 73 74 72 75 63 74 20 41 72 43 6f 6d 6d  ef struct ArComm
26c70 61 6e 64 20 41 72 43 6f 6d 6d 61 6e 64 3b 0a 73  and ArCommand;.s
26c80 74 72 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20  truct ArCommand 
26c90 7b 0a 20 20 75 38 20 65 43 6d 64 3b 20 20 20 20  {.  u8 eCmd;    
26ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cb0 20 20 20 20 2f 2a 20 41 6e 20 41 52 5f 43 4d 44      /* An AR_CMD
26cc0 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 75 38  _* value */.  u8
26cd0 20 62 56 65 72 62 6f 73 65 3b 20 20 20 20 20 20   bVerbose;      
26ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26cf0 20 54 72 75 65 20 69 66 20 2d 2d 76 65 72 62 6f   True if --verbo
26d00 73 65 20 2a 2f 0a 20 20 75 38 20 62 5a 69 70 3b  se */.  u8 bZip;
26d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
26d30 69 66 20 74 68 65 20 61 72 63 68 69 76 65 20 69  if the archive i
26d40 73 20 61 20 5a 49 50 20 2a 2f 0a 20 20 75 38 20  s a ZIP */.  u8 
26d50 62 44 72 79 52 75 6e 3b 20 20 20 20 20 20 20 20  bDryRun;        
26d60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26d70 54 72 75 65 20 69 66 20 2d 2d 64 72 79 2d 72 75  True if --dry-ru
26d80 6e 20 2a 2f 0a 20 20 75 38 20 62 41 70 70 65 6e  n */.  u8 bAppen
26d90 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
26da0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
26db0 66 20 2d 2d 61 70 70 65 6e 64 20 2a 2f 0a 20 20  f --append */.  
26dc0 75 38 20 66 72 6f 6d 43 6d 64 4c 69 6e 65 3b 20  u8 fromCmdLine; 
26dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26de0 2f 2a 20 52 75 6e 20 66 72 6f 6d 20 2d 41 20 69  /* Run from -A i
26df0 6e 73 74 65 61 64 20 6f 66 20 2e 61 72 63 68 69  nstead of .archi
26e00 76 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  ve */.  int nArg
26e10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26e20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
26e30 72 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67  r of command arg
26e40 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
26e50 20 2a 7a 53 72 63 54 61 62 6c 65 3b 20 20 20 20   *zSrcTable;    
26e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22              /* "
26e70 73 71 6c 61 72 22 2c 20 22 7a 69 70 66 69 6c 65  sqlar", "zipfile
26e80 28 24 66 69 6c 65 29 22 20 6f 72 20 22 7a 69 70  ($file)" or "zip
26e90 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  " */.  const cha
26ea0 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20  r *zFile;       
26eb0 20 20 20 20 20 20 20 2f 2a 20 2d 2d 66 69 6c 65         /* --file
26ec0 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55   argument, or NU
26ed0 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  LL */.  const ch
26ee0 61 72 20 2a 7a 44 69 72 3b 20 20 20 20 20 20 20  ar *zDir;       
26ef0 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 64 69 72          /* --dir
26f00 65 63 74 6f 72 79 20 61 72 67 75 6d 65 6e 74 2c  ectory argument,
26f10 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68   or NULL */.  ch
26f20 61 72 20 2a 2a 61 7a 41 72 67 3b 20 20 20 20 20  ar **azArg;     
26f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f40 20 41 72 72 61 79 20 6f 66 20 63 6f 6d 6d 61 6e   Array of comman
26f50 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  d arguments */. 
26f60 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 3b 20   ShellState *p; 
26f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f80 20 2f 2a 20 53 68 65 6c 6c 20 73 74 61 74 65 20   /* Shell state 
26f90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
26fa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26fb0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
26fc0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
26fd0 61 72 63 68 69 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f  archive */.};../
26fe0 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 75 73 61  *.** Print a usa
26ff0 67 65 20 6d 65 73 73 61 67 65 20 66 6f 72 20 74  ge message for t
27000 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74  he .ar command t
27010 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65 74  o stderr and ret
27020 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
27030 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27040 61 72 55 73 61 67 65 28 46 49 4c 45 20 2a 66 29  arUsage(FILE *f)
27050 7b 0a 20 20 73 68 6f 77 48 65 6c 70 28 66 2c 22  {.  showHelp(f,"
27060 61 72 63 68 69 76 65 22 29 3b 0a 20 20 72 65 74  archive");.  ret
27070 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
27080 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ;.}../*.** Print
27090 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
270a0 65 20 66 6f 72 20 74 68 65 20 2e 61 72 20 63 6f  e for the .ar co
270b0 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65 72 72 20  mmand to stderr 
270c0 61 6e 64 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  and return .** S
270d0 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a  QLITE_ERROR..*/.
270e0 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 72 72  static int arErr
270f0 6f 72 4d 73 67 28 41 72 43 6f 6d 6d 61 6e 64 20  orMsg(ArCommand 
27100 2a 70 41 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  *pAr, const char
27110 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20   *zFmt, ...){.  
27120 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
27130 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 73 74 61 72  ar *z;.  va_star
27140 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a  t(ap, zFmt);.  z
27150 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
27160 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20  ntf(zFmt, ap);. 
27170 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 75   va_end(ap);.  u
27180 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
27190 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
271a0 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 41 72 2d  , z);.  if( pAr-
271b0 3e 66 72 6f 6d 43 6d 64 4c 69 6e 65 20 29 7b 0a  >fromCmdLine ){.
271c0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
271d0 73 74 64 65 72 72 2c 20 22 55 73 65 20 5c 22 2d  stderr, "Use \"-
271e0 41 5c 22 20 66 6f 72 20 6d 6f 72 65 20 68 65 6c  A\" for more hel
271f0 70 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p\n");.  }else{.
27200 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
27210 73 74 64 65 72 72 2c 20 22 55 73 65 20 5c 22 2e  stderr, "Use \".
27220 61 72 63 68 69 76 65 20 2d 2d 68 65 6c 70 5c 22  archive --help\"
27230 20 66 6f 72 20 6d 6f 72 65 20 68 65 6c 70 5c 6e   for more help\n
27240 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ");.  }.  sqlite
27250 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
27260 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
27270 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65  ;.}../*.** Value
27280 73 20 66 6f 72 20 41 72 43 6f 6d 6d 61 6e 64 2e  s for ArCommand.
27290 65 43 6d 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  eCmd..*/.#define
272a0 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 20 20   AR_CMD_CREATE  
272b0 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 41       1.#define A
272c0 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 20 20 20  R_CMD_EXTRACT   
272d0 20 20 20 32 0a 23 64 65 66 69 6e 65 20 41 52 5f     2.#define AR_
272e0 43 4d 44 5f 4c 49 53 54 20 20 20 20 20 20 20 20  CMD_LIST        
272f0 20 33 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d   3.#define AR_CM
27300 44 5f 55 50 44 41 54 45 20 20 20 20 20 20 20 34  D_UPDATE       4
27310 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f  .#define AR_CMD_
27320 48 45 4c 50 20 20 20 20 20 20 20 20 20 35 0a 0a  HELP         5..
27330 2f 2a 0a 2a 2a 20 4f 74 68 65 72 20 28 6e 6f 6e  /*.** Other (non
27340 2d 63 6f 6d 6d 61 6e 64 29 20 73 77 69 74 63 68  -command) switch
27350 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41  es..*/.#define A
27360 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53 45  R_SWITCH_VERBOSE
27370 20 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20 41       6.#define A
27380 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 20 20 20  R_SWITCH_FILE   
27390 20 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20 41       7.#define A
273a0 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54 4f  R_SWITCH_DIRECTO
273b0 52 59 20 20 20 38 0a 23 64 65 66 69 6e 65 20 41  RY   8.#define A
273c0 52 5f 53 57 49 54 43 48 5f 41 50 50 45 4e 44 20  R_SWITCH_APPEND 
273d0 20 20 20 20 20 39 0a 23 64 65 66 69 6e 65 20 41       9.#define A
273e0 52 5f 53 57 49 54 43 48 5f 44 52 59 52 55 4e 20  R_SWITCH_DRYRUN 
273f0 20 20 20 20 31 30 0a 0a 73 74 61 74 69 63 20 69      10..static i
27400 6e 74 20 61 72 50 72 6f 63 65 73 73 53 77 69 74  nt arProcessSwit
27410 63 68 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  ch(ArCommand *pA
27420 72 2c 20 69 6e 74 20 65 53 77 69 74 63 68 2c 20  r, int eSwitch, 
27430 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
27440 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65 53 77  ){.  switch( eSw
27450 69 74 63 68 20 29 7b 0a 20 20 20 20 63 61 73 65  itch ){.    case
27460 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 3a 0a   AR_CMD_CREATE:.
27470 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
27480 45 58 54 52 41 43 54 3a 0a 20 20 20 20 63 61 73  EXTRACT:.    cas
27490 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20  e AR_CMD_LIST:. 
274a0 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 55     case AR_CMD_U
274b0 50 44 41 54 45 3a 0a 20 20 20 20 63 61 73 65 20  PDATE:.    case 
274c0 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20 20  AR_CMD_HELP:.   
274d0 20 20 20 69 66 28 20 70 41 72 2d 3e 65 43 6d 64     if( pAr->eCmd
274e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
274f0 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41  rn arErrorMsg(pA
27500 72 2c 20 22 6d 75 6c 74 69 70 6c 65 20 63 6f 6d  r, "multiple com
27510 6d 61 6e 64 20 6f 70 74 69 6f 6e 73 22 29 3b 0a  mand options");.
27520 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
27530 72 2d 3e 65 43 6d 64 20 3d 20 65 53 77 69 74 63  r->eCmd = eSwitc
27540 68 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  h;.      break;.
27550 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49  .    case AR_SWI
27560 54 43 48 5f 44 52 59 52 55 4e 3a 0a 20 20 20 20  TCH_DRYRUN:.    
27570 20 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 3d    pAr->bDryRun =
27580 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
27590 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49  .    case AR_SWI
275a0 54 43 48 5f 56 45 52 42 4f 53 45 3a 0a 20 20 20  TCH_VERBOSE:.   
275b0 20 20 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65     pAr->bVerbose
275c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
275d0 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53  k;.    case AR_S
275e0 57 49 54 43 48 5f 41 50 50 45 4e 44 3a 0a 20 20  WITCH_APPEND:.  
275f0 20 20 20 20 70 41 72 2d 3e 62 41 70 70 65 6e 64      pAr->bAppend
27600 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46   = 1;.      /* F
27610 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 2d 2d  all thru into --
27620 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65  file */.    case
27630 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 3a   AR_SWITCH_FILE:
27640 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a 46 69 6c  .      pAr->zFil
27650 65 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20  e = zArg;.      
27660 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
27670 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54  AR_SWITCH_DIRECT
27680 4f 52 59 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e  ORY:.      pAr->
27690 7a 44 69 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20  zDir = zArg;.   
276a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
276b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
276c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73  K;.}../*.** Pars
276d0 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  e the command li
276e0 6e 65 20 66 6f 72 20 61 6e 20 22 2e 61 72 22 20  ne for an ".ar" 
276f0 63 6f 6d 6d 61 6e 64 2e 20 54 68 65 20 72 65 73  command. The res
27700 75 6c 74 73 20 61 72 65 20 77 72 69 74 74 65 6e  ults are written
27710 20 69 6e 74 6f 0a 2a 2a 20 73 74 72 75 63 74 75   into.** structu
27720 72 65 20 28 2a 70 41 72 29 2e 20 53 51 4c 49 54  re (*pAr). SQLIT
27730 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
27740 20 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   if the command 
27750 6c 69 6e 65 20 69 73 20 70 61 72 73 65 64 0a 2a  line is parsed.*
27760 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  * successfully, 
27770 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
27780 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72  or message is wr
27790 69 74 74 65 6e 20 74 6f 20 73 74 64 65 72 72 20  itten to stderr 
277a0 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  and .** SQLITE_E
277b0 52 52 4f 52 20 72 65 74 75 72 6e 65 64 2e 0a 2a  RROR returned..*
277c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 50  /.static int arP
277d0 61 72 73 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 63  arseCommand(.  c
277e0 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
277f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27800 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
27810 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
27820 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
27830 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
27840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27850 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
27860 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
27870 2a 2f 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a  */.  ArCommand *
27880 70 41 72 20 20 20 20 20 20 20 20 20 20 20 20 20  pAr             
27890 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65       /* Populate
278a0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
278b0 29 7b 0a 20 20 73 74 72 75 63 74 20 41 72 53 77  ){.  struct ArSw
278c0 69 74 63 68 20 7b 0a 20 20 20 20 63 6f 6e 73 74  itch {.    const
278d0 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 3b 0a 20 20   char *zLong;.  
278e0 20 20 63 68 61 72 20 63 53 68 6f 72 74 3b 0a 20    char cShort;. 
278f0 20 20 20 75 38 20 65 53 77 69 74 63 68 3b 0a 20     u8 eSwitch;. 
27900 20 20 20 75 38 20 62 41 72 67 3b 0a 20 20 7d 20     u8 bArg;.  } 
27910 61 53 77 69 74 63 68 5b 5d 20 3d 20 7b 0a 20 20  aSwitch[] = {.  
27920 20 20 7b 20 22 63 72 65 61 74 65 22 2c 20 20 20    { "create",   
27930 20 27 63 27 2c 20 41 52 5f 43 4d 44 5f 43 52 45   'c', AR_CMD_CRE
27940 41 54 45 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ATE,       0 },.
27950 20 20 20 20 7b 20 22 65 78 74 72 61 63 74 22 2c      { "extract",
27960 20 20 20 27 78 27 2c 20 41 52 5f 43 4d 44 5f 45     'x', AR_CMD_E
27970 58 54 52 41 43 54 2c 20 20 20 20 20 20 30 20 7d  XTRACT,      0 }
27980 2c 0a 20 20 20 20 7b 20 22 6c 69 73 74 22 2c 20  ,.    { "list", 
27990 20 20 20 20 20 27 74 27 2c 20 41 52 5f 43 4d 44       't', AR_CMD
279a0 5f 4c 49 53 54 2c 20 20 20 20 20 20 20 20 20 30  _LIST,         0
279b0 20 7d 2c 0a 20 20 20 20 7b 20 22 75 70 64 61 74   },.    { "updat
279c0 65 22 2c 20 20 20 20 27 75 27 2c 20 41 52 5f 43  e",    'u', AR_C
279d0 4d 44 5f 55 50 44 41 54 45 2c 20 20 20 20 20 20  MD_UPDATE,      
279e0 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 68 65 6c   0 },.    { "hel
279f0 70 22 2c 20 20 20 20 20 20 27 68 27 2c 20 41 52  p",      'h', AR
27a00 5f 43 4d 44 5f 48 45 4c 50 2c 20 20 20 20 20 20  _CMD_HELP,      
27a10 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 76     0 },.    { "v
27a20 65 72 62 6f 73 65 22 2c 20 20 20 27 76 27 2c 20  erbose",   'v', 
27a30 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53  AR_SWITCH_VERBOS
27a40 45 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20  E,   0 },.    { 
27a50 22 66 69 6c 65 22 2c 20 20 20 20 20 20 27 66 27  "file",      'f'
27a60 2c 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45  , AR_SWITCH_FILE
27a70 2c 20 20 20 20 20 20 31 20 7d 2c 0a 20 20 20 20  ,      1 },.    
27a80 7b 20 22 61 70 70 65 6e 64 22 2c 20 20 20 20 27  { "append",    '
27a90 61 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 41 50  a', AR_SWITCH_AP
27aa0 50 45 4e 44 2c 20 20 20 20 31 20 7d 2c 0a 20 20  PEND,    1 },.  
27ab0 20 20 7b 20 22 64 69 72 65 63 74 6f 72 79 22 2c    { "directory",
27ac0 20 27 43 27 2c 20 41 52 5f 53 57 49 54 43 48 5f   'C', AR_SWITCH_
27ad0 44 49 52 45 43 54 4f 52 59 2c 20 31 20 7d 2c 0a  DIRECTORY, 1 },.
27ae0 20 20 20 20 7b 20 22 64 72 79 72 75 6e 22 2c 20      { "dryrun", 
27af0 20 20 20 27 6e 27 2c 20 41 52 5f 53 57 49 54 43     'n', AR_SWITC
27b00 48 5f 44 52 59 52 55 4e 2c 20 20 20 20 30 20 7d  H_DRYRUN,    0 }
27b10 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 6e 53 77  ,.  };.  int nSw
27b20 69 74 63 68 20 3d 20 73 69 7a 65 6f 66 28 61 53  itch = sizeof(aS
27b30 77 69 74 63 68 29 20 2f 20 73 69 7a 65 6f 66 28  witch) / sizeof(
27b40 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68 29  struct ArSwitch)
27b50 3b 0a 20 20 73 74 72 75 63 74 20 41 72 53 77 69  ;.  struct ArSwi
27b60 74 63 68 20 2a 70 45 6e 64 20 3d 20 26 61 53 77  tch *pEnd = &aSw
27b70 69 74 63 68 5b 6e 53 77 69 74 63 68 5d 3b 0a 0a  itch[nSwitch];..
27b80 20 20 69 66 28 20 6e 41 72 67 3c 3d 31 20 29 7b    if( nArg<=1 ){
27b90 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
27ba0 28 73 74 64 65 72 72 2c 20 22 57 72 6f 6e 67 20  (stderr, "Wrong 
27bb0 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
27bc0 6e 74 73 2e 20 20 55 73 61 67 65 3a 5c 6e 22 29  nts.  Usage:\n")
27bd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 72 55  ;.    return arU
27be0 73 61 67 65 28 73 74 64 65 72 72 29 3b 0a 20 20  sage(stderr);.  
27bf0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
27c00 2a 7a 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  *z = azArg[1];. 
27c10 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27     if( z[0]!='-'
27c20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 61   ){.      /* Tra
27c30 64 69 74 69 6f 6e 61 6c 20 73 74 79 6c 65 20 5b  ditional style [
27c40 74 61 72 5d 20 69 6e 76 6f 63 61 74 69 6f 6e 20  tar] invocation 
27c50 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  */.      int i;.
27c60 20 20 20 20 20 20 69 6e 74 20 69 41 72 67 20 3d        int iArg =
27c70 20 32 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   2;.      for(i=
27c80 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
27c90 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
27ca0 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20  r *zArg = 0;.   
27cb0 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77       struct ArSw
27cc0 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20  itch *pOpt;.    
27cd0 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26 61 53      for(pOpt=&aS
27ce0 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70  witch[0]; pOpt<p
27cf0 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20  End; pOpt++){.  
27d00 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d          if( z[i]
27d10 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74 20 29  ==pOpt->cShort )
27d20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
27d30 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  }.        if( pO
27d40 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  pt==pEnd ){.    
27d50 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45        return arE
27d60 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 75 6e  rrorMsg(pAr, "un
27d70 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f  recognized optio
27d80 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b 0a 20  n: %c", z[i]);. 
27d90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27da0 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67 20   if( pOpt->bArg 
27db0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
27dc0 20 69 41 72 67 3e 3d 6e 41 72 67 20 29 7b 0a 20   iArg>=nArg ){. 
27dd0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
27de0 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72  n arErrorMsg(pAr
27df0 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72  , "option requir
27e00 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20  es an argument: 
27e10 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20 20  %c",z[i]);.     
27e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27e30 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 69 41   zArg = azArg[iA
27e40 72 67 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 7d  rg++];.        }
27e50 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 72 50  .        if( arP
27e60 72 6f 63 65 73 73 53 77 69 74 63 68 28 70 41 72  rocessSwitch(pAr
27e70 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63 68 2c  , pOpt->eSwitch,
27e80 20 7a 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   zArg) ) return 
27e90 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
27ea0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 72 2d      }.      pAr-
27eb0 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72  >nArg = nArg-iAr
27ec0 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  g;.      if( pAr
27ed0 2d 3e 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20 20  ->nArg>0 ){.    
27ee0 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d      pAr->azArg =
27ef0 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20   &azArg[iArg];. 
27f00 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
27f10 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 74  {.      /* Non-t
27f20 72 61 64 69 74 69 6f 6e 61 6c 20 69 6e 76 6f 63  raditional invoc
27f30 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
27f40 6e 74 20 69 41 72 67 3b 0a 20 20 20 20 20 20 66  nt iArg;.      f
27f50 6f 72 28 69 41 72 67 3d 31 3b 20 69 41 72 67 3c  or(iArg=1; iArg<
27f60 6e 41 72 67 3b 20 69 41 72 67 2b 2b 29 7b 0a 20  nArg; iArg++){. 
27f70 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
27f80 20 20 20 20 20 20 7a 20 3d 20 61 7a 41 72 67 5b        z = azArg[
27f90 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 69  iArg];.        i
27fa0 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a  f( z[0]!='-' ){.
27fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
27fc0 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d 61   remaining comma
27fd0 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 20 61 72  nd line words ar
27fe0 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  e command argume
27ff0 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  nts. */.        
28000 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26    pAr->azArg = &
28010 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20  azArg[iArg];.   
28020 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67         pAr->nArg
28030 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20 20   = nArg-iArg;.  
28040 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
28050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28060 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29   n = strlen30(z)
28070 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ;..        if( z
28080 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [1]!='-' ){.    
28090 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
280a0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72         /* One or
280b0 20 6d 6f 72 65 20 73 68 6f 72 74 20 6f 70 74 69   more short opti
280c0 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ons */.         
280d0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b 20 69   for(i=1; i<n; i
280e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
280f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
28100 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  g = 0;.         
28110 20 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74     struct ArSwit
28120 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20 20 20  ch *pOpt;.      
28130 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26        for(pOpt=&
28140 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74  aSwitch[0]; pOpt
28150 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a  <pEnd; pOpt++){.
28160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
28170 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53  ( z[i]==pOpt->cS
28180 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  hort ) break;.  
28190 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
281a0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 74          if( pOpt
281b0 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ==pEnd ){.      
281c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
281d0 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22  rErrorMsg(pAr, "
281e0 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74  unrecognized opt
281f0 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b  ion: %c", z[i]);
28200 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
28210 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
28220 4f 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20  Opt->bArg ){.   
28230 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
28240 3c 28 6e 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  <(n-1) ){.      
28250 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d            zArg =
28260 20 26 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20   &z[i+1];.      
28270 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e 3b            i = n;
28280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
28290 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
282a0 20 20 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d        if( iArg>=
282b0 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20  (nArg-1) ){.    
282c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
282d0 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28  turn arErrorMsg(
282e0 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71  pAr, "option req
282f0 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e  uires an argumen
28300 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20  t: %c",z[i]);.  
28310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
28320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28330 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 2b 2b 69  zArg = azArg[++i
28340 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Arg];.          
28350 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28360 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
28370 69 66 28 20 61 72 50 72 6f 63 65 73 73 53 77 69  if( arProcessSwi
28380 74 63 68 28 70 41 72 2c 20 70 4f 70 74 2d 3e 65  tch(pAr, pOpt->e
28390 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20 29 20  Switch, zArg) ) 
283a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
283b0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ROR;.          }
283c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
283d0 66 28 20 7a 5b 32 5d 3d 3d 27 5c 30 27 20 29 7b  f( z[2]=='\0' ){
283e0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  .          /* A 
283f0 2d 2d 20 6f 70 74 69 6f 6e 2c 20 69 6e 64 69 63  -- option, indic
28400 61 74 69 6e 67 20 74 68 61 74 20 61 6c 6c 20 72  ating that all r
28410 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64  emaining command
28420 20 6c 69 6e 65 20 77 6f 72 64 73 0a 20 20 20 20   line words.    
28430 20 20 20 20 20 20 2a 2a 20 61 72 65 20 63 6f 6d        ** are com
28440 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 20  mand arguments. 
28450 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 41   */.          pA
28460 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41 72  r->azArg = &azAr
28470 67 5b 69 41 72 67 2b 31 5d 3b 0a 20 20 20 20 20  g[iArg+1];.     
28480 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d       pAr->nArg =
28490 20 6e 41 72 67 2d 69 41 72 67 2d 31 3b 0a 20 20   nArg-iArg-1;.  
284a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
284b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
284c0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c 6f 6e          /* A lon
284d0 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  g option */.    
284e0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
284f0 20 2a 7a 41 72 67 20 3d 20 30 3b 20 20 20 20 20   *zArg = 0;     
28500 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
28510 65 6e 74 20 66 6f 72 20 6f 70 74 69 6f 6e 2c 20  ent for option, 
28520 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20 20 20 20  if any */.      
28530 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77 69      struct ArSwi
28540 74 63 68 20 2a 70 4d 61 74 63 68 20 3d 20 30 3b  tch *pMatch = 0;
28550 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e        /* Matchin
28560 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  g option */.    
28570 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53        struct ArS
28580 77 69 74 63 68 20 2a 70 4f 70 74 3b 20 20 20 20  witch *pOpt;    
28590 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
285a0 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tor */.         
285b0 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74   for(pOpt=&aSwit
285c0 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64  ch[0]; pOpt<pEnd
285d0 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20  ; pOpt++){.     
285e0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
285f0 72 20 2a 7a 4c 6f 6e 67 20 3d 20 70 4f 70 74 2d  r *zLong = pOpt-
28600 3e 7a 4c 6f 6e 67 3b 0a 20 20 20 20 20 20 20 20  >zLong;.        
28610 20 20 20 20 69 66 28 20 28 6e 2d 32 29 3c 3d 73      if( (n-2)<=s
28620 74 72 6c 65 6e 33 30 28 7a 4c 6f 6e 67 29 20 26  trlen30(zLong) &
28630 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 26 7a 5b 32  & 0==memcmp(&z[2
28640 5d 2c 20 7a 4c 6f 6e 67 2c 20 6e 2d 32 29 20 29  ], zLong, n-2) )
28650 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
28660 69 66 28 20 70 4d 61 74 63 68 20 29 7b 0a 20 20  if( pMatch ){.  
28670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
28680 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28  turn arErrorMsg(
28690 70 41 72 2c 20 22 61 6d 62 69 67 75 6f 75 73 20  pAr, "ambiguous 
286a0 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 7a 29 3b 0a  option: %s",z);.
286b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
286c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
286d0 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 4f       pMatch = pO
286e0 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pt;.            
286f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
28700 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  }.          }.. 
28710 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 61           if( pMa
28720 74 63 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tch==0 ){.      
28730 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45        return arE
28740 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 75 6e  rrorMsg(pAr, "un
28750 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f  recognized optio
28760 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  n: %s", z);.    
28770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28780 20 20 69 66 28 20 70 4d 61 74 63 68 2d 3e 62 41    if( pMatch->bA
28790 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rg ){.          
287a0 20 20 69 66 28 20 69 41 72 67 3e 3d 28 6e 41 72    if( iArg>=(nAr
287b0 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  g-1) ){.        
287c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45        return arE
287d0 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 6f 70  rrorMsg(pAr, "op
287e0 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e  tion requires an
287f0 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 22 2c 20   argument: %s", 
28800 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
28810 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 41  }.            zA
28820 72 67 20 3d 20 61 7a 41 72 67 5b 2b 2b 69 41 72  rg = azArg[++iAr
28830 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g];.          }.
28840 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 72            if( ar
28850 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70 41  ProcessSwitch(pA
28860 72 2c 20 70 4d 61 74 63 68 2d 3e 65 53 77 69 74  r, pMatch->eSwit
28870 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75  ch, zArg) ) retu
28880 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
28890 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
288a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
288b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
288c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
288d0 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
288e0 20 74 68 61 74 20 61 6c 6c 20 61 72 67 75 6d 65   that all argume
288f0 6e 74 73 20 77 69 74 68 69 6e 20 74 68 65 20 41  nts within the A
28900 72 43 6f 6d 6d 61 6e 64 2e 61 7a 41 72 67 5b 5d  rCommand.azArg[]
28910 0a 2a 2a 20 61 72 72 61 79 20 72 65 66 65 72 20  .** array refer 
28920 74 6f 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65  to archive membe
28930 72 73 2c 20 61 73 20 66 6f 72 20 74 68 65 20 2d  rs, as for the -
28940 2d 65 78 74 72 61 63 74 20 6f 72 20 2d 2d 6c 69  -extract or --li
28950 73 74 20 63 6f 6d 6d 61 6e 64 73 2e 20 0a 2a 2a  st commands. .**
28960 20 49 74 20 63 68 65 63 6b 73 20 74 68 61 74 20   It checks that 
28970 65 61 63 68 20 6f 66 20 74 68 65 6d 20 61 72 65  each of them are
28980 20 70 72 65 73 65 6e 74 2e 20 49 66 20 61 6e 79   present. If any
28990 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
289a0 69 73 20 6e 6f 74 0a 2a 2a 20 70 72 65 73 65 6e  is not.** presen
289b0 74 20 69 6e 20 74 68 65 20 61 72 63 68 69 76 65  t in the archive
289c0 2c 20 61 6e 20 65 72 72 6f 72 20 69 73 20 70 72  , an error is pr
289d0 69 6e 74 65 64 20 74 6f 20 73 74 64 65 72 72 20  inted to stderr 
289e0 61 6e 64 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20  and an error.** 
289f0 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 4f  code returned. O
28a00 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c  therwise, if all
28a10 20 73 70 65 63 69 66 69 65 64 20 61 72 67 75 6d   specified argum
28a20 65 6e 74 73 20 61 72 65 20 70 72 65 73 65 6e 74  ents are present
28a30 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72 63 68 69   in.** the archi
28a40 76 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ve, SQLITE_OK is
28a50 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
28a60 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
28a70 74 72 69 70 73 20 61 6e 79 20 74 72 61 69 6c 69  trips any traili
28a80 6e 67 20 27 2f 27 20 63 68 61 72 61 63 74 65 72  ng '/' character
28a90 73 20 66 72 6f 6d 20 65 61 63 68 20 61 72 67 75  s from each argu
28aa0 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 69 73  ment..** This is
28ab0 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
28ac0 20 74 68 65 20 77 61 79 20 74 68 65 20 5b 74 61   the way the [ta
28ad0 72 5d 20 63 6f 6d 6d 61 6e 64 20 73 65 65 6d 73  r] command seems
28ae0 20 74 6f 20 77 6f 72 6b 20 6f 6e 0a 2a 2a 20 4c   to work on.** L
28af0 69 6e 75 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inux..*/.static 
28b00 69 6e 74 20 61 72 43 68 65 63 6b 45 6e 74 72 69  int arCheckEntri
28b10 65 73 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  es(ArCommand *pA
28b20 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
28b30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
28b40 70 41 72 2d 3e 6e 41 72 67 20 29 7b 0a 20 20 20  pAr->nArg ){.   
28b50 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 73   int i, j;.    s
28b60 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54 65  qlite3_stmt *pTe
28b70 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 73 68 65  st = 0;..    she
28b80 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28  llPreparePrintf(
28b90 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70  pAr->db, &rc, &p
28ba0 54 65 73 74 2c 0a 20 20 20 20 20 20 20 20 22 53  Test,.        "S
28bb0 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
28bc0 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 24 6e  %s WHERE name=$n
28bd0 61 6d 65 22 2c 20 0a 20 20 20 20 20 20 20 20 70  ame", .        p
28be0 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 0a 20 20  Ar->zSrcTable.  
28bf0 20 20 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c    );.    j = sql
28c00 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
28c10 74 65 72 5f 69 6e 64 65 78 28 70 54 65 73 74 2c  ter_index(pTest,
28c20 20 22 24 6e 61 6d 65 22 29 3b 0a 20 20 20 20 66   "$name");.    f
28c30 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e  or(i=0; i<pAr->n
28c40 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Arg && rc==SQLIT
28c50 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
28c60 20 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d    char *z = pAr-
28c70 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20  >azArg[i];.     
28c80 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33   int n = strlen3
28c90 30 28 7a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  0(z);.      int 
28ca0 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  bOk = 0;.      w
28cb0 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e  hile( n>0 && z[n
28cc0 2d 31 5d 3d 3d 27 2f 27 20 29 20 6e 2d 2d 3b 0a  -1]=='/' ) n--;.
28cd0 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 27 5c 30        z[n] = '\0
28ce0 27 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ';.      sqlite3
28cf0 5f 62 69 6e 64 5f 74 65 78 74 28 70 54 65 73 74  _bind_text(pTest
28d00 2c 20 6a 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49  , j, z, -1, SQLI
28d10 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
28d20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
28d30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
28d40 54 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Test) ){.       
28d50 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20   bOk = 1;.      
28d60 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73  }.      shellRes
28d70 65 74 28 26 72 63 2c 20 70 54 65 73 74 29 3b 0a  et(&rc, pTest);.
28d80 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28d90 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d 3d  LITE_OK && bOk==
28da0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
28db0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
28dc0 20 22 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 61   "not found in a
28dd0 72 63 68 69 76 65 3a 20 25 73 5c 6e 22 2c 20 7a  rchive: %s\n", z
28de0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
28df0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
28e00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
28e10 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
28e20 63 2c 20 70 54 65 73 74 29 3b 0a 20 20 7d 0a 20  c, pTest);.  }. 
28e30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28e40 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 61 20 57 48  *.** Format a WH
28e50 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
28e60 63 61 6e 20 62 65 20 75 73 65 64 20 61 67 61 69  can be used agai
28e70 6e 73 74 20 74 68 65 20 22 73 71 6c 61 72 22 20  nst the "sqlar" 
28e80 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 69 64 65 6e  table to.** iden
28e90 74 69 66 79 20 61 6c 6c 20 61 72 63 68 69 76 65  tify all archive
28ea0 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 6d 61   members that ma
28eb0 74 63 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  tch the command 
28ec0 61 72 67 75 6d 65 6e 74 73 20 68 65 6c 64 0a 2a  arguments held.*
28ed0 2a 20 69 6e 20 28 2a 70 41 72 29 2e 20 4c 65 61  * in (*pAr). Lea
28ee0 76 65 20 74 68 69 73 20 57 48 45 52 45 20 63 6c  ve this WHERE cl
28ef0 61 75 73 65 20 69 6e 20 28 2a 70 7a 57 68 65 72  ause in (*pzWher
28f00 65 29 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  e) before return
28f10 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ing..** The call
28f20 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
28f30 65 20 66 6f 72 20 65 76 65 6e 74 75 61 6c 6c 79  e for eventually
28f40 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
28f50 5f 66 72 65 65 28 29 20 6f 6e 0a 2a 2a 20 61 6e  _free() on.** an
28f60 79 20 6e 6f 6e 2d 4e 55 4c 4c 20 28 2a 70 7a 57  y non-NULL (*pzW
28f70 68 65 72 65 29 20 76 61 6c 75 65 2e 0a 2a 2f 0a  here) value..*/.
28f80 73 74 61 74 69 63 20 76 6f 69 64 20 61 72 57 68  static void arWh
28f90 65 72 65 43 6c 61 75 73 65 28 0a 20 20 69 6e 74  ereClause(.  int
28fa0 20 2a 70 52 63 2c 20 0a 20 20 41 72 43 6f 6d 6d   *pRc, .  ArComm
28fb0 61 6e 64 20 2a 70 41 72 2c 20 0a 20 20 63 68 61  and *pAr, .  cha
28fc0 72 20 2a 2a 70 7a 57 68 65 72 65 20 20 20 20 20  r **pzWhere     
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28fe0 4f 55 54 3a 20 4e 65 77 20 57 48 45 52 45 20 63  OUT: New WHERE c
28ff0 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 68  lause */.){.  ch
29000 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a  ar *zWhere = 0;.
29010 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
29020 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
29030 20 70 41 72 2d 3e 6e 41 72 67 3d 3d 30 20 29 7b   pAr->nArg==0 ){
29040 0a 20 20 20 20 20 20 7a 57 68 65 72 65 20 3d 20  .      zWhere = 
29050 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
29060 22 31 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  "1");.    }else{
29070 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
29080 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
29090 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 20  zSep = "";.     
290a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d   for(i=0; i<pAr-
290b0 3e 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nArg; i++){.   
290c0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
290d0 2a 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b  *z = pAr->azArg[
290e0 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a 57 68 65  i];.        zWhe
290f0 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  re = sqlite3_mpr
29100 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
29110 22 25 7a 25 73 20 6e 61 6d 65 20 3d 20 27 25 71  "%z%s name = '%q
29120 27 20 4f 52 20 73 75 62 73 74 72 28 6e 61 6d 65  ' OR substr(name
29130 2c 31 2c 25 64 29 20 3d 20 27 25 71 2f 27 22 2c  ,1,%d) = '%q/'",
29140 20 0a 20 20 20 20 20 20 20 20 20 20 7a 57 68 65   .          zWhe
29150 72 65 2c 20 7a 53 65 70 2c 20 7a 2c 20 73 74 72  re, zSep, z, str
29160 6c 65 6e 33 30 28 7a 29 2b 31 2c 20 7a 0a 20 20  len30(z)+1, z.  
29170 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
29180 20 69 66 28 20 7a 57 68 65 72 65 3d 3d 30 20 29   if( zWhere==0 )
29190 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 63  {.          *pRc
291a0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
291b0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
291c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
291d0 20 20 20 20 7a 53 65 70 20 3d 20 22 20 4f 52 20      zSep = " OR 
291e0 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ";.      }.    }
291f0 0a 20 20 7d 0a 20 20 2a 70 7a 57 68 65 72 65 20  .  }.  *pzWhere 
29200 3d 20 7a 57 68 65 72 65 3b 0a 7d 0a 0a 2f 2a 0a  = zWhere;.}../*.
29210 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
29220 6e 20 6f 66 20 2e 61 72 20 22 6c 69 73 54 22 20  n of .ar "lisT" 
29230 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61  command. .*/.sta
29240 74 69 63 20 69 6e 74 20 61 72 4c 69 73 74 43 6f  tic int arListCo
29250 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e 64 20  mmand(ArCommand 
29260 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63  *pAr){.  const c
29270 68 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c  har *zSql = "SEL
29280 45 43 54 20 25 73 20 46 52 4f 4d 20 25 73 20 57  ECT %s FROM %s W
29290 48 45 52 45 20 25 73 22 3b 20 0a 20 20 63 6f 6e  HERE %s"; .  con
292a0 73 74 20 63 68 61 72 20 2a 61 7a 43 6f 6c 73 5b  st char *azCols[
292b0 5d 20 3d 20 7b 0a 20 20 20 20 22 6e 61 6d 65 22  ] = {.    "name"
292c0 2c 0a 20 20 20 20 22 6c 73 6d 6f 64 65 28 6d 6f  ,.    "lsmode(mo
292d0 64 65 29 2c 20 73 7a 2c 20 64 61 74 65 74 69 6d  de), sz, datetim
292e0 65 28 6d 74 69 6d 65 2c 20 27 75 6e 69 78 65 70  e(mtime, 'unixep
292f0 6f 63 68 27 29 2c 20 6e 61 6d 65 22 0a 20 20 7d  och'), name".  }
29300 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72  ;..  char *zWher
29310 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
29320 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b  _stmt *pSql = 0;
29330 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
29340 20 3d 20 61 72 43 68 65 63 6b 45 6e 74 72 69 65   = arCheckEntrie
29350 73 28 70 41 72 29 3b 0a 20 20 61 72 57 68 65 72  s(pAr);.  arWher
29360 65 43 6c 61 75 73 65 28 26 72 63 2c 20 70 41 72  eClause(&rc, pAr
29370 2c 20 26 7a 57 68 65 72 65 29 3b 0a 0a 20 20 73  , &zWhere);..  s
29380 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74  hellPreparePrint
29390 66 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20  f(pAr->db, &rc, 
293a0 26 70 53 71 6c 2c 20 7a 53 71 6c 2c 20 61 7a 43  &pSql, zSql, azC
293b0 6f 6c 73 5b 70 41 72 2d 3e 62 56 65 72 62 6f 73  ols[pAr->bVerbos
293c0 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e],.            
293d0 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 7a 53           pAr->zS
293e0 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72 65 29  rcTable, zWhere)
293f0 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 62 44 72  ;.  if( pAr->bDr
29400 79 52 75 6e 20 29 7b 0a 20 20 20 20 75 74 66 38  yRun ){.    utf8
29410 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e  _printf(pAr->p->
29420 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  out, "%s\n", sql
29430 69 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b  ite3_sql(pSql));
29440 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
29450 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
29460 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
29470 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
29480 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66  Sql) ){.      if
29490 28 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20  ( pAr->bVerbose 
294a0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
294b0 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f  printf(pAr->p->o
294c0 75 74 2c 20 22 25 73 20 25 20 31 30 64 20 20 25  ut, "%s % 10d  %
294d0 73 20 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  s  %s\n",.      
294e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
294f0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
29500 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
29510 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
29520 6e 74 28 70 53 71 6c 2c 20 31 29 2c 20 0a 20 20  nt(pSql, 1), .  
29530 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29540 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
29550 71 6c 2c 20 32 29 2c 0a 20 20 20 20 20 20 20 20  ql, 2),.        
29560 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
29570 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29  mn_text(pSql, 3)
29580 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
29590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
295a0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
295b0 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  ->p->out, "%s\n"
295c0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
295d0 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29 3b  _text(pSql, 0));
295e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
295f0 20 7d 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69   }.  shellFinali
29600 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20  ze(&rc, pSql);. 
29610 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
29620 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  here);.  return 
29630 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d  rc;.}.../*.** Im
29640 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
29650 2e 61 72 20 22 65 58 74 72 61 63 74 22 20 63 6f  .ar "eXtract" co
29660 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69  mmand. .*/.stati
29670 63 20 69 6e 74 20 61 72 45 78 74 72 61 63 74 43  c int arExtractC
29680 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e 64  ommand(ArCommand
29690 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20   *pAr){.  const 
296a0 63 68 61 72 20 2a 7a 53 71 6c 31 20 3d 20 0a 20  char *zSql1 = . 
296b0 20 20 20 22 53 45 4c 45 43 54 20 22 0a 20 20 20     "SELECT ".   
296c0 20 22 20 28 24 64 69 72 20 7c 7c 20 6e 61 6d 65   " ($dir || name
296d0 29 2c 22 0a 20 20 20 20 22 20 77 72 69 74 65 66  ),".    " writef
296e0 69 6c 65 28 28 24 64 69 72 20 7c 7c 20 6e 61 6d  ile(($dir || nam
296f0 65 29 2c 20 25 73 2c 20 6d 6f 64 65 2c 20 6d 74  e), %s, mode, mt
29700 69 6d 65 29 20 22 0a 20 20 20 20 22 46 52 4f 4d  ime) ".    "FROM
29710 20 25 73 20 57 48 45 52 45 20 28 25 73 29 20 41   %s WHERE (%s) A
29720 4e 44 20 28 64 61 74 61 20 49 53 20 4e 55 4c 4c  ND (data IS NULL
29730 20 4f 52 20 24 64 69 72 4f 6e 6c 79 20 3d 20 30   OR $dirOnly = 0
29740 29 22 0a 20 20 20 20 22 20 41 4e 44 20 6e 61 6d  )".    " AND nam
29750 65 20 4e 4f 54 20 47 4c 4f 42 20 27 2a 2e 2e 5b  e NOT GLOB '*..[
29760 2f 5c 5c 5d 2a 27 22 3b 0a 0a 20 20 63 6f 6e 73  /\\]*'";..  cons
29770 74 20 63 68 61 72 20 2a 61 7a 45 78 74 72 61 41  t char *azExtraA
29780 72 67 5b 5d 20 3d 20 7b 20 0a 20 20 20 20 22 73  rg[] = { .    "s
29790 71 6c 61 72 5f 75 6e 63 6f 6d 70 72 65 73 73 28  qlar_uncompress(
297a0 64 61 74 61 2c 20 73 7a 29 22 2c 0a 20 20 20 20  data, sz)",.    
297b0 22 64 61 74 61 22 0a 20 20 7d 3b 0a 0a 20 20 73  "data".  };..  s
297c0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71  qlite3_stmt *pSq
297d0 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  l = 0;.  int rc 
297e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
297f0 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 20  har *zDir = 0;. 
29800 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
29810 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a  0;.  int i, j;..
29820 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74    /* If argument
29830 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64 2c  s are specified,
29840 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 79   check that they
29850 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74 20   actually exist 
29860 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20  within.  ** the 
29870 61 72 63 68 69 76 65 20 62 65 66 6f 72 65 20 70  archive before p
29880 72 6f 63 65 65 64 69 6e 67 2e 20 41 6e 64 20 66  roceeding. And f
29890 6f 72 6d 75 6c 61 74 65 20 61 20 57 48 45 52 45  ormulate a WHERE
298a0 20 63 6c 61 75 73 65 20 74 6f 0a 20 20 2a 2a 20   clause to.  ** 
298b0 6d 61 74 63 68 20 74 68 65 6d 2e 20 20 2a 2f 0a  match them.  */.
298c0 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b 45 6e    rc = arCheckEn
298d0 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20 61 72  tries(pAr);.  ar
298e0 57 68 65 72 65 43 6c 61 75 73 65 28 26 72 63 2c  WhereClause(&rc,
298f0 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29 3b 0a   pAr, &zWhere);.
29900 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
29910 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
29920 70 41 72 2d 3e 7a 44 69 72 20 29 7b 0a 20 20 20  pAr->zDir ){.   
29930 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74 65     zDir = sqlite
29940 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f 22 2c  3_mprintf("%s/",
29950 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20 20 20   pAr->zDir);.   
29960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 44   }else{.      zD
29970 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ir = sqlite3_mpr
29980 69 6e 74 66 28 22 22 29 3b 0a 20 20 20 20 7d 0a  intf("");.    }.
29990 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20      if( zDir==0 
299a0 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ) rc = SQLITE_NO
299b0 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 73 68 65 6c  MEM;.  }..  shel
299c0 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 70  lPreparePrintf(p
299d0 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 53  Ar->db, &rc, &pS
299e0 71 6c 2c 20 7a 53 71 6c 31 2c 20 0a 20 20 20 20  ql, zSql1, .    
299f0 20 20 61 7a 45 78 74 72 61 41 72 67 5b 70 41 72    azExtraArg[pAr
29a00 2d 3e 62 5a 69 70 5d 2c 20 70 41 72 2d 3e 7a 53  ->bZip], pAr->zS
29a10 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72 65 0a  rcTable, zWhere.
29a20 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d    );..  if( rc==
29a30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29a40 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e   j = sqlite3_bin
29a50 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
29a60 78 28 70 53 71 6c 2c 20 22 24 64 69 72 22 29 3b  x(pSql, "$dir");
29a70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
29a80 64 5f 74 65 78 74 28 70 53 71 6c 2c 20 6a 2c 20  d_text(pSql, j, 
29a90 7a 44 69 72 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zDir, -1, SQLITE
29aa0 5f 53 54 41 54 49 43 29 3b 0a 0a 20 20 20 20 2f  _STATIC);..    /
29ab0 2a 20 52 75 6e 20 74 68 65 20 53 45 4c 45 43 54  * Run the SELECT
29ac0 20 73 74 61 74 65 6d 65 6e 74 20 74 77 69 63 65   statement twice
29ad0 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  . The first time
29ae0 2c 20 77 72 69 74 65 66 69 6c 65 28 29 20 69 73  , writefile() is
29af0 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a 20 66   called.    ** f
29b00 6f 72 20 61 6c 6c 20 61 72 63 68 69 76 65 20 6d  or all archive m
29b10 65 6d 62 65 72 73 20 74 68 61 74 20 73 68 6f 75  embers that shou
29b20 6c 64 20 62 65 20 65 78 74 72 61 63 74 65 64 2e  ld be extracted.
29b30 20 54 68 65 20 73 65 63 6f 6e 64 20 74 69 6d 65   The second time
29b40 2c 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 66 6f  ,.    ** only fo
29b50 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 69 65  r the directorie
29b60 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  s. This is becau
29b70 73 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70  se the timestamp
29b80 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 78 74  s for.    ** ext
29b90 72 61 63 74 65 64 20 64 69 72 65 63 74 6f 72 69  racted directori
29ba0 65 73 20 6d 75 73 74 20 62 65 20 72 65 73 65 74  es must be reset
29bb0 20 61 66 74 65 72 20 74 68 65 79 20 61 72 65 20   after they are 
29bc0 70 6f 70 75 6c 61 74 65 64 20 28 61 73 0a 20 20  populated (as.  
29bd0 20 20 2a 2a 20 70 6f 70 75 6c 61 74 69 6e 67 20    ** populating 
29be0 74 68 65 6d 20 63 68 61 6e 67 65 73 20 74 68 65  them changes the
29bf0 20 74 69 6d 65 73 74 61 6d 70 29 2e 20 20 2a 2f   timestamp).  */
29c00 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
29c10 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6a  2; i++){.      j
29c20 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
29c30 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28  parameter_index(
29c40 70 53 71 6c 2c 20 22 24 64 69 72 4f 6e 6c 79 22  pSql, "$dirOnly"
29c50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
29c60 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c 2c 20  _bind_int(pSql, 
29c70 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  j, i);.      if(
29c80 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b   pAr->bDryRun ){
29c90 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
29ca0 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74  intf(pAr->p->out
29cb0 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
29cc0 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b 0a 20 20  3_sql(pSql));.  
29cd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29ce0 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
29cf0 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
29d00 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
29d10 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20 20  tep(pSql) ){.   
29d20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20         if( i==0 
29d30 26 26 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65  && pAr->bVerbose
29d40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29d50 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d  utf8_printf(pAr-
29d60 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  >p->out, "%s\n",
29d70 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
29d80 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29 3b 0a  text(pSql, 0));.
29d90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29da0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
29db0 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28 26      shellReset(&
29dc0 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20 20 20 7d  rc, pSql);.    }
29dd0 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  .    shellFinali
29de0 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20  ze(&rc, pSql);. 
29df0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
29e00 65 65 28 7a 44 69 72 29 3b 0a 20 20 73 71 6c 69  ee(zDir);.  sqli
29e10 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29  te3_free(zWhere)
29e20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
29e30 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20  ../*.** Run the 
29e40 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  SQL statement in
29e50 20 7a 53 71 6c 2e 20 20 4f 72 20 69 66 20 64 6f   zSql.  Or if do
29e60 69 6e 67 20 61 20 2d 2d 64 72 79 72 75 6e 2c 20  ing a --dryrun, 
29e70 6d 65 72 65 6c 79 20 70 72 69 6e 74 20 69 74 20  merely print it 
29e80 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  out..*/.static i
29e90 6e 74 20 61 72 45 78 65 63 53 71 6c 28 41 72 43  nt arExecSql(ArC
29ea0 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63 6f 6e  ommand *pAr, con
29eb0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a  st char *zSql){.
29ec0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
29ed0 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b 0a  pAr->bDryRun ){.
29ee0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
29ef0 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73  pAr->p->out, "%s
29f00 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  \n", zSql);.    
29f10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
29f20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
29f30 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20  r *zErr = 0;.   
29f40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
29f50 65 63 28 70 41 72 2d 3e 64 62 2c 20 7a 53 71 6c  ec(pAr->db, zSql
29f60 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a  , 0, 0, &zErr);.
29f70 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a      if( zErr ){.
29f80 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
29f90 66 28 73 74 64 6f 75 74 2c 20 22 45 52 52 4f 52  f(stdout, "ERROR
29fa0 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a  : %s\n", zErr);.
29fb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
29fc0 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 7d 0a  ee(zErr);.    }.
29fd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
29fe0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  .}.../*.** Imple
29ff0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72  mentation of .ar
2a000 20 22 63 72 65 61 74 65 22 20 61 6e 64 20 22 75   "create" and "u
2a010 70 64 61 74 65 22 20 63 6f 6d 6d 61 6e 64 73 2e  pdate" commands.
2a020 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  .**.** Create th
2a030 65 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65 20  e "sqlar" table 
2a040 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2a050 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
2a060 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a 2a 2a  lready exist..**
2a070 20 54 68 65 6e 20 61 64 64 20 65 61 63 68 20 66   Then add each f
2a080 69 6c 65 20 69 6e 20 74 68 65 20 61 7a 46 69 6c  ile in the azFil
2a090 65 5b 5d 20 61 72 72 61 79 20 74 6f 20 74 68 65  e[] array to the
2a0a0 20 61 72 63 68 69 76 65 2e 20 44 69 72 65 63 74   archive. Direct
2a0b0 6f 72 69 65 73 0a 2a 2a 20 61 72 65 20 61 64 64  ories.** are add
2a0c0 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20  ed recursively. 
2a0d0 49 66 20 61 72 67 75 6d 65 6e 74 20 62 56 65 72  If argument bVer
2a0e0 62 6f 73 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  bose is non-zero
2a0f0 2c 20 61 20 6d 65 73 73 61 67 65 20 69 73 0a 2a  , a message is.*
2a100 2a 20 70 72 69 6e 74 65 64 20 6f 6e 20 73 74 64  * printed on std
2a110 6f 75 74 20 66 6f 72 20 65 61 63 68 20 66 69 6c  out for each fil
2a120 65 20 61 72 63 68 69 76 65 64 2e 0a 2a 2a 0a 2a  e archived..**.*
2a130 2a 20 54 68 65 20 63 72 65 61 74 65 20 63 6f 6d  * The create com
2a140 6d 61 6e 64 20 69 73 20 74 68 65 20 73 61 6d 65  mand is the same
2a150 20 61 73 20 75 70 64 61 74 65 2c 20 65 78 63 65   as update, exce
2a160 70 74 20 74 68 61 74 20 69 74 20 64 72 6f 70 73  pt that it drops
2a170 0a 2a 2a 20 61 6e 79 20 65 78 69 73 74 69 6e 67  .** any existing
2a180 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65 20 62   "sqlar" table b
2a190 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 2e  efore beginning.
2a1a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2a1b0 72 43 72 65 61 74 65 4f 72 55 70 64 61 74 65 43  rCreateOrUpdateC
2a1c0 6f 6d 6d 61 6e 64 28 0a 20 20 41 72 43 6f 6d 6d  ommand(.  ArComm
2a1d0 61 6e 64 20 2a 70 41 72 2c 20 20 20 20 20 20 20  and *pAr,       
2a1e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
2a1f0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 61  mand arguments a
2a200 6e 64 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  nd options */.  
2a210 69 6e 74 20 62 55 70 64 61 74 65 20 20 20 20 20  int bUpdate     
2a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a230 2f 2a 20 74 72 75 65 20 66 6f 72 20 61 20 2d 2d  /* true for a --
2a240 63 72 65 61 74 65 2e 20 20 66 61 6c 73 65 20 66  create.  false f
2a250 6f 72 20 2d 2d 75 70 64 61 74 65 20 2a 2f 0a 29  or --update */.)
2a260 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2a270 7a 43 72 65 61 74 65 20 3d 20 0a 20 20 20 20 20  zCreate = .     
2a280 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
2a290 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 71 6c  F NOT EXISTS sql
2a2a0 61 72 28 5c 6e 22 0a 20 20 20 20 20 20 22 20 20  ar(\n".      "  
2a2b0 6e 61 6d 65 20 54 45 58 54 20 50 52 49 4d 41 52  name TEXT PRIMAR
2a2c0 59 20 4b 45 59 2c 20 20 2d 2d 20 6e 61 6d 65 20  Y KEY,  -- name 
2a2d0 6f 66 20 74 68 65 20 66 69 6c 65 5c 6e 22 0a 20  of the file\n". 
2a2e0 20 20 20 20 20 22 20 20 6d 6f 64 65 20 49 4e 54       "  mode INT
2a2f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a300 2d 2d 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  -- access permis
2a310 73 69 6f 6e 73 5c 6e 22 0a 20 20 20 20 20 20 22  sions\n".      "
2a320 20 20 6d 74 69 6d 65 20 49 4e 54 2c 20 20 20 20    mtime INT,    
2a330 20 20 20 20 20 20 20 20 20 20 2d 2d 20 6c 61 73            -- las
2a340 74 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 74  t modification t
2a350 69 6d 65 5c 6e 22 0a 20 20 20 20 20 20 22 20 20  ime\n".      "  
2a360 73 7a 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20  sz INT,         
2a370 20 20 20 20 20 20 20 20 2d 2d 20 6f 72 69 67 69          -- origi
2a380 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 5c 6e 22  nal file size\n"
2a390 0a 20 20 20 20 20 20 22 20 20 64 61 74 61 20 42  .      "  data B
2a3a0 4c 4f 42 20 20 20 20 20 20 20 20 20 20 20 20 20  LOB             
2a3b0 20 20 2d 2d 20 63 6f 6d 70 72 65 73 73 65 64 20    -- compressed 
2a3c0 63 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 20 20 20  content\n".     
2a3d0 20 22 29 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68   ")";.  const ch
2a3e0 61 72 20 2a 7a 44 72 6f 70 20 3d 20 22 44 52 4f  ar *zDrop = "DRO
2a3f0 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
2a400 53 20 73 71 6c 61 72 22 3b 0a 20 20 63 6f 6e 73  S sqlar";.  cons
2a410 74 20 63 68 61 72 20 2a 7a 49 6e 73 65 72 74 46  t char *zInsertF
2a420 6d 74 5b 32 5d 20 3d 20 7b 0a 20 20 20 20 20 22  mt[2] = {.     "
2a430 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 73 28  REPLACE INTO %s(
2a440 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c  name,mode,mtime,
2a450 73 7a 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20 20  sz,data)\n".    
2a460 20 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20   "  SELECT\n".  
2a470 20 20 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a 20     "    %s,\n". 
2a480 20 20 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c 6e      "    mode,\n
2a490 22 0a 20 20 20 20 20 22 20 20 20 20 6d 74 69 6d  ".     "    mtim
2a4a0 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  e,\n".     "    
2a4b0 43 41 53 45 20 73 75 62 73 74 72 28 6c 73 6d 6f  CASE substr(lsmo
2a4c0 64 65 28 6d 6f 64 65 29 2c 31 2c 31 29 5c 6e 22  de(mode),1,1)\n"
2a4d0 0a 20 20 20 20 20 22 20 20 20 20 20 20 57 48 45  .     "      WHE
2a4e0 4e 20 27 2d 27 20 54 48 45 4e 20 6c 65 6e 67 74  N '-' THEN lengt
2a4f0 68 28 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20  h(data)\n".     
2a500 22 20 20 20 20 20 20 57 48 45 4e 20 27 64 27 20  "      WHEN 'd' 
2a510 54 48 45 4e 20 30 5c 6e 22 0a 20 20 20 20 20 22  THEN 0\n".     "
2a520 20 20 20 20 20 20 45 4c 53 45 20 2d 31 20 45 4e        ELSE -1 EN
2a530 44 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  D,\n".     "    
2a540 73 71 6c 61 72 5f 63 6f 6d 70 72 65 73 73 28 64  sqlar_compress(d
2a550 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20  ata)\n".     "  
2a560 46 52 4f 4d 20 66 73 64 69 72 28 25 51 2c 25 51  FROM fsdir(%Q,%Q
2a570 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 57 48 45  )\n".     "  WHE
2a580 52 45 20 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 20  RE lsmode(mode) 
2a590 4e 4f 54 20 4c 49 4b 45 20 27 3f 25 25 27 3b 22  NOT LIKE '?%%';"
2a5a0 2c 0a 20 20 20 20 20 22 52 45 50 4c 41 43 45 20  ,.     "REPLACE 
2a5b0 49 4e 54 4f 20 25 73 28 6e 61 6d 65 2c 6d 6f 64  INTO %s(name,mod
2a5c0 65 2c 6d 74 69 6d 65 2c 64 61 74 61 29 5c 6e 22  e,mtime,data)\n"
2a5d0 0a 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 5c  .     "  SELECT\
2a5e0 6e 22 0a 20 20 20 20 20 22 20 20 20 20 25 73 2c  n".     "    %s,
2a5f0 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d 6f  \n".     "    mo
2a600 64 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  de,\n".     "   
2a610 20 6d 74 69 6d 65 2c 5c 6e 22 0a 20 20 20 20 20   mtime,\n".     
2a620 22 20 20 20 20 64 61 74 61 5c 6e 22 0a 20 20 20  "    data\n".   
2a630 20 20 22 20 20 46 52 4f 4d 20 66 73 64 69 72 28    "  FROM fsdir(
2a640 25 51 2c 25 51 29 5c 6e 22 0a 20 20 20 20 20 22  %Q,%Q)\n".     "
2a650 20 20 57 48 45 52 45 20 6c 73 6d 6f 64 65 28 6d    WHERE lsmode(m
2a660 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20 27 3f  ode) NOT LIKE '?
2a670 25 25 27 3b 22 0a 20 20 7d 3b 0a 20 20 69 6e 74  %%';".  };.  int
2a680 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
2a690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a6a0 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  For iterating th
2a6b0 72 6f 75 67 68 20 61 7a 46 69 6c 65 5b 5d 20 2a  rough azFile[] *
2a6c0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
2a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6e0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2a6f0 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
2a700 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20  ar *zTab = 0;   
2a710 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74          /* SQL t
2a720 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20  able into which 
2a730 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 63  to insert */.  c
2a740 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61  har *zSql;.  cha
2a750 72 20 7a 54 65 6d 70 5b 35 30 5d 3b 0a 0a 20 20  r zTemp[50];..  
2a760 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22  arExecSql(pAr, "
2a770 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
2a780 3d 35 31 32 22 29 3b 0a 20 20 72 63 20 3d 20 61  =512");.  rc = a
2a790 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22 53  rExecSql(pAr, "S
2a7a0 41 56 45 50 4f 49 4e 54 20 61 72 3b 22 29 3b 0a  AVEPOINT ar;");.
2a7b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a7c0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
2a7d0 0a 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b  .  zTemp[0] = 0;
2a7e0 20 0a 20 20 69 66 28 20 70 41 72 2d 3e 62 5a 69   .  if( pAr->bZi
2a7f0 70 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  p ){.    /* Init
2a800 69 61 6c 69 7a 65 20 74 68 65 20 7a 69 70 66 69  ialize the zipfi
2a810 6c 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  le virtual table
2a820 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  , if necessary *
2a830 2f 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 7a  /.    if( pAr->z
2a840 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71  File ){.      sq
2a850 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72 3b 0a  lite3_uint64 r;.
2a860 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61        sqlite3_ra
2a870 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
2a880 72 29 2c 26 72 29 3b 0a 20 20 20 20 20 20 73 71  r),&r);.      sq
2a890 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2a8a0 69 7a 65 6f 66 28 7a 54 65 6d 70 29 2c 7a 54 65  izeof(zTemp),zTe
2a8b0 6d 70 2c 22 7a 69 70 25 30 31 36 6c 6c 78 22 2c  mp,"zip%016llx",
2a8c0 72 29 3b 0a 20 20 20 20 20 20 7a 54 61 62 20 3d  r);.      zTab =
2a8d0 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 7a 53   zTemp;.      zS
2a8e0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
2a8f0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 22  intf(.         "
2a900 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
2a910 41 42 4c 45 20 74 65 6d 70 2e 25 73 20 55 53 49  ABLE temp.%s USI
2a920 4e 47 20 7a 69 70 66 69 6c 65 28 25 51 29 22 2c  NG zipfile(%Q)",
2a930 0a 20 20 20 20 20 20 20 20 20 7a 54 61 62 2c 20  .         zTab, 
2a940 70 41 72 2d 3e 7a 46 69 6c 65 0a 20 20 20 20 20  pAr->zFile.     
2a950 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   );.      rc = a
2a960 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53  rExecSql(pAr, zS
2a970 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ql);.      sqlit
2a980 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
2a990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a9a0 7a 54 61 62 20 3d 20 22 7a 69 70 22 3b 0a 20 20  zTab = "zip";.  
2a9b0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2a9c0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
2a9d0 68 65 20 74 61 62 6c 65 20 66 6f 72 20 61 6e 20  he table for an 
2a9e0 53 51 4c 41 52 20 2a 2f 0a 20 20 20 20 7a 54 61  SQLAR */.    zTa
2a9f0 62 20 3d 20 22 73 71 6c 61 72 22 3b 0a 20 20 20  b = "sqlar";.   
2aa00 20 69 66 28 20 62 55 70 64 61 74 65 3d 3d 30 20   if( bUpdate==0 
2aa10 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 72  ){.      rc = ar
2aa20 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 44 72  ExecSql(pAr, zDr
2aa30 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  op);.      if( r
2aa40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2aa50 6f 74 6f 20 65 6e 64 5f 61 72 5f 74 72 61 6e 73  oto end_ar_trans
2aa60 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20  action;.    }.  
2aa70 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c    rc = arExecSql
2aa80 28 70 41 72 2c 20 7a 43 72 65 61 74 65 29 3b 0a  (pAr, zCreate);.
2aa90 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
2aaa0 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63  <pAr->nArg && rc
2aab0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
2aac0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  ){.    char *zSq
2aad0 6c 32 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  l2 = sqlite3_mpr
2aae0 69 6e 74 66 28 7a 49 6e 73 65 72 74 46 6d 74 5b  intf(zInsertFmt[
2aaf0 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 7a 54 61 62  pAr->bZip], zTab
2ab00 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e 62  ,.        pAr->b
2ab10 56 65 72 62 6f 73 65 20 3f 20 22 73 68 65 6c 6c  Verbose ? "shell
2ab20 5f 70 75 74 73 6e 6c 28 6e 61 6d 65 29 22 20 3a  _putsnl(name)" :
2ab30 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20 20   "name",.       
2ab40 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 2c 20   pAr->azArg[i], 
2ab50 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20 20 20 20  pAr->zDir);.    
2ab60 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70  rc = arExecSql(p
2ab70 41 72 2c 20 7a 53 71 6c 32 29 3b 0a 20 20 20 20  Ar, zSql2);.    
2ab80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
2ab90 6c 32 29 3b 0a 20 20 7d 0a 65 6e 64 5f 61 72 5f  l2);.  }.end_ar_
2aba0 74 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20 20 69  transaction:.  i
2abb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2abc0 20 29 7b 0a 20 20 20 20 61 72 45 78 65 63 53 71   ){.    arExecSq
2abd0 6c 28 70 41 72 2c 20 22 52 4f 4c 4c 42 41 43 4b  l(pAr, "ROLLBACK
2abe0 20 54 4f 20 61 72 3b 20 52 45 4c 45 41 53 45 20   TO ar; RELEASE 
2abf0 61 72 3b 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ar;");.  }else{.
2ac00 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53      rc = arExecS
2ac10 71 6c 28 70 41 72 2c 20 22 52 45 4c 45 41 53 45  ql(pAr, "RELEASE
2ac20 20 61 72 3b 22 29 3b 0a 20 20 20 20 69 66 28 20   ar;");.    if( 
2ac30 70 41 72 2d 3e 62 5a 69 70 20 26 26 20 70 41 72  pAr->bZip && pAr
2ac40 2d 3e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  ->zFile ){.     
2ac50 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
2ac60 6d 70 72 69 6e 74 66 28 22 44 52 4f 50 20 54 41  mprintf("DROP TA
2ac70 42 4c 45 20 25 73 22 2c 20 7a 54 65 6d 70 29 3b  BLE %s", zTemp);
2ac80 0a 20 20 20 20 20 20 61 72 45 78 65 63 53 71 6c  .      arExecSql
2ac90 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  (pAr, zSql);.   
2aca0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2acb0 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zSql);.    }.  }
2acc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2acd0 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2ace0 61 74 69 6f 6e 20 6f 66 20 22 2e 61 72 22 20 64  ation of ".ar" d
2acf0 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  ot command..*/.s
2ad00 74 61 74 69 63 20 69 6e 74 20 61 72 44 6f 74 43  tatic int arDotC
2ad10 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53  ommand(.  ShellS
2ad20 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20  tate *pState,   
2ad30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
2ad40 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20  rent shell tool 
2ad50 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 66  state */.  int f
2ad60 72 6f 6d 43 6d 64 4c 69 6e 65 2c 20 20 20 20 20  romCmdLine,     
2ad70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2ad80 75 65 20 69 66 20 2d 41 20 63 6f 6d 6d 61 6e 64  ue if -A command
2ad90 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2c 20 6e 6f  -line option, no
2ada0 74 20 2e 61 72 20 63 6d 64 20 2a 2f 0a 20 20 63  t .ar cmd */.  c
2adb0 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
2adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2add0 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
2ade0 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
2adf0 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
2ae00 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20  int nArg        
2ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
2ae30 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
2ae40 2a 2f 0a 29 7b 0a 20 20 41 72 43 6f 6d 6d 61 6e  */.){.  ArComman
2ae50 64 20 63 6d 64 3b 0a 20 20 69 6e 74 20 72 63 3b  d cmd;.  int rc;
2ae60 0a 20 20 6d 65 6d 73 65 74 28 26 63 6d 64 2c 20  .  memset(&cmd, 
2ae70 30 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 29 3b  0, sizeof(cmd));
2ae80 0a 20 20 63 6d 64 2e 66 72 6f 6d 43 6d 64 4c 69  .  cmd.fromCmdLi
2ae90 6e 65 20 3d 20 66 72 6f 6d 43 6d 64 4c 69 6e 65  ne = fromCmdLine
2aea0 3b 0a 20 20 72 63 20 3d 20 61 72 50 61 72 73 65  ;.  rc = arParse
2aeb0 43 6f 6d 6d 61 6e 64 28 61 7a 41 72 67 2c 20 6e  Command(azArg, n
2aec0 41 72 67 2c 20 26 63 6d 64 29 3b 0a 20 20 69 66  Arg, &cmd);.  if
2aed0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2aee0 29 7b 0a 20 20 20 20 69 6e 74 20 65 44 62 54 79  ){.    int eDbTy
2aef0 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  pe = SHELL_OPEN_
2af00 55 4e 53 50 45 43 3b 0a 20 20 20 20 63 6d 64 2e  UNSPEC;.    cmd.
2af10 70 20 3d 20 70 53 74 61 74 65 3b 0a 20 20 20 20  p = pState;.    
2af20 63 6d 64 2e 64 62 20 3d 20 70 53 74 61 74 65 2d  cmd.db = pState-
2af30 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 63 6d 64  >db;.    if( cmd
2af40 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  .zFile ){.      
2af50 65 44 62 54 79 70 65 20 3d 20 64 65 64 75 63 65  eDbType = deduce
2af60 44 61 74 61 62 61 73 65 54 79 70 65 28 63 6d 64  DatabaseType(cmd
2af70 2e 7a 46 69 6c 65 2c 20 31 29 3b 0a 20 20 20 20  .zFile, 1);.    
2af80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 44 62  }else{.      eDb
2af90 54 79 70 65 20 3d 20 70 53 74 61 74 65 2d 3e 6f  Type = pState->o
2afa0 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 7d 0a 20  penMode;.    }. 
2afb0 20 20 20 69 66 28 20 65 44 62 54 79 70 65 3d 3d     if( eDbType==
2afc0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49  SHELL_OPEN_ZIPFI
2afd0 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  LE ){.      if( 
2afe0 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44  cmd.eCmd==AR_CMD
2aff0 5f 45 58 54 52 41 43 54 20 7c 7c 20 63 6d 64 2e  _EXTRACT || cmd.
2b000 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 4c 49 53  eCmd==AR_CMD_LIS
2b010 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T ){.        if(
2b020 20 63 6d 64 2e 7a 46 69 6c 65 3d 3d 30 20 29 7b   cmd.zFile==0 ){
2b030 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a  .          cmd.z
2b040 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  SrcTable = sqlit
2b050 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70 22  e3_mprintf("zip"
2b060 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2b070 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e  {.          cmd.
2b080 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69  zSrcTable = sqli
2b090 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70  te3_mprintf("zip
2b0a0 66 69 6c 65 28 25 51 29 22 2c 20 63 6d 64 2e 7a  file(%Q)", cmd.z
2b0b0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  File);.        }
2b0c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
2b0d0 6d 64 2e 62 5a 69 70 20 3d 20 31 3b 0a 20 20 20  md.bZip = 1;.   
2b0e0 20 7d 65 6c 73 65 20 69 66 28 20 63 6d 64 2e 7a   }else if( cmd.z
2b0f0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  File ){.      in
2b100 74 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 69  t flags;.      i
2b110 66 28 20 63 6d 64 2e 62 41 70 70 65 6e 64 20 29  f( cmd.bAppend )
2b120 20 65 44 62 54 79 70 65 20 3d 20 53 48 45 4c 4c   eDbType = SHELL
2b130 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b  _OPEN_APPENDVFS;
2b140 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65  .      if( cmd.e
2b150 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43 52 45 41  Cmd==AR_CMD_CREA
2b160 54 45 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d  TE || cmd.eCmd==
2b170 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 29 7b  AR_CMD_UPDATE ){
2b180 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d  .        flags =
2b190 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2b1a0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
2b1b0 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20  EN_CREATE;.     
2b1c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b1d0 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  flags = SQLITE_O
2b1e0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
2b1f0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e      }.      cmd.
2b200 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  db = 0;.      if
2b210 28 20 63 6d 64 2e 62 44 72 79 52 75 6e 20 29 7b  ( cmd.bDryRun ){
2b220 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
2b230 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74  intf(pState->out
2b240 2c 20 22 2d 2d 20 6f 70 65 6e 20 64 61 74 61 62  , "-- open datab
2b250 61 73 65 20 27 25 73 27 25 73 5c 6e 22 2c 20 63  ase '%s'%s\n", c
2b260 6d 64 2e 7a 46 69 6c 65 2c 0a 20 20 20 20 20 20  md.zFile,.      
2b270 20 20 20 20 20 20 20 65 44 62 54 79 70 65 3d 3d         eDbType==
2b280 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e  SHELL_OPEN_APPEN
2b290 44 56 46 53 20 3f 20 22 20 75 73 69 6e 67 20 27  DVFS ? " using '
2b2a0 61 70 6e 64 76 66 73 27 22 20 3a 20 22 22 29 3b  apndvfs'" : "");
2b2b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2b2c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
2b2d0 5f 76 32 28 63 6d 64 2e 7a 46 69 6c 65 2c 20 26  _v2(cmd.zFile, &
2b2e0 63 6d 64 2e 64 62 2c 20 66 6c 61 67 73 2c 20 0a  cmd.db, flags, .
2b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 44 62               eDb
2b300 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Type==SHELL_OPEN
2b310 5f 41 50 50 45 4e 44 56 46 53 20 3f 20 22 61 70  _APPENDVFS ? "ap
2b320 6e 64 76 66 73 22 20 3a 20 30 29 3b 0a 20 20 20  ndvfs" : 0);.   
2b330 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2b340 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2b350 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2b360 72 72 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e  rr, "cannot open
2b370 20 66 69 6c 65 3a 20 25 73 20 28 25 73 29 5c 6e   file: %s (%s)\n
2b380 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
2b390 63 6d 64 2e 7a 46 69 6c 65 2c 20 73 71 6c 69 74  cmd.zFile, sqlit
2b3a0 65 33 5f 65 72 72 6d 73 67 28 63 6d 64 2e 64 62  e3_errmsg(cmd.db
2b3b0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
2b3c0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 72       goto end_ar
2b3d0 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20 20 20 20 20  _command;.      
2b3e0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
2b3f0 66 69 6c 65 69 6f 5f 69 6e 69 74 28 63 6d 64 2e  fileio_init(cmd.
2b400 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  db, 0, 0);.     
2b410 20 73 71 6c 69 74 65 33 5f 73 71 6c 61 72 5f 69   sqlite3_sqlar_i
2b420 6e 69 74 28 63 6d 64 2e 64 62 2c 20 30 2c 20 30  nit(cmd.db, 0, 0
2b430 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2b440 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
2b450 28 63 6d 64 2e 64 62 2c 20 22 73 68 65 6c 6c 5f  (cmd.db, "shell_
2b460 70 75 74 73 6e 6c 22 2c 20 31 2c 20 53 51 4c 49  putsnl", 1, SQLI
2b470 54 45 5f 55 54 46 38 2c 20 63 6d 64 2e 70 2c 0a  TE_UTF8, cmd.p,.
2b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68                sh
2b4a0 65 6c 6c 50 75 74 73 46 75 6e 63 2c 20 30 2c 20  ellPutsFunc, 0, 
2b4b0 30 29 3b 0a 0a 20 20 20 20 7d 0a 20 20 20 20 69  0);..    }.    i
2b4c0 66 28 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65  f( cmd.zSrcTable
2b4d0 3d 3d 30 20 26 26 20 63 6d 64 2e 62 5a 69 70 3d  ==0 && cmd.bZip=
2b4e0 3d 30 20 26 26 20 63 6d 64 2e 65 43 6d 64 21 3d  =0 && cmd.eCmd!=
2b4f0 41 52 5f 43 4d 44 5f 48 45 4c 50 20 29 7b 0a 20  AR_CMD_HELP ){. 
2b500 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65 43 6d       if( cmd.eCm
2b510 64 21 3d 41 52 5f 43 4d 44 5f 43 52 45 41 54 45  d!=AR_CMD_CREATE
2b520 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
2b530 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
2b540 6d 65 74 61 64 61 74 61 28 63 6d 64 2e 64 62 2c  metadata(cmd.db,
2b550 30 2c 22 73 71 6c 61 72 22 2c 22 6e 61 6d 65 22  0,"sqlar","name"
2b560 2c 30 2c 30 2c 30 2c 30 2c 30 29 0a 20 20 20 20  ,0,0,0,0,0).    
2b570 20 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66    ){.        utf
2b580 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2b590 20 22 64 61 74 61 62 61 73 65 20 64 6f 65 73 20   "database does 
2b5a0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 27  not contain an '
2b5b0 73 71 6c 61 72 27 20 74 61 62 6c 65 5c 6e 22 29  sqlar' table\n")
2b5c0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
2b5d0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
2b5e0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 72       goto end_ar
2b5f0 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20 20 20 20 20  _command;.      
2b600 7d 0a 20 20 20 20 20 20 63 6d 64 2e 7a 53 72 63  }.      cmd.zSrc
2b610 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  Table = sqlite3_
2b620 6d 70 72 69 6e 74 66 28 22 73 71 6c 61 72 22 29  mprintf("sqlar")
2b630 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69  ;.    }..    swi
2b640 74 63 68 28 20 63 6d 64 2e 65 43 6d 64 20 29 7b  tch( cmd.eCmd ){
2b650 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f 43  .      case AR_C
2b660 4d 44 5f 43 52 45 41 54 45 3a 0a 20 20 20 20 20  MD_CREATE:.     
2b670 20 20 20 72 63 20 3d 20 61 72 43 72 65 61 74 65     rc = arCreate
2b680 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28  OrUpdateCommand(
2b690 26 63 6d 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  &cmd, 0);.      
2b6a0 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
2b6b0 63 61 73 65 20 41 52 5f 43 4d 44 5f 45 58 54 52  case AR_CMD_EXTR
2b6c0 41 43 54 3a 0a 20 20 20 20 20 20 20 20 72 63 20  ACT:.        rc 
2b6d0 3d 20 61 72 45 78 74 72 61 63 74 43 6f 6d 6d 61  = arExtractComma
2b6e0 6e 64 28 26 63 6d 64 29 3b 0a 20 20 20 20 20 20  nd(&cmd);.      
2b6f0 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
2b700 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54  case AR_CMD_LIST
2b710 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  :.        rc = a
2b720 72 4c 69 73 74 43 6f 6d 6d 61 6e 64 28 26 63 6d  rListCommand(&cm
2b730 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
2b740 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41  k;..      case A
2b750 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20 20 20  R_CMD_HELP:.    
2b760 20 20 20 20 61 72 55 73 61 67 65 28 70 53 74 61      arUsage(pSta
2b770 74 65 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 20 20  te->out);.      
2b780 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
2b790 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
2b7a0 20 61 73 73 65 72 74 28 20 63 6d 64 2e 65 43 6d   assert( cmd.eCm
2b7b0 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54 45  d==AR_CMD_UPDATE
2b7c0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
2b7d0 20 61 72 43 72 65 61 74 65 4f 72 55 70 64 61 74   arCreateOrUpdat
2b7e0 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c 20 31  eCommand(&cmd, 1
2b7f0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2b800 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65 6e 64 5f  ;.    }.  }.end_
2b810 61 72 5f 63 6f 6d 6d 61 6e 64 3a 0a 20 20 69 66  ar_command:.  if
2b820 28 20 63 6d 64 2e 64 62 21 3d 70 53 74 61 74 65  ( cmd.db!=pState
2b830 2d 3e 64 62 20 29 7b 0a 20 20 20 20 63 6c 6f 73  ->db ){.    clos
2b840 65 5f 64 62 28 63 6d 64 2e 64 62 29 3b 0a 20 20  e_db(cmd.db);.  
2b850 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
2b860 28 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 29 3b  (cmd.zSrcTable);
2b870 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2b880 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 22  ./* End of the "
2b890 2e 61 72 63 68 69 76 65 22 20 6f 72 20 22 2e 61  .archive" or ".a
2b8a0 72 22 20 63 6f 6d 6d 61 6e 64 20 6c 6f 67 69 63  r" command logic
2b8b0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2b8c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b8d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b8e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b8f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b900 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21  ***/.#endif /* !
2b910 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2b920 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2b930 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
2b940 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 20 2a  ITE_HAVE_ZLIB) *
2b950 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20  /.../*.** If an 
2b960 69 6e 70 75 74 20 6c 69 6e 65 20 62 65 67 69 6e  input line begin
2b970 73 20 77 69 74 68 20 22 2e 22 20 74 68 65 6e 20  s with "." then 
2b980 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74  invoke this rout
2b990 69 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65 73  ine to.** proces
2b9a0 73 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a  s that line..**.
2b9b0 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65  ** Return 1 on e
2b9c0 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c  rror, 2 to exit,
2b9d0 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65   and 0 otherwise
2b9e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b9f0 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28  do_meta_command(
2ba00 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 53 68 65  char *zLine, She
2ba10 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69  llState *p){.  i
2ba20 6e 74 20 68 20 3d 20 31 3b 0a 20 20 69 6e 74 20  nt h = 1;.  int 
2ba30 6e 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nArg = 0;.  int 
2ba40 6e 2c 20 63 3b 0a 20 20 69 6e 74 20 72 63 20 3d  n, c;.  int rc =
2ba50 20 30 3b 0a 20 20 63 68 61 72 20 2a 61 7a 41 72   0;.  char *azAr
2ba60 67 5b 35 30 5d 3b 0a 0a 23 69 66 6e 64 65 66 20  g[50];..#ifndef 
2ba70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2ba80 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70  UALTABLE.  if( p
2ba90 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
2baa0 20 29 7b 0a 20 20 20 20 65 78 70 65 72 74 46 69   ){.    expertFi
2bab0 6e 69 73 68 28 70 2c 20 31 2c 20 30 29 3b 0a 20  nish(p, 1, 0);. 
2bac0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2bad0 50 61 72 73 65 20 74 68 65 20 69 6e 70 75 74 20  Parse the input 
2bae0 6c 69 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e 73  line into tokens
2baf0 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
2bb00 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 6e 41 72 67  zLine[h] && nArg
2bb10 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 41 72 67  <ArraySize(azArg
2bb20 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  ) ){.    while( 
2bb30 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d  IsSpace(zLine[h]
2bb40 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ h++; }.    
2bb50 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 30 20  if( zLine[h]==0 
2bb60 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
2bb70 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 27 27 20   zLine[h]=='\'' 
2bb80 7c 7c 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 22 27  || zLine[h]=='"'
2bb90 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65   ){.      int de
2bba0 6c 69 6d 20 3d 20 7a 4c 69 6e 65 5b 68 2b 2b 5d  lim = zLine[h++]
2bbb0 3b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41  ;.      azArg[nA
2bbc0 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68  rg++] = &zLine[h
2bbd0 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ];.      while( 
2bbe0 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 7a 4c 69 6e  zLine[h] && zLin
2bbf0 65 5b 68 5d 21 3d 64 65 6c 69 6d 20 29 7b 0a 20  e[h]!=delim ){. 
2bc00 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65         if( zLine
2bc10 5b 68 5d 3d 3d 27 5c 5c 27 20 26 26 20 64 65 6c  [h]=='\\' && del
2bc20 69 6d 3d 3d 27 22 27 20 26 26 20 7a 4c 69 6e 65  im=='"' && zLine
2bc30 5b 68 2b 31 5d 21 3d 30 20 29 20 68 2b 2b 3b 0a  [h+1]!=0 ) h++;.
2bc40 20 20 20 20 20 20 20 20 68 2b 2b 3b 0a 20 20 20          h++;.   
2bc50 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
2bc60 4c 69 6e 65 5b 68 5d 3d 3d 64 65 6c 69 6d 20 29  Line[h]==delim )
2bc70 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b  {.        zLine[
2bc80 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  h++] = 0;.      
2bc90 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 69  }.      if( deli
2bca0 6d 3d 3d 27 22 27 20 29 20 72 65 73 6f 6c 76 65  m=='"' ) resolve
2bcb0 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41  _backslashes(azA
2bcc0 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20  rg[nArg-1]);.   
2bcd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 7a   }else{.      az
2bce0 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a  Arg[nArg++] = &z
2bcf0 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77  Line[h];.      w
2bd00 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26  hile( zLine[h] &
2bd10 26 20 21 49 73 53 70 61 63 65 28 7a 4c 69 6e 65  & !IsSpace(zLine
2bd20 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20  [h]) ){ h++; }. 
2bd30 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68       if( zLine[h
2bd40 5d 20 29 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d  ] ) zLine[h++] =
2bd50 20 30 3b 0a 20 20 20 20 20 20 72 65 73 6f 6c 76   0;.      resolv
2bd60 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a  e_backslashes(az
2bd70 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20  Arg[nArg-1]);.  
2bd80 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
2bd90 6f 63 65 73 73 20 74 68 65 20 69 6e 70 75 74 20  ocess the input 
2bda0 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  line..  */.  if(
2bdb0 20 6e 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72   nArg==0 ) retur
2bdc0 6e 20 30 3b 20 2f 2a 20 6e 6f 20 74 6f 6b 65 6e  n 0; /* no token
2bdd0 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20  s, no error */. 
2bde0 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a   n = strlen30(az
2bdf0 41 72 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20 61  Arg[0]);.  c = a
2be00 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20 63 6c  zArg[0][0];.  cl
2be10 65 61 72 54 65 6d 70 46 69 6c 65 28 70 29 3b 0a  earTempFile(p);.
2be20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2be30 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
2be40 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 61 27 20  ON.  if( c=='a' 
2be50 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2be60 5b 30 5d 2c 20 22 61 75 74 68 22 2c 20 6e 29 3d  [0], "auth", n)=
2be70 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
2be80 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72  rg!=2 ){.      r
2be90 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2bea0 2c 20 22 55 73 61 67 65 3a 20 2e 61 75 74 68 20  , "Usage: .auth 
2beb0 4f 4e 7c 4f 46 46 5c 6e 22 29 3b 0a 20 20 20 20  ON|OFF\n");.    
2bec0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2bed0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
2bee0 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
2bef0 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
2bf00 0a 20 20 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e  .    if( boolean
2bf10 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20  Value(azArg[1]) 
2bf20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2bf30 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28  _set_authorizer(
2bf40 70 2d 3e 64 62 2c 20 73 68 65 6c 6c 41 75 74 68  p->db, shellAuth
2bf50 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , p);.    }else{
2bf60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2bf70 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 2d  et_authorizer(p-
2bf80 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
2bf90 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
2bfa0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
2bfb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2bfc0 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
2bfd0 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f  ned(SQLITE_HAVE_
2bfe0 5a 4c 49 42 29 0a 20 20 69 66 28 20 63 3d 3d 27  ZLIB).  if( c=='
2bff0 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  a' && strncmp(az
2c000 41 72 67 5b 30 5d 2c 20 22 61 72 63 68 69 76 65  Arg[0], "archive
2c010 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2c020 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
2c030 20 20 20 72 63 20 3d 20 61 72 44 6f 74 43 6f 6d     rc = arDotCom
2c040 6d 61 6e 64 28 70 2c 20 30 2c 20 61 7a 41 72 67  mand(p, 0, azArg
2c050 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65  , nArg);.  }else
2c060 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 28  .#endif..  if( (
2c070 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26  c=='b' && n>=3 &
2c080 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2c090 30 5d 2c 20 22 62 61 63 6b 75 70 22 2c 20 6e 29  0], "backup", n)
2c0a0 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27  ==0).   || (c=='
2c0b0 73 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  s' && n>=3 && st
2c0c0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2c0d0 22 73 61 76 65 22 2c 20 6e 29 3d 3d 30 29 0a 20  "save", n)==0). 
2c0e0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2c0f0 61 72 20 2a 7a 44 65 73 74 46 69 6c 65 20 3d 20  ar *zDestFile = 
2c100 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
2c110 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20  r *zDb = 0;.    
2c120 73 71 6c 69 74 65 33 20 2a 70 44 65 73 74 3b 0a  sqlite3 *pDest;.
2c130 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
2c140 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20  up *pBackup;.   
2c150 20 69 6e 74 20 6a 3b 0a 20 20 20 20 63 6f 6e 73   int j;.    cons
2c160 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 30  t char *zVfs = 0
2c170 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a  ;.    for(j=1; j
2c180 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <nArg; j++){.   
2c190 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2c1a0 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20   = azArg[j];.   
2c1b0 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27     if( z[0]=='-'
2c1c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2c1d0 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[1]=='-' ) z++;
2c1e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
2c1f0 63 6d 70 28 7a 2c 20 22 2d 61 70 70 65 6e 64 22  cmp(z, "-append"
2c200 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2c210 20 20 7a 56 66 73 20 3d 20 22 61 70 6e 64 76 66    zVfs = "apndvf
2c220 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  s";.        }els
2c230 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  e.        {.    
2c240 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2c250 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f  f(stderr, "unkno
2c260 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22  wn option: %s\n"
2c270 2c 20 61 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 20  , azArg[j]);.   
2c280 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2c290 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c2a0 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 65 73 74   }else if( zDest
2c2b0 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
2c2c0 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 61     zDestFile = a
2c2d0 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d  zArg[j];.      }
2c2e0 65 6c 73 65 20 69 66 28 20 7a 44 62 3d 3d 30 20  else if( zDb==0 
2c2f0 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 62 20 3d  ){.        zDb =
2c300 20 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20 20 20   zDestFile;.    
2c310 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20      zDestFile = 
2c320 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20  azArg[j];.      
2c330 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
2c340 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2c350 2c 20 22 55 73 61 67 65 3a 20 2e 62 61 63 6b 75  , "Usage: .backu
2c360 70 20 3f 44 42 3f 20 3f 2d 2d 61 70 70 65 6e 64  p ?DB? ?--append
2c370 3f 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a  ? FILENAME\n");.
2c380 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
2c390 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c3a0 20 20 20 20 69 66 28 20 7a 44 65 73 74 46 69 6c      if( zDestFil
2c3b0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61  e==0 ){.      ra
2c3c0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2c3d0 20 22 6d 69 73 73 69 6e 67 20 46 49 4c 45 4e 41   "missing FILENA
2c3e0 4d 45 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 2e  ME argument on .
2c3f0 62 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20 20 20  backup\n");.    
2c400 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2c410 7d 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d 30  }.    if( zDb==0
2c420 20 29 20 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b   ) zDb = "main";
2c430 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2c440 33 5f 6f 70 65 6e 5f 76 32 28 7a 44 65 73 74 46  3_open_v2(zDestF
2c450 69 6c 65 2c 20 26 70 44 65 73 74 2c 20 0a 20 20  ile, &pDest, .  
2c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c470 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2c480 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
2c490 4e 5f 43 52 45 41 54 45 2c 20 7a 56 66 73 29 3b  N_CREATE, zVfs);
2c4a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2c4b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c4c0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2c4d0 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rr, "Error: cann
2c4e0 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e  ot open \"%s\"\n
2c4f0 22 2c 20 7a 44 65 73 74 46 69 6c 65 29 3b 0a 20  ", zDestFile);. 
2c500 20 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 44       close_db(pD
2c510 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  est);.      retu
2c520 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2c530 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
2c540 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c     pBackup = sql
2c550 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74  ite3_backup_init
2c560 28 70 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20  (pDest, "main", 
2c570 70 2d 3e 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20  p->db, zDb);.   
2c580 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20   if( pBackup==0 
2c590 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
2c5a0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
2c5b0 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
2c5c0 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74  te3_errmsg(pDest
2c5d0 29 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 5f  ));.      close_
2c5e0 64 62 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  db(pDest);.     
2c5f0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2c600 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28 72 63  .    while(  (rc
2c610 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
2c620 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31  p_step(pBackup,1
2c630 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  00))==SQLITE_OK 
2c640 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ){}.    sqlite3_
2c650 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42  backup_finish(pB
2c660 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20  ackup);.    if( 
2c670 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
2c680 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b  ){.      rc = 0;
2c690 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c6a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2c6b0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
2c6c0 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
2c6d0 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20  msg(pDest));.   
2c6e0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2c6f0 0a 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 44  .    close_db(pD
2c700 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  est);.  }else.. 
2c710 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e   if( c=='b' && n
2c720 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
2c730 7a 41 72 67 5b 30 5d 2c 20 22 62 61 69 6c 22 2c  zArg[0], "bail",
2c740 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
2c750 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
2c760 20 20 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72     bail_on_error
2c770 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28   = booleanValue(
2c780 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d  azArg[1]);.    }
2c790 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
2c7a0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2c7b0 55 73 61 67 65 3a 20 2e 62 61 69 6c 20 6f 6e 7c  Usage: .bail on|
2c7c0 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  off\n");.      r
2c7d0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
2c7e0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2c7f0 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  b' && n>=3 && st
2c800 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2c810 22 62 69 6e 61 72 79 22 2c 20 6e 29 3d 3d 30 20  "binary", n)==0 
2c820 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
2c830 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
2c840 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
2c850 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  rg[1]) ){.      
2c860 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28    setBinaryMode(
2c870 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20  p->out, 1);.    
2c880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c890 20 73 65 74 54 65 78 74 4d 6f 64 65 28 70 2d 3e   setTextMode(p->
2c8a0 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  out, 1);.      }
2c8b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c8c0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2c8d0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 69  err, "Usage: .bi
2c8e0 6e 61 72 79 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  nary on|off\n");
2c8f0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2c900 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
2c910 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 73 74  if( c=='c' && st
2c920 72 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 63  rcmp(azArg[0],"c
2c930 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  d")==0 ){.    if
2c940 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 23 69 66  ( nArg==2 ){.#if
2c950 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29   defined(_WIN32)
2c960 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
2c970 32 29 0a 20 20 20 20 20 20 77 63 68 61 72 5f 74  2).      wchar_t
2c980 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 77 69   *z = sqlite3_wi
2c990 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63  n32_utf8_to_unic
2c9a0 6f 64 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  ode(azArg[1]);. 
2c9b0 20 20 20 20 20 72 63 20 3d 20 21 53 65 74 43 75       rc = !SetCu
2c9c0 72 72 65 6e 74 44 69 72 65 63 74 6f 72 79 57 28  rrentDirectoryW(
2c9d0 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
2c9e0 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73 65  3_free(z);.#else
2c9f0 0a 20 20 20 20 20 20 72 63 20 3d 20 63 68 64 69  .      rc = chdi
2ca00 72 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 65 6e  r(azArg[1]);.#en
2ca10 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63  dif.      if( rc
2ca20 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
2ca30 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2ca40 22 43 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 74  "Cannot change t
2ca50 6f 20 64 69 72 65 63 74 6f 72 79 20 5c 22 25 73  o directory \"%s
2ca60 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29  \"\n", azArg[1])
2ca70 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
2ca80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2ca90 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2caa0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2cab0 73 61 67 65 3a 20 2e 63 64 20 44 49 52 45 43 54  sage: .cd DIRECT
2cac0 4f 52 59 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ORY\n");.      r
2cad0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
2cae0 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20 75  else..  /* The u
2caf0 6e 64 6f 63 75 6d 65 6e 74 65 64 20 22 2e 62 72  ndocumented ".br
2cb00 65 61 6b 70 6f 69 6e 74 22 20 63 6f 6d 6d 61 6e  eakpoint" comman
2cb10 64 20 63 61 75 73 65 73 20 61 20 63 61 6c 6c 20  d causes a call 
2cb20 74 6f 20 74 68 65 20 6e 6f 2d 6f 70 0a 20 20 2a  to the no-op.  *
2cb30 2a 20 72 6f 75 74 69 6e 65 20 6e 61 6d 65 64 20  * routine named 
2cb40 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28  test_breakpoint(
2cb50 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 3d  )..  */.  if( c=
2cb60 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='b' && n>=3 && 
2cb70 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2cb80 2c 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20  , "breakpoint", 
2cb90 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 65 73  n)==0 ){.    tes
2cba0 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a  t_breakpoint();.
2cbb0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2cbc0 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='c' && n>=3 &&
2cbd0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2cbe0 5d 2c 20 22 63 68 61 6e 67 65 73 22 2c 20 6e 29  ], "changes", n)
2cbf0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
2cc00 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
2cc10 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 70  setOrClearFlag(p
2cc20 2c 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68 61  , SHFLG_CountCha
2cc30 6e 67 65 73 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  nges, azArg[1]);
2cc40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2cc50 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2cc60 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 68  err, "Usage: .ch
2cc70 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29  anges on|off\n")
2cc80 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2cc90 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2cca0 20 2f 2a 20 43 61 6e 63 65 6c 20 6f 75 74 70 75   /* Cancel outpu
2ccb0 74 20 72 65 64 69 72 65 63 74 69 6f 6e 2c 20 69  t redirection, i
2ccc0 66 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  f it is currentl
2ccd0 79 20 73 65 74 20 28 62 79 20 2e 74 65 73 74 63  y set (by .testc
2cce0 61 73 65 29 0a 20 20 2a 2a 20 54 68 65 6e 20 72  ase).  ** Then r
2ccf0 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
2cd00 6f 66 20 74 68 65 20 74 65 73 74 63 61 73 65 2d  of the testcase-
2cd10 6f 75 74 2e 74 78 74 20 66 69 6c 65 20 61 6e 64  out.txt file and
2cd20 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
2cd30 0a 20 20 2a 2a 20 61 7a 41 72 67 5b 31 5d 2e 20  .  ** azArg[1]. 
2cd40 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
2cd50 66 66 65 72 65 6e 63 65 73 2c 20 72 65 70 6f 72  fferences, repor
2cd60 74 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 20 65  t an error and e
2cd70 78 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  xit..  */.  if( 
2cd80 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20 26  c=='c' && n>=3 &
2cd90 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2cda0 30 5d 2c 20 22 63 68 65 63 6b 22 2c 20 6e 29 3d  0], "check", n)=
2cdb0 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
2cdc0 7a 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 6f 75  zRes = 0;.    ou
2cdd0 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a 20  tput_reset(p);. 
2cde0 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29     if( nArg!=2 )
2cdf0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2ce00 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2ce10 65 3a 20 2e 63 68 65 63 6b 20 47 4c 4f 42 2d 50  e: .check GLOB-P
2ce20 41 54 54 45 52 4e 5c 6e 22 29 3b 0a 20 20 20 20  ATTERN\n");.    
2ce30 20 20 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d 65    rc = 2;.    }e
2ce40 6c 73 65 20 69 66 28 20 28 7a 52 65 73 20 3d 20  lse if( (zRes = 
2ce50 72 65 61 64 46 69 6c 65 28 22 74 65 73 74 63 61  readFile("testca
2ce60 73 65 2d 6f 75 74 2e 74 78 74 22 2c 20 30 29 29  se-out.txt", 0))
2ce70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
2ce80 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2ce90 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 72  "Error: cannot r
2cea0 65 61 64 20 27 74 65 73 74 63 61 73 65 2d 6f 75  ead 'testcase-ou
2ceb0 74 2e 74 78 74 27 5c 6e 22 29 3b 0a 20 20 20 20  t.txt'\n");.    
2cec0 20 20 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d 65    rc = 2;.    }e
2ced0 6c 73 65 20 69 66 28 20 74 65 73 74 63 61 73 65  lse if( testcase
2cee0 5f 67 6c 6f 62 28 61 7a 41 72 67 5b 31 5d 2c 7a  _glob(azArg[1],z
2cef0 52 65 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Res)==0 ){.     
2cf00 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2cf10 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  err,.           
2cf20 20 20 20 20 20 20 22 74 65 73 74 63 61 73 65 2d        "testcase-
2cf30 25 73 20 46 41 49 4c 45 44 5c 6e 20 45 78 70 65  %s FAILED\n Expe
2cf40 63 74 65 64 3a 20 5b 25 73 5d 5c 6e 20 20 20 20  cted: [%s]\n    
2cf50 20 20 47 6f 74 3a 20 5b 25 73 5d 5c 6e 22 2c 0a    Got: [%s]\n",.
2cf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf70 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c 20 61   p->zTestcase, a
2cf80 7a 41 72 67 5b 31 5d 2c 20 7a 52 65 73 29 3b 0a  zArg[1], zRes);.
2cf90 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2cfa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
2cfb0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f 75  tf8_printf(stdou
2cfc0 74 2c 20 22 74 65 73 74 63 61 73 65 2d 25 73 20  t, "testcase-%s 
2cfd0 6f 6b 5c 6e 22 2c 20 70 2d 3e 7a 54 65 73 74 63  ok\n", p->zTestc
2cfe0 61 73 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ase);.      p->n
2cff0 43 68 65 63 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Check++;.    }. 
2d000 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2d010 7a 52 65 73 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  zRes);.  }else..
2d020 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20    if( c=='c' && 
2d030 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2d040 2c 20 22 63 6c 6f 6e 65 22 2c 20 6e 29 3d 3d 30  , "clone", n)==0
2d050 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
2d060 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 74 72 79  ==2 ){.      try
2d070 54 6f 43 6c 6f 6e 65 28 70 2c 20 61 7a 41 72 67  ToClone(p, azArg
2d080 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [1]);.    }else{
2d090 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2d0a0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
2d0b0 3a 20 2e 63 6c 6f 6e 65 20 46 49 4c 45 4e 41 4d  : .clone FILENAM
2d0c0 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  E\n");.      rc 
2d0d0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
2d0e0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27  se..  if( c=='d'
2d0f0 20 26 26 20 6e 3e 31 20 26 26 20 73 74 72 6e 63   && n>1 && strnc
2d100 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 61  mp(azArg[0], "da
2d110 74 61 62 61 73 65 73 22 2c 20 6e 29 3d 3d 30 20  tabases", n)==0 
2d120 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74  ){.    ShellStat
2d130 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72  e data;.    char
2d140 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
2d150 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
2d160 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
2d170 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61  ta, p, sizeof(da
2d180 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73  ta));.    data.s
2d190 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
2d1a0 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20     data.cMode = 
2d1b0 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
2d1c0 5f 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74  _List;.    sqlit
2d1d0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2d1e0 6f 66 28 64 61 74 61 2e 63 6f 6c 53 65 70 61 72  of(data.colSepar
2d1f0 61 74 6f 72 29 2c 64 61 74 61 2e 63 6f 6c 53 65  ator),data.colSe
2d200 70 61 72 61 74 6f 72 2c 22 3a 20 22 29 3b 0a 20  parator,": ");. 
2d210 20 20 20 64 61 74 61 2e 63 6e 74 20 3d 20 30 3b     data.cnt = 0;
2d220 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
2d230 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54  c(p->db, "SELECT
2d240 20 6e 61 6d 65 2c 20 66 69 6c 65 20 46 52 4f 4d   name, file FROM
2d250 20 70 72 61 67 6d 61 5f 64 61 74 61 62 61 73 65   pragma_database
2d260 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20 20 20 20  _list",.        
2d270 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63           callbac
2d280 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d  k, &data, &zErrM
2d290 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72  sg);.    if( zEr
2d2a0 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 75 74  rMsg ){.      ut
2d2b0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2d2c0 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20  ,"Error: %s\n", 
2d2d0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
2d2e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
2d2f0 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20  rMsg);.      rc 
2d300 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
2d310 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27  se..  if( c=='d'
2d320 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
2d330 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64  cmp(azArg[0], "d
2d340 62 63 6f 6e 66 69 67 22 2c 20 6e 29 3d 3d 30 20  bconfig", n)==0 
2d350 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
2d360 6e 73 74 20 73 74 72 75 63 74 20 44 62 43 6f 6e  nst struct DbCon
2d370 66 69 67 43 68 6f 69 63 65 73 20 7b 0a 20 20 20  figChoices {.   
2d380 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2d390 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  Name;.      int 
2d3a0 6f 70 3b 0a 20 20 20 20 7d 20 61 44 62 43 6f 6e  op;.    } aDbCon
2d3b0 66 69 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  fig[] = {.      
2d3c0 20 20 7b 20 22 65 6e 61 62 6c 65 5f 66 6b 65 79    { "enable_fkey
2d3d0 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44  ",      SQLITE_D
2d3e0 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46  BCONFIG_ENABLE_F
2d3f0 4b 45 59 20 20 20 20 20 20 20 20 20 20 20 20 7d  KEY            }
2d400 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 65 6e 61  ,.        { "ena
2d410 62 6c 65 5f 74 72 69 67 67 65 72 22 2c 20 20 20  ble_trigger",   
2d420 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
2d430 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 20 20  ENABLE_TRIGGER  
2d440 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2d450 20 20 7b 20 22 66 74 73 33 5f 74 6f 6b 65 6e 69    { "fts3_tokeni
2d460 7a 65 72 22 2c 20 20 20 53 51 4c 49 54 45 5f 44  zer",   SQLITE_D
2d470 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46  BCONFIG_ENABLE_F
2d480 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 20 20 7d  TS3_TOKENIZER  }
2d490 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 6c 6f 61  ,.        { "loa
2d4a0 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20  d_extension",   
2d4b0 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
2d4c0 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
2d4d0 4e 53 49 4f 4e 20 20 7d 2c 0a 20 20 20 20 20 20  NSION  },.      
2d4e0 20 20 7b 20 22 6e 6f 5f 63 6b 70 74 5f 6f 6e 5f    { "no_ckpt_on_
2d4f0 63 6c 6f 73 65 22 2c 20 53 51 4c 49 54 45 5f 44  close", SQLITE_D
2d500 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54 5f  BCONFIG_NO_CKPT_
2d510 4f 4e 5f 43 4c 4f 53 45 20 20 20 20 20 20 20 7d  ON_CLOSE       }
2d520 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 65 6e 61  ,.        { "ena
2d530 62 6c 65 5f 71 70 73 67 22 2c 20 20 20 20 20 20  ble_qpsg",      
2d540 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
2d550 45 4e 41 42 4c 45 5f 51 50 53 47 20 20 20 20 20  ENABLE_QPSG     
2d560 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2d570 20 20 7b 20 22 74 72 69 67 67 65 72 5f 65 71 70    { "trigger_eqp
2d580 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44  ",      SQLITE_D
2d590 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f  BCONFIG_TRIGGER_
2d5a0 45 51 50 20 20 20 20 20 20 20 20 20 20 20 20 7d  EQP            }
2d5b0 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 72 65 73  ,.        { "res
2d5c0 65 74 5f 64 61 74 61 62 61 73 65 22 2c 20 20 20  et_database",   
2d5d0 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
2d5e0 52 45 53 45 54 5f 44 41 54 41 42 41 53 45 20 20  RESET_DATABASE  
2d5f0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2d600 20 20 7b 20 22 64 65 66 65 6e 73 69 76 65 22 2c    { "defensive",
2d610 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
2d620 42 43 4f 4e 46 49 47 5f 44 45 46 45 4e 53 49 56  BCONFIG_DEFENSIV
2d630 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  E              }
2d640 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ,.    };.    int
2d650 20 69 69 2c 20 76 3b 0a 20 20 20 20 6f 70 65 6e   ii, v;.    open
2d660 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 66  _db(p, 0);.    f
2d670 6f 72 28 69 69 3d 30 3b 20 69 69 3c 41 72 72 61  or(ii=0; ii<Arra
2d680 79 53 69 7a 65 28 61 44 62 43 6f 6e 66 69 67 29  ySize(aDbConfig)
2d690 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ; ii++){.      i
2d6a0 66 28 20 6e 41 72 67 3e 31 20 26 26 20 73 74 72  f( nArg>1 && str
2d6b0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 61 44  cmp(azArg[1], aD
2d6c0 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d  bConfig[ii].zNam
2d6d0 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  e)!=0 ) continue
2d6e0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  ;.      if( nArg
2d6f0 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73  >=3 ){.        s
2d700 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
2d710 28 70 2d 3e 64 62 2c 20 61 44 62 43 6f 6e 66 69  (p->db, aDbConfi
2d720 67 5b 69 69 5d 2e 6f 70 2c 20 62 6f 6f 6c 65 61  g[ii].op, boolea
2d730 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29  nValue(azArg[2])
2d740 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
2d750 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63      sqlite3_db_c
2d760 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20 61 44 62  onfig(p->db, aDb
2d770 43 6f 6e 66 69 67 5b 69 69 5d 2e 6f 70 2c 20 2d  Config[ii].op, -
2d780 31 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 75 74  1, &v);.      ut
2d790 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
2d7a0 2c 20 22 25 31 38 73 20 25 73 5c 6e 22 2c 20 61  , "%18s %s\n", a
2d7b0 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e 61  DbConfig[ii].zNa
2d7c0 6d 65 2c 20 76 20 3f 20 22 6f 6e 22 20 3a 20 22  me, v ? "on" : "
2d7d0 6f 66 66 22 29 3b 0a 20 20 20 20 20 20 69 66 28  off");.      if(
2d7e0 20 6e 41 72 67 3e 31 20 29 20 62 72 65 61 6b 3b   nArg>1 ) break;
2d7f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
2d800 41 72 67 3e 31 20 26 26 20 69 69 3d 3d 41 72 72  Arg>1 && ii==Arr
2d810 61 79 53 69 7a 65 28 61 44 62 43 6f 6e 66 69 67  aySize(aDbConfig
2d820 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  ) ){.      utf8_
2d830 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2d840 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 64  Error: unknown d
2d850 62 63 6f 6e 66 69 67 20 5c 22 25 73 5c 22 5c 6e  bconfig \"%s\"\n
2d860 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
2d870 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2d880 73 74 64 65 72 72 2c 20 22 45 6e 74 65 72 20 5c  stderr, "Enter \
2d890 22 2e 64 62 63 6f 6e 66 69 67 5c 22 20 77 69 74  ".dbconfig\" wit
2d8a0 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 66  h no arguments f
2d8b0 6f 72 20 61 20 6c 69 73 74 5c 6e 22 29 3b 0a 20  or a list\n");. 
2d8c0 20 20 20 7d 20 20 20 0a 20 20 7d 65 6c 73 65 0a     }   .  }else.
2d8d0 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26  .  if( c=='d' &&
2d8e0 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
2d8f0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62 69 6e  (azArg[0], "dbin
2d900 66 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  fo", n)==0 ){.  
2d910 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 64 62 69    rc = shell_dbi
2d920 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20 6e  nfo_command(p, n
2d930 41 72 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d  Arg, azArg);.  }
2d940 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2d950 64 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  d' && strncmp(az
2d960 41 72 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c 20  Arg[0], "dump", 
2d970 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  n)==0 ){.    con
2d980 73 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d  st char *zLike =
2d990 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   0;.    int i;. 
2d9a0 20 20 20 69 6e 74 20 73 61 76 65 64 53 68 6f 77     int savedShow
2d9b0 48 65 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77  Header = p->show
2d9c0 48 65 61 64 65 72 3b 0a 20 20 20 20 69 6e 74 20  Header;.    int 
2d9d0 73 61 76 65 64 53 68 65 6c 6c 46 6c 61 67 73 20  savedShellFlags 
2d9e0 3d 20 70 2d 3e 73 68 65 6c 6c 46 6c 67 73 3b 0a  = p->shellFlgs;.
2d9f0 20 20 20 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c      ShellClearFl
2da00 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73  ag(p, SHFLG_Pres
2da10 65 72 76 65 52 6f 77 69 64 7c 53 48 46 4c 47 5f  erveRowid|SHFLG_
2da20 4e 65 77 6c 69 6e 65 73 7c 53 48 46 4c 47 5f 45  Newlines|SHFLG_E
2da30 63 68 6f 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  cho);.    for(i=
2da40 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  1; i<nArg; i++){
2da50 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
2da60 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  [i][0]=='-' ){. 
2da70 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2da80 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 2b  r *z = azArg[i]+
2da90 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  1;.        if( z
2daa0 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a  [0]=='-' ) z++;.
2dab0 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
2dac0 6d 70 28 7a 2c 22 70 72 65 73 65 72 76 65 2d 72  mp(z,"preserve-r
2dad0 6f 77 69 64 73 22 29 3d 3d 30 20 29 7b 0a 23 69  owids")==0 ){.#i
2dae0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
2daf0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
2db00 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
2db10 74 66 28 73 74 64 65 72 72 2c 20 22 54 68 65 20  tf(stderr, "The 
2db20 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64  --preserve-rowid
2db30 73 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20  s option is not 
2db40 63 6f 6d 70 61 74 69 62 6c 65 22 0a 20 20 20 20  compatible".    
2db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db60 20 20 20 20 20 20 20 20 20 22 20 77 69 74 68 20           " with 
2db70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2db80 55 41 4c 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20  UALTABLE\n");.  
2db90 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
2dba0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2dbb0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2dbc0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ;.#else.        
2dbd0 20 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70    ShellSetFlag(p
2dbe0 2c 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65  , SHFLG_Preserve
2dbf0 52 6f 77 69 64 29 3b 0a 23 65 6e 64 69 66 0a 20  Rowid);.#endif. 
2dc00 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20         }else.   
2dc10 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
2dc20 7a 2c 22 6e 65 77 6c 69 6e 65 73 22 29 3d 3d 30  z,"newlines")==0
2dc30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 68   ){.          Sh
2dc40 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48  ellSetFlag(p, SH
2dc50 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a 20  FLG_Newlines);. 
2dc60 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20         }else.   
2dc70 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2dc80 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2dc90 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74  rr, "Unknown opt
2dca0 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22  ion \"%s\" on \"
2dcb0 2e 64 75 6d 70 5c 22 5c 6e 22 2c 20 61 7a 41 72  .dump\"\n", azAr
2dcc0 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[i]);.         
2dcd0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
2dce0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
2dcf0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
2dd00 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2dd10 20 69 66 28 20 7a 4c 69 6b 65 20 29 7b 0a 20 20   if( zLike ){.  
2dd20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2dd30 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2dd40 20 2e 64 75 6d 70 20 3f 2d 2d 70 72 65 73 65 72   .dump ?--preser
2dd50 76 65 2d 72 6f 77 69 64 73 3f 20 22 0a 20 20 20  ve-rowids? ".   
2dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd70 20 20 20 20 20 20 20 20 22 3f 2d 2d 6e 65 77 6c          "?--newl
2dd80 69 6e 65 73 3f 20 3f 4c 49 4b 45 2d 50 41 54 54  ines? ?LIKE-PATT
2dd90 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ERN?\n");.      
2dda0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2ddb0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2ddc0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
2ddd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
2dde0 4c 69 6b 65 20 3d 20 61 7a 41 72 67 5b 69 5d 3b  Like = azArg[i];
2ddf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2de00 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
2de10 3b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 70 6c  ;.    /* When pl
2de20 61 79 69 6e 67 20 62 61 63 6b 20 61 20 22 64 75  aying back a "du
2de30 6d 70 22 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  mp", the content
2de40 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
2de50 20 61 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a   an order.    **
2de60 20 77 68 69 63 68 20 63 61 75 73 65 73 20 69 6d   which causes im
2de70 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
2de80 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
2de90 74 6f 20 62 65 20 76 69 6f 6c 61 74 65 64 2e 0a  to be violated..
2dea0 20 20 20 20 2a 2a 20 53 6f 20 64 69 73 61 62 6c      ** So disabl
2deb0 65 20 66 6f 72 65 69 67 6e 2d 6b 65 79 20 63 6f  e foreign-key co
2dec0 6e 73 74 72 61 69 6e 74 20 65 6e 66 6f 72 63 65  nstraint enforce
2ded0 6d 65 6e 74 20 74 6f 20 70 72 65 76 65 6e 74 20  ment to prevent 
2dee0 70 72 6f 62 6c 65 6d 73 2e 20 2a 2f 0a 20 20 20  problems. */.   
2def0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
2df00 75 74 2c 20 22 50 52 41 47 4d 41 20 66 6f 72 65  ut, "PRAGMA fore
2df10 69 67 6e 5f 6b 65 79 73 3d 4f 46 46 3b 5c 6e 22  ign_keys=OFF;\n"
2df20 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
2df30 66 28 70 2d 3e 6f 75 74 2c 20 22 42 45 47 49 4e  f(p->out, "BEGIN
2df40 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22   TRANSACTION;\n"
2df50 29 3b 0a 20 20 20 20 70 2d 3e 77 72 69 74 61 62  );.    p->writab
2df60 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20  leSchema = 0;.  
2df70 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20    p->showHeader 
2df80 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 53 65 74 20  = 0;.    /* Set 
2df90 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
2dfa0 4f 4e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73  ON since doing s
2dfb0 6f 20 66 6f 72 63 65 73 20 53 51 4c 69 74 65 20  o forces SQLite 
2dfc0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20  to initialize.  
2dfd0 20 20 2a 2a 20 61 73 20 6d 75 63 68 20 6f 66 20    ** as much of 
2dfe0 74 68 65 20 73 63 68 65 6d 61 20 61 73 20 69 74  the schema as it
2dff0 20 63 61 6e 20 65 76 65 6e 20 69 66 20 74 68 65   can even if the
2e000 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
2e010 61 62 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 63  able is.    ** c
2e020 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 73  orrupt. */.    s
2e030 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
2e040 62 2c 20 22 53 41 56 45 50 4f 49 4e 54 20 64 75  b, "SAVEPOINT du
2e050 6d 70 3b 20 50 52 41 47 4d 41 20 77 72 69 74 61  mp; PRAGMA writa
2e060 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 22 2c 20  ble_schema=ON", 
2e070 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d  0, 0, 0);.    p-
2e080 3e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 69  >nErr = 0;.    i
2e090 66 28 20 7a 4c 69 6b 65 3d 3d 30 20 29 7b 0a 20  f( zLike==0 ){. 
2e0a0 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f       run_schema_
2e0b0 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20  dump_query(p,.  
2e0c0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
2e0d0 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52  me, type, sql FR
2e0e0 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
2e0f0 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52   ".        "WHER
2e100 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41  E sql NOT NULL A
2e110 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27  ND type=='table'
2e120 20 41 4e 44 20 6e 61 6d 65 21 3d 27 73 71 6c 69   AND name!='sqli
2e130 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20  te_sequence'".  
2e140 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e      );.      run
2e150 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65  _schema_dump_que
2e160 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53  ry(p,.        "S
2e170 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65  ELECT name, type
2e180 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
2e190 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
2e1a0 20 20 20 22 57 48 45 52 45 20 6e 61 6d 65 3d 3d     "WHERE name==
2e1b0 27 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  'sqlite_sequence
2e1c0 27 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  '".      );.    
2e1d0 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70    run_table_dump
2e1e0 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20  _query(p,.      
2e1f0 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52    "SELECT sql FR
2e200 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
2e210 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52   ".        "WHER
2e220 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41  E sql NOT NULL A
2e230 4e 44 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64  ND type IN ('ind
2e240 65 78 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76  ex','trigger','v
2e250 69 65 77 27 29 22 2c 20 30 0a 20 20 20 20 20 20  iew')", 0.      
2e260 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2e270 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a      char *zSql;.
2e280 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
2e290 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
2e2a0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
2e2b0 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52  me, type, sql FR
2e2c0 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
2e2d0 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52   ".        "WHER
2e2e0 45 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20  E tbl_name LIKE 
2e2f0 25 51 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61  %Q AND type=='ta
2e300 62 6c 65 27 22 0a 20 20 20 20 20 20 20 20 22 20  ble'".        " 
2e310 20 41 4e 44 20 73 71 6c 20 4e 4f 54 20 4e 55 4c   AND sql NOT NUL
2e320 4c 22 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20  L", zLike);.    
2e330 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d    run_schema_dum
2e340 70 5f 71 75 65 72 79 28 70 2c 7a 53 71 6c 29 3b  p_query(p,zSql);
2e350 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2e360 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20  ree(zSql);.     
2e370 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
2e380 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
2e390 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
2e3a0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
2e3b0 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
2e3c0 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20   sql NOT NULL". 
2e3d0 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 74 79         "  AND ty
2e3e0 70 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27  pe IN ('index','
2e3f0 74 72 69 67 67 65 72 27 2c 27 76 69 65 77 27 29  trigger','view')
2e400 22 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e 44  ".        "  AND
2e410 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25   tbl_name LIKE %
2e420 51 22 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20  Q", zLike);.    
2e430 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70    run_table_dump
2e440 5f 71 75 65 72 79 28 70 2c 20 7a 53 71 6c 2c 20  _query(p, zSql, 
2e450 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
2e460 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
2e470 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 77    }.    if( p->w
2e480 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 29 7b  ritableSchema ){
2e490 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2e4a0 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d  f(p->out, "PRAGM
2e4b0 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
2e4c0 61 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20  a=OFF;\n");.    
2e4d0 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68    p->writableSch
2e4e0 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ema = 0;.    }. 
2e4f0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
2e500 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77  p->db, "PRAGMA w
2e510 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
2e520 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  FF;", 0, 0, 0);.
2e530 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
2e540 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45  (p->db, "RELEASE
2e550 20 64 75 6d 70 3b 22 2c 20 30 2c 20 30 2c 20 30   dump;", 0, 0, 0
2e560 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
2e570 66 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 45 72  f(p->out, p->nEr
2e580 72 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 3b 20 2d  r ? "ROLLBACK; -
2e590 2d 20 64 75 65 20 74 6f 20 65 72 72 6f 72 73 5c  - due to errors\
2e5a0 6e 22 20 3a 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22  n" : "COMMIT;\n"
2e5b0 29 3b 0a 20 20 20 20 70 2d 3e 73 68 6f 77 48 65  );.    p->showHe
2e5c0 61 64 65 72 20 3d 20 73 61 76 65 64 53 68 6f 77  ader = savedShow
2e5d0 48 65 61 64 65 72 3b 0a 20 20 20 20 70 2d 3e 73  Header;.    p->s
2e5e0 68 65 6c 6c 46 6c 67 73 20 3d 20 73 61 76 65 64  hellFlgs = saved
2e5f0 53 68 65 6c 6c 46 6c 61 67 73 3b 0a 20 20 7d 65  ShellFlags;.  }e
2e600 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65  lse..  if( c=='e
2e610 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2e620 72 67 5b 30 5d 2c 20 22 65 63 68 6f 22 2c 20 6e  rg[0], "echo", n
2e630 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
2e640 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
2e650 20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28   setOrClearFlag(
2e660 70 2c 20 53 48 46 4c 47 5f 45 63 68 6f 2c 20 61  p, SHFLG_Echo, a
2e670 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
2e680 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2e690 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2e6a0 73 61 67 65 3a 20 2e 65 63 68 6f 20 6f 6e 7c 6f  sage: .echo on|o
2e6b0 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ff\n");.      rc
2e6c0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
2e6d0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65  lse..  if( c=='e
2e6e0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2e6f0 72 67 5b 30 5d 2c 20 22 65 71 70 22 2c 20 6e 29  rg[0], "eqp", n)
2e700 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
2e710 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
2e720 70 2d 3e 61 75 74 6f 45 51 50 74 65 73 74 20 3d  p->autoEQPtest =
2e730 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74   0;.      if( st
2e740 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 66  rcmp(azArg[1],"f
2e750 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ull")==0 ){.    
2e760 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d      p->autoEQP =
2e770 20 41 55 54 4f 45 51 50 5f 66 75 6c 6c 3b 0a 20   AUTOEQP_full;. 
2e780 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
2e790 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
2e7a0 74 72 69 67 67 65 72 22 29 3d 3d 30 20 29 7b 0a  trigger")==0 ){.
2e7b0 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45          p->autoE
2e7c0 51 50 20 3d 20 41 55 54 4f 45 51 50 5f 74 72 69  QP = AUTOEQP_tri
2e7d0 67 67 65 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  gger;.      }els
2e7e0 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41  e if( strcmp(azA
2e7f0 72 67 5b 31 5d 2c 22 74 65 73 74 22 29 3d 3d 30  rg[1],"test")==0
2e800 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   ){.        p->a
2e810 75 74 6f 45 51 50 20 3d 20 41 55 54 4f 45 51 50  utoEQP = AUTOEQP
2e820 5f 6f 6e 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  _on;.        p->
2e830 61 75 74 6f 45 51 50 74 65 73 74 20 3d 20 31 3b  autoEQPtest = 1;
2e840 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2e850 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50        p->autoEQP
2e860 20 3d 20 28 75 38 29 62 6f 6f 6c 65 61 6e 56 61   = (u8)booleanVa
2e870 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
2e880 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2e890 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2e8a0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2e8b0 65 3a 20 2e 65 71 70 20 6f 66 66 7c 6f 6e 7c 74  e: .eqp off|on|t
2e8c0 72 69 67 67 65 72 7c 66 75 6c 6c 5c 6e 22 29 3b  rigger|full\n");
2e8d0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2e8e0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
2e8f0 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
2e900 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2e910 22 65 78 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b  "exit", n)==0 ){
2e920 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20  .    if( nArg>1 
2e930 26 26 20 28 72 63 20 3d 20 28 69 6e 74 29 69 6e  && (rc = (int)in
2e940 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
2e950 5b 31 5d 29 29 21 3d 30 20 29 20 65 78 69 74 28  [1]))!=0 ) exit(
2e960 72 63 29 3b 0a 20 20 20 20 72 63 20 3d 20 32 3b  rc);.    rc = 2;
2e970 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54  .  }else..  /* T
2e980 68 65 20 22 2e 65 78 70 6c 61 69 6e 22 20 63 6f  he ".explain" co
2e990 6d 6d 61 6e 64 20 69 73 20 61 75 74 6f 6d 61 74  mmand is automat
2e9a0 69 63 20 6e 6f 77 2e 20 20 49 74 20 69 73 20 6c  ic now.  It is l
2e9b0 61 72 67 65 6c 79 20 70 6f 69 6e 74 6c 65 73 73  argely pointless
2e9c0 2e 20 20 49 74 0a 20 20 2a 2a 20 72 65 74 61 69  .  It.  ** retai
2e9d0 6e 65 64 20 70 75 72 65 6c 79 20 66 6f 72 20 62  ned purely for b
2e9e0 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
2e9f0 62 69 6c 69 74 79 20 2a 2f 0a 20 20 69 66 28 20  bility */.  if( 
2ea00 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d  c=='e' && strncm
2ea10 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70  p(azArg[0], "exp
2ea20 6c 61 69 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  lain", n)==0 ){.
2ea30 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 31 3b      int val = 1;
2ea40 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 32  .    if( nArg>=2
2ea50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
2ea60 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61  rcmp(azArg[1],"a
2ea70 75 74 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  uto")==0 ){.    
2ea80 20 20 20 20 76 61 6c 20 3d 20 39 39 3b 0a 20 20      val = 99;.  
2ea90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2eaa0 20 20 20 76 61 6c 20 3d 20 20 62 6f 6f 6c 65 61     val =  boolea
2eab0 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
2eac0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ead0 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20 26      if( val==1 &
2eae0 26 20 70 2d 3e 6d 6f 64 65 21 3d 4d 4f 44 45 5f  & p->mode!=MODE_
2eaf0 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20  Explain ){.     
2eb00 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 20 3d   p->normalMode =
2eb10 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20   p->mode;.      
2eb20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45  p->mode = MODE_E
2eb30 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 70 2d  xplain;.      p-
2eb40 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30  >autoExplain = 0
2eb50 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2eb60 76 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  val==0 ){.      
2eb70 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44  if( p->mode==MOD
2eb80 45 5f 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e 6d  E_Explain ) p->m
2eb90 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d  ode = p->normalM
2eba0 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75  ode;.      p->au
2ebb0 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20  toExplain = 0;. 
2ebc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76 61 6c     }else if( val
2ebd0 3d 3d 39 39 20 29 7b 0a 20 20 20 20 20 20 69 66  ==99 ){.      if
2ebe0 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f  ( p->mode==MODE_
2ebf0 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64  Explain ) p->mod
2ec00 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64  e = p->normalMod
2ec10 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  e;.      p->auto
2ec20 45 78 70 6c 61 69 6e 20 3d 20 31 3b 0a 20 20 20  Explain = 1;.   
2ec30 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e   }.  }else..#ifn
2ec40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2ec50 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
2ec60 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72  f( c=='e' && str
2ec70 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2ec80 65 78 70 65 72 74 22 2c 20 6e 29 3d 3d 30 20 29  expert", n)==0 )
2ec90 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  {.    open_db(p,
2eca0 20 30 29 3b 0a 20 20 20 20 65 78 70 65 72 74 44   0);.    expertD
2ecb0 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41  otCommand(p, azA
2ecc0 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c  rg, nArg);.  }el
2ecd0 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  se.#endif..  if(
2ece0 20 63 3d 3d 27 66 27 20 26 26 20 73 74 72 6e 63   c=='f' && strnc
2ecf0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 66 75  mp(azArg[0], "fu
2ed00 6c 6c 73 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30  llschema", n)==0
2ed10 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61   ){.    ShellSta
2ed20 74 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61  te data;.    cha
2ed30 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
2ed40 20 20 20 20 69 6e 74 20 64 6f 53 74 61 74 73 20      int doStats 
2ed50 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  = 0;.    memcpy(
2ed60 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66  &data, p, sizeof
2ed70 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74  (data));.    dat
2ed80 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30  a.showHeader = 0
2ed90 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65  ;.    data.cMode
2eda0 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d   = data.mode = M
2edb0 4f 44 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 66  ODE_Semi;.    if
2edc0 28 20 6e 41 72 67 3d 3d 32 20 26 26 20 6f 70 74  ( nArg==2 && opt
2edd0 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72 67 5b 31  ionMatch(azArg[1
2ede0 5d 2c 20 22 69 6e 64 65 6e 74 22 29 20 29 7b 0a  ], "indent") ){.
2edf0 20 20 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65        data.cMode
2ee00 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d   = data.mode = M
2ee10 4f 44 45 5f 50 72 65 74 74 79 3b 0a 20 20 20 20  ODE_Pretty;.    
2ee20 20 20 6e 41 72 67 20 3d 20 31 3b 0a 20 20 20 20    nArg = 1;.    
2ee30 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d  }.    if( nArg!=
2ee40 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  1 ){.      raw_p
2ee50 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2ee60 73 61 67 65 3a 20 2e 66 75 6c 6c 73 63 68 65 6d  sage: .fullschem
2ee70 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 5c 6e 22 29  a ?--indent?\n")
2ee80 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2ee90 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
2eea0 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
2eeb0 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28    }.    open_db(
2eec0 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  p, 0);.    rc = 
2eed0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
2eee0 64 62 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  db,.       "SELE
2eef0 43 54 20 73 71 6c 20 46 52 4f 4d 22 0a 20 20 20  CT sql FROM".   
2ef00 20 20 20 20 22 20 20 28 53 45 4c 45 43 54 20 73      "  (SELECT s
2ef10 71 6c 20 73 71 6c 2c 20 74 79 70 65 20 74 79 70  ql sql, type typ
2ef20 65 2c 20 74 62 6c 5f 6e 61 6d 65 20 74 62 6c 5f  e, tbl_name tbl_
2ef30 6e 61 6d 65 2c 20 6e 61 6d 65 20 6e 61 6d 65 2c  name, name name,
2ef40 20 72 6f 77 69 64 20 78 22 0a 20 20 20 20 20 20   rowid x".      
2ef50 20 22 20 20 20 20 20 46 52 4f 4d 20 73 71 6c 69   "     FROM sqli
2ef60 74 65 5f 6d 61 73 74 65 72 20 55 4e 49 4f 4e 20  te_master UNION 
2ef70 41 4c 4c 22 0a 20 20 20 20 20 20 20 22 20 20 20  ALL".       "   
2ef80 53 45 4c 45 43 54 20 73 71 6c 2c 20 74 79 70 65  SELECT sql, type
2ef90 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65  , tbl_name, name
2efa0 2c 20 72 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c  , rowid FROM sql
2efb0 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29  ite_temp_master)
2efc0 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
2efd0 20 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e   type!='meta' AN
2efe0 44 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20 41 4e  D sql NOTNULL AN
2eff0 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20  D name NOT LIKE 
2f000 27 73 71 6c 69 74 65 5f 25 27 20 22 0a 20 20 20  'sqlite_%' ".   
2f010 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 72 6f      "ORDER BY ro
2f020 77 69 64 22 2c 0a 20 20 20 20 20 20 20 63 61 6c  wid",.       cal
2f030 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a  lback, &data, &z
2f040 45 72 72 4d 73 67 0a 20 20 20 20 29 3b 0a 20 20  ErrMsg.    );.  
2f050 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f060 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
2f070 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
2f080 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2f090 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
2f0a0 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  p->db,.         
2f0b0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 72 6f        "SELECT ro
2f0c0 77 69 64 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  wid FROM sqlite_
2f0d0 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20  master".        
2f0e0 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6e         " WHERE n
2f0f0 61 6d 65 20 47 4c 4f 42 20 27 73 71 6c 69 74 65  ame GLOB 'sqlite
2f100 5f 73 74 61 74 5b 31 33 34 5d 27 22 2c 0a 20 20  _stat[134]'",.  
2f110 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
2f120 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
2f130 20 20 20 64 6f 53 74 61 74 73 20 3d 20 73 71 6c     doStats = sql
2f140 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
2f150 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20  ==SQLITE_ROW;.  
2f160 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
2f170 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
2f180 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 53 74 61   }.    if( doSta
2f190 74 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ts==0 ){.      r
2f1a0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
2f1b0 2c 20 22 2f 2a 20 4e 6f 20 53 54 41 54 20 74 61  , "/* No STAT ta
2f1c0 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 2a  bles available *
2f1d0 2f 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  /\n");.    }else
2f1e0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2f1f0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c  tf(p->out, "ANAL
2f200 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  YZE sqlite_maste
2f210 72 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73 71  r;\n");.      sq
2f220 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
2f230 2c 20 22 53 45 4c 45 43 54 20 27 41 4e 41 4c 59  , "SELECT 'ANALY
2f240 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ZE sqlite_master
2f250 27 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '",.            
2f260 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c         callback,
2f270 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67   &data, &zErrMsg
2f280 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 63 4d  );.      data.cM
2f290 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20  ode = data.mode 
2f2a0 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20  = MODE_Insert;. 
2f2b0 20 20 20 20 20 64 61 74 61 2e 7a 44 65 73 74 54       data.zDestT
2f2c0 61 62 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f 73  able = "sqlite_s
2f2d0 74 61 74 31 22 3b 0a 20 20 20 20 20 20 73 68 65  tat1";.      she
2f2e0 6c 6c 5f 65 78 65 63 28 26 64 61 74 61 2c 20 22  ll_exec(&data, "
2f2f0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71  SELECT * FROM sq
2f300 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 26 7a 45  lite_stat1", &zE
2f310 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61  rrMsg);.      da
2f320 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  ta.zDestTable = 
2f330 22 73 71 6c 69 74 65 5f 73 74 61 74 33 22 3b 0a  "sqlite_stat3";.
2f340 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63        shell_exec
2f350 28 26 64 61 74 61 2c 20 22 53 45 4c 45 43 54 20  (&data, "SELECT 
2f360 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  * FROM sqlite_st
2f370 61 74 33 22 2c 20 26 7a 45 72 72 4d 73 67 29 3b  at3", &zErrMsg);
2f380 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44 65 73  .      data.zDes
2f390 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69 74 65  tTable = "sqlite
2f3a0 5f 73 74 61 74 34 22 3b 0a 20 20 20 20 20 20 73  _stat4";.      s
2f3b0 68 65 6c 6c 5f 65 78 65 63 28 26 64 61 74 61 2c  hell_exec(&data,
2f3c0 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
2f3d0 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c 20 26  sqlite_stat4", &
2f3e0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
2f3f0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
2f400 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69  t, "ANALYZE sqli
2f410 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a  te_master;\n");.
2f420 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2f430 20 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73   if( c=='h' && s
2f440 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2f450 20 22 68 65 61 64 65 72 73 22 2c 20 6e 29 3d 3d   "headers", n)==
2f460 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
2f470 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d  g==2 ){.      p-
2f480 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 62 6f  >showHeader = bo
2f490 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
2f4a0 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [1]);.    }else{
2f4b0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2f4c0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
2f4d0 3a 20 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66  : .headers on|of
2f4e0 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  f\n");.      rc 
2f4f0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
2f500 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68 27  se..  if( c=='h'
2f510 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2f520 67 5b 30 5d 2c 20 22 68 65 6c 70 22 2c 20 6e 29  g[0], "help", n)
2f530 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
2f540 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg>=2 ){.      
2f550 6e 20 3d 20 73 68 6f 77 48 65 6c 70 28 70 2d 3e  n = showHelp(p->
2f560 6f 75 74 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  out, azArg[1]);.
2f570 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
2f580 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2f590 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 4e  rintf(p->out, "N
2f5a0 6f 74 68 69 6e 67 20 6d 61 74 63 68 65 73 20 27  othing matches '
2f5b0 25 73 27 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d  %s'\n", azArg[1]
2f5c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2f5d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 68 6f 77  else{.      show
2f5e0 48 65 6c 70 28 70 2d 3e 6f 75 74 2c 20 30 29 3b  Help(p->out, 0);
2f5f0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
2f600 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20    if( c=='i' && 
2f610 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2f620 2c 20 22 69 6d 70 6f 72 74 22 2c 20 6e 29 3d 3d  , "import", n)==
2f630 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
2f640 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
2f650 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64       /* Insert d
2f660 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61  ata into this ta
2f670 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ble */.    char 
2f680 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  *zFile;         
2f690 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2f6a0 66 20 66 69 6c 65 20 74 6f 20 65 78 74 72 61 20  f file to extra 
2f6b0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a  content from */.
2f6c0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
2f6d0 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20   *pStmt = NULL; 
2f6e0 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a  /* A statement *
2f6f0 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
2f700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f710 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2f720 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
2f730 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ble */.    int n
2f740 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
2f750 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2f760 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20   of bytes in an 
2f770 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  SQL string */.  
2f780 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f7a0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2f7b0 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 43 6f  /.    int needCo
2f7c0 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  mmit;           
2f7d0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 43 4f 4d    /* True to COM
2f7e0 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20  MIT or ROLLBACK 
2f7f0 61 74 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e  at end */.    in
2f800 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20  t nSep;         
2f810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2f820 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2f830 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b  p->colSeparator[
2f840 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  ] */.    char *z
2f850 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
2f860 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73       /* An SQL s
2f870 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
2f880 49 6d 70 6f 72 74 43 74 78 20 73 43 74 78 3b 20  ImportCtx sCtx; 
2f890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2f8a0 65 61 64 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  eader context */
2f8b0 0a 20 20 20 20 63 68 61 72 20 2a 28 53 51 4c 49  .    char *(SQLI
2f8c0 54 45 5f 43 44 45 43 4c 20 2a 78 52 65 61 64 29  TE_CDECL *xRead)
2f8d0 28 49 6d 70 6f 72 74 43 74 78 2a 29 3b 20 2f 2a  (ImportCtx*); /*
2f8e0 20 46 75 6e 63 20 74 6f 20 72 65 61 64 20 6f 6e   Func to read on
2f8f0 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69  e value */.    i
2f900 6e 74 20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c  nt (SQLITE_CDECL
2f910 20 2a 78 43 6c 6f 73 65 72 29 28 46 49 4c 45 2a   *xCloser)(FILE*
2f920 29 3b 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 20  );      /* Func 
2f930 74 6f 20 63 6c 6f 73 65 20 66 69 6c 65 20 2a 2f  to close file */
2f940 0a 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d  ..    if( nArg!=
2f950 33 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  3 ){.      raw_p
2f960 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2f970 73 61 67 65 3a 20 2e 69 6d 70 6f 72 74 20 46 49  sage: .import FI
2f980 4c 45 20 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20  LE TABLE\n");.  
2f990 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
2f9a0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
2f9b0 7d 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a  }.    zFile = az
2f9c0 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a 54 61 62  Arg[1];.    zTab
2f9d0 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20  le = azArg[2];. 
2f9e0 20 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74     seenInterrupt
2f9f0 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74   = 0;.    memset
2fa00 28 26 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f  (&sCtx, 0, sizeo
2fa10 66 28 73 43 74 78 29 29 3b 0a 20 20 20 20 6f 70  f(sCtx));.    op
2fa20 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2fa30 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30   nSep = strlen30
2fa40 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
2fa50 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d  );.    if( nSep=
2fa60 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =0 ){.      raw_
2fa70 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20  printf(stderr,. 
2fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa90 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c  "Error: non-null
2faa0 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
2fab0 72 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 69  r required for i
2fac0 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20  mport\n");.     
2fad0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2fae0 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20  .    if( nSep>1 
2faf0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2fb00 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2fb10 6f 72 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61 63  or: multi-charac
2fb20 74 65 72 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72  ter column separ
2fb30 61 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ators not allowe
2fb40 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
2fb50 20 20 20 20 20 20 20 20 20 22 20 66 6f 72 20 69           " for i
2fb60 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20  mport\n");.     
2fb70 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2fb80 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c  .    nSep = strl
2fb90 65 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70 61 72  en30(p->rowSepar
2fba0 61 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 6e  ator);.    if( n
2fbb0 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sep==0 ){.      
2fbc0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2fbd0 72 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e  r, "Error: non-n
2fbe0 75 6c 6c 20 72 6f 77 20 73 65 70 61 72 61 74 6f  ull row separato
2fbf0 72 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 69  r required for i
2fc00 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20  mport\n");.     
2fc10 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2fc20 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 32  .    if( nSep==2
2fc30 20 26 26 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44   && p->mode==MOD
2fc40 45 5f 43 73 76 20 26 26 20 73 74 72 63 6d 70 28  E_Csv && strcmp(
2fc50 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
2fc60 20 53 45 50 5f 43 72 4c 66 29 3d 3d 30 20 29 7b   SEP_CrLf)==0 ){
2fc70 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 69  .      /* When i
2fc80 6d 70 6f 72 74 69 6e 67 20 43 53 56 20 28 6f 6e  mporting CSV (on
2fc90 6c 79 29 2c 20 69 66 20 74 68 65 20 72 6f 77 20  ly), if the row 
2fca0 73 65 70 61 72 61 74 6f 72 20 69 73 20 73 65 74  separator is set
2fcb0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
2fcc0 20 64 65 66 61 75 6c 74 20 6f 75 74 70 75 74 20   default output 
2fcd0 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2c 20 63  row separator, c
2fce0 68 61 6e 67 65 20 69 74 20 74 6f 20 74 68 65 20  hange it to the 
2fcf0 64 65 66 61 75 6c 74 20 69 6e 70 75 74 0a 20 20  default input.  
2fd00 20 20 20 20 2a 2a 20 72 6f 77 20 73 65 70 61 72      ** row separ
2fd10 61 74 6f 72 2e 20 20 54 68 69 73 20 61 76 6f 69  ator.  This avoi
2fd20 64 73 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 69  ds having to mai
2fd30 6e 74 61 69 6e 20 64 69 66 66 65 72 65 6e 74 20  ntain different 
2fd40 69 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a 20 61  input.      ** a
2fd50 6e 64 20 6f 75 74 70 75 74 20 72 6f 77 20 73 65  nd output row se
2fd60 70 61 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 20  parators. */.   
2fd70 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2fd80 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f  ntf(sizeof(p->ro
2fd90 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  wSeparator), p->
2fda0 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45  rowSeparator, SE
2fdb0 50 5f 52 6f 77 29 3b 0a 20 20 20 20 20 20 6e 53  P_Row);.      nS
2fdc0 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d  ep = strlen30(p-
2fdd0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
2fde0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53      }.    if( nS
2fdf0 65 70 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 61  ep>1 ){.      ra
2fe00 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2fe10 20 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63   "Error: multi-c
2fe20 68 61 72 61 63 74 65 72 20 72 6f 77 20 73 65 70  haracter row sep
2fe30 61 72 61 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f  arators not allo
2fe40 77 65 64 22 0a 20 20 20 20 20 20 20 20 20 20 20  wed".           
2fe50 20 20 20 20 20 20 20 20 20 20 20 22 20 66 6f 72             " for
2fe60 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20   import\n");.   
2fe70 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2fe80 20 7d 0a 20 20 20 20 73 43 74 78 2e 7a 46 69 6c   }.    sCtx.zFil
2fe90 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 20 20 73  e = zFile;.    s
2fea0 43 74 78 2e 6e 4c 69 6e 65 20 3d 20 31 3b 0a 20  Ctx.nLine = 1;. 
2feb0 20 20 20 69 66 28 20 73 43 74 78 2e 7a 46 69 6c     if( sCtx.zFil
2fec0 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66  e[0]=='|' ){.#if
2fed0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2fee0 50 4f 50 45 4e 0a 20 20 20 20 20 20 72 61 77 5f  POPEN.      raw_
2fef0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2ff00 45 72 72 6f 72 3a 20 70 69 70 65 73 20 61 72 65  Error: pipes are
2ff10 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69   not supported i
2ff20 6e 20 74 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20  n this OS\n");. 
2ff30 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 23       return 1;.#
2ff40 65 6c 73 65 0a 20 20 20 20 20 20 73 43 74 78 2e  else.      sCtx.
2ff50 69 6e 20 3d 20 70 6f 70 65 6e 28 73 43 74 78 2e  in = popen(sCtx.
2ff60 7a 46 69 6c 65 2b 31 2c 20 22 72 22 29 3b 0a 20  zFile+1, "r");. 
2ff70 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 20       sCtx.zFile 
2ff80 3d 20 22 3c 70 69 70 65 3e 22 3b 0a 20 20 20 20  = "<pipe>";.    
2ff90 20 20 78 43 6c 6f 73 65 72 20 3d 20 70 63 6c 6f    xCloser = pclo
2ffa0 73 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  se;.#endif.    }
2ffb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 43 74 78  else{.      sCtx
2ffc0 2e 69 6e 20 3d 20 66 6f 70 65 6e 28 73 43 74 78  .in = fopen(sCtx
2ffd0 2e 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20  .zFile, "rb");. 
2ffe0 20 20 20 20 20 78 43 6c 6f 73 65 72 20 3d 20 66       xCloser = f
2fff0 63 6c 6f 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20  close;.    }.   
30000 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f   if( p->mode==MO
30010 44 45 5f 41 73 63 69 69 20 29 7b 0a 20 20 20 20  DE_Ascii ){.    
30020 20 20 78 52 65 61 64 20 3d 20 61 73 63 69 69 5f    xRead = ascii_
30030 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a  read_one_field;.
30040 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30050 20 78 52 65 61 64 20 3d 20 63 73 76 5f 72 65 61   xRead = csv_rea
30060 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20  d_one_field;.   
30070 20 7d 0a 20 20 20 20 69 66 28 20 73 43 74 78 2e   }.    if( sCtx.
30080 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  in==0 ){.      u
30090 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
300a0 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
300b0 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
300c0 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  , zFile);.      
300d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
300e0 20 20 20 20 73 43 74 78 2e 63 43 6f 6c 53 65 70      sCtx.cColSep
300f0 20 3d 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74   = p->colSeparat
30100 6f 72 5b 30 5d 3b 0a 20 20 20 20 73 43 74 78 2e  or[0];.    sCtx.
30110 63 52 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77  cRowSep = p->row
30120 53 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20  Separator[0];.  
30130 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
30140 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
30150 20 2a 20 46 52 4f 4d 20 25 73 22 2c 20 7a 54 61   * FROM %s", zTa
30160 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  ble);.    if( zS
30170 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 78  ql==0 ){.      x
30180 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b  Closer(sCtx.in);
30190 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 6f 75 74  .      shell_out
301a0 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20  _of_memory();.  
301b0 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20    }.    nByte = 
301c0 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a  strlen30(zSql);.
301d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
301e0 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
301f0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
30200 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 6d 70  tmt, 0);.    imp
30210 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28  ort_append_char(
30220 26 73 43 74 78 2c 20 30 29 3b 20 20 20 20 2f 2a  &sCtx, 0);    /*
30230 20 54 6f 20 65 6e 73 75 72 65 20 73 43 74 78 2e   To ensure sCtx.
30240 7a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 2a  z is allocated *
30250 2f 0a 20 20 20 20 69 66 28 20 72 63 20 26 26 20  /.    if( rc && 
30260 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
30270 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
30280 2a 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  *", sqlite3_errm
30290 73 67 28 70 2d 3e 64 62 29 29 3d 3d 30 20 29 7b  sg(p->db))==0 ){
302a0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 72  .      char *zCr
302b0 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  eate = sqlite3_m
302c0 70 72 69 6e 74 66 28 22 43 52 45 41 54 45 20 54  printf("CREATE T
302d0 41 42 4c 45 20 25 73 22 2c 20 7a 54 61 62 6c 65  ABLE %s", zTable
302e0 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 53  );.      char cS
302f0 65 70 20 3d 20 27 28 27 3b 0a 20 20 20 20 20 20  ep = '(';.      
30300 77 68 69 6c 65 28 20 78 52 65 61 64 28 26 73 43  while( xRead(&sC
30310 74 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  tx) ){.        z
30320 43 72 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33  Create = sqlite3
30330 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 63 5c 6e  _mprintf("%z%c\n
30340 20 20 5c 22 25 77 5c 22 20 54 45 58 54 22 2c 20    \"%w\" TEXT", 
30350 7a 43 72 65 61 74 65 2c 20 63 53 65 70 2c 20 73  zCreate, cSep, s
30360 43 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20  Ctx.z);.        
30370 63 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20 20 20  cSep = ',';.    
30380 20 20 20 20 69 66 28 20 73 43 74 78 2e 63 54 65      if( sCtx.cTe
30390 72 6d 21 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70  rm!=sCtx.cColSep
303a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
303b0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 53 65 70  }.      if( cSep
303c0 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20  =='(' ){.       
303d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
303e0 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20 20 20  reate);.        
303f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43 74  sqlite3_free(sCt
30400 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 78 43  x.z);.        xC
30410 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a  loser(sCtx.in);.
30420 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
30430 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20  ntf(stderr,"%s: 
30440 65 6d 70 74 79 20 66 69 6c 65 5c 6e 22 2c 20 73  empty file\n", s
30450 43 74 78 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20  Ctx.zFile);.    
30460 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
30470 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 72 65      }.      zCre
30480 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ate = sqlite3_mp
30490 72 69 6e 74 66 28 22 25 7a 5c 6e 29 22 2c 20 7a  rintf("%z\n)", z
304a0 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20 72  Create);.      r
304b0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
304c0 28 70 2d 3e 64 62 2c 20 7a 43 72 65 61 74 65 2c  (p->db, zCreate,
304d0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
304e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
304f0 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66  reate);.      if
30500 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
30510 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
30520 72 72 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  rr, "CREATE TABL
30530 45 20 25 73 28 2e 2e 2e 29 20 66 61 69 6c 65 64  E %s(...) failed
30540 3a 20 25 73 5c 6e 22 2c 20 7a 54 61 62 6c 65 2c  : %s\n", zTable,
30550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30560 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
30570 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
30580 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43   sqlite3_free(sC
30590 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 78  tx.z);.        x
305a0 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b  Closer(sCtx.in);
305b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
305c0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
305d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
305e0 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
305f0 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
30600 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
30610 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
30620 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
30630 7b 0a 20 20 20 20 20 20 69 66 20 28 70 53 74 6d  {.      if (pStm
30640 74 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  t) sqlite3_final
30650 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
30660 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
30670 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c  derr,"Error: %s\
30680 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
30690 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
306a0 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69    xCloser(sCtx.i
306b0 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
306c0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43   1;.    }.    nC
306d0 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
306e0 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
306f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
30700 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
30710 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20     pStmt = 0;.  
30720 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20    if( nCol==0 ) 
30730 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20  return 0; /* no 
30740 63 6f 6c 75 6d 6e 73 2c 20 6e 6f 20 65 72 72 6f  columns, no erro
30750 72 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20  r */.    zSql = 
30760 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
30770 28 20 6e 42 79 74 65 2a 32 20 2b 20 32 30 20 2b  ( nByte*2 + 20 +
30780 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69   nCol*2 );.    i
30790 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
307a0 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78      xCloser(sCtx
307b0 2e 69 6e 29 3b 0a 20 20 20 20 20 20 73 68 65 6c  .in);.      shel
307c0 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28  l_out_of_memory(
307d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
307e0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
307f0 79 74 65 2b 32 30 2c 20 7a 53 71 6c 2c 20 22 49  yte+20, zSql, "I
30800 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c  NSERT INTO \"%w\
30810 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61  " VALUES(?", zTa
30820 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74  ble);.    j = st
30830 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20  rlen30(zSql);.  
30840 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f    for(i=1; i<nCo
30850 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  l; i++){.      z
30860 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a  Sql[j++] = ',';.
30870 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
30880 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = '?';.    }.   
30890 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27   zSql[j++] = ')'
308a0 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20  ;.    zSql[j] = 
308b0 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
308c0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
308d0 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
308e0 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
308f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
30900 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
30910 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
30920 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
30930 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
30940 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
30950 29 3b 0a 20 20 20 20 20 20 69 66 20 28 70 53 74  );.      if (pSt
30960 6d 74 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  mt) sqlite3_fina
30970 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
30980 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e     xCloser(sCtx.
30990 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
309a0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 1;.    }.    n
309b0 65 65 64 43 6f 6d 6d 69 74 20 3d 20 73 71 6c 69  eedCommit = sqli
309c0 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
309d0 69 74 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69  it(p->db);.    i
309e0 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20  f( needCommit ) 
309f0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
30a00 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  db, "BEGIN", 0, 
30a10 30 2c 20 30 29 3b 0a 20 20 20 20 64 6f 7b 0a 20  0, 0);.    do{. 
30a20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 4c 69       int startLi
30a30 6e 65 20 3d 20 73 43 74 78 2e 6e 4c 69 6e 65 3b  ne = sCtx.nLine;
30a40 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
30a50 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
30a60 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
30a70 78 52 65 61 64 28 26 73 43 74 78 29 3b 0a 20 20  xRead(&sCtx);.  
30a80 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20        /*.       
30a90 20 2a 2a 20 44 69 64 20 77 65 20 72 65 61 63 68   ** Did we reach
30aa0 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 20 62 65 66   end-of-file bef
30ab0 6f 72 65 20 66 69 6e 64 69 6e 67 20 61 6e 79 20  ore finding any 
30ac0 63 6f 6c 75 6d 6e 73 3f 0a 20 20 20 20 20 20 20  columns?.       
30ad0 20 2a 2a 20 49 66 20 73 6f 2c 20 73 74 6f 70 20   ** If so, stop 
30ae0 69 6e 73 74 65 61 64 20 6f 66 20 4e 55 4c 4c 20  instead of NULL 
30af0 66 69 6c 6c 69 6e 67 20 74 68 65 20 72 65 6d 61  filling the rema
30b00 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ining columns.. 
30b10 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30b20 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 69 3d    if( z==0 && i=
30b30 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
30b40 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a      /*.        *
30b50 2a 20 44 69 64 20 77 65 20 72 65 61 63 68 20 65  * Did we reach e
30b60 6e 64 2d 6f 66 2d 66 69 6c 65 20 4f 52 20 65 6e  nd-of-file OR en
30b70 64 2d 6f 66 2d 6c 69 6e 65 20 62 65 66 6f 72 65  d-of-line before
30b80 20 66 69 6e 64 69 6e 67 20 61 6e 79 0a 20 20 20   finding any.   
30b90 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20       ** columns 
30ba0 69 6e 20 41 53 43 49 49 20 6d 6f 64 65 3f 20 20  in ASCII mode?  
30bb0 49 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74  If so, stop inst
30bc0 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c  ead of NULL fill
30bd0 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ing.        ** t
30be0 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c  he remaining col
30bf0 75 6d 6e 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  umns..        */
30c00 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
30c10 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69  mode==MODE_Ascii
30c20 20 26 26 20 28 7a 3d 3d 30 20 7c 7c 20 7a 5b 30   && (z==0 || z[0
30c30 5d 3d 3d 30 29 20 26 26 20 69 3d 3d 30 20 29 20  ]==0) && i==0 ) 
30c40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73  break;.        s
30c50 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
30c60 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 7a 2c 20  (pStmt, i+1, z, 
30c70 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
30c80 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 69  IENT);.        i
30c90 66 28 20 69 3c 6e 43 6f 6c 2d 31 20 26 26 20 73  f( i<nCol-1 && s
30ca0 43 74 78 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e  Ctx.cTerm!=sCtx.
30cb0 63 43 6f 6c 53 65 70 20 29 7b 0a 20 20 20 20 20  cColSep ){.     
30cc0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
30cd0 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
30ce0 20 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c   expected %d col
30cf0 75 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64 20 25  umns but found %
30d00 64 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20  d - ".          
30d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d20 22 66 69 6c 6c 69 6e 67 20 74 68 65 20 72 65 73  "filling the res
30d30 74 20 77 69 74 68 20 4e 55 4c 4c 5c 6e 22 2c 0a  t with NULL\n",.
30d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d50 20 20 20 20 20 20 20 20 20 20 73 43 74 78 2e 7a            sCtx.z
30d60 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c  File, startLine,
30d70 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20   nCol, i+1);.   
30d80 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20         i += 2;. 
30d90 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
30da0 69 3c 3d 6e 43 6f 6c 20 29 7b 20 73 71 6c 69 74  i<=nCol ){ sqlit
30db0 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
30dc0 6d 74 2c 20 69 29 3b 20 69 2b 2b 3b 20 7d 0a 20  mt, i); i++; }. 
30dd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
30de0 0a 20 20 20 20 20 20 69 66 28 20 73 43 74 78 2e  .      if( sCtx.
30df0 63 54 65 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c  cTerm==sCtx.cCol
30e00 53 65 70 20 29 7b 0a 20 20 20 20 20 20 20 20 64  Sep ){.        d
30e10 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 78 52 65  o{.          xRe
30e20 61 64 28 26 73 43 74 78 29 3b 0a 20 20 20 20 20  ad(&sCtx);.     
30e30 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
30e40 20 20 7d 77 68 69 6c 65 28 20 73 43 74 78 2e 63    }while( sCtx.c
30e50 54 65 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53  Term==sCtx.cColS
30e60 65 70 20 29 3b 0a 20 20 20 20 20 20 20 20 75 74  ep );.        ut
30e70 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
30e80 2c 20 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74  , "%s:%d: expect
30e90 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75  ed %d columns bu
30ea0 74 20 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20  t found %d - ". 
30eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ec0 20 20 20 20 20 20 20 22 65 78 74 72 61 73 20 69         "extras i
30ed0 67 6e 6f 72 65 64 5c 6e 22 2c 0a 20 20 20 20 20  gnored\n",.     
30ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ef0 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73     sCtx.zFile, s
30f00 74 61 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20  tartLine, nCol, 
30f10 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
30f20 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6c 20 29 7b    if( i>=nCol ){
30f30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30f40 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
30f50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
30f60 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
30f70 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
30f80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30f90 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
30fa0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a  ntf(stderr, "%s:
30fb0 25 64 3a 20 49 4e 53 45 52 54 20 66 61 69 6c 65  %d: INSERT faile
30fc0 64 3a 20 25 73 5c 6e 22 2c 20 73 43 74 78 2e 7a  d: %s\n", sCtx.z
30fd0 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  File,.          
30fe0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 72              star
30ff0 74 4c 69 6e 65 2c 20 73 71 6c 69 74 65 33 5f 65  tLine, sqlite3_e
31000 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
31010 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31020 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 43 74  .    }while( sCt
31030 78 2e 63 54 65 72 6d 21 3d 45 4f 46 20 29 3b 0a  x.cTerm!=EOF );.
31040 0a 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74  .    xCloser(sCt
31050 78 2e 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  x.in);.    sqlit
31060 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b  e3_free(sCtx.z);
31070 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
31080 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
31090 20 20 69 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74    if( needCommit
310a0 20 29 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   ) sqlite3_exec(
310b0 70 2d 3e 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c  p->db, "COMMIT",
310c0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c   0, 0, 0);.  }el
310d0 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
310e0 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20 20  TE_UNTESTABLE.  
310f0 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74  if( c=='i' && st
31100 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
31110 22 69 6d 70 6f 73 74 65 72 22 2c 20 6e 29 3d 3d  "imposter", n)==
31120 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
31130 53 71 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Sql;.    char *z
31140 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20  Collist = 0;.   
31150 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
31160 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 74 6e  Stmt;.    int tn
31170 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  um = 0;.    int 
31180 69 3b 0a 20 20 20 20 69 66 28 20 21 28 6e 41 72  i;.    if( !(nAr
31190 67 3d 3d 33 20 7c 7c 20 28 6e 41 72 67 3d 3d 32  g==3 || (nArg==2
311a0 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69   && sqlite3_stri
311b0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6f 66  cmp(azArg[1],"of
311c0 66 22 29 3d 3d 30 29 29 20 29 7b 0a 20 20 20 20  f")==0)) ){.    
311d0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
311e0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 69  derr, "Usage: .i
311f0 6d 70 6f 73 74 65 72 20 49 4e 44 45 58 20 49 4d  mposter INDEX IM
31200 50 4f 53 54 45 52 5c 6e 22 0a 20 20 20 20 20 20  POSTER\n".      
31210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31220 20 20 20 20 22 20 20 20 20 20 20 20 2e 69 6d 70      "       .imp
31230 6f 73 74 65 72 20 6f 66 66 5c 6e 22 29 3b 0a 20  oster off\n");. 
31240 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
31250 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
31260 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
31270 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
31280 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  0);.    if( nArg
31290 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==2 ){.      sql
312a0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
312b0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
312c0 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64  L_IMPOSTER, p->d
312d0 62 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29  b, "main", 0, 1)
312e0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
312f0 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
31300 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d      }.    zSql =
31310 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
31320 28 22 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67  ("SELECT rootpag
31330 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
31340 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  ster".          
31350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31360 20 22 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 25   " WHERE name='%
31370 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64  q' AND type='ind
31380 65 78 27 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  ex'", azArg[1]);
31390 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65  .    sqlite3_pre
313a0 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
313b0 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
313c0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
313d0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
313e0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
313f0 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
31400 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 74 6e  _ROW ){.      tn
31410 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  um = sqlite3_col
31420 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30  umn_int(pStmt, 0
31430 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
31440 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
31450 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 74 6e  tmt);.    if( tn
31460 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  um==0 ){.      u
31470 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
31480 72 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  r, "no such inde
31490 78 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  x: \"%s\"\n", az
314a0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72  Arg[1]);.      r
314b0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
314c0 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
314d0 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  xit;.    }.    z
314e0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
314f0 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 69 6e  rintf("PRAGMA in
31500 64 65 78 5f 78 69 6e 66 6f 3d 27 25 71 27 22 2c  dex_xinfo='%q'",
31510 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
31520 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
31530 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
31540 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
31550 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
31560 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
31570 20 69 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c   i = 0;.    whil
31580 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
31590 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
315a0 4f 57 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  OW ){.      char
315b0 20 7a 4c 61 62 65 6c 5b 32 30 5d 3b 0a 20 20 20   zLabel[20];.   
315c0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
315d0 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Col = (const cha
315e0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
315f0 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29 3b  n_text(pStmt,2);
31600 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
31610 20 20 69 66 28 20 7a 43 6f 6c 3d 3d 30 20 29 7b    if( zCol==0 ){
31620 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
31630 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
31640 70 53 74 6d 74 2c 31 29 3d 3d 2d 31 20 29 7b 0a  pStmt,1)==-1 ){.
31650 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d            zCol =
31660 20 22 5f 52 4f 57 49 44 5f 22 3b 0a 20 20 20 20   "_ROWID_";.    
31670 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31680 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
31690 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 61  rintf(sizeof(zLa
316a0 62 65 6c 29 2c 7a 4c 61 62 65 6c 2c 22 65 78 70  bel),zLabel,"exp
316b0 72 25 64 22 2c 69 29 3b 0a 20 20 20 20 20 20 20  r%d",i);.       
316c0 20 20 20 7a 43 6f 6c 20 3d 20 7a 4c 61 62 65 6c     zCol = zLabel
316d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
316e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 43    }.      if( zC
316f0 6f 6c 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  ollist==0 ){.   
31700 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20       zCollist = 
31710 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
31720 22 5c 22 25 77 5c 22 22 2c 20 7a 43 6f 6c 29 3b  "\"%w\"", zCol);
31730 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31740 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d        zCollist =
31750 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
31760 28 22 25 7a 2c 5c 22 25 77 5c 22 22 2c 20 7a 43  ("%z,\"%w\"", zC
31770 6f 6c 6c 69 73 74 2c 20 7a 43 6f 6c 29 3b 0a 20  ollist, zCol);. 
31780 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
31790 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
317a0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53  e(pStmt);.    zS
317b0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
317c0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
317d0 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22  "CREATE TABLE \"
317e0 25 77 5c 22 28 25 73 2c 50 52 49 4d 41 52 59 20  %w\"(%s,PRIMARY 
317f0 4b 45 59 28 25 73 29 29 57 49 54 48 4f 55 54 20  KEY(%s))WITHOUT 
31800 52 4f 57 49 44 22 2c 0a 20 20 20 20 20 20 20 20  ROWID",.        
31810 20 20 61 7a 41 72 67 5b 32 5d 2c 20 7a 43 6f 6c    azArg[2], zCol
31820 6c 69 73 74 2c 20 7a 43 6f 6c 6c 69 73 74 29 3b  list, zCollist);
31830 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
31840 65 28 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20  e(zCollist);.   
31850 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65   rc = sqlite3_te
31860 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
31870 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
31880 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69  TER, p->db, "mai
31890 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20  n", 1, tnum);.  
318a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
318b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
318c0 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
318d0 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30  ->db, zSql, 0, 0
318e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
318f0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
31900 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
31910 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62  _IMPOSTER, p->db
31920 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b  , "main", 0, 0);
31930 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
31940 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
31950 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
31960 72 6f 72 20 69 6e 20 5b 25 73 5d 3a 20 25 73 5c  ror in [%s]: %s\
31970 6e 22 2c 20 7a 53 71 6c 2c 20 73 71 6c 69 74 65  n", zSql, sqlite
31980 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
31990 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
319a0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
319b0 74 66 28 73 74 64 6f 75 74 2c 20 22 25 73 3b 5c  tf(stdout, "%s;\
319c0 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  n", zSql);.     
319d0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
319e0 64 6f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  dout,.          
319f0 20 22 57 41 52 4e 49 4e 47 3a 20 77 72 69 74 69   "WARNING: writi
31a00 6e 67 20 74 6f 20 61 6e 20 69 6d 70 6f 73 74 65  ng to an imposte
31a10 72 20 74 61 62 6c 65 20 77 69 6c 6c 20 63 6f 72  r table will cor
31a20 72 75 70 74 20 74 68 65 20 69 6e 64 65 78 21 5c  rupt the index!\
31a30 6e 22 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  n".        );.  
31a40 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
31a50 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
31a60 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 49 54  f(stderr, "SQLIT
31a70 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
31a80 54 45 52 20 72 65 74 75 72 6e 73 20 25 64 5c 6e  TER returns %d\n
31a90 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 63  ", rc);.      rc
31aa0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
31ab0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
31ac0 6c 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  l);.  }else.#end
31ad0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
31ae0 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 53 54 5f  QLITE_OMIT_TEST_
31af0 43 4f 4e 54 52 4f 4c 29 20 2a 2f 0a 0a 23 69 66  CONTROL) */..#if
31b00 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
31b10 45 5f 49 4f 54 52 41 43 45 0a 20 20 69 66 28 20  E_IOTRACE.  if( 
31b20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d  c=='i' && strncm
31b30 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6f 74  p(azArg[0], "iot
31b40 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  race", n)==0 ){.
31b50 20 20 20 20 53 51 4c 49 54 45 5f 41 50 49 20 65      SQLITE_API e
31b60 78 74 65 72 6e 20 76 6f 69 64 20 28 53 51 4c 49  xtern void (SQLI
31b70 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74 65  TE_CDECL *sqlite
31b80 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20  3IoTrace)(const 
31b90 63 68 61 72 2a 2c 20 2e 2e 2e 29 3b 0a 20 20 20  char*, ...);.   
31ba0 20 69 66 28 20 69 6f 74 72 61 63 65 20 26 26 20   if( iotrace && 
31bb0 69 6f 74 72 61 63 65 21 3d 73 74 64 6f 75 74 20  iotrace!=stdout 
31bc0 29 20 66 63 6c 6f 73 65 28 69 6f 74 72 61 63 65  ) fclose(iotrace
31bd0 29 3b 0a 20 20 20 20 69 6f 74 72 61 63 65 20 3d  );.    iotrace =
31be0 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   0;.    if( nArg
31bf0 3c 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <2 ){.      sqli
31c00 74 65 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a  te3IoTrace = 0;.
31c10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
31c20 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22  rcmp(azArg[1], "
31c30 2d 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -")==0 ){.      
31c40 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d  sqlite3IoTrace =
31c50 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66 3b 0a   iotracePrintf;.
31c60 20 20 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20        iotrace = 
31c70 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73  stdout;.    }els
31c80 65 7b 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65  e{.      iotrace
31c90 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31   = fopen(azArg[1
31ca0 5d 2c 20 22 77 22 29 3b 0a 20 20 20 20 20 20 69  ], "w");.      i
31cb0 66 28 20 69 6f 74 72 61 63 65 3d 3d 30 20 29 7b  f( iotrace==0 ){
31cc0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
31cd0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
31ce0 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
31cf0 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
31d00 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  g[1]);.        s
31d10 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20  qlite3IoTrace = 
31d20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
31d30 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
31d40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
31d50 6f 54 72 61 63 65 20 3d 20 69 6f 74 72 61 63 65  oTrace = iotrace
31d60 50 72 69 6e 74 66 3b 0a 20 20 20 20 20 20 7d 0a  Printf;.      }.
31d70 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
31d80 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27  ndif..  if( c=='
31d90 6c 27 20 26 26 20 6e 3e 3d 35 20 26 26 20 73 74  l' && n>=5 && st
31da0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
31db0 22 6c 69 6d 69 74 73 22 2c 20 6e 29 3d 3d 30 20  "limits", n)==0 
31dc0 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
31dd0 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
31de0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
31df0 7a 4c 69 6d 69 74 4e 61 6d 65 3b 20 20 20 2f 2a  zLimitName;   /*
31e00 20 4e 61 6d 65 20 6f 66 20 61 20 6c 69 6d 69 74   Name of a limit
31e10 20 2a 2f 0a 20 20 20 20 20 20 20 69 6e 74 20 6c   */.       int l
31e20 69 6d 69 74 43 6f 64 65 3b 20 20 20 20 20 20 20  imitCode;       
31e30 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
31e40 63 6f 64 65 20 66 6f 72 20 74 68 61 74 20 6c 69  code for that li
31e50 6d 69 74 20 2a 2f 0a 20 20 20 20 7d 20 61 4c 69  mit */.    } aLi
31e60 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  mit[] = {.      
31e70 7b 20 22 6c 65 6e 67 74 68 22 2c 20 20 20 20 20  { "length",     
31e80 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
31e90 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20  E_LIMIT_LENGTH  
31ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31eb0 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 71    },.      { "sq
31ec0 6c 5f 6c 65 6e 67 74 68 22 2c 20 20 20 20 20 20  l_length",      
31ed0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
31ee0 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20  IT_SQL_LENGTH   
31ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
31f00 20 20 20 20 20 20 7b 20 22 63 6f 6c 75 6d 6e 22        { "column"
31f10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31f20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f   SQLITE_LIMIT_CO
31f30 4c 55 4d 4e 20 20 20 20 20 20 20 20 20 20 20 20  LUMN            
31f40 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
31f50 20 7b 20 22 65 78 70 72 5f 64 65 70 74 68 22 2c   { "expr_depth",
31f60 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
31f70 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45  TE_LIMIT_EXPR_DE
31f80 50 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20  PTH             
31f90 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63     },.      { "c
31fa0 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74 22 2c  ompound_select",
31fb0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
31fc0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
31fd0 45 43 54 20 20 20 20 20 20 20 20 20 20 20 7d 2c  ECT           },
31fe0 0a 20 20 20 20 20 20 7b 20 22 76 64 62 65 5f 6f  .      { "vdbe_o
31ff0 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
32000 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56    SQLITE_LIMIT_V
32010 44 42 45 5f 4f 50 20 20 20 20 20 20 20 20 20 20  DBE_OP          
32020 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
32030 20 20 7b 20 22 66 75 6e 63 74 69 6f 6e 5f 61 72    { "function_ar
32040 67 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c  g",          SQL
32050 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
32060 4f 4e 5f 41 52 47 20 20 20 20 20 20 20 20 20 20  ON_ARG          
32070 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
32080 61 74 74 61 63 68 65 64 22 2c 20 20 20 20 20 20  attached",      
32090 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
320a0 49 4d 49 54 5f 41 54 54 41 43 48 45 44 20 20 20  IMIT_ATTACHED   
320b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
320c0 2c 0a 20 20 20 20 20 20 7b 20 22 6c 69 6b 65 5f  ,.      { "like_
320d0 70 61 74 74 65 72 6e 5f 6c 65 6e 67 74 68 22 2c  pattern_length",
320e0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
320f0 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
32100 47 54 48 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  GTH       },.   
32110 20 20 20 7b 20 22 76 61 72 69 61 62 6c 65 5f 6e     { "variable_n
32120 75 6d 62 65 72 22 2c 20 20 20 20 20 20 20 53 51  umber",       SQ
32130 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
32140 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20 20 20 20  BLE_NUMBER      
32150 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
32160 22 74 72 69 67 67 65 72 5f 64 65 70 74 68 22 2c  "trigger_depth",
32170 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
32180 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
32190 50 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20  PTH             
321a0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 6f 72 6b  },.      { "work
321b0 65 72 5f 74 68 72 65 61 64 73 22 2c 20 20 20 20  er_threads",    
321c0 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
321d0 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20  _WORKER_THREADS 
321e0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
321f0 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20    };.    int i, 
32200 6e 32 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28  n2;.    open_db(
32210 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  p, 0);.    if( n
32220 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Arg==1 ){.      
32230 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
32240 53 69 7a 65 28 61 4c 69 6d 69 74 29 3b 20 69 2b  Size(aLimit); i+
32250 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e  +){.        prin
32260 74 66 28 22 25 32 30 73 20 25 64 5c 6e 22 2c 20  tf("%20s %d\n", 
32270 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74  aLimit[i].zLimit
32280 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
32290 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d       sqlite3_lim
322a0 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74  it(p->db, aLimit
322b0 5b 69 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d  [i].limitCode, -
322c0 31 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  1));.      }.   
322d0 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3e   }else if( nArg>
322e0 33 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  3 ){.      raw_p
322f0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
32300 73 61 67 65 3a 20 2e 6c 69 6d 69 74 20 4e 41 4d  sage: .limit NAM
32310 45 20 3f 4e 45 57 2d 56 41 4c 55 45 3f 5c 6e 22  E ?NEW-VALUE?\n"
32320 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
32330 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
32340 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
32350 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32360 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  int iLimit = -1;
32370 0a 20 20 20 20 20 20 6e 32 20 3d 20 73 74 72 6c  .      n2 = strl
32380 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  en30(azArg[1]);.
32390 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
323a0 3c 41 72 72 61 79 53 69 7a 65 28 61 4c 69 6d 69  <ArraySize(aLimi
323b0 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  t); i++){.      
323c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
323d0 72 6e 69 63 6d 70 28 61 4c 69 6d 69 74 5b 69 5d  rnicmp(aLimit[i]
323e0 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 20 61 7a 41  .zLimitName, azA
323f0 72 67 5b 31 5d 2c 20 6e 32 29 3d 3d 30 20 29 7b  rg[1], n2)==0 ){
32400 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
32410 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20  Limit<0 ){.     
32420 20 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20         iLimit = 
32430 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  i;.          }el
32440 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
32450 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
32460 72 72 2c 20 22 61 6d 62 69 67 75 6f 75 73 20 6c  rr, "ambiguous l
32470 69 6d 69 74 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c  imit: \"%s\"\n",
32480 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
32490 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
324a0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
324b0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
324c0 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  it;.          }.
324d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
324e0 7d 0a 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d  }.      if( iLim
324f0 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  it<0 ){.        
32500 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
32510 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d  rr, "unknown lim
32520 69 74 3a 20 5c 22 25 73 5c 22 5c 6e 22 0a 20 20  it: \"%s\"\n".  
32530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32540 20 20 20 20 20 20 22 65 6e 74 65 72 20 5c 22 2e        "enter \".
32550 6c 69 6d 69 74 73 5c 22 20 77 69 74 68 20 6e 6f  limits\" with no
32560 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 61   arguments for a
32570 20 6c 69 73 74 2e 5c 6e 22 2c 0a 20 20 20 20 20   list.\n",.     
32580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32590 20 20 20 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20      azArg[1]);. 
325a0 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
325b0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
325c0 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
325d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
325e0 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20   nArg==3 ){.    
325f0 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69      sqlite3_limi
32600 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b  t(p->db, aLimit[
32610 69 4c 69 6d 69 74 5d 2e 6c 69 6d 69 74 43 6f 64  iLimit].limitCod
32620 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
32630 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 69 6e           (int)in
32640 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
32650 5b 32 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [2]));.      }. 
32660 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 32 30       printf("%20
32670 73 20 25 64 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b  s %d\n", aLimit[
32680 69 4c 69 6d 69 74 5d 2e 7a 4c 69 6d 69 74 4e 61  iLimit].zLimitNa
32690 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
326a0 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70   sqlite3_limit(p
326b0 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69  ->db, aLimit[iLi
326c0 6d 69 74 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 20  mit].limitCode, 
326d0 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  -1));.    }.  }e
326e0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c  lse..  if( c=='l
326f0 27 20 26 26 20 6e 3e 32 20 26 26 20 73 74 72 6e  ' && n>2 && strn
32700 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c  cmp(azArg[0], "l
32710 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  int", n)==0 ){. 
32720 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
32730 3b 0a 20 20 20 20 6c 69 6e 74 44 6f 74 43 6f 6d  ;.    lintDotCom
32740 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e  mand(p, azArg, n
32750 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23  Arg);.  }else..#
32760 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32770 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
32780 4e 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26  N.  if( c=='l' &
32790 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
327a0 30 5d 2c 20 22 6c 6f 61 64 22 2c 20 6e 29 3d 3d  0], "load", n)==
327b0 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
327c0 68 61 72 20 2a 7a 46 69 6c 65 2c 20 2a 7a 50 72  har *zFile, *zPr
327d0 6f 63 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  oc;.    char *zE
327e0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69  rrMsg = 0;.    i
327f0 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20  f( nArg<2 ){.   
32800 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
32810 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c  derr, "Usage: .l
32820 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54 52 59 50  oad FILE ?ENTRYP
32830 4f 49 4e 54 3f 5c 6e 22 29 3b 0a 20 20 20 20 20  OINT?\n");.     
32840 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
32850 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
32860 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
32870 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31   zFile = azArg[1
32880 5d 3b 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 6e  ];.    zProc = n
32890 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32  Arg>=3 ? azArg[2
328a0 5d 20 3a 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f  ] : 0;.    open_
328b0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63  db(p, 0);.    rc
328c0 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f   = sqlite3_load_
328d0 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c  extension(p->db,
328e0 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26   zFile, zProc, &
328f0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
32900 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32910 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
32920 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
32930 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ror: %s\n", zErr
32940 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Msg);.      sqli
32950 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
32960 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
32970 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
32980 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d  endif..  if( c==
32990 27 6c 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'l' && strncmp(a
329a0 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 67 22 2c 20  zArg[0], "log", 
329b0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
329c0 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20   nArg!=2 ){.    
329d0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
329e0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f  err, "Usage: .lo
329f0 67 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a  g FILENAME\n");.
32a00 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
32a10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
32a20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
32a30 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20   = azArg[1];.   
32a40 20 20 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63     output_file_c
32a50 6c 6f 73 65 28 70 2d 3e 70 4c 6f 67 29 3b 0a 20  lose(p->pLog);. 
32a60 20 20 20 20 20 70 2d 3e 70 4c 6f 67 20 3d 20 6f       p->pLog = o
32a70 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28  utput_file_open(
32a80 7a 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 7d  zFile, 0);.    }
32a90 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
32aa0 63 3d 3d 27 6d 27 20 26 26 20 73 74 72 6e 63 6d  c=='m' && strncm
32ab0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f 64  p(azArg[0], "mod
32ac0 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
32ad0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f   const char *zMo
32ae0 64 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61  de = nArg>=2 ? a
32af0 7a 41 72 67 5b 31 5d 20 3a 20 22 22 3b 0a 20 20  zArg[1] : "";.  
32b00 20 20 69 6e 74 20 6e 32 20 3d 20 73 74 72 6c 65    int n2 = strle
32b10 6e 33 30 28 7a 4d 6f 64 65 29 3b 0a 20 20 20 20  n30(zMode);.    
32b20 69 6e 74 20 63 32 20 3d 20 7a 4d 6f 64 65 5b 30  int c2 = zMode[0
32b30 5d 3b 0a 20 20 20 20 69 66 28 20 63 32 3d 3d 27  ];.    if( c2=='
32b40 6c 27 20 26 26 20 6e 32 3e 32 20 26 26 20 73 74  l' && n2>2 && st
32b50 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
32b60 6c 69 6e 65 73 22 2c 6e 32 29 3d 3d 30 20 29 7b  lines",n2)==0 ){
32b70 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
32b80 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20 20 20   MODE_Line;.    
32b90 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
32ba0 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77  tf(sizeof(p->row
32bb0 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72  Separator), p->r
32bc0 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  owSeparator, SEP
32bd0 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _Row);.    }else
32be0 20 69 66 28 20 63 32 3d 3d 27 63 27 20 26 26 20   if( c2=='c' && 
32bf0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
32c00 2c 22 63 6f 6c 75 6d 6e 73 22 2c 6e 32 29 3d 3d  ,"columns",n2)==
32c10 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
32c20 64 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e  de = MODE_Column
32c30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
32c40 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
32c50 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
32c60 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
32c70 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20  r, SEP_Row);.   
32c80 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
32c90 6c 27 20 26 26 20 6e 32 3e 32 20 26 26 20 73 74  l' && n2>2 && st
32ca0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
32cb0 6c 69 73 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  list",n2)==0 ){.
32cc0 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
32cd0 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 20  MODE_List;.     
32ce0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
32cf0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53  f(sizeof(p->colS
32d00 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f  eparator), p->co
32d10 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  lSeparator, SEP_
32d20 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73  Column);.      s
32d30 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
32d40 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
32d50 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
32d60 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f  eparator, SEP_Ro
32d70 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  w);.    }else if
32d80 28 20 63 32 3d 3d 27 68 27 20 26 26 20 73 74 72  ( c2=='h' && str
32d90 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 68  ncmp(azArg[1],"h
32da0 74 6d 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  tml",n2)==0 ){. 
32db0 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
32dc0 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20 20 20 7d 65  ODE_Html;.    }e
32dd0 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 74 27 20  lse if( c2=='t' 
32de0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
32df0 5b 31 5d 2c 22 74 63 6c 22 2c 6e 32 29 3d 3d 30  [1],"tcl",n2)==0
32e00 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
32e10 65 20 3d 20 4d 4f 44 45 5f 54 63 6c 3b 0a 20 20  e = MODE_Tcl;.  
32e20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
32e30 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63  intf(sizeof(p->c
32e40 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  olSeparator), p-
32e50 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53  >colSeparator, S
32e60 45 50 5f 53 70 61 63 65 29 3b 0a 20 20 20 20 20  EP_Space);.     
32e70 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
32e80 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53  f(sizeof(p->rowS
32e90 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f  eparator), p->ro
32ea0 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  wSeparator, SEP_
32eb0 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Row);.    }else 
32ec0 69 66 28 20 63 32 3d 3d 27 63 27 20 26 26 20 73  if( c2=='c' && s
32ed0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
32ee0 22 63 73 76 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  "csv",n2)==0 ){.
32ef0 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
32f00 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20 20 20 20  MODE_Csv;.      
32f10 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
32f20 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65  (sizeof(p->colSe
32f30 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c  parator), p->col
32f40 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43  Separator, SEP_C
32f50 6f 6d 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  omma);.      sql
32f60 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
32f70 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
32f80 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70  ator), p->rowSep
32f90 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66  arator, SEP_CrLf
32fa0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
32fb0 20 63 32 3d 3d 27 74 27 20 26 26 20 73 74 72 6e   c2=='t' && strn
32fc0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 61  cmp(azArg[1],"ta
32fd0 62 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  bs",n2)==0 ){.  
32fe0 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
32ff0 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20 73  DE_List;.      s
33000 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
33010 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70  sizeof(p->colSep
33020 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53  arator), p->colS
33030 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 54 61  eparator, SEP_Ta
33040 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  b);.    }else if
33050 28 20 63 32 3d 3d 27 69 27 20 26 26 20 73 74 72  ( c2=='i' && str
33060 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 69  ncmp(azArg[1],"i
33070 6e 73 65 72 74 22 2c 6e 32 29 3d 3d 30 20 29 7b  nsert",n2)==0 ){
33080 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
33090 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20   MODE_Insert;.  
330a0 20 20 20 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61      set_table_na
330b0 6d 65 28 70 2c 20 6e 41 72 67 3e 3d 33 20 3f 20  me(p, nArg>=3 ? 
330c0 61 7a 41 72 67 5b 32 5d 20 3a 20 22 74 61 62 6c  azArg[2] : "tabl
330d0 65 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  e");.    }else i
330e0 66 28 20 63 32 3d 3d 27 71 27 20 26 26 20 73 74  f( c2=='q' && st
330f0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
33100 71 75 6f 74 65 22 2c 6e 32 29 3d 3d 30 20 29 7b  quote",n2)==0 ){
33110 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
33120 20 4d 4f 44 45 5f 51 75 6f 74 65 3b 0a 20 20 20   MODE_Quote;.   
33130 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
33140 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  a' && strncmp(az
33150 41 72 67 5b 31 5d 2c 22 61 73 63 69 69 22 2c 6e  Arg[1],"ascii",n
33160 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
33170 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 41 73  ->mode = MODE_As
33180 63 69 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  cii;.      sqlit
33190 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
331a0 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  of(p->colSeparat
331b0 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  or), p->colSepar
331c0 61 74 6f 72 2c 20 53 45 50 5f 55 6e 69 74 29 3b  ator, SEP_Unit);
331d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
331e0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
331f0 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c  ->rowSeparator),
33200 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
33210 2c 20 53 45 50 5f 52 65 63 6f 72 64 29 3b 0a 20  , SEP_Record);. 
33220 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72     }else if( nAr
33230 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61  g==1 ){.      ra
33240 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
33250 20 22 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74   "current output
33260 20 6d 6f 64 65 3a 20 25 73 5c 6e 22 2c 20 6d 6f   mode: %s\n", mo
33270 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d  deDescr[p->mode]
33280 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
33290 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
332a0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d  tderr, "Error: m
332b0 6f 64 65 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e  ode should be on
332c0 65 20 6f 66 3a 20 22 0a 20 20 20 20 20 20 20 20  e of: ".        
332d0 20 22 61 73 63 69 69 20 63 6f 6c 75 6d 6e 20 63   "ascii column c
332e0 73 76 20 68 74 6d 6c 20 69 6e 73 65 72 74 20 6c  sv html insert l
332f0 69 6e 65 20 6c 69 73 74 20 71 75 6f 74 65 20 74  ine list quote t
33300 61 62 73 20 74 63 6c 5c 6e 22 29 3b 0a 20 20 20  abs tcl\n");.   
33310 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
33320 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20  .    p->cMode = 
33330 70 2d 3e 6d 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  p->mode;.  }else
33340 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6e 27 20 26  ..  if( c=='n' &
33350 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
33360 30 5d 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c  0], "nullvalue",
33370 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
33380 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
33390 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
333a0 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6e 75  ntf(sizeof(p->nu
333b0 6c 6c 56 61 6c 75 65 29 2c 20 70 2d 3e 6e 75 6c  llValue), p->nul
333c0 6c 56 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20  lValue,.        
333d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
333e0 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61  %.*s", (int)Arra
333f0 79 53 69 7a 65 28 70 2d 3e 6e 75 6c 6c 56 61 6c  ySize(p->nullVal
33400 75 65 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29  ue)-1, azArg[1])
33410 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
33420 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
33430 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6e  derr, "Usage: .n
33440 75 6c 6c 76 61 6c 75 65 20 53 54 52 49 4e 47 5c  ullvalue STRING\
33450 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
33460 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
33470 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6f 27 20 26  ..  if( c=='o' &
33480 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
33490 30 5d 2c 20 22 6f 70 65 6e 22 2c 20 6e 29 3d 3d  0], "open", n)==
334a0 30 20 26 26 20 6e 3e 3d 32 20 29 7b 0a 20 20 20  0 && n>=2 ){.   
334b0 20 63 68 61 72 20 2a 7a 4e 65 77 46 69 6c 65 6e   char *zNewFilen
334c0 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame;  /* Name of
334d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
334e0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
334f0 20 20 69 6e 74 20 69 4e 61 6d 65 20 3d 20 31 3b    int iName = 1;
33500 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
33510 69 6e 20 61 7a 41 72 67 5b 5d 20 6f 66 20 74 68  in azArg[] of th
33520 65 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20  e filename */.  
33530 20 20 69 6e 74 20 6e 65 77 46 6c 61 67 20 3d 20    int newFlag = 
33540 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74  0;     /* True t
33550 6f 20 64 65 6c 65 74 65 20 66 69 6c 65 20 62 65  o delete file be
33560 66 6f 72 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a  fore opening */.
33570 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65      /* Close the
33580 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
33590 73 65 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f  se */.    sessio
335a0 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 70 29 3b 0a  n_close_all(p);.
335b0 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 2d 3e      close_db(p->
335c0 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d  db);.    p->db =
335d0 20 30 3b 0a 20 20 20 20 70 2d 3e 7a 44 62 46 69   0;.    p->zDbFi
335e0 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  lename = 0;.    
335f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
33600 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20  zFreeOnClose);. 
33610 20 20 20 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f     p->zFreeOnClo
33620 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6f  se = 0;.    p->o
33630 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f  penMode = SHELL_
33640 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 20  OPEN_UNSPEC;.   
33650 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f   /* Check for co
33660 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d  mmand-line argum
33670 65 6e 74 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ents */.    for(
33680 69 4e 61 6d 65 3d 31 3b 20 69 4e 61 6d 65 3c 6e  iName=1; iName<n
33690 41 72 67 20 26 26 20 61 7a 41 72 67 5b 69 4e 61  Arg && azArg[iNa
336a0 6d 65 5d 5b 30 5d 3d 3d 27 2d 27 3b 20 69 4e 61  me][0]=='-'; iNa
336b0 6d 65 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e  me++){.      con
336c0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41  st char *z = azA
336d0 72 67 5b 69 4e 61 6d 65 5d 3b 0a 20 20 20 20 20  rg[iName];.     
336e0 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68   if( optionMatch
336f0 28 7a 2c 22 6e 65 77 22 29 20 29 7b 0a 20 20 20  (z,"new") ){.   
33700 20 20 20 20 20 6e 65 77 46 6c 61 67 20 3d 20 31       newFlag = 1
33710 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
33720 48 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20 20 20  HAVE_ZLIB.      
33730 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e  }else if( option
33740 4d 61 74 63 68 28 7a 2c 20 22 7a 69 70 22 29 20  Match(z, "zip") 
33750 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70  ){.        p->op
33760 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f  enMode = SHELL_O
33770 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 23 65 6e  PEN_ZIPFILE;.#en
33780 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  dif.      }else 
33790 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28  if( optionMatch(
337a0 7a 2c 20 22 61 70 70 65 6e 64 22 29 20 29 7b 0a  z, "append") ){.
337b0 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d          p->openM
337c0 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e  ode = SHELL_OPEN
337d0 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20 20 20  _APPENDVFS;.    
337e0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69    }else if( opti
337f0 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 72 65 61 64  onMatch(z, "read
33800 6f 6e 6c 79 22 29 20 29 7b 0a 20 20 20 20 20 20  only") ){.      
33810 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20    p->openMode = 
33820 53 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f  SHELL_OPEN_READO
33830 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  NLY;.#ifdef SQLI
33840 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49  TE_ENABLE_DESERI
33850 41 4c 49 5a 45 0a 20 20 20 20 20 20 7d 65 6c 73  ALIZE.      }els
33860 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63  e if( optionMatc
33870 68 28 7a 2c 20 22 64 65 73 65 72 69 61 6c 69 7a  h(z, "deserializ
33880 65 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  e") ){.        p
33890 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45  ->openMode = SHE
338a0 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c  LL_OPEN_DESERIAL
338b0 49 5a 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  IZE;.#endif.    
338c0 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d    }else if( z[0]
338d0 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
338e0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
338f0 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  err, "unknown op
33900 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b  tion: %s\n", z);
33910 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
33920 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
33930 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
33940 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
33950 20 20 20 2f 2a 20 49 66 20 61 20 66 69 6c 65 6e     /* If a filen
33960 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
33970 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 69 74  , try to open it
33980 20 66 69 72 73 74 20 2a 2f 0a 20 20 20 20 7a 4e   first */.    zN
33990 65 77 46 69 6c 65 6e 61 6d 65 20 3d 20 6e 41 72  ewFilename = nAr
339a0 67 3e 69 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65  g>iName ? sqlite
339b0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
339c0 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 29 20 3a 20  azArg[iName]) : 
339d0 30 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 46  0;.    if( zNewF
339e0 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ilename ){.     
339f0 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20 73   if( newFlag ) s
33a00 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 7a  hellDeleteFile(z
33a10 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  NewFilename);.  
33a20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61      p->zDbFilena
33a30 6d 65 20 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d  me = zNewFilenam
33a40 65 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64 62  e;.      open_db
33a50 28 70 2c 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50  (p, OPEN_DB_KEEP
33a60 41 4c 49 56 45 29 3b 0a 20 20 20 20 20 20 69 66  ALIVE);.      if
33a70 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20  ( p->db==0 ){.  
33a80 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
33a90 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
33aa0 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 27 25  : cannot open '%
33ab0 73 27 5c 6e 22 2c 20 7a 4e 65 77 46 69 6c 65 6e  s'\n", zNewFilen
33ac0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ame);.        sq
33ad0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 65 77 46  lite3_free(zNewF
33ae0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
33af0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
33b00 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d  ->zFreeOnClose =
33b10 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 0a 20   zNewFilename;. 
33b20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
33b30 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b   if( p->db==0 ){
33b40 0a 20 20 20 20 20 20 2f 2a 20 41 73 20 61 20 66  .      /* As a f
33b50 61 6c 6c 2d 62 61 63 6b 20 6f 70 65 6e 20 61 20  all-back open a 
33b60 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f  TEMP database */
33b70 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c  .      p->zDbFil
33b80 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  ename = 0;.     
33b90 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
33ba0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
33bb0 20 69 66 28 20 28 63 3d 3d 27 6f 27 0a 20 20 20   if( (c=='o'.   
33bc0 20 20 20 20 20 26 26 20 28 73 74 72 6e 63 6d 70       && (strncmp
33bd0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 75 74 70  (azArg[0], "outp
33be0 75 74 22 2c 20 6e 29 3d 3d 30 7c 7c 73 74 72 6e  ut", n)==0||strn
33bf0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f  cmp(azArg[0], "o
33c00 6e 63 65 22 2c 20 6e 29 3d 3d 30 29 29 0a 20 20  nce", n)==0)).  
33c10 20 7c 7c 20 28 63 3d 3d 27 65 27 20 26 26 20 6e   || (c=='e' && n
33c20 3d 3d 35 20 26 26 20 73 74 72 63 6d 70 28 61 7a  ==5 && strcmp(az
33c30 41 72 67 5b 30 5d 2c 22 65 78 63 65 6c 22 29 3d  Arg[0],"excel")=
33c40 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  =0).  ){.    con
33c50 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d  st char *zFile =
33c60 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67   nArg>=2 ? azArg
33c70 5b 31 5d 20 3a 20 22 73 74 64 6f 75 74 22 3b 0a  [1] : "stdout";.
33c80 20 20 20 20 69 6e 74 20 62 54 78 74 4d 6f 64 65      int bTxtMode
33c90 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 61 7a   = 0;.    if( az
33ca0 41 72 67 5b 30 5d 5b 30 5d 3d 3d 27 65 27 20 29  Arg[0][0]=='e' )
33cb0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73  {.      /* Trans
33cc0 66 6f 72 6d 20 74 68 65 20 22 2e 65 78 63 65 6c  form the ".excel
33cd0 22 20 63 6f 6d 6d 61 6e 64 20 69 6e 74 6f 20 22  " command into "
33ce0 2e 6f 6e 63 65 20 2d 78 22 20 2a 2f 0a 20 20 20  .once -x" */.   
33cf0 20 20 20 6e 41 72 67 20 3d 20 32 3b 0a 20 20 20     nArg = 2;.   
33d00 20 20 20 61 7a 41 72 67 5b 30 5d 20 3d 20 22 6f     azArg[0] = "o
33d10 6e 63 65 22 3b 0a 20 20 20 20 20 20 7a 46 69 6c  nce";.      zFil
33d20 65 20 3d 20 61 7a 41 72 67 5b 31 5d 20 3d 20 22  e = azArg[1] = "
33d30 2d 78 22 3b 0a 20 20 20 20 20 20 6e 20 3d 20 34  -x";.      n = 4
33d40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
33d50 6e 41 72 67 3e 32 20 29 7b 0a 20 20 20 20 20 20  nArg>2 ){.      
33d60 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
33d70 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 25 73 20  rr, "Usage: .%s 
33d80 5b 2d 65 7c 2d 78 7c 46 49 4c 45 5d 5c 6e 22 2c  [-e|-x|FILE]\n",
33d90 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20   azArg[0]);.    
33da0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
33db0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
33dc0 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
33dd0 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73 74 72    if( n>1 && str
33de0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
33df0 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  once", n)==0 ){.
33e00 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32        if( nArg<2
33e10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
33e20 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
33e30 55 73 61 67 65 3a 20 2e 6f 6e 63 65 20 28 2d 65  Usage: .once (-e
33e40 7c 2d 78 7c 46 49 4c 45 29 5c 6e 22 29 3b 0a 20  |-x|FILE)\n");. 
33e50 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
33e60 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
33e70 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
33e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
33e90 6f 75 74 43 6f 75 6e 74 20 3d 20 32 3b 0a 20 20  outCount = 2;.  
33ea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
33eb0 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20 30 3b 0a  ->outCount = 0;.
33ec0 20 20 20 20 7d 0a 20 20 20 20 6f 75 74 70 75 74      }.    output
33ed0 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20 69  _reset(p);.    i
33ee0 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 27 2d 27  f( zFile[0]=='-'
33ef0 20 26 26 20 7a 46 69 6c 65 5b 31 5d 3d 3d 27 2d   && zFile[1]=='-
33f00 27 20 29 20 7a 46 69 6c 65 2b 2b 3b 0a 23 69 66  ' ) zFile++;.#if
33f10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41  ndef SQLITE_NOHA
33f20 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20 69 66  VE_SYSTEM.    if
33f30 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20  ( strcmp(zFile, 
33f40 22 2d 65 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63  "-e")==0 || strc
33f50 6d 70 28 7a 46 69 6c 65 2c 20 22 2d 78 22 29 3d  mp(zFile, "-x")=
33f60 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 64  =0 ){.      p->d
33f70 6f 58 64 67 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  oXdgOpen = 1;.  
33f80 20 20 20 20 6f 75 74 70 75 74 4d 6f 64 65 50 75      outputModePu
33f90 73 68 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  sh(p);.      if(
33fa0 20 7a 46 69 6c 65 5b 31 5d 3d 3d 27 78 27 20 29   zFile[1]=='x' )
33fb0 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 54 65 6d  {.        newTem
33fc0 70 46 69 6c 65 28 70 2c 20 22 63 73 76 22 29 3b  pFile(p, "csv");
33fd0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  .        p->mode
33fe0 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20   = MODE_Csv;.   
33ff0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
34000 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
34010 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70  colSeparator), p
34020 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20  ->colSeparator, 
34030 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a 20 20 20 20  SEP_Comma);.    
34040 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
34050 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
34060 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
34070 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
34080 45 50 5f 43 72 4c 66 29 3b 0a 20 20 20 20 20 20  EP_CrLf);.      
34090 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
340a0 65 77 54 65 6d 70 46 69 6c 65 28 70 2c 20 22 74  ewTempFile(p, "t
340b0 78 74 22 29 3b 0a 20 20 20 20 20 20 20 20 62 54  xt");.        bT
340c0 78 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  xtMode = 1;.    
340d0 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 20    }.      zFile 
340e0 3d 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3b 0a  = p->zTempFile;.
340f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
34100 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59  SQLITE_NOHAVE_SY
34110 53 54 45 4d 20 2a 2f 0a 20 20 20 20 69 66 28 20  STEM */.    if( 
34120 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b  zFile[0]=='|' ){
34130 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
34140 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 20 20  MIT_POPEN.      
34150 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
34160 72 2c 20 22 45 72 72 6f 72 3a 20 70 69 70 65 73  r, "Error: pipes
34170 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f 72 74   are not support
34180 65 64 20 69 6e 20 74 68 69 73 20 4f 53 5c 6e 22  ed in this OS\n"
34190 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
341a0 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20  .      p->out = 
341b0 73 74 64 6f 75 74 3b 0a 23 65 6c 73 65 0a 20 20  stdout;.#else.  
341c0 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 70 6f 70      p->out = pop
341d0 65 6e 28 7a 46 69 6c 65 20 2b 20 31 2c 20 22 77  en(zFile + 1, "w
341e0 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ");.      if( p-
341f0 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >out==0 ){.     
34200 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
34210 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 63 61  tderr,"Error: ca
34220 6e 6e 6f 74 20 6f 70 65 6e 20 70 69 70 65 20 5c  nnot open pipe \
34230 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 20  "%s\"\n", zFile 
34240 2b 20 31 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  + 1);.        p-
34250 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  >out = stdout;. 
34260 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
34270 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34280 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
34290 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f  intf(sizeof(p->o
342a0 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66  utfile), p->outf
342b0 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65  ile, "%s", zFile
342c0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
342d0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
342e0 20 20 20 70 2d 3e 6f 75 74 20 3d 20 6f 75 74 70     p->out = outp
342f0 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a 46 69  ut_file_open(zFi
34300 6c 65 2c 20 62 54 78 74 4d 6f 64 65 29 3b 0a 20  le, bTxtMode);. 
34310 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d       if( p->out=
34320 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
34330 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22  ( strcmp(zFile,"
34340 6f 66 66 22 29 21 3d 30 20 29 7b 0a 20 20 20 20  off")!=0 ){.    
34350 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
34360 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
34370 20 63 61 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f   cannot write to
34380 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c   \"%s\"\n", zFil
34390 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
343a0 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73        p->out = s
343b0 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72  tdout;.        r
343c0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20 65  c = 1;.      } e
343d0 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 71  lse {.        sq
343e0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
343f0 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65  izeof(p->outfile
34400 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22  ), p->outfile, "
34410 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20  %s", zFile);.   
34420 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
34430 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70 27  se..  if( c=='p'
34440 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
34450 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70  cmp(azArg[0], "p
34460 72 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  rint", n)==0 ){.
34470 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
34480 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20  or(i=1; i<nArg; 
34490 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
344a0 69 3e 31 20 29 20 72 61 77 5f 70 72 69 6e 74 66  i>1 ) raw_printf
344b0 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29 3b 0a 20  (p->out, " ");. 
344c0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
344d0 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 61  (p->out, "%s", a
344e0 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  zArg[i]);.    }.
344f0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
34500 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  ->out, "\n");.  
34510 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
34520 27 70 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'p' && strncmp(a
34530 7a 41 72 67 5b 30 5d 2c 20 22 70 72 6f 6d 70 74  zArg[0], "prompt
34540 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
34550 69 66 28 20 6e 41 72 67 20 3e 3d 20 32 29 20 7b  if( nArg >= 2) {
34560 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 6d  .      strncpy(m
34570 61 69 6e 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b  ainPrompt,azArg[
34580 31 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69 7a  1],(int)ArraySiz
34590 65 28 6d 61 69 6e 50 72 6f 6d 70 74 29 2d 31 29  e(mainPrompt)-1)
345a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
345b0 6e 41 72 67 20 3e 3d 20 33 29 20 7b 0a 20 20 20  nArg >= 3) {.   
345c0 20 20 20 73 74 72 6e 63 70 79 28 63 6f 6e 74 69     strncpy(conti
345d0 6e 75 65 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b  nuePrompt,azArg[
345e0 32 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69 7a  2],(int)ArraySiz
345f0 65 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74  e(continuePrompt
34600 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  )-1);.    }.  }e
34610 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 71  lse..  if( c=='q
34620 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
34630 72 67 5b 30 5d 2c 20 22 71 75 69 74 22 2c 20 6e  rg[0], "quit", n
34640 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
34650 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69   2;.  }else..  i
34660 66 28 20 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d  f( c=='r' && n>=
34670 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
34680 72 67 5b 30 5d 2c 20 22 72 65 61 64 22 2c 20 6e  rg[0], "read", n
34690 29 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45  )==0 ){.    FILE
346a0 20 2a 61 6c 74 3b 0a 20 20 20 20 69 66 28 20 6e   *alt;.    if( n
346b0 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg!=2 ){.      
346c0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
346d0 72 2c 20 22 55 73 61 67 65 3a 20 2e 72 65 61 64  r, "Usage: .read
346e0 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20   FILE\n");.     
346f0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
34700 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
34710 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
34720 20 61 6c 74 20 3d 20 66 6f 70 65 6e 28 61 7a 41   alt = fopen(azA
34730 72 67 5b 31 5d 2c 20 22 72 62 22 29 3b 0a 20 20  rg[1], "rb");.  
34740 20 20 69 66 28 20 61 6c 74 3d 3d 30 20 29 7b 0a    if( alt==0 ){.
34750 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
34760 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
34770 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
34780 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d  s\"\n", azArg[1]
34790 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
347a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
347b0 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f 69    rc = process_i
347c0 6e 70 75 74 28 70 2c 20 61 6c 74 29 3b 0a 20 20  nput(p, alt);.  
347d0 20 20 20 20 66 63 6c 6f 73 65 28 61 6c 74 29 3b      fclose(alt);
347e0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
347f0 20 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20    if( c=='r' && 
34800 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
34810 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65 73 74 6f  azArg[0], "resto
34820 72 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  re", n)==0 ){.  
34830 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
34840 72 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  rcFile;.    cons
34850 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20  t char *zDb;.   
34860 20 73 71 6c 69 74 65 33 20 2a 70 53 72 63 3b 0a   sqlite3 *pSrc;.
34870 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
34880 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20  up *pBackup;.   
34890 20 69 6e 74 20 6e 54 69 6d 65 6f 75 74 20 3d 20   int nTimeout = 
348a0 30 3b 0a 0a 20 20 20 20 69 66 28 20 6e 41 72 67  0;..    if( nArg
348b0 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 7a 53 72  ==2 ){.      zSr
348c0 63 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d  cFile = azArg[1]
348d0 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 22 6d  ;.      zDb = "m
348e0 61 69 6e 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ain";.    }else 
348f0 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20  if( nArg==3 ){. 
34900 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20       zSrcFile = 
34910 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 20 20  azArg[2];.      
34920 7a 44 62 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  zDb = azArg[1];.
34930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34940 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
34950 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 72 65 73  rr, "Usage: .res
34960 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45 5c 6e  tore ?DB? FILE\n
34970 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
34980 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
34990 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
349a0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
349b0 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 53 72 63  qlite3_open(zSrc
349c0 46 69 6c 65 2c 20 26 70 53 72 63 29 3b 0a 20 20  File, &pSrc);.  
349d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
349e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66  _OK ){.      utf
349f0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
34a00 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
34a10 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
34a20 7a 53 72 63 46 69 6c 65 29 3b 0a 20 20 20 20 20  zSrcFile);.     
34a30 20 63 6c 6f 73 65 5f 64 62 28 70 53 72 63 29 3b   close_db(pSrc);
34a40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
34a50 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
34a60 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70 42  db(p, 0);.    pB
34a70 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f  ackup = sqlite3_
34a80 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 2d 3e 64  backup_init(p->d
34a90 62 2c 20 7a 44 62 2c 20 70 53 72 63 2c 20 22 6d  b, zDb, pSrc, "m
34aa0 61 69 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 70  ain");.    if( p
34ab0 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20  Backup==0 ){.   
34ac0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
34ad0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
34ae0 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
34af0 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
34b00 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 53 72      close_db(pSr
34b10 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  c);.      return
34b20 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68   1;.    }.    wh
34b30 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74  ile( (rc = sqlit
34b40 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70  e3_backup_step(p
34b50 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51  Backup,100))==SQ
34b60 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20  LITE_OK.        
34b70 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f    || rc==SQLITE_
34b80 42 55 53 59 20 20 29 7b 0a 20 20 20 20 20 20 69  BUSY  ){.      i
34b90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
34ba0 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  SY ){.        if
34bb0 28 20 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20  ( nTimeout++ >= 
34bc0 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  3 ) break;.     
34bd0 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70     sqlite3_sleep
34be0 28 31 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (100);.      }. 
34bf0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
34c00 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70  _backup_finish(p
34c10 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28  Backup);.    if(
34c20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
34c30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30   ){.      rc = 0
34c40 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
34c50 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
34c60 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f  || rc==SQLITE_LO
34c70 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 72 61  CKED ){.      ra
34c80 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
34c90 20 22 45 72 72 6f 72 3a 20 73 6f 75 72 63 65 20   "Error: source 
34ca0 64 61 74 61 62 61 73 65 20 69 73 20 62 75 73 79  database is busy
34cb0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
34cc0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
34cd0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
34ce0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
34cf0 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
34d00 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
34d10 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
34d20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 5f 64 62    }.    close_db
34d30 28 70 53 72 63 29 3b 0a 20 20 7d 65 6c 73 65 0a  (pSrc);.  }else.
34d40 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26  .  if( c=='s' &&
34d50 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
34d60 5d 2c 20 22 73 63 61 6e 73 74 61 74 73 22 2c 20  ], "scanstats", 
34d70 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
34d80 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
34d90 20 20 70 2d 3e 73 63 61 6e 73 74 61 74 73 4f 6e    p->scanstatsOn
34da0 20 3d 20 28 75 38 29 62 6f 6f 6c 65 61 6e 56 61   = (u8)booleanVa
34db0 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23  lue(azArg[1]);.#
34dc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
34dd0 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
34de0 41 54 55 53 0a 20 20 20 20 20 20 72 61 77 5f 70  ATUS.      raw_p
34df0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57  rintf(stderr, "W
34e00 61 72 6e 69 6e 67 3a 20 2e 73 63 61 6e 73 74 61  arning: .scansta
34e10 74 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  ts not available
34e20 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2e 5c   in this build.\
34e30 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  n");.#endif.    
34e40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
34e50 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
34e60 22 55 73 61 67 65 3a 20 2e 73 63 61 6e 73 74 61  "Usage: .scansta
34e70 74 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20  ts on|off\n");. 
34e80 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
34e90 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
34ea0 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e  ( c=='s' && strn
34eb0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73  cmp(azArg[0], "s
34ec0 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29 7b  chema", n)==0 ){
34ed0 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73  .    ShellText s
34ee0 53 65 6c 65 63 74 3b 0a 20 20 20 20 53 68 65 6c  Select;.    Shel
34ef0 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20  lState data;.   
34f00 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
34f10 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
34f20 61 72 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a  ar *zDiv = "(";.
34f30 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
34f40 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 69  zName = 0;.    i
34f50 6e 74 20 69 53 63 68 65 6d 61 20 3d 20 30 3b 0a  nt iSchema = 0;.
34f60 20 20 20 20 69 6e 74 20 62 44 65 62 75 67 20 3d      int bDebug =
34f70 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   0;.    int ii;.
34f80 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
34f90 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  0);.    memcpy(&
34fa0 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28  data, p, sizeof(
34fb0 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61  data));.    data
34fc0 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b  .showHeader = 0;
34fd0 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20  .    data.cMode 
34fe0 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f  = data.mode = MO
34ff0 44 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 6e 69  DE_Semi;.    ini
35000 74 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b  tText(&sSelect);
35010 0a 20 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 69  .    for(ii=1; i
35020 69 3c 6e 41 72 67 3b 20 69 69 2b 2b 29 7b 0a 20  i<nArg; ii++){. 
35030 20 20 20 20 20 69 66 28 20 6f 70 74 69 6f 6e 4d       if( optionM
35040 61 74 63 68 28 61 7a 41 72 67 5b 69 69 5d 2c 22  atch(azArg[ii],"
35050 69 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20 20 20  indent") ){.    
35060 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
35070 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
35080 45 5f 50 72 65 74 74 79 3b 0a 20 20 20 20 20 20  E_Pretty;.      
35090 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e  }else if( option
350a0 4d 61 74 63 68 28 61 7a 41 72 67 5b 69 69 5d 2c  Match(azArg[ii],
350b0 22 64 65 62 75 67 22 29 20 29 7b 0a 20 20 20 20  "debug") ){.    
350c0 20 20 20 20 62 44 65 62 75 67 20 3d 20 31 3b 0a      bDebug = 1;.
350d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
350e0 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
350f0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 61 7a 41 72      zName = azAr
35100 67 5b 69 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c  g[ii];.      }el
35110 73 65 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  se{.        raw_
35120 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
35130 55 73 61 67 65 3a 20 2e 73 63 68 65 6d 61 20 3f  Usage: .schema ?
35140 2d 2d 69 6e 64 65 6e 74 3f 20 3f 4c 49 4b 45 2d  --indent? ?LIKE-
35150 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20  PATTERN?\n");.  
35160 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
35170 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
35180 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
35190 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
351a0 69 66 28 20 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a  if( zName!=0 ){.
351b0 20 20 20 20 20 20 69 6e 74 20 69 73 4d 61 73 74        int isMast
351c0 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 72  er = sqlite3_str
351d0 6c 69 6b 65 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  like(zName, "sql
351e0 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 27 5c 5c  ite_master", '\\
351f0 27 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28  ')==0;.      if(
35200 20 69 73 4d 61 73 74 65 72 20 7c 7c 20 73 71 6c   isMaster || sql
35210 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a 4e 61  ite3_strlike(zNa
35220 6d 65 2c 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  me,"sqlite_temp_
35230 6d 61 73 74 65 72 22 2c 20 27 5c 5c 27 29 3d 3d  master", '\\')==
35240 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
35250 72 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d 2c 20  r *new_argv[2], 
35260 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20  *new_colv[2];.  
35270 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 30        new_argv[0
35280 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  ] = sqlite3_mpri
35290 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
352a0 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41             "CREA
352b0 54 45 20 54 41 42 4c 45 20 25 73 20 28 5c 6e 22  TE TABLE %s (\n"
352c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
352d0 20 20 20 20 20 20 20 22 20 20 74 79 70 65 20 74         "  type t
352e0 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  ext,\n".        
352f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
35300 20 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20   name text,\n". 
35310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35320 20 20 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65       "  tbl_name
35330 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20   text,\n".      
35340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35350 22 20 20 72 6f 6f 74 70 61 67 65 20 69 6e 74 65  "  rootpage inte
35360 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  ger,\n".        
35370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
35380 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20   sql text\n".   
35390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
353a0 20 20 20 22 29 22 2c 20 69 73 4d 61 73 74 65 72     ")", isMaster
353b0 20 3f 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65   ? "sqlite_maste
353c0 72 22 20 3a 20 22 73 71 6c 69 74 65 5f 74 65 6d  r" : "sqlite_tem
353d0 70 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 20 20  p_master");.    
353e0 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 31 5d 20      new_argv[1] 
353f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 65 77  = 0;.        new
35400 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71 6c 22  _colv[0] = "sql"
35410 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f  ;.        new_co
35420 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  lv[1] = 0;.     
35430 20 20 20 63 61 6c 6c 62 61 63 6b 28 26 64 61 74     callback(&dat
35440 61 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76 2c 20  a, 1, new_argv, 
35450 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20 20 20  new_colv);.     
35460 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
35470 6e 65 77 5f 61 72 67 76 5b 30 5d 29 3b 0a 20 20  new_argv[0]);.  
35480 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
35490 69 66 28 20 7a 44 69 76 20 29 7b 0a 20 20 20 20  if( zDiv ){.    
354a0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
354b0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
354c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
354d0 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
354e0 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f  "SELECT name FRO
354f0 4d 20 70 72 61 67 6d 61 5f 64 61 74 61 62 61 73  M pragma_databas
35500 65 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20 20 20  e_list",.       
35510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35520 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d         -1, &pStm
35530 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
35540 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75   rc ){.        u
35550 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
35560 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
35570 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
35580 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
35590 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
355a0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
355b0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
355c0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
355d0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
355e0 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54   }.      appendT
355f0 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53  ext(&sSelect, "S
35600 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 22 2c  ELECT sql FROM",
35610 20 30 29 3b 0a 20 20 20 20 20 20 69 53 63 68 65   0);.      iSche
35620 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68  ma = 0;.      wh
35630 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
35640 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
35650 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
35660 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
35670 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
35680 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
35690 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  xt(pStmt, 0);.  
356a0 20 20 20 20 20 20 63 68 61 72 20 7a 53 63 4e 75        char zScNu
356b0 6d 5b 33 30 5d 3b 0a 20 20 20 20 20 20 20 20 73  m[30];.        s
356c0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
356d0 73 69 7a 65 6f 66 28 7a 53 63 4e 75 6d 29 2c 20  sizeof(zScNum), 
356e0 7a 53 63 4e 75 6d 2c 20 22 25 64 22 2c 20 2b 2b  zScNum, "%d", ++
356f0 69 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  iSchema);.      
35700 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
35710 65 6c 65 63 74 2c 20 7a 44 69 76 2c 20 30 29 3b  elect, zDiv, 0);
35720 0a 20 20 20 20 20 20 20 20 7a 44 69 76 20 3d 20  .        zDiv = 
35730 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 22 3b 0a 20  " UNION ALL ";. 
35740 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
35750 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45 4c  t(&sSelect, "SEL
35760 45 43 54 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63  ECT shell_add_sc
35770 68 65 6d 61 28 73 71 6c 2c 22 2c 20 30 29 3b 0a  hema(sql,", 0);.
35780 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
35790 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 44 62 2c  te3_stricmp(zDb,
357a0 20 22 6d 61 69 6e 22 29 21 3d 30 20 29 7b 0a 20   "main")!=0 ){. 
357b0 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54           appendT
357c0 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44  ext(&sSelect, zD
357d0 62 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20 20  b, '"');.       
357e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
357f0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
35800 65 6c 65 63 74 2c 20 22 4e 55 4c 4c 22 2c 20 30  elect, "NULL", 0
35810 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
35820 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
35830 26 73 53 65 6c 65 63 74 2c 20 22 2c 6e 61 6d 65  &sSelect, ",name
35840 29 20 41 53 20 73 71 6c 2c 20 74 79 70 65 2c 20  ) AS sql, type, 
35850 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20  tbl_name, name, 
35860 72 6f 77 69 64 2c 22 2c 20 30 29 3b 0a 20 20 20  rowid,", 0);.   
35870 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
35880 26 73 53 65 6c 65 63 74 2c 20 7a 53 63 4e 75 6d  &sSelect, zScNum
35890 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70  , 0);.        ap
358a0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
358b0 74 2c 20 22 20 41 53 20 73 6e 75 6d 2c 20 22 2c  t, " AS snum, ",
358c0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
358d0 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
358e0 2c 20 7a 44 62 2c 20 27 5c 27 27 29 3b 0a 20 20  , zDb, '\'');.  
358f0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
35900 28 26 73 53 65 6c 65 63 74 2c 20 22 20 41 53 20  (&sSelect, " AS 
35910 73 6e 61 6d 65 20 46 52 4f 4d 20 22 2c 20 30 29  sname FROM ", 0)
35920 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ;.        append
35930 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a  Text(&sSelect, z
35940 44 62 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20  Db, '"');.      
35950 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
35960 65 6c 65 63 74 2c 20 22 2e 73 71 6c 69 74 65 5f  elect, ".sqlite_
35970 6d 61 73 74 65 72 22 2c 20 30 29 3b 0a 20 20 20  master", 0);.   
35980 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
35990 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
359a0 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t);.#ifdef SQLIT
359b0 45 5f 49 4e 54 52 4f 53 50 45 43 54 49 4f 4e 5f  E_INTROSPECTION_
359c0 50 52 41 47 4d 41 53 0a 20 20 20 20 20 20 69 66  PRAGMAS.      if
359d0 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ( zName ){.     
359e0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
359f0 53 65 6c 65 63 74 2c 0a 20 20 20 20 20 20 20 20  Select,.        
35a00 20 20 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 53     " UNION ALL S
35a10 45 4c 45 43 54 20 73 68 65 6c 6c 5f 6d 6f 64 75  ELECT shell_modu
35a20 6c 65 5f 73 63 68 65 6d 61 28 6e 61 6d 65 29 2c  le_schema(name),
35a30 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 20 27  ".           " '
35a40 74 61 62 6c 65 27 2c 20 6e 61 6d 65 2c 20 6e 61  table', name, na
35a50 6d 65 2c 20 6e 61 6d 65 2c 20 39 65 2b 39 39 2c  me, name, 9e+99,
35a60 20 27 6d 61 69 6e 27 20 46 52 4f 4d 20 70 72 61   'main' FROM pra
35a70 67 6d 61 5f 6d 6f 64 75 6c 65 5f 6c 69 73 74 22  gma_module_list"
35a80 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
35a90 6e 64 69 66 0a 20 20 20 20 20 20 61 70 70 65 6e  ndif.      appen
35aa0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
35ab0 22 29 20 57 48 45 52 45 20 22 2c 20 30 29 3b 0a  ") WHERE ", 0);.
35ac0 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20        if( zName 
35ad0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
35ae0 2a 7a 51 61 72 67 20 3d 20 73 71 6c 69 74 65 33  *zQarg = sqlite3
35af0 5f 6d 70 72 69 6e 74 66 28 22 25 51 22 2c 20 7a  _mprintf("%Q", z
35b00 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
35b10 6e 74 20 62 47 6c 6f 62 20 3d 20 73 74 72 63 68  nt bGlob = strch
35b20 72 28 7a 4e 61 6d 65 2c 20 27 2a 27 29 20 21 3d  r(zName, '*') !=
35b30 20 30 20 7c 7c 20 73 74 72 63 68 72 28 7a 4e 61   0 || strchr(zNa
35b40 6d 65 2c 20 27 3f 27 29 20 21 3d 20 30 20 7c 7c  me, '?') != 0 ||
35b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35b60 20 20 20 20 20 73 74 72 63 68 72 28 7a 4e 61 6d       strchr(zNam
35b70 65 2c 20 27 5b 27 29 20 21 3d 20 30 3b 0a 20 20  e, '[') != 0;.  
35b80 20 20 20 20 20 20 69 66 28 20 73 74 72 63 68 72        if( strchr
35b90 28 7a 4e 61 6d 65 2c 20 27 2e 27 29 20 29 7b 0a  (zName, '.') ){.
35ba0 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64            append
35bb0 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
35bc0 6c 6f 77 65 72 28 70 72 69 6e 74 66 28 27 25 73  lower(printf('%s
35bd0 2e 25 73 27 2c 73 6e 61 6d 65 2c 74 62 6c 5f 6e  .%s',sname,tbl_n
35be0 61 6d 65 29 29 22 2c 20 30 29 3b 0a 20 20 20 20  ame))", 0);.    
35bf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35c00 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
35c10 26 73 53 65 6c 65 63 74 2c 20 22 6c 6f 77 65 72  &sSelect, "lower
35c20 28 74 62 6c 5f 6e 61 6d 65 29 22 2c 20 30 29 3b  (tbl_name)", 0);
35c30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35c40 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
35c50 53 65 6c 65 63 74 2c 20 62 47 6c 6f 62 20 3f 20  Select, bGlob ? 
35c60 22 20 47 4c 4f 42 20 22 20 3a 20 22 20 4c 49 4b  " GLOB " : " LIK
35c70 45 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  E ", 0);.       
35c80 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
35c90 6c 65 63 74 2c 20 7a 51 61 72 67 2c 20 30 29 3b  lect, zQarg, 0);
35ca0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 62 47  .        if( !bG
35cb0 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lob ){.         
35cc0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
35cd0 6c 65 63 74 2c 20 22 20 45 53 43 41 50 45 20 27  lect, " ESCAPE '
35ce0 5c 5c 27 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  \\' ", 0);.     
35cf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70 70     }.        app
35d00 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
35d10 2c 20 22 20 41 4e 44 20 22 2c 20 30 29 3b 0a 20  , " AND ", 0);. 
35d20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
35d30 72 65 65 28 7a 51 61 72 67 29 3b 0a 20 20 20 20  ree(zQarg);.    
35d40 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64    }.      append
35d50 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
35d60 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e 44  type!='meta' AND
35d70 20 73 71 6c 20 49 53 20 4e 4f 54 20 4e 55 4c 4c   sql IS NOT NULL
35d80 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
35d90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f               " O
35da0 52 44 45 52 20 42 59 20 73 6e 75 6d 2c 20 72 6f  RDER BY snum, ro
35db0 77 69 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  wid", 0);.      
35dc0 69 66 28 20 62 44 65 62 75 67 20 29 7b 0a 20 20  if( bDebug ){.  
35dd0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
35de0 66 28 70 2d 3e 6f 75 74 2c 20 22 53 51 4c 3a 20  f(p->out, "SQL: 
35df0 25 73 3b 5c 6e 22 2c 20 73 53 65 6c 65 63 74 2e  %s;\n", sSelect.
35e00 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  z);.      }else{
35e10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
35e20 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
35e30 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 63 61 6c  , sSelect.z, cal
35e40 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a  lback, &data, &z
35e50 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  ErrMsg);.      }
35e60 0a 20 20 20 20 20 20 66 72 65 65 54 65 78 74 28  .      freeText(
35e70 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d  &sSelect);.    }
35e80 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67  .    if( zErrMsg
35e90 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
35ea0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
35eb0 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ror: %s\n", zErr
35ec0 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Msg);.      sqli
35ed0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
35ee0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
35ef0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
35f00 63 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  c != SQLITE_OK )
35f10 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
35f20 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
35f30 3a 20 71 75 65 72 79 69 6e 67 20 73 63 68 65 6d  : querying schem
35f40 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e 22  a information\n"
35f50 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
35f60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
35f70 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a    rc = 0;.    }.
35f80 20 20 7d 65 6c 73 65 0a 0a 23 69 66 20 64 65 66    }else..#if def
35f90 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
35fa0 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
35fb0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45  LITE_ENABLE_SELE
35fc0 43 54 54 52 41 43 45 29 0a 20 20 69 66 28 20 63  CTTRACE).  if( c
35fd0 3d 3d 27 73 27 20 26 26 20 6e 3d 3d 31 31 20 26  =='s' && n==11 &
35fe0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
35ff0 30 5d 2c 20 22 73 65 6c 65 63 74 74 72 61 63 65  0], "selecttrace
36000 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
36010 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
36020 63 65 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65  ce = (int)intege
36030 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  rValue(azArg[1])
36040 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
36050 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
36060 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
36070 49 4f 4e 29 0a 20 20 69 66 28 20 63 3d 3d 27 73  ION).  if( c=='s
36080 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
36090 72 67 5b 30 5d 2c 22 73 65 73 73 69 6f 6e 22 2c  rg[0],"session",
360a0 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d 33 20 29 7b  n)==0 && n>=3 ){
360b0 0a 20 20 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e  .    OpenSession
360c0 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d   *pSession = &p-
360d0 3e 61 53 65 73 73 69 6f 6e 5b 30 5d 3b 0a 20 20  >aSession[0];.  
360e0 20 20 63 68 61 72 20 2a 2a 61 7a 43 6d 64 20 3d    char **azCmd =
360f0 20 26 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20   &azArg[1];.    
36100 69 6e 74 20 69 53 65 73 20 3d 20 30 3b 0a 20 20  int iSes = 0;.  
36110 20 20 69 6e 74 20 6e 43 6d 64 20 3d 20 6e 41 72    int nCmd = nAr
36120 67 20 2d 20 31 3b 0a 20 20 20 20 69 6e 74 20 69  g - 1;.    int i
36130 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 3d  ;.    if( nArg<=
36140 31 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e  1 ) goto session
36150 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20  _syntax_error;. 
36160 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
36170 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d  ;.    if( nArg>=
36180 33 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  3 ){.      for(i
36190 53 65 73 3d 30 3b 20 69 53 65 73 3c 70 2d 3e 6e  Ses=0; iSes<p->n
361a0 53 65 73 73 69 6f 6e 3b 20 69 53 65 73 2b 2b 29  Session; iSes++)
361b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  {.        if( st
361c0 72 63 6d 70 28 70 2d 3e 61 53 65 73 73 69 6f 6e  rcmp(p->aSession
361d0 5b 69 53 65 73 5d 2e 7a 4e 61 6d 65 2c 20 61 7a  [iSes].zName, az
361e0 41 72 67 5b 31 5d 29 3d 3d 30 20 29 20 62 72 65  Arg[1])==0 ) bre
361f0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
36200 20 20 69 66 28 20 69 53 65 73 3c 70 2d 3e 6e 53    if( iSes<p->nS
36210 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  ession ){.      
36220 20 20 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d    pSession = &p-
36230 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d 3b  >aSession[iSes];
36240 0a 20 20 20 20 20 20 20 20 61 7a 43 6d 64 2b 2b  .        azCmd++
36250 3b 0a 20 20 20 20 20 20 20 20 6e 43 6d 64 2d 2d  ;.        nCmd--
36260 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
36270 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 20         pSession 
36280 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 30  = &p->aSession[0
36290 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 65 73 20  ];.        iSes 
362a0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
362b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73   }..    /* .sess
362c0 69 6f 6e 20 61 74 74 61 63 68 20 54 41 42 4c 45  ion attach TABLE
362d0 0a 20 20 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74  .    ** Invoke t
362e0 68 65 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  he sqlite3sessio
362f0 6e 5f 61 74 74 61 63 68 28 29 20 69 6e 74 65 72  n_attach() inter
36300 66 61 63 65 20 74 6f 20 61 74 74 61 63 68 20 61  face to attach a
36310 20 70 61 72 74 69 63 75 6c 61 72 0a 20 20 20 20   particular.    
36320 2a 2a 20 74 61 62 6c 65 20 73 6f 20 74 68 61 74  ** table so that
36330 20 69 74 20 69 73 20 6e 65 76 65 72 20 66 69 6c   it is never fil
36340 74 65 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  tered..    */.  
36350 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43    if( strcmp(azC
36360 6d 64 5b 30 5d 2c 22 61 74 74 61 63 68 22 29 3d  md[0],"attach")=
36370 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
36380 6e 43 6d 64 21 3d 32 20 29 20 67 6f 74 6f 20 73  nCmd!=2 ) goto s
36390 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72  ession_syntax_er
363a0 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ror;.      if( p
363b0 53 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29 7b  Session->p==0 ){
363c0 0a 20 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e  .        session
363d0 5f 6e 6f 74 5f 6f 70 65 6e 3a 0a 20 20 20 20 20  _not_open:.     
363e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
363f0 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f  derr, "ERROR: No
36400 20 73 65 73 73 69 6f 6e 73 20 61 72 65 20 6f 70   sessions are op
36410 65 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 65  en\n");.      }e
36420 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
36430 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  = sqlite3session
36440 5f 61 74 74 61 63 68 28 70 53 65 73 73 69 6f 6e  _attach(pSession
36450 2d 3e 70 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b 0a  ->p, azCmd[1]);.
36460 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
36470 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
36480 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
36490 45 52 52 4f 52 3a 20 73 71 6c 69 74 65 33 73 65  ERROR: sqlite3se
364a0 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 29 20 72  ssion_attach() r
364b0 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63  eturns %d\n", rc
364c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
364d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
364e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
364f0 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f  ..    /* .sessio
36500 6e 20 63 68 61 6e 67 65 73 65 74 20 46 49 4c 45  n changeset FILE
36510 0a 20 20 20 20 2a 2a 20 2e 73 65 73 73 69 6f 6e  .    ** .session
36520 20 70 61 74 63 68 73 65 74 20 46 49 4c 45 0a 20   patchset FILE. 
36530 20 20 20 2a 2a 20 57 72 69 74 65 20 61 20 63 68     ** Write a ch
36540 61 6e 67 65 73 65 74 20 6f 72 20 70 61 74 63 68  angeset or patch
36550 73 65 74 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  set into a file.
36560 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6f 76    The file is ov
36570 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  erwritten..    *
36580 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  /.    if( strcmp
36590 28 61 7a 43 6d 64 5b 30 5d 2c 22 63 68 61 6e 67  (azCmd[0],"chang
365a0 65 73 65 74 22 29 3d 3d 30 20 7c 7c 20 73 74 72  eset")==0 || str
365b0 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 70 61  cmp(azCmd[0],"pa
365c0 74 63 68 73 65 74 22 29 3d 3d 30 20 29 7b 0a 20  tchset")==0 ){. 
365d0 20 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d       FILE *out =
365e0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43   0;.      if( nC
365f0 6d 64 21 3d 32 20 29 20 67 6f 74 6f 20 73 65 73  md!=2 ) goto ses
36600 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
36610 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  r;.      if( pSe
36620 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29 20 67 6f  ssion->p==0 ) go
36630 74 6f 20 73 65 73 73 69 6f 6e 5f 6e 6f 74 5f 6f  to session_not_o
36640 70 65 6e 3b 0a 20 20 20 20 20 20 6f 75 74 20 3d  pen;.      out =
36650 20 66 6f 70 65 6e 28 61 7a 43 6d 64 5b 31 5d 2c   fopen(azCmd[1],
36660 20 22 77 62 22 29 3b 0a 20 20 20 20 20 20 69 66   "wb");.      if
36670 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( out==0 ){.    
36680 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
36690 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20  stderr, "ERROR: 
366a0 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
366b0 5c 22 20 66 6f 72 20 77 72 69 74 69 6e 67 5c 6e  \" for writing\n
366c0 22 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20  ", azCmd[1]);.  
366d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
366e0 20 20 20 69 6e 74 20 73 7a 43 68 6e 67 3b 0a 20     int szChng;. 
366f0 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 68         void *pCh
36700 6e 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ng;.        if( 
36710 61 7a 43 6d 64 5b 30 5d 5b 30 5d 3d 3d 27 63 27  azCmd[0][0]=='c'
36720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
36730 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   = sqlite3sessio
36740 6e 5f 63 68 61 6e 67 65 73 65 74 28 70 53 65 73  n_changeset(pSes
36750 73 69 6f 6e 2d 3e 70 2c 20 26 73 7a 43 68 6e 67  sion->p, &szChng
36760 2c 20 26 70 43 68 6e 67 29 3b 0a 20 20 20 20 20  , &pChng);.     
36770 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36780 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36790 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65 74  session_patchset
367a0 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 26 73  (pSession->p, &s
367b0 7a 43 68 6e 67 2c 20 26 70 43 68 6e 67 29 3b 0a  zChng, &pChng);.
367c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
367d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
367e0 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 45 72        printf("Er
367f0 72 6f 72 3a 20 65 72 72 6f 72 20 63 6f 64 65 20  ror: error code 
36800 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d\n", rc);.    
36810 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
36820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36830 69 66 28 20 70 43 68 6e 67 0a 20 20 20 20 20 20  if( pChng.      
36840 20 20 20 20 26 26 20 66 77 72 69 74 65 28 70 43      && fwrite(pC
36850 68 6e 67 2c 20 73 7a 43 68 6e 67 2c 20 31 2c 20  hng, szChng, 1, 
36860 6f 75 74 29 21 3d 31 20 29 7b 0a 20 20 20 20 20  out)!=1 ){.     
36870 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
36880 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20  stderr, "ERROR: 
36890 46 61 69 6c 65 64 20 74 6f 20 77 72 69 74 65 20  Failed to write 
368a0 65 6e 74 69 72 65 20 25 64 2d 62 79 74 65 20 6f  entire %d-byte o
368b0 75 74 70 75 74 5c 6e 22 2c 0a 20 20 20 20 20 20  utput\n",.      
368c0 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 43 68              szCh
368d0 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ng);.        }. 
368e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
368f0 72 65 65 28 70 43 68 6e 67 29 3b 0a 20 20 20 20  ree(pChng);.    
36900 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
36910 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
36920 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73  se..    /* .sess
36930 69 6f 6e 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a  ion close.    **
36940 20 43 6c 6f 73 65 20 74 68 65 20 69 64 65 6e 74   Close the ident
36950 69 66 69 65 64 20 73 65 73 73 69 6f 6e 0a 20 20  ified session.  
36960 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
36970 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 63  cmp(azCmd[0], "c
36980 6c 6f 73 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  lose")==0 ){.   
36990 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 31 20 29     if( nCmd!=1 )
369a0 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79   goto session_sy
369b0 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
369c0 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f    if( p->nSessio
369d0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 73  n ){.        ses
369e0 73 69 6f 6e 5f 63 6c 6f 73 65 28 70 53 65 73 73  sion_close(pSess
369f0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  ion);.        p-
36a00 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d 20  >aSession[iSes] 
36a10 3d 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 2d 2d  = p->aSession[--
36a20 70 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20 20  p->nSession];.  
36a30 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a      }.    }else.
36a40 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e  .    /* .session
36a50 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e   enable ?BOOLEAN
36a60 3f 0a 20 20 20 20 2a 2a 20 51 75 65 72 79 20 6f  ?.    ** Query o
36a70 72 20 73 65 74 20 74 68 65 20 65 6e 61 62 6c 65  r set the enable
36a80 20 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20 20 20   flag.    */.   
36a90 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d   if( strcmp(azCm
36aa0 64 5b 30 5d 2c 20 22 65 6e 61 62 6c 65 22 29 3d  d[0], "enable")=
36ab0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
36ac0 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43  ii;.      if( nC
36ad0 6d 64 3e 32 20 29 20 67 6f 74 6f 20 73 65 73 73  md>2 ) goto sess
36ae0 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  ion_syntax_error
36af0 3b 0a 20 20 20 20 20 20 69 69 20 3d 20 6e 43 6d  ;.      ii = nCm
36b00 64 3d 3d 31 20 3f 20 2d 31 20 3a 20 62 6f 6f 6c  d==1 ? -1 : bool
36b10 65 61 6e 56 61 6c 75 65 28 61 7a 43 6d 64 5b 31  eanValue(azCmd[1
36b20 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ]);.      if( p-
36b30 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20  >nSession ){.   
36b40 20 20 20 20 20 69 69 20 3d 20 73 71 6c 69 74 65       ii = sqlite
36b50 33 73 65 73 73 69 6f 6e 5f 65 6e 61 62 6c 65 28  3session_enable(
36b60 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 69 69 29  pSession->p, ii)
36b70 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  ;.        utf8_p
36b80 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 73  rintf(p->out, "s
36b90 65 73 73 69 6f 6e 20 25 73 20 65 6e 61 62 6c 65  ession %s enable
36ba0 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20   flag = %d\n",. 
36bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36bc0 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61     pSession->zNa
36bd0 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 7d  me, ii);.      }
36be0 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
36bf0 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 66 69 6c 74  /* .session filt
36c00 65 72 20 47 4c 4f 42 20 2e 2e 2e 2e 0a 20 20 20  er GLOB .....   
36c10 20 2a 2a 20 53 65 74 20 61 20 6c 69 73 74 20 6f   ** Set a list o
36c20 66 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 73 20  f GLOB patterns 
36c30 6f 66 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 74  of table names t
36c40 6f 20 62 65 20 65 78 63 6c 75 64 65 64 2e 0a 20  o be excluded.. 
36c50 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
36c60 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22  rcmp(azCmd[0], "
36c70 66 69 6c 74 65 72 22 29 3d 3d 30 20 29 7b 0a 20  filter")==0 ){. 
36c80 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6e 42 79       int ii, nBy
36c90 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43  te;.      if( nC
36ca0 6d 64 3c 32 20 29 20 67 6f 74 6f 20 73 65 73 73  md<2 ) goto sess
36cb0 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  ion_syntax_error
36cc0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
36cd0 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  Session ){.     
36ce0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
36cf0 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65  pSession->nFilte
36d00 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
36d10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
36d20 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c  (pSession->azFil
36d30 74 65 72 5b 69 69 5d 29 3b 0a 20 20 20 20 20 20  ter[ii]);.      
36d40 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
36d50 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f  te3_free(pSessio
36d60 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20 20  n->azFilter);.  
36d70 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69        nByte = si
36d80 7a 65 6f 66 28 70 53 65 73 73 69 6f 6e 2d 3e 61  zeof(pSession->a
36d90 7a 46 69 6c 74 65 72 5b 30 5d 29 2a 28 6e 43 6d  zFilter[0])*(nCm
36da0 64 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 70 53  d-1);.        pS
36db0 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72  ession->azFilter
36dc0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
36dd0 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20  c( nByte );.    
36de0 20 20 20 20 69 66 28 20 70 53 65 73 73 69 6f 6e      if( pSession
36df0 2d 3e 61 7a 46 69 6c 74 65 72 3d 3d 30 20 29 7b  ->azFilter==0 ){
36e00 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
36e10 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
36e20 72 72 6f 72 3a 20 6f 75 74 20 6f 72 20 6d 65 6d  rror: out or mem
36e30 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ory\n");.       
36e40 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
36e50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
36e60 72 28 69 69 3d 31 3b 20 69 69 3c 6e 43 6d 64 3b  r(ii=1; ii<nCmd;
36e70 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
36e80 20 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69    pSession->azFi
36e90 6c 74 65 72 5b 69 69 2d 31 5d 20 3d 20 73 71 6c  lter[ii-1] = sql
36ea0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
36eb0 22 2c 20 61 7a 43 6d 64 5b 69 69 5d 29 3b 0a 20  ", azCmd[ii]);. 
36ec0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36ed0 20 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74   pSession->nFilt
36ee0 65 72 20 3d 20 69 69 2d 31 3b 0a 20 20 20 20 20  er = ii-1;.     
36ef0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20   }.    }else..  
36f00 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 69 6e    /* .session in
36f10 64 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41 4e 3f  direct ?BOOLEAN?
36f20 0a 20 20 20 20 2a 2a 20 51 75 65 72 79 20 6f 72  .    ** Query or
36f30 20 73 65 74 20 74 68 65 20 69 6e 64 69 72 65 63   set the indirec
36f40 74 20 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20 20  t flag.    */.  
36f50 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43    if( strcmp(azC
36f60 6d 64 5b 30 5d 2c 20 22 69 6e 64 69 72 65 63 74  md[0], "indirect
36f70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
36f80 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 69 66 28  nt ii;.      if(
36f90 20 6e 43 6d 64 3e 32 20 29 20 67 6f 74 6f 20 73   nCmd>2 ) goto s
36fa0 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72  ession_syntax_er
36fb0 72 6f 72 3b 0a 20 20 20 20 20 20 69 69 20 3d 20  ror;.      ii = 
36fc0 6e 43 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a 20 62  nCmd==1 ? -1 : b
36fd0 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 43 6d  ooleanValue(azCm
36fe0 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  d[1]);.      if(
36ff0 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a   p->nSession ){.
37000 20 20 20 20 20 20 20 20 69 69 20 3d 20 73 71 6c          ii = sql
37010 69 74 65 33 73 65 73 73 69 6f 6e 5f 69 6e 64 69  ite3session_indi
37020 72 65 63 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70  rect(pSession->p
37030 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 75  , ii);.        u
37040 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
37050 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20 69  t, "session %s i
37060 6e 64 69 72 65 63 74 20 66 6c 61 67 20 3d 20 25  ndirect flag = %
37070 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
37080 20 20 20 20 20 20 20 20 20 20 70 53 65 73 73 69            pSessi
37090 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a  on->zName, ii);.
370a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
370b0 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69  e..    /* .sessi
370c0 6f 6e 20 69 73 65 6d 70 74 79 0a 20 20 20 20 2a  on isempty.    *
370d0 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 74  * Determine if t
370e0 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20 65 6d  he session is em
370f0 70 74 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  pty.    */.    i
37100 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b  f( strcmp(azCmd[
37110 30 5d 2c 20 22 69 73 65 6d 70 74 79 22 29 3d 3d  0], "isempty")==
37120 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
37130 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d  i;.      if( nCm
37140 64 21 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73  d!=1 ) goto sess
37150 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  ion_syntax_error
37160 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
37170 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  Session ){.     
37180 20 20 20 69 69 20 3d 20 73 71 6c 69 74 65 33 73     ii = sqlite3s
37190 65 73 73 69 6f 6e 5f 69 73 65 6d 70 74 79 28 70  ession_isempty(p
371a0 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20 20  Session->p);.   
371b0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
371c0 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f  (p->out, "sessio
371d0 6e 20 25 73 20 69 73 65 6d 70 74 79 20 66 6c 61  n %s isempty fla
371e0 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  g = %d\n",.     
371f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
37200 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20  Session->zName, 
37210 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ii);.      }.   
37220 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e   }else..    /* .
37230 73 65 73 73 69 6f 6e 20 6c 69 73 74 0a 20 20 20  session list.   
37240 20 2a 2a 20 4c 69 73 74 20 61 6c 6c 20 63 75 72   ** List all cur
37250 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73 73  rently open sess
37260 69 6f 6e 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ions.    */.    
37270 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64  if( strcmp(azCmd
37280 5b 30 5d 2c 22 6c 69 73 74 22 29 3d 3d 30 20 29  [0],"list")==0 )
37290 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
372a0 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20   i<p->nSession; 
372b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 74  i++){.        ut
372c0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
372d0 2c 20 22 25 64 20 25 73 5c 6e 22 2c 20 69 2c 20  , "%d %s\n", i, 
372e0 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 2e 7a  p->aSession[i].z
372f0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
37300 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a     }else..    /*
37310 20 2e 73 65 73 73 69 6f 6e 20 6f 70 65 6e 20 44   .session open D
37320 42 20 4e 41 4d 45 0a 20 20 20 20 2a 2a 20 4f 70  B NAME.    ** Op
37330 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e  en a new session
37340 20 63 61 6c 6c 65 64 20 4e 41 4d 45 20 6f 6e 20   called NAME on 
37350 74 68 65 20 61 74 74 61 63 68 65 64 20 64 61 74  the attached dat
37360 61 62 61 73 65 20 44 42 2e 0a 20 20 20 20 2a 2a  abase DB..    **
37370 20 44 42 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20   DB is normally 
37380 22 6d 61 69 6e 22 2e 0a 20 20 20 20 2a 2f 0a 20  "main"..    */. 
37390 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
373a0 43 6d 64 5b 30 5d 2c 22 6f 70 65 6e 22 29 3d 3d  Cmd[0],"open")==
373b0 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
373c0 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66  *zName;.      if
373d0 28 20 6e 43 6d 64 21 3d 33 20 29 20 67 6f 74 6f  ( nCmd!=3 ) goto
373e0 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
373f0 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7a 4e 61  error;.      zNa
37400 6d 65 20 3d 20 61 7a 43 6d 64 5b 32 5d 3b 0a 20  me = azCmd[2];. 
37410 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 30       if( zName[0
37420 5d 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 73 73  ]==0 ) goto sess
37430 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  ion_syntax_error
37440 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
37450 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20   i<p->nSession; 
37460 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
37470 28 20 73 74 72 63 6d 70 28 70 2d 3e 61 53 65 73  ( strcmp(p->aSes
37480 73 69 6f 6e 5b 69 5d 2e 7a 4e 61 6d 65 2c 7a 4e  sion[i].zName,zN
37490 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
374a0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
374b0 28 73 74 64 65 72 72 2c 20 22 53 65 73 73 69 6f  (stderr, "Sessio
374c0 6e 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79  n \"%s\" already
374d0 20 65 78 69 73 74 73 5c 6e 22 2c 20 7a 4e 61 6d   exists\n", zNam
374e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
374f0 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
37500 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  exit;.        }.
37510 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
37520 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 3e 3d 41  ( p->nSession>=A
37530 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 53 65 73  rraySize(p->aSes
37540 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  sion) ){.       
37550 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
37560 72 72 2c 20 22 4d 61 78 69 6d 75 6d 20 6f 66 20  rr, "Maximum of 
37570 25 64 20 73 65 73 73 69 6f 6e 73 5c 6e 22 2c 20  %d sessions\n", 
37580 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 53 65  ArraySize(p->aSe
37590 73 73 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 20  ssion));.       
375a0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
375b0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
375c0 0a 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 20  .      pSession 
375d0 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 70  = &p->aSession[p
375e0 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20 20 20  ->nSession];.   
375f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73     rc = sqlite3s
37600 65 73 73 69 6f 6e 5f 63 72 65 61 74 65 28 70 2d  ession_create(p-
37610 3e 64 62 2c 20 61 7a 43 6d 64 5b 31 5d 2c 20 26  >db, azCmd[1], &
37620 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20  pSession->p);.  
37630 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
37640 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
37650 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74  (stderr, "Cannot
37660 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 3a 20 65   open session: e
37670 72 72 6f 72 20 63 6f 64 65 3d 25 64 5c 6e 22 2c  rror code=%d\n",
37680 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 72 63   rc);.        rc
37690 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
376a0 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
376b0 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
376c0 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 6e 46      pSession->nF
376d0 69 6c 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  ilter = 0;.     
376e0 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
376f0 74 61 62 6c 65 5f 66 69 6c 74 65 72 28 70 53 65  table_filter(pSe
37700 73 73 69 6f 6e 2d 3e 70 2c 20 73 65 73 73 69 6f  ssion->p, sessio
37710 6e 5f 66 69 6c 74 65 72 2c 20 70 53 65 73 73 69  n_filter, pSessi
37720 6f 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  on);.      p->nS
37730 65 73 73 69 6f 6e 2b 2b 3b 0a 20 20 20 20 20 20  ession++;.      
37740 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 20  pSession->zName 
37750 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
37760 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  f("%s", zName);.
37770 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 2f 2a      }else.    /*
37780 20 49 66 20 6e 6f 20 63 6f 6d 6d 61 6e 64 20 6e   If no command n
37790 61 6d 65