/ Hex Artifact Content
Login

Artifact 6c06ff4077ab38b30a307c058ecc650e958bfdb6da1c255ebbd8779447e0cae9:


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 23 64 65 66 69 6e 65 20 53  e() */.#define S
78d0: 48 45 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44 42 20  HELL_OPEN_HEXDB 
78e0: 20 20 20 20 20 20 36 20 20 20 20 20 20 2f 2a 20        6      /* 
78f0: 55 73 65 20 22 64 62 74 6f 74 78 74 22 20 6f 75  Use "dbtotxt" ou
7900: 74 70 75 74 20 61 73 20 64 61 74 61 20 73 6f 75  tput as data sou
7910: 72 63 65 20 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 77  rce */../* Allow
7920: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53 68  ed values for Sh
7930: 65 6c 6c 53 74 61 74 65 2e 65 54 72 61 63 65 54  ellState.eTraceT
7940: 79 70 65 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ype.*/.#define S
7950: 48 45 4c 4c 5f 54 52 41 43 45 5f 50 4c 41 49 4e  HELL_TRACE_PLAIN
7960: 20 20 20 20 20 20 30 20 20 20 20 20 20 2f 2a 20        0      /* 
7970: 53 68 6f 77 20 69 6e 70 75 74 20 53 51 4c 20 74  Show input SQL t
7980: 65 78 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ext */.#define S
7990: 48 45 4c 4c 5f 54 52 41 43 45 5f 45 58 50 41 4e  HELL_TRACE_EXPAN
79a0: 44 45 44 20 20 20 31 20 20 20 20 20 20 2f 2a 20  DED   1      /* 
79b0: 53 68 6f 77 20 65 78 70 61 6e 64 65 64 20 53 51  Show expanded SQ
79c0: 4c 20 74 65 78 74 20 2a 2f 0a 23 64 65 66 69 6e  L text */.#defin
79d0: 65 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f 4e 4f  e SHELL_TRACE_NO
79e0: 52 4d 41 4c 49 5a 45 44 20 32 20 20 20 20 20 20  RMALIZED 2      
79f0: 2f 2a 20 53 68 6f 77 20 6e 6f 72 6d 61 6c 69 7a  /* Show normaliz
7a00: 65 64 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 0a  ed SQL text */..
7a10: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  /*.** These are 
7a20: 74 68 65 20 61 6c 6c 6f 77 65 64 20 73 68 65 6c  the allowed shel
7a30: 6c 46 6c 67 73 20 76 61 6c 75 65 73 0a 2a 2f 0a  lFlgs values.*/.
7a40: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 61  #define SHFLG_Pa
7a50: 67 65 63 61 63 68 65 20 20 20 20 20 20 30 78 30  gecache      0x0
7a60: 30 30 30 30 30 30 31 20 2f 2a 20 54 68 65 20 2d  0000001 /* The -
7a70: 2d 70 61 67 65 63 61 63 68 65 20 6f 70 74 69 6f  -pagecache optio
7a80: 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65  n is used */.#de
7a90: 66 69 6e 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61  fine SHFLG_Looka
7aa0: 73 69 64 65 20 20 20 20 20 20 30 78 30 30 30 30  side      0x0000
7ab0: 30 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61 73 69 64  0002 /* Lookasid
7ac0: 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64  e memory is used
7ad0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c   */.#define SHFL
7ae0: 47 5f 42 61 63 6b 73 6c 61 73 68 20 20 20 20 20  G_Backslash     
7af0: 20 30 78 30 30 30 30 30 30 30 34 20 2f 2a 20 54   0x00000004 /* T
7b00: 68 65 20 2d 2d 62 61 63 6b 73 6c 61 73 68 20 6f  he --backslash o
7b10: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f  ption is used */
7b20: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50  .#define SHFLG_P
7b30: 72 65 73 65 72 76 65 52 6f 77 69 64 20 20 30 78  reserveRowid  0x
7b40: 30 30 30 30 30 30 30 38 20 2f 2a 20 2e 64 75 6d  00000008 /* .dum
7b50: 70 20 70 72 65 73 65 72 76 65 73 20 72 6f 77 69  p preserves rowi
7b60: 64 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66  d values */.#def
7b70: 69 6e 65 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e  ine SHFLG_Newlin
7b80: 65 73 20 20 20 20 20 20 20 30 78 30 30 30 30 30  es       0x00000
7b90: 30 31 30 20 2f 2a 20 2e 64 75 6d 70 20 2d 2d 6e  010 /* .dump --n
7ba0: 65 77 6c 69 6e 65 20 66 6c 61 67 20 2a 2f 0a 23  ewline flag */.#
7bb0: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 43 6f 75  define SHFLG_Cou
7bc0: 6e 74 43 68 61 6e 67 65 73 20 20 20 30 78 30 30  ntChanges   0x00
7bd0: 30 30 30 30 32 30 20 2f 2a 20 2e 63 68 61 6e 67  000020 /* .chang
7be0: 65 73 20 73 65 74 74 69 6e 67 20 2a 2f 0a 23 64  es setting */.#d
7bf0: 65 66 69 6e 65 20 53 48 46 4c 47 5f 45 63 68 6f  efine SHFLG_Echo
7c00: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30             0x000
7c10: 30 30 30 34 30 20 2f 2a 20 2e 65 63 68 6f 20 6f  00040 /* .echo o
7c20: 72 20 2d 2d 65 63 68 6f 20 73 65 74 74 69 6e 67  r --echo setting
7c30: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f   */../*.** Macro
7c40: 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  s for testing an
7c50: 64 20 73 65 74 74 69 6e 67 20 73 68 65 6c 6c 46  d setting shellF
7c60: 6c 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  lgs.*/.#define S
7c70: 68 65 6c 6c 48 61 73 46 6c 61 67 28 50 2c 58 29  hellHasFlag(P,X)
7c80: 20 20 20 20 28 28 28 50 29 2d 3e 73 68 65 6c 6c      (((P)->shell
7c90: 46 6c 67 73 20 26 20 28 58 29 29 21 3d 30 29 0a  Flgs & (X))!=0).
7ca0: 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 53 65 74  #define ShellSet
7cb0: 46 6c 61 67 28 50 2c 58 29 20 20 20 20 28 28 50  Flag(P,X)    ((P
7cc0: 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d 28 58  )->shellFlgs|=(X
7cd0: 29 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c  )).#define Shell
7ce0: 43 6c 65 61 72 46 6c 61 67 28 50 2c 58 29 20 20  ClearFlag(P,X)  
7cf0: 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 26  ((P)->shellFlgs&
7d00: 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a 20  =(~(X)))../*.** 
7d10: 54 68 65 73 65 20 61 72 65 20 74 68 65 20 61 6c  These are the al
7d20: 6c 6f 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a  lowed modes..*/.
7d30: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e  #define MODE_Lin
7d40: 65 20 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20  e     0  /* One 
7d50: 63 6f 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e  column per line.
7d60: 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74    Blank line bet
7d70: 77 65 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a  ween records */.
7d80: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c  #define MODE_Col
7d90: 75 6d 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20  umn   1  /* One 
7da0: 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20  record per line 
7db0: 69 6e 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20  in neat columns 
7dc0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7dd0: 4c 69 73 74 20 20 20 20 20 32 20 20 2f 2a 20 4f  List     2  /* O
7de0: 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69  ne record per li
7df0: 6e 65 20 77 69 74 68 20 61 20 73 65 70 61 72 61  ne with a separa
7e00: 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  tor */.#define M
7e10: 4f 44 45 5f 53 65 6d 69 20 20 20 20 20 33 20 20  ODE_Semi     3  
7e20: 2f 2a 20 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f  /* Same as MODE_
7e30: 4c 69 73 74 20 62 75 74 20 61 70 70 65 6e 64 20  List but append 
7e40: 22 3b 22 20 74 6f 20 65 61 63 68 20 6c 69 6e 65  ";" to each line
7e50: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
7e60: 5f 48 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20  _Html     4  /* 
7e70: 47 65 6e 65 72 61 74 65 20 61 6e 20 58 48 54 4d  Generate an XHTM
7e80: 4c 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69  L table */.#defi
7e90: 6e 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20  ne MODE_Insert  
7ea0: 20 35 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   5  /* Generate 
7eb0: 53 51 4c 20 22 69 6e 73 65 72 74 22 20 73 74 61  SQL "insert" sta
7ec0: 74 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69  tements */.#defi
7ed0: 6e 65 20 4d 4f 44 45 5f 51 75 6f 74 65 20 20 20  ne MODE_Quote   
7ee0: 20 36 20 20 2f 2a 20 51 75 6f 74 65 20 76 61 6c   6  /* Quote val
7ef0: 75 65 73 20 61 73 20 66 6f 72 20 53 51 4c 20 2a  ues as for SQL *
7f00: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54  /.#define MODE_T
7f10: 63 6c 20 20 20 20 20 20 37 20 20 2f 2a 20 47 65  cl      7  /* Ge
7f20: 6e 65 72 61 74 65 20 41 4e 53 49 2d 43 20 6f 72  nerate ANSI-C or
7f30: 20 54 43 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d   TCL quoted elem
7f40: 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ents */.#define 
7f50: 4d 4f 44 45 5f 43 73 76 20 20 20 20 20 20 38 20  MODE_Csv      8 
7f60: 20 2f 2a 20 51 75 6f 74 65 20 73 74 72 69 6e 67   /* Quote string
7f70: 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 70  s, numbers are p
7f80: 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lain */.#define 
7f90: 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20 39 20  MODE_Explain  9 
7fa0: 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f   /* Like MODE_Co
7fb0: 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74  lumn, but do not
7fc0: 20 74 72 75 6e 63 61 74 65 20 64 61 74 61 20 2a   truncate data *
7fd0: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 41  /.#define MODE_A
7fe0: 73 63 69 69 20 20 20 31 30 20 20 2f 2a 20 55 73  scii   10  /* Us
7ff0: 65 20 41 53 43 49 49 20 75 6e 69 74 20 61 6e 64  e ASCII unit and
8000: 20 72 65 63 6f 72 64 20 73 65 70 61 72 61 74 6f   record separato
8010: 72 73 20 28 30 78 31 46 2f 30 78 31 45 29 20 2a  rs (0x1F/0x1E) *
8020: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 50  /.#define MODE_P
8030: 72 65 74 74 79 20 20 31 31 20 20 2f 2a 20 50 72  retty  11  /* Pr
8040: 65 74 74 79 2d 70 72 69 6e 74 20 73 63 68 65 6d  etty-print schem
8050: 61 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  as */.#define MO
8060: 44 45 5f 45 51 50 20 20 20 20 20 31 32 20 20 2f  DE_EQP     12  /
8070: 2a 20 43 6f 6e 76 65 72 74 73 20 45 58 50 4c 41  * Converts EXPLA
8080: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 6f 75  IN QUERY PLAN ou
8090: 74 70 75 74 20 69 6e 74 6f 20 61 20 67 72 61 70  tput into a grap
80a0: 68 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e  h */..static con
80b0: 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 44 65 73  st char *modeDes
80c0: 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65  cr[] = {.  "line
80d0: 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20  ",.  "column",. 
80e0: 20 22 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d 69   "list",.  "semi
80f0: 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22  ",.  "html",.  "
8100: 69 6e 73 65 72 74 22 2c 0a 20 20 22 71 75 6f 74  insert",.  "quot
8110: 65 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20 22  e",.  "tcl",.  "
8120: 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61 69 6e  csv",.  "explain
8130: 22 2c 0a 20 20 22 61 73 63 69 69 22 2c 0a 20 20  ",.  "ascii",.  
8140: 22 70 72 65 74 74 79 70 72 69 6e 74 22 2c 0a 20  "prettyprint",. 
8150: 20 22 65 71 70 22 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   "eqp".};../*.**
8160: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 63   These are the c
8170: 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69 6e 65 20 73  olumn/row/line s
8180: 65 70 61 72 61 74 6f 72 73 20 75 73 65 64 20 62  eparators used b
8190: 79 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a  y the various.**
81a0: 20 69 6d 70 6f 72 74 2f 65 78 70 6f 72 74 20 6d   import/export m
81b0: 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  odes..*/.#define
81c0: 20 53 45 50 5f 43 6f 6c 75 6d 6e 20 20 20 20 22   SEP_Column    "
81d0: 7c 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 52  |".#define SEP_R
81e0: 6f 77 20 20 20 20 20 20 20 22 5c 6e 22 0a 23 64  ow       "\n".#d
81f0: 65 66 69 6e 65 20 53 45 50 5f 54 61 62 20 20 20  efine SEP_Tab   
8200: 20 20 20 20 22 5c 74 22 0a 23 64 65 66 69 6e 65      "\t".#define
8210: 20 53 45 50 5f 53 70 61 63 65 20 20 20 20 20 22   SEP_Space     "
8220: 20 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43   ".#define SEP_C
8230: 6f 6d 6d 61 20 20 20 20 20 22 2c 22 0a 23 64 65  omma     ",".#de
8240: 66 69 6e 65 20 53 45 50 5f 43 72 4c 66 20 20 20  fine SEP_CrLf   
8250: 20 20 20 22 5c 72 5c 6e 22 0a 23 64 65 66 69 6e     "\r\n".#defin
8260: 65 20 53 45 50 5f 55 6e 69 74 20 20 20 20 20 20  e SEP_Unit      
8270: 22 5c 78 31 46 22 0a 23 64 65 66 69 6e 65 20 53  "\x1F".#define S
8280: 45 50 5f 52 65 63 6f 72 64 20 20 20 20 22 5c 78  EP_Record    "\x
8290: 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  1E"../*.** A cal
82a0: 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71  lback for the sq
82b0: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69 6e 74 65  lite3_log() inte
82c0: 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rface..*/.static
82d0: 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67 28 76   void shellLog(v
82e0: 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 69  oid *pArg, int i
82f0: 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63  ErrCode, const c
8300: 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 53 68  har *zMsg){.  Sh
8310: 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53  ellState *p = (S
8320: 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b  hellState*)pArg;
8330: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67 3d 3d  .  if( p->pLog==
8340: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 75 74  0 ) return;.  ut
8350: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 70 4c 6f  f8_printf(p->pLo
8360: 67 2c 20 22 28 25 64 29 20 25 73 5c 6e 22 2c 20  g, "(%d) %s\n", 
8370: 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67 29 3b  iErrCode, zMsg);
8380: 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e 70 4c 6f  .  fflush(p->pLo
8390: 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  g);.}../*.** SQL
83a0: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65 6c   function:  shel
83b0: 6c 5f 70 75 74 73 6e 6c 28 58 29 0a 2a 2a 0a 2a  l_putsnl(X).**.*
83c0: 2a 20 57 72 69 74 65 20 74 68 65 20 74 65 78 74  * Write the text
83d0: 20 58 20 74 6f 20 74 68 65 20 73 63 72 65 65 6e   X to the screen
83e0: 20 28 6f 72 20 77 68 61 74 65 76 65 72 20 6f 75   (or whatever ou
83f0: 74 70 75 74 20 69 73 20 62 65 69 6e 67 20 64 69  tput is being di
8400: 72 65 63 74 65 64 29 0a 2a 2a 20 61 64 64 69 6e  rected).** addin
8410: 67 20 61 20 6e 65 77 6c 69 6e 65 20 61 74 20 74  g a newline at t
8420: 68 65 20 65 6e 64 2c 20 61 6e 64 20 74 68 65 6e  he end, and then
8430: 20 72 65 74 75 72 6e 20 58 2e 0a 2a 2f 0a 73 74   return X..*/.st
8440: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50  atic void shellP
8450: 75 74 73 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  utsFunc(.  sqlit
8460: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
8470: 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20  ,.  int nVal,.  
8480: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
8490: 61 70 56 61 6c 0a 29 7b 0a 20 20 53 68 65 6c 6c  apVal.){.  Shell
84a0: 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c  State *p = (Shel
84b0: 6c 53 74 61 74 65 2a 29 73 71 6c 69 74 65 33 5f  lState*)sqlite3_
84c0: 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b  user_data(pCtx);
84d0: 0a 20 20 28 76 6f 69 64 29 6e 56 61 6c 3b 0a 20  .  (void)nVal;. 
84e0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
84f0: 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  out, "%s\n", sql
8500: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8510: 61 70 56 61 6c 5b 30 5d 29 29 3b 0a 20 20 73 71  apVal[0]));.  sq
8520: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
8530: 75 65 28 70 43 74 78 2c 20 61 70 56 61 6c 5b 30  ue(pCtx, apVal[0
8540: 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  ]);.}../*.** SQL
8550: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20 65 64 69   function:   edi
8560: 74 28 56 41 4c 55 45 29 0a 2a 2a 20 20 20 20 20  t(VALUE).**     
8570: 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69 74              edit
8580: 28 56 41 4c 55 45 2c 45 44 49 54 4f 52 29 0a 2a  (VALUE,EDITOR).*
8590: 2a 0a 2a 2a 20 54 68 65 73 65 20 73 74 65 70 73  *.** These steps
85a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
85b0: 57 72 69 74 65 20 56 41 4c 55 45 20 69 6e 74 6f  Write VALUE into
85c0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
85d0: 65 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 75  e..**     (2) Ru
85e0: 6e 20 70 72 6f 67 72 61 6d 20 45 44 49 54 4f 52  n program EDITOR
85f0: 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
8600: 72 79 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20  ry file..**     
8610: 28 33 29 20 52 65 61 64 20 74 68 65 20 74 65 6d  (3) Read the tem
8620: 70 6f 72 61 72 79 20 66 69 6c 65 20 62 61 63 6b  porary file back
8630: 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 73 20   and return its 
8640: 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 65 20 72  content as the r
8650: 65 73 75 6c 74 2e 0a 2a 2a 20 20 20 20 20 28 34  esult..**     (4
8660: 29 20 44 65 6c 65 74 65 20 74 68 65 20 74 65 6d  ) Delete the tem
8670: 70 6f 72 61 72 79 20 66 69 6c 65 0a 2a 2a 0a 2a  porary file.**.*
8680: 2a 20 49 66 20 74 68 65 20 45 44 49 54 4f 52 20  * If the EDITOR 
8690: 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 6d 69 74  argument is omit
86a0: 74 65 64 2c 20 75 73 65 20 74 68 65 20 76 61 6c  ted, use the val
86b0: 75 65 20 69 6e 20 74 68 65 20 56 49 53 55 41 4c  ue in the VISUAL
86c0: 0a 2a 2a 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  .** environment 
86d0: 76 61 72 69 61 62 6c 65 2e 20 20 49 66 20 73 74  variable.  If st
86e0: 69 6c 6c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ill there is no 
86f0: 45 44 49 54 4f 52 2c 20 74 68 72 6f 75 67 68 20  EDITOR, through 
8700: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
8710: 41 6c 73 6f 20 74 68 72 6f 77 20 61 6e 20 65 72  Also throw an er
8720: 72 6f 72 20 69 66 20 74 68 65 20 45 44 49 54 4f  ror if the EDITO
8730: 52 20 70 72 6f 67 72 61 6d 20 72 65 74 75 72 6e  R program return
8740: 73 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 65 78 69  s a non-zero exi
8750: 74 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 6e 64  t code..*/.#ifnd
8760: 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  ef SQLITE_NOHAVE
8770: 5f 53 59 53 54 45 4d 0a 73 74 61 74 69 63 20 76  _SYSTEM.static v
8780: 6f 69 64 20 65 64 69 74 46 75 6e 63 28 0a 20 20  oid editFunc(.  
8790: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
87a0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
87b0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
87c0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
87d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
87e0: 64 69 74 6f 72 3b 0a 20 20 63 68 61 72 20 2a 7a  ditor;.  char *z
87f0: 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  TempFile = 0;.  
8800: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
8810: 68 61 72 20 2a 7a 43 6d 64 20 3d 20 30 3b 0a 20  har *zCmd = 0;. 
8820: 20 69 6e 74 20 62 42 69 6e 3b 0a 20 20 69 6e 74   int bBin;.  int
8830: 20 72 63 3b 0a 20 20 69 6e 74 20 68 61 73 43 52   rc;.  int hasCR
8840: 4e 4c 20 3d 20 30 3b 0a 20 20 46 49 4c 45 20 2a  NL = 0;.  FILE *
8850: 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  f = 0;.  sqlite3
8860: 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 73 71 6c  _int64 sz;.  sql
8870: 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20  ite3_int64 x;.  
8880: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
8890: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67   = 0;..  if( arg
88a0: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 45 64 69  c==2 ){.    zEdi
88b0: 74 6f 72 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  tor = (const cha
88c0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
88d0: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
88e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45 64    }else{.    zEd
88f0: 69 74 6f 72 20 3d 20 67 65 74 65 6e 76 28 22 56  itor = getenv("V
8900: 49 53 55 41 4c 22 29 3b 0a 20 20 7d 0a 20 20 69  ISUAL");.  }.  i
8910: 66 28 20 7a 45 64 69 74 6f 72 3d 3d 30 20 29 7b  f( zEditor==0 ){
8920: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
8930: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
8940: 74 2c 20 22 6e 6f 20 65 64 69 74 6f 72 20 66 6f  t, "no editor fo
8950: 72 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b 0a  r edit()", -1);.
8960: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8970: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
8980: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
8990: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )==SQLITE_NULL )
89a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
89b0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
89c0: 78 74 2c 20 22 4e 55 4c 4c 20 69 6e 70 75 74 20  xt, "NULL input 
89d0: 74 6f 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b  to edit()", -1);
89e0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
89f0: 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  .  db = sqlite3_
8a00: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
8a10: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7a 54  e(context);.  zT
8a20: 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73  empFile = 0;.  s
8a30: 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
8a40: 72 6f 6c 28 64 62 2c 20 30 2c 20 53 51 4c 49 54  rol(db, 0, SQLIT
8a50: 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45  E_FCNTL_TEMPFILE
8a60: 4e 41 4d 45 2c 20 26 7a 54 65 6d 70 46 69 6c 65  NAME, &zTempFile
8a70: 29 3b 0a 20 20 69 66 28 20 7a 54 65 6d 70 46 69  );.  if( zTempFi
8a80: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  le==0 ){.    sql
8a90: 69 74 65 33 5f 75 69 6e 74 36 34 20 72 20 3d 20  ite3_uint64 r = 
8aa0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  0;.    sqlite3_r
8ab0: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
8ac0: 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 7a 54  (r), &r);.    zT
8ad0: 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  empFile = sqlite
8ae0: 33 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d 70 25  3_mprintf("temp%
8af0: 6c 6c 78 22 2c 20 72 29 3b 0a 20 20 20 20 69 66  llx", r);.    if
8b00: 28 20 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29  ( zTempFile==0 )
8b10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
8b20: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
8b30: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
8b40: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8b50: 0a 20 20 7d 0a 20 20 62 42 69 6e 20 3d 20 73 71  .  }.  bBin = sq
8b60: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
8b70: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
8b80: 45 5f 42 4c 4f 42 3b 0a 20 20 2f 2a 20 57 68 65  E_BLOB;.  /* Whe
8b90: 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  n writing the fi
8ba0: 6c 65 20 74 6f 20 62 65 20 65 64 69 74 65 64 2c  le to be edited,
8bb0: 20 64 6f 20 5c 6e 20 74 6f 20 5c 72 5c 6e 20 63   do \n to \r\n c
8bc0: 6f 6e 76 65 72 73 69 6f 6e 73 20 6f 6e 20 73 79  onversions on sy
8bd0: 73 74 65 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20  stems.  ** that 
8be0: 77 61 6e 74 20 5c 72 5c 6e 20 6c 69 6e 65 20 65  want \r\n line e
8bf0: 6e 64 69 6e 67 73 20 2a 2f 0a 20 20 66 20 3d 20  ndings */.  f = 
8c00: 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69 6c 65 2c  fopen(zTempFile,
8c10: 20 62 42 69 6e 20 3f 20 22 77 62 22 20 3a 20 22   bBin ? "wb" : "
8c20: 77 22 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20  w");.  if( f==0 
8c30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
8c40: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
8c50: 65 78 74 2c 20 22 65 64 69 74 28 29 20 63 61 6e  ext, "edit() can
8c60: 6e 6f 74 20 6f 70 65 6e 20 74 65 6d 70 20 66 69  not open temp fi
8c70: 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f  le", -1);.    go
8c80: 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64  to edit_func_end
8c90: 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20 73 71 6c  ;.  }.  sz = sql
8ca0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
8cb0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
8cc0: 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 78 20 3d   bBin ){.    x =
8cd0: 20 66 77 72 69 74 65 28 73 71 6c 69 74 65 33 5f   fwrite(sqlite3_
8ce0: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
8cf0: 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a  0]), 1, sz, f);.
8d00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
8d10: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
8d20: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
8d30: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
8d40: 76 5b 30 5d 29 3b 0a 20 20 20 20 2f 2a 20 52 65  v[0]);.    /* Re
8d50: 6d 65 6d 62 65 72 20 77 68 65 74 68 65 72 20 6f  member whether o
8d60: 72 20 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20  r not the value 
8d70: 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 74 61  originally conta
8d80: 69 6e 65 64 20 5c 72 5c 6e 20 2a 2f 0a 20 20 20  ined \r\n */.   
8d90: 20 69 66 28 20 7a 20 26 26 20 73 74 72 73 74 72   if( z && strstr
8da0: 28 7a 2c 22 5c 72 5c 6e 22 29 21 3d 30 20 29 20  (z,"\r\n")!=0 ) 
8db0: 68 61 73 43 52 4e 4c 20 3d 20 31 3b 0a 20 20 20  hasCRNL = 1;.   
8dc0: 20 78 20 3d 20 66 77 72 69 74 65 28 73 71 6c 69   x = fwrite(sqli
8dd0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
8de0: 72 67 76 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20  rgv[0]), 1, sz, 
8df0: 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  f);.  }.  fclose
8e00: 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20  (f);.  f = 0;.  
8e10: 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20  if( x!=sz ){.   
8e20: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8e30: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
8e40: 65 64 69 74 28 29 20 63 6f 75 6c 64 20 6e 6f 74  edit() could not
8e50: 20 77 72 69 74 65 20 74 68 65 20 77 68 6f 6c 65   write the whole
8e60: 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20   file", -1);.   
8e70: 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f   goto edit_func_
8e80: 65 6e 64 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20  end;.  }.  zCmd 
8e90: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
8ea0: 66 28 22 25 73 20 5c 22 25 73 5c 22 22 2c 20 7a  f("%s \"%s\"", z
8eb0: 45 64 69 74 6f 72 2c 20 7a 54 65 6d 70 46 69 6c  Editor, zTempFil
8ec0: 65 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d  e);.  if( zCmd==
8ed0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
8ee0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
8ef0: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
8f00: 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63    goto edit_func
8f10: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _end;.  }.  rc =
8f20: 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20   system(zCmd);. 
8f30: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
8f40: 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  md);.  if( rc ){
8f50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
8f60: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
8f70: 74 2c 20 22 45 44 49 54 4f 52 20 72 65 74 75 72  t, "EDITOR retur
8f80: 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20 2d  ned non-zero", -
8f90: 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69  1);.    goto edi
8fa0: 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a  t_func_end;.  }.
8fb0: 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d    f = fopen(zTem
8fc0: 70 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20  pFile, "rb");.  
8fd0: 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20  if( f==0 ){.    
8fe0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
8ff0: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 0a 20 20  rror(context,.  
9000: 20 20 20 20 22 65 64 69 74 28 29 20 63 61 6e 6e      "edit() cann
9010: 6f 74 20 72 65 6f 70 65 6e 20 74 65 6d 70 20 66  ot reopen temp f
9020: 69 6c 65 20 61 66 74 65 72 20 65 64 69 74 22 2c  ile after edit",
9030: 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65   -1);.    goto e
9040: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20  dit_func_end;.  
9050: 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 30 2c 20  }.  fseek(f, 0, 
9060: 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a 20  SEEK_END);.  sz 
9070: 3d 20 66 74 65 6c 6c 28 66 29 3b 0a 20 20 72 65  = ftell(f);.  re
9080: 77 69 6e 64 28 66 29 3b 0a 20 20 70 20 3d 20 73  wind(f);.  p = s
9090: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
90a0: 20 73 7a 2b 28 62 42 69 6e 3d 3d 30 29 20 29 3b   sz+(bBin==0) );
90b0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
90c0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
90d0: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
90e0: 6e 74 65 78 74 29 3b 0a 20 20 20 20 67 6f 74 6f  ntext);.    goto
90f0: 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a   edit_func_end;.
9100: 20 20 7d 0a 20 20 78 20 3d 20 66 72 65 61 64 28    }.  x = fread(
9110: 70 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20  p, 1, sz, f);.  
9120: 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 66 20 3d  fclose(f);.  f =
9130: 20 30 3b 0a 20 20 69 66 28 20 78 21 3d 73 7a 20   0;.  if( x!=sz 
9140: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
9150: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
9160: 65 78 74 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20  ext, "could not 
9170: 72 65 61 64 20 62 61 63 6b 20 74 68 65 20 77 68  read back the wh
9180: 6f 6c 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a  ole file", -1);.
9190: 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75      goto edit_fu
91a0: 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  nc_end;.  }.  if
91b0: 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 73 71  ( bBin ){.    sq
91c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
91d0: 62 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2c 20  b64(context, p, 
91e0: 73 7a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  sz, sqlite3_free
91f0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
9200: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 2c  sqlite3_int64 i,
9210: 20 6a 3b 0a 20 20 20 20 69 66 28 20 68 61 73 43   j;.    if( hasC
9220: 52 4e 4c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  RNL ){.      /* 
9230: 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
9240: 63 6f 6e 74 61 69 6e 73 20 5c 72 5c 6e 20 74 68  contains \r\n th
9250: 65 6e 20 64 6f 20 6e 6f 20 63 6f 6e 76 65 72 73  en do no convers
9260: 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 5c 6e 20  ions back to \n 
9270: 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20 73 7a 3b  */.      j = sz;
9280: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9290: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
92a0: 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
92b0: 6c 6c 79 20 63 6f 6e 74 61 69 6e 20 5c 72 5c 6e  lly contain \r\n
92c0: 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 61 6e   then convert an
92d0: 79 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20 5c  y new.      ** \
92e0: 72 5c 6e 20 62 61 63 6b 20 69 6e 74 6f 20 5c 6e  r\n back into \n
92f0: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
9300: 6a 3d 30 3b 20 69 3c 73 7a 3b 20 69 2b 2b 29 7b  j=0; i<sz; i++){
9310: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 5b 69  .        if( p[i
9320: 5d 3d 3d 27 5c 72 27 20 26 26 20 70 5b 69 2b 31  ]=='\r' && p[i+1
9330: 5d 3d 3d 27 5c 6e 27 20 29 20 69 2b 2b 3b 0a 20  ]=='\n' ) i++;. 
9340: 20 20 20 20 20 20 20 70 5b 6a 2b 2b 5d 20 3d 20         p[j++] = 
9350: 70 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  p[i];.      }.  
9360: 20 20 20 20 73 7a 20 3d 20 6a 3b 0a 20 20 20 20      sz = j;.    
9370: 20 20 70 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 20    p[sz] = 0;.   
9380: 20 7d 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   } .    sqlite3_
9390: 72 65 73 75 6c 74 5f 74 65 78 74 36 34 28 63 6f  result_text64(co
93a0: 6e 74 65 78 74 2c 20 28 63 6f 6e 73 74 20 63 68  ntext, (const ch
93b0: 61 72 2a 29 70 2c 20 73 7a 2c 0a 20 20 20 20 20  ar*)p, sz,.     
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
93e0: 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  e, SQLITE_UTF8);
93f0: 0a 20 20 7d 0a 20 20 70 20 3d 20 30 3b 0a 0a 65  .  }.  p = 0;..e
9400: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3a 0a 20 20  dit_func_end:.  
9410: 69 66 28 20 66 20 29 20 66 63 6c 6f 73 65 28 66  if( f ) fclose(f
9420: 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 54 65 6d  );.  unlink(zTem
9430: 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  pFile);.  sqlite
9440: 33 5f 66 72 65 65 28 7a 54 65 6d 70 46 69 6c 65  3_free(zTempFile
9450: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
9460: 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  e(p);.}.#endif /
9470: 2a 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f  * SQLITE_NOHAVE_
9480: 53 59 53 54 45 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SYSTEM */../*.**
9490: 20 53 61 76 65 20 6f 72 20 72 65 73 74 6f 72 65   Save or restore
94a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 75 74   the current out
94b0: 70 75 74 20 6d 6f 64 65 0a 2a 2f 0a 73 74 61 74  put mode.*/.stat
94c0: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f  ic void outputMo
94d0: 64 65 50 75 73 68 28 53 68 65 6c 6c 53 74 61 74  dePush(ShellStat
94e0: 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65  e *p){.  p->mode
94f0: 50 72 69 6f 72 20 3d 20 70 2d 3e 6d 6f 64 65 3b  Prior = p->mode;
9500: 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c  .  memcpy(p->col
9510: 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e 63 6f 6c  SepPrior, p->col
9520: 53 65 70 61 72 61 74 6f 72 2c 20 73 69 7a 65 6f  Separator, sizeo
9530: 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  f(p->colSeparato
9540: 72 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d  r));.  memcpy(p-
9550: 3e 72 6f 77 53 65 70 50 72 69 6f 72 2c 20 70 2d  >rowSepPrior, p-
9560: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 73  >rowSeparator, s
9570: 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
9580: 72 61 74 6f 72 29 29 3b 0a 7d 0a 73 74 61 74 69  rator));.}.stati
9590: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64  c void outputMod
95a0: 65 50 6f 70 28 53 68 65 6c 6c 53 74 61 74 65 20  ePop(ShellState 
95b0: 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 20 3d  *p){.  p->mode =
95c0: 20 70 2d 3e 6d 6f 64 65 50 72 69 6f 72 3b 0a 20   p->modePrior;. 
95d0: 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65   memcpy(p->colSe
95e0: 70 61 72 61 74 6f 72 2c 20 70 2d 3e 63 6f 6c 53  parator, p->colS
95f0: 65 70 50 72 69 6f 72 2c 20 73 69 7a 65 6f 66 28  epPrior, sizeof(
9600: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
9610: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72  );.  memcpy(p->r
9620: 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 70 2d 3e  owSeparator, p->
9630: 72 6f 77 53 65 70 50 72 69 6f 72 2c 20 73 69 7a  rowSepPrior, siz
9640: 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
9650: 74 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tor));.}../*.** 
9660: 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  Output the given
9670: 20 73 74 72 69 6e 67 20 61 73 20 61 20 68 65 78   string as a hex
9680: 2d 65 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28 65  -encoded blob (e
9690: 67 2e 20 58 27 31 32 33 34 27 20 29 0a 2a 2f 0a  g. X'1234' ).*/.
96a0: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
96b0: 75 74 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c 45  ut_hex_blob(FILE
96c0: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69   *out, const voi
96d0: 64 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42  d *pBlob, int nB
96e0: 6c 6f 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  lob){.  int i;. 
96f0: 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 28   char *zBlob = (
9700: 63 68 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20 20  char *)pBlob;.  
9710: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
9720: 58 27 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  X'");.  for(i=0;
9730: 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20   i<nBlob; i++){ 
9740: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
9750: 25 30 32 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30  %02x",zBlob[i]&0
9760: 78 66 66 29 3b 20 7d 0a 20 20 72 61 77 5f 70 72  xff); }.  raw_pr
9770: 69 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a 7d  intf(out,"'");.}
9780: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 73  ../*.** Find a s
9790: 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f  tring that is no
97a0: 74 20 66 6f 75 6e 64 20 61 6e 79 77 68 65 72 65  t found anywhere
97b0: 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e   in z[].  Return
97c0: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
97d0: 20 74 68 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2a   that string..**
97e0: 0a 2a 2a 20 54 72 79 20 74 6f 20 75 73 65 20 7a  .** Try to use z
97f0: 41 20 61 6e 64 20 7a 42 20 66 69 72 73 74 2e 20  A and zB first. 
9800: 20 49 66 20 62 6f 74 68 20 6f 66 20 74 68 6f 73   If both of thos
9810: 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 66 6f  e are already fo
9820: 75 6e 64 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68  und in z[].** th
9830: 65 6e 20 6d 61 6b 65 20 75 70 20 73 6f 6d 65 20  en make up some 
9840: 73 74 72 69 6e 67 20 61 6e 64 20 73 74 6f 72 65  string and store
9850: 20 69 74 20 69 6e 20 74 68 65 20 62 75 66 66 65   it in the buffe
9860: 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  r zBuf..*/.stati
9870: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
9880: 75 73 65 64 5f 73 74 72 69 6e 67 28 0a 20 20 63  used_string(.  c
9890: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20  onst char *z,   
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98b0: 20 2f 2a 20 52 65 73 75 6c 74 20 6d 75 73 74 20   /* Result must 
98c0: 6e 6f 74 20 61 70 70 65 61 72 20 61 6e 79 77 68  not appear anywh
98d0: 65 72 65 20 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f  ere in z */.  co
98e0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f  nst char *zA, co
98f0: 6e 73 74 20 63 68 61 72 20 2a 7a 42 2c 20 20 20  nst char *zB,   
9900: 2f 2a 20 54 72 79 20 74 68 65 73 65 20 66 69 72  /* Try these fir
9910: 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42  st */.  char *zB
9920: 75 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  uf              
9930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
9940: 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 67 65  ce to store a ge
9950: 6e 65 72 61 74 65 64 20 73 74 72 69 6e 67 20 2a  nerated string *
9960: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
9970: 69 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 74 72  i = 0;.  if( str
9980: 73 74 72 28 7a 2c 20 7a 41 29 3d 3d 30 20 29 20  str(z, zA)==0 ) 
9990: 72 65 74 75 72 6e 20 7a 41 3b 0a 20 20 69 66 28  return zA;.  if(
99a0: 20 73 74 72 73 74 72 28 7a 2c 20 7a 42 29 3d 3d   strstr(z, zB)==
99b0: 30 20 29 20 72 65 74 75 72 6e 20 7a 42 3b 0a 20  0 ) return zB;. 
99c0: 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
99d0: 5f 73 6e 70 72 69 6e 74 66 28 32 30 2c 7a 42 75  _snprintf(20,zBu
99e0: 66 2c 22 28 25 73 25 75 29 22 2c 20 7a 41 2c 20  f,"(%s%u)", zA, 
99f0: 69 2b 2b 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  i++);.  }while( 
9a00: 73 74 72 73 74 72 28 7a 2c 7a 42 75 66 29 21 3d  strstr(z,zBuf)!=
9a10: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42  0 );.  return zB
9a20: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  uf;.}../*.** Out
9a30: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
9a40: 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64  ring as a quoted
9a50: 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51   string using SQ
9a60: 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e  L quoting conven
9a70: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  tions..**.** See
9a80: 20 61 6c 73 6f 3a 20 6f 75 74 70 75 74 5f 71 75   also: output_qu
9a90: 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72  oted_escaped_str
9aa0: 69 6e 67 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ing().*/.static 
9ab0: 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74  void output_quot
9ac0: 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  ed_string(FILE *
9ad0: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
9ae0: 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *z){.  int i;.  
9af0: 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e  char c;.  setBin
9b00: 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b  aryMode(out, 1);
9b10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d  .  for(i=0; (c =
9b20: 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d   z[i])!=0 && c!=
9b30: 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69  '\''; i++){}.  i
9b40: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75  f( c==0 ){.    u
9b50: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  tf8_printf(out,"
9b60: 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73  '%s'",z);.  }els
9b70: 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  e{.    raw_print
9b80: 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20  f(out, "'");.   
9b90: 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
9ba0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20      for(i=0; (c 
9bb0: 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21  = z[i])!=0 && c!
9bc0: 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\''; i++){}.  
9bd0: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20      if( c=='\'' 
9be0: 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ) i++;.      if(
9bf0: 20 69 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74   i ){.        ut
9c00: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
9c10: 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20  %.*s", i, z);.  
9c20: 20 20 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20        z += i;.  
9c30: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9c40: 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20  c=='\'' ){.     
9c50: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
9c60: 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20  t, "'");.       
9c70: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9c80: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
9c90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  0 ){.        bre
9ca0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
9cb0: 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20    z++;.    }.   
9cc0: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
9cd0: 20 22 27 22 29 3b 0a 20 20 7d 0a 20 20 73 65 74   "'");.  }.  set
9ce0: 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29  TextMode(out, 1)
9cf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  ;.}../*.** Outpu
9d00: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
9d10: 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73  ng as a quoted s
9d20: 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20  tring using SQL 
9d30: 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69  quoting conventi
9d40: 6f 6e 73 2e 0a 2a 2a 20 41 64 64 69 74 69 6f 6e  ons..** Addition
9d50: 61 6c 6c 6c 79 20 2c 20 65 73 63 61 70 65 20 74  allly , escape t
9d60: 68 65 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22  he "\n" and "\r"
9d70: 20 63 68 61 72 61 63 74 65 72 73 20 73 6f 20 74   characters so t
9d80: 68 61 74 20 74 68 65 79 20 64 6f 20 6e 6f 74 0a  hat they do not.
9d90: 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74 65 64  ** get corrupted
9da0: 20 62 79 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20   by end-of-line 
9db0: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 66 61 63 69  translation faci
9dc0: 6c 69 74 69 65 73 20 69 6e 20 73 6f 6d 65 20 6f  lities in some o
9dd0: 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74  perating.** syst
9de0: 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ems..**.** This 
9df0: 69 73 20 6c 69 6b 65 20 6f 75 74 70 75 74 5f 71  is like output_q
9e00: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 29 20 62  uoted_string() b
9e10: 75 74 20 77 69 74 68 20 74 68 65 20 61 64 64 69  ut with the addi
9e20: 74 69 6f 6e 20 6f 66 20 74 68 65 20 5c 72 5c 6e  tion of the \r\n
9e30: 0a 2a 2a 20 65 73 63 61 70 65 20 6d 65 63 68 61  .** escape mecha
9e40: 6e 69 73 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nism..*/.static 
9e50: 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74  void output_quot
9e60: 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e  ed_escaped_strin
9e70: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
9e80: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
9e90: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a  nt i;.  char c;.
9ea0: 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28    setBinaryMode(
9eb0: 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69  out, 1);.  for(i
9ec0: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
9ed0: 30 20 26 26 20 63 21 3d 27 5c 27 27 20 26 26 20  0 && c!='\'' && 
9ee0: 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c  c!='\n' && c!='\
9ef0: 72 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28  r'; i++){}.  if(
9f00: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66   c==0 ){.    utf
9f10: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25  8_printf(out,"'%
9f20: 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  s'",z);.  }else{
9f30: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
9f40: 2a 7a 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 63 6f  *zNL = 0;.    co
9f50: 6e 73 74 20 63 68 61 72 20 2a 7a 43 52 20 3d 20  nst char *zCR = 
9f60: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d  0;.    int nNL =
9f70: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 52 20   0;.    int nCR 
9f80: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 7a 42  = 0;.    char zB
9f90: 75 66 31 5b 32 30 5d 2c 20 7a 42 75 66 32 5b 32  uf1[20], zBuf2[2
9fa0: 30 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  0];.    for(i=0;
9fb0: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
9fc0: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e     if( z[i]=='\n
9fd0: 27 20 29 20 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20  ' ) nNL++;.     
9fe0: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20   if( z[i]=='\r' 
9ff0: 29 20 6e 43 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ) nCR++;.    }. 
a000: 20 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20     if( nNL ){.  
a010: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
a020: 75 74 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b  ut, "replace(");
a030: 0a 20 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75  .      zNL = unu
a040: 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c  sed_string(z, "\
a050: 5c 6e 22 2c 20 22 5c 5c 30 31 32 22 2c 20 7a 42  \n", "\\012", zB
a060: 75 66 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  uf1);.    }.    
a070: 69 66 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20  if( nCR ){.     
a080: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a090: 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20   "replace(");.  
a0a0: 20 20 20 20 7a 43 52 20 3d 20 75 6e 75 73 65 64      zCR = unused
a0b0: 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 72 22  _string(z, "\\r"
a0c0: 2c 20 22 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32  , "\\015", zBuf2
a0d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77  );.    }.    raw
a0e0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22  _printf(out, "'"
a0f0: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a  );.    while( *z
a100: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
a110: 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  0; (c = z[i])!=0
a120: 20 26 26 20 63 21 3d 27 5c 6e 27 20 26 26 20 63   && c!='\n' && c
a130: 21 3d 27 5c 72 27 20 26 26 20 63 21 3d 27 5c 27  !='\r' && c!='\'
a140: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  '; i++){}.      
a150: 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b  if( c=='\'' ) i+
a160: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29  +;.      if( i )
a170: 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
a180: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73  rintf(out, "%.*s
a190: 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20  ", i, z);.      
a1a0: 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20    z += i;.      
a1b0: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
a1c0: 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72  \'' ){.        r
a1d0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a1e0: 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  '");.        con
a1f0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
a200: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
a210: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
a220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b        }.      z+
a230: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  +;.      if( c==
a240: 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\n' ){.        
a250: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
a260: 22 25 73 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20  "%s", zNL);.    
a270: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
a280: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f      }.      raw_
a290: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
a2a0: 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20  , zCR);.    }.  
a2b0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a2c0: 2c 20 22 27 22 29 3b 0a 20 20 20 20 69 66 28 20  , "'");.    if( 
a2d0: 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72 61 77  nCR ){.      raw
a2e0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27  _printf(out, ",'
a2f0: 25 73 27 2c 63 68 61 72 28 31 33 29 29 22 2c 20  %s',char(13))", 
a300: 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zCR);.    }.    
a310: 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20  if( nNL ){.     
a320: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a330: 20 22 2c 27 25 73 27 2c 63 68 61 72 28 31 30 29   ",'%s',char(10)
a340: 29 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a  )", zNL);.    }.
a350: 20 20 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64    }.  setTextMod
a360: 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  e(out, 1);.}../*
a370: 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67  .** Output the g
a380: 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61  iven string as a
a390: 20 71 75 6f 74 65 64 20 61 63 63 6f 72 64 69 6e   quoted accordin
a3a0: 67 20 74 6f 20 43 20 6f 72 20 54 43 4c 20 71 75  g to C or TCL qu
a3b0: 6f 74 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a  oting rules..*/.
a3c0: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
a3d0: 75 74 5f 63 5f 73 74 72 69 6e 67 28 46 49 4c 45  ut_c_string(FILE
a3e0: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
a3f0: 72 20 2a 7a 29 7b 0a 20 20 75 6e 73 69 67 6e 65  r *z){.  unsigne
a400: 64 20 69 6e 74 20 63 3b 0a 20 20 66 70 75 74 63  d int c;.  fputc
a410: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 77 68  ('"', out);.  wh
a420: 69 6c 65 28 20 28 63 20 3d 20 2a 28 7a 2b 2b 29  ile( (c = *(z++)
a430: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
a440: 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  c=='\\' ){.     
a450: 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a   fputc(c, out);.
a460: 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f        fputc(c, o
a470: 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ut);.    }else i
a480: 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20  f( c=='"' ){.   
a490: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a4a0: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a4b0: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('"', out);.    
a4c0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 74  }else if( c=='\t
a4d0: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a4e0: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a4f0: 20 20 20 66 70 75 74 63 28 27 74 27 2c 20 6f 75     fputc('t', ou
a500: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a510: 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  ( c=='\n' ){.   
a520: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a530: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a540: 28 27 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('n', out);.    
a550: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 72  }else if( c=='\r
a560: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a570: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a580: 20 20 20 66 70 75 74 63 28 27 72 27 2c 20 6f 75     fputc('r', ou
a590: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a5a0: 28 20 21 69 73 70 72 69 6e 74 28 63 26 30 78 66  ( !isprint(c&0xf
a5b0: 66 29 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  f) ){.      raw_
a5c0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 5c 25  printf(out, "\\%
a5d0: 30 33 6f 22 2c 20 63 26 30 78 66 66 29 3b 0a 20  03o", c&0xff);. 
a5e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a5f0: 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20  fputc(c, out);. 
a600: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 75 74 63     }.  }.  fputc
a610: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f  ('"', out);.}../
a620: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
a630: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 77 69 74  given string wit
a640: 68 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  h characters tha
a650: 74 20 61 72 65 20 73 70 65 63 69 61 6c 20 74 6f  t are special to
a660: 0a 2a 2a 20 48 54 4d 4c 20 65 73 63 61 70 65 64  .** HTML escaped
a670: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a680: 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72   output_html_str
a690: 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  ing(FILE *out, c
a6a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
a6b0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 3d   int i;.  if( z=
a6c0: 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 77  =0 ) z = "";.  w
a6d0: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
a6e0: 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a  for(i=0;   z[i].
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a              && z
a700: 5b 69 5d 21 3d 27 3c 27 0a 20 20 20 20 20 20 20  [i]!='<'.       
a710: 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 26       && z[i]!='&
a720: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  '.            &&
a730: 20 7a 5b 69 5d 21 3d 27 3e 27 0a 20 20 20 20 20   z[i]!='>'.     
a740: 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d         && z[i]!=
a750: 27 5c 22 27 0a 20 20 20 20 20 20 20 20 20 20 20  '\"'.           
a760: 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a   && z[i]!='\'';.
a770: 20 20 20 20 20 20 20 20 69 2b 2b 29 7b 7d 0a 20          i++){}. 
a780: 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20     if( i>0 ){.  
a790: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
a7a0: 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b  out,"%.*s",i,z);
a7b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
a7c0: 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20  [i]=='<' ){.    
a7d0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a7e0: 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65  ,"&lt;");.    }e
a7f0: 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26  lse if( z[i]=='&
a800: 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ' ){.      raw_p
a810: 72 69 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b  rintf(out,"&amp;
a820: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ");.    }else if
a830: 28 20 7a 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20  ( z[i]=='>' ){. 
a840: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
a850: 6f 75 74 2c 22 26 67 74 3b 22 29 3b 0a 20 20 20  out,"&gt;");.   
a860: 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d   }else if( z[i]=
a870: 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 72  ='\"' ){.      r
a880: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26  aw_printf(out,"&
a890: 71 75 6f 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c  quot;");.    }el
a8a0: 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27  se if( z[i]=='\'
a8b0: 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ' ){.      raw_p
a8c0: 72 69 6e 74 66 28 6f 75 74 2c 22 26 23 33 39 3b  rintf(out,"&#39;
a8d0: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
a8e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a8f0: 7d 0a 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31  }.    z += i + 1
a900: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
a910: 66 20 61 20 66 69 65 6c 64 20 63 6f 6e 74 61 69  f a field contai
a920: 6e 73 20 61 6e 79 20 63 68 61 72 61 63 74 65 72  ns any character
a930: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 61   identified by a
a940: 20 31 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   1 in the follow
a950: 69 6e 67 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68  ing.** array, th
a960: 65 6e 20 74 68 65 20 73 74 72 69 6e 67 20 6d 75  en the string mu
a970: 73 74 20 62 65 20 71 75 6f 74 65 64 20 66 6f 72  st be quoted for
a980: 20 43 53 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   CSV..*/.static 
a990: 63 6f 6e 73 74 20 63 68 61 72 20 6e 65 65 64 43  const char needC
a9a0: 73 76 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20  svQuote[] = {.  
a9b0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a9c0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
a9d0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a9e0: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
a9f0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
aa00: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
aa10: 31 2c 20 31 2c 0a 20 20 31 2c 20 30 2c 20 31 2c  1, 1,.  1, 0, 1,
aa20: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20   0, 0, 0, 0, 1, 
aa30: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
aa40: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
aa50: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
aa60: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
aa70: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
aa80: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
aa90: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
aaa0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
aab0: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
aac0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
aad0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
aae0: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
aaf0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
ab00: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
ab10: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
ab20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
ab30: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
ab40: 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 0a 20 20  , 0, 0, 0, 1,.  
ab50: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
ab60: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
ab70: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
ab80: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
ab90: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
aba0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
abb0: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
abc0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
abd0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
abe0: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
abf0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
ac00: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
ac10: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
ac20: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
ac30: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
ac40: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
ac50: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
ac60: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
ac70: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ac80: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
ac90: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
aca0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
acb0: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
acc0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
acd0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
ace0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 7d 3b  , 1, 1, 1, 1,.};
acf0: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61  ../*.** Output a
ad00: 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
ad10: 43 53 56 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20  CSV.  Actually, 
ad20: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 20  p->colSeparator 
ad30: 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
ad40: 68 65 20 73 65 70 61 72 61 74 6f 72 2c 20 77 68  he separator, wh
ad50: 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
ad60: 6f 74 20 62 65 20 61 20 63 6f 6d 6d 61 2e 20 20  ot be a comma.  
ad70: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 20 69 73 0a  p->nullValue is.
ad80: 2a 2a 20 74 68 65 20 6e 75 6c 6c 20 76 61 6c 75  ** the null valu
ad90: 65 2e 20 20 53 74 72 69 6e 67 73 20 61 72 65 20  e.  Strings are 
ada0: 71 75 6f 74 65 64 20 69 66 20 6e 65 63 65 73 73  quoted if necess
adb0: 61 72 79 2e 20 20 54 68 65 20 73 65 70 61 72 61  ary.  The separa
adc0: 74 6f 72 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 69  tor.** is only i
add0: 73 73 75 65 64 20 69 66 20 62 53 65 70 20 69 73  ssued if bSep is
ade0: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
adf0: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 73 76   void output_csv
ae00: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
ae10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
ae20: 6e 74 20 62 53 65 70 29 7b 0a 20 20 46 49 4c 45  nt bSep){.  FILE
ae30: 20 2a 6f 75 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a   *out = p->out;.
ae40: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
ae50: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
ae60: 74 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61  t,"%s",p->nullVa
ae70: 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lue);.  }else{. 
ae80: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
ae90: 74 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33  t nSep = strlen3
aea0: 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  0(p->colSeparato
aeb0: 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  r);.    for(i=0;
aec0: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
aed0: 20 20 20 69 66 28 20 6e 65 65 64 43 73 76 51 75     if( needCsvQu
aee0: 6f 74 65 5b 28 28 75 6e 73 69 67 6e 65 64 20 63  ote[((unsigned c
aef0: 68 61 72 2a 29 7a 29 5b 69 5d 5d 0a 20 20 20 20  har*)z)[i]].    
af00: 20 20 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70       || (z[i]==p
af10: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30  ->colSeparator[0
af20: 5d 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  ] &&.           
af30: 20 20 28 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d 65    (nSep==1 || me
af40: 6d 63 6d 70 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65  mcmp(z, p->colSe
af50: 70 61 72 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d  parator, nSep)==
af60: 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
af70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72   = 0;.        br
af80: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
af90: 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20   }.    if( i==0 
afa0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
afb0: 51 75 6f 74 65 64 20 3d 20 73 71 6c 69 74 65 33  Quoted = sqlite3
afc0: 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22  _mprintf("\"%w\"
afd0: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 75 74 66  ", z);.      utf
afe0: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
aff0: 73 22 2c 20 7a 51 75 6f 74 65 64 29 3b 0a 20 20  s", zQuoted);.  
b000: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
b010: 28 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 7d  (zQuoted);.    }
b020: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38  else{.      utf8
b030: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
b040: 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ", z);.    }.  }
b050: 0a 20 20 69 66 28 20 62 53 65 70 20 29 7b 0a 20  .  if( bSep ){. 
b060: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
b070: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
b080: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
b090: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
b0a0: 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 77 68   routine runs wh
b0b0: 65 6e 20 74 68 65 20 75 73 65 72 20 70 72 65 73  en the user pres
b0c0: 73 65 73 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74  ses Ctrl-C.*/.st
b0d0: 61 74 69 63 20 76 6f 69 64 20 69 6e 74 65 72 72  atic void interr
b0e0: 75 70 74 5f 68 61 6e 64 6c 65 72 28 69 6e 74 20  upt_handler(int 
b0f0: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
b100: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
b110: 55 73 65 64 29 3b 0a 20 20 73 65 65 6e 49 6e 74  Used);.  seenInt
b120: 65 72 72 75 70 74 2b 2b 3b 0a 20 20 69 66 28 20  errupt++;.  if( 
b130: 73 65 65 6e 49 6e 74 65 72 72 75 70 74 3e 32 20  seenInterrupt>2 
b140: 29 20 65 78 69 74 28 31 29 3b 0a 20 20 69 66 28  ) exit(1);.  if(
b150: 20 67 6c 6f 62 61 6c 44 62 20 29 20 73 71 6c 69   globalDb ) sqli
b160: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 67 6c  te3_interrupt(gl
b170: 6f 62 61 6c 44 62 29 3b 0a 7d 0a 0a 23 69 66 20  obalDb);.}..#if 
b180: 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29  (defined(_WIN32)
b190: 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
b1a0: 32 29 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  2)) && !defined(
b1b0: 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 0a 2a  _WIN32_WCE)./*.*
b1c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
b1d0: 75 6e 73 20 66 6f 72 20 63 6f 6e 73 6f 6c 65 20  uns for console 
b1e0: 65 76 65 6e 74 73 20 28 65 2e 67 2e 20 43 74 72  events (e.g. Ctr
b1f0: 6c 2d 43 29 20 6f 6e 20 57 69 6e 33 32 0a 2a 2f  l-C) on Win32.*/
b200: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 57 49 4e  .static BOOL WIN
b210: 41 50 49 20 43 6f 6e 73 6f 6c 65 43 74 72 6c 48  API ConsoleCtrlH
b220: 61 6e 64 6c 65 72 28 0a 20 20 44 57 4f 52 44 20  andler(.  DWORD 
b230: 64 77 43 74 72 6c 54 79 70 65 20 2f 2a 20 4f 6e  dwCtrlType /* On
b240: 65 20 6f 66 20 74 68 65 20 43 54 52 4c 5f 2a 5f  e of the CTRL_*_
b250: 45 56 45 4e 54 20 63 6f 6e 73 74 61 6e 74 73 20  EVENT constants 
b260: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 64 77 43 74  */.){.  if( dwCt
b270: 72 6c 54 79 70 65 3d 3d 43 54 52 4c 5f 43 5f 45  rlType==CTRL_C_E
b280: 56 45 4e 54 20 29 7b 0a 20 20 20 20 69 6e 74 65  VENT ){.    inte
b290: 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 30 29  rrupt_handler(0)
b2a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55  ;.    return TRU
b2b0: 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
b2c0: 46 41 4c 53 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a  FALSE;.}.#endif.
b2d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b2e0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
b2f0: 4f 4e 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  ON./*.** When th
b300: 65 20 22 2e 61 75 74 68 20 4f 4e 22 20 69 73 20  e ".auth ON" is 
b310: 73 65 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  set, the followi
b320: 6e 67 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61  ng authorizer ca
b330: 6c 6c 62 61 63 6b 20 69 73 0a 2a 2a 20 69 6e 76  llback is.** inv
b340: 6f 6b 65 64 2e 20 20 49 74 20 61 6c 77 61 79 73  oked.  It always
b350: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
b360: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
b370: 74 20 73 68 65 6c 6c 41 75 74 68 28 0a 20 20 76  t shellAuth(.  v
b380: 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61  oid *pClientData
b390: 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f  ,.  int op,.  co
b3a0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 31 2c 0a 20  nst char *zA1,. 
b3b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 32   const char *zA2
b3c0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b3d0: 7a 41 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  zA3,.  const cha
b3e0: 72 20 2a 7a 41 34 0a 29 7b 0a 20 20 53 68 65 6c  r *zA4.){.  Shel
b3f0: 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65  lState *p = (She
b400: 6c 6c 53 74 61 74 65 2a 29 70 43 6c 69 65 6e 74  llState*)pClient
b410: 44 61 74 61 3b 0a 20 20 73 74 61 74 69 63 20 63  Data;.  static c
b420: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 63 74  onst char *azAct
b430: 69 6f 6e 5b 5d 20 3d 20 7b 20 30 2c 0a 20 20 20  ion[] = { 0,.   
b440: 20 20 22 43 52 45 41 54 45 5f 49 4e 44 45 58 22    "CREATE_INDEX"
b450: 2c 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  ,         "CREAT
b460: 45 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20  E_TABLE",       
b470: 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 49    "CREATE_TEMP_I
b480: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 43 52 45  NDEX",.     "CRE
b490: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c  ATE_TEMP_TABLE",
b4a0: 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50      "CREATE_TEMP
b4b0: 5f 54 52 49 47 47 45 52 22 2c 20 20 22 43 52 45  _TRIGGER",  "CRE
b4c0: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a  ATE_TEMP_VIEW",.
b4d0: 20 20 20 20 20 22 43 52 45 41 54 45 5f 54 52 49       "CREATE_TRI
b4e0: 47 47 45 52 22 2c 20 20 20 20 20 20 20 22 43 52  GGER",       "CR
b4f0: 45 41 54 45 5f 56 49 45 57 22 2c 20 20 20 20 20  EATE_VIEW",     
b500: 20 20 20 20 20 22 44 45 4c 45 54 45 22 2c 0a 20       "DELETE",. 
b510: 20 20 20 20 22 44 52 4f 50 5f 49 4e 44 45 58 22      "DROP_INDEX"
b520: 2c 20 20 20 20 20 20 20 20 20 20 20 22 44 52 4f  ,           "DRO
b530: 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20  P_TABLE",       
b540: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 49      "DROP_TEMP_I
b550: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 44 52 4f  NDEX",.     "DRO
b560: 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20  P_TEMP_TABLE",  
b570: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54      "DROP_TEMP_T
b580: 52 49 47 47 45 52 22 2c 20 20 20 20 22 44 52 4f  RIGGER",    "DRO
b590: 50 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20  P_TEMP_VIEW",.  
b5a0: 20 20 20 22 44 52 4f 50 5f 54 52 49 47 47 45 52     "DROP_TRIGGER
b5b0: 22 2c 20 20 20 20 20 20 20 20 20 22 44 52 4f 50  ",         "DROP
b5c0: 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20 20 20  _VIEW",         
b5d0: 20 20 20 22 49 4e 53 45 52 54 22 2c 0a 20 20 20     "INSERT",.   
b5e0: 20 20 22 50 52 41 47 4d 41 22 2c 20 20 20 20 20    "PRAGMA",     
b5f0: 20 20 20 20 20 20 20 20 20 20 22 52 45 41 44 22            "READ"
b600: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b610: 20 20 22 53 45 4c 45 43 54 22 2c 0a 20 20 20 20    "SELECT",.    
b620: 20 22 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20   "TRANSACTION", 
b630: 20 20 20 20 20 20 20 20 20 22 55 50 44 41 54 45           "UPDATE
b640: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
b650: 20 22 41 54 54 41 43 48 22 2c 0a 20 20 20 20 20   "ATTACH",.     
b660: 22 44 45 54 41 43 48 22 2c 20 20 20 20 20 20 20  "DETACH",       
b670: 20 20 20 20 20 20 20 20 22 41 4c 54 45 52 5f 54          "ALTER_T
b680: 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20  ABLE",          
b690: 22 52 45 49 4e 44 45 58 22 2c 0a 20 20 20 20 20  "REINDEX",.     
b6a0: 22 41 4e 41 4c 59 5a 45 22 2c 20 20 20 20 20 20  "ANALYZE",      
b6b0: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f          "CREATE_
b6c0: 56 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20  VTABLE",        
b6d0: 22 44 52 4f 50 5f 56 54 41 42 4c 45 22 2c 0a 20  "DROP_VTABLE",. 
b6e0: 20 20 20 20 22 46 55 4e 43 54 49 4f 4e 22 2c 20      "FUNCTION", 
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 41 56              "SAV
b700: 45 50 4f 49 4e 54 22 2c 20 20 20 20 20 20 20 20  EPOINT",        
b710: 20 20 20 20 22 52 45 43 55 52 53 49 56 45 22 0a      "RECURSIVE".
b720: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
b730: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b 34  const char *az[4
b740: 5d 3b 0a 20 20 61 7a 5b 30 5d 20 3d 20 7a 41 31  ];.  az[0] = zA1
b750: 3b 0a 20 20 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b  ;.  az[1] = zA2;
b760: 0a 20 20 61 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a  .  az[2] = zA3;.
b770: 20 20 61 7a 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20    az[3] = zA4;. 
b780: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
b790: 6f 75 74 2c 20 22 61 75 74 68 6f 72 69 7a 65 72  out, "authorizer
b7a0: 3a 20 25 73 22 2c 20 61 7a 41 63 74 69 6f 6e 5b  : %s", azAction[
b7b0: 6f 70 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  op]);.  for(i=0;
b7c0: 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<4; i++){.    
b7d0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
b7e0: 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 69 66 28  t, " ");.    if(
b7f0: 20 61 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20   az[i] ){.      
b800: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
b810: 70 2d 3e 6f 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a  p->out, az[i]);.
b820: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b830: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
b840: 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20  ut, "NULL");.   
b850: 20 7d 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69   }.  }.  raw_pri
b860: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22  ntf(p->out, "\n"
b870: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
b880: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
b890: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  ./*.** Print a s
b8a0: 63 68 65 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e  chema statement.
b8b0: 20 20 50 61 72 74 20 6f 66 20 4d 4f 44 45 5f 53    Part of MODE_S
b8c0: 65 6d 69 20 61 6e 64 20 4d 4f 44 45 5f 50 72 65  emi and MODE_Pre
b8d0: 74 74 79 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a  tty output..**.*
b8e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
b8f0: 6f 6e 76 65 72 74 73 20 73 6f 6d 65 20 43 52 45  onverts some CRE
b900: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
b910: 65 6e 74 73 20 66 6f 72 20 73 68 61 64 6f 77 20  ents for shadow 
b920: 74 61 62 6c 65 73 0a 2a 2a 20 69 6e 20 46 54 53  tables.** in FTS
b930: 33 2f 34 2f 35 20 69 6e 74 6f 20 43 52 45 41 54  3/4/5 into CREAT
b940: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
b950: 58 49 53 54 53 20 73 74 61 74 65 6d 65 6e 74 73  XISTS statements
b960: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b970: 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65   printSchemaLine
b980: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73  (FILE *out, cons
b990: 74 20 63 68 61 72 20 2a 7a 2c 20 63 6f 6e 73 74  t char *z, const
b9a0: 20 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20   char *zTail){. 
b9b0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
b9c0: 67 6c 6f 62 28 22 43 52 45 41 54 45 20 54 41 42  glob("CREATE TAB
b9d0: 4c 45 20 5b 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d  LE ['\"]*", z)==
b9e0: 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
b9f0: 69 6e 74 66 28 6f 75 74 2c 20 22 43 52 45 41 54  intf(out, "CREAT
ba00: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
ba10: 58 49 53 54 53 20 25 73 25 73 22 2c 20 7a 2b 31  XISTS %s%s", z+1
ba20: 33 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 65 6c  3, zTail);.  }el
ba30: 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  se{.    utf8_pri
ba40: 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73 22 2c  ntf(out, "%s%s",
ba50: 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a   z, zTail);.  }.
ba60: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  }.static void pr
ba70: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 46  intSchemaLineN(F
ba80: 49 4c 45 20 2a 6f 75 74 2c 20 63 68 61 72 20 2a  ILE *out, char *
ba90: 7a 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20  z, int n, const 
baa0: 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20  char *zTail){.  
bab0: 63 68 61 72 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20  char c = z[n];. 
bac0: 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 70 72 69   z[n] = 0;.  pri
bad0: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 6f 75 74  ntSchemaLine(out
bae0: 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7a  , z, zTail);.  z
baf0: 5b 6e 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  [n] = c;.}../*.*
bb00: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
bb10: 20 73 74 72 69 6e 67 20 7a 5b 5d 20 68 61 73 20   string z[] has 
bb20: 6e 6f 74 68 69 6e 67 20 62 75 74 20 77 68 69 74  nothing but whit
bb30: 65 73 70 61 63 65 20 61 6e 64 20 63 6f 6d 6d 65  espace and comme
bb40: 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  nts to the.** en
bb50: 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6c  d of the first l
bb60: 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
bb70: 6e 74 20 77 73 54 6f 45 6f 6c 28 63 6f 6e 73 74  nt wsToEol(const
bb80: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
bb90: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a   i;.  for(i=0; z
bba0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
bbb0: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20  f( z[i]=='\n' ) 
bbc0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
bbd0: 28 20 49 73 53 70 61 63 65 28 7a 5b 69 5d 29 20  ( IsSpace(z[i]) 
bbe0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
bbf0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 2d 27 20 26 26  if( z[i]=='-' &&
bc00: 20 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 20 72   z[i+1]=='-' ) r
bc10: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74  eturn 1;.    ret
bc20: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
bc30: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
bc40: 41 64 64 20 61 20 6e 65 77 20 65 6e 74 72 79 20  Add a new entry 
bc50: 74 6f 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51  to the EXPLAIN Q
bc60: 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61 0a 2a  UERY PLAN data.*
bc70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 71  /.static void eq
bc80: 70 5f 61 70 70 65 6e 64 28 53 68 65 6c 6c 53 74  p_append(ShellSt
bc90: 61 74 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70  ate *p, int iEqp
bca0: 49 64 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73  Id, int p2, cons
bcb0: 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a  t char *zText){.
bcc0: 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70    EQPGraphRow *p
bcd0: 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 54 65 78 74  New;.  int nText
bce0: 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54 65 78   = strlen30(zTex
bcf0: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 75 74  t);.  if( p->aut
bd00: 6f 45 51 50 74 65 73 74 20 29 7b 0a 20 20 20 20  oEQPtest ){.    
bd10: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
bd20: 75 74 2c 20 22 25 64 2c 25 64 2c 25 73 5c 6e 22  ut, "%d,%d,%s\n"
bd30: 2c 20 69 45 71 70 49 64 2c 20 70 32 2c 20 7a 54  , iEqpId, p2, zT
bd40: 65 78 74 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  ext);.  }.  pNew
bd50: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
bd60: 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  c64( sizeof(*pNe
bd70: 77 29 20 2b 20 6e 54 65 78 74 20 29 3b 0a 20 20  w) + nText );.  
bd80: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 73 68  if( pNew==0 ) sh
bd90: 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  ell_out_of_memor
bda0: 79 28 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 71  y();.  pNew->iEq
bdb0: 70 49 64 20 3d 20 69 45 71 70 49 64 3b 0a 20 20  pId = iEqpId;.  
bdc0: 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 49 64 20  pNew->iParentId 
bdd0: 3d 20 70 32 3b 0a 20 20 6d 65 6d 63 70 79 28 70  = p2;.  memcpy(p
bde0: 4e 65 77 2d 3e 7a 54 65 78 74 2c 20 7a 54 65 78  New->zText, zTex
bdf0: 74 2c 20 6e 54 65 78 74 2b 31 29 3b 0a 20 20 70  t, nText+1);.  p
be00: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  New->pNext = 0;.
be10: 20 20 69 66 28 20 70 2d 3e 73 47 72 61 70 68 2e    if( p->sGraph.
be20: 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pLast ){.    p->
be30: 73 47 72 61 70 68 2e 70 4c 61 73 74 2d 3e 70 4e  sGraph.pLast->pN
be40: 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 65  ext = pNew;.  }e
be50: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 73 47 72 61  lse{.    p->sGra
be60: 70 68 2e 70 52 6f 77 20 3d 20 70 4e 65 77 3b 0a  ph.pRow = pNew;.
be70: 20 20 7d 0a 20 20 70 2d 3e 73 47 72 61 70 68 2e    }.  p->sGraph.
be80: 70 4c 61 73 74 20 3d 20 70 4e 65 77 3b 0a 7d 0a  pLast = pNew;.}.
be90: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 64 20  ./*.** Free and 
bea0: 72 65 73 65 74 20 74 68 65 20 45 58 50 4c 41 49  reset the EXPLAI
beb0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 64 61 74  N QUERY PLAN dat
bec0: 61 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  a that has been 
bed0: 63 6f 6c 6c 65 63 74 65 64 0a 2a 2a 20 69 6e 20  collected.** in 
bee0: 70 2d 3e 73 47 72 61 70 68 2e 0a 2a 2f 0a 73 74  p->sGraph..*/.st
bef0: 61 74 69 63 20 76 6f 69 64 20 65 71 70 5f 72 65  atic void eqp_re
bf00: 73 65 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  set(ShellState *
bf10: 70 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f  p){.  EQPGraphRo
bf20: 77 20 2a 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b  w *pRow, *pNext;
bf30: 0a 20 20 66 6f 72 28 70 52 6f 77 20 3d 20 70 2d  .  for(pRow = p-
bf40: 3e 73 47 72 61 70 68 2e 70 52 6f 77 3b 20 70 52  >sGraph.pRow; pR
bf50: 6f 77 3b 20 70 52 6f 77 20 3d 20 70 4e 65 78 74  ow; pRow = pNext
bf60: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
bf70: 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Row->pNext;.    
bf80: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 6f  sqlite3_free(pRo
bf90: 77 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  w);.  }.  memset
bfa0: 28 26 70 2d 3e 73 47 72 61 70 68 2c 20 30 2c 20  (&p->sGraph, 0, 
bfb0: 73 69 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70 68  sizeof(p->sGraph
bfc0: 29 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  ));.}../* Return
bfd0: 20 74 68 65 20 6e 65 78 74 20 45 58 50 4c 41 49   the next EXPLAI
bfe0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 6c 69 6e  N QUERY PLAN lin
bff0: 65 20 77 69 74 68 20 69 45 71 70 49 64 20 74 68  e with iEqpId th
c000: 61 74 20 6f 63 63 75 72 73 20 61 66 74 65 72 0a  at occurs after.
c010: 2a 2a 20 70 4f 6c 64 2c 20 6f 72 20 72 65 74 75  ** pOld, or retu
c020: 72 6e 20 74 68 65 20 66 69 72 73 74 20 73 75 63  rn the first suc
c030: 68 20 6c 69 6e 65 20 69 66 20 70 4f 6c 64 20 69  h line if pOld i
c040: 73 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63  s NULL.*/.static
c050: 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 65 71   EQPGraphRow *eq
c060: 70 5f 6e 65 78 74 5f 72 6f 77 28 53 68 65 6c 6c  p_next_row(Shell
c070: 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 69 45  State *p, int iE
c080: 71 70 49 64 2c 20 45 51 50 47 72 61 70 68 52 6f  qpId, EQPGraphRo
c090: 77 20 2a 70 4f 6c 64 29 7b 0a 20 20 45 51 50 47  w *pOld){.  EQPG
c0a0: 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d 20  raphRow *pRow = 
c0b0: 70 4f 6c 64 20 3f 20 70 4f 6c 64 2d 3e 70 4e 65  pOld ? pOld->pNe
c0c0: 78 74 20 3a 20 70 2d 3e 73 47 72 61 70 68 2e 70  xt : p->sGraph.p
c0d0: 52 6f 77 3b 0a 20 20 77 68 69 6c 65 28 20 70 52  Row;.  while( pR
c0e0: 6f 77 20 26 26 20 70 52 6f 77 2d 3e 69 50 61 72  ow && pRow->iPar
c0f0: 65 6e 74 49 64 21 3d 69 45 71 70 49 64 20 29 20  entId!=iEqpId ) 
c100: 70 52 6f 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65  pRow = pRow->pNe
c110: 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 6f  xt;.  return pRo
c120: 77 3b 0a 7d 0a 0a 2f 2a 20 52 65 6e 64 65 72 20  w;.}../* Render 
c130: 61 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f  a single level o
c140: 66 20 74 68 65 20 67 72 61 70 68 20 74 68 61 74  f the graph that
c150: 20 68 61 73 20 69 45 71 70 49 64 20 61 73 20 69   has iEqpId as i
c160: 74 73 20 70 61 72 65 6e 74 2e 20 20 43 61 6c 6c  ts parent.  Call
c170: 65 64 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 6c  ed.** recursivel
c180: 79 20 74 6f 20 72 65 6e 64 65 72 20 73 75 62 6c  y to render subl
c190: 65 76 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  evels..*/.static
c1a0: 20 76 6f 69 64 20 65 71 70 5f 72 65 6e 64 65 72   void eqp_render
c1b0: 5f 6c 65 76 65 6c 28 53 68 65 6c 6c 53 74 61 74  _level(ShellStat
c1c0: 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70 49 64  e *p, int iEqpId
c1d0: 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77  ){.  EQPGraphRow
c1e0: 20 2a 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a   *pRow, *pNext;.
c1f0: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
c200: 33 30 28 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72  30(p->sGraph.zPr
c210: 65 66 69 78 29 3b 0a 20 20 63 68 61 72 20 2a 7a  efix);.  char *z
c220: 3b 0a 20 20 66 6f 72 28 70 52 6f 77 20 3d 20 65  ;.  for(pRow = e
c230: 71 70 5f 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69  qp_next_row(p, i
c240: 45 71 70 49 64 2c 20 30 29 3b 20 70 52 6f 77 3b  EqpId, 0); pRow;
c250: 20 70 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b 0a   pRow = pNext){.
c260: 20 20 20 20 70 4e 65 78 74 20 3d 20 65 71 70 5f      pNext = eqp_
c270: 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69 45 71 70  next_row(p, iEqp
c280: 49 64 2c 20 70 52 6f 77 29 3b 0a 20 20 20 20 7a  Id, pRow);.    z
c290: 20 3d 20 70 52 6f 77 2d 3e 7a 54 65 78 74 3b 0a   = pRow->zText;.
c2a0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
c2b0: 70 2d 3e 6f 75 74 2c 20 22 25 73 25 73 25 73 5c  p->out, "%s%s%s\
c2c0: 6e 22 2c 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50  n", p->sGraph.zP
c2d0: 72 65 66 69 78 2c 20 70 4e 65 78 74 20 3f 20 22  refix, pNext ? "
c2e0: 7c 2d 2d 22 20 3a 20 22 60 2d 2d 22 2c 20 7a 29  |--" : "`--", z)
c2f0: 3b 0a 20 20 20 20 69 66 28 20 6e 3c 28 69 6e 74  ;.    if( n<(int
c300: 29 73 69 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70  )sizeof(p->sGrap
c310: 68 2e 7a 50 72 65 66 69 78 29 2d 37 20 29 7b 0a  h.zPrefix)-7 ){.
c320: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2d        memcpy(&p-
c330: 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b  >sGraph.zPrefix[
c340: 6e 5d 2c 20 70 4e 65 78 74 20 3f 20 22 7c 20 20  n], pNext ? "|  
c350: 22 20 3a 20 22 20 20 20 22 2c 20 34 29 3b 0a 20  " : "   ", 4);. 
c360: 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72 5f       eqp_render_
c370: 6c 65 76 65 6c 28 70 2c 20 70 52 6f 77 2d 3e 69  level(p, pRow->i
c380: 45 71 70 49 64 29 3b 0a 20 20 20 20 20 20 70 2d  EqpId);.      p-
c390: 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b  >sGraph.zPrefix[
c3a0: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  n] = 0;.    }.  
c3b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c  }.}../*.** Displ
c3c0: 61 79 20 61 6e 64 20 72 65 73 65 74 20 74 68 65  ay and reset the
c3d0: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
c3e0: 4c 41 4e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74  LAN data.*/.stat
c3f0: 69 63 20 76 6f 69 64 20 65 71 70 5f 72 65 6e 64  ic void eqp_rend
c400: 65 72 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  er(ShellState *p
c410: 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77  ){.  EQPGraphRow
c420: 20 2a 70 52 6f 77 20 3d 20 70 2d 3e 73 47 72 61   *pRow = p->sGra
c430: 70 68 2e 70 52 6f 77 3b 0a 20 20 69 66 28 20 70  ph.pRow;.  if( p
c440: 52 6f 77 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Row ){.    if( p
c450: 52 6f 77 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27  Row->zText[0]=='
c460: 2d 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  -' ){.      if( 
c470: 70 52 6f 77 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  pRow->pNext==0 )
c480: 7b 0a 20 20 20 20 20 20 20 20 65 71 70 5f 72 65  {.        eqp_re
c490: 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20  set(p);.        
c4a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
c4b0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
c4c0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  f(p->out, "%s\n"
c4d0: 2c 20 70 52 6f 77 2d 3e 7a 54 65 78 74 2b 33 29  , pRow->zText+3)
c4e0: 3b 0a 20 20 20 20 20 20 70 2d 3e 73 47 72 61 70  ;.      p->sGrap
c4f0: 68 2e 70 52 6f 77 20 3d 20 70 52 6f 77 2d 3e 70  h.pRow = pRow->p
c500: 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
c510: 74 65 33 5f 66 72 65 65 28 70 52 6f 77 29 3b 0a  te3_free(pRow);.
c520: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c530: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
c540: 6f 75 74 2c 20 22 51 55 45 52 59 20 50 4c 41 4e  out, "QUERY PLAN
c550: 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  \n");.    }.    
c560: 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69  p->sGraph.zPrefi
c570: 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 65 71  x[0] = 0;.    eq
c580: 70 5f 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 70  p_render_level(p
c590: 2c 20 30 29 3b 0a 20 20 20 20 65 71 70 5f 72 65  , 0);.    eqp_re
c5a0: 73 65 74 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  set(p);.  }.}../
c5b0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
c5c0: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
c5d0: 65 20 74 68 61 74 20 74 68 65 20 73 68 65 6c 6c  e that the shell
c5e0: 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20  .** invokes for 
c5f0: 65 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71 75  each row of a qu
c600: 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73  ery result..*/.s
c610: 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f  tatic int shell_
c620: 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64  callback(.  void
c630: 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 6e 41   *pArg,.  int nA
c640: 72 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  rg,        /* Nu
c650: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
c660: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63 68 61 72  olumns */.  char
c670: 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 2f 2a 20   **azArg,    /* 
c680: 54 65 78 74 20 6f 66 20 65 61 63 68 20 72 65 73  Text of each res
c690: 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ult column */.  
c6a0: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c 20 20 20  char **azCol,   
c6b0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73   /* Column names
c6c0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 54 79 70   */.  int *aiTyp
c6d0: 65 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  e      /* Column
c6e0: 20 74 79 70 65 73 20 2a 2f 0a 29 7b 0a 20 20 69   types */.){.  i
c6f0: 6e 74 20 69 3b 0a 20 20 53 68 65 6c 6c 53 74 61  nt i;.  ShellSta
c700: 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74  te *p = (ShellSt
c710: 61 74 65 2a 29 70 41 72 67 3b 0a 0a 20 20 69 66  ate*)pArg;..  if
c720: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74  ( azArg==0 ) ret
c730: 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28  urn 0;.  switch(
c740: 20 70 2d 3e 63 4d 6f 64 65 20 29 7b 0a 20 20 20   p->cMode ){.   
c750: 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69 6e 65 3a   case MODE_Line:
c760: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 20 3d   {.      int w =
c770: 20 35 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a   5;.      if( az
c780: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
c790: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
c7a0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
c7b0: 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73       int len = s
c7c0: 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d  trlen30(azCol[i]
c7d0: 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22   ? azCol[i] : ""
c7e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
c7f0: 65 6e 3e 77 20 29 20 77 20 3d 20 6c 65 6e 3b 0a  en>w ) w = len;.
c800: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
c810: 28 20 70 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20 75  ( p->cnt++>0 ) u
c820: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
c830: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53  t, "%s", p->rowS
c840: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
c850: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
c860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
c870: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
c880: 75 74 2c 22 25 2a 73 20 3d 20 25 73 25 73 22 2c  ut,"%*s = %s%s",
c890: 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20   w, azCol[i],.  
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
c8b0: 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69  Arg[i] ? azArg[i
c8c0: 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  ] : p->nullValue
c8d0: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
c8e0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
c8f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c900: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 45 78 70     case MODE_Exp
c910: 6c 61 69 6e 3a 0a 20 20 20 20 63 61 73 65 20 4d  lain:.    case M
c920: 4f 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20  ODE_Column: {.  
c930: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
c940: 20 69 6e 74 20 61 45 78 70 6c 61 69 6e 57 69 64   int aExplainWid
c950: 74 68 73 5b 5d 20 3d 20 7b 34 2c 20 31 33 2c 20  ths[] = {4, 13, 
c960: 34 2c 20 34 2c 20 34 2c 20 31 33 2c 20 32 2c 20  4, 4, 4, 13, 2, 
c970: 31 33 7d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  13};.      const
c980: 20 69 6e 74 20 2a 63 6f 6c 57 69 64 74 68 3b 0a   int *colWidth;.
c990: 20 20 20 20 20 20 69 6e 74 20 73 68 6f 77 48 64        int showHd
c9a0: 72 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 72  r;.      char *r
c9b0: 6f 77 53 65 70 3b 0a 20 20 20 20 20 20 69 66 28  owSep;.      if(
c9c0: 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f   p->cMode==MODE_
c9d0: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
c9e0: 20 20 63 6f 6c 57 69 64 74 68 20 3d 20 70 2d 3e    colWidth = p->
c9f0: 63 6f 6c 57 69 64 74 68 3b 0a 20 20 20 20 20 20  colWidth;.      
ca00: 20 20 73 68 6f 77 48 64 72 20 3d 20 70 2d 3e 73    showHdr = p->s
ca10: 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 20  howHeader;.     
ca20: 20 20 20 72 6f 77 53 65 70 20 3d 20 70 2d 3e 72     rowSep = p->r
ca30: 6f 77 53 65 70 61 72 61 74 6f 72 3b 0a 20 20 20  owSeparator;.   
ca40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ca50: 20 20 63 6f 6c 57 69 64 74 68 20 3d 20 61 45 78    colWidth = aEx
ca60: 70 6c 61 69 6e 57 69 64 74 68 73 3b 0a 20 20 20  plainWidths;.   
ca70: 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d 20 31       showHdr = 1
ca80: 3b 0a 20 20 20 20 20 20 20 20 72 6f 77 53 65 70  ;.        rowSep
ca90: 20 3d 20 53 45 50 5f 52 6f 77 3b 0a 20 20 20 20   = SEP_Row;.    
caa0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
cab0: 3e 63 6e 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20  >cnt++==0 ){.   
cac0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
cad0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
cae0: 20 20 20 20 20 20 69 6e 74 20 77 2c 20 6e 3b 0a        int w, n;.
caf0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
cb00: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c  ArraySize(p->col
cb10: 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20  Width) ){.      
cb20: 20 20 20 20 20 20 77 20 3d 20 63 6f 6c 57 69 64        w = colWid
cb30: 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  th[i];.         
cb40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
cb50: 20 20 20 20 77 20 3d 20 30 3b 0a 20 20 20 20 20      w = 0;.     
cb60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
cb70: 20 69 66 28 20 77 3d 3d 30 20 29 7b 0a 20 20 20   if( w==0 ){.   
cb80: 20 20 20 20 20 20 20 20 20 77 20 3d 20 73 74 72           w = str
cb90: 6c 65 6e 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d  lenChar(azCol[i]
cba0: 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22   ? azCol[i] : ""
cbb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
cbc0: 66 28 20 77 3c 31 30 20 29 20 77 20 3d 20 31 30  f( w<10 ) w = 10
cbd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20  ;.            n 
cbe0: 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 41  = strlenChar(azA
cbf0: 72 67 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 3f  rg && azArg[i] ?
cc00: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
cc10: 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullValue);.     
cc20: 20 20 20 20 20 20 20 69 66 28 20 77 3c 6e 20 29         if( w<n )
cc30: 20 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20   w = n;.        
cc40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
cc50: 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d  ( i<ArraySize(p-
cc60: 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b  >actualWidth) ){
cc70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
cc80: 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 20 3d  actualWidth[i] =
cc90: 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   w;.          }.
cca0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 68            if( sh
ccb0: 6f 77 48 64 72 20 29 7b 0a 20 20 20 20 20 20 20  owHdr ){.       
ccc0: 20 20 20 20 20 75 74 66 38 5f 77 69 64 74 68 5f       utf8_width_
ccd0: 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20 77 2c  print(p->out, w,
cce0: 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20   azCol[i]);.    
ccf0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
cd00: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
cd10: 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f  , i==nArg-1 ? ro
cd20: 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20  wSep : "  ");.  
cd30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cd40: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
cd50: 73 68 6f 77 48 64 72 20 29 7b 0a 20 20 20 20 20  showHdr ){.     
cd60: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
cd70: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
cd80: 20 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20          int w;. 
cd90: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
cda0: 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63  <ArraySize(p->ac
cdb0: 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20  tualWidth) ){.  
cdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d               w =
cdd0: 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b   p->actualWidth[
cde0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
cdf0: 20 20 20 69 66 28 20 77 3c 30 20 29 20 77 20 3d     if( w<0 ) w =
ce00: 20 2d 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -w;.           
ce10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ce20: 20 20 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20         w = 10;. 
ce30: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
ce40: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
ce50: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a  intf(p->out,"%-*
ce60: 2e 2a 73 25 73 22 2c 77 2c 77 2c 0a 20 20 20 20  .*s%s",w,w,.    
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 0a 20 20 20 20  ----------".    
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
ced0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20 20  ----------",.   
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf20: 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77   i==nArg-1 ? row
cf30: 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20  Sep : "  ");.   
cf40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cf50: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
cf60: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
cf70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72  break;.      for
cf80: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
cf90: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
cfa0: 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  w;.        if( i
cfb0: 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63  <ArraySize(p->ac
cfc0: 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20  tualWidth) ){.  
cfd0: 20 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d 3e           w = p->
cfe0: 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a  actualWidth[i];.
cff0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d000: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 31 30            w = 10
d010: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d020: 20 20 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65      if( p->cMode
d030: 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 26  ==MODE_Explain &
d040: 26 20 61 7a 41 72 67 5b 69 5d 20 26 26 20 73 74  & azArg[i] && st
d050: 72 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 5b 69  rlenChar(azArg[i
d060: 5d 29 3e 77 20 29 7b 0a 20 20 20 20 20 20 20 20  ])>w ){.        
d070: 20 20 77 20 3d 20 73 74 72 6c 65 6e 43 68 61 72    w = strlenChar
d080: 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20  (azArg[i]);.    
d090: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
d0a0: 28 20 69 3d 3d 31 20 26 26 20 70 2d 3e 61 69 49  ( i==1 && p->aiI
d0b0: 6e 64 65 6e 74 20 26 26 20 70 2d 3e 70 53 74 6d  ndent && p->pStm
d0c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t ){.          i
d0d0: 66 28 20 70 2d 3e 69 49 6e 64 65 6e 74 3c 70 2d  f( p->iIndent<p-
d0e0: 3e 6e 49 6e 64 65 6e 74 20 29 7b 0a 20 20 20 20  >nIndent ){.    
d0f0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
d100: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2a 2e  ntf(p->out, "%*.
d110: 73 22 2c 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b  s", p->aiIndent[
d120: 70 2d 3e 69 49 6e 64 65 6e 74 5d 2c 20 22 22 29  p->iIndent], "")
d130: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d140: 20 20 20 20 20 20 20 20 70 2d 3e 69 49 6e 64 65          p->iInde
d150: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nt++;.        }.
d160: 20 20 20 20 20 20 20 20 75 74 66 38 5f 77 69 64          utf8_wid
d170: 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c  th_print(p->out,
d180: 20 77 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61   w, azArg[i] ? a
d190: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
d1a0: 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20  lValue);.       
d1b0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
d1c0: 6f 75 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e 41  out, "%s", i==nA
d1d0: 72 67 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a 20  rg-1 ? rowSep : 
d1e0: 22 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "  ");.      }. 
d1f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d200: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
d210: 53 65 6d 69 3a 20 7b 20 20 20 2f 2a 20 2e 73 63  Semi: {   /* .sc
d220: 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63  hema and .fullsc
d230: 68 65 6d 61 20 6f 75 74 70 75 74 20 2a 2f 0a 20  hema output */. 
d240: 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61       printSchema
d250: 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 61 7a 41  Line(p->out, azA
d260: 72 67 5b 30 5d 2c 20 22 3b 5c 6e 22 29 3b 0a 20  rg[0], ";\n");. 
d270: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d280: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
d290: 50 72 65 74 74 79 3a 20 7b 20 20 2f 2a 20 2e 73  Pretty: {  /* .s
d2a0: 63 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73  chema and .fulls
d2b0: 63 68 65 6d 61 20 77 69 74 68 20 2d 2d 69 6e 64  chema with --ind
d2c0: 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  ent */.      cha
d2d0: 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20  r *z;.      int 
d2e0: 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61  j;.      int nPa
d2f0: 72 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ren = 0;.      c
d300: 68 61 72 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20  har cEnd = 0;.  
d310: 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20      char c;.    
d320: 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 30 3b    int nLine = 0;
d330: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
d340: 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Arg==1 );.      
d350: 69 66 28 20 61 7a 41 72 67 5b 30 5d 3d 3d 30 20  if( azArg[0]==0 
d360: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
d370: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  f( sqlite3_strli
d380: 6b 65 28 22 43 52 45 41 54 45 20 56 49 45 57 25  ke("CREATE VIEW%
d390: 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d  ", azArg[0], 0)=
d3a0: 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  =0.       || sql
d3b0: 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 43 52  ite3_strlike("CR
d3c0: 45 41 54 45 20 54 52 49 47 25 22 2c 20 61 7a 41  EATE TRIG%", azA
d3d0: 72 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a 20 20 20  rg[0], 0)==0.   
d3e0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74     ){.        ut
d3f0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
d400: 2c 20 22 25 73 3b 5c 6e 22 2c 20 61 7a 41 72 67  , "%s;\n", azArg
d410: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72  [0]);.        br
d420: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
d430: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
d440: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 41  printf("%s", azA
d450: 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 6a 20  rg[0]);.      j 
d460: 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  = 0;.      for(i
d470: 3d 30 3b 20 49 73 53 70 61 63 65 28 7a 5b 69 5d  =0; IsSpace(z[i]
d480: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  ); i++){}.      
d490: 66 6f 72 28 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  for(; (c = z[i])
d4a0: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  !=0; i++){.     
d4b0: 20 20 20 69 66 28 20 49 73 53 70 61 63 65 28 63     if( IsSpace(c
d4c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
d4d0: 66 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 5c 72 27 20  f( z[j-1]=='\r' 
d4e0: 29 20 7a 5b 6a 2d 31 5d 20 3d 20 27 5c 6e 27 3b  ) z[j-1] = '\n';
d4f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
d500: 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 7c  sSpace(z[j-1]) |
d510: 7c 20 7a 5b 6a 2d 31 5d 3d 3d 27 28 27 20 29 20  | z[j-1]=='(' ) 
d520: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
d530: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d    }else if( (c==
d540: 27 28 27 20 7c 7c 20 63 3d 3d 27 29 27 29 20 26  '(' || c==')') &
d550: 26 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63 65  & j>0 && IsSpace
d560: 28 7a 5b 6a 2d 31 5d 29 20 29 7b 0a 20 20 20 20  (z[j-1]) ){.    
d570: 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20        j--;.     
d580: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a     }.        z[j
d590: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d  ++] = c;.      }
d5a0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e  .      while( j>
d5b0: 30 20 26 26 20 49 73 53 70 61 63 65 28 7a 5b 6a  0 && IsSpace(z[j
d5c0: 2d 31 5d 29 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20  -1]) ){ j--; }. 
d5d0: 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20       z[j] = 0;. 
d5e0: 20 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e 33       if( strlen3
d5f0: 30 28 7a 29 3e 3d 37 39 20 29 7b 0a 20 20 20 20  0(z)>=79 ){.    
d600: 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28      for(i=j=0; (
d610: 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b  c = z[i])!=0; i+
d620: 2b 29 7b 20 20 2f 2a 20 43 6f 70 79 20 63 68 61  +){  /* Copy cha
d630: 6e 67 65 73 20 66 72 6f 6d 20 7a 5b 69 5d 20 62  nges from z[i] b
d640: 61 63 6b 20 74 6f 20 7a 5b 6a 5d 20 2a 2f 0a 20  ack to z[j] */. 
d650: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
d660: 63 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  cEnd ){.        
d670: 20 20 20 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20      cEnd = 0;.  
d680: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
d690: 28 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27  ( c=='"' || c=='
d6a0: 5c 27 27 20 7c 7c 20 63 3d 3d 27 60 27 20 29 7b  \'' || c=='`' ){
d6b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 45 6e  .            cEn
d6c0: 64 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  d = c;.         
d6d0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b   }else if( c=='[
d6e0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
d6f0: 20 63 45 6e 64 20 3d 20 27 5d 27 3b 0a 20 20 20   cEnd = ']';.   
d700: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
d710: 20 63 3d 3d 27 2d 27 20 26 26 20 7a 5b 69 2b 31   c=='-' && z[i+1
d720: 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
d730: 20 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5c 6e        cEnd = '\n
d740: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  ';.          }el
d750: 73 65 20 69 66 28 20 63 3d 3d 27 28 27 20 29 7b  se if( c=='(' ){
d760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 61  .            nPa
d770: 72 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  ren++;.         
d780: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 29   }else if( c==')
d790: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
d7a0: 20 6e 50 61 72 65 6e 2d 2d 3b 0a 20 20 20 20 20   nParen--;.     
d7b0: 20 20 20 20 20 20 20 69 66 28 20 6e 4c 69 6e 65         if( nLine
d7c0: 3e 30 20 26 26 20 6e 50 61 72 65 6e 3d 3d 30 20  >0 && nParen==0 
d7d0: 26 26 20 6a 3e 30 20 29 7b 0a 20 20 20 20 20 20  && j>0 ){.      
d7e0: 20 20 20 20 20 20 20 20 70 72 69 6e 74 53 63 68          printSch
d7f0: 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c  emaLineN(p->out,
d800: 20 7a 2c 20 6a 2c 20 22 5c 6e 22 29 3b 0a 20 20   z, j, "\n");.  
d810: 20 20 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20              j = 
d820: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
d830: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d840: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
d850: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  c;.          if(
d860: 20 6e 50 61 72 65 6e 3d 3d 31 20 26 26 20 63 45   nParen==1 && cE
d870: 6e 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  nd==0.          
d880: 20 26 26 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63   && (c=='(' || c
d890: 3d 3d 27 5c 6e 27 20 7c 7c 20 28 63 3d 3d 27 2c  =='\n' || (c==',
d8a0: 27 20 26 26 20 21 77 73 54 6f 45 6f 6c 28 7a 2b  ' && !wsToEol(z+
d8b0: 69 2b 31 29 29 29 0a 20 20 20 20 20 20 20 20 20  i+1))).         
d8c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d8d0: 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6a 2d  if( c=='\n' ) j-
d8e0: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  -;.            p
d8f0: 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28  rintSchemaLineN(
d900: 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c  p->out, z, j, "\
d910: 6e 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  n  ");.         
d920: 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20     j = 0;.      
d930: 20 20 20 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20        nLine++;. 
d940: 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65             while
d950: 28 20 49 73 53 70 61 63 65 28 7a 5b 69 2b 31 5d  ( IsSpace(z[i+1]
d960: 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ i++; }.    
d970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d980: 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 5d 20 3d  }.        z[j] =
d990: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
d9a0: 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e    printSchemaLin
d9b0: 65 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 22 3b 5c  e(p->out, z, ";\
d9c0: 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n");.      sqlit
d9d0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20  e3_free(z);.    
d9e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d9f0: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69 73     case MODE_Lis
da00: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
da10: 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d  ->cnt++==0 && p-
da20: 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20  >showHeader ){. 
da30: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
da40: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
da50: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
da60: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73  ntf(p->out,"%s%s
da70: 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20  ",azCol[i],.    
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 3d                i=
da90: 3d 6e 41 72 67 2d 31 20 3f 20 70 2d 3e 72 6f 77  =nArg-1 ? p->row
daa0: 53 65 70 61 72 61 74 6f 72 20 3a 20 70 2d 3e 63  Separator : p->c
dab0: 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
dac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
dad0: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
dae0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
daf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
db00: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
db10: 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67   char *z = azArg
db20: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
db30: 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 2d 3e 6e   z==0 ) z = p->n
db40: 75 6c 6c 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  ullValue;.      
db50: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
db60: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  >out, "%s", z);.
db70: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 41          if( i<nA
db80: 72 67 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rg-1 ){.        
db90: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
dba0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63  >out, "%s", p->c
dbb0: 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
dbc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dbd0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
dbe0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
dbf0: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
dc00: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
dc10: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
dc20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
dc30: 20 4d 4f 44 45 5f 48 74 6d 6c 3a 20 7b 0a 20 20   MODE_Html: {.  
dc40: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
dc50: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
dc60: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
dc70: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
dc80: 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20  t,"<TR>");.     
dc90: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
dca0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
dcb0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
dcc0: 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22 29 3b 0a 20  ->out,"<TH>");. 
dcd0: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
dce0: 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  html_string(p->o
dcf0: 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20  ut, azCol[i]);. 
dd00: 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
dd10: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 48  ntf(p->out,"</TH
dd20: 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  >\n");.        }
dd30: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
dd40: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52  ntf(p->out,"</TR
dd50: 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  >\n");.      }. 
dd60: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
dd70: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
dd80: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
dd90: 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20  ut,"<TR>");.    
dda0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
ddb0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
ddc0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
ddd0: 75 74 2c 22 3c 54 44 3e 22 29 3b 0a 20 20 20 20  ut,"<TD>");.    
dde0: 20 20 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f      output_html_
ddf0: 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61  string(p->out, a
de00: 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b  zArg[i] ? azArg[
de10: 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75  i] : p->nullValu
de20: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  e);.        raw_
de30: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
de40: 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  /TD>\n");.      
de50: 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  }.      raw_prin
de60: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e  tf(p->out,"</TR>
de70: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
de80: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
de90: 65 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20 20  e MODE_Tcl: {.  
dea0: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
deb0: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
dec0: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
ded0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
dee0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
def0: 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
df00: 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69 5d  (p->out,azCol[i]
df10: 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22   ? azCol[i] : ""
df20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
df30: 69 3c 6e 41 72 67 2d 31 29 20 75 74 66 38 5f 70  i<nArg-1) utf8_p
df40: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
df50: 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  s", p->colSepara
df60: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tor);.        }.
df70: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
df80: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
df90: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
dfa0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
dfb0: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
dfc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f   break;.      fo
dfd0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
dfe0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6f 75 74  ++){.        out
dff0: 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e  put_c_string(p->
e000: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20  out, azArg[i] ? 
e010: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
e020: 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
e030: 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75    if(i<nArg-1) u
e040: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e050: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
e060: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
e070: 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72   }.      utf8_pr
e080: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
e090: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
e0a0: 6f 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  or);.      break
e0b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e0c0: 20 4d 4f 44 45 5f 43 73 76 3a 20 7b 0a 20 20 20   MODE_Csv: {.   
e0d0: 20 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65     setBinaryMode
e0e0: 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20  (p->out, 1);.   
e0f0: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d     if( p->cnt++=
e100: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
e110: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66  der ){.        f
e120: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
e130: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
e140: 6f 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61 7a  output_csv(p, az
e150: 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69  Col[i] ? azCol[i
e160: 5d 20 3a 20 22 22 2c 20 69 3c 6e 41 72 67 2d 31  ] : "", i<nArg-1
e170: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e180: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
e190: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
e1a0: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
e1b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
e1c0: 66 28 20 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20  f( nArg>0 ){.   
e1d0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
e1e0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
e1f0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76        output_csv
e200: 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 69 3c  (p, azArg[i], i<
e210: 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20  nArg-1);.       
e220: 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f   }.        utf8_
e230: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e240: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
e250: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
e260: 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64 65       setTextMode
e270: 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20  (p->out, 1);.   
e280: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e290: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 49 6e      case MODE_In
e2a0: 73 65 72 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  sert: {.      if
e2b0: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
e2c0: 61 6b 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  ak;.      utf8_p
e2d0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 49 4e  rintf(p->out,"IN
e2e0: 53 45 52 54 20 49 4e 54 4f 20 25 73 22 2c 70 2d  SERT INTO %s",p-
e2f0: 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20 20  >zDestTable);.  
e300: 20 20 20 20 69 66 28 20 70 2d 3e 73 68 6f 77 48      if( p->showH
e310: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
e320: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e330: 75 74 2c 22 28 22 29 3b 0a 20 20 20 20 20 20 20  ut,"(");.       
e340: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
e350: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
e360: 20 20 69 66 28 20 69 3e 30 20 29 20 72 61 77 5f    if( i>0 ) raw_
e370: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e380: 2c 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ,");.          i
e390: 66 28 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43  f( quoteChar(azC
e3a0: 6f 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  ol[i]) ){.      
e3b0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
e3c0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
e3d0: 22 5c 22 25 77 5c 22 22 2c 20 61 7a 43 6f 6c 5b  "\"%w\"", azCol[
e3e0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
e3f0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
e400: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
e410: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
e420: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20  e3_free(z);.    
e430: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e440: 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
e450: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
e460: 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  , azCol[i]);.   
e470: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e480: 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70   }.        raw_p
e490: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29 22  rintf(p->out,")"
e4a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e4b0: 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20   p->cnt++;.     
e4c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
e4d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
e4e0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
e4f0: 74 2c 20 69 3e 30 20 3f 20 22 2c 22 20 3a 20 22  t, i>0 ? "," : "
e500: 20 56 41 4c 55 45 53 28 22 29 3b 0a 20 20 20 20   VALUES(");.    
e510: 20 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b 69      if( (azArg[i
e520: 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70 65  ]==0) || (aiType
e530: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
e540: 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20  QLITE_NULL) ){. 
e550: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
e560: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c  intf(p->out,"NUL
e570: 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  L");.        }el
e580: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
e590: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
e5a0: 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  TE_TEXT ){.     
e5b0: 20 20 20 20 20 69 66 28 20 53 68 65 6c 6c 48 61       if( ShellHa
e5c0: 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e  sFlag(p, SHFLG_N
e5d0: 65 77 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20 20  ewlines) ){.    
e5e0: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71          output_q
e5f0: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  uoted_string(p->
e600: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
e610: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
e620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74  .            out
e630: 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70  put_quoted_escap
e640: 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ed_string(p->out
e650: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
e660: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e670: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
e680: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
e690: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29  SQLITE_INTEGER )
e6a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
e6b0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e6c0: 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  %s", azArg[i]);.
e6d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
e6e0: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
e6f0: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c  pe[i]==SQLITE_FL
e700: 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OAT ){.         
e710: 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20 20   char z[50];.   
e720: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20         double r 
e730: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
e740: 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d 74  _double(p->pStmt
e750: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
e760: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 75  sqlite3_uint64 u
e770: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  r;.          mem
e780: 63 70 79 28 26 75 72 2c 26 72 2c 73 69 7a 65 6f  cpy(&ur,&r,sizeo
e790: 66 28 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20  f(r));.         
e7a0: 20 69 66 28 20 75 72 3d 3d 30 78 37 66 66 30 30   if( ur==0x7ff00
e7b0: 30 30 30 30 30 30 30 30 30 30 30 4c 4c 20 29 7b  00000000000LL ){
e7c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77  .            raw
e7d0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e7e0: 22 31 65 39 39 39 22 29 3b 0a 20 20 20 20 20 20  "1e999");.      
e7f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75 72      }else if( ur
e800: 3d 3d 30 78 66 66 66 30 30 30 30 30 30 30 30 30  ==0xfff000000000
e810: 30 30 30 30 4c 4c 20 29 7b 0a 20 20 20 20 20 20  0000LL ){.      
e820: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e830: 28 70 2d 3e 6f 75 74 2c 20 22 2d 31 65 39 39 39  (p->out, "-1e999
e840: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ");.          }e
e850: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
e860: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
e870: 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c  f(50,z,"%!.20g",
e880: 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   r);.           
e890: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e8a0: 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20  ut, "%s", z);.  
e8b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e8c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
e8d0: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
e8e0: 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20  =SQLITE_BLOB && 
e8f0: 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  p->pStmt ){.    
e900: 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64        const void
e910: 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65   *pBlob = sqlite
e920: 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d  3_column_blob(p-
e930: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
e940: 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20        int nBlob 
e950: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
e960: 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74 2c  _bytes(p->pStmt,
e970: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f   i);.          o
e980: 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 70  utput_hex_blob(p
e990: 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e 42  ->out, pBlob, nB
e9a0: 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  lob);.        }e
e9b0: 6c 73 65 20 69 66 28 20 69 73 4e 75 6d 62 65 72  lse if( isNumber
e9c0: 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b  (azArg[i], 0) ){
e9d0: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
e9e0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
e9f0: 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  s", azArg[i]);. 
ea00: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
ea10: 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c   ShellHasFlag(p,
ea20: 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29   SHFLG_Newlines)
ea30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75   ){.          ou
ea40: 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69  tput_quoted_stri
ea50: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
ea60: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
ea70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  lse{.          o
ea80: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63  utput_quoted_esc
ea90: 61 70 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  aped_string(p->o
eaa0: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  ut, azArg[i]);. 
eab0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
eac0: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
ead0: 66 28 70 2d 3e 6f 75 74 2c 22 29 3b 5c 6e 22 29  f(p->out,");\n")
eae0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
eaf0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
eb00: 44 45 5f 51 75 6f 74 65 3a 20 7b 0a 20 20 20 20  DE_Quote: {.    
eb10: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
eb20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
eb30: 28 20 70 2d 3e 63 6e 74 3d 3d 30 20 26 26 20 70  ( p->cnt==0 && p
eb40: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
eb50: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
eb60: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
eb70: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
eb80: 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d   ) raw_printf(p-
eb90: 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20  >out, ",");.    
eba0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f        output_quo
ebb0: 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  ted_string(p->ou
ebc0: 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  t, azCol[i]);.  
ebd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ebe0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
ebf0: 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  t,"\n");.      }
ec00: 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b  .      p->cnt++;
ec10: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
ec20: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
ec30: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20        if( i>0 ) 
ec40: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
ec50: 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20  t, ",");.       
ec60: 20 69 66 28 20 28 61 7a 41 72 67 5b 69 5d 3d 3d   if( (azArg[i]==
ec70: 30 29 20 7c 7c 20 28 61 69 54 79 70 65 20 26 26  0) || (aiType &&
ec80: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
ec90: 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  TE_NULL) ){.    
eca0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
ecb0: 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22 29  f(p->out,"NULL")
ecc0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
ecd0: 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69  if( aiType && ai
ece0: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
ecf0: 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20  TEXT ){.        
ed00: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
ed10: 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61  string(p->out, a
ed20: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
ed30: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
ed40: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
ed50: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
ed60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
ed70: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
ed80: 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  "%s", azArg[i]);
ed90: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
eda0: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
edb0: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46  ype[i]==SQLITE_F
edc0: 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
edd0: 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20    char z[50];.  
ede0: 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72          double r
edf0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
ee00: 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d  n_double(p->pStm
ee10: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
ee20: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
ee30: 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c  f(50,z,"%!.20g",
ee40: 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   r);.          r
ee50: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
ee60: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  , "%s", z);.    
ee70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
ee80: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
ee90: 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26  ]==SQLITE_BLOB &
eea0: 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  & p->pStmt ){.  
eeb0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f          const vo
eec0: 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69  id *pBlob = sqli
eed0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
eee0: 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  p->pStmt, i);.  
eef0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f          int nBlo
ef00: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  b = sqlite3_colu
ef10: 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d  mn_bytes(p->pStm
ef20: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
ef30: 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62   output_hex_blob
ef40: 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20  (p->out, pBlob, 
ef50: 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20  nBlob);.        
ef60: 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d 62  }else if( isNumb
ef70: 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20  er(azArg[i], 0) 
ef80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
ef90: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
efa0: 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  "%s", azArg[i]);
efb0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
efc0: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
efd0: 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70  _quoted_string(p
efe0: 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29  ->out, azArg[i])
eff0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f000: 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72    }.      raw_pr
f010: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22  intf(p->out,"\n"
f020: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f030: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
f040: 4f 44 45 5f 41 73 63 69 69 3a 20 7b 0a 20 20 20  ODE_Ascii: {.   
f050: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d     if( p->cnt++=
f060: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
f070: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66  der ){.        f
f080: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
f090: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
f0a0: 69 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70  if( i>0 ) utf8_p
f0b0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
f0c0: 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  s", p->colSepara
f0d0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tor);.          
f0e0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
f0f0: 75 74 2c 22 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d  ut,"%s",azCol[i]
f100: 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22   ? azCol[i] : ""
f110: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f120: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
f130: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
f140: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
f150: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f160: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
f170: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  eak;.      for(i
f180: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
f190: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  {.        if( i>
f1a0: 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  0 ) utf8_printf(
f1b0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
f1c0: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
f1d0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
f1e0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c  ntf(p->out,"%s",
f1f0: 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67  azArg[i] ? azArg
f200: 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c  [i] : p->nullVal
f210: 75 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ue);.      }.   
f220: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
f230: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
f240: 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  rowSeparator);. 
f250: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f260: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
f270: 45 51 50 3a 20 7b 0a 20 20 20 20 20 20 65 71 70  EQP: {.      eqp
f280: 5f 61 70 70 65 6e 64 28 70 2c 20 61 74 6f 69 28  _append(p, atoi(
f290: 61 7a 41 72 67 5b 30 5d 29 2c 20 61 74 6f 69 28  azArg[0]), atoi(
f2a0: 61 7a 41 72 67 5b 31 5d 29 2c 20 61 7a 41 72 67  azArg[1]), azArg
f2b0: 5b 33 5d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  [3]);.      brea
f2c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
f2d0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
f2e0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
f2f0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74  llback routine t
f300: 68 61 74 20 74 68 65 20 53 51 4c 69 74 65 20 6c  hat the SQLite l
f310: 69 62 72 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b 65  ibrary.** invoke
f320: 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  s for each row o
f330: 66 20 61 20 71 75 65 72 79 20 72 65 73 75 6c 74  f a query result
f340: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f350: 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  callback(void *p
f360: 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63  Arg, int nArg, c
f370: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61  har **azArg, cha
f380: 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 2f 2a  r **azCol){.  /*
f390: 20 73 69 6e 63 65 20 77 65 20 64 6f 6e 27 74 20   since we don't 
f3a0: 68 61 76 65 20 74 79 70 65 20 69 6e 66 6f 2c 20  have type info, 
f3b0: 63 61 6c 6c 20 74 68 65 20 73 68 65 6c 6c 5f 63  call the shell_c
f3c0: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 61 20 4e  allback with a N
f3d0: 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 72  ULL value */.  r
f3e0: 65 74 75 72 6e 20 73 68 65 6c 6c 5f 63 61 6c 6c  eturn shell_call
f3f0: 62 61 63 6b 28 70 41 72 67 2c 20 6e 41 72 67 2c  back(pArg, nArg,
f400: 20 61 7a 41 72 67 2c 20 61 7a 43 6f 6c 2c 20 4e   azArg, azCol, N
f410: 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ULL);.}../*.** T
f420: 68 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62  his is the callb
f430: 61 63 6b 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d  ack routine from
f440: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20   sqlite3_exec() 
f450: 74 68 61 74 20 61 70 70 65 6e 64 73 20 61 6c 6c  that appends all
f460: 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 6e 74 6f 20  .** output onto 
f470: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 53 68 65  the end of a She
f480: 6c 6c 54 65 78 74 20 6f 62 6a 65 63 74 2e 0a 2a  llText object..*
f490: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 70  /.static int cap
f4a0: 74 75 72 65 4f 75 74 70 75 74 43 61 6c 6c 62 61  tureOutputCallba
f4b0: 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  ck(void *pArg, i
f4c0: 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a  nt nArg, char **
f4d0: 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a  azArg, char **az
f4e0: 29 7b 0a 20 20 53 68 65 6c 6c 54 65 78 74 20 2a  ){.  ShellText *
f4f0: 70 20 3d 20 28 53 68 65 6c 6c 54 65 78 74 2a 29  p = (ShellText*)
f500: 70 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pArg;.  int i;. 
f510: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
f520: 52 28 61 7a 29 3b 0a 20 20 69 66 28 20 61 7a 41  R(az);.  if( azA
f530: 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rg==0 ) return 0
f540: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 20 29 20 61  ;.  if( p->n ) a
f550: 70 70 65 6e 64 54 65 78 74 28 70 2c 20 22 7c 22  ppendText(p, "|"
f560: 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  , 0);.  for(i=0;
f570: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
f580: 20 20 20 69 66 28 20 69 20 29 20 61 70 70 65 6e     if( i ) appen
f590: 64 54 65 78 74 28 70 2c 20 22 2c 22 2c 20 30 29  dText(p, ",", 0)
f5a0: 3b 0a 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b  ;.    if( azArg[
f5b0: 69 5d 20 29 20 61 70 70 65 6e 64 54 65 78 74 28  i] ) appendText(
f5c0: 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 30 29 3b  p, azArg[i], 0);
f5d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
f5e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
f5f0: 74 65 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  te an appropriat
f600: 65 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65  e SELFTEST table
f610: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
f620: 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
f630: 20 76 6f 69 64 20 63 72 65 61 74 65 53 65 6c 66   void createSelf
f640: 74 65 73 74 54 61 62 6c 65 28 53 68 65 6c 6c 53  testTable(ShellS
f650: 74 61 74 65 20 2a 70 29 7b 0a 20 20 63 68 61 72  tate *p){.  char
f660: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
f670: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
f680: 3e 64 62 2c 0a 20 20 20 20 22 53 41 56 45 50 4f  >db,.    "SAVEPO
f690: 49 4e 54 20 73 65 6c 66 74 65 73 74 5f 69 6e 69  INT selftest_ini
f6a0: 74 3b 5c 6e 22 0a 20 20 20 20 22 43 52 45 41 54  t;\n".    "CREAT
f6b0: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
f6c0: 58 49 53 54 53 20 73 65 6c 66 74 65 73 74 28 5c  XISTS selftest(\
f6d0: 6e 22 0a 20 20 20 20 22 20 20 74 6e 6f 20 49 4e  n".    "  tno IN
f6e0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
f6f0: 59 2c 5c 6e 22 20 20 20 2f 2a 20 54 65 73 74 20  Y,\n"   /* Test 
f700: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 22 20  number */.    " 
f710: 20 6f 70 20 54 45 58 54 2c 5c 6e 22 20 20 20 20   op TEXT,\n"    
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f730: 2a 20 4f 70 65 72 61 74 6f 72 3a 20 20 6d 65 6d  * Operator:  mem
f740: 6f 20 72 75 6e 20 2a 2f 0a 20 20 20 20 22 20 20  o run */.    "  
f750: 63 6d 64 20 54 45 58 54 2c 5c 6e 22 20 20 20 20  cmd TEXT,\n"    
f760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f770: 20 43 6f 6d 6d 61 6e 64 20 74 65 78 74 20 2a 2f   Command text */
f780: 0a 20 20 20 20 22 20 20 61 6e 73 20 54 45 58 54  .    "  ans TEXT
f790: 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  \n"             
f7a0: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64        /* Desired
f7b0: 20 61 6e 73 77 65 72 20 2a 2f 0a 20 20 20 20 22   answer */.    "
f7c0: 29 3b 22 0a 20 20 20 20 22 43 52 45 41 54 45 20  );".    "CREATE 
f7d0: 54 45 4d 50 20 54 41 42 4c 45 20 5b 5f 73 68 65  TEMP TABLE [_she
f7e0: 6c 6c 24 73 65 6c 66 5d 28 6f 70 2c 63 6d 64 2c  ll$self](op,cmd,
f7f0: 61 6e 73 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e  ans);\n".    "IN
f800: 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c  SERT INTO [_shel
f810: 6c 24 73 65 6c 66 5d 28 72 6f 77 69 64 2c 6f 70  l$self](rowid,op
f820: 2c 63 6d 64 29 5c 6e 22 0a 20 20 20 20 22 20 20  ,cmd)\n".    "  
f830: 56 41 4c 55 45 53 28 63 6f 61 6c 65 73 63 65 28  VALUES(coalesce(
f840: 28 53 45 4c 45 43 54 20 28 6d 61 78 28 74 6e 6f  (SELECT (max(tno
f850: 29 2b 31 30 30 29 2f 31 30 20 46 52 4f 4d 20 73  )+100)/10 FROM s
f860: 65 6c 66 74 65 73 74 29 2c 31 30 29 2c 5c 6e 22  elftest),10),\n"
f870: 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20 27  .    "         '
f880: 6d 65 6d 6f 27 2c 27 54 65 73 74 73 20 67 65 6e  memo','Tests gen
f890: 65 72 61 74 65 64 20 62 79 20 2d 2d 69 6e 69 74  erated by --init
f8a0: 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45  ');\n".    "INSE
f8b0: 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24  RT INTO [_shell$
f8c0: 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20  self]\n".    "  
f8d0: 53 45 4c 45 43 54 20 27 72 75 6e 27 2c 5c 6e 22  SELECT 'run',\n"
f8e0: 0a 20 20 20 20 22 20 20 20 20 27 53 45 4c 45 43  .    "    'SELEC
f8f0: 54 20 68 65 78 28 73 68 61 33 5f 71 75 65 72 79  T hex(sha3_query
f900: 28 27 27 53 45 4c 45 43 54 20 74 79 70 65 2c 6e  (''SELECT type,n
f910: 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c  ame,tbl_name,sql
f920: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
f930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f940: 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65      "FROM sqlite
f950: 5f 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42 59  _master ORDER BY
f960: 20 32 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a   2'',224))',\n".
f970: 20 20 20 20 22 20 20 20 20 68 65 78 28 73 68 61      "    hex(sha
f980: 33 5f 71 75 65 72 79 28 27 53 45 4c 45 43 54 20  3_query('SELECT 
f990: 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61  type,name,tbl_na
f9a0: 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20  me,sql ".       
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9c0: 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f     "FROM sqlite_
f9d0: 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20  master ORDER BY 
f9e0: 32 27 2c 32 32 34 29 29 3b 5c 6e 22 0a 20 20 20  2',224));\n".   
f9f0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f   "INSERT INTO [_
fa00: 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20  shell$self]\n". 
fa10: 20 20 20 22 20 20 53 45 4c 45 43 54 20 27 72 75     "  SELECT 'ru
fa20: 6e 27 2c 22 0a 20 20 20 20 22 20 20 20 20 27 53  n',".    "    'S
fa30: 45 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f 71  ELECT hex(sha3_q
fa40: 75 65 72 79 28 27 27 53 45 4c 45 43 54 20 2a 20  uery(''SELECT * 
fa50: 46 52 4f 4d 20 5c 22 27 20 7c 7c 22 0a 20 20 20  FROM \"' ||".   
fa60: 20 22 20 20 20 20 20 20 20 20 70 72 69 6e 74 66   "        printf
fa70: 28 27 25 77 27 2c 6e 61 6d 65 29 20 7c 7c 20 27  ('%w',name) || '
fa80: 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 27 27  \" NOT INDEXED''
fa90: 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20 20 20 20  ,224))',\n".    
faa0: 22 20 20 20 20 68 65 78 28 73 68 61 33 5f 71 75  "    hex(sha3_qu
fab0: 65 72 79 28 70 72 69 6e 74 66 28 27 53 45 4c 45  ery(printf('SELE
fac0: 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22  CT * FROM \"%w\"
fad0: 20 4e 4f 54 20 49 4e 44 45 58 45 44 27 2c 6e 61   NOT INDEXED',na
fae0: 6d 65 29 2c 32 32 34 29 29 5c 6e 22 0a 20 20 20  me),224))\n".   
faf0: 20 22 20 20 46 52 4f 4d 20 28 5c 6e 22 0a 20 20   "  FROM (\n".  
fb00: 20 20 22 20 20 20 20 53 45 4c 45 43 54 20 6e 61    "    SELECT na
fb10: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
fb20: 61 73 74 65 72 5c 6e 22 0a 20 20 20 20 22 20 20  aster\n".    "  
fb30: 20 20 20 57 48 45 52 45 20 74 79 70 65 3d 27 74     WHERE type='t
fb40: 61 62 6c 65 27 5c 6e 22 0a 20 20 20 20 22 20 20  able'\n".    "  
fb50: 20 20 20 20 20 41 4e 44 20 6e 61 6d 65 3c 3e 27       AND name<>'
fb60: 73 65 6c 66 74 65 73 74 27 5c 6e 22 0a 20 20 20  selftest'\n".   
fb70: 20 22 20 20 20 20 20 20 20 41 4e 44 20 63 6f 61   "       AND coa
fb80: 6c 65 73 63 65 28 72 6f 6f 74 70 61 67 65 2c 30  lesce(rootpage,0
fb90: 29 3e 30 5c 6e 22 0a 20 20 20 20 22 20 20 29 5c  )>0\n".    "  )\
fba0: 6e 22 0a 20 20 20 20 22 20 4f 52 44 45 52 20 42  n".    " ORDER B
fbb0: 59 20 6e 61 6d 65 3b 5c 6e 22 0a 20 20 20 20 22  Y name;\n".    "
fbc0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68  INSERT INTO [_sh
fbd0: 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20  ell$self]\n".   
fbe0: 20 22 20 20 56 41 4c 55 45 53 28 27 72 75 6e 27   "  VALUES('run'
fbf0: 2c 27 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  ,'PRAGMA integri
fc00: 74 79 5f 63 68 65 63 6b 27 2c 27 6f 6b 27 29 3b  ty_check','ok');
fc10: 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20  \n".    "INSERT 
fc20: 49 4e 54 4f 20 73 65 6c 66 74 65 73 74 28 74 6e  INTO selftest(tn
fc30: 6f 2c 6f 70 2c 63 6d 64 2c 61 6e 73 29 22 0a 20  o,op,cmd,ans)". 
fc40: 20 20 20 22 20 20 53 45 4c 45 43 54 20 72 6f 77     "  SELECT row
fc50: 69 64 2a 31 30 2c 6f 70 2c 63 6d 64 2c 61 6e 73  id*10,op,cmd,ans
fc60: 20 46 52 4f 4d 20 5b 5f 73 68 65 6c 6c 24 73 65   FROM [_shell$se
fc70: 6c 66 5d 3b 5c 6e 22 0a 20 20 20 20 22 44 52 4f  lf];\n".    "DRO
fc80: 50 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c 24  P TABLE [_shell$
fc90: 73 65 6c 66 5d 3b 22 0a 20 20 20 20 2c 30 2c 30  self];".    ,0,0
fca0: 2c 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66  ,&zErrMsg);.  if
fcb0: 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
fcc0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
fcd0: 65 72 72 2c 20 22 53 45 4c 46 54 45 53 54 20 69  err, "SELFTEST i
fce0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61  nitialization fa
fcf0: 69 6c 75 72 65 3a 20 25 73 5c 6e 22 2c 20 7a 45  ilure: %s\n", zE
fd00: 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
fd10: 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
fd20: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
fd30: 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45  _exec(p->db, "RE
fd40: 4c 45 41 53 45 20 73 65 6c 66 74 65 73 74 5f 69  LEASE selftest_i
fd50: 6e 69 74 22 2c 30 2c 30 2c 30 29 3b 0a 7d 0a 0a  nit",0,0,0);.}..
fd60: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64  ./*.** Set the d
fd70: 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65  estination table
fd80: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 53 68   field of the Sh
fd90: 65 6c 6c 53 74 61 74 65 20 73 74 72 75 63 74 75  ellState structu
fda0: 72 65 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d  re to.** the nam
fdb0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 67  e of the table g
fdc0: 69 76 65 6e 2e 20 20 45 73 63 61 70 65 20 61 6e  iven.  Escape an
fdd0: 79 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  y quote characte
fde0: 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62  rs in the.** tab
fdf0: 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  le name..*/.stat
fe00: 69 63 20 76 6f 69 64 20 73 65 74 5f 74 61 62 6c  ic void set_tabl
fe10: 65 5f 6e 61 6d 65 28 53 68 65 6c 6c 53 74 61 74  e_name(ShellStat
fe20: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
fe30: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
fe40: 69 2c 20 6e 3b 0a 20 20 63 68 61 72 20 63 51 75  i, n;.  char cQu
fe50: 6f 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  ote;.  char *z;.
fe60: 0a 20 20 69 66 28 20 70 2d 3e 7a 44 65 73 74 54  .  if( p->zDestT
fe70: 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 72 65 65  able ){.    free
fe80: 28 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b  (p->zDestTable);
fe90: 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62  .    p->zDestTab
fea0: 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  le = 0;.  }.  if
feb0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
fec0: 75 72 6e 3b 0a 20 20 63 51 75 6f 74 65 20 3d 20  urn;.  cQuote = 
fed0: 71 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29  quoteChar(zName)
fee0: 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  ;.  n = strlen30
fef0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 63  (zName);.  if( c
ff00: 51 75 6f 74 65 20 29 20 6e 20 2b 3d 20 6e 2b 32  Quote ) n += n+2
ff10: 3b 0a 20 20 7a 20 3d 20 70 2d 3e 7a 44 65 73 74  ;.  z = p->zDest
ff20: 54 61 62 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  Table = malloc( 
ff30: 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  n+1 );.  if( z==
ff40: 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66  0 ) shell_out_of
ff50: 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 6e 20 3d  _memory();.  n =
ff60: 20 30 3b 0a 20 20 69 66 28 20 63 51 75 6f 74 65   0;.  if( cQuote
ff70: 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f   ) z[n++] = cQuo
ff80: 74 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a  te;.  for(i=0; z
ff90: 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  Name[i]; i++){. 
ffa0: 20 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d     z[n++] = zNam
ffb0: 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 4e  e[i];.    if( zN
ffc0: 61 6d 65 5b 69 5d 3d 3d 63 51 75 6f 74 65 20 29  ame[i]==cQuote )
ffd0: 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65   z[n++] = cQuote
ffe0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 51 75 6f  ;.  }.  if( cQuo
fff0: 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51  te ) z[n++] = cQ
10000 75 6f 74 65 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30  uote;.  z[n] = 0
10010 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  ;.}.../*.** Exec
10020 75 74 65 20 61 20 71 75 65 72 79 20 73 74 61 74  ute a query stat
10030 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20  ement that will 
10040 67 65 6e 65 72 61 74 65 20 53 51 4c 20 6f 75 74  generate SQL out
10050 70 75 74 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 74  put.  Print.** t
10060 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  he result column
10070 73 2c 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61 74  s, comma-separat
10080 65 64 2c 20 6f 6e 20 61 20 6c 69 6e 65 20 61 6e  ed, on a line an
10090 64 20 74 68 65 6e 20 61 64 64 20 61 0a 2a 2a 20  d then add a.** 
100a0 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e  semicolon termin
100b0 61 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  ator to the end 
100c0 6f 66 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a  of that line..**
100d0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
100e0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 73 20  r of columns is 
100f0 31 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d  1 and that colum
10100 6e 20 63 6f 6e 74 61 69 6e 73 20 74 65 78 74 20  n contains text 
10110 22 2d 2d 22 0a 2a 2a 20 74 68 65 6e 20 77 72 69  "--".** then wri
10120 74 65 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f 6e  te the semicolon
10130 20 6f 6e 20 61 20 73 65 70 61 72 61 74 65 20 6c   on a separate l
10140 69 6e 65 2e 20 20 54 68 61 74 20 77 61 79 2c 20  ine.  That way, 
10150 69 66 20 61 0a 2a 2a 20 22 2d 2d 22 20 63 6f 6d  if a.** "--" com
10160 6d 65 6e 74 20 6f 63 63 75 72 73 20 61 74 20 74  ment occurs at t
10170 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 74  he end of the st
10180 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 63 6f 6d  atement, the com
10190 6d 65 6e 74 0a 2a 2a 20 77 6f 6e 27 74 20 63 6f  ment.** won't co
101a0 6e 73 75 6d 65 20 74 68 65 20 73 65 6d 69 63 6f  nsume the semico
101b0 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  lon terminator..
101c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75  */.static int ru
101d0 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65  n_table_dump_que
101e0 72 79 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ry(.  ShellState
101f0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
10200 2a 20 51 75 65 72 79 20 63 6f 6e 74 65 78 74 20  * Query context 
10210 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
10220 2a 7a 53 65 6c 65 63 74 2c 20 20 20 20 20 2f 2a  *zSelect,     /*
10230 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10240 74 20 74 6f 20 65 78 74 72 61 63 74 20 63 6f 6e  t to extract con
10250 74 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tent */.  const 
10260 63 68 61 72 20 2a 7a 46 69 72 73 74 52 6f 77 20  char *zFirstRow 
10270 20 20 20 2f 2a 20 50 72 69 6e 74 20 62 65 66 6f     /* Print befo
10280 72 65 20 66 69 72 73 74 20 72 6f 77 2c 20 69 66  re first row, if
10290 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a   not NULL */.){.
102a0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
102b0 70 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74 20 72  pSelect;.  int r
102c0 63 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  c;.  int nResult
102d0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
102e0 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 72 63  st char *z;.  rc
102f0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
10300 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 65  re_v2(p->db, zSe
10310 6c 65 63 74 2c 20 2d 31 2c 20 26 70 53 65 6c 65  lect, -1, &pSele
10320 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ct, 0);.  if( rc
10330 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
10340 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 75  pSelect ){.    u
10350 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
10360 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a  t, "/**** ERROR:
10370 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c   (%d) %s *****/\
10380 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20 20 20 20  n", rc,.        
10390 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
103a0 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
103b0 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66      if( (rc&0xff
103c0 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  )!=SQLITE_CORRUP
103d0 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  T ) p->nErr++;. 
103e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
103f0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
10400 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b 0a  _step(pSelect);.
10410 20 20 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c 69    nResult = sqli
10420 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
10430 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 77 68 69  (pSelect);.  whi
10440 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52  le( rc==SQLITE_R
10450 4f 57 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 46  OW ){.    if( zF
10460 69 72 73 74 52 6f 77 20 29 7b 0a 20 20 20 20 20  irstRow ){.     
10470 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
10480 6f 75 74 2c 20 22 25 73 22 2c 20 7a 46 69 72 73  out, "%s", zFirs
10490 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 7a 46 69  tRow);.      zFi
104a0 72 73 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  rstRow = 0;.    
104b0 7d 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74  }.    z = (const
104c0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
104d0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65  olumn_text(pSele
104e0 63 74 2c 20 30 29 3b 0a 20 20 20 20 75 74 66 38  ct, 0);.    utf8
104f0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
10500 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 66 6f  "%s", z);.    fo
10510 72 28 69 3d 31 3b 20 69 3c 6e 52 65 73 75 6c 74  r(i=1; i<nResult
10520 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 74  ; i++){.      ut
10530 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
10540 2c 20 22 2c 25 73 22 2c 20 73 71 6c 69 74 65 33  , ",%s", sqlite3
10550 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65  _column_text(pSe
10560 6c 65 63 74 2c 20 69 29 29 3b 0a 20 20 20 20 7d  lect, i));.    }
10570 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  .    if( z==0 ) 
10580 7a 20 3d 20 22 22 3b 0a 20 20 20 20 77 68 69 6c  z = "";.    whil
10590 65 28 20 7a 5b 30 5d 20 26 26 20 28 7a 5b 30 5d  e( z[0] && (z[0]
105a0 21 3d 27 2d 27 20 7c 7c 20 7a 5b 31 5d 21 3d 27  !='-' || z[1]!='
105b0 2d 27 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69  -') ) z++;.    i
105c0 66 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  f( z[0] ){.     
105d0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
105e0 75 74 2c 20 22 5c 6e 3b 5c 6e 22 29 3b 0a 20 20  ut, "\n;\n");.  
105f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
10600 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
10610 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a  , ";\n");.    }.
10620 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10630 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b 0a  _step(pSelect);.
10640 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
10650 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 65 6c  e3_finalize(pSel
10660 65 63 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ect);.  if( rc!=
10670 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10680 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
10690 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f  out, "/**** ERRO
106a0 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a  R: (%d) %s *****
106b0 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20 20  /\n", rc,.      
106c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
106d0 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
106e0 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78  ;.    if( (rc&0x
106f0 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52  ff)!=SQLITE_CORR
10700 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b  UPT ) p->nErr++;
10710 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
10720 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
10730 61 74 65 20 73 70 61 63 65 20 61 6e 64 20 73 61  ate space and sa
10740 76 65 20 6f 66 66 20 63 75 72 72 65 6e 74 20 65  ve off current e
10750 72 72 6f 72 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  rror string..*/.
10760 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 61 76  static char *sav
10770 65 5f 65 72 72 5f 6d 73 67 28 0a 20 20 73 71 6c  e_err_msg(.  sql
10780 69 74 65 33 20 2a 64 62 20 20 20 20 20 20 20 20  ite3 *db        
10790 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
107a0 74 6f 20 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20  to query */.){. 
107b0 20 69 6e 74 20 6e 45 72 72 4d 73 67 20 3d 20 31   int nErrMsg = 1
107c0 2b 73 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  +strlen30(sqlite
107d0 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
107e0 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
107f0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
10800 34 28 6e 45 72 72 4d 73 67 29 3b 0a 20 20 69 66  4(nErrMsg);.  if
10810 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
10820 20 6d 65 6d 63 70 79 28 7a 45 72 72 4d 73 67 2c   memcpy(zErrMsg,
10830 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
10840 64 62 29 2c 20 6e 45 72 72 4d 73 67 29 3b 0a 20  db), nErrMsg);. 
10850 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72   }.  return zErr
10860 4d 73 67 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 5f  Msg;.}..#ifdef _
10870 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20 41  _linux__./*.** A
10880 74 74 65 6d 70 74 20 74 6f 20 64 69 73 70 6c 61  ttempt to displa
10890 79 20 49 2f 4f 20 73 74 61 74 73 20 6f 6e 20 4c  y I/O stats on L
108a0 69 6e 75 78 20 75 73 69 6e 67 20 2f 70 72 6f 63  inux using /proc
108b0 2f 50 49 44 2f 69 6f 0a 2a 2f 0a 73 74 61 74 69  /PID/io.*/.stati
108c0 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 4c 69  c void displayLi
108d0 6e 75 78 49 6f 53 74 61 74 73 28 46 49 4c 45 20  nuxIoStats(FILE 
108e0 2a 6f 75 74 29 7b 0a 20 20 46 49 4c 45 20 2a 69  *out){.  FILE *i
108f0 6e 3b 0a 20 20 63 68 61 72 20 7a 5b 32 30 30 5d  n;.  char z[200]
10900 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
10910 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
10920 7a 2c 20 22 2f 70 72 6f 63 2f 25 64 2f 69 6f 22  z, "/proc/%d/io"
10930 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 69  , getpid());.  i
10940 6e 20 3d 20 66 6f 70 65 6e 28 7a 2c 20 22 72 62  n = fopen(z, "rb
10950 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  ");.  if( in==0 
10960 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c  ) return;.  whil
10970 65 28 20 66 67 65 74 73 28 7a 2c 20 73 69 7a 65  e( fgets(z, size
10980 6f 66 28 7a 29 2c 20 69 6e 29 21 3d 30 20 29 7b  of(z), in)!=0 ){
10990 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
109a0 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  t struct {.     
109b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
109c0 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 63 6f 6e  ttern;.      con
109d0 73 74 20 63 68 61 72 20 2a 7a 44 65 73 63 3b 0a  st char *zDesc;.
109e0 20 20 20 20 7d 20 61 54 72 61 6e 73 5b 5d 20 3d      } aTrans[] =
109f0 20 7b 0a 20 20 20 20 20 20 7b 20 22 72 63 68 61   {.      { "rcha
10a00 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20  r: ",           
10a10 20 20 20 20 20 20 20 22 42 79 74 65 73 20 72 65         "Bytes re
10a20 63 65 69 76 65 64 20 62 79 20 72 65 61 64 28 29  ceived by read()
10a30 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77  :" },.      { "w
10a40 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20 20 20  char: ",        
10a50 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73            "Bytes
10a60 20 73 65 6e 74 20 74 6f 20 77 72 69 74 65 28 29   sent to write()
10a70 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b  :"    },.      {
10a80 20 22 73 79 73 63 72 3a 20 22 2c 20 20 20 20 20   "syscr: ",     
10a90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 65               "Re
10aa0 61 64 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  ad() system call
10ab0 73 3a 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  s:"      },.    
10ac0 20 20 7b 20 22 73 79 73 63 77 3a 20 22 2c 20 20    { "syscw: ",  
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ae0 22 57 72 69 74 65 28 29 20 73 79 73 74 65 6d 20  "Write() system 
10af0 63 61 6c 6c 73 3a 22 20 20 20 20 20 7d 2c 0a 20  calls:"     },. 
10b00 20 20 20 20 20 7b 20 22 72 65 61 64 5f 62 79 74       { "read_byt
10b10 65 73 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20  es: ",          
10b20 20 20 20 22 42 79 74 65 73 20 72 65 61 64 20 66     "Bytes read f
10b30 72 6f 6d 20 73 74 6f 72 61 67 65 3a 22 20 20 7d  rom storage:"  }
10b40 2c 0a 20 20 20 20 20 20 7b 20 22 77 72 69 74 65  ,.      { "write
10b50 5f 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20 20  _bytes: ",      
10b60 20 20 20 20 20 20 22 42 79 74 65 73 20 77 72 69        "Bytes wri
10b70 74 74 65 6e 20 74 6f 20 73 74 6f 72 61 67 65 3a  tten to storage:
10b80 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 61  " },.      { "ca
10b90 6e 63 65 6c 6c 65 64 5f 77 72 69 74 65 5f 62 79  ncelled_write_by
10ba0 74 65 73 3a 20 22 2c 20 20 22 43 61 6e 63 65 6c  tes: ",  "Cancel
10bb0 6c 65 64 20 77 72 69 74 65 20 62 79 74 65 73 3a  led write bytes:
10bc0 22 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20  "    },.    };. 
10bd0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
10be0 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
10bf0 7a 65 28 61 54 72 61 6e 73 29 3b 20 69 2b 2b 29  ze(aTrans); i++)
10c00 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
10c10 73 74 72 6c 65 6e 33 30 28 61 54 72 61 6e 73 5b  strlen30(aTrans[
10c20 69 5d 2e 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  i].zPattern);.  
10c30 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
10c40 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65  aTrans[i].zPatte
10c50 72 6e 2c 20 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a  rn, z, n)==0 ){.
10c60 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
10c70 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20  ntf(out, "%-36s 
10c80 25 73 22 2c 20 61 54 72 61 6e 73 5b 69 5d 2e 7a  %s", aTrans[i].z
10c90 44 65 73 63 2c 20 26 7a 5b 6e 5d 29 3b 0a 20 20  Desc, &z[n]);.  
10ca0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10cb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
10cc0 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 7d 0a 23   fclose(in);.}.#
10cd0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  endif../*.** Dis
10ce0 70 6c 61 79 20 61 20 73 69 6e 67 6c 65 20 6c 69  play a single li
10cf0 6e 65 20 6f 66 20 73 74 61 74 75 73 20 75 73 69  ne of status usi
10d00 6e 67 20 36 34 2d 62 69 74 20 76 61 6c 75 65 73  ng 64-bit values
10d10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10d20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
10d30 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
10d40 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
10d50 20 54 68 65 20 73 68 65 6c 6c 20 63 6f 6e 74 65   The shell conte
10d60 78 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4c  xt */.  char *zL
10d70 61 62 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  abel,           
10d80 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
10d90 68 69 73 20 6f 6e 65 20 6c 69 6e 65 20 2a 2f 0a  his one line */.
10da0 20 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c    char *zFormat,
10db0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
10dc0 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 72 65  ormat for the re
10dd0 73 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53  sult */.  int iS
10de0 74 61 74 75 73 43 74 72 6c 2c 20 20 20 20 20 20  tatusCtrl,      
10df0 20 20 20 20 2f 2a 20 57 68 69 63 68 20 73 74 61      /* Which sta
10e00 74 75 73 20 74 6f 20 64 69 73 70 6c 61 79 20 2a  tus to display *
10e10 2f 0a 20 20 69 6e 74 20 62 52 65 73 65 74 20 20  /.  int bReset  
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10e30 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 74   True to reset t
10e40 68 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20  he stats */.){. 
10e50 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
10e60 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69  Cur = -1;.  sqli
10e70 74 65 33 5f 69 6e 74 36 34 20 69 48 69 77 74 72  te3_int64 iHiwtr
10e80 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 2c 20   = -1;.  int i, 
10e90 6e 50 65 72 63 65 6e 74 3b 0a 20 20 63 68 61 72  nPercent;.  char
10ea0 20 7a 4c 69 6e 65 5b 32 30 30 5d 3b 0a 20 20 73   zLine[200];.  s
10eb0 71 6c 69 74 65 33 5f 73 74 61 74 75 73 36 34 28  qlite3_status64(
10ec0 69 53 74 61 74 75 73 43 74 72 6c 2c 20 26 69 43  iStatusCtrl, &iC
10ed0 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
10ee0 73 65 74 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  set);.  for(i=0,
10ef0 20 6e 50 65 72 63 65 6e 74 3d 30 3b 20 7a 46 6f   nPercent=0; zFo
10f00 72 6d 61 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  rmat[i]; i++){. 
10f10 20 20 20 69 66 28 20 7a 46 6f 72 6d 61 74 5b 69     if( zFormat[i
10f20 5d 3d 3d 27 25 27 20 29 20 6e 50 65 72 63 65 6e  ]=='%' ) nPercen
10f30 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  t++;.  }.  if( n
10f40 50 65 72 63 65 6e 74 3e 31 20 29 7b 0a 20 20 20  Percent>1 ){.   
10f50 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
10f60 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c  f(sizeof(zLine),
10f70 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c   zLine, zFormat,
10f80 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a   iCur, iHiwtr);.
10f90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
10fa0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
10fb0 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69  zeof(zLine), zLi
10fc0 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 69 48 69  ne, zFormat, iHi
10fd0 77 74 72 29 3b 0a 20 20 7d 0a 20 20 72 61 77 5f  wtr);.  }.  raw_
10fe0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
10ff0 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 4c 61  %-36s %s\n", zLa
11000 62 65 6c 2c 20 7a 4c 69 6e 65 29 3b 0a 7d 0a 0a  bel, zLine);.}..
11010 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 6d 65  /*.** Display me
11020 6d 6f 72 79 20 73 74 61 74 73 2e 0a 2a 2f 0a 73  mory stats..*/.s
11030 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61  tatic int displa
11040 79 5f 73 74 61 74 73 28 0a 20 20 73 71 6c 69 74  y_stats(.  sqlit
11050 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
11060 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
11070 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20  se to query */. 
11080 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72   ShellState *pAr
11090 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
110a0 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c  Pointer to Shell
110b0 53 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 62  State */.  int b
110c0 52 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20  Reset           
110d0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
110e0 6f 20 72 65 73 65 74 20 74 68 65 20 73 74 61 74  o reset the stat
110f0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43  s */.){.  int iC
11100 75 72 3b 0a 20 20 69 6e 74 20 69 48 69 77 74 72  ur;.  int iHiwtr
11110 3b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20  ;.  FILE *out;. 
11120 20 69 66 28 20 70 41 72 67 3d 3d 30 20 7c 7c 20   if( pArg==0 || 
11130 70 41 72 67 2d 3e 6f 75 74 3d 3d 30 20 29 20 72  pArg->out==0 ) r
11140 65 74 75 72 6e 20 30 3b 0a 20 20 6f 75 74 20 3d  eturn 0;.  out =
11150 20 70 41 72 67 2d 3e 6f 75 74 3b 0a 0a 20 20 69   pArg->out;..  i
11160 66 28 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 26  f( pArg->pStmt &
11170 26 20 28 70 41 72 67 2d 3e 73 74 61 74 73 4f 6e  & (pArg->statsOn
11180 20 26 20 32 29 20 29 7b 0a 20 20 20 20 69 6e 74   & 2) ){.    int
11190 20 6e 43 6f 6c 2c 20 69 2c 20 78 3b 0a 20 20 20   nCol, i, x;.   
111a0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
111b0 53 74 6d 74 20 3d 20 70 41 72 67 2d 3e 70 53 74  Stmt = pArg->pSt
111c0 6d 74 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31  mt;.    char z[1
111d0 30 30 5d 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  00];.    nCol = 
111e0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
111f0 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
11200 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
11210 20 22 25 2d 33 36 73 20 25 64 5c 6e 22 2c 20 22   "%-36s %d\n", "
11220 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  Number of output
11230 20 63 6f 6c 75 6d 6e 73 3a 22 2c 20 6e 43 6f 6c   columns:", nCol
11240 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
11250 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
11260 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
11270 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 7a  intf(sizeof(z),z
11280 2c 22 43 6f 6c 75 6d 6e 20 25 64 20 25 6e 6e 61  ,"Column %d %nna
11290 6d 65 3a 22 2c 20 69 2c 20 26 78 29 3b 0a 20 20  me:", i, &x);.  
112a0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
112b0 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e  out, "%-36s %s\n
112c0 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f  ", z, sqlite3_co
112d0 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  lumn_name(pStmt,
112e0 69 29 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  i));.#ifndef SQL
112f0 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
11300 45 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  E.      sqlite3_
11310 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78  snprintf(30, z+x
11320 2c 20 22 64 65 63 6c 61 72 65 64 20 74 79 70 65  , "declared type
11330 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  :");.      utf8_
11340 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
11350 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c  6s %s\n", z, sql
11360 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c  ite3_column_decl
11370 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29 29 3b  type(pStmt, i));
11380 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
11390 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
113a0 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
113b0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
113c0 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22 64 61  ntf(30, z+x, "da
113d0 74 61 62 61 73 65 20 6e 61 6d 65 3a 22 29 3b 0a  tabase name:");.
113e0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
113f0 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73  f(out, "%-36s %s
11400 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f  \n", z, sqlite3_
11410 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f  column_database_
11420 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a  name(pStmt,i));.
11430 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
11440 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20  printf(30, z+x, 
11450 22 74 61 62 6c 65 20 6e 61 6d 65 3a 22 29 3b 0a  "table name:");.
11460 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
11470 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73  f(out, "%-36s %s
11480 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f  \n", z, sqlite3_
11490 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d  column_table_nam
114a0 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20  e(pStmt,i));.   
114b0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
114c0 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22 6f 72  ntf(30, z+x, "or
114d0 69 67 69 6e 20 6e 61 6d 65 3a 22 29 3b 0a 20 20  igin name:");.  
114e0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
114f0 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e  out, "%-36s %s\n
11500 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f  ", z, sqlite3_co
11510 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65  lumn_origin_name
11520 28 70 53 74 6d 74 2c 69 29 29 3b 0a 23 65 6e 64  (pStmt,i));.#end
11530 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
11540 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28  displayStatLine(
11550 70 41 72 67 2c 20 22 4d 65 6d 6f 72 79 20 55 73  pArg, "Memory Us
11560 65 64 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64  ed:",.     "%lld
11570 20 28 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65   (max %lld) byte
11580 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55  s", SQLITE_STATU
11590 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 62  S_MEMORY_USED, b
115a0 52 65 73 65 74 29 3b 0a 20 20 64 69 73 70 6c 61  Reset);.  displa
115b0 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20  yStatLine(pArg, 
115c0 22 4e 75 6d 62 65 72 20 6f 66 20 4f 75 74 73 74  "Number of Outst
115d0 61 6e 64 69 6e 67 20 41 6c 6c 6f 63 61 74 69 6f  anding Allocatio
115e0 6e 73 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64  ns:",.     "%lld
115f0 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c 20 53 51   (max %lld)", SQ
11600 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c  LITE_STATUS_MALL
11610 4f 43 5f 43 4f 55 4e 54 2c 20 62 52 65 73 65 74  OC_COUNT, bReset
11620 29 3b 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 73  );.  if( pArg->s
11630 68 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47  hellFlgs & SHFLG
11640 5f 50 61 67 65 63 61 63 68 65 20 29 7b 0a 20 20  _Pagecache ){.  
11650 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e    displayStatLin
11660 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20  e(pArg, "Number 
11670 6f 66 20 50 63 61 63 68 65 20 50 61 67 65 73 20  of Pcache Pages 
11680 55 73 65 64 3a 22 2c 0a 20 20 20 20 20 20 20 22  Used:",.       "
11690 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20  %lld (max %lld) 
116a0 70 61 67 65 73 22 2c 20 53 51 4c 49 54 45 5f 53  pages", SQLITE_S
116b0 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f  TATUS_PAGECACHE_
116c0 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20  USED, bReset);. 
116d0 20 7d 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74   }.  displayStat
116e0 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62  Line(pArg, "Numb
116f0 65 72 20 6f 66 20 50 63 61 63 68 65 20 4f 76 65  er of Pcache Ove
11700 72 66 6c 6f 77 20 42 79 74 65 73 3a 22 2c 0a 20  rflow Bytes:",. 
11710 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25      "%lld (max %
11720 6c 6c 64 29 20 62 79 74 65 73 22 2c 20 53 51 4c  lld) bytes", SQL
11730 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43  ITE_STATUS_PAGEC
11740 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57 2c 20 62  ACHE_OVERFLOW, b
11750 52 65 73 65 74 29 3b 0a 20 20 64 69 73 70 6c 61  Reset);.  displa
11760 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20  yStatLine(pArg, 
11770 22 4c 61 72 67 65 73 74 20 41 6c 6c 6f 63 61 74  "Largest Allocat
11780 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c  ion:",.     "%ll
11790 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45  d bytes", SQLITE
117a0 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53  _STATUS_MALLOC_S
117b0 49 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  IZE, bReset);.  
117c0 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28  displayStatLine(
117d0 70 41 72 67 2c 20 22 4c 61 72 67 65 73 74 20 50  pArg, "Largest P
117e0 63 61 63 68 65 20 41 6c 6c 6f 63 61 74 69 6f 6e  cache Allocation
117f0 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 62  :",.     "%lld b
11800 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54  ytes", SQLITE_ST
11810 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 53  ATUS_PAGECACHE_S
11820 49 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a 23 69  IZE, bReset);.#i
11830 66 64 65 66 20 59 59 54 52 41 43 4b 4d 41 58 53  fdef YYTRACKMAXS
11840 54 41 43 4b 44 45 50 54 48 0a 20 20 64 69 73 70  TACKDEPTH.  disp
11850 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67  layStatLine(pArg
11860 2c 20 22 44 65 65 70 65 73 74 20 50 61 72 73 65  , "Deepest Parse
11870 72 20 53 74 61 63 6b 3a 22 2c 0a 20 20 20 20 20  r Stack:",.     
11880 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29  "%lld (max %lld)
11890 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53  ", SQLITE_STATUS
118a0 5f 50 41 52 53 45 52 5f 53 54 41 43 4b 2c 20 62  _PARSER_STACK, b
118b0 52 65 73 65 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  Reset);.#endif..
118c0 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20    if( db ){.    
118d0 69 66 28 20 70 41 72 67 2d 3e 73 68 65 6c 6c 46  if( pArg->shellF
118e0 6c 67 73 20 26 20 53 48 46 4c 47 5f 4c 6f 6f 6b  lgs & SHFLG_Look
118f0 61 73 69 64 65 20 29 7b 0a 20 20 20 20 20 20 69  aside ){.      i
11900 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
11910 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
11920 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
11930 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c  QLITE_DBSTATUS_L
11940 4f 4f 4b 41 53 49 44 45 5f 55 53 45 44 2c 0a 20  OOKASIDE_USED,. 
11950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11960 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69         &iCur, &i
11970 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
11980 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
11990 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20  (pArg->out,.    
119a0 20 20 20 20 20 20 20 20 20 20 22 4c 6f 6f 6b 61            "Looka
119b0 73 69 64 65 20 53 6c 6f 74 73 20 55 73 65 64 3a  side Slots Used:
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119d0 25 64 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c 0a  %d (max %d)\n",.
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
119f0 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20  ur, iHiwtr);.   
11a00 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
11a10 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
11a20 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49  DBSTATUS_LOOKASI
11a30 44 45 5f 48 49 54 2c 0a 20 20 20 20 20 20 20 20  DE_HIT,.        
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a50 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
11a60 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72  bReset);.      r
11a70 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
11a80 6f 75 74 2c 20 22 53 75 63 63 65 73 73 66 75 6c  out, "Successful
11a90 20 6c 6f 6f 6b 61 73 69 64 65 20 61 74 74 65 6d   lookaside attem
11aa0 70 74 73 3a 20 20 20 20 20 20 20 25 64 5c 6e 22  pts:       %d\n"
11ab0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11ac0 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20 73  iHiwtr);.      s
11ad0 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
11ae0 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  (db, SQLITE_DBST
11af0 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d  ATUS_LOOKASIDE_M
11b00 49 53 53 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20  ISS_SIZE,.      
11b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72    &iCur, &iHiwtr
11b30 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20  , bReset);.     
11b40 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
11b50 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64  ->out, "Lookasid
11b60 65 20 66 61 69 6c 75 72 65 73 20 64 75 65 20 74  e failures due t
11b70 6f 20 73 69 7a 65 3a 20 20 20 20 20 20 25 64 5c  o size:      %d\
11b80 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
11b90 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20    iHiwtr);.     
11ba0 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
11bb0 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
11bc0 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45  STATUS_LOOKASIDE
11bd0 5f 4d 49 53 53 5f 46 55 4c 4c 2c 0a 20 20 20 20  _MISS_FULL,.    
11be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bf0 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77      &iCur, &iHiw
11c00 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
11c10 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
11c20 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73  rg->out, "Lookas
11c30 69 64 65 20 66 61 69 6c 75 72 65 73 20 64 75 65  ide failures due
11c40 20 74 6f 20 4f 4f 4d 3a 20 20 20 20 20 20 20 25   to OOM:       %
11c50 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
11c60 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20      iHiwtr);.   
11c70 20 7d 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20   }.    iHiwtr = 
11c80 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73  iCur = -1;.    s
11c90 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
11ca0 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  (db, SQLITE_DBST
11cb0 41 54 55 53 5f 43 41 43 48 45 5f 55 53 45 44 2c  ATUS_CACHE_USED,
11cc0 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
11cd0 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61   bReset);.    ra
11ce0 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
11cf0 75 74 2c 20 22 50 61 67 65 72 20 48 65 61 70 20  ut, "Pager Heap 
11d00 55 73 61 67 65 3a 20 20 20 20 20 20 20 20 20 20  Usage:          
11d10 20 20 20 20 20 20 20 20 20 20 25 64 20 62 79 74            %d byt
11d20 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
11d30 20 20 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48     iCur);.    iH
11d40 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
11d50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
11d60 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
11d70 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
11d80 45 5f 48 49 54 2c 20 26 69 43 75 72 2c 20 26 69  E_HIT, &iCur, &i
11d90 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72  Hiwtr, 1);.    r
11da0 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
11db0 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65  out, "Page cache
11dc0 20 68 69 74 73 3a 20 20 20 20 20 20 20 20 20 20   hits:          
11dd0 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
11de0 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69  , iCur);.    iHi
11df0 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
11e00 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
11e10 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
11e20 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45  E_DBSTATUS_CACHE
11e30 5f 4d 49 53 53 2c 20 26 69 43 75 72 2c 20 26 69  _MISS, &iCur, &i
11e40 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72  Hiwtr, 1);.    r
11e50 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
11e60 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65  out, "Page cache
11e70 20 6d 69 73 73 65 73 3a 20 20 20 20 20 20 20 20   misses:        
11e80 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
11e90 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69  , iCur);.    iHi
11ea0 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
11eb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
11ec0 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
11ed0 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45  E_DBSTATUS_CACHE
11ee0 5f 57 52 49 54 45 2c 20 26 69 43 75 72 2c 20 26  _WRITE, &iCur, &
11ef0 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20  iHiwtr, 1);.    
11f00 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
11f10 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68  >out, "Page cach
11f20 65 20 77 72 69 74 65 73 3a 20 20 20 20 20 20 20  e writes:       
11f30 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
11f40 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48  ", iCur);.    iH
11f50 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
11f60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
11f70 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
11f80 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
11f90 45 5f 53 50 49 4c 4c 2c 20 26 69 43 75 72 2c 20  E_SPILL, &iCur, 
11fa0 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20  &iHiwtr, 1);.   
11fb0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
11fc0 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63  ->out, "Page cac
11fd0 68 65 20 73 70 69 6c 6c 73 3a 20 20 20 20 20 20  he spills:      
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
11ff0 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
12000 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
12010 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  1;.    sqlite3_d
12020 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
12030 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53 43 48  ITE_DBSTATUS_SCH
12040 45 4d 41 5f 55 53 45 44 2c 20 26 69 43 75 72 2c  EMA_USED, &iCur,
12050 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
12060 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
12070 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 63  f(pArg->out, "Sc
12080 68 65 6d 61 20 48 65 61 70 20 55 73 61 67 65 3a  hema Heap Usage:
12090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120a0 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a     %d bytes\n",.
120b0 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72              iCur
120c0 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20  );.    iHiwtr = 
120d0 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73  iCur = -1;.    s
120e0 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
120f0 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  (db, SQLITE_DBST
12100 41 54 55 53 5f 53 54 4d 54 5f 55 53 45 44 2c 20  ATUS_STMT_USED, 
12110 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
12120 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
12130 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12140 74 2c 20 22 53 74 61 74 65 6d 65 6e 74 20 48 65  t, "Statement He
12150 61 70 2f 4c 6f 6f 6b 61 73 69 64 65 20 55 73 61  ap/Lookaside Usa
12160 67 65 3a 20 20 20 20 20 20 25 64 20 62 79 74 65  ge:      %d byte
12170 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
12180 20 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20    iCur);.  }..  
12190 69 66 28 20 70 41 72 67 2d 3e 70 53 74 6d 74 20  if( pArg->pStmt 
121a0 29 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  ){.    iCur = sq
121b0 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
121c0 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
121d0 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
121e0 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 0a  _FULLSCAN_STEP,.
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
12210 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
12220 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12230 2c 20 22 46 75 6c 6c 73 63 61 6e 20 53 74 65 70  , "Fullscan Step
12240 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s:              
12250 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
12260 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d  Cur);.    iCur =
12270 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
12280 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74  atus(pArg->pStmt
12290 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
122a0 54 55 53 5f 53 4f 52 54 2c 20 62 52 65 73 65 74  TUS_SORT, bReset
122b0 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
122c0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 6f  f(pArg->out, "So
122d0 72 74 20 4f 70 65 72 61 74 69 6f 6e 73 3a 20 20  rt Operations:  
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122f0 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
12300 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
12310 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
12320 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
12330 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41  ITE_STMTSTATUS_A
12340 55 54 4f 49 4e 44 45 58 2c 62 52 65 73 65 74 29  UTOINDEX,bReset)
12350 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
12360 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 41 75 74  (pArg->out, "Aut
12370 6f 69 6e 64 65 78 20 49 6e 73 65 72 74 73 3a 20  oindex Inserts: 
12380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12390 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
123a0 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74      iCur = sqlit
123b0 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
123c0 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49  Arg->pStmt, SQLI
123d0 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d  TE_STMTSTATUS_VM
123e0 5f 53 54 45 50 2c 20 62 52 65 73 65 74 29 3b 0a  _STEP, bReset);.
123f0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
12400 41 72 67 2d 3e 6f 75 74 2c 20 22 56 69 72 74 75  Arg->out, "Virtu
12410 61 6c 20 4d 61 63 68 69 6e 65 20 53 74 65 70 73  al Machine Steps
12420 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
12430 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
12440 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33    iCur = sqlite3
12450 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72  _stmt_status(pAr
12460 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45  g->pStmt, SQLITE
12470 5f 53 54 4d 54 53 54 41 54 55 53 5f 52 45 50 52  _STMTSTATUS_REPR
12480 45 50 41 52 45 2c 20 62 52 65 73 65 74 29 3b 0a  EPARE, bReset);.
12490 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
124a0 41 72 67 2d 3e 6f 75 74 2c 20 22 52 65 70 72 65  Arg->out, "Repre
124b0 70 61 72 65 20 6f 70 65 72 61 74 69 6f 6e 73 3a  pare operations:
124c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124d0 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
124e0 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33    iCur = sqlite3
124f0 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72  _stmt_status(pAr
12500 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45  g->pStmt, SQLITE
12510 5f 53 54 4d 54 53 54 41 54 55 53 5f 52 55 4e 2c  _STMTSTATUS_RUN,
12520 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61   bReset);.    ra
12530 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
12540 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 74  ut, "Number of t
12550 69 6d 65 73 20 72 75 6e 3a 20 20 20 20 20 20 20  imes run:       
12560 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
12570 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72   iCur);.    iCur
12580 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
12590 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74  status(pArg->pSt
125a0 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  mt, SQLITE_STMTS
125b0 54 41 54 55 53 5f 4d 45 4d 55 53 45 44 2c 20 62  TATUS_MEMUSED, b
125c0 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
125d0 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
125e0 2c 20 22 4d 65 6d 6f 72 79 20 75 73 65 64 20 62  , "Memory used b
125f0 79 20 70 72 65 70 61 72 65 64 20 73 74 6d 74 3a  y prepared stmt:
12600 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
12610 43 75 72 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  Cur);.  }..#ifde
12620 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 20 20 64 69  f __linux__.  di
12630 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61 74  splayLinuxIoStat
12640 73 28 70 41 72 67 2d 3e 6f 75 74 29 3b 0a 23 65  s(pArg->out);.#e
12650 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  ndif..  /* Do no
12660 74 20 72 65 6d 6f 76 65 20 74 68 69 73 20 6d 61  t remove this ma
12670 63 68 69 6e 65 20 72 65 61 64 61 62 6c 65 20 63  chine readable c
12680 6f 6d 6d 65 6e 74 3a 20 65 78 74 72 61 2d 73 74  omment: extra-st
12690 61 74 73 2d 6f 75 74 70 75 74 2d 68 65 72 65 20  ats-output-here 
126a0 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  */..  return 0;.
126b0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79  }../*.** Display
126c0 20 73 63 61 6e 20 73 74 61 74 73 2e 0a 2a 2f 0a   scan stats..*/.
126d0 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70  static void disp
126e0 6c 61 79 5f 73 63 61 6e 73 74 61 74 73 28 0a 20  lay_scanstats(. 
126f0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
12700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12710 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20   /* Database to 
12720 71 75 65 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c  query */.  Shell
12730 53 74 61 74 65 20 2a 70 41 72 67 20 20 20 20 20  State *pArg     
12740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
12750 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74  inter to ShellSt
12760 61 74 65 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ate */.){.#ifnde
12770 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
12780 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
12790 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
127a0 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44  ER(db);.  UNUSED
127b0 5f 50 41 52 41 4d 45 54 45 52 28 70 41 72 67 29  _PARAMETER(pArg)
127c0 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 69 2c  ;.#else.  int i,
127d0 20 6b 2c 20 6e 2c 20 6d 78 3b 0a 20 20 72 61 77   k, n, mx;.  raw
127e0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
127f0 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 63 61  t, "-------- sca
12800 6e 73 74 61 74 73 20 2d 2d 2d 2d 2d 2d 2d 2d 5c  nstats --------\
12810 6e 22 29 3b 0a 20 20 6d 78 20 3d 20 30 3b 0a 20  n");.  mx = 0;. 
12820 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 3d 6d 78 3b   for(k=0; k<=mx;
12830 20 6b 2b 2b 29 7b 0a 20 20 20 20 64 6f 75 62 6c   k++){.    doubl
12840 65 20 72 45 73 74 4c 6f 6f 70 20 3d 20 31 2e 30  e rEstLoop = 1.0
12850 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b  ;.    for(i=n=0;
12860 20 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20   1; i++){.      
12870 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 20  sqlite3_stmt *p 
12880 3d 20 70 41 72 67 2d 3e 70 53 74 6d 74 3b 0a 20  = pArg->pStmt;. 
12890 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
128a0 36 34 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73 69 74  64 nLoop, nVisit
128b0 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72  ;.      double r
128c0 45 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Est;.      int i
128d0 53 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  Sid;.      const
128e0 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b   char *zExplain;
128f0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
12900 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
12910 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f  us(p, i, SQLITE_
12920 53 43 41 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20  SCANSTAT_NLOOP, 
12930 28 76 6f 69 64 2a 29 26 6e 4c 6f 6f 70 29 20 29  (void*)&nLoop) )
12940 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
12950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
12960 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
12970 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c  status(p, i, SQL
12980 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 53 45 4c  ITE_SCANSTAT_SEL
12990 45 43 54 49 44 2c 20 28 76 6f 69 64 2a 29 26 69  ECTID, (void*)&i
129a0 53 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Sid);.      if( 
129b0 69 53 69 64 3e 6d 78 20 29 20 6d 78 20 3d 20 69  iSid>mx ) mx = i
129c0 53 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69  Sid;.      if( i
129d0 53 69 64 21 3d 6b 20 29 20 63 6f 6e 74 69 6e 75  Sid!=k ) continu
129e0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  e;.      if( n==
129f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 45 73  0 ){.        rEs
12a00 74 4c 6f 6f 70 20 3d 20 28 64 6f 75 62 6c 65 29  tLoop = (double)
12a10 6e 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69  nLoop;.        i
12a20 66 28 20 6b 3e 30 20 29 20 72 61 77 5f 70 72 69  f( k>0 ) raw_pri
12a30 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
12a40 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75 62 71 75 65 72  -------- subquer
12a50 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c  y %d -------\n",
12a60 20 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   k);.      }.   
12a70 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 73 71     n++;.      sq
12a80 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
12a90 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49  tatus(p, i, SQLI
12aa0 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56 49 53  TE_SCANSTAT_NVIS
12ab0 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56 69 73  IT, (void*)&nVis
12ac0 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  it);.      sqlit
12ad0 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
12ae0 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f  us(p, i, SQLITE_
12af0 53 43 41 4e 53 54 41 54 5f 45 53 54 2c 20 28 76  SCANSTAT_EST, (v
12b00 6f 69 64 2a 29 26 72 45 73 74 29 3b 0a 20 20 20  oid*)&rEst);.   
12b10 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
12b20 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c  scanstatus(p, i,
12b30 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54   SQLITE_SCANSTAT
12b40 5f 45 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a  _EXPLAIN, (void*
12b50 29 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20  )&zExplain);.   
12b60 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
12b70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 70 20  Arg->out, "Loop 
12b80 25 32 64 3a 20 25 73 5c 6e 22 2c 20 6e 2c 20 7a  %2d: %s\n", n, z
12b90 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20  Explain);.      
12ba0 72 45 73 74 4c 6f 6f 70 20 2a 3d 20 72 45 73 74  rEstLoop *= rEst
12bb0 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
12bc0 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20  tf(pArg->out,.  
12bd0 20 20 20 20 20 20 20 20 22 20 20 20 20 20 20 20          "       
12be0 20 20 6e 4c 6f 6f 70 3d 25 2d 38 6c 6c 64 20 6e    nLoop=%-8lld n
12bf0 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f  Row=%-8lld estRo
12c00 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77 2f  w=%-8lld estRow/
12c10 4c 6f 6f 70 3d 25 2d 38 67 5c 6e 22 2c 0a 20 20  Loop=%-8g\n",.  
12c20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70 2c 20 6e          nLoop, n
12c30 56 69 73 69 74 2c 20 28 73 71 6c 69 74 65 33 5f  Visit, (sqlite3_
12c40 69 6e 74 36 34 29 28 72 45 73 74 4c 6f 6f 70 2b  int64)(rEstLoop+
12c50 30 2e 35 29 2c 20 72 45 73 74 0a 20 20 20 20 20  0.5), rEst.     
12c60 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
12c70 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
12c80 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d  >out, "---------
12c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ca0 2d 2d 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 7d  --\n");.#endif.}
12cb0 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
12cc0 72 20 61 7a 41 72 72 61 79 20 70 6f 69 6e 74 73  r azArray points
12cd0 20 74 6f 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69   to a zero-termi
12ce0 6e 61 74 65 64 20 61 72 72 61 79 20 6f 66 20 73  nated array of s
12cf0 74 72 69 6e 67 73 2e 20 7a 53 74 72 0a 2a 2a 20  trings. zStr.** 
12d00 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 69 6e 67  points to a sing
12d10 6c 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  le nul-terminate
12d20 64 20 73 74 72 69 6e 67 2e 20 52 65 74 75 72 6e  d string. Return
12d30 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 7a 53 74   non-zero if zSt
12d40 72 0a 2a 2a 20 69 73 20 65 71 75 61 6c 2c 20 61  r.** is equal, a
12d50 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 74 72 63  ccording to strc
12d60 6d 70 28 29 2c 20 74 6f 20 61 6e 79 20 6f 66 20  mp(), to any of 
12d70 74 68 65 20 73 74 72 69 6e 67 73 20 69 6e 20 74  the strings in t
12d80 68 65 20 61 72 72 61 79 2e 0a 2a 2a 20 4f 74 68  he array..** Oth
12d90 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 7a  erwise, return z
12da0 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
12db0 6e 74 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28  nt str_in_array(
12dc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72  const char *zStr
12dd0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61  , const char **a
12de0 7a 41 72 72 61 79 29 7b 0a 20 20 69 6e 74 20 69  zArray){.  int i
12df0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 61 7a 41  ;.  for(i=0; azA
12e00 72 72 61 79 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  rray[i]; i++){. 
12e10 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
12e20 28 7a 53 74 72 2c 20 61 7a 41 72 72 61 79 5b 69  (zStr, azArray[i
12e30 5d 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ]) ) return 1;. 
12e40 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
12e50 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70 69  ../*.** If compi
12e60 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 20 70 53  led statement pS
12e70 71 6c 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ql appears to be
12e80 20 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61 74   an EXPLAIN stat
12e90 65 6d 65 6e 74 2c 20 61 6c 6c 6f 63 61 74 65 0a  ement, allocate.
12ea0 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  ** and populate 
12eb0 74 68 65 20 53 68 65 6c 6c 53 74 61 74 65 2e 61  the ShellState.a
12ec0 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79 20  iIndent[] array 
12ed0 77 69 74 68 20 74 68 65 20 6e 75 6d 62 65 72 20  with the number 
12ee0 6f 66 0a 2a 2a 20 73 70 61 63 65 73 20 65 61 63  of.** spaces eac
12ef0 68 20 6f 70 63 6f 64 65 20 73 68 6f 75 6c 64 20  h opcode should 
12f00 62 65 20 69 6e 64 65 6e 74 65 64 20 62 65 66 6f  be indented befo
12f10 72 65 20 69 74 20 69 73 20 6f 75 74 70 75 74 2e  re it is output.
12f20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 6e  .**.** The inden
12f30 74 69 6e 67 20 72 75 6c 65 73 20 61 72 65 3a 0a  ting rules are:.
12f40 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20  **.**     * For 
12f50 65 61 63 68 20 22 4e 65 78 74 22 2c 20 22 50 72  each "Next", "Pr
12f60 65 76 22 2c 20 22 56 4e 65 78 74 22 20 6f 72 20  ev", "VNext" or 
12f70 22 56 50 72 65 76 22 20 69 6e 73 74 72 75 63 74  "VPrev" instruct
12f80 69 6f 6e 2c 20 69 6e 64 65 6e 74 0a 2a 2a 20 20  ion, indent.**  
12f90 20 20 20 20 20 61 6c 6c 20 6f 70 63 6f 64 65 73       all opcodes
12fa0 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 74 77   that occur betw
12fb0 65 65 6e 20 74 68 65 20 70 32 20 6a 75 6d 70 20  een the p2 jump 
12fc0 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 6e 64 20  destination and 
12fd0 74 68 65 20 6f 70 63 6f 64 65 0a 2a 2a 20 20 20  the opcode.**   
12fe0 20 20 20 20 69 74 73 65 6c 66 20 62 79 20 32 20      itself by 2 
12ff0 73 70 61 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  spaces..**.**   
13000 20 20 2a 20 46 6f 72 20 65 61 63 68 20 22 47 6f    * For each "Go
13010 74 6f 22 2c 20 69 66 20 74 68 65 20 6a 75 6d 70  to", if the jump
13020 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
13030 65 61 72 6c 69 65 72 20 69 6e 20 74 68 65 20 70  earlier in the p
13040 72 6f 67 72 61 6d 0a 2a 2a 20 20 20 20 20 20 20  rogram.**       
13050 61 6e 64 20 65 6e 64 73 20 6f 6e 20 6f 6e 65 20  and ends on one 
13060 6f 66 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  of:.**          
13070 59 69 65 6c 64 20 20 53 65 65 6b 47 74 20 20 53  Yield  SeekGt  S
13080 65 65 6b 4c 74 20 20 52 6f 77 53 65 74 52 65 61  eekLt  RowSetRea
13090 64 20 20 52 65 77 69 6e 64 0a 2a 2a 20 20 20 20  d  Rewind.**    
130a0 20 20 20 6f 72 20 69 66 20 74 68 65 20 50 31 20     or if the P1 
130b0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 6e 65  parameter is one
130c0 20 69 6e 73 74 65 61 64 20 6f 66 20 7a 65 72 6f   instead of zero
130d0 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 6e 20  ,.**       then 
130e0 69 6e 64 65 6e 74 20 61 6c 6c 20 6f 70 63 6f 64  indent all opcod
130f0 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 65  es between the e
13100 61 72 6c 69 65 72 20 69 6e 73 74 72 75 63 74 69  arlier instructi
13110 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20  on.**       and 
13120 22 47 6f 74 6f 22 20 62 79 20 32 20 73 70 61 63  "Goto" by 2 spac
13130 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
13140 69 64 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f  id explain_data_
13150 70 72 65 70 61 72 65 28 53 68 65 6c 6c 53 74 61  prepare(ShellSta
13160 74 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73  te *p, sqlite3_s
13170 74 6d 74 20 2a 70 53 71 6c 29 7b 0a 20 20 63 6f  tmt *pSql){.  co
13180 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20  nst char *zSql; 
13190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
131a0 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   The text of the
131b0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
131c0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
131d0 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
131e0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 63      /* Used to c
131f0 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20  heck if this is 
13200 61 6e 20 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20  an EXPLAIN */.  
13210 69 6e 74 20 2a 61 62 59 69 65 6c 64 20 3d 20 30  int *abYield = 0
13220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13230 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 20 69 73  /* True if op is
13240 20 61 6e 20 4f 50 5f 59 69 65 6c 64 20 2a 2f 0a   an OP_Yield */.
13250 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30    int nAlloc = 0
13260 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13270 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
13280 69 7a 65 20 6f 66 20 70 2d 3e 61 69 49 6e 64 65  ize of p->aiInde
13290 6e 74 5b 5d 2c 20 61 62 59 69 65 6c 64 20 2a 2f  nt[], abYield */
132a0 0a 20 20 69 6e 74 20 69 4f 70 3b 20 20 20 20 20  .  int iOp;     
132b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6f     /* Index of o
132d0 70 65 72 61 74 69 6f 6e 20 69 6e 20 70 2d 3e 61  peration in p->a
132e0 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 0a 20 20  iIndent[] */..  
132f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4e 65  const char *azNe
13300 78 74 5b 5d 20 3d 20 7b 20 22 4e 65 78 74 22 2c  xt[] = { "Next",
13310 20 22 50 72 65 76 22 2c 20 22 56 50 72 65 76 22   "Prev", "VPrev"
13320 2c 20 22 56 4e 65 78 74 22 2c 20 22 53 6f 72 74  , "VNext", "Sort
13330 65 72 4e 65 78 74 22 2c 20 30 20 7d 3b 0a 20 20  erNext", 0 };.  
13340 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 59 69  const char *azYi
13350 65 6c 64 5b 5d 20 3d 20 7b 20 22 59 69 65 6c 64  eld[] = { "Yield
13360 22 2c 20 22 53 65 65 6b 4c 54 22 2c 20 22 53 65  ", "SeekLT", "Se
13370 65 6b 47 54 22 2c 20 22 52 6f 77 53 65 74 52 65  ekGT", "RowSetRe
13380 61 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ad",.           
13390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133a0 20 22 52 65 77 69 6e 64 22 2c 20 30 20 7d 3b 0a   "Rewind", 0 };.
133b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
133c0 47 6f 74 6f 5b 5d 20 3d 20 7b 20 22 47 6f 74 6f  Goto[] = { "Goto
133d0 22 2c 20 30 20 7d 3b 0a 0a 20 20 2f 2a 20 54 72  ", 0 };..  /* Tr
133e0 79 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  y to figure out 
133f0 69 66 20 74 68 69 73 20 69 73 20 72 65 61 6c 6c  if this is reall
13400 79 20 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61  y an EXPLAIN sta
13410 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 69 73 0a  tement. If this.
13420 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 76    ** cannot be v
13430 65 72 69 66 69 65 64 2c 20 72 65 74 75 72 6e 20  erified, return 
13440 65 61 72 6c 79 2e 20 20 2a 2f 0a 20 20 69 66 28  early.  */.  if(
13450 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
13460 63 6f 75 6e 74 28 70 53 71 6c 29 21 3d 38 20 29  count(pSql)!=8 )
13470 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d  {.    p->cMode =
13480 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65   p->mode;.    re
13490 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c  turn;.  }.  zSql
134a0 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70   = sqlite3_sql(p
134b0 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  Sql);.  if( zSql
134c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
134d0 66 6f 72 28 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d 3d  for(z=zSql; *z==
134e0 27 20 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27 20  ' ' || *z=='\t' 
134f0 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27 20 7c 7c 20 2a  || *z=='\n' || *
13500 7a 3d 3d 27 5c 66 27 20 7c 7c 20 2a 7a 3d 3d 27  z=='\f' || *z=='
13510 5c 72 27 3b 20 7a 2b 2b 29 3b 0a 20 20 69 66 28  \r'; z++);.  if(
13520 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
13530 70 28 7a 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20  p(z, "explain", 
13540 37 29 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f  7) ){.    p->cMo
13550 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
13560 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
13570 20 66 6f 72 28 69 4f 70 3d 30 3b 20 53 51 4c 49   for(iOp=0; SQLI
13580 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
13590 73 74 65 70 28 70 53 71 6c 29 3b 20 69 4f 70 2b  step(pSql); iOp+
135a0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  +){.    int i;. 
135b0 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
135c0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
135d0 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20  t(pSql, 0);.    
135e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
135f0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
13600 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
13610 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a 0a 20 20  xt(pSql, 1);..  
13620 20 20 2f 2a 20 53 65 74 20 70 32 20 74 6f 20 74    /* Set p2 to t
13630 68 65 20 50 32 20 66 69 65 6c 64 20 6f 66 20 74  he P2 field of t
13640 68 65 20 63 75 72 72 65 6e 74 20 6f 70 63 6f 64  he current opcod
13650 65 2e 20 54 68 65 6e 2c 20 61 73 73 75 6d 69 6e  e. Then, assumin
13660 67 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 70 32  g that.    ** p2
13670 20 69 73 20 61 6e 20 69 6e 73 74 72 75 63 74 69   is an instructi
13680 6f 6e 20 61 64 64 72 65 73 73 2c 20 73 65 74 20  on address, set 
13690 76 61 72 69 61 62 6c 65 20 70 32 6f 70 20 74 6f  variable p2op to
136a0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
136b0 61 74 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  at.    ** instru
136c0 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 69 49  ction in the aiI
136d0 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79 2e 20 70  ndent[] array. p
136e0 32 20 61 6e 64 20 70 32 6f 70 20 6d 61 79 20 62  2 and p2op may b
136f0 65 20 64 69 66 66 65 72 65 6e 74 20 69 66 0a 20  e different if. 
13700 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
13710 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  t instruction is
13720 20 70 61 72 74 20 6f 66 20 61 20 73 75 62 2d 70   part of a sub-p
13730 72 6f 67 72 61 6d 20 67 65 6e 65 72 61 74 65 64  rogram generated
13740 20 62 79 20 61 6e 0a 20 20 20 20 2a 2a 20 53 51   by an.    ** SQ
13750 4c 20 74 72 69 67 67 65 72 20 6f 72 20 66 6f 72  L trigger or for
13760 65 69 67 6e 20 6b 65 79 2e 20 20 2a 2f 0a 20 20  eign key.  */.  
13770 20 20 69 6e 74 20 70 32 20 3d 20 73 71 6c 69 74    int p2 = sqlit
13780 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
13790 71 6c 2c 20 33 29 3b 0a 20 20 20 20 69 6e 74 20  ql, 3);.    int 
137a0 70 32 6f 70 20 3d 20 28 70 32 20 2b 20 28 69 4f  p2op = (p2 + (iO
137b0 70 2d 69 41 64 64 72 29 29 3b 0a 0a 20 20 20 20  p-iAddr));..    
137c0 2f 2a 20 47 72 6f 77 20 74 68 65 20 70 2d 3e 61  /* Grow the p->a
137d0 69 49 6e 64 65 6e 74 20 61 72 72 61 79 20 61 73  iIndent array as
137e0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
137f0 20 69 66 28 20 69 4f 70 3e 3d 6e 41 6c 6c 6f 63   if( iOp>=nAlloc
13800 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 4f   ){.      if( iO
13810 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p==0 ){.        
13820 2f 2a 20 44 6f 20 66 75 72 74 68 65 72 20 76 65  /* Do further ve
13830 72 66 69 63 61 74 69 6f 6e 20 74 68 61 74 20 74  rfication that t
13840 68 69 73 20 69 73 20 65 78 70 6c 61 69 6e 20 6f  his is explain o
13850 75 74 70 75 74 2e 20 20 41 62 6f 72 74 20 69 66  utput.  Abort if
13860 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69  .        ** it i
13870 73 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20  s not */.       
13880 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
13890 61 72 20 2a 65 78 70 6c 61 69 6e 43 6f 6c 73 5b  ar *explainCols[
138a0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
138b0 20 22 61 64 64 72 22 2c 20 22 6f 70 63 6f 64 65   "addr", "opcode
138c0 22 2c 20 22 70 31 22 2c 20 22 70 32 22 2c 20 22  ", "p1", "p2", "
138d0 70 33 22 2c 20 22 70 34 22 2c 20 22 70 35 22 2c  p3", "p4", "p5",
138e0 20 22 63 6f 6d 6d 65 6e 74 22 20 7d 3b 0a 20 20   "comment" };.  
138f0 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20        int jj;.  
13900 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20        for(jj=0; 
13910 6a 6a 3c 41 72 72 61 79 53 69 7a 65 28 65 78 70  jj<ArraySize(exp
13920 6c 61 69 6e 43 6f 6c 73 29 3b 20 6a 6a 2b 2b 29  lainCols); jj++)
13930 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
13940 73 74 72 63 6d 70 28 73 71 6c 69 74 65 33 5f 63  strcmp(sqlite3_c
13950 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 71 6c 2c  olumn_name(pSql,
13960 6a 6a 29 2c 65 78 70 6c 61 69 6e 43 6f 6c 73 5b  jj),explainCols[
13970 6a 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  jj])!=0 ){.     
13980 20 20 20 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20         p->cMode 
13990 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20  = p->mode;.     
139a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
139b0 65 73 65 74 28 70 53 71 6c 29 3b 0a 20 20 20 20  eset(pSql);.    
139c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
139d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
139e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
139f0 20 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31 30      nAlloc += 10
13a00 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 69 49 6e  0;.      p->aiIn
13a10 64 65 6e 74 20 3d 20 28 69 6e 74 2a 29 73 71 6c  dent = (int*)sql
13a20 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70  ite3_realloc64(p
13a30 2d 3e 61 69 49 6e 64 65 6e 74 2c 20 6e 41 6c 6c  ->aiIndent, nAll
13a40 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b  oc*sizeof(int));
13a50 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 69  .      if( p->ai
13a60 49 6e 64 65 6e 74 3d 3d 30 20 29 20 73 68 65 6c  Indent==0 ) shel
13a70 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28  l_out_of_memory(
13a80 29 3b 0a 20 20 20 20 20 20 61 62 59 69 65 6c 64  );.      abYield
13a90 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33   = (int*)sqlite3
13aa0 5f 72 65 61 6c 6c 6f 63 36 34 28 61 62 59 69 65  _realloc64(abYie
13ab0 6c 64 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  ld, nAlloc*sizeo
13ac0 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 69  f(int));.      i
13ad0 66 28 20 61 62 59 69 65 6c 64 3d 3d 30 20 29 20  f( abYield==0 ) 
13ae0 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d  shell_out_of_mem
13af0 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ory();.    }.   
13b00 20 61 62 59 69 65 6c 64 5b 69 4f 70 5d 20 3d 20   abYield[iOp] = 
13b10 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70  str_in_array(zOp
13b20 2c 20 61 7a 59 69 65 6c 64 29 3b 0a 20 20 20 20  , azYield);.    
13b30 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 4f 70 5d  p->aiIndent[iOp]
13b40 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 49 6e   = 0;.    p->nIn
13b50 64 65 6e 74 20 3d 20 69 4f 70 2b 31 3b 0a 0a 20  dent = iOp+1;.. 
13b60 20 20 20 69 66 28 20 73 74 72 5f 69 6e 5f 61 72     if( str_in_ar
13b70 72 61 79 28 7a 4f 70 2c 20 61 7a 4e 65 78 74 29  ray(zOp, azNext)
13b80 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
13b90 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b  p2op; i<iOp; i++
13ba0 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d  ) p->aiIndent[i]
13bb0 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20   += 2;.    }.   
13bc0 20 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61   if( str_in_arra
13bd0 79 28 7a 4f 70 2c 20 61 7a 47 6f 74 6f 29 20 26  y(zOp, azGoto) &
13be0 26 20 70 32 6f 70 3c 70 2d 3e 6e 49 6e 64 65 6e  & p2op<p->nInden
13bf0 74 0a 20 20 20 20 20 26 26 20 28 61 62 59 69 65  t.     && (abYie
13c00 6c 64 5b 70 32 6f 70 5d 20 7c 7c 20 73 71 6c 69  ld[p2op] || sqli
13c10 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
13c20 53 71 6c 2c 20 32 29 29 0a 20 20 20 20 29 7b 0a  Sql, 2)).    ){.
13c30 20 20 20 20 20 20 66 6f 72 28 69 3d 70 32 6f 70        for(i=p2op
13c40 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d  ; i<iOp; i++) p-
13c50 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20  >aiIndent[i] += 
13c60 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  2;.    }.  }..  
13c70 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a  p->iIndent = 0;.
13c80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
13c90 62 59 69 65 6c 64 29 3b 0a 20 20 73 71 6c 69 74  bYield);.  sqlit
13ca0 65 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b 0a  e3_reset(pSql);.
13cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
13cc0 65 20 61 72 72 61 79 20 61 6c 6c 6f 63 61 74 65  e array allocate
13cd0 64 20 62 79 20 65 78 70 6c 61 69 6e 5f 64 61 74  d by explain_dat
13ce0 61 5f 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a  a_prepare()..*/.
13cf0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
13d00 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28  ain_data_delete(
13d10 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
13d20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13d30 2d 3e 61 69 49 6e 64 65 6e 74 29 3b 0a 20 20 70  ->aiIndent);.  p
13d40 2d 3e 61 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a  ->aiIndent = 0;.
13d50 20 20 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 30    p->nIndent = 0
13d60 3b 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d  ;.  p->iIndent =
13d70 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73   0;.}../*.** Dis
13d80 61 62 6c 65 20 61 6e 64 20 72 65 73 74 6f 72 65  able and restore
13d90 20 2e 77 68 65 72 65 74 72 61 63 65 20 61 6e 64   .wheretrace and
13da0 20 2e 73 65 6c 65 63 74 74 72 61 63 65 20 73 65   .selecttrace se
13db0 74 74 69 6e 67 73 2e 0a 2a 2f 0a 23 69 66 20 64  ttings..*/.#if d
13dc0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
13dd0 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
13de0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
13df0 4c 45 43 54 54 52 41 43 45 29 0a 65 78 74 65 72  LECTTRACE).exter
13e00 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  n int sqlite3Sel
13e10 65 63 74 54 72 61 63 65 3b 0a 73 74 61 74 69 63  ectTrace;.static
13e20 20 69 6e 74 20 73 61 76 65 64 53 65 6c 65 63 74   int savedSelect
13e30 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69  Trace;.#endif.#i
13e40 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
13e50 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
13e60 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
13e70 5f 57 48 45 52 45 54 52 41 43 45 29 0a 65 78 74  _WHERETRACE).ext
13e80 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57  ern int sqlite3W
13e90 68 65 72 65 54 72 61 63 65 3b 0a 73 74 61 74 69  hereTrace;.stati
13ea0 63 20 69 6e 74 20 73 61 76 65 64 57 68 65 72 65  c int savedWhere
13eb0 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 73 74  Trace;.#endif.st
13ec0 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c  atic void disabl
13ed0 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f  e_debug_trace_mo
13ee0 64 65 73 28 76 6f 69 64 29 7b 0a 23 69 66 20 64  des(void){.#if d
13ef0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
13f00 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
13f10 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
13f20 4c 45 43 54 54 52 41 43 45 29 0a 20 20 73 61 76  LECTTRACE).  sav
13f30 65 64 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20  edSelectTrace = 
13f40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
13f50 63 65 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  ce;.  sqlite3Sel
13f60 65 63 74 54 72 61 63 65 20 3d 20 30 3b 0a 23 65  ectTrace = 0;.#e
13f70 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
13f80 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26  (SQLITE_DEBUG) &
13f90 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
13fa0 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41  _ENABLE_WHERETRA
13fb0 43 45 29 0a 20 20 73 61 76 65 64 57 68 65 72 65  CE).  savedWhere
13fc0 54 72 61 63 65 20 3d 20 73 71 6c 69 74 65 33 57  Trace = sqlite3W
13fd0 68 65 72 65 54 72 61 63 65 3b 0a 20 20 73 71 6c  hereTrace;.  sql
13fe0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
13ff0 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61   0;.#endif.}.sta
14000 74 69 63 20 76 6f 69 64 20 72 65 73 74 6f 72 65  tic void restore
14010 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64  _debug_trace_mod
14020 65 73 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65  es(void){.#if de
14030 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
14040 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
14050 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c  QLITE_ENABLE_SEL
14060 45 43 54 54 52 41 43 45 29 0a 20 20 73 71 6c 69  ECTTRACE).  sqli
14070 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d  te3SelectTrace =
14080 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61 63   savedSelectTrac
14090 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  e;.#endif.#if de
140a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
140b0 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
140c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45  QLITE_ENABLE_WHE
140d0 52 45 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74  RETRACE).  sqlit
140e0 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 73  e3WhereTrace = s
140f0 61 76 65 64 57 68 65 72 65 54 72 61 63 65 3b 0a  avedWhereTrace;.
14100 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
14110 52 75 6e 20 61 20 70 72 65 70 61 72 65 64 20 73  Run a prepared s
14120 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74  tatement.*/.stat
14130 69 63 20 76 6f 69 64 20 65 78 65 63 5f 70 72 65  ic void exec_pre
14140 70 61 72 65 64 5f 73 74 6d 74 28 0a 20 20 53 68  pared_stmt(.  Sh
14150 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20  ellState *pArg, 
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 20 2f                 /
14180 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65  * Pointer to She
14190 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 73 71 6c  llState */.  sql
141a0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
141b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
141d0 20 53 74 61 74 6d 65 6e 74 20 74 6f 20 72 75 6e   Statment to run
141e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
141f0 0a 0a 20 20 2f 2a 20 70 65 72 66 6f 72 6d 20 74  ..  /* perform t
14200 68 65 20 66 69 72 73 74 20 73 74 65 70 2e 20 20  he first step.  
14210 74 68 69 73 20 77 69 6c 6c 20 74 65 6c 6c 20 75  this will tell u
14220 73 20 69 66 20 77 65 0a 20 20 2a 2a 20 68 61 76  s if we.  ** hav
14230 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 20 6f  e a result set o
14240 72 20 6e 6f 74 20 61 6e 64 20 68 6f 77 20 77 69  r not and how wi
14250 64 65 20 69 74 20 69 73 2e 0a 20 20 2a 2f 0a 20  de it is..  */. 
14260 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
14270 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a 20  ep(pStmt);.  /* 
14280 69 66 20 77 65 20 68 61 76 65 20 61 20 72 65 73  if we have a res
14290 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f 0a 20 20  ult set... */.  
142a0 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d  if( SQLITE_ROW =
142b0 3d 20 72 63 20 29 7b 0a 20 20 20 20 2f 2a 20 61  = rc ){.    /* a
142c0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
142d0 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74 72 2c 20  r col name ptr, 
142e0 76 61 6c 75 65 20 70 74 72 2c 20 61 6e 64 20 74  value ptr, and t
142f0 79 70 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ype */.    int n
14300 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
14310 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
14320 29 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  );.    void *pDa
14330 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ta = sqlite3_mal
14340 6c 6f 63 36 34 28 33 2a 6e 43 6f 6c 2a 73 69 7a  loc64(3*nCol*siz
14350 65 6f 66 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  eof(const char*)
14360 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21   + 1);.    if( !
14370 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 72  pData ){.      r
14380 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
14390 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
143a0 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 73     char **azCols
143b0 20 3d 20 28 63 68 61 72 20 2a 2a 29 70 44 61 74   = (char **)pDat
143c0 61 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73  a;      /* Names
143d0 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
143e0 6e 73 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  ns */.      char
143f0 20 2a 2a 61 7a 56 61 6c 73 20 3d 20 26 61 7a 43   **azVals = &azC
14400 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20 20 20 20  ols[nCol];      
14410 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a 2f 0a 20   /* Results */. 
14420 20 20 20 20 20 69 6e 74 20 2a 61 69 54 79 70 65       int *aiType
14430 73 20 3d 20 28 69 6e 74 20 2a 29 26 61 7a 56 61  s = (int *)&azVa
14440 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20 52 65 73  ls[nCol]; /* Res
14450 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a 20 20 20  ult types */.   
14460 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20 20     int i, x;.   
14470 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66     assert(sizeof
14480 28 69 6e 74 29 20 3c 3d 20 73 69 7a 65 6f 66 28  (int) <= sizeof(
14490 63 68 61 72 20 2a 29 29 3b 0a 20 20 20 20 20 20  char *));.      
144a0 2f 2a 20 73 61 76 65 20 6f 66 66 20 70 74 72 73  /* save off ptrs
144b0 20 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   to column names
144c0 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
144d0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
144e0 0a 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 73 5b  .        azCols[
144f0 69 5d 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  i] = (char *)sql
14500 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
14510 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
14520 20 20 7d 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20    }.      do{.  
14530 20 20 20 20 20 20 2f 2a 20 65 78 74 72 61 63 74        /* extract
14540 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 64 61   the data and da
14550 74 61 20 74 79 70 65 73 20 2a 2f 0a 20 20 20 20  ta types */.    
14560 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
14570 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
14580 20 20 20 20 20 61 69 54 79 70 65 73 5b 69 5d 20       aiTypes[i] 
14590 3d 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  = x = sqlite3_co
145a0 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c  lumn_type(pStmt,
145b0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   i);.          i
145c0 66 28 20 78 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  f( x==SQLITE_BLO
145d0 42 20 26 26 20 70 41 72 67 20 26 26 20 70 41 72  B && pArg && pAr
145e0 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 49  g->cMode==MODE_I
145f0 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 20 20 20  nsert ){.       
14600 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d       azVals[i] =
14610 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   "";.          }
14620 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
14630 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 28 63    azVals[i] = (c
14640 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
14650 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
14660 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  i);.          }.
14670 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 61            if( !a
14680 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28 61 69 54  zVals[i] && (aiT
14690 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49 54 45 5f  ypes[i]!=SQLITE_
146a0 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  NULL) ){.       
146b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
146c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
146d0 20 20 20 20 62 72 65 61 6b 3b 20 2f 2a 20 66 72      break; /* fr
146e0 6f 6d 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20  om for */.      
146f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
14700 2f 2a 20 65 6e 64 20 66 6f 72 20 2a 2f 0a 0a 20  /* end for */.. 
14710 20 20 20 20 20 20 20 2f 2a 20 69 66 20 64 61 74         /* if dat
14720 61 20 61 6e 64 20 74 79 70 65 73 20 65 78 74 72  a and types extr
14730 61 63 74 65 64 20 73 75 63 63 65 73 73 66 75 6c  acted successful
14740 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ly... */.       
14750 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20   if( SQLITE_ROW 
14760 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  == rc ){.       
14770 20 20 20 2f 2a 20 63 61 6c 6c 20 74 68 65 20 73     /* call the s
14780 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b  upplied callback
14790 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c 74   with the result
147a0 20 72 6f 77 20 64 61 74 61 20 2a 2f 0a 20 20 20   row data */.   
147b0 20 20 20 20 20 20 20 69 66 28 20 73 68 65 6c 6c         if( shell
147c0 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20  _callback(pArg, 
147d0 6e 43 6f 6c 2c 20 61 7a 56 61 6c 73 2c 20 61 7a  nCol, azVals, az
147e0 43 6f 6c 73 2c 20 61 69 54 79 70 65 73 29 20 29  Cols, aiTypes) )
147f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
14800 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b   = SQLITE_ABORT;
14810 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
14820 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
14830 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
14840 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
14850 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
14860 20 20 20 20 7d 20 77 68 69 6c 65 28 20 53 51 4c      } while( SQL
14870 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 3b  ITE_ROW == rc );
14880 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
14890 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20  ree(pData);.    
148a0 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
148b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
148c0 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
148d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
148e0 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
148f0 73 73 20 53 51 4c 20 69 66 20 74 68 65 20 70 72  ss SQL if the pr
14900 65 76 69 6f 75 73 20 73 68 65 6c 6c 20 63 6f 6d  evious shell com
14910 6d 61 6e 64 0a 2a 2a 20 77 61 73 20 22 2e 65 78  mand.** was ".ex
14920 70 65 72 74 22 2e 20 49 74 20 70 61 73 73 65 73  pert". It passes
14930 20 74 68 65 20 53 51 4c 20 69 6e 20 74 68 65 20   the SQL in the 
14940 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
14950 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 74  directly to.** t
14960 68 65 20 73 71 6c 69 74 65 33 65 78 70 65 72 74  he sqlite3expert
14970 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 49   object..**.** I
14980 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
14990 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
149a0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
149b0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a  an SQLite error.
149c0 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74 68 69 73  ** code. In this
149d0 20 63 61 73 65 2c 20 28 2a 70 7a 45 72 72 29 20   case, (*pzErr) 
149e0 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f  may be set to po
149f0 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
14a00 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e  containing.** an
14a10 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
14a20 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
14a30 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
14a40 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
14a50 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
14a60 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68  entually free th
14a70 69 73 20 62 75 66 66 65 72 20 75 73 69 6e 67 20  is buffer using 
14a80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
14a90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
14aa0 70 65 72 74 48 61 6e 64 6c 65 53 51 4c 28 0a 20  pertHandleSQL(. 
14ab0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74   ShellState *pSt
14ac0 61 74 65 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  ate, .  const ch
14ad0 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 63 68 61  ar *zSql, .  cha
14ae0 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 61  r **pzErr.){.  a
14af0 73 73 65 72 74 28 20 70 53 74 61 74 65 2d 3e 65  ssert( pState->e
14b00 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 29 3b  xpert.pExpert );
14b10 0a 20 20 61 73 73 65 72 74 28 20 70 7a 45 72 72  .  assert( pzErr
14b20 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30  ==0 || *pzErr==0
14b30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
14b40 69 74 65 33 5f 65 78 70 65 72 74 5f 73 71 6c 28  ite3_expert_sql(
14b50 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
14b60 45 78 70 65 72 74 2c 20 7a 53 71 6c 2c 20 70 7a  Expert, zSql, pz
14b70 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Err);.}../*.** T
14b80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
14b90 63 61 6c 6c 65 64 20 65 69 74 68 65 72 20 74 6f  called either to
14ba0 20 73 69 6c 65 6e 74 6c 79 20 63 6c 65 61 6e 20   silently clean 
14bb0 75 70 20 74 68 65 20 6f 62 6a 65 63 74 0a 2a 2a  up the object.**
14bc0 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
14bd0 22 2e 65 78 70 65 72 74 22 20 63 6f 6d 6d 61 6e  ".expert" comman
14be0 64 20 28 69 66 20 62 43 61 6e 63 65 6c 3d 3d 31  d (if bCancel==1
14bf0 29 2c 20 6f 72 20 74 6f 20 67 65 6e 65 72 61 74  ), or to generat
14c00 65 20 61 20 0a 2a 2a 20 72 65 70 6f 72 74 20 66  e a .** report f
14c10 72 6f 6d 20 69 74 20 61 6e 64 20 74 68 65 6e 20  rom it and then 
14c20 63 6c 65 61 6e 20 69 74 20 75 70 20 28 69 66 20  clean it up (if 
14c30 62 43 61 6e 63 65 6c 3d 3d 30 29 2e 0a 2a 2a 0a  bCancel==0)..**.
14c40 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
14c50 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
14c60 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
14c70 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
14c80 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20  ror.** code. In 
14c90 74 68 69 73 20 63 61 73 65 2c 20 28 2a 70 7a 45  this case, (*pzE
14ca0 72 72 29 20 6d 61 79 20 62 65 20 73 65 74 20 74  rr) may be set t
14cb0 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
14cc0 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  fer containing.*
14cd0 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e  * an English lan
14ce0 67 75 61 67 65 20 65 72 72 6f 72 20 6d 65 73 73  guage error mess
14cf0 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  age. It is the r
14d00 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
14d10 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74   the.** caller t
14d20 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  o eventually fre
14d30 65 20 74 68 69 73 20 62 75 66 66 65 72 20 75 73  e this buffer us
14d40 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
14d50 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
14d60 74 20 65 78 70 65 72 74 46 69 6e 69 73 68 28 0a  t expertFinish(.
14d70 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
14d80 74 61 74 65 2c 0a 20 20 69 6e 74 20 62 43 61 6e  tate,.  int bCan
14d90 63 65 6c 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  cel,.  char **pz
14da0 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  Err.){.  int rc 
14db0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
14dc0 71 6c 69 74 65 33 65 78 70 65 72 74 20 2a 70 20  qlite3expert *p 
14dd0 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74  = pState->expert
14de0 2e 70 45 78 70 65 72 74 3b 0a 20 20 61 73 73 65  .pExpert;.  asse
14df0 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72  rt( p );.  asser
14e00 74 28 20 62 43 61 6e 63 65 6c 20 7c 7c 20 70 7a  t( bCancel || pz
14e10 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72  Err==0 || *pzErr
14e20 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 62 43 61  ==0 );.  if( bCa
14e30 6e 63 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 46  ncel==0 ){.    F
14e40 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53 74 61 74  ILE *out = pStat
14e50 65 2d 3e 6f 75 74 3b 0a 20 20 20 20 69 6e 74 20  e->out;.    int 
14e60 62 56 65 72 62 6f 73 65 20 3d 20 70 53 74 61 74  bVerbose = pStat
14e70 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62 6f  e->expert.bVerbo
14e80 73 65 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  se;..    rc = sq
14e90 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 61 6e 61  lite3_expert_ana
14ea0 6c 79 7a 65 28 70 2c 20 70 7a 45 72 72 29 3b 0a  lyze(p, pzErr);.
14eb0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14ec0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
14ed0 6e 74 20 6e 51 75 65 72 79 20 3d 20 73 71 6c 69  nt nQuery = sqli
14ee0 74 65 33 5f 65 78 70 65 72 74 5f 63 6f 75 6e 74  te3_expert_count
14ef0 28 70 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  (p);.      int i
14f00 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 62 56 65  ;..      if( bVe
14f10 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20  rbose ){.       
14f20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61   const char *zCa
14f30 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  nd = sqlite3_exp
14f40 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 30 2c 45  ert_report(p,0,E
14f50 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 43 41 4e  XPERT_REPORT_CAN
14f60 44 49 44 41 54 45 53 29 3b 0a 20 20 20 20 20 20  DIDATES);.      
14f70 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
14f80 2c 20 22 2d 2d 20 43 61 6e 64 69 64 61 74 65 73  , "-- Candidates
14f90 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
14fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  --------------\n
14fb0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  ");.        raw_
14fc0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c  printf(out, "%s\
14fd0 6e 22 2c 20 7a 43 61 6e 64 29 3b 0a 20 20 20 20  n", zCand);.    
14fe0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
14ff0 30 3b 20 69 3c 6e 51 75 65 72 79 3b 20 69 2b 2b  0; i<nQuery; i++
15000 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
15010 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71   char *zSql = sq
15020 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70  lite3_expert_rep
15030 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45 52 54  ort(p, i, EXPERT
15040 5f 52 45 50 4f 52 54 5f 53 51 4c 29 3b 0a 20 20  _REPORT_SQL);.  
15050 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
15060 20 2a 7a 49 64 78 20 3d 20 73 71 6c 69 74 65 33   *zIdx = sqlite3
15070 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70  _expert_report(p
15080 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f  , i, EXPERT_REPO
15090 52 54 5f 49 4e 44 45 58 45 53 29 3b 0a 20 20 20  RT_INDEXES);.   
150a0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
150b0 2a 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33 5f  *zEQP = sqlite3_
150c0 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c  expert_report(p,
150d0 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f 52   i, EXPERT_REPOR
150e0 54 5f 50 4c 41 4e 29 3b 0a 20 20 20 20 20 20 20  T_PLAN);.       
150f0 20 69 66 28 20 7a 49 64 78 3d 3d 30 20 29 20 7a   if( zIdx==0 ) z
15100 49 64 78 20 3d 20 22 28 6e 6f 20 6e 65 77 20 69  Idx = "(no new i
15110 6e 64 65 78 65 73 29 5c 6e 22 3b 0a 20 20 20 20  ndexes)\n";.    
15120 20 20 20 20 69 66 28 20 62 56 65 72 62 6f 73 65      if( bVerbose
15130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61   ){.          ra
15140 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d  w_printf(out, "-
15150 2d 20 51 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d  - Query %d -----
15160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 69  -----------\n",i
15180 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  +1);.          r
15190 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
151a0 25 73 5c 6e 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a  %s\n\n", zSql);.
151b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
151c0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
151d0 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 64 78 29 3b  , "%s\n", zIdx);
151e0 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
151f0 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  ntf(out, "%s\n",
15200 20 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 7d 0a   zEQP);.      }.
15210 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
15220 74 65 33 5f 65 78 70 65 72 74 5f 64 65 73 74 72  te3_expert_destr
15230 6f 79 28 70 29 3b 0a 20 20 70 53 74 61 74 65 2d  oy(p);.  pState-
15240 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20  >expert.pExpert 
15250 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
15260 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
15270 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 65  mentation of ".e
15280 78 70 65 72 74 22 20 64 6f 74 20 63 6f 6d 6d 61  xpert" dot comma
15290 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
152a0 74 20 65 78 70 65 72 74 44 6f 74 43 6f 6d 6d 61  t expertDotComma
152b0 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  nd(.  ShellState
152c0 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20 20   *pState,       
152d0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
152e0 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74   shell tool stat
152f0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  e */.  char **az
15300 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
15310 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
15320 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  of arguments pas
15330 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61  sed to dot comma
15340 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  nd */.  int nArg
15350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15360 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15370 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
15380 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20  azArg[] */.){.  
15390 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
153a0 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  OK;.  char *zErr
153b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
153c0 20 69 6e 74 20 69 53 61 6d 70 6c 65 20 3d 20 30   int iSample = 0
153d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 74  ;..  assert( pSt
153e0 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70  ate->expert.pExp
153f0 65 72 74 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73  ert==0 );.  mems
15400 65 74 28 26 70 53 74 61 74 65 2d 3e 65 78 70 65  et(&pState->expe
15410 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  rt, 0, sizeof(Ex
15420 70 65 72 74 49 6e 66 6f 29 29 3b 0a 0a 20 20 66  pertInfo));..  f
15430 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49  or(i=1; rc==SQLI
15440 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41 72 67 3b  TE_OK && i<nArg;
15450 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
15460 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20  *z = azArg[i];. 
15470 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66     int n;.    if
15480 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a  ( z[0]=='-' && z
15490 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a  [1]=='-' ) z++;.
154a0 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30      n = strlen30
154b0 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d  (z);.    if( n>=
154c0 32 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28  2 && 0==strncmp(
154d0 7a 2c 20 22 2d 76 65 72 62 6f 73 65 22 2c 20 6e  z, "-verbose", n
154e0 29 20 29 7b 0a 20 20 20 20 20 20 70 53 74 61 74  ) ){.      pStat
154f0 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62 6f  e->expert.bVerbo
15500 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  se = 1;.    }.  
15510 20 20 65 6c 73 65 20 69 66 28 20 6e 3e 3d 32 20    else if( n>=2 
15520 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28 7a 2c  && 0==strncmp(z,
15530 20 22 2d 73 61 6d 70 6c 65 22 2c 20 6e 29 20 29   "-sample", n) )
15540 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 28  {.      if( i==(
15550 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20  nArg-1) ){.     
15560 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
15570 64 65 72 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65  derr, "option re
15580 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65  quires an argume
15590 6e 74 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  nt: %s\n", z);. 
155a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
155b0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
155c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
155d0 53 61 6d 70 6c 65 20 3d 20 28 69 6e 74 29 69 6e  Sample = (int)in
155e0 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
155f0 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  [++i]);.        
15600 69 66 28 20 69 53 61 6d 70 6c 65 3c 30 20 7c 7c  if( iSample<0 ||
15610 20 69 53 61 6d 70 6c 65 3e 31 30 30 20 29 7b 0a   iSample>100 ){.
15620 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
15630 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 76 61  intf(stderr, "va
15640 6c 75 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  lue out of range
15650 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 69  : %s\n", azArg[i
15660 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ]);.          rc
15670 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
15680 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15690 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73   }.    }.    els
156a0 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
156b0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b  ntf(stderr, "unk
156c0 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c  nown option: %s\
156d0 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 63  n", z);.      rc
156e0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
156f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
15700 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15710 29 7b 0a 20 20 20 20 70 53 74 61 74 65 2d 3e 65  ){.    pState->e
15720 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 3d 20  xpert.pExpert = 
15730 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 6e  sqlite3_expert_n
15740 65 77 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26  ew(pState->db, &
15750 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 70  zErr);.    if( p
15760 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45  State->expert.pE
15770 78 70 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  xpert==0 ){.    
15780 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
15790 65 72 72 2c 20 22 73 71 6c 69 74 65 33 5f 65 78  err, "sqlite3_ex
157a0 70 65 72 74 5f 6e 65 77 3a 20 25 73 5c 6e 22 2c  pert_new: %s\n",
157b0 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 72 63   zErr);.      rc
157c0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
157d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
157e0 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74    sqlite3_expert
157f0 5f 63 6f 6e 66 69 67 28 0a 20 20 20 20 20 20 20  _config(.       
15800 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72     pState->exper
15810 74 2e 70 45 78 70 65 72 74 2c 20 45 58 50 45 52  t.pExpert, EXPER
15820 54 5f 43 4f 4e 46 49 47 5f 53 41 4d 50 4c 45 2c  T_CONFIG_SAMPLE,
15830 20 69 53 61 6d 70 6c 65 0a 20 20 20 20 20 20 29   iSample.      )
15840 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
15850 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
15860 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  if /* ifndef SQL
15870 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
15880 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
15890 45 78 65 63 75 74 65 20 61 20 73 74 61 74 65 6d  Execute a statem
158a0 65 6e 74 20 6f 72 20 73 65 74 20 6f 66 20 73 74  ent or set of st
158b0 61 74 65 6d 65 6e 74 73 2e 20 20 50 72 69 6e 74  atements.  Print
158c0 0a 2a 2a 20 61 6e 79 20 72 65 73 75 6c 74 20 72  .** any result r
158d0 6f 77 73 2f 63 6f 6c 75 6d 6e 73 20 64 65 70 65  ows/columns depe
158e0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 63 75 72  nding on the cur
158f0 72 65 6e 74 20 6d 6f 64 65 0a 2a 2a 20 73 65 74  rent mode.** set
15900 20 76 69 61 20 74 68 65 20 73 75 70 70 6c 69 65   via the supplie
15910 64 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  d callback..**.*
15920 2a 20 54 68 69 73 20 69 73 20 76 65 72 79 20 73  * This is very s
15930 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c 69 74 65  imilar to SQLite
15940 27 73 20 62 75 69 6c 74 2d 69 6e 20 73 71 6c 69  's built-in sqli
15950 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66 75  te3_exec().** fu
15960 6e 63 74 69 6f 6e 20 65 78 63 65 70 74 20 69 74  nction except it
15970 20 74 61 6b 65 73 20 61 20 73 6c 69 67 68 74 6c   takes a slightl
15980 79 20 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c  y different call
15990 62 61 63 6b 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c  back.** and call
159a0 62 61 63 6b 20 64 61 74 61 20 61 72 67 75 6d 65  back data argume
159b0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
159c0 74 20 73 68 65 6c 6c 5f 65 78 65 63 28 0a 20 20  t shell_exec(.  
159d0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67  ShellState *pArg
159e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
159f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
15a00 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61  nter to ShellSta
15a10 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  te */.  const ch
15a20 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20  ar *zSql,       
15a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a40 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20 65    /* SQL to be e
15a50 76 61 6c 75 61 74 65 64 20 2a 2f 0a 20 20 63 68  valuated */.  ch
15a60 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20  ar **pzErrMsg   
15a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a80 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
15a90 20 6d 73 67 20 77 72 69 74 74 65 6e 20 68 65 72   msg written her
15aa0 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
15ab0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
15ac0 4e 55 4c 4c 3b 20 20 20 20 20 2f 2a 20 53 74 61  NULL;     /* Sta
15ad0 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74  tement to execut
15ae0 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  e. */.  int rc =
15af0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
15b00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
15b10 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
15b20 72 63 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rc2;.  const cha
15b30 72 20 2a 7a 4c 65 66 74 6f 76 65 72 3b 20 20 20  r *zLeftover;   
15b40 20 20 20 20 20 20 20 2f 2a 20 54 61 69 6c 20 6f         /* Tail o
15b50 66 20 75 6e 70 72 6f 63 65 73 73 65 64 20 53 51  f unprocessed SQ
15b60 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  L */.  sqlite3 *
15b70 64 62 20 3d 20 70 41 72 67 2d 3e 64 62 3b 0a 0a  db = pArg->db;..
15b80 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29    if( pzErrMsg )
15b90 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20  {.    *pzErrMsg 
15ba0 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 23 69 66  = NULL;.  }..#if
15bb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15bc0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
15bd0 69 66 28 20 70 41 72 67 2d 3e 65 78 70 65 72 74  if( pArg->expert
15be0 2e 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20 20  .pExpert ){.    
15bf0 72 63 20 3d 20 65 78 70 65 72 74 48 61 6e 64 6c  rc = expertHandl
15c00 65 53 51 4c 28 70 41 72 67 2c 20 7a 53 71 6c 2c  eSQL(pArg, zSql,
15c10 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   pzErrMsg);.    
15c20 72 65 74 75 72 6e 20 65 78 70 65 72 74 46 69 6e  return expertFin
15c30 69 73 68 28 70 41 72 67 2c 20 28 72 63 21 3d 53  ish(pArg, (rc!=S
15c40 51 4c 49 54 45 5f 4f 4b 29 2c 20 70 7a 45 72 72  QLITE_OK), pzErr
15c50 4d 73 67 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Msg);.  }.#endif
15c60 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c 5b  ..  while( zSql[
15c70 30 5d 20 26 26 20 28 53 51 4c 49 54 45 5f 4f 4b  0] && (SQLITE_OK
15c80 20 3d 3d 20 72 63 29 20 29 7b 0a 20 20 20 20 73   == rc) ){.    s
15c90 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
15ca0 20 2a 7a 53 74 6d 74 53 71 6c 3b 0a 20 20 20 20   *zStmtSql;.    
15cb0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
15cc0 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
15cd0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a  , -1, &pStmt, &z
15ce0 4c 65 66 74 6f 76 65 72 29 3b 0a 20 20 20 20 69  Leftover);.    i
15cf0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 20 21 3d 20  f( SQLITE_OK != 
15d00 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rc ){.      if( 
15d10 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  pzErrMsg ){.    
15d20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
15d30 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62 29  save_err_msg(db)
15d40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
15d50 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
15d60 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
15d70 20 2f 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73   /* this happens
15d80 20 66 6f 72 20 61 20 63 6f 6d 6d 65 6e 74 20 6f   for a comment o
15d90 72 20 77 68 69 74 65 2d 73 70 61 63 65 20 2a 2f  r white-space */
15da0 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  .        zSql = 
15db0 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20 20  zLeftover;.     
15dc0 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63     while( IsSpac
15dd0 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71  e(zSql[0]) ) zSq
15de0 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  l++;.        con
15df0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
15e00 20 20 20 20 20 7a 53 74 6d 74 53 71 6c 20 3d 20       zStmtSql = 
15e10 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d  sqlite3_sql(pStm
15e20 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53  t);.      if( zS
15e30 74 6d 74 53 71 6c 3d 3d 30 20 29 20 7a 53 74 6d  tmtSql==0 ) zStm
15e40 74 53 71 6c 20 3d 20 22 22 3b 0a 20 20 20 20 20  tSql = "";.     
15e50 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28   while( IsSpace(
15e60 7a 53 74 6d 74 53 71 6c 5b 30 5d 29 20 29 20 7a  zStmtSql[0]) ) z
15e70 53 74 6d 74 53 71 6c 2b 2b 3b 0a 0a 20 20 20 20  StmtSql++;..    
15e80 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 74 68    /* save off th
15e90 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 6d  e prepared statm
15ea0 65 6e 74 20 68 61 6e 64 6c 65 20 61 6e 64 20 72  ent handle and r
15eb0 65 73 65 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a  eset row count *
15ec0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67  /.      if( pArg
15ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67   ){.        pArg
15ee0 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b  ->pStmt = pStmt;
15ef0 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63  .        pArg->c
15f00 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  nt = 0;.      }.
15f10 0a 20 20 20 20 20 20 2f 2a 20 65 63 68 6f 20 74  .      /* echo t
15f20 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74  he sql statement
15f30 20 69 66 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a 20   if echo on */. 
15f40 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26       if( pArg &&
15f50 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 41   ShellHasFlag(pA
15f60 72 67 2c 20 53 48 46 4c 47 5f 45 63 68 6f 29 20  rg, SHFLG_Echo) 
15f70 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
15f80 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
15f90 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 74 6d 74 53  , "%s\n", zStmtS
15fa0 71 6c 20 3f 20 7a 53 74 6d 74 53 71 6c 20 3a 20  ql ? zStmtSql : 
15fb0 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  zSql);.      }..
15fc0 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 74 68        /* Show th
15fd0 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  e EXPLAIN QUERY 
15fe0 50 4c 41 4e 20 69 66 20 2e 65 71 70 20 69 73 20  PLAN if .eqp is 
15ff0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  on */.      if( 
16000 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 61 75  pArg && pArg->au
16010 74 6f 45 51 50 20 26 26 20 73 71 6c 69 74 65 33  toEQP && sqlite3
16020 5f 73 74 72 6c 69 6b 65 28 22 45 58 50 4c 41 49  _strlike("EXPLAI
16030 4e 25 22 2c 7a 53 74 6d 74 53 71 6c 2c 30 29 21  N%",zStmtSql,0)!
16040 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
16050 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70  lite3_stmt *pExp
16060 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 63 68  lain;.        ch
16070 61 72 20 2a 7a 45 51 50 3b 0a 20 20 20 20 20 20  ar *zEQP;.      
16080 20 20 69 6e 74 20 74 72 69 67 67 65 72 45 51 50    int triggerEQP
16090 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 64 69   = 0;.        di
160a0 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63  sable_debug_trac
160b0 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20  e_modes();.     
160c0 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f     sqlite3_db_co
160d0 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  nfig(db, SQLITE_
160e0 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52  DBCONFIG_TRIGGER
160f0 5f 45 51 50 2c 20 2d 31 2c 20 26 74 72 69 67 67  _EQP, -1, &trigg
16100 65 72 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20  erEQP);.        
16110 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51  if( pArg->autoEQ
16120 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67  P>=AUTOEQP_trigg
16130 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
16140 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
16150 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43  g(db, SQLITE_DBC
16160 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51  ONFIG_TRIGGER_EQ
16170 50 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  P, 1, 0);.      
16180 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 45 51 50    }.        zEQP
16190 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
161a0 74 66 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52  tf("EXPLAIN QUER
161b0 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53 74 6d  Y PLAN %s", zStm
161c0 74 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72  tSql);.        r
161d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
161e0 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c  are_v2(db, zEQP,
161f0 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20   -1, &pExplain, 
16200 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
16210 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16220 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
16230 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
16240 45 78 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45  Explain)==SQLITE
16250 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
16260 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
16270 7a 45 51 50 4c 69 6e 65 20 3d 20 28 63 6f 6e 73  zEQPLine = (cons
16280 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
16290 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70  column_text(pExp
162a0 6c 61 69 6e 2c 33 29 3b 0a 20 20 20 20 20 20 20  lain,3);.       
162b0 20 20 20 20 20 69 6e 74 20 69 45 71 70 49 64 20       int iEqpId 
162c0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
162d0 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30  _int(pExplain, 0
162e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
162f0 6e 74 20 69 50 61 72 65 6e 74 49 64 20 3d 20 73  nt iParentId = s
16300 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
16310 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a  t(pExplain, 1);.
16320 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
16330 7a 45 51 50 4c 69 6e 65 5b 30 5d 3d 3d 27 2d 27  zEQPLine[0]=='-'
16340 20 29 20 65 71 70 5f 72 65 6e 64 65 72 28 70 41   ) eqp_render(pA
16350 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rg);.           
16360 20 65 71 70 5f 61 70 70 65 6e 64 28 70 41 72 67   eqp_append(pArg
16370 2c 20 69 45 71 70 49 64 2c 20 69 50 61 72 65 6e  , iEqpId, iParen
16380 74 49 64 2c 20 7a 45 51 50 4c 69 6e 65 29 3b 0a  tId, zEQPLine);.
16390 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
163a0 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72        eqp_render
163b0 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20  (pArg);.        
163c0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
163d0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c  3_finalize(pExpl
163e0 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ain);.        sq
163f0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 51 50 29  lite3_free(zEQP)
16400 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  ;.        if( pA
16410 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54  rg->autoEQP>=AUT
16420 4f 45 51 50 5f 66 75 6c 6c 20 29 7b 0a 20 20 20  OEQP_full ){.   
16430 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 64         /* Also d
16440 6f 20 61 6e 20 45 58 50 4c 41 49 4e 20 66 6f 72  o an EXPLAIN for
16450 20 22 2e 65 71 70 20 66 75 6c 6c 22 20 6d 6f 64   ".eqp full" mod
16460 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a  e */.          z
16470 45 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  EQP = sqlite3_mp
16480 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 25  rintf("EXPLAIN %
16490 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20  s", zStmtSql);. 
164a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
164b0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
164c0 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26  (db, zEQP, -1, &
164d0 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
164e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
164f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16500 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63           pArg->c
16510 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c  Mode = MODE_Expl
16520 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ain;.           
16530 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72   explain_data_pr
16540 65 70 61 72 65 28 70 41 72 67 2c 20 70 45 78 70  epare(pArg, pExp
16550 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  lain);.         
16560 20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64     exec_prepared
16570 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 45 78 70  _stmt(pArg, pExp
16580 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  lain);.         
16590 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f     explain_data_
165a0 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a 20 20  delete(pArg);.  
165b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
165c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
165d0 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a  lize(pExplain);.
165e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
165f0 33 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20  3_free(zEQP);.  
16600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16610 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51  if( pArg->autoEQ
16620 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67  P>=AUTOEQP_trigg
16630 65 72 20 26 26 20 74 72 69 67 67 65 72 45 51 50  er && triggerEQP
16640 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
16650 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
16660 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  ig(db, SQLITE_DB
16670 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45  CONFIG_TRIGGER_E
16680 51 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  QP, 0, 0);.     
16690 20 20 20 20 20 2f 2a 20 52 65 70 72 65 70 61 72       /* Reprepar
166a0 65 20 70 53 74 6d 74 20 62 65 66 6f 72 65 20 72  e pStmt before r
166b0 65 61 63 74 69 76 69 6e 67 20 74 72 61 63 65 20  eactiving trace 
166c0 6d 6f 64 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  modes */.       
166d0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
166e0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
166f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
16700 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
16710 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
16720 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
16730 20 70 41 72 67 20 29 20 70 41 72 67 2d 3e 70 53   pArg ) pArg->pS
16740 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20  tmt = pStmt;.   
16750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
16760 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61  estore_debug_tra
16770 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20  ce_modes();.    
16780 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
16790 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Arg ){.        p
167a0 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 70 41 72  Arg->cMode = pAr
167b0 67 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  g->mode;.       
167c0 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45   if( pArg->autoE
167d0 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20  xplain ){.      
167e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
167f0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
16800 6d 74 29 3d 3d 38 0a 20 20 20 20 20 20 20 20 20  mt)==8.         
16810 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72    && sqlite3_str
16820 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e 25 22 2c  like("EXPLAIN%",
16830 20 7a 53 74 6d 74 53 71 6c 2c 30 29 3d 3d 30 0a   zStmtSql,0)==0.
16840 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
16850 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63           pArg->c
16860 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c  Mode = MODE_Expl
16870 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ain;.          }
16880 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
16890 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
168a0 75 6e 74 28 70 53 74 6d 74 29 3d 3d 34 0a 20 20  unt(pStmt)==4.  
168b0 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
168c0 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 45 58 50  te3_strlike("EXP
168d0 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 25  LAIN QUERY PLAN%
168e0 22 2c 20 7a 53 74 6d 74 53 71 6c 2c 30 29 3d 3d  ", zStmtSql,0)==
168f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
16900 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d   pArg->cMode = M
16910 4f 44 45 5f 45 51 50 3b 0a 20 20 20 20 20 20 20  ODE_EQP;.       
16920 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
16930 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
16940 65 20 73 68 65 6c 6c 20 69 73 20 63 75 72 72 65  e shell is curre
16950 6e 74 6c 79 20 69 6e 20 22 2e 65 78 70 6c 61 69  ntly in ".explai
16960 6e 22 20 6d 6f 64 65 2c 20 67 61 74 68 65 72 20  n" mode, gather 
16970 74 68 65 20 65 78 74 72 61 0a 20 20 20 20 20 20  the extra.      
16980 20 20 2a 2a 20 64 61 74 61 20 72 65 71 75 69 72    ** data requir
16990 65 64 20 74 6f 20 61 64 64 20 69 6e 64 65 6e 74  ed to add indent
169a0 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  s to the output.
169b0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
169c0 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45  Arg->cMode==MODE
169d0 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  _Explain ){.    
169e0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61        explain_da
169f0 74 61 5f 70 72 65 70 61 72 65 28 70 41 72 67 2c  ta_prepare(pArg,
16a00 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20   pStmt);.       
16a10 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
16a20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f    exec_prepared_
16a30 73 74 6d 74 28 70 41 72 67 2c 20 70 53 74 6d 74  stmt(pArg, pStmt
16a40 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
16a50 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70 41 72  _data_delete(pAr
16a60 67 29 3b 0a 20 20 20 20 20 20 65 71 70 5f 72 65  g);.      eqp_re
16a70 6e 64 65 72 28 70 41 72 67 29 3b 0a 0a 20 20 20  nder(pArg);..   
16a80 20 20 20 2f 2a 20 70 72 69 6e 74 20 75 73 61 67     /* print usag
16a90 65 20 73 74 61 74 73 20 69 66 20 73 74 61 74 73  e stats if stats
16aa0 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28   on */.      if(
16ab0 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73   pArg && pArg->s
16ac0 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20 20  tatsOn ){.      
16ad0 20 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73 28    display_stats(
16ae0 64 62 2c 20 70 41 72 67 2c 20 30 29 3b 0a 20 20  db, pArg, 0);.  
16af0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
16b00 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f 75 6e 74  print loop-count
16b10 65 72 73 20 69 66 20 72 65 71 75 69 72 65 64 20  ers if required 
16b20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
16b30 67 20 26 26 20 70 41 72 67 2d 3e 73 63 61 6e 73  g && pArg->scans
16b40 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20 20  tatsOn ){.      
16b50 20 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73 74    display_scanst
16b60 61 74 73 28 64 62 2c 20 70 41 72 67 29 3b 0a 20  ats(db, pArg);. 
16b70 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
16b80 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 73 74   Finalize the st
16b90 61 74 65 6d 65 6e 74 20 6a 75 73 74 20 65 78 65  atement just exe
16ba0 63 75 74 65 64 2e 20 49 66 20 74 68 69 73 20 66  cuted. If this f
16bb0 61 69 6c 73 2c 20 73 61 76 65 20 61 0a 20 20 20  ails, save a.   
16bc0 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68     ** copy of th
16bd0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
16be0 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
16bf0 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74 20 74 6f  zSql to point to
16c00 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65   the.      ** ne
16c10 78 74 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  xt statement to 
16c20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20 20 20  execute. */.    
16c30 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
16c40 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
16c50 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
16c60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 72 63  QLITE_NOMEM ) rc
16c70 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 69 66   = rc2;.      if
16c80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16c90 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20  ){.        zSql 
16ca0 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20  = zLeftover;.   
16cb0 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70       while( IsSp
16cc0 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a  ace(zSql[0]) ) z
16cd0 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  Sql++;.      }el
16ce0 73 65 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20  se if( pzErrMsg 
16cf0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  ){.        *pzEr
16d00 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72 5f  rMsg = save_err_
16d10 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  msg(db);.      }
16d20 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c 65 61 72  ..      /* clear
16d30 20 73 61 76 65 64 20 73 74 6d 74 20 68 61 6e 64   saved stmt hand
16d40 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  le */.      if( 
16d50 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  pArg ){.        
16d60 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 4e 55  pArg->pStmt = NU
16d70 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LL;.      }.    
16d80 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20 77 68 69  }.  } /* end whi
16d90 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20  le */..  return 
16da0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
16db0 65 61 73 65 20 6d 65 6d 6f 72 79 20 70 72 65 76  ease memory prev
16dc0 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
16dd0 20 62 79 20 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c   by tableColumnL
16de0 69 73 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ist()..*/.static
16df0 20 76 6f 69 64 20 66 72 65 65 43 6f 6c 75 6d 6e   void freeColumn
16e00 4c 69 73 74 28 63 68 61 72 20 2a 2a 61 7a 43 6f  List(char **azCo
16e10 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
16e20 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d  or(i=1; azCol[i]
16e30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
16e40 74 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c 5b 69  te3_free(azCol[i
16e50 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 61 7a 43  ]);.  }.  /* azC
16e60 6f 6c 5b 30 5d 20 69 73 20 61 20 73 74 61 74 69  ol[0] is a stati
16e70 63 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 73 71  c string */.  sq
16e80 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c  lite3_free(azCol
16e90 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
16ea0 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 6f 69  rn a list of poi
16eb0 6e 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67 73  nters to strings
16ec0 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20 6e   which are the n
16ed0 61 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a 2a 20 63  ames of all.** c
16ee0 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20  olumns in table 
16ef0 7a 54 61 62 2e 20 20 20 54 68 65 20 6d 65 6d 6f  zTab.   The memo
16f00 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  ry to hold the n
16f10 61 6d 65 73 20 69 73 20 64 79 6e 61 6d 69 63 61  ames is dynamica
16f20 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  lly.** allocated
16f30 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 65 6c   and must be rel
16f40 65 61 73 65 64 20 62 79 20 74 68 65 20 63 61 6c  eased by the cal
16f50 6c 65 72 20 75 73 69 6e 67 20 61 20 73 75 62 73  ler using a subs
16f60 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74  equent call.** t
16f70 6f 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74  o freeColumnList
16f80 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 7a  ()..**.** The az
16f90 43 6f 6c 5b 30 5d 20 65 6e 74 72 79 20 69 73 20  Col[0] entry is 
16fa0 75 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 48  usually NULL.  H
16fb0 6f 77 65 76 65 72 2c 20 69 66 20 7a 54 61 62 20  owever, if zTab 
16fc0 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77 69 64  contains a rowid
16fd0 0a 2a 2a 20 76 61 6c 75 65 20 74 68 61 74 20 6e  .** value that n
16fe0 65 65 64 73 20 74 6f 20 62 65 20 70 72 65 73 65  eeds to be prese
16ff0 72 76 65 64 2c 20 74 68 65 6e 20 61 7a 43 6f 6c  rved, then azCol
17000 5b 30 5d 20 69 73 20 66 69 6c 6c 65 64 20 69 6e  [0] is filled in
17010 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6e 61 6d   with the.** nam
17020 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 63  e of the rowid c
17030 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  olumn..**.** The
17040 20 66 69 72 73 74 20 72 65 67 75 6c 61 72 20 63   first regular c
17050 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62  olumn in the tab
17060 6c 65 20 69 73 20 61 7a 43 6f 6c 5b 31 5d 2e 20  le is azCol[1]. 
17070 20 54 68 65 20 6c 69 73 74 20 69 73 20 74 65 72   The list is ter
17080 6d 69 6e 61 74 65 64 0a 2a 2a 20 62 79 20 61 6e  minated.** by an
17090 20 65 6e 74 72 79 20 77 69 74 68 20 61 7a 43 6f   entry with azCo
170a0 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74  l[i]==0..*/.stat
170b0 69 63 20 63 68 61 72 20 2a 2a 74 61 62 6c 65 43  ic char **tableC
170c0 6f 6c 75 6d 6e 4c 69 73 74 28 53 68 65 6c 6c 53  olumnList(ShellS
170d0 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tate *p, const c
170e0 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20 63 68  har *zTab){.  ch
170f0 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20 30 3b 0a  ar **azCol = 0;.
17100 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
17110 70 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  pStmt;.  char *z
17120 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  Sql;.  int nCol 
17130 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f  = 0;.  int nAllo
17140 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 4b  c = 0;.  int nPK
17150 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
17160 75 6d 62 65 72 20 6f 66 20 50 52 49 4d 41 52 59  umber of PRIMARY
17170 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 73 65 65   KEY columns see
17180 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 50 4b  n */.  int isIPK
17190 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75   = 0;     /* Tru
171a0 65 20 69 66 20 6f 6e 65 20 50 52 49 4d 41 52 59  e if one PRIMARY
171b0 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   KEY column of t
171c0 79 70 65 20 49 4e 54 45 47 45 52 20 2a 2f 0a 20  ype INTEGER */. 
171d0 20 69 6e 74 20 70 72 65 73 65 72 76 65 52 6f 77   int preserveRow
171e0 69 64 20 3d 20 53 68 65 6c 6c 48 61 73 46 6c 61  id = ShellHasFla
171f0 67 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73 65  g(p, SHFLG_Prese
17200 72 76 65 52 6f 77 69 64 29 3b 0a 20 20 69 6e 74  rveRowid);.  int
17210 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73   rc;..  zSql = s
17220 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
17230 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66  PRAGMA table_inf
17240 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b 0a 20 20  o=%Q", zTab);.  
17250 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
17260 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
17270 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
17280 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
17290 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28  ree(zSql);.  if(
172a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   rc ) return 0;.
172b0 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
172c0 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
172d0 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
172e0 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c 6c 6f 63  if( nCol>=nAlloc
172f0 2d 32 20 29 7b 0a 20 20 20 20 20 20 6e 41 6c 6c  -2 ){.      nAll
17300 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32 20 2b 20  oc = nAlloc*2 + 
17310 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20 20 20 20 20  nCol + 10;.     
17320 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33   azCol = sqlite3
17330 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f 6c 2c 20  _realloc(azCol, 
17340 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 61 7a  nAlloc*sizeof(az
17350 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  Col[0]));.      
17360 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 73  if( azCol==0 ) s
17370 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
17380 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ry();.    }.    
17390 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d 20 3d 20  azCol[++nCol] = 
173a0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
173b0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f  "%s", sqlite3_co
173c0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
173d0 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 73 71   1));.    if( sq
173e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
173f0 28 70 53 74 6d 74 2c 20 35 29 20 29 7b 0a 20 20  (pStmt, 5) ){.  
17400 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20 20 20 20      nPK++;.     
17410 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20 20 20 20   if( nPK==1.    
17420 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74     && sqlite3_st
17430 72 69 63 6d 70 28 28 63 6f 6e 73 74 20 63 68 61  ricmp((const cha
17440 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
17450 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29 2c  n_text(pStmt,2),
17460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17470 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 54 45             "INTE
17480 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 29  GER")==0.      )
17490 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50 4b 20  {.        isIPK 
174a0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
174b0 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50 4b 20  {.        isIPK 
174c0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
174d0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
174e0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
174f0 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30  ;.  if( azCol==0
17500 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
17510 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 61  zCol[0] = 0;.  a
17520 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20 3d 20 30  zCol[nCol+1] = 0
17530 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 63 69  ;..  /* The deci
17540 73 69 6f 6e 20 6f 66 20 77 68 65 74 68 65 72 20  sion of whether 
17550 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69 64 20 72  or not a rowid r
17560 65 61 6c 6c 79 20 6e 65 65 64 73 20 74 6f 20 62  eally needs to b
17570 65 20 70 72 65 73 65 72 76 65 64 0a 20 20 2a 2a  e preserved.  **
17580 20 69 73 20 74 72 69 63 6b 79 2e 20 20 57 65 20   is tricky.  We 
17590 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 70 72  never need to pr
175a0 65 73 65 72 76 65 20 61 20 72 6f 77 69 64 20 66  eserve a rowid f
175b0 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  or a WITHOUT ROW
175c0 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 72  ID table.  ** or
175d0 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 61 6e   a table with an
175e0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
175f0 20 4b 45 59 2e 20 20 57 65 20 61 72 65 20 75 6e   KEY.  We are un
17600 61 62 6c 65 20 74 6f 20 70 72 65 73 65 72 76 65  able to preserve
17610 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20 6f 6e 20  .  ** rowids on 
17620 74 61 62 6c 65 73 20 77 68 65 72 65 20 74 68 65  tables where the
17630 20 72 6f 77 69 64 20 69 73 20 69 6e 61 63 63 65   rowid is inacce
17640 73 73 69 62 6c 65 20 62 65 63 61 75 73 65 20 74  ssible because t
17650 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 0a 20  here are other. 
17660 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   ** columns in t
17670 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22  he table named "
17680 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69 64 5f  rowid", "_rowid_
17690 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e 0a 20 20  ", and "oid"..  
176a0 2a 2f 0a 20 20 69 66 28 20 70 72 65 73 65 72 76  */.  if( preserv
176b0 65 52 6f 77 69 64 20 26 26 20 69 73 49 50 4b 20  eRowid && isIPK 
176c0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 73  ){.    /* If a s
176d0 69 6e 67 6c 65 20 50 52 49 4d 41 52 59 20 4b 45  ingle PRIMARY KE
176e0 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 74 79  Y column with ty
176f0 70 65 20 49 4e 54 45 47 45 52 20 77 61 73 20 73  pe INTEGER was s
17700 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a 20 20 20  een, then it.   
17710 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 61 6e 20   ** might be an 
17720 61 6c 69 73 65 20 66 6f 72 20 74 68 65 20 52 4f  alise for the RO
17730 57 49 44 2e 20 20 42 75 74 20 69 74 20 6d 69 67  WID.  But it mig
17740 68 74 20 61 6c 73 6f 20 62 65 20 61 20 57 49 54  ht also be a WIT
17750 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 20 20 2a  HOUT ROWID.    *
17760 2a 20 74 61 62 6c 65 20 6f 72 20 61 20 49 4e 54  * table or a INT
17770 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
17780 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c 20 6e 65   DESC column, ne
17790 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 61  ither of which a
177a0 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57 49 44 20  re.    ** ROWID 
177b0 61 6c 69 61 73 65 73 2e 20 20 54 6f 20 64 69 73  aliases.  To dis
177c0 74 69 6e 67 75 69 73 68 20 74 68 65 73 65 20 63  tinguish these c
177d0 61 73 65 73 2c 20 63 68 65 63 6b 20 74 6f 20 73  ases, check to s
177e0 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65  ee if.    ** the
177f0 72 65 20 69 73 20 61 20 22 70 6b 22 20 65 6e 74  re is a "pk" ent
17800 72 79 20 69 6e 20 22 50 52 41 47 4d 41 20 69 6e  ry in "PRAGMA in
17810 64 65 78 5f 6c 69 73 74 22 2e 20 20 54 68 65 72  dex_list".  Ther
17820 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a  e will be.    **
17830 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65 78 20 69   no "pk" index i
17840 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
17850 59 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 61  Y really is an a
17860 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52 4f 57  lias for the ROW
17870 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a  ID..    */.    z
17880 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
17890 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 31 20  rintf("SELECT 1 
178a0 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69 6e 64 65  FROM pragma_inde
178b0 78 5f 6c 69 73 74 28 25 51 29 22 0a 20 20 20 20  x_list(%Q)".    
178c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178d0 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6f         " WHERE o
178e0 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20 7a 54 61  rigin='pk'", zTa
178f0 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  b);.    rc = sql
17900 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
17910 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
17920 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
17930 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
17940 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ql);.    if( rc 
17950 29 7b 0a 20 20 20 20 20 20 66 72 65 65 43 6f 6c  ){.      freeCol
17960 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b 0a  umnList(azCol);.
17970 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
17980 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
17990 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
179a0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
179b0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
179c0 0a 20 20 20 20 70 72 65 73 65 72 76 65 52 6f 77  .    preserveRow
179d0 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f  id = rc==SQLITE_
179e0 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ROW;.  }.  if( p
179f0 72 65 73 65 72 76 65 52 6f 77 69 64 20 29 7b 0a  reserveRowid ){.
17a00 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70 72 65 73      /* Only pres
17a10 65 72 76 65 20 74 68 65 20 72 6f 77 69 64 20 69  erve the rowid i
17a20 66 20 77 65 20 63 61 6e 20 66 69 6e 64 20 61 20  f we can find a 
17a30 6e 61 6d 65 20 74 6f 20 75 73 65 20 66 6f 72 20  name to use for 
17a40 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64  the.    ** rowid
17a50 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
17a60 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b 5d 20 3d  har *azRowid[] =
17a70 20 7b 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f   { "rowid", "_ro
17a80 77 69 64 5f 22 2c 20 22 6f 69 64 22 20 7d 3b 0a  wid_", "oid" };.
17a90 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
17aa0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
17ab0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  j++){.      for(
17ac0 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b 20 69 2b  i=1; i<=nCol; i+
17ad0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
17ae0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
17af0 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a 43 6f 6c  azRowid[j],azCol
17b00 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  [i])==0 ) break;
17b10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17b20 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  f( i>nCol ){.   
17b30 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
17b40 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74  point, we know t
17b50 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a 5d 20 69  hat azRowid[j] i
17b60 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f  s not the name o
17b70 66 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a  f any.        **
17b80 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c 75 6d 6e   ordinary column
17b90 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
17ba0 56 65 72 69 66 79 20 74 68 61 74 20 61 7a 52 6f  Verify that azRo
17bb0 77 69 64 5b 6a 5d 20 69 73 20 61 20 76 61 6c 69  wid[j] is a vali
17bc0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 61 6d  d.        ** nam
17bd0 65 20 66 6f 72 20 74 68 65 20 72 6f 77 69 64 20  e for the rowid 
17be0 62 65 66 6f 72 65 20 61 64 64 69 6e 67 20 69 74  before adding it
17bf0 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e 20 20 57   to azCol[0].  W
17c00 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 20  ITHOUT ROWID.   
17c10 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 77       ** tables w
17c20 69 6c 6c 20 66 61 69 6c 20 74 68 69 73 20 6c 61  ill fail this la
17c30 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20 20 20 20  st check */.    
17c40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17c50 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
17c60 74 61 64 61 74 61 28 70 2d 3e 64 62 2c 30 2c 7a  tadata(p->db,0,z
17c70 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a 5d 2c 30  Tab,azRowid[j],0
17c80 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20  ,0,0,0,0);.     
17c90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17ca0 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b 30 5d 20  E_OK ) azCol[0] 
17cb0 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b 0a 20 20  = azRowid[j];.  
17cc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17cd0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
17ce0 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c 3b 0a 7d   return azCol;.}
17cf0 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c 65 20 74  ../*.** Toggle t
17d00 68 65 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64  he reverse_unord
17d10 65 72 65 64 5f 73 65 6c 65 63 74 73 20 73 65 74  ered_selects set
17d20 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ting..*/.static 
17d30 76 6f 69 64 20 74 6f 67 67 6c 65 53 65 6c 65 63  void toggleSelec
17d40 74 4f 72 64 65 72 28 73 71 6c 69 74 65 33 20 2a  tOrder(sqlite3 *
17d50 64 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  db){.  sqlite3_s
17d60 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
17d70 20 20 69 6e 74 20 69 53 65 74 74 69 6e 67 20 3d    int iSetting =
17d80 20 30 3b 0a 20 20 63 68 61 72 20 7a 53 74 6d 74   0;.  char zStmt
17d90 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  [100];.  sqlite3
17da0 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
17db0 22 50 52 41 47 4d 41 20 72 65 76 65 72 73 65 5f  "PRAGMA reverse_
17dc0 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74  unordered_select
17dd0 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  s", -1, &pStmt, 
17de0 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  0);.  if( sqlite
17df0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
17e00 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
17e10 20 69 53 65 74 74 69 6e 67 20 3d 20 73 71 6c 69   iSetting = sqli
17e20 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
17e30 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Stmt, 0);.  }.  
17e40 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
17e50 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74  (pStmt);.  sqlit
17e60 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
17e70 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53 74 6d 74  of(zStmt), zStmt
17e80 2c 0a 20 20 20 20 20 20 20 22 50 52 41 47 4d 41  ,.       "PRAGMA
17e90 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64 65 72   reverse_unorder
17ea0 65 64 5f 73 65 6c 65 63 74 73 28 25 64 29 22 2c  ed_selects(%d)",
17eb0 20 21 69 53 65 74 74 69 6e 67 29 3b 0a 20 20 73   !iSetting);.  s
17ec0 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
17ed0 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20 30 29 3b  zStmt, 0, 0, 0);
17ee0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
17ef0 73 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 61  s a different ca
17f00 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 75  llback routine u
17f10 73 65 64 20 66 6f 72 20 64 75 6d 70 69 6e 67 20  sed for dumping 
17f20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
17f30 20 45 61 63 68 20 72 6f 77 20 72 65 63 65 69 76   Each row receiv
17f40 65 64 20 62 79 20 74 68 69 73 20 63 61 6c 6c 62  ed by this callb
17f50 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ack consists of 
17f60 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a  a table name,.**
17f70 20 74 68 65 20 74 61 62 6c 65 20 74 79 70 65 20   the table type 
17f80 28 22 69 6e 64 65 78 22 20 6f 72 20 22 74 61 62  ("index" or "tab
17f90 6c 65 22 29 20 61 6e 64 20 53 51 4c 20 74 6f 20  le") and SQL to 
17fa0 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
17fb0 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
17fc0 65 20 73 68 6f 75 6c 64 20 70 72 69 6e 74 20 74  e should print t
17fd0 65 78 74 20 73 75 66 66 69 63 69 65 6e 74 20 74  ext sufficient t
17fe0 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20 74  o recreate the t
17ff0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
18000 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  int dump_callbac
18010 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  k(void *pArg, in
18020 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  t nArg, char **a
18030 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 4e  zArg, char **azN
18040 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e 74 20 72  otUsed){.  int r
18050 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  c;.  const char 
18060 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f 6e 73 74  *zTable;.  const
18070 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20   char *zType;.  
18080 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
18090 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  ;.  ShellState *
180a0 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 20  p = (ShellState 
180b0 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e 55 53 45  *)pArg;..  UNUSE
180c0 44 5f 50 41 52 41 4d 45 54 45 52 28 61 7a 4e 6f  D_PARAMETER(azNo
180d0 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 6e 41  tUsed);.  if( nA
180e0 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72 67 3d 3d  rg!=3 || azArg==
180f0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
18100 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b 30  zTable = azArg[0
18110 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20 61 7a 41  ];.  zType = azA
18120 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20 3d 20  rg[1];.  zSql = 
18130 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20 69 66 28  azArg[2];..  if(
18140 20 73 74 72 63 6d 70 28 7a 54 61 62 6c 65 2c 20   strcmp(zTable, 
18150 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  "sqlite_sequence
18160 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77  ")==0 ){.    raw
18170 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
18180 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 71 6c  "DELETE FROM sql
18190 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c 6e 22  ite_sequence;\n"
181a0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
181b0 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22  qlite3_strglob("
181c0 73 71 6c 69 74 65 5f 73 74 61 74 3f 22 2c 20 7a  sqlite_stat?", z
181d0 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Table)==0 ){.   
181e0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
181f0 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c  ut, "ANALYZE sql
18200 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b  ite_master;\n");
18210 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
18220 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71  ncmp(zTable, "sq
18230 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29 7b  lite_", 7)==0 ){
18240 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
18250 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63   }else if( strnc
18260 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45 41 54 45  mp(zSql, "CREATE
18270 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22 2c   VIRTUAL TABLE",
18280 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63   20)==0 ){.    c
18290 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20 20 20 69  har *zIns;.    i
182a0 66 28 20 21 70 2d 3e 77 72 69 74 61 62 6c 65 53  f( !p->writableS
182b0 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 72  chema ){.      r
182c0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
182d0 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
182e0 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c 6e 22  le_schema=ON;\n"
182f0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69 74  );.      p->writ
18300 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 31 3b 0a  ableSchema = 1;.
18310 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e 73 20 3d      }.    zIns =
18320 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
18330 28 0a 20 20 20 20 20 20 20 22 49 4e 53 45 52 54  (.       "INSERT
18340 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73   INTO sqlite_mas
18350 74 65 72 28 74 79 70 65 2c 6e 61 6d 65 2c 74 62  ter(type,name,tb
18360 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61 67 65 2c  l_name,rootpage,
18370 73 71 6c 29 22 0a 20 20 20 20 20 20 20 22 56 41  sql)".       "VA
18380 4c 55 45 53 28 27 74 61 62 6c 65 27 2c 27 25 71  LUES('table','%q
18390 27 2c 27 25 71 27 2c 30 2c 27 25 71 27 29 3b 22  ','%q',0,'%q');"
183a0 2c 0a 20 20 20 20 20 20 20 7a 54 61 62 6c 65 2c  ,.       zTable,
183b0 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c 29 3b 0a   zTable, zSql);.
183c0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
183d0 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
183e0 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  zIns);.    sqlit
183f0 65 33 5f 66 72 65 65 28 7a 49 6e 73 29 3b 0a 20  e3_free(zIns);. 
18400 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
18410 65 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e 74 53  else{.    printS
18420 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74  chemaLine(p->out
18430 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22 29 3b 0a  , zSql, ";\n");.
18440 20 20 7d 0a 0a 20 20 69 66 28 20 73 74 72 63 6d    }..  if( strcm
18450 70 28 7a 54 79 70 65 2c 20 22 74 61 62 6c 65 22  p(zType, "table"
18460 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c  )==0 ){.    Shel
18470 6c 54 65 78 74 20 73 53 65 6c 65 63 74 3b 0a 20  lText sSelect;. 
18480 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 54 61     ShellText sTa
18490 62 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a  ble;.    char **
184a0 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 69  azCol;.    int i
184b0 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 61 76 65  ;.    char *save
184c0 64 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20  dDestTable;.    
184d0 69 6e 74 20 73 61 76 65 64 4d 6f 64 65 3b 0a 0a  int savedMode;..
184e0 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74 61 62 6c      azCol = tabl
184f0 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 2c 20 7a  eColumnList(p, z
18500 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
18510 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  azCol==0 ){.    
18520 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20    p->nErr++;.   
18530 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
18540 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79   }..    /* Alway
18550 73 20 71 75 6f 74 65 20 74 68 65 20 74 61 62 6c  s quote the tabl
18560 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20 69 66 20  e name, even if 
18570 69 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  it appears to be
18580 20 70 75 72 65 20 61 73 63 69 69 2c 0a 20 20 20   pure ascii,.   
18590 20 2a 2a 20 69 6e 20 63 61 73 65 20 69 74 20 69   ** in case it i
185a0 73 20 61 20 6b 65 79 77 6f 72 64 2e 20 45 78 3a  s a keyword. Ex:
185b0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 22 74    INSERT INTO "t
185c0 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a 20 20 20  able" ... */.   
185d0 20 69 6e 69 74 54 65 78 74 28 26 73 54 61 62 6c   initText(&sTabl
185e0 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  e);.    appendTe
185f0 78 74 28 26 73 54 61 62 6c 65 2c 20 7a 54 61 62  xt(&sTable, zTab
18600 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28 7a 54  le, quoteChar(zT
18610 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f 2a 20 49  able));.    /* I
18620 66 20 70 72 65 73 65 72 76 69 6e 67 20 74 68 65  f preserving the
18630 20 72 6f 77 69 64 2c 20 61 64 64 20 61 20 63 6f   rowid, add a co
18640 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74 65 72 20  lumn list after 
18650 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a  the table name..
18660 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72 20      ** In other 
18670 77 6f 72 64 73 3a 20 20 22 49 4e 53 45 52 54 20  words:  "INSERT 
18680 49 4e 54 4f 20 74 61 62 28 72 6f 77 69 64 2c 61  INTO tab(rowid,a
18690 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c 55 45 53  ,b,c,...) VALUES
186a0 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 69 6e  (...)".    ** in
186b0 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
186c0 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  al "INSERT INTO 
186d0 74 61 62 20 56 41 4c 55 45 53 28 2e 2e 2e 29 22  tab VALUES(...)"
186e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
186f0 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20   azCol[0] ){.   
18700 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
18710 54 61 62 6c 65 2c 20 22 28 22 2c 20 30 29 3b 0a  Table, "(", 0);.
18720 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
18730 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b  (&sTable, azCol[
18740 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f  0], 0);.      fo
18750 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b  r(i=1; azCol[i];
18760 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   i++){.        a
18770 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c  ppendText(&sTabl
18780 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20  e, ",", 0);.    
18790 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
187a0 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b 69 5d  sTable, azCol[i]
187b0 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43 6f  , quoteChar(azCo
187c0 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a  l[i]));.      }.
187d0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
187e0 28 26 73 54 61 62 6c 65 2c 20 22 29 22 2c 20 30  (&sTable, ")", 0
187f0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
18800 20 42 75 69 6c 64 20 61 6e 20 61 70 70 72 6f 70   Build an approp
18810 72 69 61 74 65 20 53 45 4c 45 43 54 20 73 74 61  riate SELECT sta
18820 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
18830 69 74 54 65 78 74 28 26 73 53 65 6c 65 63 74 29  itText(&sSelect)
18840 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
18850 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45 4c 45  (&sSelect, "SELE
18860 43 54 20 22 2c 20 30 29 3b 0a 20 20 20 20 69 66  CT ", 0);.    if
18870 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20  ( azCol[0] ){.  
18880 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
18890 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b 30  sSelect, azCol[0
188a0 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 70 70  ], 0);.      app
188b0 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
188c0 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 7d  , ",", 0);.    }
188d0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a  .    for(i=1; az
188e0 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  Col[i]; i++){.  
188f0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
18900 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b 69  sSelect, azCol[i
18910 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43  ], quoteChar(azC
18920 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20 69  ol[i]));.      i
18930 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d 20 29 7b  f( azCol[i+1] ){
18940 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
18950 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2c  ext(&sSelect, ",
18960 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ", 0);.      }. 
18970 20 20 20 7d 0a 20 20 20 20 66 72 65 65 43 6f 6c     }.    freeCol
18980 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b 0a  umnList(azCol);.
18990 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
189a0 73 53 65 6c 65 63 74 2c 20 22 20 46 52 4f 4d 20  sSelect, " FROM 
189b0 22 2c 20 30 29 3b 0a 20 20 20 20 61 70 70 65 6e  ", 0);.    appen
189c0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
189d0 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61  zTable, quoteCha
189e0 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a 20 20 20  r(zTable));..   
189f0 20 73 61 76 65 64 44 65 73 74 54 61 62 6c 65 20   savedDestTable 
18a00 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 3b  = p->zDestTable;
18a10 0a 20 20 20 20 73 61 76 65 64 4d 6f 64 65 20 3d  .    savedMode =
18a20 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 70 2d   p->mode;.    p-
18a30 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 73 54  >zDestTable = sT
18a40 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70 2d 3e 6d  able.z;.    p->m
18a50 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64 65 20 3d  ode = p->cMode =
18a60 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20   MODE_Insert;.  
18a70 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65 78 65    rc = shell_exe
18a80 63 28 70 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20  c(p, sSelect.z, 
18a90 30 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26  0);.    if( (rc&
18aa0 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
18ab0 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 72  RRUPT ){.      r
18ac0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
18ad0 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55  , "/****** CORRU
18ae0 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a  PTION ERROR ****
18af0 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ***/\n");.      
18b00 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64 65  toggleSelectOrde
18b10 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  r(p->db);.      
18b20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c 20 73 53  shell_exec(p, sS
18b30 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a 20 20 20  elect.z, 0);.   
18b40 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f     toggleSelectO
18b50 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20  rder(p->db);.   
18b60 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74 54   }.    p->zDestT
18b70 61 62 6c 65 20 3d 20 73 61 76 65 64 44 65 73 74  able = savedDest
18b80 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d 3e 6d 6f  Table;.    p->mo
18b90 64 65 20 3d 20 73 61 76 65 64 4d 6f 64 65 3b 0a  de = savedMode;.
18ba0 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73 54      freeText(&sT
18bb0 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 65 65 54  able);.    freeT
18bc0 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20  ext(&sSelect);. 
18bd0 20 20 20 69 66 28 20 72 63 20 29 20 70 2d 3e 6e     if( rc ) p->n
18be0 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  Err++;.  }.  ret
18bf0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
18c00 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55 73 65  Run zQuery.  Use
18c10 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 29   dump_callback()
18c20 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   as the callback
18c30 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74   routine so that
18c40 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
18c50 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 61 72   of the query ar
18c60 65 20 6f 75 74 70 75 74 20 61 73 20 53 51 4c 20  e output as SQL 
18c70 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
18c80 2a 20 49 66 20 77 65 20 67 65 74 20 61 20 53 51  * If we get a SQ
18c90 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
18ca0 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20 71 75  or, rerun the qu
18cb0 65 72 79 20 61 66 74 65 72 20 61 70 70 65 6e 64  ery after append
18cc0 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20 42 59  ing.** "ORDER BY
18cd0 20 72 6f 77 69 64 20 44 45 53 43 22 20 74 6f 20   rowid DESC" to 
18ce0 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74  the end..*/.stat
18cf0 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68 65 6d  ic int run_schem
18d00 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20 20  a_dump_query(.  
18d10 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20  ShellState *p,. 
18d20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 75   const char *zQu
18d30 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ery.){.  int rc;
18d40 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  .  char *zErr = 
18d50 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
18d60 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51  3_exec(p->db, zQ
18d70 75 65 72 79 2c 20 64 75 6d 70 5f 63 61 6c 6c 62  uery, dump_callb
18d80 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a  ack, p, &zErr);.
18d90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18da0 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20  _CORRUPT ){.    
18db0 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20 20 69  char *zQ2;.    i
18dc0 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33  nt len = strlen3
18dd0 30 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 72  0(zQuery);.    r
18de0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
18df0 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55  , "/****** CORRU
18e00 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a  PTION ERROR ****
18e10 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 69 66  ***/\n");.    if
18e20 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ( zErr ){.      
18e30 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
18e40 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 25 73 20  ut, "/****** %s 
18e50 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72  ******/\n", zErr
18e60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18e70 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20  _free(zErr);.   
18e80 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20     zErr = 0;.   
18e90 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20 6d 61 6c   }.    zQ2 = mal
18ea0 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20 29 3b 0a  loc( len+100 );.
18eb0 20 20 20 20 69 66 28 20 7a 51 32 3d 3d 30 20 29      if( zQ2==0 )
18ec0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18ed0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
18ee0 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32 2c 20 22  (len+100, zQ2, "
18ef0 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  %s ORDER BY rowi
18f00 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72 79 29  d DESC", zQuery)
18f10 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
18f20 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
18f30 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  Q2, dump_callbac
18f40 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20 20  k, p, &zErr);.  
18f50 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
18f60 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
18f70 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 45  >out, "/****** E
18f80 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f  RROR: %s ******/
18f90 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20  \n", zErr);.    
18fa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
18fb0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
18fc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
18fd0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
18fe0 20 20 20 20 66 72 65 65 28 7a 51 32 29 3b 0a 20      free(zQ2);. 
18ff0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
19000 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f 66  }../*.** Text of
19010 20 68 65 6c 70 20 6d 65 73 73 61 67 65 73 2e 0a   help messages..
19020 2a 2a 0a 2a 2a 20 54 68 65 20 68 65 6c 70 20 74  **.** The help t
19030 65 78 74 20 66 6f 72 20 65 61 63 68 20 69 6e 64  ext for each ind
19040 69 76 69 64 75 61 6c 20 63 6f 6d 6d 61 6e 64 20  ividual command 
19050 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 6c 69  begins with a li
19060 6e 65 20 74 68 61 74 20 73 74 61 72 74 73 0a 2a  ne that starts.*
19070 2a 20 77 69 74 68 20 22 2e 22 2e 20 20 53 75 62  * with ".".  Sub
19080 73 65 71 75 65 6e 74 20 6c 69 6e 65 73 20 61 72  sequent lines ar
19090 65 20 73 75 70 70 6c 69 6d 65 6e 74 61 6c 20 69  e supplimental i
190a0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
190b0 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
190c0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 70 61 63  two or more spac
190d0 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 65  es between the e
190e0 6e 64 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e  nd of the comman
190f0 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 73 74 61  d and the.** sta
19100 72 74 20 6f 66 20 74 68 65 20 64 65 73 63 72 69  rt of the descri
19110 70 74 69 6f 6e 20 6f 66 20 77 68 61 74 20 74 68  ption of what th
19120 61 74 20 63 6f 6d 6d 61 6e 64 20 64 6f 65 73 2e  at command does.
19130 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
19140 20 63 68 61 72 20 2a 28 61 7a 48 65 6c 70 5b 5d   char *(azHelp[]
19150 29 20 3d 20 7b 0a 23 69 66 20 64 65 66 69 6e 65  ) = {.#if define
19160 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c  d(SQLITE_HAVE_ZL
19170 49 42 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  IB) && !defined(
19180 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
19190 55 41 4c 54 41 42 4c 45 29 0a 20 20 22 2e 61 72  UALTABLE).  ".ar
191a0 63 68 69 76 65 20 2e 2e 2e 20 20 20 20 20 20 20  chive ...       
191b0 20 20 20 20 20 20 4d 61 6e 61 67 65 20 53 51 4c        Manage SQL
191c0 20 61 72 63 68 69 76 65 73 22 2c 0a 20 20 22 20   archives",.  " 
191d0 20 20 45 61 63 68 20 63 6f 6d 6d 61 6e 64 20 6d    Each command m
191e0 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79  ust have exactly
191f0 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
19200 6f 77 69 6e 67 20 6f 70 74 69 6f 6e 73 3a 22 2c  owing options:",
19210 0a 20 20 22 20 20 20 20 20 2d 63 2c 20 2d 2d 63  .  "     -c, --c
19220 72 65 61 74 65 20 20 20 20 20 20 20 20 20 20 20  reate           
19230 20 20 20 20 43 72 65 61 74 65 20 61 20 6e 65 77      Create a new
19240 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20 20   archive",.  "  
19250 20 20 20 2d 75 2c 20 2d 2d 75 70 64 61 74 65 20     -u, --update 
19260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 70                Up
19270 64 61 74 65 20 6f 72 20 61 64 64 20 66 69 6c 65  date or add file
19280 73 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e 67  s to an existing
19290 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20 20   archive",.  "  
192a0 20 20 20 2d 74 2c 20 2d 2d 6c 69 73 74 20 20 20     -t, --list   
192b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69                Li
192c0 73 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  st contents of a
192d0 72 63 68 69 76 65 22 2c 0a 20 20 22 20 20 20 20  rchive",.  "    
192e0 20 2d 78 2c 20 2d 2d 65 78 74 72 61 63 74 20 20   -x, --extract  
192f0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 74 72              Extr
19300 61 63 74 20 66 69 6c 65 73 20 66 72 6f 6d 20 61  act files from a
19310 72 63 68 69 76 65 22 2c 0a 20 20 22 20 20 20 4f  rchive",.  "   O
19320 70 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74  ptional argument
19330 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d 76 2c  s:",.  "     -v,
19340 20 2d 2d 76 65 72 62 6f 73 65 20 20 20 20 20 20   --verbose      
19350 20 20 20 20 20 20 20 20 50 72 69 6e 74 20 65 61          Print ea
19360 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 73 20 69  ch filename as i
19370 74 20 69 73 20 70 72 6f 63 65 73 73 65 64 22 2c  t is processed",
19380 0a 20 20 22 20 20 20 20 20 2d 66 20 46 49 4c 45  .  "     -f FILE
19390 2c 20 2d 2d 66 69 6c 65 20 46 49 4c 45 20 20 20  , --file FILE   
193a0 20 20 20 20 4f 70 65 72 61 74 65 20 6f 6e 20 61      Operate on a
193b0 72 63 68 69 76 65 20 46 49 4c 45 20 28 64 65 66  rchive FILE (def
193c0 61 75 6c 74 20 69 73 20 63 75 72 72 65 6e 74 20  ault is current 
193d0 64 62 29 22 2c 0a 20 20 22 20 20 20 20 20 2d 61  db)",.  "     -a
193e0 20 46 49 4c 45 2c 20 2d 2d 61 70 70 65 6e 64 20   FILE, --append 
193f0 46 49 4c 45 20 20 20 20 20 4f 70 65 72 61 74 65  FILE     Operate
19400 20 6f 6e 20 46 49 4c 45 20 6f 70 65 6e 65 64 20   on FILE opened 
19410 75 73 69 6e 67 20 74 68 65 20 61 70 6e 64 76 66  using the apndvf
19420 73 20 56 46 53 22 2c 0a 20 20 22 20 20 20 20 20  s VFS",.  "     
19430 2d 43 20 44 49 52 2c 20 2d 2d 64 69 72 65 63 74  -C DIR, --direct
19440 6f 72 79 20 44 49 52 20 20 20 20 43 68 61 6e 67  ory DIR    Chang
19450 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20 44  e to directory D
19460 49 52 20 74 6f 20 72 65 61 64 2f 65 78 74 72 61  IR to read/extra
19470 63 74 20 66 69 6c 65 73 22 2c 0a 20 20 22 20 20  ct files",.  "  
19480 20 20 20 2d 6e 2c 20 2d 2d 64 72 79 72 75 6e 20     -n, --dryrun 
19490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68                Sh
194a0 6f 77 20 74 68 65 20 53 51 4c 20 74 68 61 74 20  ow the SQL that 
194b0 77 6f 75 6c 64 20 68 61 76 65 20 6f 63 63 75 72  would have occur
194c0 72 65 64 22 2c 0a 20 20 22 20 20 20 45 78 61 6d  red",.  "   Exam
194d0 70 6c 65 73 3a 22 2c 0a 20 20 22 20 20 20 20 20  ples:",.  "     
194e0 2e 61 72 20 2d 63 66 20 61 72 63 68 69 76 65 2e  .ar -cf archive.
194f0 73 61 72 20 66 6f 6f 20 62 61 72 20 20 23 20 43  sar foo bar  # C
19500 72 65 61 74 65 20 61 72 63 68 69 76 65 2e 73 61  reate archive.sa
19510 72 20 66 72 6f 6d 20 66 69 6c 65 73 20 66 6f 6f  r from files foo
19520 20 61 6e 64 20 62 61 72 22 2c 0a 20 20 22 20 20   and bar",.  "  
19530 20 20 20 2e 61 72 20 2d 74 66 20 61 72 63 68 69     .ar -tf archi
19540 76 65 2e 73 61 72 20 20 20 20 20 20 20 20 20 20  ve.sar          
19550 23 20 4c 69 73 74 20 6d 65 6d 62 65 72 73 20 6f  # List members o
19560 66 20 61 72 63 68 69 76 65 2e 73 61 72 22 2c 0a  f archive.sar",.
19570 20 20 22 20 20 20 20 20 2e 61 72 20 2d 78 76 66    "     .ar -xvf
19580 20 61 72 63 68 69 76 65 2e 73 61 72 20 20 20 20   archive.sar    
19590 20 20 20 20 20 23 20 56 65 72 62 6f 73 65 6c 79       # Verbosely
195a0 20 65 78 74 72 61 63 74 20 66 69 6c 65 73 20 66   extract files f
195b0 72 6f 6d 20 61 72 63 68 69 76 65 2e 73 61 72 22  rom archive.sar"
195c0 2c 0a 20 20 22 20 20 20 53 65 65 20 61 6c 73 6f  ,.  "   See also
195d0 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 68 74 74  :",.  "      htt
195e0 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 63  p://sqlite.org/c
195f0 6c 69 2e 68 74 6d 6c 23 73 71 6c 61 72 5f 61 72  li.html#sqlar_ar
19600 63 68 69 76 65 5f 73 75 70 70 6f 72 74 22 2c 0a  chive_support",.
19610 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
19620 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
19630 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e 61 75 74  RIZATION.  ".aut
19640 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20 20 20  h ON|OFF        
19650 20 20 20 20 20 53 68 6f 77 20 61 75 74 68 6f 72       Show author
19660 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 73 22 2c  izer callbacks",
19670 0a 23 65 6e 64 69 66 0a 20 20 22 2e 62 61 63 6b  .#endif.  ".back
19680 75 70 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20  up ?DB? FILE    
19690 20 20 20 20 42 61 63 6b 75 70 20 44 42 20 28 64      Backup DB (d
196a0 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29  efault \"main\")
196b0 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20   to FILE",.  "  
196c0 20 20 20 20 20 2d 2d 61 70 70 65 6e 64 20 20 20       --append   
196d0 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68 65           Use the
196e0 20 61 70 70 65 6e 64 76 66 73 22 2c 0a 20 20 22   appendvfs",.  "
196f0 20 20 20 20 20 20 20 2d 2d 61 73 79 6e 63 20 20         --async  
19700 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 65             Write
19710 20 74 6f 20 46 49 4c 45 20 77 69 74 68 6f 75 74   to FILE without
19720 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 77   a journal and w
19730 69 74 68 6f 75 74 20 66 73 79 6e 63 28 29 22 2c  ithout fsync()",
19740 0a 20 20 22 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66  .  ".bail on|off
19750 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74 6f               Sto
19760 70 20 61 66 74 65 72 20 68 69 74 74 69 6e 67 20  p after hitting 
19770 61 6e 20 65 72 72 6f 72 2e 20 20 44 65 66 61 75  an error.  Defau
19780 6c 74 20 4f 46 46 22 2c 0a 20 20 22 2e 62 69 6e  lt OFF",.  ".bin
19790 61 72 79 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20  ary on|off      
197a0 20 20 20 20 20 54 75 72 6e 20 62 69 6e 61 72 79       Turn binary
197b0 20 6f 75 74 70 75 74 20 6f 6e 20 6f 72 20 6f 66   output on or of
197c0 66 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 22  f.  Default OFF"
197d0 2c 0a 20 20 22 2e 63 64 20 44 49 52 45 43 54 4f  ,.  ".cd DIRECTO
197e0 52 59 20 20 20 20 20 20 20 20 20 20 20 20 43 68  RY            Ch
197f0 61 6e 67 65 20 74 68 65 20 77 6f 72 6b 69 6e 67  ange the working
19800 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 44 49   directory to DI
19810 52 45 43 54 4f 52 59 22 2c 0a 20 20 22 2e 63 68  RECTORY",.  ".ch
19820 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 20 20 20 20  anges on|off    
19830 20 20 20 20 20 20 53 68 6f 77 20 6e 75 6d 62 65        Show numbe
19840 72 20 6f 66 20 72 6f 77 73 20 63 68 61 6e 67 65  r of rows change
19850 64 20 62 79 20 53 51 4c 22 2c 0a 20 20 22 2e 63  d by SQL",.  ".c
19860 68 65 63 6b 20 47 4c 4f 42 20 20 20 20 20 20 20  heck GLOB       
19870 20 20 20 20 20 20 20 46 61 69 6c 20 69 66 20 6f         Fail if o
19880 75 74 70 75 74 20 73 69 6e 63 65 20 2e 74 65 73  utput since .tes
19890 74 63 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d  tcase does not m
198a0 61 74 63 68 22 2c 0a 20 20 22 2e 63 6c 6f 6e 65  atch",.  ".clone
198b0 20 4e 45 57 44 42 20 20 20 20 20 20 20 20 20 20   NEWDB          
198c0 20 20 20 43 6c 6f 6e 65 20 64 61 74 61 20 69 6e     Clone data in
198d0 74 6f 20 4e 45 57 44 42 20 66 72 6f 6d 20 74 68  to NEWDB from th
198e0 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  e existing datab
198f0 61 73 65 22 2c 0a 20 20 22 2e 64 61 74 61 62 61  ase",.  ".databa
19900 73 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ses             
19910 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 61 6e 64    List names and
19920 20 66 69 6c 65 73 20 6f 66 20 61 74 74 61 63 68   files of attach
19930 65 64 20 64 61 74 61 62 61 73 65 73 22 2c 0a 20  ed databases",. 
19940 20 22 2e 64 62 63 6f 6e 66 69 67 20 3f 6f 70 3f   ".dbconfig ?op?
19950 20 3f 76 61 6c 3f 20 20 20 20 20 4c 69 73 74 20   ?val?     List 
19960 6f 72 20 63 68 61 6e 67 65 20 73 71 6c 69 74 65  or change sqlite
19970 33 5f 64 62 5f 63 6f 6e 66 69 67 28 29 20 6f 70  3_db_config() op
19980 74 69 6f 6e 73 22 2c 0a 20 20 22 2e 64 62 69 6e  tions",.  ".dbin
19990 66 6f 20 3f 44 42 3f 20 20 20 20 20 20 20 20 20  fo ?DB?         
199a0 20 20 20 20 53 68 6f 77 20 73 74 61 74 75 73 20      Show status 
199b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
199c0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 22 2c  t the database",
199d0 0a 20 20 22 2e 64 75 6d 70 20 3f 54 41 42 4c 45  .  ".dump ?TABLE
199e0 3f 20 2e 2e 2e 20 20 20 20 20 20 20 20 52 65 6e  ? ...        Ren
199f0 64 65 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  der all database
19a00 20 63 6f 6e 74 65 6e 74 20 61 73 20 53 51 4c 22   content as SQL"
19a10 2c 0a 20 20 22 20 20 20 4f 70 74 69 6f 6e 73 3a  ,.  "   Options:
19a20 22 2c 0a 20 20 22 20 20 20 20 20 2d 2d 70 72 65  ",.  "     --pre
19a30 73 65 72 76 65 2d 72 6f 77 69 64 73 20 20 20 20  serve-rowids    
19a40 20 20 49 6e 63 6c 75 64 65 20 52 4f 57 49 44 20    Include ROWID 
19a50 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 6f 75  values in the ou
19a60 74 70 75 74 22 2c 0a 20 20 22 20 20 20 20 20 2d  tput",.  "     -
19a70 2d 6e 65 77 6c 69 6e 65 73 20 20 20 20 20 20 20  -newlines       
19a80 20 20 20 20 20 20 41 6c 6c 6f 77 20 75 6e 65 73        Allow unes
19a90 63 61 70 65 64 20 6e 65 77 6c 69 6e 65 20 63 68  caped newline ch
19aa0 61 72 61 63 74 65 72 73 20 69 6e 20 6f 75 74 70  aracters in outp
19ab0 75 74 22 2c 0a 20 20 22 20 20 20 54 41 42 4c 45  ut",.  "   TABLE
19ac0 20 69 73 20 4c 49 4b 45 20 70 61 74 74 65 72 6e   is LIKE pattern
19ad0 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 73 20   for the tables 
19ae0 74 6f 20 64 75 6d 70 22 2c 0a 20 20 22 2e 65 63  to dump",.  ".ec
19af0 68 6f 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  ho on|off       
19b00 20 20 20 20 20 20 54 75 72 6e 20 63 6f 6d 6d 61        Turn comma
19b10 6e 64 20 65 63 68 6f 20 6f 6e 20 6f 72 20 6f 66  nd echo on or of
19b20 66 22 2c 0a 20 20 22 2e 65 71 70 20 6f 6e 7c 6f  f",.  ".eqp on|o
19b30 66 66 7c 66 75 6c 6c 20 20 20 20 20 20 20 20 20  ff|full         
19b40 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
19b50 65 20 61 75 74 6f 6d 61 74 69 63 20 45 58 50 4c  e automatic EXPL
19b60 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 2c  AIN QUERY PLAN",
19b70 0a 20 20 22 2e 65 78 63 65 6c 20 20 20 20 20 20  .  ".excel      
19b80 20 20 20 20 20 20 20 20 20 20 20 20 20 44 69 73               Dis
19b90 70 6c 61 79 20 74 68 65 20 6f 75 74 70 75 74 20  play the output 
19ba0 6f 66 20 6e 65 78 74 20 63 6f 6d 6d 61 6e 64 20  of next command 
19bb0 69 6e 20 61 20 73 70 72 65 61 64 73 68 65 65 74  in a spreadsheet
19bc0 22 2c 0a 20 20 22 2e 65 78 69 74 20 3f 43 4f 44  ",.  ".exit ?COD
19bd0 45 3f 20 20 20 20 20 20 20 20 20 20 20 20 20 45  E?             E
19be0 78 69 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d  xit this program
19bf0 20 77 69 74 68 20 72 65 74 75 72 6e 2d 63 6f 64   with return-cod
19c00 65 20 43 4f 44 45 22 2c 0a 20 20 22 2e 65 78 70  e CODE",.  ".exp
19c10 65 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ert             
19c20 20 20 20 20 20 45 58 50 45 52 49 4d 45 4e 54 41       EXPERIMENTA
19c30 4c 2e 20 53 75 67 67 65 73 74 20 69 6e 64 65 78  L. Suggest index
19c40 65 73 20 66 6f 72 20 73 70 65 63 69 66 69 65 64  es for specified
19c50 20 71 75 65 72 69 65 73 22 2c 0a 2f 2a 20 42 65   queries",./* Be
19c60 63 61 75 73 65 20 65 78 70 6c 61 69 6e 20 6d 6f  cause explain mo
19c70 64 65 20 63 6f 6d 65 73 20 6f 6e 20 61 75 74 6f  de comes on auto
19c80 6d 61 74 69 63 61 6c 6c 79 20 6e 6f 77 2c 20 74  matically now, t
19c90 68 65 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f  he ".explain" mo
19ca0 64 65 0a 2a 2a 20 69 73 20 72 65 6d 6f 76 65 64  de.** is removed
19cb0 20 66 72 6f 6d 20 74 68 65 20 68 65 6c 70 20 73   from the help s
19cc0 63 72 65 65 6e 2e 20 20 49 74 20 69 73 20 73 74  creen.  It is st
19cd0 69 6c 6c 20 73 75 70 70 6f 72 74 65 64 20 66 6f  ill supported fo
19ce0 72 20 6c 65 67 61 63 79 2c 20 68 6f 77 65 76 65  r legacy, howeve
19cf0 72 20 2a 2f 0a 2f 2a 22 2e 65 78 70 6c 61 69 6e  r */./*".explain
19d00 20 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f 3f 20 20   ?on|off|auto?  
19d10 20 54 75 72 6e 20 45 58 50 4c 41 49 4e 20 6f 75   Turn EXPLAIN ou
19d20 74 70 75 74 20 6d 6f 64 65 20 6f 6e 20 6f 72 20  tput mode on or 
19d30 6f 66 66 20 6f 72 20 74 6f 20 61 75 74 6f 6d 61  off or to automa
19d40 74 69 63 22 2c 2a 2f 0a 20 20 22 2e 66 75 6c 6c  tic",*/.  ".full
19d50 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74  schema ?--indent
19d60 3f 20 20 20 53 68 6f 77 20 73 63 68 65 6d 61 20  ?   Show schema 
19d70 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  and the content 
19d80 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 20 74  of sqlite_stat t
19d90 61 62 6c 65 73 22 2c 0a 20 20 22 2e 68 65 61 64  ables",.  ".head
19da0 65 72 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20  ers on|off      
19db0 20 20 20 20 54 75 72 6e 20 64 69 73 70 6c 61 79      Turn display
19dc0 20 6f 66 20 68 65 61 64 65 72 73 20 6f 6e 20 6f   of headers on o
19dd0 72 20 6f 66 66 22 2c 0a 20 20 22 2e 68 65 6c 70  r off",.  ".help
19de0 20 3f 2d 61 6c 6c 3f 20 3f 50 41 54 54 45 52 4e   ?-all? ?PATTERN
19df0 3f 20 20 20 53 68 6f 77 20 68 65 6c 70 20 74 65  ?   Show help te
19e00 78 74 20 66 6f 72 20 50 41 54 54 45 52 4e 22 2c  xt for PATTERN",
19e10 0a 20 20 22 2e 69 6d 70 6f 72 74 20 46 49 4c 45  .  ".import FILE
19e20 20 54 41 42 4c 45 20 20 20 20 20 20 20 49 6d 70   TABLE       Imp
19e30 6f 72 74 20 64 61 74 61 20 66 72 6f 6d 20 46 49  ort data from FI
19e40 4c 45 20 69 6e 74 6f 20 54 41 42 4c 45 22 2c 0a  LE into TABLE",.
19e50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19e60 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c  MIT_TEST_CONTROL
19e70 0a 20 20 22 2e 69 6d 70 6f 73 74 65 72 20 49 4e  .  ".imposter IN
19e80 44 45 58 20 54 41 42 4c 45 20 20 20 20 43 72 65  DEX TABLE    Cre
19e90 61 74 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62  ate imposter tab
19ea0 6c 65 20 54 41 42 4c 45 20 6f 6e 20 69 6e 64 65  le TABLE on inde
19eb0 78 20 49 4e 44 45 58 22 2c 0a 23 65 6e 64 69 66  x INDEX",.#endif
19ec0 0a 20 20 22 2e 69 6e 64 65 78 65 73 20 3f 54 41  .  ".indexes ?TA
19ed0 42 4c 45 3f 20 20 20 20 20 20 20 20 20 53 68 6f  BLE?         Sho
19ee0 77 20 6e 61 6d 65 73 20 6f 66 20 69 6e 64 65 78  w names of index
19ef0 65 73 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20  es",.  "        
19f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f10 20 20 20 49 66 20 54 41 42 4c 45 20 69 73 20 73     If TABLE is s
19f20 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 73  pecified, only s
19f30 68 6f 77 20 69 6e 64 65 78 65 73 20 66 6f 72 22  how indexes for"
19f40 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ,.  "           
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f60 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20  tables matching 
19f70 54 41 42 4c 45 20 75 73 69 6e 67 20 74 68 65 20  TABLE using the 
19f80 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 2e 22 2c  LIKE operator.",
19f90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
19fa0 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20  NABLE_IOTRACE.  
19fb0 22 2e 69 6f 74 72 61 63 65 20 46 49 4c 45 20 20  ".iotrace FILE  
19fc0 20 20 20 20 20 20 20 20 20 20 45 6e 61 62 6c 65            Enable
19fd0 20 49 2f 4f 20 64 69 61 67 6e 6f 73 74 69 63 20   I/O diagnostic 
19fe0 6c 6f 67 67 69 6e 67 20 74 6f 20 46 49 4c 45 22  logging to FILE"
19ff0 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 69 6d  ,.#endif.  ".lim
1a000 69 74 20 3f 4c 49 4d 49 54 3f 20 3f 56 41 4c 3f  it ?LIMIT? ?VAL?
1a010 20 20 20 20 20 44 69 73 70 6c 61 79 20 6f 72 20       Display or 
1a020 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  change the value
1a030 20 6f 66 20 61 6e 20 53 51 4c 49 54 45 5f 4c 49   of an SQLITE_LI
1a040 4d 49 54 22 2c 0a 20 20 22 2e 6c 69 6e 74 20 4f  MIT",.  ".lint O
1a050 50 54 49 4f 4e 53 20 20 20 20 20 20 20 20 20 20  PTIONS          
1a060 20 20 52 65 70 6f 72 74 20 70 6f 74 65 6e 74 69    Report potenti
1a070 61 6c 20 73 63 68 65 6d 61 20 69 73 73 75 65 73  al schema issues
1a080 2e 22 2c 0a 20 20 22 20 20 20 20 20 4f 70 74 69  .",.  "     Opti
1a090 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20  ons:",.  "      
1a0a0 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 20 20    fkey-indexes  
1a0b0 20 20 20 46 69 6e 64 20 6d 69 73 73 69 6e 67 20     Find missing 
1a0c0 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e 64 65  foreign key inde
1a0d0 78 65 73 22 2c 0a 23 69 66 6e 64 65 66 20 53 51  xes",.#ifndef SQ
1a0e0 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
1a0f0 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e 6c 6f 61  XTENSION.  ".loa
1a100 64 20 46 49 4c 45 20 3f 45 4e 54 52 59 3f 20 20  d FILE ?ENTRY?  
1a110 20 20 20 20 20 4c 6f 61 64 20 61 6e 20 65 78 74       Load an ext
1a120 65 6e 73 69 6f 6e 20 6c 69 62 72 61 72 79 22 2c  ension library",
1a130 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 6f 67 20  .#endif.  ".log 
1a140 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20 20  FILE|off        
1a150 20 20 20 20 54 75 72 6e 20 6c 6f 67 67 69 6e 67      Turn logging
1a160 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 46 49 4c   on or off.  FIL
1a170 45 20 63 61 6e 20 62 65 20 73 74 64 65 72 72 2f  E can be stderr/
1a180 73 74 64 6f 75 74 22 2c 0a 20 20 22 2e 6d 6f 64  stdout",.  ".mod
1a190 65 20 4d 4f 44 45 20 3f 54 41 42 4c 45 3f 20 20  e MODE ?TABLE?  
1a1a0 20 20 20 20 20 53 65 74 20 6f 75 74 70 75 74 20       Set output 
1a1b0 6d 6f 64 65 22 2c 0a 20 20 22 20 20 20 4d 4f 44  mode",.  "   MOD
1a1c0 45 20 69 73 20 6f 6e 65 20 6f 66 3a 22 2c 0a 20  E is one of:",. 
1a1d0 20 22 20 20 20 20 20 61 73 63 69 69 20 20 20 20   "     ascii    
1a1e0 43 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20 64 65 6c  Columns/rows del
1a1f0 69 6d 69 74 65 64 20 62 79 20 30 78 31 46 20 61  imited by 0x1F a
1a200 6e 64 20 30 78 31 45 22 2c 0a 20 20 22 20 20 20  nd 0x1E",.  "   
1a210 20 20 63 73 76 20 20 20 20 20 20 43 6f 6d 6d 61    csv      Comma
1a220 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65  -separated value
1a230 73 22 2c 0a 20 20 22 20 20 20 20 20 63 6f 6c 75  s",.  "     colu
1a240 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69 67 6e 65  mn   Left-aligne
1a250 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28 53 65 65  d columns.  (See
1a260 20 2e 77 69 64 74 68 29 22 2c 0a 20 20 22 20 20   .width)",.  "  
1a270 20 20 20 68 74 6d 6c 20 20 20 20 20 48 54 4d 4c     html     HTML
1a280 20 3c 74 61 62 6c 65 3e 20 63 6f 64 65 22 2c 0a   <table> code",.
1a290 20 20 22 20 20 20 20 20 69 6e 73 65 72 74 20 20    "     insert  
1a2a0 20 53 51 4c 20 69 6e 73 65 72 74 20 73 74 61 74   SQL insert stat
1a2b0 65 6d 65 6e 74 73 20 66 6f 72 20 54 41 42 4c 45  ements for TABLE
1a2c0 22 2c 0a 20 20 22 20 20 20 20 20 6c 69 6e 65 20  ",.  "     line 
1a2d0 20 20 20 20 4f 6e 65 20 76 61 6c 75 65 20 70 65      One value pe
1a2e0 72 20 6c 69 6e 65 22 2c 0a 20 20 22 20 20 20 20  r line",.  "    
1a2f0 20 6c 69 73 74 20 20 20 20 20 56 61 6c 75 65 73   list     Values
1a300 20 64 65 6c 69 6d 69 74 65 64 20 62 79 20 5c 22   delimited by \"
1a310 7c 5c 22 22 2c 0a 20 20 22 20 20 20 20 20 71 75  |\"",.  "     qu
1a320 6f 74 65 20 20 20 20 45 73 63 61 70 65 20 61 6e  ote    Escape an
1a330 73 77 65 72 73 20 61 73 20 66 6f 72 20 53 51 4c  swers as for SQL
1a340 22 2c 0a 20 20 22 20 20 20 20 20 74 61 62 73 20  ",.  "     tabs 
1a350 20 20 20 20 54 61 62 2d 73 65 70 61 72 61 74 65      Tab-separate
1a360 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 22 20 20  d values",.  "  
1a370 20 20 20 74 63 6c 20 20 20 20 20 20 54 43 4c 20     tcl      TCL 
1a380 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 22 2c 0a  list elements",.
1a390 20 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54    ".nullvalue ST
1a3a0 52 49 4e 47 20 20 20 20 20 20 20 20 55 73 65 20  RING        Use 
1a3b0 53 54 52 49 4e 47 20 69 6e 20 70 6c 61 63 65 20  STRING in place 
1a3c0 6f 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73 22 2c  of NULL values",
1a3d0 0a 20 20 22 2e 6f 6e 63 65 20 28 2d 65 7c 2d 78  .  ".once (-e|-x
1a3e0 7c 46 49 4c 45 29 20 20 20 20 20 20 20 4f 75 74  |FILE)       Out
1a3f0 70 75 74 20 66 6f 72 20 74 68 65 20 6e 65 78 74  put for the next
1a400 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 6f 6e 6c   SQL command onl
1a410 79 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20  y to FILE",.  " 
1a420 20 20 20 20 49 66 20 46 49 4c 45 20 62 65 67 69      If FILE begi
1a430 6e 73 20 77 69 74 68 20 27 7c 27 20 74 68 65 6e  ns with '|' then
1a440 20 6f 70 65 6e 20 61 73 20 61 20 70 69 70 65 22   open as a pipe"
1a450 2c 0a 20 20 22 20 20 20 20 20 4f 74 68 65 72 20  ,.  "     Other 
1a460 6f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20  options:",.  "  
1a470 20 20 20 20 20 2d 65 20 20 20 20 49 6e 76 6f 6b       -e    Invok
1a480 65 20 73 79 73 74 65 6d 20 74 65 78 74 20 65 64  e system text ed
1a490 69 74 6f 72 22 2c 0a 20 20 22 20 20 20 20 20 20  itor",.  "      
1a4a0 20 2d 78 20 20 20 20 4f 70 65 6e 20 69 6e 20 61   -x    Open in a
1a4b0 20 73 70 72 65 61 64 73 68 65 65 74 22 2c 0a 20   spreadsheet",. 
1a4c0 20 22 2e 6f 70 65 6e 20 3f 4f 50 54 49 4f 4e 53   ".open ?OPTIONS
1a4d0 3f 20 3f 46 49 4c 45 3f 20 20 20 43 6c 6f 73 65  ? ?FILE?   Close
1a4e0 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
1a4f0 73 65 20 61 6e 64 20 72 65 6f 70 65 6e 20 46 49  se and reopen FI
1a500 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 4f 70 74  LE",.  "     Opt
1a510 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20  ions:",.  "     
1a520 20 20 20 2d 2d 61 70 70 65 6e 64 20 20 20 20 20     --append     
1a530 20 20 20 55 73 65 20 61 70 70 65 6e 64 76 66 73     Use appendvfs
1a540 20 74 6f 20 61 70 70 65 6e 64 20 64 61 74 61 62   to append datab
1a550 61 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ase to the end o
1a560 66 20 46 49 4c 45 22 2c 0a 23 69 66 64 65 66 20  f FILE",.#ifdef 
1a570 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
1a580 53 45 52 49 41 4c 49 5a 45 0a 20 20 22 20 20 20  SERIALIZE.  "   
1a590 20 20 20 20 20 2d 2d 64 65 73 65 72 69 61 6c 69       --deseriali
1a5a0 7a 65 20 20 20 4c 6f 61 64 20 69 6e 74 6f 20 6d  ze   Load into m
1a5b0 65 6d 6f 72 79 20 75 73 65 69 6e 67 20 73 71 6c  emory useing sql
1a5c0 69 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a 65  ite3_deserialize
1a5d0 28 29 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20  ()",.  "        
1a5e0 2d 2d 68 65 78 64 62 20 20 20 20 20 20 20 20 20  --hexdb         
1a5f0 4c 6f 61 64 20 74 68 65 20 6f 75 74 70 75 74 20  Load the output 
1a600 6f 66 20 5c 22 64 62 74 6f 74 78 74 5c 22 20 61  of \"dbtotxt\" a
1a610 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
1a620 61 74 61 62 61 73 65 22 2c 0a 23 65 6e 64 69 66  atabase",.#endif
1a630 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d 6e 65  .  "        --ne
1a640 77 20 20 20 20 20 20 20 20 20 20 20 49 6e 69 74  w           Init
1a650 69 61 6c 69 7a 65 20 46 49 4c 45 20 74 6f 20 61  ialize FILE to a
1a660 6e 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  n empty database
1a670 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d  ",.  "        --
1a680 72 65 61 64 6f 6e 6c 79 20 20 20 20 20 20 4f 70  readonly      Op
1a690 65 6e 20 46 49 4c 45 20 72 65 61 64 6f 6e 6c 79  en FILE readonly
1a6a0 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d  ",.  "        --
1a6b0 7a 69 70 20 20 20 20 20 20 20 20 20 20 20 46 49  zip           FI
1a6c0 4c 45 20 69 73 20 61 20 5a 49 50 20 61 72 63 68  LE is a ZIP arch
1a6d0 69 76 65 22 2c 0a 20 20 22 2e 6f 75 74 70 75 74  ive",.  ".output
1a6e0 20 3f 46 49 4c 45 3f 20 20 20 20 20 20 20 20 20   ?FILE?         
1a6f0 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f    Send output to
1a700 20 46 49 4c 45 20 6f 72 20 73 74 64 6f 75 74 20   FILE or stdout 
1a710 69 66 20 46 49 4c 45 20 69 73 20 6f 6d 69 74 74  if FILE is omitt
1a720 65 64 22 2c 0a 20 20 22 20 20 20 20 20 49 66 20  ed",.  "     If 
1a730 46 49 4c 45 20 62 65 67 69 6e 73 20 77 69 74 68  FILE begins with
1a740 20 27 7c 27 20 74 68 65 6e 20 6f 70 65 6e 20 69   '|' then open i
1a750 74 20 61 73 20 61 20 70 69 70 65 2e 22 2c 0a 20  t as a pipe.",. 
1a760 20 22 2e 70 72 69 6e 74 20 53 54 52 49 4e 47 2e   ".print STRING.
1a770 2e 2e 20 20 20 20 20 20 20 20 20 50 72 69 6e 74  ..         Print
1a780 20 6c 69 74 65 72 61 6c 20 53 54 52 49 4e 47 22   literal STRING"
1a790 2c 0a 20 20 22 2e 70 72 6f 6d 70 74 20 4d 41 49  ,.  ".prompt MAI
1a7a0 4e 20 43 4f 4e 54 49 4e 55 45 20 20 20 20 52 65  N CONTINUE    Re
1a7b0 70 6c 61 63 65 20 74 68 65 20 73 74 61 6e 64 61  place the standa
1a7c0 72 64 20 70 72 6f 6d 70 74 73 22 2c 0a 20 20 22  rd prompts",.  "
1a7d0 2e 71 75 69 74 20 20 20 20 20 20 20 20 20 20 20  .quit           
1a7e0 20 20 20 20 20 20 20 20 20 45 78 69 74 20 74 68           Exit th
1a7f0 69 73 20 70 72 6f 67 72 61 6d 22 2c 0a 20 20 22  is program",.  "
1a800 2e 72 65 61 64 20 46 49 4c 45 20 20 20 20 20 20  .read FILE      
1a810 20 20 20 20 20 20 20 20 20 52 65 61 64 20 69 6e           Read in
1a820 70 75 74 20 66 72 6f 6d 20 46 49 4c 45 22 2c 0a  put from FILE",.
1a830 20 20 22 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f    ".restore ?DB?
1a840 20 46 49 4c 45 20 20 20 20 20 20 20 52 65 73 74   FILE       Rest
1a850 6f 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 44  ore content of D
1a860 42 20 28 64 65 66 61 75 6c 74 20 5c 22 6d 61 69  B (default \"mai
1a870 6e 5c 22 29 20 66 72 6f 6d 20 46 49 4c 45 22 2c  n\") from FILE",
1a880 0a 20 20 22 2e 73 61 76 65 20 46 49 4c 45 20 20  .  ".save FILE  
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69               Wri
1a8a0 74 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  te in-memory dat
1a8b0 61 62 61 73 65 20 69 6e 74 6f 20 46 49 4c 45 22  abase into FILE"
1a8c0 2c 0a 20 20 22 2e 73 63 61 6e 73 74 61 74 73 20  ,.  ".scanstats 
1a8d0 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 54 75  on|off        Tu
1a8e0 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  rn sqlite3_stmt_
1a8f0 73 63 61 6e 73 74 61 74 75 73 28 29 20 6d 65 74  scanstatus() met
1a900 72 69 63 73 20 6f 6e 20 6f 72 20 6f 66 66 22 2c  rics on or off",
1a910 0a 20 20 22 2e 73 63 68 65 6d 61 20 3f 50 41 54  .  ".schema ?PAT
1a920 54 45 52 4e 3f 20 20 20 20 20 20 20 20 53 68 6f  TERN?        Sho
1a930 77 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  w the CREATE sta
1a940 74 65 6d 65 6e 74 73 20 6d 61 74 63 68 69 6e 67  tements matching
1a950 20 50 41 54 54 45 52 4e 22 2c 0a 20 20 22 20 20   PATTERN",.  "  
1a960 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20     Options:",.  
1a970 22 20 20 20 20 20 20 20 20 20 2d 2d 69 6e 64 65  "         --inde
1a980 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 54 72  nt            Tr
1a990 79 20 74 6f 20 70 72 65 74 74 79 2d 70 72 69 6e  y to pretty-prin
1a9a0 74 20 74 68 65 20 73 63 68 65 6d 61 22 2c 0a 20  t the schema",. 
1a9b0 20 22 2e 73 65 6c 66 74 65 73 74 20 3f 4f 50 54   ".selftest ?OPT
1a9c0 49 4f 4e 53 3f 20 20 20 20 20 20 52 75 6e 20 74  IONS?      Run t
1a9d0 65 73 74 73 20 64 65 66 69 6e 65 64 20 69 6e 20  ests defined in 
1a9e0 74 68 65 20 53 45 4c 46 54 45 53 54 20 74 61 62  the SELFTEST tab
1a9f0 6c 65 22 2c 0a 20 20 22 20 20 20 20 4f 70 74 69  le",.  "    Opti
1aa00 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20  ons:",.  "      
1aa10 20 2d 2d 69 6e 69 74 20 20 20 20 20 20 20 20 20   --init         
1aa20 20 20 20 20 20 20 43 72 65 61 74 65 20 61 20 6e        Create a n
1aa30 65 77 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c  ew SELFTEST tabl
1aa40 65 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 76  e",.  "       -v
1aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa60 20 20 20 56 65 72 62 6f 73 65 20 6f 75 74 70 75     Verbose outpu
1aa70 74 22 2c 0a 20 20 22 2e 73 65 70 61 72 61 74 6f  t",.  ".separato
1aa80 72 20 43 4f 4c 20 3f 52 4f 57 3f 20 20 20 20 20  r COL ?ROW?     
1aa90 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6c 75 6d  Change the colum
1aaa0 6e 20 61 6e 64 20 72 6f 77 20 73 65 70 61 72 61  n and row separa
1aab0 74 6f 72 73 22 2c 0a 23 69 66 20 64 65 66 69 6e  tors",.#if defin
1aac0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1aad0 5f 53 45 53 53 49 4f 4e 29 0a 20 20 22 2e 73 65  _SESSION).  ".se
1aae0 73 73 69 6f 6e 20 3f 4e 41 4d 45 3f 20 43 4d 44  ssion ?NAME? CMD
1aaf0 20 2e 2e 2e 20 20 43 72 65 61 74 65 20 6f 72 20   ...  Create or 
1ab00 63 6f 6e 74 72 6f 6c 20 73 65 73 73 69 6f 6e 73  control sessions
1ab10 22 2c 0a 20 20 22 20 20 20 53 75 62 63 6f 6d 6d  ",.  "   Subcomm
1ab20 61 6e 64 73 3a 22 2c 0a 20 20 22 20 20 20 20 20  ands:",.  "     
1ab30 61 74 74 61 63 68 20 54 41 42 4c 45 20 20 20 20  attach TABLE    
1ab40 20 20 20 20 20 20 20 20 20 41 74 74 61 63 68 20           Attach 
1ab50 54 41 42 4c 45 22 2c 0a 20 20 22 20 20 20 20 20  TABLE",.  "     
1ab60 63 68 61 6e 67 65 73 65 74 20 46 49 4c 45 20 20  changeset FILE  
1ab70 20 20 20 20 20 20 20 20 20 57 72 69 74 65 20 61           Write a
1ab80 20 63 68 61 6e 67 65 73 65 74 20 69 6e 74 6f 20   changeset into 
1ab90 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 63  FILE",.  "     c
1aba0 6c 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20  lose            
1abb0 20 20 20 20 20 20 20 20 43 6c 6f 73 65 20 6f 6e          Close on
1abc0 65 20 73 65 73 73 69 6f 6e 22 2c 0a 20 20 22 20  e session",.  " 
1abd0 20 20 20 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c      enable ?BOOL
1abe0 45 41 4e 3f 20 20 20 20 20 20 20 20 20 53 65 74  EAN?         Set
1abf0 20 6f 72 20 71 75 65 72 79 20 74 68 65 20 65 6e   or query the en
1ac00 61 62 6c 65 20 62 69 74 22 2c 0a 20 20 22 20 20  able bit",.  "  
1ac10 20 20 20 66 69 6c 74 65 72 20 47 4c 4f 42 2e 2e     filter GLOB..
1ac20 2e 20 20 20 20 20 20 20 20 20 20 20 52 65 6a 65  .           Reje
1ac30 63 74 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69  ct tables matchi
1ac40 6e 67 20 47 4c 4f 42 73 22 2c 0a 20 20 22 20 20  ng GLOBs",.  "  
1ac50 20 20 20 69 6e 64 69 72 65 63 74 20 3f 42 4f 4f     indirect ?BOO
1ac60 4c 45 41 4e 3f 20 20 20 20 20 20 20 4d 61 72 6b  LEAN?       Mark
1ac70 20 6f 72 20 71 75 65 72 79 20 74 68 65 20 69 6e   or query the in
1ac80 64 69 72 65 63 74 20 73 74 61 74 75 73 22 2c 0a  direct status",.
1ac90 20 20 22 20 20 20 20 20 69 73 65 6d 70 74 79 20    "     isempty 
1aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acb0 20 51 75 65 72 79 20 77 68 65 74 68 65 72 20 74   Query whether t
1acc0 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20 65 6d  he session is em
1acd0 70 74 79 22 2c 0a 20 20 22 20 20 20 20 20 6c 69  pty",.  "     li
1ace0 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
1acf0 20 20 20 20 20 20 20 4c 69 73 74 20 63 75 72 72         List curr
1ad00 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73 73 69  ently open sessi
1ad10 6f 6e 20 6e 61 6d 65 73 22 2c 0a 20 20 22 20 20  on names",.  "  
1ad20 20 20 20 6f 70 65 6e 20 44 42 20 4e 41 4d 45 20     open DB NAME 
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 4f 70 65 6e              Open
1ad40 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 6f   a new session o
1ad50 6e 20 44 42 22 2c 0a 20 20 22 20 20 20 20 20 70  n DB",.  "     p
1ad60 61 74 63 68 73 65 74 20 46 49 4c 45 20 20 20 20  atchset FILE    
1ad70 20 20 20 20 20 20 20 20 57 72 69 74 65 20 61 20          Write a 
1ad80 70 61 74 63 68 73 65 74 20 69 6e 74 6f 20 46 49  patchset into FI
1ad90 4c 45 22 2c 0a 20 20 22 20 20 20 49 66 20 3f 4e  LE",.  "   If ?N
1ada0 41 4d 45 3f 20 69 73 20 6f 6d 69 74 74 65 64 2c  AME? is omitted,
1adb0 20 74 68 65 20 66 69 72 73 74 20 64 65 66 69 6e   the first defin
1adc0 65 64 20 73 65 73 73 69 6f 6e 20 69 73 20 75 73  ed session is us
1add0 65 64 2e 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22  ed.",.#endif.  "
1ade0 2e 73 68 61 33 73 75 6d 20 2e 2e 2e 20 20 20 20  .sha3sum ...    
1adf0 20 20 20 20 20 20 20 20 20 43 6f 6d 70 75 74 65           Compute
1ae00 20 61 20 53 48 41 33 20 68 61 73 68 20 6f 66 20   a SHA3 hash of 
1ae10 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
1ae20 22 2c 0a 20 20 22 20 20 20 20 4f 70 74 69 6f 6e  ",.  "    Option
1ae30 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d  s:",.  "      --
1ae40 73 63 68 65 6d 61 20 20 20 20 20 20 20 20 20 20  schema          
1ae50 20 20 20 20 41 6c 73 6f 20 68 61 73 68 20 74 68      Also hash th
1ae60 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
1ae70 74 61 62 6c 65 22 2c 0a 20 20 22 20 20 20 20 20  table",.  "     
1ae80 20 2d 2d 73 68 61 33 2d 32 32 34 20 20 20 20 20   --sha3-224     
1ae90 20 20 20 20 20 20 20 55 73 65 20 74 68 65 20 73         Use the s
1aea0 68 61 33 2d 32 32 34 20 61 6c 67 6f 72 69 74 68  ha3-224 algorith
1aeb0 6d 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73  m",.  "      --s
1aec0 68 61 33 2d 32 35 36 20 20 20 20 20 20 20 20 20  ha3-256         
1aed0 20 20 20 55 73 65 20 74 68 65 20 73 68 61 33 2d     Use the sha3-
1aee0 32 35 36 20 61 6c 67 6f 72 69 74 68 6d 2e 20 20  256 algorithm.  
1aef0 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
1af00 75 6c 74 2e 22 2c 0a 20 20 22 20 20 20 20 20 20  ult.",.  "      
1af10 2d 2d 73 68 61 33 2d 33 38 34 20 20 20 20 20 20  --sha3-384      
1af20 20 20 20 20 20 20 55 73 65 20 74 68 65 20 73 68        Use the sh
1af30 61 33 2d 33 38 34 20 61 6c 67 6f 72 69 74 68 6d  a3-384 algorithm
1af40 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73 68  ",.  "      --sh
1af50 61 33 2d 35 31 32 20 20 20 20 20 20 20 20 20 20  a3-512          
1af60 20 20 55 73 65 20 74 68 65 20 73 68 61 33 2d 35    Use the sha3-5
1af70 31 32 20 61 6c 67 6f 72 69 74 68 6d 22 2c 0a 20  12 algorithm",. 
1af80 20 22 20 20 20 20 41 6e 79 20 6f 74 68 65 72 20   "    Any other 
1af90 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 4c 49  argument is a LI
1afa0 4b 45 20 70 61 74 74 65 72 6e 20 66 6f 72 20 74  KE pattern for t
1afb0 61 62 6c 65 73 20 74 6f 20 68 61 73 68 22 2c 0a  ables to hash",.
1afc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
1afd0 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 22  OHAVE_SYSTEM.  "
1afe0 2e 73 68 65 6c 6c 20 43 4d 44 20 41 52 47 53 2e  .shell CMD ARGS.
1aff0 2e 2e 20 20 20 20 20 20 20 52 75 6e 20 43 4d 44  ..       Run CMD
1b000 20 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79   ARGS... in a sy
1b010 73 74 65 6d 20 73 68 65 6c 6c 22 2c 0a 23 65 6e  stem shell",.#en
1b020 64 69 66 0a 20 20 22 2e 73 68 6f 77 20 20 20 20  dif.  ".show    
1b030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b040 53 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  Show the current
1b050 20 76 61 6c 75 65 73 20 66 6f 72 20 76 61 72 69   values for vari
1b060 6f 75 73 20 73 65 74 74 69 6e 67 73 22 2c 0a 20  ous settings",. 
1b070 20 22 2e 73 74 61 74 73 20 3f 6f 6e 7c 6f 66 66   ".stats ?on|off
1b080 3f 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20  ?          Show 
1b090 73 74 61 74 73 20 6f 72 20 74 75 72 6e 20 73 74  stats or turn st
1b0a0 61 74 73 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a  ats on or off",.
1b0b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
1b0c0 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 22  OHAVE_SYSTEM.  "
1b0d0 2e 73 79 73 74 65 6d 20 43 4d 44 20 41 52 47 53  .system CMD ARGS
1b0e0 2e 2e 2e 20 20 20 20 20 20 52 75 6e 20 43 4d 44  ...      Run CMD
1b0f0 20 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79   ARGS... in a sy
1b100 73 74 65 6d 20 73 68 65 6c 6c 22 2c 0a 23 65 6e  stem shell",.#en
1b110 64 69 66 0a 20 20 22 2e 74 61 62 6c 65 73 20 3f  dif.  ".tables ?
1b120 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20 20 20  TABLE?          
1b130 4c 69 73 74 20 6e 61 6d 65 73 20 6f 66 20 74 61  List names of ta
1b140 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 4c 49  bles matching LI
1b150 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45  KE pattern TABLE
1b160 22 2c 0a 20 20 22 2e 74 65 73 74 63 61 73 65 20  ",.  ".testcase 
1b170 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 20 42  NAME           B
1b180 65 67 69 6e 20 72 65 64 69 72 65 63 74 69 6e 67  egin redirecting
1b190 20 6f 75 74 70 75 74 20 74 6f 20 27 74 65 73 74   output to 'test
1b1a0 63 61 73 65 2d 6f 75 74 2e 74 78 74 27 22 2c 0a  case-out.txt'",.
1b1b0 20 20 22 2e 74 69 6d 65 6f 75 74 20 4d 53 20 20    ".timeout MS  
1b1c0 20 20 20 20 20 20 20 20 20 20 20 20 54 72 79 20              Try 
1b1d0 6f 70 65 6e 69 6e 67 20 6c 6f 63 6b 65 64 20 74  opening locked t
1b1e0 61 62 6c 65 73 20 66 6f 72 20 4d 53 20 6d 69 6c  ables for MS mil
1b1f0 6c 69 73 65 63 6f 6e 64 73 22 2c 0a 20 20 22 2e  liseconds",.  ".
1b200 74 69 6d 65 72 20 6f 6e 7c 6f 66 66 20 20 20 20  timer on|off    
1b210 20 20 20 20 20 20 20 20 54 75 72 6e 20 53 51 4c          Turn SQL
1b220 20 74 69 6d 65 72 20 6f 6e 20 6f 72 20 6f 66 66   timer on or off
1b230 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ",.#ifndef SQLIT
1b240 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 22  E_OMIT_TRACE.  "
1b250 2e 74 72 61 63 65 20 3f 4f 50 54 49 4f 4e 53 3f  .trace ?OPTIONS?
1b260 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20           Output 
1b270 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
1b280 6e 74 20 61 73 20 69 74 20 69 73 20 72 75 6e 22  nt as it is run"
1b290 2c 0a 20 20 22 20 20 20 20 46 49 4c 45 20 20 20  ,.  "    FILE   
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2b0 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20   Send output to 
1b2c0 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 20 73 74  FILE",.  "    st
1b2d0 64 6f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  dout            
1b2e0 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75        Send outpu
1b2f0 74 20 74 6f 20 73 74 64 6f 75 74 22 2c 0a 20 20  t to stdout",.  
1b300 22 20 20 20 20 73 74 64 65 72 72 20 20 20 20 20  "    stderr     
1b310 20 20 20 20 20 20 20 20 20 20 20 20 20 53 65 6e               Sen
1b320 64 20 6f 75 74 70 75 74 20 74 6f 20 73 74 64 65  d output to stde
1b330 72 72 22 2c 0a 20 20 22 20 20 20 20 6f 66 66 20  rr",.  "    off 
1b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b350 20 20 20 20 44 69 73 61 62 6c 65 20 74 72 61 63      Disable trac
1b360 69 6e 67 22 2c 0a 20 20 22 20 20 20 20 2d 2d 65  ing",.  "    --e
1b370 78 70 61 6e 64 65 64 20 20 20 20 20 20 20 20 20  xpanded         
1b380 20 20 20 20 20 45 78 70 61 6e 64 20 71 75 65 72       Expand quer
1b390 79 20 70 61 72 61 6d 65 74 65 72 73 22 2c 0a 23  y parameters",.#
1b3a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1b3b0 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20  BLE_NORMALIZE.  
1b3c0 22 20 20 20 20 2d 2d 6e 6f 72 6d 61 6c 69 7a 65  "    --normalize
1b3d0 64 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f 72  d            Nor
1b3e0 6d 61 6c 20 74 68 65 20 53 51 4c 20 73 74 61 74  mal the SQL stat
1b3f0 65 6d 65 6e 74 73 22 2c 0a 23 65 6e 64 69 66 0a  ements",.#endif.
1b400 20 20 22 20 20 20 20 2d 2d 70 6c 61 69 6e 20 20    "    --plain  
1b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1b420 68 6f 77 20 53 51 4c 20 61 73 20 69 74 20 69 73  how SQL as it is
1b430 20 69 6e 70 75 74 22 2c 0a 20 20 22 20 20 20 20   input",.  "    
1b440 2d 2d 73 74 6d 74 20 20 20 20 20 20 20 20 20 20  --stmt          
1b450 20 20 20 20 20 20 20 20 54 72 61 63 65 20 73 74          Trace st
1b460 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 69 6f  atement executio
1b470 6e 20 28 53 51 4c 49 54 45 5f 54 52 41 43 45 5f  n (SQLITE_TRACE_
1b480 53 54 4d 54 29 22 2c 0a 20 20 22 20 20 20 20 2d  STMT)",.  "    -
1b490 2d 70 72 6f 66 69 6c 65 20 20 20 20 20 20 20 20  -profile        
1b4a0 20 20 20 20 20 20 20 50 72 6f 66 69 6c 65 20 73         Profile s
1b4b0 74 61 74 65 6d 65 6e 74 73 20 28 53 51 4c 49 54  tatements (SQLIT
1b4c0 45 5f 54 52 41 43 45 5f 50 52 4f 46 49 4c 45 29  E_TRACE_PROFILE)
1b4d0 22 2c 0a 20 20 22 20 20 20 20 2d 2d 72 6f 77 20  ",.  "    --row 
1b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4f0 20 20 54 72 61 63 65 20 65 61 63 68 20 72 6f 77    Trace each row
1b500 20 28 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 52   (SQLITE_TRACE_R
1b510 4f 57 29 22 2c 0a 20 20 22 20 20 20 20 2d 2d 63  OW)",.  "    --c
1b520 6c 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20  lose            
1b530 20 20 20 20 20 54 72 61 63 65 20 63 6f 6e 6e 65       Trace conne
1b540 63 74 69 6f 6e 20 63 6c 6f 73 65 20 28 53 51 4c  ction close (SQL
1b550 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 29  ITE_TRACE_CLOSE)
1b560 22 2c 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  ",.#endif /* SQL
1b570 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a  ITE_OMIT_TRACE *
1b580 2f 0a 20 20 22 2e 76 66 73 69 6e 66 6f 20 3f 41  /.  ".vfsinfo ?A
1b590 55 58 3f 20 20 20 20 20 20 20 20 20 20 20 49 6e  UX?           In
1b5a0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
1b5b0 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56 46  the top-level VF
1b5c0 53 22 2c 0a 20 20 22 2e 76 66 73 6c 69 73 74 20  S",.  ".vfslist 
1b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5e0 4c 69 73 74 20 61 6c 6c 20 61 76 61 69 6c 61 62  List all availab
1b5f0 6c 65 20 56 46 53 65 73 22 2c 0a 20 20 22 2e 76  le VFSes",.  ".v
1b600 66 73 6e 61 6d 65 20 3f 41 55 58 3f 20 20 20 20  fsname ?AUX?    
1b610 20 20 20 20 20 20 20 50 72 69 6e 74 20 74 68 65         Print the
1b620 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53   name of the VFS
1b630 20 73 74 61 63 6b 22 2c 0a 20 20 22 2e 77 69 64   stack",.  ".wid
1b640 74 68 20 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e 2e  th NUM1 NUM2 ...
1b650 20 20 20 20 20 53 65 74 20 63 6f 6c 75 6d 6e 20       Set column 
1b660 77 69 64 74 68 73 20 66 6f 72 20 5c 22 63 6f 6c  widths for \"col
1b670 75 6d 6e 5c 22 20 6d 6f 64 65 22 2c 0a 20 20 22  umn\" mode",.  "
1b680 20 20 20 20 20 4e 65 67 61 74 69 76 65 20 76 61       Negative va
1b690 6c 75 65 73 20 72 69 67 68 74 2d 6a 75 73 74 69  lues right-justi
1b6a0 66 79 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f  fy",.};../*.** O
1b6b0 75 74 70 75 74 20 68 65 6c 70 20 74 65 78 74 2e  utput help text.
1b6c0 0a 2a 2a 0a 2a 2a 20 7a 50 61 74 74 65 72 6e 20  .**.** zPattern 
1b6d0 64 65 73 63 72 69 62 65 73 20 74 68 65 20 73 65  describes the se
1b6e0 74 20 6f 66 20 63 6f 6d 6d 61 6e 64 73 20 66 6f  t of commands fo
1b6f0 72 20 77 68 69 63 68 20 68 65 6c 70 20 74 65 78  r which help tex
1b700 74 20 69 73 20 70 72 6f 76 69 64 65 64 2e 0a 2a  t is provided..*
1b710 2a 20 49 66 20 7a 50 61 74 74 65 72 6e 20 69 73  * If zPattern is
1b720 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 73 68 6f 77   NULL, then show
1b730 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73 2c 20 62   all commands, b
1b740 75 74 20 6f 6e 6c 79 20 67 69 76 65 20 61 20 6f  ut only give a o
1b750 6e 65 2d 6c 69 6e 65 0a 2a 2a 20 64 65 73 63 72  ne-line.** descr
1b760 69 70 74 69 6f 6e 20 6f 66 20 65 61 63 68 2e 0a  iption of each..
1b770 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
1b780 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   number of match
1b790 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
1b7a0 74 20 73 68 6f 77 48 65 6c 70 28 46 49 4c 45 20  t showHelp(FILE 
1b7b0 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  *out, const char
1b7c0 20 2a 7a 50 61 74 74 65 72 6e 29 7b 0a 20 20 69   *zPattern){.  i
1b7d0 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt i = 0;.  int 
1b7e0 6a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d  j = 0;.  int n =
1b7f0 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 74   0;.  char *zPat
1b800 3b 0a 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e  ;.  if( zPattern
1b810 3d 3d 30 0a 20 20 20 7c 7c 20 7a 50 61 74 74 65  ==0.   || zPatte
1b820 72 6e 5b 30 5d 3d 3d 27 30 27 0a 20 20 20 7c 7c  rn[0]=='0'.   ||
1b830 20 73 74 72 63 6d 70 28 7a 50 61 74 74 65 72 6e   strcmp(zPattern
1b840 2c 22 2d 61 22 29 3d 3d 30 0a 20 20 20 7c 7c 20  ,"-a")==0.   || 
1b850 73 74 72 63 6d 70 28 7a 50 61 74 74 65 72 6e 2c  strcmp(zPattern,
1b860 22 2d 61 6c 6c 22 29 3d 3d 30 0a 20 20 29 7b 0a  "-all")==0.  ){.
1b870 20 20 20 20 2f 2a 20 53 68 6f 77 20 61 6c 6c 20      /* Show all 
1b880 63 6f 6d 6d 61 6e 64 73 2c 20 62 75 74 20 6f 6e  commands, but on
1b890 6c 79 20 6f 6e 65 20 6c 69 6e 65 20 70 65 72 20  ly one line per 
1b8a0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69  command */.    i
1b8b0 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d 30 20 29  f( zPattern==0 )
1b8c0 20 7a 50 61 74 74 65 72 6e 20 3d 20 22 22 3b 0a   zPattern = "";.
1b8d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
1b8e0 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29  rraySize(azHelp)
1b8f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
1b900 28 20 61 7a 48 65 6c 70 5b 69 5d 5b 30 5d 3d 3d  ( azHelp[i][0]==
1b910 27 2e 27 20 7c 7c 20 7a 50 61 74 74 65 72 6e 5b  '.' || zPattern[
1b920 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  0] ){.        ut
1b930 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
1b940 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 69 5d  %s\n", azHelp[i]
1b950 29 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a  );.        n++;.
1b960 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b970 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4c 6f  }else{.    /* Lo
1b980 6f 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 73 20  ok for commands 
1b990 74 68 61 74 20 66 6f 72 20 77 68 69 63 68 20 7a  that for which z
1b9a0 50 61 74 74 65 72 6e 20 69 73 20 61 6e 20 65 78  Pattern is an ex
1b9b0 61 63 74 20 70 72 65 66 69 78 20 2a 2f 0a 20 20  act prefix */.  
1b9c0 20 20 7a 50 61 74 20 3d 20 73 71 6c 69 74 65 33    zPat = sqlite3
1b9d0 5f 6d 70 72 69 6e 74 66 28 22 2e 25 73 2a 22 2c  _mprintf(".%s*",
1b9e0 20 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20   zPattern);.    
1b9f0 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
1ba00 53 69 7a 65 28 61 7a 48 65 6c 70 29 3b 20 69 2b  Size(azHelp); i+
1ba10 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
1ba20 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 50  lite3_strglob(zP
1ba30 61 74 2c 20 61 7a 48 65 6c 70 5b 69 5d 29 3d 3d  at, azHelp[i])==
1ba40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
1ba50 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
1ba60 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 69 5d 29  s\n", azHelp[i])
1ba70 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 69 2b  ;.        j = i+
1ba80 31 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a  1;.        n++;.
1ba90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1baa0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1bab0 50 61 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 20  Pat);.    if( n 
1bac0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  ){.      if( n==
1bad0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  1 ){.        /* 
1bae0 77 68 65 6e 20 7a 50 61 74 74 65 72 6e 20 69 73  when zPattern is
1baf0 20 61 20 70 72 65 66 69 78 20 6f 66 20 65 78 61   a prefix of exa
1bb00 63 74 6c 79 20 6f 6e 65 20 63 6f 6d 6d 61 6e 64  ctly one command
1bb10 2c 20 74 68 65 6e 20 69 6e 63 6c 75 64 65 20 74  , then include t
1bb20 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 65  he.        ** de
1bb30 74 61 69 6c 73 20 6f 66 20 74 68 61 74 20 63 6f  tails of that co
1bb40 6d 6d 61 6e 64 2c 20 77 68 69 63 68 20 73 68 6f  mmand, which sho
1bb50 75 6c 64 20 62 65 67 69 6e 20 61 74 20 6f 66 66  uld begin at off
1bb60 73 65 74 20 6a 20 2a 2f 0a 20 20 20 20 20 20 20  set j */.       
1bb70 20 77 68 69 6c 65 28 20 6a 3c 41 72 72 61 79 53   while( j<ArrayS
1bb80 69 7a 65 28 61 7a 48 65 6c 70 29 2d 31 20 26 26  ize(azHelp)-1 &&
1bb90 20 61 7a 48 65 6c 70 5b 6a 5d 5b 30 5d 21 3d 27   azHelp[j][0]!='
1bba0 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .' ){.          
1bbb0 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
1bbc0 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b   "%s\n", azHelp[
1bbd0 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a  j]);.          j
1bbe0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
1bbf0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
1bc00 72 6e 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn n;.    }.    
1bc10 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 63 6f 6d 6d  /* Look for comm
1bc20 61 6e 64 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ands that contai
1bc30 6e 20 7a 50 61 74 74 65 72 6e 20 61 6e 79 77 68  n zPattern anywh
1bc40 65 72 65 2e 20 20 53 68 6f 77 20 74 68 65 20 63  ere.  Show the c
1bc50 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 74  omplete.    ** t
1bc60 65 78 74 20 6f 66 20 61 6c 6c 20 63 6f 6d 6d 61  ext of all comma
1bc70 6e 64 73 20 74 68 61 74 20 6d 61 74 63 68 2e 20  nds that match. 
1bc80 2a 2f 0a 20 20 20 20 7a 50 61 74 20 3d 20 73 71  */.    zPat = sq
1bc90 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
1bca0 25 25 73 25 25 22 2c 20 7a 50 61 74 74 65 72 6e  %%s%%", zPattern
1bcb0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1bcc0 69 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65  i<ArraySize(azHe
1bcd0 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  lp); i++){.     
1bce0 20 69 66 28 20 61 7a 48 65 6c 70 5b 69 5d 5b 30   if( azHelp[i][0
1bcf0 5d 3d 3d 27 2e 27 20 29 20 6a 20 3d 20 69 3b 0a  ]=='.' ) j = i;.
1bd00 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1bd10 33 5f 73 74 72 6c 69 6b 65 28 7a 50 61 74 2c 20  3_strlike(zPat, 
1bd20 61 7a 48 65 6c 70 5b 69 5d 2c 20 30 29 3d 3d 30  azHelp[i], 0)==0
1bd30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
1bd40 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
1bd50 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b  \n", azHelp[j]);
1bd60 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
1bd70 6a 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65  j<ArraySize(azHe
1bd80 6c 70 29 2d 31 20 26 26 20 61 7a 48 65 6c 70 5b  lp)-1 && azHelp[
1bd90 6a 2b 31 5d 5b 30 5d 21 3d 27 2e 27 20 29 7b 0a  j+1][0]!='.' ){.
1bda0 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
1bdb0 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
1bdc0 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22  intf(out, "%s\n"
1bdd0 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20  , azHelp[j]);.  
1bde0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1bdf0 69 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6e  i = j;.        n
1be00 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1be10 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
1be20 65 65 28 7a 50 61 74 29 3b 0a 20 20 7d 0a 20 20  ee(zPat);.  }.  
1be30 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 20  return n;.}../* 
1be40 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1be50 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
1be60 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 53 68  process_input(Sh
1be70 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 46 49 4c  ellState *p, FIL
1be80 45 20 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52  E *in);../*.** R
1be90 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
1bea0 6f 66 20 66 69 6c 65 20 7a 4e 61 6d 65 20 69 6e  of file zName in
1beb0 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
1bec0 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
1bed0 6d 61 6c 6c 6f 63 36 34 28 29 0a 2a 2a 20 61 6e  malloc64().** an
1bee0 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
1bef0 65 72 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  er to the buffer
1bf00 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20  . The caller is 
1bf10 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
1bf20 66 72 65 65 69 6e 67 0a 2a 2a 20 74 68 65 20 6d  freeing.** the m
1bf30 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  emory..**.** If 
1bf40 70 61 72 61 6d 65 74 65 72 20 70 6e 42 79 74 65  parameter pnByte
1bf50 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 28 2a   is not NULL, (*
1bf60 70 6e 42 79 74 65 29 20 69 73 20 73 65 74 20 74  pnByte) is set t
1bf70 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1bf80 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e 0a 2a  bytes.** read..*
1bf90 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 76 65 6e 69  *.** For conveni
1bfa0 65 6e 63 65 2c 20 61 20 6e 75 6c 2d 74 65 72 6d  ence, a nul-term
1bfb0 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61  inator byte is a
1bfc0 6c 77 61 79 73 20 61 70 70 65 6e 64 65 64 20 74  lways appended t
1bfd0 6f 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a  o the data read.
1bfe0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** from the file
1bff0 20 62 65 66 6f 72 65 20 74 68 65 20 62 75 66 66   before the buff
1c000 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  er is returned. 
1c010 54 68 69 73 20 62 79 74 65 20 69 73 20 6e 6f 74  This byte is not
1c020 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 2a 2a 20   included in.** 
1c030 74 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20  the final value 
1c040 6f 66 20 28 2a 70 6e 42 79 74 65 29 2c 20 69 66  of (*pnByte), if
1c050 20 61 70 70 6c 69 63 61 62 6c 65 2e 0a 2a 2a 0a   applicable..**.
1c060 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  ** NULL is retur
1c070 6e 65 64 20 69 66 20 61 6e 79 20 65 72 72 6f 72  ned if any error
1c080 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e   is encountered.
1c090 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65   The final value
1c0a0 20 6f 66 20 2a 70 6e 42 79 74 65 0a 2a 2a 20 69   of *pnByte.** i
1c0b0 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  s undefined in t
1c0c0 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61  his case..*/.sta
1c0d0 74 69 63 20 63 68 61 72 20 2a 72 65 61 64 46 69  tic char *readFi
1c0e0 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  le(const char *z
1c0f0 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e 42 79 74  Name, int *pnByt
1c100 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 20 3d  e){.  FILE *in =
1c110 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22 72   fopen(zName, "r
1c120 62 22 29 3b 0a 20 20 6c 6f 6e 67 20 6e 49 6e 3b  b");.  long nIn;
1c130 0a 20 20 73 69 7a 65 5f 74 20 6e 52 65 61 64 3b  .  size_t nRead;
1c140 0a 20 20 63 68 61 72 20 2a 70 42 75 66 3b 0a 20  .  char *pBuf;. 
1c150 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74   if( in==0 ) ret
1c160 75 72 6e 20 30 3b 0a 20 20 66 73 65 65 6b 28 69  urn 0;.  fseek(i
1c170 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44 29 3b  n, 0, SEEK_END);
1c180 0a 20 20 6e 49 6e 20 3d 20 66 74 65 6c 6c 28 69  .  nIn = ftell(i
1c190 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28 69 6e 29  n);.  rewind(in)
1c1a0 3b 0a 20 20 70 42 75 66 20 3d 20 73 71 6c 69 74  ;.  pBuf = sqlit
1c1b0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 49 6e  e3_malloc64( nIn
1c1c0 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66  +1 );.  if( pBuf
1c1d0 3d 3d 30 20 29 7b 20 66 63 6c 6f 73 65 28 69 6e  ==0 ){ fclose(in
1c1e0 29 3b 20 72 65 74 75 72 6e 20 30 3b 20 7d 0a 20  ); return 0; }. 
1c1f0 20 6e 52 65 61 64 20 3d 20 66 72 65 61 64 28 70   nRead = fread(p
1c200 42 75 66 2c 20 6e 49 6e 2c 20 31 2c 20 69 6e 29  Buf, nIn, 1, in)
1c210 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a  ;.  fclose(in);.
1c220 20 20 69 66 28 20 6e 52 65 61 64 21 3d 31 20 29    if( nRead!=1 )
1c230 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1c240 65 65 28 70 42 75 66 29 3b 0a 20 20 20 20 72 65  ee(pBuf);.    re
1c250 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 42  turn 0;.  }.  pB
1c260 75 66 5b 6e 49 6e 5d 20 3d 20 30 3b 0a 20 20 69  uf[nIn] = 0;.  i
1c270 66 28 20 70 6e 42 79 74 65 20 29 20 2a 70 6e 42  f( pnByte ) *pnB
1c280 79 74 65 20 3d 20 6e 49 6e 3b 0a 20 20 72 65 74  yte = nIn;.  ret
1c290 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 23 69 66  urn pBuf;.}..#if
1c2a0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1c2b0 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
1c2c0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 73 69  /*.** Close a si
1c2d0 6e 67 6c 65 20 4f 70 65 6e 53 65 73 73 69 6f 6e  ngle OpenSession
1c2e0 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 6c 65   object and rele
1c2f0 61 73 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 61  ase all of its a
1c300 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 72 65 73  ssociated.** res
1c310 6f 75 72 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ources..*/.stati
1c320 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f 63  c void session_c
1c330 6c 6f 73 65 28 4f 70 65 6e 53 65 73 73 69 6f 6e  lose(OpenSession
1c340 20 2a 70 53 65 73 73 69 6f 6e 29 7b 0a 20 20 69   *pSession){.  i
1c350 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 73  nt i;.  sqlite3s
1c360 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65 28 70 53  ession_delete(pS
1c370 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20 73 71  ession->p);.  sq
1c380 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73  lite3_free(pSess
1c390 69 6f 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66  ion->zName);.  f
1c3a0 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73 73 69  or(i=0; i<pSessi
1c3b0 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b  on->nFilter; i++
1c3c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
1c3d0 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a  ree(pSession->az
1c3e0 46 69 6c 74 65 72 5b 69 5d 29 3b 0a 20 20 7d 0a  Filter[i]);.  }.
1c3f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1c400 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
1c410 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 53 65  r);.  memset(pSe
1c420 73 73 69 6f 6e 2c 20 30 2c 20 73 69 7a 65 6f 66  ssion, 0, sizeof
1c430 28 4f 70 65 6e 53 65 73 73 69 6f 6e 29 29 3b 0a  (OpenSession));.
1c440 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1c450 43 6c 6f 73 65 20 61 6c 6c 20 4f 70 65 6e 53 65  Close all OpenSe
1c460 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73 20 61 6e  ssion objects an
1c470 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 61 73  d release all as
1c480 73 6f 63 69 61 74 65 64 20 72 65 73 6f 75 72 63  sociated resourc
1c490 65 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  es..*/.#if defin
1c4a0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1c4b0 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61 74 69 63  _SESSION).static
1c4c0 20 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f 63 6c   void session_cl
1c4d0 6f 73 65 5f 61 6c 6c 28 53 68 65 6c 6c 53 74 61  ose_all(ShellSta
1c4e0 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  te *p){.  int i;
1c4f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
1c500 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b  >nSession; i++){
1c510 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f  .    session_clo
1c520 73 65 28 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b  se(&p->aSession[
1c530 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 53  i]);.  }.  p->nS
1c540 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 7d 0a 23 65  ession = 0;.}.#e
1c550 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65 73  lse.# define ses
1c560 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 58  sion_close_all(X
1c570 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1c580 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
1c590 66 20 74 68 65 20 78 46 69 6c 74 65 72 20 66 75  f the xFilter fu
1c5a0 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 6f 70  nction for an op
1c5b0 65 6e 20 73 65 73 73 69 6f 6e 2e 20 20 4f 6d 69  en session.  Omi
1c5c0 74 0a 2a 2a 20 61 6e 79 20 74 61 62 6c 65 73 20  t.** any tables 
1c5d0 6e 61 6d 65 64 20 62 79 20 22 2e 73 65 73 73 69  named by ".sessi
1c5e0 6f 6e 20 66 69 6c 74 65 72 22 20 62 75 74 20 6c  on filter" but l
1c5f0 65 74 20 61 6c 6c 20 6f 74 68 65 72 20 74 61 62  et all other tab
1c600 6c 65 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 23  le through..*/.#
1c610 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1c620 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e  E_ENABLE_SESSION
1c630 29 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73  ).static int ses
1c640 73 69 6f 6e 5f 66 69 6c 74 65 72 28 76 6f 69 64  sion_filter(void
1c650 20 2a 70 43 74 78 2c 20 63 6f 6e 73 74 20 63 68   *pCtx, const ch
1c660 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20 4f 70 65  ar *zTab){.  Ope
1c670 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69  nSession *pSessi
1c680 6f 6e 20 3d 20 28 4f 70 65 6e 53 65 73 73 69 6f  on = (OpenSessio
1c690 6e 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74 20 69  n*)pCtx;.  int i
1c6a0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1c6b0 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72  Session->nFilter
1c6c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1c6d0 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
1c6e0 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74  pSession->azFilt
1c6f0 65 72 5b 69 5d 2c 20 7a 54 61 62 29 3d 3d 30 20  er[i], zTab)==0 
1c700 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1c710 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
1c720 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  ndif../*.** Try 
1c730 74 6f 20 64 65 64 75 63 65 20 74 68 65 20 74 79  to deduce the ty
1c740 70 65 20 6f 66 20 66 69 6c 65 20 66 6f 72 20 7a  pe of file for z
1c750 4e 61 6d 65 20 62 61 73 65 64 20 6f 6e 20 69 74  Name based on it
1c760 73 20 63 6f 6e 74 65 6e 74 2e 20 20 52 65 74 75  s content.  Retu
1c770 72 6e 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  rn.** one of the
1c780 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 2a 20 63 6f   SHELL_OPEN_* co
1c790 6e 73 74 61 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49  nstants..**.** I
1c7a0 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  f the file does 
1c7b0 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 69 73 20  not exist or is 
1c7c0 65 6d 70 74 79 20 62 75 74 20 69 74 73 20 6e 61  empty but its na
1c7d0 6d 65 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  me looks like a 
1c7e0 5a 49 50 0a 2a 2a 20 61 72 63 68 69 76 65 20 61  ZIP.** archive a
1c7f0 6e 64 20 74 68 65 20 64 66 6c 74 5a 69 70 20 66  nd the dfltZip f
1c800 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
1c810 6e 20 61 73 73 75 6d 65 20 69 74 20 69 73 20 61  n assume it is a
1c820 20 5a 49 50 20 61 72 63 68 69 76 65 2e 0a 2a 2a   ZIP archive..**
1c830 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75   Otherwise, assu
1c840 6d 65 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 64  me an ordinary d
1c850 61 74 61 62 61 73 65 20 72 65 67 61 72 64 6c 65  atabase regardle
1c860 73 73 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61  ss of the filena
1c870 6d 65 20 69 66 0a 2a 2a 20 74 68 65 20 74 79 70  me if.** the typ
1c880 65 20 63 61 6e 6e 6f 74 20 62 65 20 64 65 74 65  e cannot be dete
1c890 72 6d 69 6e 65 64 20 66 72 6f 6d 20 63 6f 6e 74  rmined from cont
1c8a0 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 64 65 64 75  ent..*/.int dedu
1c8b0 63 65 44 61 74 61 62 61 73 65 54 79 70 65 28 63  ceDatabaseType(c
1c8c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1c8d0 2c 20 69 6e 74 20 64 66 6c 74 5a 69 70 29 7b 0a  , int dfltZip){.
1c8e0 20 20 46 49 4c 45 20 2a 66 20 3d 20 66 6f 70 65    FILE *f = fope
1c8f0 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a  n(zName, "rb");.
1c900 20 20 73 69 7a 65 5f 74 20 6e 3b 0a 20 20 69 6e    size_t n;.  in
1c910 74 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45  t rc = SHELL_OPE
1c920 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 63 68 61 72  N_UNSPEC;.  char
1c930 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66   zBuf[100];.  if
1c940 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ( f==0 ){.    if
1c950 28 20 64 66 6c 74 5a 69 70 20 26 26 20 73 71 6c  ( dfltZip && sql
1c960 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 25 2e  ite3_strlike("%.
1c970 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29 3d 3d 30  zip",zName,0)==0
1c980 20 29 7b 0a 20 20 20 20 20 20 20 72 65 74 75 72   ){.       retur
1c990 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50  n SHELL_OPEN_ZIP
1c9a0 46 49 4c 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  FILE;.    }else{
1c9b0 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  .       return S
1c9c0 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c  HELL_OPEN_NORMAL
1c9d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 20  ;.    }.  }.  n 
1c9e0 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20 31 36  = fread(zBuf, 16
1c9f0 2c 20 31 2c 20 66 29 3b 0a 20 20 69 66 28 20 6e  , 1, f);.  if( n
1ca00 3d 3d 31 20 26 26 20 6d 65 6d 63 6d 70 28 7a 42  ==1 && memcmp(zB
1ca10 75 66 2c 20 22 53 51 4c 69 74 65 20 66 6f 72 6d  uf, "SQLite form
1ca20 61 74 20 33 22 2c 20 31 36 29 3d 3d 30 20 29 7b  at 3", 16)==0 ){
1ca30 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a  .    fclose(f);.
1ca40 20 20 20 20 72 65 74 75 72 6e 20 53 48 45 4c 4c      return SHELL
1ca50 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _OPEN_NORMAL;.  
1ca60 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 2d 32 35  }.  fseek(f, -25
1ca70 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e  , SEEK_END);.  n
1ca80 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20 32   = fread(zBuf, 2
1ca90 35 2c 20 31 2c 20 66 29 3b 0a 20 20 69 66 28 20  5, 1, f);.  if( 
1caa0 6e 3d 3d 31 20 26 26 20 6d 65 6d 63 6d 70 28 7a  n==1 && memcmp(z
1cab0 42 75 66 2c 20 22 53 74 61 72 74 2d 4f 66 2d 53  Buf, "Start-Of-S
1cac0 51 4c 69 74 65 33 2d 22 2c 20 31 37 29 3d 3d 30  QLite3-", 17)==0
1cad0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 48 45   ){.    rc = SHE
1cae0 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46  LL_OPEN_APPENDVF
1caf0 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  S;.  }else{.    
1cb00 66 73 65 65 6b 28 66 2c 20 2d 32 32 2c 20 53 45  fseek(f, -22, SE
1cb10 45 4b 5f 45 4e 44 29 3b 0a 20 20 20 20 6e 20 3d  EK_END);.    n =
1cb20 20 66 72 65 61 64 28 7a 42 75 66 2c 20 32 32 2c   fread(zBuf, 22,
1cb30 20 31 2c 20 66 29 3b 0a 20 20 20 20 69 66 28 20   1, f);.    if( 
1cb40 6e 3d 3d 31 20 26 26 20 7a 42 75 66 5b 30 5d 3d  n==1 && zBuf[0]=
1cb50 3d 30 78 35 30 20 26 26 20 7a 42 75 66 5b 31 5d  =0x50 && zBuf[1]
1cb60 3d 3d 30 78 34 62 20 26 26 20 7a 42 75 66 5b 32  ==0x4b && zBuf[2
1cb70 5d 3d 3d 30 78 30 35 0a 20 20 20 20 20 20 20 26  ]==0x05.       &
1cb80 26 20 7a 42 75 66 5b 33 5d 3d 3d 30 78 30 36 20  & zBuf[3]==0x06 
1cb90 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 48  ){.      rc = SH
1cba0 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45  ELL_OPEN_ZIPFILE
1cbb0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1cbc0 6e 3d 3d 30 20 26 26 20 64 66 6c 74 5a 69 70 20  n==0 && dfltZip 
1cbd0 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  && sqlite3_strli
1cbe0 6b 65 28 22 25 2e 7a 69 70 22 2c 7a 4e 61 6d 65  ke("%.zip",zName
1cbf0 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,0)==0 ){.      
1cc00 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  rc = SHELL_OPEN_
1cc10 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d 0a 20  ZIPFILE;.    }. 
1cc20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a   }.  fclose(f);.
1cc30 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d    return rc;  .}
1cc40 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1cc50 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49  ENABLE_DESERIALI
1cc60 5a 45 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6e 73 74  ZE./*.** Reconst
1cc70 72 75 63 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ruct an in-memor
1cc80 79 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  y database using
1cc90 20 74 68 65 20 6f 75 74 70 75 74 20 66 72 6f 6d   the output from
1cca0 20 74 68 65 20 22 64 62 74 6f 74 78 74 22 0a 2a   the "dbtotxt".*
1ccb0 2a 20 70 72 6f 67 72 61 6d 2e 20 20 52 65 61 64  * program.  Read
1ccc0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1ccd0 65 20 66 69 6c 65 20 69 6e 20 70 2d 3e 7a 44 62  e file in p->zDb
1cce0 46 69 6c 65 6e 61 6d 65 2e 20 20 49 66 20 70 2d  Filename.  If p-
1ccf0 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 0a 2a 2a 20  >zDbFilename.** 
1cd00 69 73 20 30 2c 20 74 68 65 6e 20 72 65 61 64 20  is 0, then read 
1cd10 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20 69 6e  from standard in
1cd20 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  put..*/.static u
1cd30 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65  nsigned char *re
1cd40 61 64 48 65 78 44 62 28 53 68 65 6c 6c 53 74 61  adHexDb(ShellSta
1cd50 74 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 44 61  te *p, int *pnDa
1cd60 74 61 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ta){.  unsigned 
1cd70 63 68 61 72 20 2a 61 20 3d 20 30 3b 0a 20 20 69  char *a = 0;.  i
1cd80 6e 74 20 6e 4c 69 6e 65 20 3d 20 31 3b 0a 20 20  nt nLine = 1;.  
1cd90 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  int n = 0;.  int
1cda0 20 70 67 73 7a 20 3d 20 30 3b 0a 20 20 69 6e 74   pgsz = 0;.  int
1cdb0 20 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20   iOffset = 0;.  
1cdc0 69 6e 74 20 6a 2c 20 6b 3b 0a 20 20 69 6e 74 20  int j, k;.  int 
1cdd0 72 63 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a  rc;.  FILE *in;.
1cde0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1cdf0 78 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 4c  x[16];.  char zL
1ce00 69 6e 65 5b 31 30 30 5d 3b 0a 20 20 69 66 28 20  ine[100];.  if( 
1ce10 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 29  p->zDbFilename )
1ce20 7b 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e  {.    in = fopen
1ce30 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c  (p->zDbFilename,
1ce40 20 22 72 22 29 3b 0a 20 20 20 20 69 66 28 20 69   "r");.    if( i
1ce50 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74  n==0 ){.      ut
1ce60 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1ce70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  , "cannot open \
1ce80 22 25 73 5c 22 20 66 6f 72 20 72 65 61 64 69 6e  "%s\" for readin
1ce90 67 5c 6e 22 2c 20 70 2d 3e 7a 44 62 46 69 6c 65  g\n", p->zDbFile
1cea0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
1ceb0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
1cec0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 20 3d 20 73  else{.    in = s
1ced0 74 64 69 6e 3b 0a 20 20 7d 0a 20 20 2a 70 6e 44  tdin;.  }.  *pnD
1cee0 61 74 61 20 3d 20 30 3b 0a 20 20 69 66 28 20 66  ata = 0;.  if( f
1cef0 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65  gets(zLine, size
1cf00 6f 66 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 3d 3d  of(zLine), in)==
1cf10 30 20 29 20 67 6f 74 6f 20 72 65 61 64 48 65 78  0 ) goto readHex
1cf20 44 62 5f 65 72 72 6f 72 3b 0a 20 20 72 63 20 3d  Db_error;.  rc =
1cf30 20 73 73 63 61 6e 66 28 7a 4c 69 6e 65 2c 20 22   sscanf(zLine, "
1cf40 7c 20 73 69 7a 65 20 25 64 20 70 61 67 65 73 69  | size %d pagesi
1cf50 7a 65 20 25 64 22 2c 20 26 6e 2c 20 26 70 67 73  ze %d", &n, &pgs
1cf60 7a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 32 20  z);.  if( rc!=2 
1cf70 29 20 67 6f 74 6f 20 72 65 61 64 48 65 78 44 62  ) goto readHexDb
1cf80 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 6e 3c  _error;.  if( n<
1cf90 3d 30 20 29 20 67 6f 74 6f 20 72 65 61 64 48 65  =0 ) goto readHe
1cfa0 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 61 20 3d  xDb_error;.  a =
1cfb0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1cfc0 20 6e 20 29 3b 0a 20 20 69 66 28 20 61 3d 3d 30   n );.  if( a==0
1cfd0 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
1cfe0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 4f 75 74  ntf(stderr, "Out
1cff0 20 6f 66 20 6d 65 6d 6f 72 79 21 5c 6e 22 29 3b   of memory!\n");
1d000 0a 20 20 20 20 67 6f 74 6f 20 72 65 61 64 48 65  .    goto readHe
1d010 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  xDb_error;.  }. 
1d020 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 6e 29   memset(a, 0, n)
1d030 3b 0a 20 20 69 66 28 20 70 67 73 7a 3c 35 31 32  ;.  if( pgsz<512
1d040 20 7c 7c 20 70 67 73 7a 3e 36 35 35 33 36 20 7c   || pgsz>65536 |
1d050 7c 20 28 70 67 73 7a 20 26 20 28 70 67 73 7a 2d  | (pgsz & (pgsz-
1d060 31 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 75 74  1))!=0 ){.    ut
1d070 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1d080 2c 20 22 69 6e 76 61 6c 69 64 20 70 61 67 65 73  , "invalid pages
1d090 69 7a 65 5c 6e 22 29 3b 0a 20 20 20 20 67 6f 74  ize\n");.    got
1d0a0 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f  o readHexDb_erro
1d0b0 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 4c 69  r;.  }.  for(nLi
1d0c0 6e 65 3d 32 3b 20 66 67 65 74 73 28 7a 4c 69 6e  ne=2; fgets(zLin
1d0d0 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  e, sizeof(zLine)
1d0e0 2c 20 69 6e 29 21 3d 30 3b 20 6e 4c 69 6e 65 2b  , in)!=0; nLine+
1d0f0 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 73 63  +){.    rc = ssc
1d100 61 6e 66 28 7a 4c 69 6e 65 2c 20 22 7c 20 70 61  anf(zLine, "| pa
1d110 67 65 20 25 64 20 6f 66 66 73 65 74 20 25 64 22  ge %d offset %d"
1d120 2c 20 26 6a 2c 20 26 6b 29 3b 0a 20 20 20 20 69  , &j, &k);.    i
1d130 66 28 20 72 63 3d 3d 32 20 29 7b 0a 20 20 20 20  f( rc==2 ){.    
1d140 20 20 69 4f 66 66 73 65 74 20 3d 20 6b 3b 0a 20    iOffset = k;. 
1d150 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1d160 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
1d170 6e 63 6d 70 28 7a 4c 69 6e 65 2c 20 22 7c 20 65  ncmp(zLine, "| e
1d180 6e 64 20 22 2c 20 36 29 3d 3d 30 20 29 7b 0a 20  nd ", 6)==0 ){. 
1d190 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d1a0 7d 0a 20 20 20 20 72 63 20 3d 20 73 73 63 61 6e  }.    rc = sscan
1d1b0 66 28 7a 4c 69 6e 65 2c 22 7c 20 25 64 3a 20 25  f(zLine,"| %d: %
1d1c0 68 68 78 20 25 68 68 78 20 25 68 68 78 20 25 68  hhx %hhx %hhx %h
1d1d0 68 78 20 25 68 68 78 20 25 68 68 78 20 25 68 68  hx %hhx %hhx %hh
1d1e0 78 20 25 68 68 78 22 0a 20 20 20 20 20 20 20 20  x %hhx".        
1d1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
1d200 20 25 68 68 78 20 25 68 68 78 20 25 68 68 78 20   %hhx %hhx %hhx 
1d210 25 68 68 78 20 25 68 68 78 20 25 68 68 78 20 25  %hhx %hhx %hhx %
1d220 68 68 78 20 25 68 68 78 22 2c 0a 20 20 20 20 20  hhx %hhx",.     
1d230 20 20 20 20 20 20 20 20 20 20 20 26 6a 2c 20 26             &j, &
1d240 78 5b 30 5d 2c 20 26 78 5b 31 5d 2c 20 26 78 5b  x[0], &x[1], &x[
1d250 32 5d 2c 20 26 78 5b 33 5d 2c 20 26 78 5b 34 5d  2], &x[3], &x[4]
1d260 2c 20 26 78 5b 35 5d 2c 20 26 78 5b 36 5d 2c 20  , &x[5], &x[6], 
1d270 26 78 5b 37 5d 2c 0a 20 20 20 20 20 20 20 20 20  &x[7],.         
1d280 20 20 20 20 20 20 20 26 78 5b 38 5d 2c 20 26 78         &x[8], &x
1d290 5b 39 5d 2c 20 26 78 5b 31 30 5d 2c 20 26 78 5b  [9], &x[10], &x[
1d2a0 31 31 5d 2c 20 26 78 5b 31 32 5d 2c 20 26 78 5b  11], &x[12], &x[
1d2b0 31 33 5d 2c 20 26 78 5b 31 34 5d 2c 20 26 78 5b  13], &x[14], &x[
1d2c0 31 35 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  15]);.    if( rc
1d2d0 3d 3d 31 37 20 29 7b 0a 20 20 20 20 20 20 6b 20  ==17 ){.      k 
1d2e0 3d 20 69 4f 66 66 73 65 74 2b 6a 3b 0a 20 20 20  = iOffset+j;.   
1d2f0 20 20 20 69 66 28 20 6b 2b 31 36 3e 6e 20 29 7b     if( k+16>n ){
1d300 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
1d310 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63 6f  intf(stderr, "co
1d320 6e 74 69 6e 75 65 20 65 78 63 65 65 64 73 20 66  ntinue exceeds f
1d330 69 6c 65 20 73 69 7a 65 5c 6e 22 29 3b 0a 20 20  ile size\n");.  
1d340 20 20 20 20 20 20 67 6f 74 6f 20 72 65 61 64 48        goto readH
1d350 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 20 20  exDb_error;.    
1d360 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79    }.      memcpy
1d370 28 61 2b 6b 2c 20 78 2c 20 31 36 29 3b 0a 20 20  (a+k, x, 16);.  
1d380 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 6e 44 61 74    }.  }.  *pnDat
1d390 61 20 3d 20 6e 3b 0a 20 20 69 66 28 20 69 6e 21  a = n;.  if( in!
1d3a0 3d 73 74 64 69 6e 20 29 20 66 63 6c 6f 73 65 28  =stdin ) fclose(
1d3b0 69 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b  in);.  return a;
1d3c0 0a 0a 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f  ..readHexDb_erro
1d3d0 72 3a 0a 20 20 69 66 28 20 69 6e 21 3d 73 74 64  r:.  if( in!=std
1d3e0 69 6e 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65  in ){.    fclose
1d3f0 28 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  (in);.  }else{. 
1d400 20 20 20 77 68 69 6c 65 28 20 66 67 65 74 73 28     while( fgets(
1d410 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c  zLine, sizeof(zL
1d420 69 6e 65 29 2c 20 69 6e 29 21 3d 30 20 29 7b 0a  ine), in)!=0 ){.
1d430 20 20 20 20 20 20 69 66 28 73 74 72 6e 63 6d 70        if(strncmp
1d440 28 7a 4c 69 6e 65 2c 20 22 7c 20 65 6e 64 20 22  (zLine, "| end "
1d450 2c 20 36 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  , 6)==0 ) break;
1d460 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1d470 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20  ite3_free(a);.  
1d480 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1d490 72 72 2c 22 45 72 72 6f 72 20 6f 6e 20 6c 69 6e  rr,"Error on lin
1d4a0 65 20 25 64 20 6f 66 20 2d 2d 68 65 78 64 62 20  e %d of --hexdb 
1d4b0 69 6e 70 75 74 5c 6e 22 2c 20 6e 4c 69 6e 65 29  input\n", nLine)
1d4c0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1d4d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1d4e0 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c  _ENABLE_DESERIAL
1d4f0 49 5a 45 20 2a 2f 0a 0a 2f 2a 20 46 6c 61 67 73  IZE */../* Flags
1d500 20 66 6f 72 20 6f 70 65 6e 5f 64 62 28 29 2e 0a   for open_db()..
1d510 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
1d520 74 20 62 65 68 61 76 69 6f 72 20 6f 66 20 6f 70  t behavior of op
1d530 65 6e 5f 64 62 28 29 20 69 73 20 74 6f 20 65 78  en_db() is to ex
1d540 69 74 28 31 29 20 69 66 20 74 68 65 20 64 61 74  it(1) if the dat
1d550 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f 0a 2a  abase fails to.*
1d560 2a 20 6f 70 65 6e 2e 20 20 54 68 65 20 4f 50 45  * open.  The OPE
1d570 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45 20 66  N_DB_KEEPALIVE f
1d580 6c 61 67 20 63 68 61 6e 67 65 73 20 74 68 61 74  lag changes that
1d590 20 73 6f 20 74 68 61 74 20 69 74 20 70 72 69 6e   so that it prin
1d5a0 74 73 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 62  ts an error.** b
1d5b0 75 74 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 73  ut still returns
1d5c0 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67   without calling
1d5d0 20 65 78 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   exit..**.** The
1d5e0 20 4f 50 45 4e 5f 44 42 5f 5a 49 50 46 49 4c 45   OPEN_DB_ZIPFILE
1d5f0 20 66 6c 61 67 20 63 61 75 73 65 73 20 6f 70 65   flag causes ope
1d600 6e 5f 64 62 28 29 20 74 6f 20 70 72 65 66 65 72  n_db() to prefer
1d610 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 73 20 61   to open files a
1d620 73 20 61 0a 2a 2a 20 5a 49 50 20 61 72 63 68 69  s a.** ZIP archi
1d630 76 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 64  ve if the file d
1d640 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72  oes not exist or
1d650 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20 69 74   is empty and it
1d660 73 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 0a 2a  s name matches.*
1d670 2a 20 74 68 65 20 2a 2e 7a 69 70 20 70 61 74 74  * the *.zip patt
1d680 65 72 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ern..*/.#define 
1d690 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56  OPEN_DB_KEEPALIV
1d6a0 45 20 20 20 30 78 30 30 31 20 20 20 2f 2a 20 52  E   0x001   /* R
1d6b0 65 74 75 72 6e 20 61 66 74 65 72 20 65 72 72 6f  eturn after erro
1d6c0 72 20 69 66 20 74 72 75 65 20 2a 2f 0a 23 64 65  r if true */.#de
1d6d0 66 69 6e 65 20 4f 50 45 4e 5f 44 42 5f 5a 49 50  fine OPEN_DB_ZIP
1d6e0 46 49 4c 45 20 20 20 20 20 30 78 30 30 32 20 20  FILE     0x002  
1d6f0 20 2f 2a 20 4f 70 65 6e 20 61 73 20 5a 49 50 20   /* Open as ZIP 
1d700 69 66 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 20  if name matches 
1d710 2a 2e 7a 69 70 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *.zip */../*.** 
1d720 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61  Make sure the da
1d730 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 2e 20  tabase is open. 
1d740 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
1d750 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49 66  hen open it.  If
1d760 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1d770 20 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c 20   fails to open, 
1d780 70 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d  print an error m
1d790 65 73 73 61 67 65 20 61 6e 64 20 65 78 69 74 2e  essage and exit.
1d7a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d7b0 6f 70 65 6e 5f 64 62 28 53 68 65 6c 6c 53 74 61  open_db(ShellSta
1d7c0 74 65 20 2a 70 2c 20 69 6e 74 20 6f 70 65 6e 46  te *p, int openF
1d7d0 6c 61 67 73 29 7b 0a 20 20 69 66 28 20 70 2d 3e  lags){.  if( p->
1d7e0 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  db==0 ){.    if(
1d7f0 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48   p->openMode==SH
1d800 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 20  ELL_OPEN_UNSPEC 
1d810 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1d820 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  zDbFilename==0 |
1d830 7c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  | p->zDbFilename
1d840 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]==0 ){.      
1d850 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20    p->openMode = 
1d860 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41  SHELL_OPEN_NORMA
1d870 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  L;.      }else{.
1d880 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d          p->openM
1d890 6f 64 65 20 3d 20 28 75 38 29 64 65 64 75 63 65  ode = (u8)deduce
1d8a0 44 61 74 61 62 61 73 65 54 79 70 65 28 70 2d 3e  DatabaseType(p->
1d8b0 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20  zDbFilename, .  
1d8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8d0 20 20 20 20 20 20 20 20 20 20 20 28 6f 70 65 6e             (open
1d8e0 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f 44 42 5f  Flags & OPEN_DB_
1d8f0 5a 49 50 46 49 4c 45 29 21 3d 30 29 3b 0a 20 20  ZIPFILE)!=0);.  
1d900 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1d910 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 65 6e 4d  switch( p->openM
1d920 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ode ){.      cas
1d930 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50  e SHELL_OPEN_APP
1d940 45 4e 44 56 46 53 3a 20 7b 0a 20 20 20 20 20 20  ENDVFS: {.      
1d950 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76    sqlite3_open_v
1d960 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  2(p->zDbFilename
1d970 2c 20 26 70 2d 3e 64 62 2c 20 0a 20 20 20 20 20  , &p->db, .     
1d980 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1d990 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
1d9a0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
1d9b0 22 61 70 6e 64 76 66 73 22 29 3b 0a 20 20 20 20  "apndvfs");.    
1d9c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d9d0 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48   }.      case SH
1d9e0 45 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44 42 3a 0a  ELL_OPEN_HEXDB:.
1d9f0 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c        case SHELL
1da00 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a  _OPEN_DESERIALIZ
1da10 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
1da20 69 74 65 33 5f 6f 70 65 6e 28 30 2c 20 26 70 2d  ite3_open(0, &p-
1da30 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72  >db);.        br
1da40 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1da50 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50     case SHELL_OP
1da60 45 4e 5f 5a 49 50 46 49 4c 45 3a 20 7b 0a 20 20  EN_ZIPFILE: {.  
1da70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70        sqlite3_op
1da80 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 26  en(":memory:", &
1da90 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  p->db);.        
1daa0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1dab0 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f       case SHELL_
1dac0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3a 20 7b  OPEN_READONLY: {
1dad0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1dae0 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a 44 62 46  _open_v2(p->zDbF
1daf0 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 2c  ilename, &p->db,
1db00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1db10 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 20  DONLY, 0);.     
1db20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1db30 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45  }.      case SHE
1db40 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3a 0a  LL_OPEN_UNSPEC:.
1db50 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c        case SHELL
1db60 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3a 20 7b 0a  _OPEN_NORMAL: {.
1db70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1db80 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e  open(p->zDbFilen
1db90 61 6d 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20  ame, &p->db);.  
1dba0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1dbb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 67     }.    }.    g
1dbc0 6c 6f 62 61 6c 44 62 20 3d 20 70 2d 3e 64 62 3b  lobalDb = p->db;
1dbd0 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  .    if( p->db==
1dbe0 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  0 || SQLITE_OK!=
1dbf0 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
1dc00 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20  p->db) ){.      
1dc10 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1dc20 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c  rr,"Error: unabl
1dc30 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  e to open databa
1dc40 73 65 20 5c 22 25 73 5c 22 3a 20 25 73 5c 6e 22  se \"%s\": %s\n"
1dc50 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a  ,.          p->z
1dc60 44 62 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69  DbFilename, sqli
1dc70 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
1dc80 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70  ));.      if( op
1dc90 65 6e 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f 44  enFlags & OPEN_D
1dca0 42 5f 4b 45 45 50 41 4c 49 56 45 20 29 20 72 65  B_KEEPALIVE ) re
1dcb0 74 75 72 6e 3b 0a 20 20 20 20 20 20 65 78 69 74  turn;.      exit
1dcc0 28 31 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  (1);.    }.#ifnd
1dcd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
1dce0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
1dcf0 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65    sqlite3_enable
1dd00 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
1dd10 70 2d 3e 64 62 2c 20 31 29 3b 0a 23 65 6e 64 69  p->db, 1);.#endi
1dd20 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  f.    sqlite3_fi
1dd30 6c 65 69 6f 5f 69 6e 69 74 28 70 2d 3e 64 62 2c  leio_init(p->db,
1dd40 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1dd50 74 65 33 5f 73 68 61 74 68 72 65 65 5f 69 6e 69  te3_shathree_ini
1dd60 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  t(p->db, 0, 0);.
1dd70 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70      sqlite3_comp
1dd80 6c 65 74 69 6f 6e 5f 69 6e 69 74 28 70 2d 3e 64  letion_init(p->d
1dd90 62 2c 20 30 2c 20 30 29 3b 0a 23 69 66 64 65 66  b, 0, 0);.#ifdef
1dda0 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49   SQLITE_HAVE_ZLI
1ddb0 42 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 7a 69  B.    sqlite3_zi
1ddc0 70 66 69 6c 65 5f 69 6e 69 74 28 70 2d 3e 64 62  pfile_init(p->db
1ddd0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1dde0 69 74 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28  ite3_sqlar_init(
1ddf0 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 65  p->db, 0, 0);.#e
1de00 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
1de10 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1de20 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 61  (p->db, "shell_a
1de30 64 64 5f 73 63 68 65 6d 61 22 2c 20 33 2c 20 53  dd_schema", 3, S
1de40 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20  QLITE_UTF8, 0,. 
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de60 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c             shell
1de70 41 64 64 53 63 68 65 6d 61 4e 61 6d 65 2c 20 30  AddSchemaName, 0
1de80 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1de90 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1dea0 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f  n(p->db, "shell_
1deb0 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61 22 2c 20  module_schema", 
1dec0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
1ded0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1def0 68 65 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61  hellModuleSchema
1df00 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1df10 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1df20 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65  tion(p->db, "she
1df30 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20 31 2c 20 53  ll_putsnl", 1, S
1df40 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 2c 0a 20  QLITE_UTF8, p,. 
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df60 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c             shell
1df70 50 75 74 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b  PutsFunc, 0, 0);
1df80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1df90 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20  NOHAVE_SYSTEM.  
1dfa0 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1dfb0 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c  _function(p->db,
1dfc0 20 22 65 64 69 74 22 2c 20 31 2c 20 53 51 4c 49   "edit", 1, SQLI
1dfd0 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dff0 20 20 20 20 20 20 20 20 65 64 69 74 46 75 6e 63          editFunc
1e000 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1e010 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1e020 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 65 64 69  tion(p->db, "edi
1e030 74 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54  t", 2, SQLITE_UT
1e040 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  F8, 0,.         
1e050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e060 20 20 20 65 64 69 74 46 75 6e 63 2c 20 30 2c 20     editFunc, 0, 
1e070 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  0);.#endif.    i
1e080 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d  f( p->openMode==
1e090 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49  SHELL_OPEN_ZIPFI
1e0a0 4c 45 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  LE ){.      char
1e0b0 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33   *zSql = sqlite3
1e0c0 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
1e0d0 20 20 20 22 43 52 45 41 54 45 20 56 49 52 54 55     "CREATE VIRTU
1e0e0 41 4c 20 54 41 42 4c 45 20 7a 69 70 20 55 53 49  AL TABLE zip USI
1e0f0 4e 47 20 7a 69 70 66 69 6c 65 28 25 51 29 3b 22  NG zipfile(%Q);"
1e100 2c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  , p->zDbFilename
1e110 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e120 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71  _exec(p->db, zSq
1e130 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  l, 0, 0, 0);.   
1e140 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1e150 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 23 69 66  zSql);.    }.#if
1e160 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1e170 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a 20 20  E_DESERIALIZE.  
1e180 20 20 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70    else.    if( p
1e190 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c  ->openMode==SHEL
1e1a0 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c 49  L_OPEN_DESERIALI
1e1b0 5a 45 20 7c 7c 20 70 2d 3e 6f 70 65 6e 4d 6f 64  ZE || p->openMod
1e1c0 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 48 45  e==SHELL_OPEN_HE
1e1d0 58 44 42 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  XDB ){.      int
1e1e0 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20   nData = 0;.    
1e1f0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1e200 2a 61 44 61 74 61 3b 0a 20 20 20 20 20 20 69 66  *aData;.      if
1e210 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53  ( p->openMode==S
1e220 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49  HELL_OPEN_DESERI
1e230 41 4c 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  ALIZE ){.       
1e240 20 61 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e   aData = (unsign
1e250 65 64 20 63 68 61 72 2a 29 72 65 61 64 46 69 6c  ed char*)readFil
1e260 65 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  e(p->zDbFilename
1e270 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20 20 20  , &nData);.     
1e280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e290 61 44 61 74 61 20 3d 20 72 65 61 64 48 65 78 44  aData = readHexD
1e2a0 62 28 70 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20  b(p, &nData);.  
1e2b0 20 20 20 20 20 20 69 66 28 20 61 44 61 74 61 3d        if( aData=
1e2c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1e2d0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1e2e0 72 72 2c 20 22 45 72 72 6f 72 20 69 6e 20 68 65  rr, "Error in he
1e2f0 78 64 62 20 69 6e 70 75 74 5c 6e 22 29 3b 0a 20  xdb input\n");. 
1e300 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
1e310 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e320 20 7d 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20   }.      int rc 
1e330 3d 20 73 71 6c 69 74 65 33 5f 64 65 73 65 72 69  = sqlite3_deseri
1e340 61 6c 69 7a 65 28 70 2d 3e 64 62 2c 20 22 6d 61  alize(p->db, "ma
1e350 69 6e 22 2c 20 61 44 61 74 61 2c 20 6e 44 61 74  in", aData, nDat
1e360 61 2c 20 6e 44 61 74 61 2c 0a 20 20 20 20 20 20  a, nData,.      
1e370 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1e380 49 54 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 5f  ITE_DESERIALIZE_
1e390 52 45 53 49 5a 45 41 42 4c 45 20 7c 0a 20 20 20  RESIZEABLE |.   
1e3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3b0 53 51 4c 49 54 45 5f 44 45 53 45 52 49 41 4c 49  SQLITE_DESERIALI
1e3c0 5a 45 5f 46 52 45 45 4f 4e 43 4c 4f 53 45 29 3b  ZE_FREEONCLOSE);
1e3d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
1e3e0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
1e3f0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
1e400 72 6f 72 3a 20 73 71 6c 69 74 65 33 5f 64 65 73  ror: sqlite3_des
1e410 65 72 69 61 6c 69 7a 65 28 29 20 72 65 74 75 72  erialize() retur
1e420 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20  ns %d\n", rc);. 
1e430 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
1e440 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
1e450 20 41 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73   Attempt to clos
1e460 65 20 74 68 65 20 64 61 74 61 62 61 65 73 20 63  e the databaes c
1e470 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 52 65 70 6f  onnection.  Repo
1e480 72 74 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 76 6f  rt errors..*/.vo
1e490 69 64 20 63 6c 6f 73 65 5f 64 62 28 73 71 6c 69  id close_db(sqli
1e4a0 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
1e4b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f  rc = sqlite3_clo
1e4c0 73 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63  se(db);.  if( rc
1e4d0 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
1e4e0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1e4f0 6f 72 3a 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  or: sqlite3_clos
1e500 65 28 29 20 72 65 74 75 72 6e 73 20 25 64 3a 20  e() returns %d: 
1e510 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 72  %s\n",.        r
1e520 63 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  c, sqlite3_errms
1e530 67 28 64 62 29 29 3b 0a 20 20 7d 20 0a 7d 0a 0a  g(db));.  } .}..
1e540 23 69 66 20 48 41 56 45 5f 52 45 41 44 4c 49 4e  #if HAVE_READLIN
1e550 45 20 7c 7c 20 48 41 56 45 5f 45 44 49 54 4c 49  E || HAVE_EDITLI
1e560 4e 45 0a 2f 2a 0a 2a 2a 20 52 65 61 64 6c 69 6e  NE./*.** Readlin
1e570 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 63 61 6c  e completion cal
1e580 6c 62 61 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63  lbacks.*/.static
1e590 20 63 68 61 72 20 2a 72 65 61 64 6c 69 6e 65 5f   char *readline_
1e5a0 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72  completion_gener
1e5b0 61 74 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20  ator(const char 
1e5c0 2a 74 65 78 74 2c 20 69 6e 74 20 73 74 61 74 65  *text, int state
1e5d0 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  ){.  static sqli
1e5e0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
1e5f0 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65  = 0;.  char *zRe
1e600 74 3b 0a 20 20 69 66 28 20 73 74 61 74 65 3d 3d  t;.  if( state==
1e610 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
1e620 53 71 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Sql;.    sqlite3
1e630 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
1e640 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  ;.    zSql = sql
1e650 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
1e660 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 63 61  LECT DISTINCT ca
1e670 6e 64 69 64 61 74 65 20 43 4f 4c 4c 41 54 45 20  ndidate COLLATE 
1e680 6e 6f 63 61 73 65 22 0a 20 20 20 20 20 20 20 20  nocase".        
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6a0 20 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70 6c     "  FROM compl
1e6b0 65 74 69 6f 6e 28 25 51 29 20 4f 52 44 45 52 20  etion(%Q) ORDER 
1e6c0 42 59 20 31 22 2c 20 74 65 78 74 29 3b 0a 20 20  BY 1", text);.  
1e6d0 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
1e6e0 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a  e_v2(globalDb, z
1e6f0 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
1e700 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1e710 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d  _free(zSql);.  }
1e720 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
1e730 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
1e740 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a 52  TE_ROW ){.    zR
1e750 65 74 20 3d 20 73 74 72 64 75 70 28 28 63 6f 6e  et = strdup((con
1e760 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
1e770 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
1e780 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 65 6c 73 65  mt, 0));.  }else
1e790 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
1e7a0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
1e7b0 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20     pStmt = 0;.  
1e7c0 20 20 7a 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    zRet = 0;.  }.
1e7d0 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
1e7e0 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 72  .static char **r
1e7f0 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69  eadline_completi
1e800 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  on(const char *z
1e810 54 65 78 74 2c 20 69 6e 74 20 69 53 74 61 72 74  Text, int iStart
1e820 2c 20 69 6e 74 20 69 45 6e 64 29 7b 0a 20 20 72  , int iEnd){.  r
1e830 6c 5f 61 74 74 65 6d 70 74 65 64 5f 63 6f 6d 70  l_attempted_comp
1e840 6c 65 74 69 6f 6e 5f 6f 76 65 72 20 3d 20 31 3b  letion_over = 1;
1e850 0a 20 20 72 65 74 75 72 6e 20 72 6c 5f 63 6f 6d  .  return rl_com
1e860 70 6c 65 74 69 6f 6e 5f 6d 61 74 63 68 65 73 28  pletion_matches(
1e870 7a 54 65 78 74 2c 20 72 65 61 64 6c 69 6e 65 5f  zText, readline_
1e880 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72  completion_gener
1e890 61 74 6f 72 29 3b 0a 7d 0a 0a 23 65 6c 69 66 20  ator);.}..#elif 
1e8a0 48 41 56 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a 2f  HAVE_LINENOISE./
1e8b0 2a 0a 2a 2a 20 4c 69 6e 65 6e 6f 69 73 65 20 63  *.** Linenoise c
1e8c0 6f 6d 70 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61  ompletion callba
1e8d0 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ck.*/.static voi
1e8e0 64 20 6c 69 6e 65 6e 6f 69 73 65 5f 63 6f 6d 70  d linenoise_comp
1e8f0 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61  letion(const cha
1e900 72 20 2a 7a 4c 69 6e 65 2c 20 6c 69 6e 65 6e 6f  r *zLine, lineno
1e910 69 73 65 43 6f 6d 70 6c 65 74 69 6f 6e 73 20 2a  iseCompletions *
1e920 6c 63 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65  lc){.  int nLine
1e930 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4c 69 6e   = strlen30(zLin
1e940 65 29 3b 0a 20 20 69 6e 74 20 69 2c 20 69 53 74  e);.  int i, iSt
1e950 61 72 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  art;.  sqlite3_s
1e960 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1e970 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
1e980 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b  char zBuf[1000];
1e990 0a 0a 20 20 69 66 28 20 6e 4c 69 6e 65 3e 73 69  ..  if( nLine>si
1e9a0 7a 65 6f 66 28 7a 42 75 66 29 2d 33 30 20 29 20  zeof(zBuf)-30 ) 
1e9b0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 7a 4c  return;.  if( zL
1e9c0 69 6e 65 5b 30 5d 3d 3d 27 2e 27 20 7c 7c 20 7a  ine[0]=='.' || z
1e9d0 4c 69 6e 65 5b 30 5d 3d 3d 27 23 27 29 20 72 65  Line[0]=='#') re
1e9e0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e 4c  turn;.  for(i=nL
1e9f0 69 6e 65 2d 31 3b 20 69 3e 3d 30 20 26 26 20 28  ine-1; i>=0 && (
1ea00 69 73 61 6c 6e 75 6d 28 7a 4c 69 6e 65 5b 69 5d  isalnum(zLine[i]
1ea10 29 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27  ) || zLine[i]=='
1ea20 5f 27 29 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66  _'); i--){}.  if
1ea30 28 20 69 3d 3d 6e 4c 69 6e 65 2d 31 20 29 20 72  ( i==nLine-1 ) r
1ea40 65 74 75 72 6e 3b 0a 20 20 69 53 74 61 72 74 20  eturn;.  iStart 
1ea50 3d 20 69 2b 31 3b 0a 20 20 6d 65 6d 63 70 79 28  = i+1;.  memcpy(
1ea60 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20 69 53 74  zBuf, zLine, iSt
1ea70 61 72 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  art);.  zSql = s
1ea80 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1ea90 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
1eaa0 63 61 6e 64 69 64 61 74 65 20 43 4f 4c 4c 41 54  candidate COLLAT
1eab0 45 20 6e 6f 63 61 73 65 22 0a 20 20 20 20 20 20  E nocase".      
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ead0 20 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70 6c     "  FROM compl
1eae0 65 74 69 6f 6e 28 25 51 2c 25 51 29 20 4f 52 44  etion(%Q,%Q) ORD
1eaf0 45 52 20 42 59 20 31 22 2c 0a 20 20 20 20 20 20  ER BY 1",.      
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb10 20 20 20 26 7a 4c 69 6e 65 5b 69 53 74 61 72 74     &zLine[iStart
1eb20 5d 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 73 71 6c  ], zLine);.  sql
1eb30 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
1eb40 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20  globalDb, zSql, 
1eb50 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
1eb60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1eb70 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Sql);.  sqlite3_
1eb80 65 78 65 63 28 67 6c 6f 62 61 6c 44 62 2c 20 22  exec(globalDb, "
1eb90 50 52 41 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e  PRAGMA page_coun
1eba0 74 22 2c 20 30 2c 20 30 2c 20 30 29 3b 20 2f 2a  t", 0, 0, 0); /*
1ebb0 20 4c 6f 61 64 20 74 68 65 20 73 63 68 65 6d 61   Load the schema
1ebc0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 73 71 6c   */.  while( sql
1ebd0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
1ebe0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
1ebf0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1ec00 7a 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20 28 63  zCompletion = (c
1ec10 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
1ec20 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1ec30 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 6e  Stmt, 0);.    in
1ec40 74 20 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20  t nCompletion = 
1ec50 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1ec60 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29 3b 0a  ytes(pStmt, 0);.
1ec70 20 20 20 20 69 66 28 20 69 53 74 61 72 74 2b 6e      if( iStart+n
1ec80 43 6f 6d 70 6c 65 74 69 6f 6e 20 3c 20 73 69 7a  Completion < siz
1ec90 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 7b 0a 20  eof(zBuf)-1 ){. 
1eca0 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66       memcpy(zBuf
1ecb0 2b 69 53 74 61 72 74 2c 20 7a 43 6f 6d 70 6c 65  +iStart, zComple
1ecc0 74 69 6f 6e 2c 20 6e 43 6f 6d 70 6c 65 74 69 6f  tion, nCompletio
1ecd0 6e 2b 31 29 3b 0a 20 20 20 20 20 20 6c 69 6e 65  n+1);.      line
1ece0 6e 6f 69 73 65 41 64 64 43 6f 6d 70 6c 65 74 69  noiseAddCompleti
1ecf0 6f 6e 28 6c 63 2c 20 7a 42 75 66 29 3b 0a 20 20  on(lc, zBuf);.  
1ed00 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1ed10 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
1ed20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
1ed30 2a 2a 20 44 6f 20 43 2d 6c 61 6e 67 75 61 67 65  ** Do C-language
1ed40 20 73 74 79 6c 65 20 64 65 71 75 6f 74 69 6e 67   style dequoting
1ed50 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 5c 61 20 20 20  ..**.**    \a   
1ed60 20 2d 3e 20 61 6c 61 72 6d 0a 2a 2a 20 20 20 20   -> alarm.**    
1ed70 5c 62 20 20 20 20 2d 3e 20 62 61 63 6b 73 70 61  \b    -> backspa
1ed80 63 65 0a 2a 2a 20 20 20 20 5c 74 20 20 20 20 2d  ce.**    \t    -
1ed90 3e 20 74 61 62 0a 2a 2a 20 20 20 20 5c 6e 20 20  > tab.**    \n  
1eda0 20 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a 2a 2a 20    -> newline.** 
1edb0 20 20 20 5c 76 20 20 20 20 2d 3e 20 76 65 72 74     \v    -> vert
1edc0 69 63 61 6c 20 74 61 62 0a 2a 2a 20 20 20 20 5c  ical tab.**    \
1edd0 66 20 20 20 20 2d 3e 20 66 6f 72 6d 20 66 65 65  f    -> form fee
1ede0 64 0a 2a 2a 20 20 20 20 5c 72 20 20 20 20 2d 3e  d.**    \r    ->
1edf0 20 63 61 72 72 69 61 67 65 20 72 65 74 75 72 6e   carriage return
1ee00 0a 2a 2a 20 20 20 20 5c 73 20 20 20 20 2d 3e 20  .**    \s    -> 
1ee10 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c 22 20 20  space.**    \"  
1ee20 20 20 2d 3e 20 22 0a 2a 2a 20 20 20 20 5c 27 20    -> ".**    \' 
1ee30 20 20 20 2d 3e 20 27 0a 2a 2a 20 20 20 20 5c 5c     -> '.**    \\
1ee40 20 20 20 20 2d 3e 20 62 61 63 6b 73 6c 61 73 68      -> backslash
1ee50 0a 2a 2a 20 20 20 20 5c 4e 4e 4e 20 20 2d 3e 20  .**    \NNN  -> 
1ee60 61 73 63 69 69 20 63 68 61 72 61 63 74 65 72 20  ascii character 
1ee70 4e 4e 4e 20 69 6e 20 6f 63 74 61 6c 0a 2a 2f 0a  NNN in octal.*/.
1ee80 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f  static void reso
1ee90 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28  lve_backslashes(
1eea0 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
1eeb0 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63 3b 0a  i, j;.  char c;.
1eec0 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a    while( *z && *
1eed0 7a 21 3d 27 5c 5c 27 20 29 20 7a 2b 2b 3b 0a 20  z!='\\' ) z++;. 
1eee0 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d   for(i=j=0; (c =
1eef0 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 2c 20   z[i])!=0; i++, 
1ef00 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 3d  j++){.    if( c=
1ef10 3d 27 5c 5c 27 20 26 26 20 7a 5b 69 2b 31 5d 21  ='\\' && z[i+1]!
1ef20 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20  =0 ){.      c = 
1ef30 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 69 66  z[++i];.      if
1ef40 28 20 63 3d 3d 27 61 27 20 29 7b 0a 20 20 20 20  ( c=='a' ){.    
1ef50 20 20 20 20 63 20 3d 20 27 5c 61 27 3b 0a 20 20      c = '\a';.  
1ef60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
1ef70 3d 27 62 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='b' ){.        
1ef80 63 20 3d 20 27 5c 62 27 3b 0a 20 20 20 20 20 20  c = '\b';.      
1ef90 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 74 27  }else if( c=='t'
1efa0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
1efb0 27 5c 74 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\t';.      }els
1efc0 65 20 69 66 28 20 63 3d 3d 27 6e 27 20 29 7b 0a  e if( c=='n' ){.
1efd0 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 6e 27          c = '\n'
1efe0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1eff0 28 20 63 3d 3d 27 76 27 20 29 7b 0a 20 20 20 20  ( c=='v' ){.    
1f000 20 20 20 20 63 20 3d 20 27 5c 76 27 3b 0a 20 20      c = '\v';.  
1f010 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
1f020 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='f' ){.        
1f030 63 20 3d 20 27 5c 66 27 3b 0a 20 20 20 20 20 20  c = '\f';.      
1f040 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 72 27  }else if( c=='r'
1f050 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
1f060 27 5c 72 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\r';.      }els
1f070 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a  e if( c=='"' ){.
1f080 20 20 20 20 20 20 20 20 63 20 3d 20 27 22 27 3b          c = '"';
1f090 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1f0a0 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20   c=='\'' ){.    
1f0b0 20 20 20 20 63 20 3d 20 27 5c 27 27 3b 0a 20 20      c = '\'';.  
1f0c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
1f0d0 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\\' ){.       
1f0e0 20 63 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20   c = '\\';.     
1f0f0 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 27 30   }else if( c>='0
1f100 27 20 26 26 20 63 3c 3d 27 37 27 20 29 7b 0a 20  ' && c<='7' ){. 
1f110 20 20 20 20 20 20 20 63 20 2d 3d 20 27 30 27 3b         c -= '0';
1f120 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
1f130 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b  +1]>='0' && z[i+
1f140 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20  1]<='7' ){.     
1f150 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
1f160 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b      c = (c<<3) +
1f170 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20   z[i] - '0';.   
1f180 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31         if( z[i+1
1f190 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d  ]>='0' && z[i+1]
1f1a0 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20  <='7' ){.       
1f1b0 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
1f1c0 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29        c = (c<<3)
1f1d0 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20   + z[i] - '0';. 
1f1e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f1f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1f200 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 63 3b   }.    z[j] = c;
1f210 0a 20 20 7d 0a 20 20 69 66 28 20 6a 3c 69 20 29  .  }.  if( j<i )
1f220 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a   z[j] = 0;.}../*
1f230 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 7a 41  .** Interpret zA
1f240 72 67 20 61 73 20 65 69 74 68 65 72 20 61 6e 20  rg as either an 
1f250 69 6e 74 65 67 65 72 20 6f 72 20 61 20 62 6f 6f  integer or a boo
1f260 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20 52 65 74  lean value.  Ret
1f270 75 72 6e 20 31 20 6f 72 20 30 0a 2a 2a 20 66 6f  urn 1 or 0.** fo
1f280 72 20 54 52 55 45 20 61 6e 64 20 46 41 4c 53 45  r TRUE and FALSE
1f290 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
1f2a0 74 65 67 65 72 20 76 61 6c 75 65 20 69 66 20 61  teger value if a
1f2b0 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73  ppropriate..*/.s
1f2c0 74 61 74 69 63 20 69 6e 74 20 62 6f 6f 6c 65 61  tatic int boolea
1f2d0 6e 56 61 6c 75 65 28 63 6f 6e 73 74 20 63 68 61  nValue(const cha
1f2e0 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20  r *zArg){.  int 
1f2f0 69 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d  i;.  if( zArg[0]
1f300 3d 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 31 5d  =='0' && zArg[1]
1f310 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 66 6f 72  =='x' ){.    for
1f320 28 69 3d 32 3b 20 68 65 78 44 69 67 69 74 56 61  (i=2; hexDigitVa
1f330 6c 75 65 28 7a 41 72 67 5b 69 5d 29 3e 3d 30 3b  lue(zArg[i])>=0;
1f340 20 69 2b 2b 29 7b 7d 0a 20 20 7d 65 6c 73 65 7b   i++){}.  }else{
1f350 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 41  .    for(i=0; zA
1f360 72 67 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a 41  rg[i]>='0' && zA
1f370 72 67 5b 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29  rg[i]<='9'; i++)
1f380 7b 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 30  {}.  }.  if( i>0
1f390 20 26 26 20 7a 41 72 67 5b 69 5d 3d 3d 30 20 29   && zArg[i]==0 )
1f3a0 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 69 6e   return (int)(in
1f3b0 74 65 67 65 72 56 61 6c 75 65 28 7a 41 72 67 29  tegerValue(zArg)
1f3c0 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
1f3d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
1f3e0 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 6e 22  ricmp(zArg, "on"
1f3f0 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  )==0 || sqlite3_
1f400 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22 79 65  stricmp(zArg,"ye
1f410 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  s")==0 ){.    re
1f420 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
1f430 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
1f440 70 28 7a 41 72 67 2c 20 22 6f 66 66 22 29 3d 3d  p(zArg, "off")==
1f450 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72  0 || sqlite3_str
1f460 69 63 6d 70 28 7a 41 72 67 2c 22 6e 6f 22 29 3d  icmp(zArg,"no")=
1f470 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1f480 20 30 3b 0a 20 20 7d 0a 20 20 75 74 66 38 5f 70   0;.  }.  utf8_p
1f490 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
1f4a0 52 52 4f 52 3a 20 4e 6f 74 20 61 20 62 6f 6f 6c  RROR: Not a bool
1f4b0 65 61 6e 20 76 61 6c 75 65 3a 20 5c 22 25 73 5c  ean value: \"%s\
1f4c0 22 2e 20 41 73 73 75 6d 69 6e 67 20 5c 22 6e 6f  ". Assuming \"no
1f4d0 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  \".\n",.        
1f4e0 20 20 7a 41 72 67 29 3b 0a 20 20 72 65 74 75 72    zArg);.  retur
1f4f0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 0;.}../*.** Se
1f500 74 20 6f 72 20 63 6c 65 61 72 20 61 20 73 68 65  t or clear a she
1f510 6c 6c 20 66 6c 61 67 20 61 63 63 6f 72 64 69 6e  ll flag accordin
1f520 67 20 74 6f 20 61 20 62 6f 6f 6c 65 61 6e 20 76  g to a boolean v
1f530 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
1f540 76 6f 69 64 20 73 65 74 4f 72 43 6c 65 61 72 46  void setOrClearF
1f550 6c 61 67 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  lag(ShellState *
1f560 70 2c 20 75 6e 73 69 67 6e 65 64 20 6d 46 6c 61  p, unsigned mFla
1f570 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  g, const char *z
1f580 41 72 67 29 7b 0a 20 20 69 66 28 20 62 6f 6f 6c  Arg){.  if( bool
1f590 65 61 6e 56 61 6c 75 65 28 7a 41 72 67 29 20 29  eanValue(zArg) )
1f5a0 7b 0a 20 20 20 20 53 68 65 6c 6c 53 65 74 46 6c  {.    ShellSetFl
1f5b0 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20  ag(p, mFlag);.  
1f5c0 7d 65 6c 73 65 7b 0a 20 20 20 20 53 68 65 6c 6c  }else{.    Shell
1f5d0 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 6d 46 6c  ClearFlag(p, mFl
1f5e0 61 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ag);.  }.}../*.*
1f5f0 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 75 74 70 75  * Close an outpu
1f600 74 20 66 69 6c 65 2c 20 61 73 73 75 6d 69 6e 67  t file, assuming
1f610 20 69 74 20 69 73 20 6e 6f 74 20 73 74 64 65 72   it is not stder
1f620 72 20 6f 72 20 73 74 64 6f 75 74 0a 2a 2f 0a 73  r or stdout.*/.s
1f630 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
1f640 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 46 49 4c  t_file_close(FIL
1f650 45 20 2a 66 29 7b 0a 20 20 69 66 28 20 66 20 26  E *f){.  if( f &
1f660 26 20 66 21 3d 73 74 64 6f 75 74 20 26 26 20 66  & f!=stdout && f
1f670 21 3d 73 74 64 65 72 72 20 29 20 66 63 6c 6f 73  !=stderr ) fclos
1f680 65 28 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  e(f);.}../*.** T
1f690 72 79 20 74 6f 20 6f 70 65 6e 20 61 6e 20 6f 75  ry to open an ou
1f6a0 74 70 75 74 20 66 69 6c 65 2e 20 20 20 54 68 65  tput file.   The
1f6b0 20 6e 61 6d 65 73 20 22 73 74 64 6f 75 74 22 20   names "stdout" 
1f6c0 61 6e 64 20 22 73 74 64 65 72 72 22 20 61 72 65  and "stderr" are
1f6d0 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 61  .** recognized a
1f6e0 6e 64 20 64 6f 20 74 68 65 20 72 69 67 68 74 20  nd do the right 
1f6f0 74 68 69 6e 67 2e 20 20 4e 55 4c 4c 20 69 73 20  thing.  NULL is 
1f700 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
1f710 6f 75 74 70 75 74 0a 2a 2a 20 66 69 6c 65 6e 61  output.** filena
1f720 6d 65 20 69 73 20 22 6f 66 66 22 2e 0a 2a 2f 0a  me is "off"..*/.
1f730 73 74 61 74 69 63 20 46 49 4c 45 20 2a 6f 75 74  static FILE *out
1f740 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 63 6f  put_file_open(co
1f750 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c  nst char *zFile,
1f760 20 69 6e 74 20 62 54 65 78 74 4d 6f 64 65 29 7b   int bTextMode){
1f770 0a 20 20 46 49 4c 45 20 2a 66 3b 0a 20 20 69 66  .  FILE *f;.  if
1f780 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22  ( strcmp(zFile,"
1f790 73 74 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20  stdout")==0 ){. 
1f7a0 20 20 20 66 20 3d 20 73 74 64 6f 75 74 3b 0a 20     f = stdout;. 
1f7b0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1f7c0 70 28 7a 46 69 6c 65 2c 20 22 73 74 64 65 72 72  p(zFile, "stderr
1f7d0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d  ")==0 ){.    f =
1f7e0 20 73 74 64 65 72 72 3b 0a 20 20 7d 65 6c 73 65   stderr;.  }else
1f7f0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
1f800 65 2c 20 22 6f 66 66 22 29 3d 3d 30 20 29 7b 0a  e, "off")==0 ){.
1f810 20 20 20 20 66 20 3d 20 30 3b 0a 20 20 7d 65 6c      f = 0;.  }el
1f820 73 65 7b 0a 20 20 20 20 66 20 3d 20 66 6f 70 65  se{.    f = fope
1f830 6e 28 7a 46 69 6c 65 2c 20 62 54 65 78 74 4d 6f  n(zFile, bTextMo
1f840 64 65 20 3f 20 22 77 22 20 3a 20 22 77 62 22 29  de ? "w" : "wb")
1f850 3b 0a 20 20 20 20 69 66 28 20 66 3d 3d 30 20 29  ;.    if( f==0 )
1f860 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
1f870 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1f880 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
1f890 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65  \"%s\"\n", zFile
1f8a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1f8b0 65 74 75 72 6e 20 66 3b 0a 7d 0a 0a 23 69 66 6e  eturn f;.}..#ifn
1f8c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f8d0 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 41 20 72 6f  TRACE./*.** A ro
1f8e0 75 74 69 6e 65 20 66 6f 72 20 68 61 6e 64 6c 69  utine for handli
1f8f0 6e 67 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 73  ng output from s
1f900 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29 2e 0a  qlite3_trace()..
1f910 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
1f920 6c 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b  l_trace_callback
1f930 28 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d 54 79  (.  unsigned mTy
1f940 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  pe,         /* T
1f950 68 65 20 74 72 61 63 65 20 74 79 70 65 20 2a 2f  he trace type */
1f960 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 20 20  .  void *pArg,  
1f970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f980 65 20 53 68 65 6c 6c 53 74 61 74 65 20 70 6f 69  e ShellState poi
1f990 6e 74 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  nter */.  void *
1f9a0 70 50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pP,             
1f9b0 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 61 20 70    /* Usually a p
1f9c0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
1f9d0 5f 73 74 6d 74 20 2a 2f 0a 20 20 76 6f 69 64 20  _stmt */.  void 
1f9e0 2a 70 58 20 20 20 20 20 20 20 20 20 20 20 20 20  *pX             
1f9f0 20 20 20 2f 2a 20 41 75 78 69 6c 69 61 72 79 20     /* Auxiliary 
1fa00 6f 75 74 70 75 74 20 2a 2f 0a 29 7b 0a 20 20 53  output */.){.  S
1fa10 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
1fa20 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67  ShellState*)pArg
1fa30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
1fa40 20 2a 70 53 74 6d 74 3b 0a 20 20 63 6f 6e 73 74   *pStmt;.  const
1fa50 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69   char *zSql;.  i
1fa60 6e 74 20 6e 53 71 6c 3b 0a 20 20 69 66 28 20 70  nt nSql;.  if( p
1fa70 2d 3e 74 72 61 63 65 4f 75 74 3d 3d 30 20 29 20  ->traceOut==0 ) 
1fa80 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1fa90 6d 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 52  mType==SQLITE_TR
1faa0 41 43 45 5f 43 4c 4f 53 45 20 29 7b 0a 20 20 20  ACE_CLOSE ){.   
1fab0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
1fac0 74 72 61 63 65 4f 75 74 2c 20 22 2d 2d 20 63 6c  traceOut, "-- cl
1fad0 6f 73 69 6e 67 20 64 61 74 61 62 61 73 65 20 63  osing database c
1fae0 6f 6e 6e 65 63 74 69 6f 6e 5c 6e 22 29 3b 0a 20  onnection\n");. 
1faf0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1fb00 0a 20 20 69 66 28 20 6d 54 79 70 65 21 3d 53 51  .  if( mType!=SQ
1fb10 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 20 26  LITE_TRACE_ROW &
1fb20 26 20 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  & ((const char*)
1fb30 70 58 29 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  pX)[0]=='-' ){. 
1fb40 20 20 20 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74     zSql = (const
1fb50 20 63 68 61 72 2a 29 70 58 3b 0a 20 20 7d 65 6c   char*)pX;.  }el
1fb60 73 65 7b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20  se{.    pStmt = 
1fb70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70  (sqlite3_stmt*)p
1fb80 50 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  P;.    switch( p
1fb90 2d 3e 65 54 72 61 63 65 54 79 70 65 20 29 7b 0a  ->eTraceType ){.
1fba0 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c        case SHELL
1fbb0 5f 54 52 41 43 45 5f 45 58 50 41 4e 44 45 44 3a  _TRACE_EXPANDED:
1fbc0 20 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20   {.        zSql 
1fbd0 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 61 6e 64  = sqlite3_expand
1fbe0 65 64 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20  ed_sql(pStmt);. 
1fbf0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1fc00 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
1fc10 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41  ITE_ENABLE_NORMA
1fc20 4c 49 5a 45 0a 20 20 20 20 20 20 63 61 73 65 20  LIZE.      case 
1fc30 53 48 45 4c 4c 5f 54 52 41 43 45 5f 4e 4f 52 4d  SHELL_TRACE_NORM
1fc40 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20  ALIZED: {.      
1fc50 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
1fc60 5f 6e 6f 72 6d 61 6c 69 7a 65 64 5f 73 71 6c 28  _normalized_sql(
1fc70 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
1fc80 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
1fc90 65 6e 64 69 66 0a 20 20 20 20 20 20 64 65 66 61  endif.      defa
1fca0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a  ult: {.        z
1fcb0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71  Sql = sqlite3_sq
1fcc0 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  l(pStmt);.      
1fcd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1fce0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1fcf0 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72   zSql==0 ) retur
1fd00 6e 20 30 3b 0a 20 20 6e 53 71 6c 20 3d 20 73 74  n 0;.  nSql = st
1fd10 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20  rlen30(zSql);.  
1fd20 77 68 69 6c 65 28 20 6e 53 71 6c 3e 30 20 26 26  while( nSql>0 &&
1fd30 20 7a 53 71 6c 5b 6e 53 71 6c 2d 31 5d 3d 3d 27   zSql[nSql-1]=='
1fd40 3b 27 20 29 7b 20 6e 53 71 6c 2d 2d 3b 20 7d 0a  ;' ){ nSql--; }.
1fd50 20 20 73 77 69 74 63 68 28 20 6d 54 79 70 65 20    switch( mType 
1fd60 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
1fd70 54 45 5f 54 52 41 43 45 5f 52 4f 57 3a 0a 20 20  TE_TRACE_ROW:.  
1fd80 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52    case SQLITE_TR
1fd90 41 43 45 5f 53 54 4d 54 3a 20 7b 0a 20 20 20 20  ACE_STMT: {.    
1fda0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
1fdb0 3e 74 72 61 63 65 4f 75 74 2c 20 22 25 2e 2a 73  >traceOut, "%.*s
1fdc0 3b 5c 6e 22 2c 20 6e 53 71 6c 2c 20 7a 53 71 6c  ;\n", nSql, zSql
1fdd0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1fde0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1fdf0 51 4c 49 54 45 5f 54 52 41 43 45 5f 50 52 4f 46  QLITE_TRACE_PROF
1fe00 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ILE: {.      sql
1fe10 69 74 65 33 5f 69 6e 74 36 34 20 6e 4e 61 6e 6f  ite3_int64 nNano
1fe20 73 65 63 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f  sec = *(sqlite3_
1fe30 69 6e 74 36 34 2a 29 70 58 3b 0a 20 20 20 20 20  int64*)pX;.     
1fe40 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
1fe50 74 72 61 63 65 4f 75 74 2c 20 22 25 2e 2a 73 3b  traceOut, "%.*s;
1fe60 20 2d 2d 20 25 6c 6c 64 20 6e 73 5c 6e 22 2c 20   -- %lld ns\n", 
1fe70 6e 53 71 6c 2c 20 7a 53 71 6c 2c 20 6e 4e 61 6e  nSql, zSql, nNan
1fe80 6f 73 65 63 29 3b 0a 20 20 20 20 20 20 62 72 65  osec);.      bre
1fe90 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1fea0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
1feb0 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f 2d 6f  if../*.** A no-o
1fec0 70 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 72  p routine that r
1fed0 75 6e 73 20 77 69 74 68 20 74 68 65 20 22 2e 62  uns with the ".b
1fee0 72 65 61 6b 70 6f 69 6e 74 22 20 64 6f 63 2d 63  reakpoint" doc-c
1fef0 6f 6d 6d 61 6e 64 2e 20 20 54 68 69 73 20 69 73  ommand.  This is
1ff00 0a 2a 2a 20 61 20 75 73 65 66 75 6c 20 73 70 6f  .** a useful spo
1ff10 74 20 74 6f 20 73 65 74 20 61 20 64 65 62 75 67  t to set a debug
1ff20 67 65 72 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a  ger breakpoint..
1ff30 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
1ff40 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76  est_breakpoint(v
1ff50 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69  oid){.  static i
1ff60 6e 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20 20  nt nCall = 0;.  
1ff70 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  nCall++;.}../*.*
1ff80 2a 20 41 6e 20 6f 62 6a 65 63 74 20 75 73 65 64  * An object used
1ff90 20 74 6f 20 72 65 61 64 20 61 20 43 53 56 20 61   to read a CSV a
1ffa0 6e 64 20 6f 74 68 65 72 20 66 69 6c 65 73 20 66  nd other files f
1ffb0 6f 72 20 69 6d 70 6f 72 74 2e 0a 2a 2f 0a 74 79  or import..*/.ty
1ffc0 70 65 64 65 66 20 73 74 72 75 63 74 20 49 6d 70  pedef struct Imp
1ffd0 6f 72 74 43 74 78 20 49 6d 70 6f 72 74 43 74 78  ortCtx ImportCtx
1ffe0 3b 0a 73 74 72 75 63 74 20 49 6d 70 6f 72 74 43  ;.struct ImportC
1fff0 74 78 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  tx {.  const cha
20000 72 20 2a 7a 46 69 6c 65 3b 20 20 2f 2a 20 4e 61  r *zFile;  /* Na
20010 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  me of the input 
20020 66 69 6c 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a  file */.  FILE *
20030 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  in;           /*
20040 20 52 65 61 64 20 74 68 65 20 43 53 56 20 74 65   Read the CSV te
20050 78 74 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 70  xt from this inp
20060 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 63  ut stream */.  c
20070 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
20080 20 20 20 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65     /* Accumulate
20090 64 20 74 65 78 74 20 66 6f 72 20 61 20 66 69 65  d text for a fie
200a0 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ld */.  int n;  
200b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
200c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
200d0 6e 20 7a 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c  n z */.  int nAl
200e0 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  loc;         /* 
200f0 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  Space allocated 
20100 66 6f 72 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74  for z[] */.  int
20110 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20   nLine;         
20120 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 69 6e 65   /* Current line
20130 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
20140 20 62 4e 6f 74 46 69 72 73 74 3b 20 20 20 20 20   bNotFirst;     
20150 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 6e 65 20   /* True if one 
20160 6f 72 20 6d 6f 72 65 20 62 79 74 65 73 20 61 6c  or more bytes al
20170 72 65 61 64 79 20 72 65 61 64 20 2a 2f 0a 20 20  ready read */.  
20180 69 6e 74 20 63 54 65 72 6d 3b 20 20 20 20 20 20  int cTerm;      
20190 20 20 20 20 2f 2a 20 43 68 61 72 61 63 74 65 72      /* Character
201a0 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 64   that terminated
201b0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
201c0 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20   field */.  int 
201d0 63 43 6f 6c 53 65 70 3b 20 20 20 20 20 20 20 20  cColSep;        
201e0 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 73 65  /* The column se
201f0 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
20200 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 2c 22  r.  (Usually ","
20210 29 20 2a 2f 0a 20 20 69 6e 74 20 63 52 6f 77 53  ) */.  int cRowS
20220 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ep;        /* Th
20230 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20  e row separator 
20240 63 68 61 72 61 63 74 65 72 2e 20 20 28 55 73 75  character.  (Usu
20250 61 6c 6c 79 20 22 5c 6e 22 29 20 2a 2f 0a 7d 3b  ally "\n") */.};
20260 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20 73 69  ../* Append a si
20270 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 7a 5b 5d  ngle byte to z[]
20280 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
20290 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68  import_append_ch
202a0 61 72 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 2c  ar(ImportCtx *p,
202b0 20 69 6e 74 20 63 29 7b 0a 20 20 69 66 28 20 70   int c){.  if( p
202c0 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63  ->n+1>=p->nAlloc
202d0 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f   ){.    p->nAllo
202e0 63 20 2b 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 20 2b  c += p->nAlloc +
202f0 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 7a 20 3d   100;.    p->z =
20300 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
20310 36 34 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c  64(p->z, p->nAll
20320 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  oc);.    if( p->
20330 7a 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74  z==0 ) shell_out
20340 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20  _of_memory();.  
20350 7d 0a 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 2b 2b 5d  }.  p->z[p->n++]
20360 20 3d 20 28 63 68 61 72 29 63 3b 0a 7d 0a 0a 2f   = (char)c;.}../
20370 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
20380 66 69 65 6c 64 20 6f 66 20 43 53 56 20 74 65 78  field of CSV tex
20390 74 2e 20 20 43 6f 6d 70 61 74 69 62 6c 65 20 77  t.  Compatible w
203a0 69 74 68 20 72 66 63 34 31 38 30 20 61 6e 64 20  ith rfc4180 and 
203b0 65 78 74 65 6e 64 65 64 0a 2a 2a 20 77 69 74 68  extended.** with
203c0 20 74 68 65 20 6f 70 74 69 6f 6e 20 6f 66 20 68   the option of h
203d0 61 76 69 6e 67 20 61 20 73 65 70 61 72 61 74 6f  aving a separato
203e0 72 20 6f 74 68 65 72 20 74 68 61 6e 20 22 2c 22  r other than ","
203f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70  ..**.**   +  Inp
20400 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d  ut comes from p-
20410 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f  >in..**   +  Sto
20420 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 70 2d  re results in p-
20430 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e  >z of length p->
20440 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  n.  Space to hol
20450 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20  d p->z comes.** 
20460 20 20 20 20 20 66 72 6f 6d 20 73 71 6c 69 74 65       from sqlite
20470 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a  3_malloc64()..**
20480 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 63 53 65     +  Use p->cSe
20490 70 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  p as the column 
204a0 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20  separator.  The 
204b0 64 65 66 61 75 6c 74 20 69 73 20 22 2c 22 2e 0a  default is ","..
204c0 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 72  **   +  Use p->r
204d0 53 65 70 20 61 73 20 74 68 65 20 72 6f 77 20 73  Sep as the row s
204e0 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64  eparator.  The d
204f0 65 66 61 75 6c 74 20 69 73 20 22 5c 6e 22 2e 0a  efault is "\n"..
20500 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20 74 72 61  **   +  Keep tra
20510 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e  ck of the line n
20520 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e  umber in p->nLin
20530 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65  e..**   +  Store
20540 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20 74   the character t
20550 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20 74  hat terminates t
20560 68 65 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63  he field in p->c
20570 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20  Term.  Store.** 
20580 20 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d       EOF on end-
20590 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20  of-file..**   + 
205a0 20 52 65 70 6f 72 74 20 73 79 6e 74 61 78 20 65   Report syntax e
205b0 72 72 6f 72 73 20 6f 6e 20 73 74 64 65 72 72 0a  rrors on stderr.
205c0 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
205d0 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 63 73 76  SQLITE_CDECL csv
205e0 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28  _read_one_field(
205f0 49 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b 0a 20  ImportCtx *p){. 
20600 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 63 53   int c;.  int cS
20610 65 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65 70 3b  ep = p->cColSep;
20620 0a 20 20 69 6e 74 20 72 53 65 70 20 3d 20 70 2d  .  int rSep = p-
20630 3e 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d 3e 6e  >cRowSep;.  p->n
20640 20 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67 65 74   = 0;.  c = fget
20650 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20  c(p->in);.  if( 
20660 63 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e 49 6e  c==EOF || seenIn
20670 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20 70  terrupt ){.    p
20680 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b 0a 20  ->cTerm = EOF;. 
20690 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
206a0 0a 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b  .  if( c=='"' ){
206b0 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 70 70 63  .    int pc, ppc
206c0 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 4c  ;.    int startL
206d0 69 6e 65 20 3d 20 70 2d 3e 6e 4c 69 6e 65 3b 0a  ine = p->nLine;.
206e0 20 20 20 20 69 6e 74 20 63 51 75 6f 74 65 20 3d      int cQuote =
206f0 20 63 3b 0a 20 20 20 20 70 63 20 3d 20 70 70 63   c;.    pc = ppc
20700 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
20710 20 31 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20   1 ){.      c = 
20720 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
20730 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20      if( c==rSep 
20740 29 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20  ) p->nLine++;.  
20750 20 20 20 20 69 66 28 20 63 3d 3d 63 51 75 6f 74      if( c==cQuot
20760 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
20770 20 70 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20   pc==cQuote ){. 
20780 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 30 3b           pc = 0;
20790 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
207a0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
207b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
207c0 20 28 63 3d 3d 63 53 65 70 20 26 26 20 70 63 3d   (c==cSep && pc=
207d0 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20  =cQuote).       
207e0 7c 7c 20 28 63 3d 3d 72 53 65 70 20 26 26 20 70  || (c==rSep && p
207f0 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20  c==cQuote).     
20800 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20 26 26    || (c==rSep &&
20810 20 70 63 3d 3d 27 5c 72 27 20 26 26 20 70 70 63   pc=='\r' && ppc
20820 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20  ==cQuote).      
20830 20 7c 7c 20 28 63 3d 3d 45 4f 46 20 26 26 20 70   || (c==EOF && p
20840 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20  c==cQuote).     
20850 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 20   ){.        do{ 
20860 70 2d 3e 6e 2d 2d 3b 20 7d 77 68 69 6c 65 28 20  p->n--; }while( 
20870 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21 3d 63 51 75 6f  p->z[p->n]!=cQuo
20880 74 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  te );.        p-
20890 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20  >cTerm = c;.    
208a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
208b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 63 3d   }.      if( pc=
208c0 3d 63 51 75 6f 74 65 20 26 26 20 63 21 3d 27 5c  =cQuote && c!='\
208d0 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  r' ){.        ut
208e0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
208f0 2c 20 22 25 73 3a 25 64 3a 20 75 6e 65 73 63 61  , "%s:%d: unesca
20900 70 65 64 20 25 63 20 63 68 61 72 61 63 74 65 72  ped %c character
20910 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
20920 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 70       p->zFile, p
20930 2d 3e 6e 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29  ->nLine, cQuote)
20940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20950 69 66 28 20 63 3d 3d 45 4f 46 20 29 7b 0a 20 20  if( c==EOF ){.  
20960 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
20970 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64  f(stderr, "%s:%d
20980 3a 20 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 25  : unterminated %
20990 63 2d 71 75 6f 74 65 64 20 66 69 65 6c 64 5c 6e  c-quoted field\n
209a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
209b0 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 73 74 61     p->zFile, sta
209c0 72 74 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b  rtLine, cQuote);
209d0 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 54 65 72  .        p->cTer
209e0 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62  m = c;.        b
209f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
20a00 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e      import_appen
20a10 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20  d_char(p, c);.  
20a20 20 20 20 20 70 70 63 20 3d 20 70 63 3b 0a 20 20      ppc = pc;.  
20a30 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20      pc = c;.    
20a40 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
20a50 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
20a60 20 66 69 72 73 74 20 66 69 65 6c 64 20 62 65 69   first field bei
20a70 6e 67 20 70 61 72 73 65 64 20 61 6e 64 20 69 74  ng parsed and it
20a80 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65   begins with the
20a90 0a 20 20 20 20 2a 2a 20 55 54 46 2d 38 20 42 4f  .    ** UTF-8 BO
20aa0 4d 20 20 28 30 78 45 46 20 42 42 20 42 46 29 20  M  (0xEF BB BF) 
20ab0 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 42 4f  then skip the BO
20ac0 4d 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 63 26  M */.    if( (c&
20ad0 30 78 66 66 29 3d 3d 30 78 65 66 20 26 26 20 70  0xff)==0xef && p
20ae0 2d 3e 62 4e 6f 74 46 69 72 73 74 3d 3d 30 20 29  ->bNotFirst==0 )
20af0 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61  {.      import_a
20b00 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29  ppend_char(p, c)
20b10 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65 74  ;.      c = fget
20b20 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20  c(p->in);.      
20b30 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78  if( (c&0xff)==0x
20b40 62 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6d  bb ){.        im
20b50 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72  port_append_char
20b60 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 20 20  (p, c);.        
20b70 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
20b80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 63  ;.        if( (c
20b90 26 30 78 66 66 29 3d 3d 30 78 62 66 20 29 7b 0a  &0xff)==0xbf ){.
20ba0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62 4e 6f            p->bNo
20bb0 74 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20  tFirst = 1;.    
20bc0 20 20 20 20 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a        p->n = 0;.
20bd0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
20be0 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69   csv_read_one_fi
20bf0 65 6c 64 28 70 29 3b 0a 20 20 20 20 20 20 20 20  eld(p);.        
20c00 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
20c10 20 20 20 20 77 68 69 6c 65 28 20 63 21 3d 45 4f      while( c!=EO
20c20 46 20 26 26 20 63 21 3d 63 53 65 70 20 26 26 20  F && c!=cSep && 
20c30 63 21 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 20  c!=rSep ){.     
20c40 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63   import_append_c
20c50 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20  har(p, c);.     
20c60 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
20c70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
20c80 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20 20   c==rSep ){.    
20c90 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20    p->nLine++;.  
20ca0 20 20 20 20 69 66 28 20 70 2d 3e 6e 3e 30 20 26      if( p->n>0 &
20cb0 26 20 70 2d 3e 7a 5b 70 2d 3e 6e 2d 31 5d 3d 3d  & p->z[p->n-1]==
20cc0 27 5c 72 27 20 29 20 70 2d 3e 6e 2d 2d 3b 0a 20  '\r' ) p->n--;. 
20cd0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 63 54 65 72     }.    p->cTer
20ce0 6d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28  m = c;.  }.  if(
20cf0 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e   p->z ) p->z[p->
20d00 6e 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 62 4e 6f  n] = 0;.  p->bNo
20d10 74 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 72 65  tFirst = 1;.  re
20d20 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a  turn p->z;.}../*
20d30 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 66   Read a single f
20d40 69 65 6c 64 20 6f 66 20 41 53 43 49 49 20 64 65  ield of ASCII de
20d50 6c 69 6d 69 74 65 64 20 74 65 78 74 2e 0a 2a 2a  limited text..**
20d60 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74 20 63  .**   +  Input c
20d70 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e  omes from p->in.
20d80 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 72  .**   +  Store r
20d90 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f  esults in p->z o
20da0 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20  f length p->n.  
20db0 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d  Space to hold p-
20dc0 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20  >z comes.**     
20dd0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
20de0 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b  lloc64()..**   +
20df0 20 20 55 73 65 20 70 2d 3e 63 53 65 70 20 61 73    Use p->cSep as
20e00 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61   the column sepa
20e10 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61  rator.  The defa
20e20 75 6c 74 20 69 73 20 22 5c 78 31 46 22 2e 0a 2a  ult is "\x1F"..*
20e30 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 72 53  *   +  Use p->rS
20e40 65 70 20 61 73 20 74 68 65 20 72 6f 77 20 73 65  ep as the row se
20e50 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65  parator.  The de
20e60 66 61 75 6c 74 20 69 73 20 22 5c 78 31 45 22 2e  fault is "\x1E".
20e70 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20 74 72  .**   +  Keep tr
20e80 61 63 6b 20 6f 66 20 74 68 65 20 72 6f 77 20 6e  ack of the row n
20e90 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e  umber in p->nLin
20ea0 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65  e..**   +  Store
20eb0 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20 74   the character t
20ec0 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20 74  hat terminates t
20ed0 68 65 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63  he field in p->c
20ee0 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20  Term.  Store.** 
20ef0 20 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d       EOF on end-
20f00 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20  of-file..**   + 
20f10 20 52 65 70 6f 72 74 20 73 79 6e 74 61 78 20 65   Report syntax e
20f20 72 72 6f 72 73 20 6f 6e 20 73 74 64 65 72 72 0a  rrors on stderr.
20f30 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
20f40 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 61 73 63  SQLITE_CDECL asc
20f50 69 69 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c  ii_read_one_fiel
20f60 64 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b  d(ImportCtx *p){
20f70 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20  .  int c;.  int 
20f80 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65  cSep = p->cColSe
20f90 70 3b 0a 20 20 69 6e 74 20 72 53 65 70 20 3d 20  p;.  int rSep = 
20fa0 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d  p->cRowSep;.  p-
20fb0 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67  >n = 0;.  c = fg
20fc0 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66  etc(p->in);.  if
20fd0 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e  ( c==EOF || seen
20fe0 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20  Interrupt ){.   
20ff0 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b   p->cTerm = EOF;
21000 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
21010 20 7d 0a 20 20 77 68 69 6c 65 28 20 63 21 3d 45   }.  while( c!=E
21020 4f 46 20 26 26 20 63 21 3d 63 53 65 70 20 26 26  OF && c!=cSep &&
21030 20 63 21 3d 72 53 65 70 20 29 7b 0a 20 20 20 20   c!=rSep ){.    
21040 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68  import_append_ch
21050 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 63 20  ar(p, c);.    c 
21060 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a  = fgetc(p->in);.
21070 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 72 53 65    }.  if( c==rSe
21080 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 69 6e  p ){.    p->nLin
21090 65 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 54  e++;.  }.  p->cT
210a0 65 72 6d 20 3d 20 63 3b 0a 20 20 69 66 28 20 70  erm = c;.  if( p
210b0 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d  ->z ) p->z[p->n]
210c0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 0;.  return p
210d0 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  ->z;.}../*.** Tr
210e0 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20 64 61  y to transfer da
210f0 74 61 20 66 6f 72 20 74 61 62 6c 65 20 7a 54 61  ta for table zTa
21100 62 6c 65 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  ble.  If an erro
21110 72 20 69 73 20 73 65 65 6e 20 77 68 69 6c 65 0a  r is seen while.
21120 2a 2a 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61 72  ** moving forwar
21130 64 2c 20 74 72 79 20 74 6f 20 67 6f 20 62 61 63  d, try to go bac
21140 6b 77 61 72 64 73 2e 20 20 54 68 65 20 62 61 63  kwards.  The bac
21150 6b 77 61 72 64 73 20 6d 6f 76 65 6d 65 6e 74 20  kwards movement 
21160 77 6f 6e 27 74 0a 2a 2a 20 77 6f 72 6b 20 66 6f  won't.** work fo
21170 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
21180 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
21190 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e  c void tryToClon
211a0 65 44 61 74 61 28 0a 20 20 53 68 65 6c 6c 53 74  eData(.  ShellSt
211b0 61 74 65 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65  ate *p,.  sqlite
211c0 33 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73  3 *newDb,.  cons
211d0 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 0a 29  t char *zTable.)
211e0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
211f0 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a 20 20   *pQuery = 0;.  
21200 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49  sqlite3_stmt *pI
21210 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 63 68 61  nsert = 0;.  cha
21220 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20  r *zQuery = 0;. 
21230 20 63 68 61 72 20 2a 7a 49 6e 73 65 72 74 20 3d   char *zInsert =
21240 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
21250 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 69  int i, j, n;.  i
21260 6e 74 20 6e 54 61 62 6c 65 20 3d 20 73 74 72 6c  nt nTable = strl
21270 65 6e 33 30 28 7a 54 61 62 6c 65 29 3b 0a 20 20  en30(zTable);.  
21280 69 6e 74 20 6b 20 3d 20 30 3b 0a 20 20 69 6e 74  int k = 0;.  int
21290 20 63 6e 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73   cnt = 0;.  cons
212a0 74 20 69 6e 74 20 73 70 69 6e 52 61 74 65 20 3d  t int spinRate =
212b0 20 31 30 30 30 30 3b 0a 0a 20 20 7a 51 75 65 72   10000;..  zQuer
212c0 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
212d0 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52  ntf("SELECT * FR
212e0 4f 4d 20 5c 22 25 77 5c 22 22 2c 20 7a 54 61 62  OM \"%w\"", zTab
212f0 6c 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  le);.  rc = sqli
21300 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
21310 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31  ->db, zQuery, -1
21320 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20  , &pQuery, 0);. 
21330 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75   if( rc ){.    u
21340 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
21350 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73  r, "Error %d: %s
21360 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20   on [%s]\n",.   
21370 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21380 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
21390 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65  e(p->db), sqlite
213a0 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c  3_errmsg(p->db),
213b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75  .            zQu
213c0 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ery);.    goto e
213d0 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20  nd_data_xfer;.  
213e0 7d 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  }.  n = sqlite3_
213f0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 51 75  column_count(pQu
21400 65 72 79 29 3b 0a 20 20 7a 49 6e 73 65 72 74 20  ery);.  zInsert 
21410 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
21420 36 34 28 32 30 30 20 2b 20 6e 54 61 62 6c 65 20  64(200 + nTable 
21430 2b 20 6e 2a 33 29 3b 0a 20 20 69 66 28 20 7a 49  + n*3);.  if( zI
21440 6e 73 65 72 74 3d 3d 30 20 29 20 73 68 65 6c 6c  nsert==0 ) shell
21450 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29  _out_of_memory()
21460 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
21470 69 6e 74 66 28 32 30 30 2b 6e 54 61 62 6c 65 2c  intf(200+nTable,
21480 7a 49 6e 73 65 72 74 2c 0a 20 20 20 20 20 20 20  zInsert,.       
21490 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53              "INS
214a0 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e  ERT OR IGNORE IN
214b0 54 4f 20 5c 22 25 73 5c 22 20 56 41 4c 55 45 53  TO \"%s\" VALUES
214c0 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  (?", zTable);.  
214d0 69 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 49 6e  i = strlen30(zIn
214e0 73 65 72 74 29 3b 0a 20 20 66 6f 72 28 6a 3d 31  sert);.  for(j=1
214f0 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<n; j++){.   
21500 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b   memcpy(zInsert+
21510 69 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a 20 20 20  i, ",?", 2);.   
21520 20 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 6d   i += 2;.  }.  m
21530 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b 69 2c  emcpy(zInsert+i,
21540 20 22 29 3b 22 2c 20 33 29 3b 0a 20 20 72 63 20   ");", 3);.  rc 
21550 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
21560 65 5f 76 32 28 6e 65 77 44 62 2c 20 7a 49 6e 73  e_v2(newDb, zIns
21570 65 72 74 2c 20 2d 31 2c 20 26 70 49 6e 73 65 72  ert, -1, &pInser
21580 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  t, 0);.  if( rc 
21590 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
215a0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
215b0 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d  r %d: %s on [%s]
215c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
215d0 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
215e0 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44 62 29  d_errcode(newDb)
215f0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
21600 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20 20 20  (newDb),.       
21610 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
21620 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f    goto end_data_
21630 78 66 65 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  xfer;.  }.  for(
21640 6b 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b 29 7b 0a  k=0; k<2; k++){.
21650 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d      while( (rc =
21660 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51   sqlite3_step(pQ
21670 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52  uery))==SQLITE_R
21680 4f 57 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  OW ){.      for(
21690 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
216a0 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20          switch( 
216b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
216c0 79 70 65 28 70 51 75 65 72 79 2c 20 69 29 20 29  ype(pQuery, i) )
216d0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  {.          case
216e0 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a   SQLITE_NULL: {.
216f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
21700 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49  te3_bind_null(pI
21710 6e 73 65 72 74 2c 20 69 2b 31 29 3b 0a 20 20 20  nsert, i+1);.   
21720 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
21730 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21740 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
21750 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
21760 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21770 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 49 6e 73  _bind_int64(pIns
21780 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65  ert, i+1, sqlite
21790 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
217a0 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20  Query,i));.     
217b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
217c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
217d0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
217e0 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20  FLOAT: {.       
217f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
21800 64 5f 64 6f 75 62 6c 65 28 70 49 6e 73 65 72 74  d_double(pInsert
21810 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63  , i+1, sqlite3_c
21820 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 51 75  olumn_double(pQu
21830 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20 20 20  ery,i));.       
21840 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21860 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
21870 58 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  XT: {.          
21880 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
21890 65 78 74 28 70 49 6e 73 65 72 74 2c 20 69 2b 31  ext(pInsert, i+1
218a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
218b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
218c0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
218d0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
218e0 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20  pQuery,i),.     
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21900 20 20 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49          -1, SQLI
21910 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
21920 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
21930 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21940 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
21950 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20  _BLOB: {.       
21960 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
21970 64 5f 62 6c 6f 62 28 70 49 6e 73 65 72 74 2c 20  d_blob(pInsert, 
21980 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  i+1, sqlite3_col
21990 75 6d 6e 5f 62 6c 6f 62 28 70 51 75 65 72 79 2c  umn_blob(pQuery,
219a0 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i),.            
219b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
219e0 79 74 65 73 28 70 51 75 65 72 79 2c 69 29 2c 0a  ytes(pQuery,i),.
219f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a10 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
21a20 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
21a30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
21a40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21a50 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20     }.      } /* 
21a60 45 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20  End for */.     
21a70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
21a80 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20  ep(pInsert);.   
21a90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21aa0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
21ab0 54 45 5f 52 4f 57 20 26 26 20 72 63 21 3d 53 51  TE_ROW && rc!=SQ
21ac0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
21ad0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
21ae0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20  (stderr, "Error 
21af0 25 64 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  %d: %s\n", sqlit
21b00 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
21b10 6f 64 65 28 6e 65 77 44 62 29 2c 0a 20 20 20 20  ode(newDb),.    
21b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b30 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
21b40 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20 20 20  sg(newDb));.    
21b50 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
21b60 33 5f 72 65 73 65 74 28 70 49 6e 73 65 72 74 29  3_reset(pInsert)
21b70 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  ;.      cnt++;. 
21b80 20 20 20 20 20 69 66 28 20 28 63 6e 74 25 73 70       if( (cnt%sp
21b90 69 6e 52 61 74 65 29 3d 3d 30 20 29 7b 0a 20 20  inRate)==0 ){.  
21ba0 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 63        printf("%c
21bb0 5c 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b 28 63 6e  \b", "|/-\\"[(cn
21bc0 74 2f 73 70 69 6e 52 61 74 65 29 25 34 5d 29 3b  t/spinRate)%4]);
21bd0 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73 68 28  .        fflush(
21be0 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d  stdout);.      }
21bf0 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 77 68  .    } /* End wh
21c00 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ile */.    if( r
21c10 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
21c20 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69   break;.    sqli
21c30 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75  te3_finalize(pQu
21c40 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ery);.    sqlite
21c50 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a  3_free(zQuery);.
21c60 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c      zQuery = sql
21c70 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
21c80 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77  LECT * FROM \"%w
21c90 5c 22 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  \" ORDER BY rowi
21ca0 64 20 44 45 53 43 3b 22 2c 0a 20 20 20 20 20 20  d DESC;",.      
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cc0 20 20 20 20 20 20 20 7a 54 61 62 6c 65 29 3b 0a         zTable);.
21cd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21ce0 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
21cf0 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26  b, zQuery, -1, &
21d00 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20  pQuery, 0);.    
21d10 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
21d20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
21d30 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20 63 61  rr, "Warning: ca
21d40 6e 6e 6f 74 20 73 74 65 70 20 5c 22 25 73 5c 22  nnot step \"%s\"
21d50 20 62 61 63 6b 77 61 72 64 73 22 2c 20 7a 54 61   backwards", zTa
21d60 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ble);.      brea
21d70 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20  k;.    }.  } /* 
21d80 45 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e 2e 29 20  End for(k=0...) 
21d90 2a 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f 78 66 65  */..end_data_xfe
21da0 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  r:.  sqlite3_fin
21db0 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20  alize(pQuery);. 
21dc0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
21dd0 65 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 73 71  e(pInsert);.  sq
21de0 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72  lite3_free(zQuer
21df0 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  y);.  sqlite3_fr
21e00 65 65 28 7a 49 6e 73 65 72 74 29 3b 0a 7d 0a 0a  ee(zInsert);.}..
21e10 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72  ./*.** Try to tr
21e20 61 6e 73 66 65 72 20 61 6c 6c 20 72 6f 77 73 20  ansfer all rows 
21e30 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 74 68  of the schema th
21e40 61 74 20 6d 61 74 63 68 20 7a 57 68 65 72 65 2e  at match zWhere.
21e50 20 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 72 6f    For.** each ro
21e60 77 2c 20 69 6e 76 6f 6b 65 20 78 46 6f 72 45 61  w, invoke xForEa
21e70 63 68 28 29 20 6f 6e 20 74 68 65 20 6f 62 6a 65  ch() on the obje
21e80 63 74 20 64 65 66 69 6e 65 64 20 62 79 20 74 68  ct defined by th
21e90 61 74 20 72 6f 77 2e 0a 2a 2a 20 49 66 20 61 6e  at row..** If an
21ea0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
21eb0 74 65 72 65 64 20 77 68 69 6c 65 20 6d 6f 76 69  tered while movi
21ec0 6e 67 20 66 6f 72 77 61 72 64 20 74 68 72 6f 75  ng forward throu
21ed0 67 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  gh the.** sqlite
21ee0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2c 20 74  _master table, t
21ef0 72 79 20 61 67 61 69 6e 20 6d 6f 76 69 6e 67 20  ry again moving 
21f00 62 61 63 6b 77 61 72 64 73 2e 0a 2a 2f 0a 73 74  backwards..*/.st
21f10 61 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43  atic void tryToC
21f20 6c 6f 6e 65 53 63 68 65 6d 61 28 0a 20 20 53 68  loneSchema(.  Sh
21f30 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 73  ellState *p,.  s
21f40 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20  qlite3 *newDb,. 
21f50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 68   const char *zWh
21f60 65 72 65 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  ere,.  void (*xF
21f70 6f 72 45 61 63 68 29 28 53 68 65 6c 6c 53 74 61  orEach)(ShellSta
21f80 74 65 2a 2c 73 71 6c 69 74 65 33 2a 2c 63 6f 6e  te*,sqlite3*,con
21f90 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73  st char*).){.  s
21fa0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75  qlite3_stmt *pQu
21fb0 65 72 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ery = 0;.  char 
21fc0 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 69  *zQuery = 0;.  i
21fd0 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 75  nt rc;.  const u
21fe0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4e  nsigned char *zN
21ff0 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  ame;.  const uns
22000 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 71 6c  igned char *zSql
22010 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
22020 67 20 3d 20 30 3b 0a 0a 20 20 7a 51 75 65 72 79  g = 0;..  zQuery
22030 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
22040 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c  tf("SELECT name,
22050 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
22060 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20  _master".       
22070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22080 20 20 20 20 22 20 57 48 45 52 45 20 25 73 22 2c      " WHERE %s",
22090 20 7a 57 68 65 72 65 29 3b 0a 20 20 72 63 20 3d   zWhere);.  rc =
220a0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
220b0 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  _v2(p->db, zQuer
220c0 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20  y, -1, &pQuery, 
220d0 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
220e0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
220f0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
22100 28 25 64 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c  (%d) %s on [%s]\
22110 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
22120 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
22130 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
22140 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33  (p->db), sqlite3
22150 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a  _errmsg(p->db),.
22160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22170 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20      zQuery);.   
22180 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61   goto end_schema
22190 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 77 68 69  _xfer;.  }.  whi
221a0 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  le( (rc = sqlite
221b0 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d  3_step(pQuery))=
221c0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
221d0 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
221e0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
221f0 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 7a  Query, 0);.    z
22200 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Sql = sqlite3_co
22210 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79  lumn_text(pQuery
22220 2c 20 31 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  , 1);.    printf
22230 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65  ("%s... ", zName
22240 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  ); fflush(stdout
22250 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  );.    sqlite3_e
22260 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73  xec(newDb, (cons
22270 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c  t char*)zSql, 0,
22280 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20   0, &zErrMsg);. 
22290 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29     if( zErrMsg )
222a0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
222b0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
222c0 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73  or: %s\nSQL: [%s
222d0 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a  ]\n", zErrMsg, z
222e0 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sql);.      sqli
222f0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
22300 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d 73 67  );.      zErrMsg
22310 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
22320 69 66 28 20 78 46 6f 72 45 61 63 68 20 29 7b 0a  if( xForEach ){.
22330 20 20 20 20 20 20 78 46 6f 72 45 61 63 68 28 70        xForEach(p
22340 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20  , newDb, (const 
22350 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20  char*)zName);.  
22360 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22    }.    printf("
22370 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  done\n");.  }.  
22380 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  if( rc!=SQLITE_D
22390 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ONE ){.    sqlit
223a0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65  e3_finalize(pQue
223b0 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
223c0 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20  _free(zQuery);. 
223d0 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69     zQuery = sqli
223e0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
223f0 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52  ECT name, sql FR
22400 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
22410 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
22420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
22430 20 57 48 45 52 45 20 25 73 20 4f 52 44 45 52 20   WHERE %s ORDER 
22440 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20  BY rowid DESC", 
22450 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 72 63 20  zWhere);.    rc 
22460 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
22470 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65  e_v2(p->db, zQue
22480 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c  ry, -1, &pQuery,
22490 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
224a0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
224b0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
224c0 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f 6e 20  ror: (%d) %s on 
224d0 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20  [%s]\n",.       
224e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
224f0 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
22500 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20  errcode(p->db), 
22510 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
22520 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20  ->db),.         
22530 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75               zQu
22540 65 72 79 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ery);.      goto
22550 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72   end_schema_xfer
22560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
22570 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  e( (rc = sqlite3
22580 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d  _step(pQuery))==
22590 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
225a0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
225b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
225c0 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20  pQuery, 0);.    
225d0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
225e0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75  _column_text(pQu
225f0 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 70  ery, 1);.      p
22600 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20  rintf("%s... ", 
22610 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68 28 73  zName); fflush(s
22620 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 73 71  tdout);.      sq
22630 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62  lite3_exec(newDb
22640 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  , (const char*)z
22650 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72  Sql, 0, 0, &zErr
22660 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Msg);.      if( 
22670 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
22680 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
22690 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
226a0 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  s\nSQL: [%s]\n",
226b0 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b   zErrMsg, zSql);
226c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
226d0 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
226e0 20 20 20 20 20 20 20 20 7a 45 72 72 4d 73 67 20          zErrMsg 
226f0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
22700 20 20 20 69 66 28 20 78 46 6f 72 45 61 63 68 20     if( xForEach 
22710 29 7b 0a 20 20 20 20 20 20 20 20 78 46 6f 72 45  ){.        xForE
22720 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20 28 63  ach(p, newDb, (c
22730 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65  onst char*)zName
22740 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
22750 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22   printf("done\n"
22760 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65 6e 64  );.    }.  }.end
22770 5f 73 63 68 65 6d 61 5f 78 66 65 72 3a 0a 20 20  _schema_xfer:.  
22780 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
22790 28 70 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69  (pQuery);.  sqli
227a0 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29  te3_free(zQuery)
227b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
227c0 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 66  a new database f
227d0 69 6c 65 20 6e 61 6d 65 64 20 22 7a 4e 65 77 44  ile named "zNewD
227e0 62 22 2e 20 20 54 72 79 20 74 6f 20 72 65 63 6f  b".  Try to reco
227f0 76 65 72 20 61 73 20 6d 75 63 68 20 69 6e 66 6f  ver as much info
22800 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 73 20 70 6f  rmation.** as po
22810 73 73 69 62 6c 65 20 6f 75 74 20 6f 66 20 74 68  ssible out of th
22820 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
22830 28 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20  (which might be 
22840 63 6f 72 72 75 70 74 29 20 61 6e 64 20 77 72 69  corrupt) and wri
22850 74 65 20 69 74 0a 2a 2a 20 69 6e 74 6f 20 7a 4e  te it.** into zN
22860 65 77 44 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ewDb..*/.static 
22870 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65 28  void tryToClone(
22880 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63  ShellState *p, c
22890 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 44  onst char *zNewD
228a0 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  b){.  int rc;.  
228b0 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 20 3d  sqlite3 *newDb =
228c0 20 30 3b 0a 20 20 69 66 28 20 61 63 63 65 73 73   0;.  if( access
228d0 28 7a 4e 65 77 44 62 2c 30 29 3d 3d 30 20 29 7b  (zNewDb,0)==0 ){
228e0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
228f0 28 73 74 64 65 72 72 2c 20 22 46 69 6c 65 20 5c  (stderr, "File \
22900 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20 65 78  "%s\" already ex
22910 69 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65 77 44 62  ists.\n", zNewDb
22920 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
22930 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
22940 33 5f 6f 70 65 6e 28 7a 4e 65 77 44 62 2c 20 26  3_open(zNewDb, &
22950 6e 65 77 44 62 29 3b 0a 20 20 69 66 28 20 72 63  newDb);.  if( rc
22960 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
22970 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e  ntf(stderr, "Can
22980 6e 6f 74 20 63 72 65 61 74 65 20 6f 75 74 70 75  not create outpu
22990 74 20 64 61 74 61 62 61 73 65 3a 20 25 73 5c 6e  t database: %s\n
229a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ",.            s
229b0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 6e 65  qlite3_errmsg(ne
229c0 77 44 62 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  wDb));.  }else{.
229d0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
229e0 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20  (p->db, "PRAGMA 
229f0 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
22a00 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ON;", 0, 0, 0);.
22a10 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
22a20 28 6e 65 77 44 62 2c 20 22 42 45 47 49 4e 20 45  (newDb, "BEGIN E
22a30 58 43 4c 55 53 49 56 45 3b 22 2c 20 30 2c 20 30  XCLUSIVE;", 0, 0
22a40 2c 20 30 29 3b 0a 20 20 20 20 74 72 79 54 6f 43  , 0);.    tryToC
22a50 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e 65  loneSchema(p, ne
22a60 77 44 62 2c 20 22 74 79 70 65 3d 27 74 61 62 6c  wDb, "type='tabl
22a70 65 27 22 2c 20 74 72 79 54 6f 43 6c 6f 6e 65 44  e'", tryToCloneD
22a80 61 74 61 29 3b 0a 20 20 20 20 74 72 79 54 6f 43  ata);.    tryToC
22a90 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e 65  loneSchema(p, ne
22aa0 77 44 62 2c 20 22 74 79 70 65 21 3d 27 74 61 62  wDb, "type!='tab
22ab0 6c 65 27 22 2c 20 30 29 3b 0a 20 20 20 20 73 71  le'", 0);.    sq
22ac0 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62  lite3_exec(newDb
22ad0 2c 20 22 43 4f 4d 4d 49 54 3b 22 2c 20 30 2c 20  , "COMMIT;", 0, 
22ae0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
22af0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
22b00 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
22b10 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c  schema=OFF;", 0,
22b20 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 63 6c   0, 0);.  }.  cl
22b30 6f 73 65 5f 64 62 28 6e 65 77 44 62 29 3b 0a 7d  ose_db(newDb);.}
22b40 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
22b50 68 65 20 6f 75 74 70 75 74 20 66 69 6c 65 20 62  he output file b
22b60 61 63 6b 20 74 6f 20 73 74 64 6f 75 74 2e 0a 2a  ack to stdout..*
22b70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 2d 3e 64  *.** If the p->d
22b80 6f 58 64 67 4f 70 65 6e 20 66 6c 61 67 20 69 73  oXdgOpen flag is
22b90 20 73 65 74 2c 20 74 68 61 74 20 6d 65 61 6e 73   set, that means
22ba0 20 74 68 65 20 6f 75 74 70 75 74 20 77 61 73 20   the output was 
22bb0 62 65 69 6e 67 0a 2a 2a 20 72 65 64 69 72 65 63  being.** redirec
22bc0 74 65 64 20 74 6f 20 61 20 74 65 6d 70 6f 72 61  ted to a tempora
22bd0 72 79 20 66 69 6c 65 20 6e 61 6d 65 64 20 62 79  ry file named by
22be0 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 2e 20 20   p->zTempFile.  
22bf0 49 6e 20 74 68 61 74 20 63 61 73 65 2c 0a 2a 2a  In that case,.**
22c00 20 6c 61 75 6e 63 68 20 73 74 61 72 74 2f 6f 70   launch start/op
22c10 65 6e 2f 78 64 67 2d 6f 70 65 6e 20 6f 6e 20 74  en/xdg-open on t
22c20 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69  hat temporary fi
22c30 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
22c40 69 64 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28  id output_reset(
22c50 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
22c60 20 20 69 66 28 20 70 2d 3e 6f 75 74 66 69 6c 65    if( p->outfile
22c70 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 6e  [0]=='|' ){.#ifn
22c80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22c90 50 4f 50 45 4e 0a 20 20 20 20 70 63 6c 6f 73 65  POPEN.    pclose
22ca0 28 70 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64 69 66  (p->out);.#endif
22cb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 75  .  }else{.    ou
22cc0 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28  tput_file_close(
22cd0 70 2d 3e 6f 75 74 29 3b 0a 23 69 66 6e 64 65 66  p->out);.#ifndef
22ce0 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53   SQLITE_NOHAVE_S
22cf0 59 53 54 45 4d 0a 20 20 20 20 69 66 28 20 70 2d  YSTEM.    if( p-
22d00 3e 64 6f 58 64 67 4f 70 65 6e 20 29 7b 0a 20 20  >doXdgOpen ){.  
22d10 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
22d20 7a 58 64 67 4f 70 65 6e 43 6d 64 20 3d 0a 23 69  zXdgOpenCmd =.#i
22d30 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
22d40 29 0a 20 20 20 20 20 20 22 73 74 61 72 74 22 3b  ).      "start";
22d50 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f  .#elif defined(_
22d60 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 20 20  _APPLE__).      
22d70 22 6f 70 65 6e 22 3b 0a 23 65 6c 73 65 0a 20 20  "open";.#else.  
22d80 20 20 20 20 22 78 64 67 2d 6f 70 65 6e 22 3b 0a      "xdg-open";.
22d90 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 68 61  #endif.      cha
22da0 72 20 2a 7a 43 6d 64 3b 0a 20 20 20 20 20 20 7a  r *zCmd;.      z
22db0 43 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Cmd = sqlite3_mp
22dc0 72 69 6e 74 66 28 22 25 73 20 25 73 22 2c 20 7a  rintf("%s %s", z
22dd0 58 64 67 4f 70 65 6e 43 6d 64 2c 20 70 2d 3e 7a  XdgOpenCmd, p->z
22de0 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  TempFile);.     
22df0 20 69 66 28 20 73 79 73 74 65 6d 28 7a 43 6d 64   if( system(zCmd
22e00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  ) ){.        utf
22e10 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
22e20 20 22 46 61 69 6c 65 64 3a 20 5b 25 73 5d 5c 6e   "Failed: [%s]\n
22e30 22 2c 20 7a 43 6d 64 29 3b 0a 20 20 20 20 20 20  ", zCmd);.      
22e40 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
22e50 66 72 65 65 28 7a 43 6d 64 29 3b 0a 20 20 20 20  free(zCmd);.    
22e60 20 20 6f 75 74 70 75 74 4d 6f 64 65 50 6f 70 28    outputModePop(
22e70 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 6f 58  p);.      p->doX
22e80 64 67 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  dgOpen = 0;.    
22e90 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
22ea0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 48 41  ined(SQLITE_NOHA
22eb0 56 45 5f 53 59 53 54 45 4d 29 20 2a 2f 0a 20 20  VE_SYSTEM) */.  
22ec0 7d 0a 20 20 70 2d 3e 6f 75 74 66 69 6c 65 5b 30  }.  p->outfile[0
22ed0 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6f 75 74 20  ] = 0;.  p->out 
22ee0 3d 20 73 74 64 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a  = stdout;.}../*.
22ef0 2a 2a 20 52 75 6e 20 61 6e 20 53 51 4c 20 63 6f  ** Run an SQL co
22f00 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74 75 72 6e  mmand and return
22f10 20 74 68 65 20 73 69 6e 67 6c 65 20 69 6e 74 65   the single inte
22f20 67 65 72 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73  ger result..*/.s
22f30 74 61 74 69 63 20 69 6e 74 20 64 62 5f 69 6e 74  tatic int db_int
22f40 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
22f50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
22f60 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
22f70 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
22f80 72 65 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  res = 0;.  sqlit
22f90 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
22fa0 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
22fb0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
22fc0 20 70 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65   pStmt && sqlite
22fd0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
22fe0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
22ff0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 63   res = sqlite3_c
23000 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
23010 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
23020 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
23030 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
23040 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
23050 74 20 61 20 32 2d 62 79 74 65 20 6f 72 20 34 2d  t a 2-byte or 4-
23060 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
23070 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 6e  integer into a n
23080 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f  ative integer.*/
23090 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
230a0 20 69 6e 74 20 67 65 74 32 62 79 74 65 49 6e 74   int get2byteInt
230b0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
230c0 61 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 61 5b  a){.  return (a[
230d0 30 5d 3c 3c 38 29 20 2b 20 61 5b 31 5d 3b 0a 7d  0]<<8) + a[1];.}
230e0 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
230f0 20 69 6e 74 20 67 65 74 34 62 79 74 65 49 6e 74   int get4byteInt
23100 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
23110 61 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 61 5b  a){.  return (a[
23120 30 5d 3c 3c 32 34 29 20 2b 20 28 61 5b 31 5d 3c  0]<<24) + (a[1]<
23130 3c 31 36 29 20 2b 20 28 61 5b 32 5d 3c 3c 38 29  <16) + (a[2]<<8)
23140 20 2b 20 61 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a   + a[3];.}../*.*
23150 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
23160 20 6f 66 20 74 68 65 20 22 2e 69 6e 66 6f 22 20   of the ".info" 
23170 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 52  command..**.** R
23180 65 74 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72  eturn 1 on error
23190 2c 20 32 20 74 6f 20 65 78 69 74 2c 20 61 6e 64  , 2 to exit, and
231a0 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f   0 otherwise..*/
231b0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c  .static int shel
231c0 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64  l_dbinfo_command
231d0 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
231e0 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a  int nArg, char *
231f0 2a 61 7a 41 72 67 29 7b 0a 20 20 73 74 61 74 69  *azArg){.  stati
23200 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
23210 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
23220 6d 65 3b 20 69 6e 74 20 6f 66 73 74 3b 20 7d 20  me; int ofst; } 
23230 61 46 69 65 6c 64 5b 5d 20 3d 20 7b 0a 20 20 20  aField[] = {.   
23240 20 20 7b 20 22 66 69 6c 65 20 63 68 61 6e 67 65    { "file change
23250 20 63 6f 75 6e 74 65 72 3a 22 2c 20 20 32 34 20   counter:",  24 
23260 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61 74 61   },.     { "data
23270 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 3a  base page count:
23280 22 2c 20 20 32 38 20 20 7d 2c 0a 20 20 20 20 20  ",  28  },.     
23290 7b 20 22 66 72 65 65 6c 69 73 74 20 70 61 67 65  { "freelist page
232a0 20 63 6f 75 6e 74 3a 22 2c 20 20 33 36 20 20 7d   count:",  36  }
232b0 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d 61  ,.     { "schema
232c0 20 63 6f 6f 6b 69 65 3a 22 2c 20 20 20 20 20 20   cookie:",      
232d0 20 20 34 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20    40  },.     { 
232e0 22 73 63 68 65 6d 61 20 66 6f 72 6d 61 74 3a 22  "schema format:"
232f0 2c 20 20 20 20 20 20 20 20 34 34 20 20 7d 2c 0a  ,        44  },.
23300 20 20 20 20 20 7b 20 22 64 65 66 61 75 6c 74 20       { "default 
23310 63 61 63 68 65 20 73 69 7a 65 3a 22 2c 20 20 20  cache size:",   
23320 34 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61  48  },.     { "a
23330 75 74 6f 76 61 63 75 75 6d 20 74 6f 70 20 72 6f  utovacuum top ro
23340 6f 74 3a 22 2c 20 20 35 32 20 20 7d 2c 0a 20 20  ot:",  52  },.  
23350 20 20 20 7b 20 22 69 6e 63 72 65 6d 65 6e 74 61     { "incrementa
23360 6c 20 76 61 63 75 75 6d 3a 22 2c 20 20 20 36 34  l vacuum:",   64
23370 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65 78    },.     { "tex
23380 74 20 65 6e 63 6f 64 69 6e 67 3a 22 2c 20 20 20  t encoding:",   
23390 20 20 20 20 20 35 36 20 20 7d 2c 0a 20 20 20 20       56  },.    
233a0 20 7b 20 22 75 73 65 72 20 76 65 72 73 69 6f 6e   { "user version
233b0 3a 22 2c 20 20 20 20 20 20 20 20 20 36 30 20 20  :",         60  
233c0 7d 2c 0a 20 20 20 20 20 7b 20 22 61 70 70 6c 69  },.     { "appli
233d0 63 61 74 69 6f 6e 20 69 64 3a 22 2c 20 20 20 20  cation id:",    
233e0 20 20 20 36 38 20 20 7d 2c 0a 20 20 20 20 20 7b     68  },.     {
233f0 20 22 73 6f 66 74 77 61 72 65 20 76 65 72 73 69   "software versi
23400 6f 6e 3a 22 2c 20 20 20 20 20 39 36 20 20 7d 2c  on:",     96  },
23410 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  .  };.  static c
23420 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63 6f  onst struct { co
23430 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
23440 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
23450 6c 3b 20 7d 20 61 51 75 65 72 79 5b 5d 20 3d 20  l; } aQuery[] = 
23460 7b 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72  {.     { "number
23470 20 6f 66 20 74 61 62 6c 65 73 3a 22 2c 0a 20 20   of tables:",.  
23480 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75       "SELECT cou
23490 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48  nt(*) FROM %s WH
234a0 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27  ERE type='table'
234b0 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d  " },.     { "num
234c0 62 65 72 20 6f 66 20 69 6e 64 65 78 65 73 3a 22  ber of indexes:"
234d0 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  ,.       "SELECT
234e0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25   count(*) FROM %
234f0 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e  s WHERE type='in
23500 64 65 78 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20  dex'" },.     { 
23510 22 6e 75 6d 62 65 72 20 6f 66 20 74 72 69 67 67  "number of trigg
23520 65 72 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53  ers:",.       "S
23530 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
23540 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70  ROM %s WHERE typ
23550 65 3d 27 74 72 69 67 67 65 72 27 22 20 7d 2c 0a  e='trigger'" },.
23560 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f       { "number o
23570 66 20 76 69 65 77 73 3a 22 2c 0a 20 20 20 20 20  f views:",.     
23580 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
23590 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45  *) FROM %s WHERE
235a0 20 74 79 70 65 3d 27 76 69 65 77 27 22 20 7d 2c   type='view'" },
235b0 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d 61 20  .     { "schema 
235c0 73 69 7a 65 3a 22 2c 0a 20 20 20 20 20 20 20 22  size:",.       "
235d0 53 45 4c 45 43 54 20 74 6f 74 61 6c 28 6c 65 6e  SELECT total(len
235e0 67 74 68 28 73 71 6c 29 29 20 46 52 4f 4d 20 25  gth(sql)) FROM %
235f0 73 22 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74  s" },.  };.  int
23600 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   i;.  unsigned i
23610 44 61 74 61 56 65 72 73 69 6f 6e 3b 0a 20 20 63  DataVersion;.  c
23620 68 61 72 20 2a 7a 53 63 68 65 6d 61 54 61 62 3b  har *zSchemaTab;
23630 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 6e  .  char *zDb = n
23640 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31  Arg>=2 ? azArg[1
23650 5d 20 3a 20 22 6d 61 69 6e 22 3b 0a 20 20 73 71  ] : "main";.  sq
23660 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
23670 74 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  t = 0;.  unsigne
23680 64 20 63 68 61 72 20 61 48 64 72 5b 31 30 30 5d  d char aHdr[100]
23690 3b 0a 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30  ;.  open_db(p, 0
236a0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  );.  if( p->db==
236b0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
236c0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
236d0 76 32 28 70 2d 3e 64 62 2c 22 53 45 4c 45 43 54  v2(p->db,"SELECT
236e0 20 64 61 74 61 20 46 52 4f 4d 20 73 71 6c 69 74   data FROM sqlit
236f0 65 5f 64 62 70 61 67 65 28 3f 31 29 20 57 48 45  e_dbpage(?1) WHE
23700 52 45 20 70 67 6e 6f 3d 31 22 2c 0a 20 20 20 20  RE pgno=1",.    
23710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23720 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
23730 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
23740 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a  text(pStmt, 1, z
23750 44 62 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  Db, -1, SQLITE_S
23760 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 73 71  TATIC);.  if( sq
23770 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
23780 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20  )==SQLITE_ROW.  
23790 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   && sqlite3_colu
237a0 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 30  mn_bytes(pStmt,0
237b0 29 3e 31 30 30 0a 20 20 29 7b 0a 20 20 20 20 6d  )>100.  ){.    m
237c0 65 6d 63 70 79 28 61 48 64 72 2c 20 73 71 6c 69  emcpy(aHdr, sqli
237d0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
237e0 70 53 74 6d 74 2c 30 29 2c 20 31 30 30 29 3b 0a  pStmt,0), 100);.
237f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
23800 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d  lize(pStmt);.  }
23810 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72  else{.    raw_pr
23820 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e  intf(stderr, "un
23830 61 62 6c 65 20 74 6f 20 72 65 61 64 20 64 61 74  able to read dat
23840 61 62 61 73 65 20 68 65 61 64 65 72 5c 6e 22 29  abase header\n")
23850 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
23860 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
23870 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
23880 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 49  .  i = get2byteI
23890 6e 74 28 61 48 64 72 2b 31 36 29 3b 0a 20 20 69  nt(aHdr+16);.  i
238a0 66 28 20 69 3d 3d 31 20 29 20 69 20 3d 20 36 35  f( i==1 ) i = 65
238b0 35 33 36 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  536;.  utf8_prin
238c0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
238d0 73 20 25 64 5c 6e 22 2c 20 22 64 61 74 61 62 61  s %d\n", "databa
238e0 73 65 20 70 61 67 65 20 73 69 7a 65 3a 22 2c 20  se page size:", 
238f0 69 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  i);.  utf8_print
23900 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73  f(p->out, "%-20s
23910 20 25 64 5c 6e 22 2c 20 22 77 72 69 74 65 20 66   %d\n", "write f
23920 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31 38  ormat:", aHdr[18
23930 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  ]);.  utf8_print
23940 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73  f(p->out, "%-20s
23950 20 25 64 5c 6e 22 2c 20 22 72 65 61 64 20 66 6f   %d\n", "read fo
23960 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31 39 5d  rmat:", aHdr[19]
23970 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  );.  utf8_printf
23980 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20  (p->out, "%-20s 
23990 25 64 5c 6e 22 2c 20 22 72 65 73 65 72 76 65 64  %d\n", "reserved
239a0 20 62 79 74 65 73 3a 22 2c 20 61 48 64 72 5b 32   bytes:", aHdr[2
239b0 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0]);.  for(i=0; 
239c0 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 69 65  i<ArraySize(aFie
239d0 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ld); i++){.    i
239e0 6e 74 20 6f 66 73 74 20 3d 20 61 46 69 65 6c 64  nt ofst = aField
239f0 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20 20 20 75 6e  [i].ofst;.    un
23a00 73 69 67 6e 65 64 20 69 6e 74 20 76 61 6c 20 3d  signed int val =
23a10 20 67 65 74 34 62 79 74 65 49 6e 74 28 61 48 64   get4byteInt(aHd
23a20 72 20 2b 20 6f 66 73 74 29 3b 0a 20 20 20 20 75  r + ofst);.    u
23a30 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
23a40 74 2c 20 22 25 2d 32 30 73 20 25 75 22 2c 20 61  t, "%-20s %u", a
23a50 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  Field[i].zName, 
23a60 76 61 6c 29 3b 0a 20 20 20 20 73 77 69 74 63 68  val);.    switch
23a70 28 20 6f 66 73 74 20 29 7b 0a 20 20 20 20 20 20  ( ofst ){.      
23a80 63 61 73 65 20 35 36 3a 20 7b 0a 20 20 20 20 20  case 56: {.     
23a90 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20 29 20     if( val==1 ) 
23aa0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
23ab0 74 2c 20 22 20 28 75 74 66 38 29 22 29 3b 0a 20  t, " (utf8)");. 
23ac0 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d         if( val==
23ad0 32 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  2 ) raw_printf(p
23ae0 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 31 36 6c  ->out, " (utf16l
23af0 65 29 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  e)");.        if
23b00 28 20 76 61 6c 3d 3d 33 20 29 20 72 61 77 5f 70  ( val==3 ) raw_p
23b10 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20  rintf(p->out, " 
23b20 28 75 74 66 31 36 62 65 29 22 29 3b 0a 20 20 20  (utf16be)");.   
23b30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
23b40 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
23b50 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69  , "\n");.  }.  i
23b60 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20  f( zDb==0 ){.   
23b70 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71   zSchemaTab = sq
23b80 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d  lite3_mprintf("m
23b90 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  ain.sqlite_maste
23ba0 72 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  r");.  }else if(
23bb0 20 73 74 72 63 6d 70 28 7a 44 62 2c 22 74 65 6d   strcmp(zDb,"tem
23bc0 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53  p")==0 ){.    zS
23bd0 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74  chemaTab = sqlit
23be0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
23bf0 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
23c00 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  ster");.  }else{
23c10 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20  .    zSchemaTab 
23c20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
23c30 66 28 22 5c 22 25 77 5c 22 2e 73 71 6c 69 74 65  f("\"%w\".sqlite
23c40 5f 6d 61 73 74 65 72 22 2c 20 7a 44 62 29 3b 0a  _master", zDb);.
23c50 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
23c60 3c 41 72 72 61 79 53 69 7a 65 28 61 51 75 65 72  <ArraySize(aQuer
23c70 79 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  y); i++){.    ch
23c80 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ar *zSql = sqlit
23c90 65 33 5f 6d 70 72 69 6e 74 66 28 61 51 75 65 72  e3_mprintf(aQuer
23ca0 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a 53 63 68 65  y[i].zSql, zSche
23cb0 6d 61 54 61 62 29 3b 0a 20 20 20 20 69 6e 74 20  maTab);.    int 
23cc0 76 61 6c 20 3d 20 64 62 5f 69 6e 74 28 70 2c 20  val = db_int(p, 
23cd0 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  zSql);.    sqlit
23ce0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
23cf0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
23d00 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64  ->out, "%-20s %d
23d10 5c 6e 22 2c 20 61 51 75 65 72 79 5b 69 5d 2e 7a  \n", aQuery[i].z
23d20 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a  Name, val);.  }.
23d30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23d40 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 73 71  SchemaTab);.  sq
23d50 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
23d60 6f 6c 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 53  ol(p->db, zDb, S
23d70 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 41 54 41  QLITE_FCNTL_DATA
23d80 5f 56 45 52 53 49 4f 4e 2c 20 26 69 44 61 74 61  _VERSION, &iData
23d90 56 65 72 73 69 6f 6e 29 3b 0a 20 20 75 74 66 38  Version);.  utf8
23da0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
23db0 22 25 2d 32 30 73 20 25 75 5c 6e 22 2c 20 22 64  "%-20s %u\n", "d
23dc0 61 74 61 20 76 65 72 73 69 6f 6e 22 2c 20 69 44  ata version", iD
23dd0 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 72  ataVersion);.  r
23de0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
23df0 2a 20 50 72 69 6e 74 20 74 68 65 20 63 75 72 72  * Print the curr
23e00 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  ent sqlite3_errm
23e10 73 67 28 29 20 76 61 6c 75 65 20 74 6f 20 73 74  sg() value to st
23e20 64 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20  derr and return 
23e30 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  1..*/.static int
23e40 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45 72   shellDatabaseEr
23e50 72 6f 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ror(sqlite3 *db)
23e60 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
23e70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65  zErr = sqlite3_e
23e80 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 75 74 66  rrmsg(db);.  utf
23e90 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
23ea0 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20   "Error: %s\n", 
23eb0 7a 45 72 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  zErr);.  return 
23ec0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  1;.}../*.** Comp
23ed0 61 72 65 20 74 68 65 20 70 61 74 74 65 72 6e 20  are the pattern 
23ee0 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61 67 61 69 6e  in zGlob[] again
23ef0 73 74 20 74 68 65 20 74 65 78 74 20 69 6e 20 7a  st the text in z
23f00 5b 5d 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  [].  Return TRUE
23f10 0a 2a 2a 20 69 66 20 74 68 65 79 20 6d 61 74 63  .** if they matc
23f20 68 20 61 6e 64 20 46 41 4c 53 45 20 28 30 29 20  h and FALSE (0) 
23f30 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d  if they do not m
23f40 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62  atch..**.** Glob
23f50 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a  bing rules:.**.*
23f60 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20 20 20  *      '*'      
23f70 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71   Matches any seq
23f80 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72  uence of zero or
23f90 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73   more characters
23fa0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27  ..**.**      '?'
23fb0 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 65         Matches e
23fc0 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61 72 61  xactly one chara
23fd0 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  cter..**.**     
23fe0 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63 68  [...]      Match
23ff0 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  es one character
24000 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73   from the enclos
24010 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20  ed list of.**   
24020 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61               cha
24030 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20  racters..**.**  
24040 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61     [^...]     Ma
24050 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63  tches one charac
24060 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65 20 65  ter not in the e
24070 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a  nclosed list..**
24080 0a 2a 2a 20 20 20 20 20 20 27 23 27 20 20 20 20  .**      '#'    
24090 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73     Matches any s
240a0 65 71 75 65 6e 63 65 20 6f 66 20 6f 6e 65 20 6f  equence of one o
240b0 72 20 6d 6f 72 65 20 64 69 67 69 74 73 20 77 69  r more digits wi
240c0 74 68 20 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20  th an.**        
240d0 20 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 61 6c          optional
240e0 20 2b 20 6f 72 20 2d 20 73 69 67 6e 20 69 6e 20   + or - sign in 
240f0 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20  front.**.**     
24100 20 27 20 27 20 20 20 20 20 20 20 41 6e 79 20 73   ' '       Any s
24110 70 61 6e 20 6f 66 20 77 68 69 74 65 73 70 61 63  pan of whitespac
24120 65 20 6d 61 74 63 68 65 73 20 61 6e 79 20 6f 74  e matches any ot
24130 68 65 72 20 73 70 61 6e 20 6f 66 0a 2a 2a 20 20  her span of.**  
24140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
24150 69 74 65 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  itespace..**.** 
24160 45 78 74 72 61 20 77 68 69 74 65 73 70 61 63 65  Extra whitespace
24170 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 7a   at the end of z
24180 5b 5d 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  [] is ignored..*
24190 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
241a0 74 63 61 73 65 5f 67 6c 6f 62 28 63 6f 6e 73 74  tcase_glob(const
241b0 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c 20 63 6f   char *zGlob, co
241c0 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
241d0 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20 69 6e 74  int c, c2;.  int
241e0 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20 73   invert;.  int s
241f0 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28  een;..  while( (
24200 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29  c = (*(zGlob++))
24210 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
24220 49 73 53 70 61 63 65 28 63 29 20 29 7b 0a 20 20  IsSpace(c) ){.  
24230 20 20 20 20 69 66 28 20 21 49 73 53 70 61 63 65      if( !IsSpace
24240 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b  (*z) ) return 0;
24250 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73  .      while( Is
24260 53 70 61 63 65 28 2a 7a 47 6c 6f 62 29 20 29 20  Space(*zGlob) ) 
24270 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20 20 20 20 77  zGlob++;.      w
24280 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a  hile( IsSpace(*z
24290 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c  ) ) z++;.    }el
242a0 73 65 20 69 66 28 20 63 3d 3d 27 2a 27 20 29 7b  se if( c=='*' ){
242b0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
242c0 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 20 3d  =(*(zGlob++))) =
242d0 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27 20  = '*' || c=='?' 
242e0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
242f0 3d 3d 27 3f 27 20 26 26 20 28 2a 28 7a 2b 2b 29  =='?' && (*(z++)
24300 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
24310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
24320 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
24330 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
24340 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
24350 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '[' ){.        w
24360 68 69 6c 65 28 20 2a 7a 20 26 26 20 74 65 73 74  hile( *z && test
24370 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2d  case_glob(zGlob-
24380 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  1,z)==0 ){.     
24390 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20       z++;.      
243a0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
243b0 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20 20 20 20  rn (*z)!=0;.    
243c0 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
243d0 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b 29 29 29   (c2 = (*(z++)))
243e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  !=0 ){.        w
243f0 68 69 6c 65 28 20 63 32 21 3d 63 20 29 7b 0a 20  hile( c2!=c ){. 
24400 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28           c2 = *(
24410 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  z++);.          
24420 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75  if( c2==0 ) retu
24430 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 0;.        }.
24440 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74          if( test
24450 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2c  case_glob(zGlob,
24460 7a 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  z) ) return 1;. 
24470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
24480 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
24490 20 69 66 28 20 63 3d 3d 27 3f 27 20 29 7b 0a 20   if( c=='?' ){. 
244a0 20 20 20 20 20 69 66 28 20 28 2a 28 7a 2b 2b 29       if( (*(z++)
244b0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
244c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
244d0 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 69  =='[' ){.      i
244e0 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a  nt prior_c = 0;.
244f0 20 20 20 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a        seen = 0;.
24500 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 30        invert = 0
24510 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 28 7a 2b  ;.      c = *(z+
24520 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  +);.      if( c=
24530 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
24540 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f       c2 = *(zGlo
24550 62 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  b++);.      if( 
24560 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20  c2=='^' ){.     
24570 20 20 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20     invert = 1;. 
24580 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47         c2 = *(zG
24590 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a  lob++);.      }.
245a0 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5d        if( c2==']
245b0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
245c0 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d   c==']' ) seen =
245d0 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d   1;.        c2 =
245e0 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20   *(zGlob++);.   
245f0 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65     }.      while
24600 28 20 63 32 20 26 26 20 63 32 21 3d 27 5d 27 20  ( c2 && c2!=']' 
24610 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
24620 32 3d 3d 27 2d 27 20 26 26 20 7a 47 6c 6f 62 5b  2=='-' && zGlob[
24630 30 5d 21 3d 27 5d 27 20 26 26 20 7a 47 6c 6f 62  0]!=']' && zGlob
24640 5b 30 5d 21 3d 30 20 26 26 20 70 72 69 6f 72 5f  [0]!=0 && prior_
24650 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>0 ){.         
24660 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29   c2 = *(zGlob++)
24670 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
24680 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63 3c  c>=prior_c && c<
24690 3d 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a  =c2 ) seen = 1;.
246a0 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f            prior_
246b0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  c = 0;.        }
246c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
246d0 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20  if( c==c2 ){.   
246e0 20 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20           seen = 
246f0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
24700 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63           prior_c
24710 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20 7d   = c2;.        }
24720 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28  .        c2 = *(
24730 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
24740 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d  }.      if( c2==
24750 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76  0 || (seen ^ inv
24760 65 72 74 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ert)==0 ) return
24770 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
24780 28 20 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20  ( c=='#' ){.    
24790 20 20 69 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d 27    if( (z[0]=='-'
247a0 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20 26   || z[0]=='+') &
247b0 26 20 49 73 44 69 67 69 74 28 7a 5b 31 5d 29 20  & IsDigit(z[1]) 
247c0 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ) z++;.      if(
247d0 20 21 49 73 44 69 67 69 74 28 7a 5b 30 5d 29 20   !IsDigit(z[0]) 
247e0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
247f0 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69    z++;.      whi
24800 6c 65 28 20 49 73 44 69 67 69 74 28 7a 5b 30 5d  le( IsDigit(z[0]
24810 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ z++; }.    
24820 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
24830 20 63 21 3d 28 2a 28 7a 2b 2b 29 29 20 29 20 72   c!=(*(z++)) ) r
24840 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
24850 20 7d 0a 20 20 77 68 69 6c 65 28 20 49 73 53 70   }.  while( IsSp
24860 61 63 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20  ace(*z) ){ z++; 
24870 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30  }.  return *z==0
24880 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ;.}.../*.** Comp
24890 61 72 65 20 74 68 65 20 73 74 72 69 6e 67 20 61  are the string a
248a0 73 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  s a command-line
248b0 20 6f 70 74 69 6f 6e 20 77 69 74 68 20 65 69 74   option with eit
248c0 68 65 72 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 2a  her one or two.*
248d0 2a 20 69 6e 69 74 69 61 6c 20 22 2d 22 20 63 68  * initial "-" ch
248e0 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  aracters..*/.sta
248f0 74 69 63 20 69 6e 74 20 6f 70 74 69 6f 6e 4d 61  tic int optionMa
24900 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tch(const char *
24910 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  zStr, const char
24920 20 2a 7a 4f 70 74 29 7b 0a 20 20 69 66 28 20 7a   *zOpt){.  if( z
24930 53 74 72 5b 30 5d 21 3d 27 2d 27 20 29 20 72 65  Str[0]!='-' ) re
24940 74 75 72 6e 20 30 3b 0a 20 20 7a 53 74 72 2b 2b  turn 0;.  zStr++
24950 3b 0a 20 20 69 66 28 20 7a 53 74 72 5b 30 5d 3d  ;.  if( zStr[0]=
24960 3d 27 2d 27 20 29 20 7a 53 74 72 2b 2b 3b 0a 20  ='-' ) zStr++;. 
24970 20 72 65 74 75 72 6e 20 73 74 72 63 6d 70 28 7a   return strcmp(z
24980 53 74 72 2c 20 7a 4f 70 74 29 3d 3d 30 3b 0a 7d  Str, zOpt)==0;.}
24990 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
249a0 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 68   file..*/.int sh
249b0 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 63 6f  ellDeleteFile(co
249c0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
249d0 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ame){.  int rc;.
249e0 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 20 20  #ifdef _WIN32.  
249f0 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c  wchar_t *z = sql
24a00 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
24a10 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46 69 6c 65  to_unicode(zFile
24a20 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20 5f 77  name);.  rc = _w
24a30 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20 20 73 71 6c  unlink(z);.  sql
24a40 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65  ite3_free(z);.#e
24a50 6c 73 65 0a 20 20 72 63 20 3d 20 75 6e 6c 69 6e  lse.  rc = unlin
24a60 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65  k(zFilename);.#e
24a70 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
24a80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
24a90 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d  o delete the tem
24aa0 70 6f 72 61 72 79 20 66 69 6c 65 20 28 69 66 20  porary file (if 
24ab0 74 68 65 72 65 20 69 73 20 6f 6e 65 29 20 61 6e  there is one) an
24ac0 64 20 66 72 65 65 20 74 68 65 0a 2a 2a 20 6d 65  d free the.** me
24ad0 6d 6f 72 79 20 75 73 65 64 20 74 6f 20 68 6f 6c  mory used to hol
24ae0 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
24af0 65 20 74 65 6d 70 20 66 69 6c 65 2e 0a 2a 2f 0a  e temp file..*/.
24b00 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
24b10 72 54 65 6d 70 46 69 6c 65 28 53 68 65 6c 6c 53  rTempFile(ShellS
24b20 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  tate *p){.  if( 
24b30 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20  p->zTempFile==0 
24b40 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
24b50 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 29 20 72  p->doXdgOpen ) r
24b60 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 68 65  eturn;.  if( she
24b70 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 70 2d 3e  llDeleteFile(p->
24b80 7a 54 65 6d 70 46 69 6c 65 29 20 29 20 72 65 74  zTempFile) ) ret
24b90 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  urn;.  sqlite3_f
24ba0 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  ree(p->zTempFile
24bb0 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  );.  p->zTempFil
24bc0 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
24bd0 43 72 65 61 74 65 20 61 20 6e 65 77 20 74 65 6d  Create a new tem
24be0 70 20 66 69 6c 65 20 6e 61 6d 65 20 77 69 74 68  p file name with
24bf0 20 74 68 65 20 67 69 76 65 6e 20 73 75 66 66 69   the given suffi
24c00 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
24c10 64 20 6e 65 77 54 65 6d 70 46 69 6c 65 28 53 68  d newTempFile(Sh
24c20 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  ellState *p, con
24c30 73 74 20 63 68 61 72 20 2a 7a 53 75 66 66 69 78  st char *zSuffix
24c40 29 7b 0a 20 20 63 6c 65 61 72 54 65 6d 70 46 69  ){.  clearTempFi
24c50 6c 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  le(p);.  sqlite3
24c60 5f 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69  _free(p->zTempFi
24c70 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46  le);.  p->zTempF
24c80 69 6c 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ile = 0;.  if( p
24c90 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  ->db ){.    sqli
24ca0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
24cb0 28 70 2d 3e 64 62 2c 20 30 2c 20 53 51 4c 49 54  (p->db, 0, SQLIT
24cc0 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45  E_FCNTL_TEMPFILE
24cd0 4e 41 4d 45 2c 20 26 70 2d 3e 7a 54 65 6d 70 46  NAME, &p->zTempF
24ce0 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ile);.  }.  if( 
24cf0 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20  p->zTempFile==0 
24d00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 75  ){.    sqlite3_u
24d10 69 6e 74 36 34 20 72 3b 0a 20 20 20 20 73 71 6c  int64 r;.    sql
24d20 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
24d30 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a  sizeof(r), &r);.
24d40 20 20 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65      p->zTempFile
24d50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
24d60 74 66 28 22 74 65 6d 70 25 6c 6c 78 2e 25 73 22  tf("temp%llx.%s"
24d70 2c 20 72 2c 20 7a 53 75 66 66 69 78 29 3b 0a 20  , r, zSuffix);. 
24d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 7a   }else{.    p->z
24d90 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  TempFile = sqlit
24da0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2e 25  e3_mprintf("%z.%
24db0 73 22 2c 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  s", p->zTempFile
24dc0 2c 20 7a 53 75 66 66 69 78 29 3b 0a 20 20 7d 0a  , zSuffix);.  }.
24dd0 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69    if( p->zTempFi
24de0 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77  le==0 ){.    raw
24df0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
24e00 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e  "out of memory\n
24e10 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
24e20 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  .  }.}.../*.** T
24e30 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
24e40 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c 61 72 20  n of SQL scalar 
24e50 66 75 6e 63 74 69 6f 6e 20 66 6b 65 79 5f 63 6f  function fkey_co
24e60 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 2c 20  llate_clause(), 
24e70 75 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 22  used.** by the "
24e80 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78  .lint fkey-index
24e90 65 73 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 69  es" command. Thi
24ea0 73 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  s scalar functio
24eb0 6e 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 63  n is always.** c
24ec0 61 6c 6c 65 64 20 77 69 74 68 20 66 6f 75 72 20  alled with four 
24ed0 61 72 67 75 6d 65 6e 74 73 20 2d 20 74 68 65 20  arguments - the 
24ee0 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6e 61 6d  parent table nam
24ef0 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f  e, the parent co
24f00 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68  lumn name,.** th
24f10 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 6e 61  e child table na
24f20 6d 65 20 61 6e 64 20 74 68 65 20 63 68 69 6c 64  me and the child
24f30 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a   column name..**
24f40 0a 2a 2a 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61  .**   fkey_colla
24f50 74 65 5f 63 6c 61 75 73 65 28 27 70 61 72 65 6e  te_clause('paren
24f60 74 2d 74 61 62 27 2c 20 27 70 61 72 65 6e 74 2d  t-tab', 'parent-
24f70 63 6f 6c 27 2c 20 27 63 68 69 6c 64 2d 74 61 62  col', 'child-tab
24f80 27 2c 20 27 63 68 69 6c 64 2d 63 6f 6c 27 29 0a  ', 'child-col').
24f90 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
24fa0 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  of the named tab
24fb0 6c 65 73 20 6f 72 20 63 6f 6c 75 6d 6e 73 20 64  les or columns d
24fc0 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 69  o not exist, thi
24fd0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  s function.** re
24fe0 74 75 72 6e 73 20 61 6e 20 65 6d 70 74 79 20 73  turns an empty s
24ff0 74 72 69 6e 67 2e 20 41 6e 20 65 6d 70 74 79 20  tring. An empty 
25000 73 74 72 69 6e 67 20 69 73 20 61 6c 73 6f 20 72  string is also r
25010 65 74 75 72 6e 65 64 20 69 66 20 62 6f 74 68 20  eturned if both 
25020 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 63 6f  tables.** and co
25030 6c 75 6d 6e 73 20 65 78 69 73 74 20 62 75 74 20  lumns exist but 
25040 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 64 65  have the same de
25050 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
25060 73 65 71 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a 2a  sequence. Or,.**
25070 20 69 66 20 62 6f 74 68 20 65 78 69 73 74 20 62   if both exist b
25080 75 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  ut the default c
25090 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
250a0 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  es are different
250b0 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
250c0 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
250d0 74 72 69 6e 67 20 22 20 43 4f 4c 4c 41 54 45 20  tring " COLLATE 
250e0 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f  <parent-collatio
250f0 6e 3e 22 2c 20 77 68 65 72 65 0a 2a 2a 20 3c 70  n>", where.** <p
25100 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e  arent-collation>
25110 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
25120 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
25130 63 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ce of the parent
25140 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
25150 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 46 6b 65  ic void shellFke
25160 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65 28 0a  yCollateClause(.
25170 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
25180 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e  t *pCtx,.  int n
25190 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Val,.  sqlite3_v
251a0 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a  alue **apVal.){.
251b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
251c0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
251d0 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29 3b  db_handle(pCtx);
251e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
251f0 50 61 72 65 6e 74 3b 0a 20 20 63 6f 6e 73 74 20  Parent;.  const 
25200 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6c  char *zParentCol
25210 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
25220 7a 50 61 72 65 6e 74 53 65 71 3b 0a 20 20 63 6f  zParentSeq;.  co
25230 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64  nst char *zChild
25240 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
25250 7a 43 68 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f 6e  zChildCol;.  con
25260 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 53  st char *zChildS
25270 65 71 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 69 74  eq = 0;  /* Init
25280 69 61 6c 69 7a 65 20 74 6f 20 61 76 6f 69 64 20  ialize to avoid 
25290 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77  false-positive w
252a0 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  arning */.  int 
252b0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  rc;..  assert( n
252c0 56 61 6c 3d 3d 34 20 29 3b 0a 20 20 7a 50 61 72  Val==4 );.  zPar
252d0 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ent = (const cha
252e0 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
252f0 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b  _text(apVal[0]);
25300 0a 20 20 7a 50 61 72 65 6e 74 43 6f 6c 20 3d 20  .  zParentCol = 
25310 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
25320 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
25330 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43 68  apVal[1]);.  zCh
25340 69 6c 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ild = (const cha
25350 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
25360 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b  _text(apVal[2]);
25370 0a 20 20 7a 43 68 69 6c 64 43 6f 6c 20 3d 20 28  .  zChildCol = (
25380 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
25390 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
253a0 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71 6c  pVal[3]);..  sql
253b0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
253c0 28 70 43 74 78 2c 20 22 22 2c 20 2d 31 2c 20 53  (pCtx, "", -1, S
253d0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
253e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61   rc = sqlite3_ta
253f0 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
25400 61 74 61 28 0a 20 20 20 20 20 20 64 62 2c 20 22  ata(.      db, "
25410 6d 61 69 6e 22 2c 20 7a 50 61 72 65 6e 74 2c 20  main", zParent, 
25420 7a 50 61 72 65 6e 74 43 6f 6c 2c 20 30 2c 20 26  zParentCol, 0, &
25430 7a 50 61 72 65 6e 74 53 65 71 2c 20 30 2c 20 30  zParentSeq, 0, 0
25440 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  , 0.  );.  if( r
25450 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25460 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25470 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
25480 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 20 20  tadata(.        
25490 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 43 68 69  db, "main", zChi
254a0 6c 64 2c 20 7a 43 68 69 6c 64 43 6f 6c 2c 20 30  ld, zChildCol, 0
254b0 2c 20 26 7a 43 68 69 6c 64 53 65 71 2c 20 30 2c  , &zChildSeq, 0,
254c0 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d   0, 0.    );.  }
254d0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
254e0 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33  TE_OK && sqlite3
254f0 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74  _stricmp(zParent
25500 53 65 71 2c 20 7a 43 68 69 6c 64 53 65 71 29 20  Seq, zChildSeq) 
25510 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
25520 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
25530 28 22 20 43 4f 4c 4c 41 54 45 20 25 73 22 2c 20  (" COLLATE %s", 
25540 7a 50 61 72 65 6e 74 53 65 71 29 3b 0a 20 20 20  zParentSeq);.   
25550 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
25560 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31  text(pCtx, z, -1
25570 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
25580 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
25590 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a  _free(z);.  }.}.
255a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ../*.** The impl
255b0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 64 6f  ementation of do
255c0 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e 74  t-command ".lint
255d0 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2e 0a   fkey-indexes"..
255e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69  */.static int li
255f0 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28 0a 20  ntFkeyIndexes(. 
25600 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74   ShellState *pSt
25610 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
25620 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c   /* Current shel
25630 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a  l tool state */.
25640 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20    char **azArg, 
25650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25660 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
25670 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
25680 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f  o dot command */
25690 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20  .  int nArg     
256a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
256c0 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67  entries in azArg
256d0 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  [] */.){.  sqlit
256e0 65 33 20 2a 64 62 20 3d 20 70 53 74 61 74 65 2d  e3 *db = pState-
256f0 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  >db;       /* Da
25700 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 6f  tabase handle to
25710 20 71 75 65 72 79 20 22 6d 61 69 6e 22 20 64 62   query "main" db
25720 20 6f 66 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f   of */.  FILE *o
25730 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74  ut = pState->out
25740 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 65  ;        /* Stre
25750 61 6d 20 74 6f 20 77 72 69 74 65 20 6e 6f 6e 2d  am to write non-
25760 65 72 72 6f 72 20 6f 75 74 70 75 74 20 74 6f 20  error output to 
25770 2a 2f 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73  */.  int bVerbos
25780 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
25790 20 20 20 20 20 2f 2a 20 49 66 20 2d 76 65 72 62       /* If -verb
257a0 6f 73 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ose is present *
257b0 2f 0a 20 20 69 6e 74 20 62 47 72 6f 75 70 42 79  /.  int bGroupBy
257c0 50 61 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20  Parent = 0;     
257d0 20 20 20 20 2f 2a 20 49 66 20 2d 67 72 6f 75 70      /* If -group
257e0 62 79 70 61 72 65 6e 74 20 69 73 20 70 72 65 73  byparent is pres
257f0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ent */.  int i; 
25800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25810 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69           /* To i
25820 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
25830 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73  zArg[] */.  cons
25840 74 20 63 68 61 72 20 2a 7a 49 6e 64 65 6e 74 20  t char *zIndent 
25850 3d 20 22 22 3b 20 20 20 20 20 20 20 2f 2a 20 48  = "";       /* H
25860 6f 77 20 6d 75 63 68 20 74 6f 20 69 6e 64 65 6e  ow much to inden
25870 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 62  t CREATE INDEX b
25880 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  y */.  int rc;  
25890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
258b0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
258c0 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20  e3_stmt *pSql = 
258d0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  0;         /* Co
258e0 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f  mpiled version o
258f0 66 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  f SQL statement 
25900 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  below */..  /*. 
25910 20 2a 2a 20 54 68 69 73 20 53 45 4c 45 43 54 20   ** This SELECT 
25920 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
25930 73 20 6f 6e 65 20 72 6f 77 20 66 6f 72 20 65 61  s one row for ea
25940 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ch foreign key c
25950 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20 69  onstraint.  ** i
25960 6e 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20  n the schema of 
25970 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
25980 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 20 76 61  e. The column va
25990 6c 75 65 73 20 61 72 65 3a 0a 20 20 2a 2a 0a 20  lues are:.  **. 
259a0 20 2a 2a 20 30 2e 20 54 68 65 20 74 65 78 74 20   ** 0. The text 
259b0 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  of an SQL statem
259c0 65 6e 74 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a  ent similar to:.
259d0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 22    **.  **      "
259e0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
259f0 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  AN SELECT 1 FROM
25a00 20 63 68 69 6c 64 5f 74 61 62 6c 65 20 57 48 45   child_table WHE
25a10 52 45 20 63 68 69 6c 64 5f 6b 65 79 3d 3f 22 0a  RE child_key=?".
25a20 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 54 68 69    **.  **    Thi
25a30 73 20 53 45 4c 45 43 54 20 69 73 20 73 69 6d 69  s SELECT is simi
25a40 6c 61 72 20 74 6f 20 74 68 65 20 6f 6e 65 20 74  lar to the one t
25a50 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20  hat the foreign 
25a60 6b 65 79 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  keys implementat
25a70 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 6e 65 65 64  ion.  **    need
25a80 73 20 74 6f 20 72 75 6e 20 69 6e 74 65 72 6e 61  s to run interna
25a90 6c 6c 79 20 6f 6e 20 63 68 69 6c 64 20 74 61 62  lly on child tab
25aa0 6c 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73  les. If there is
25ab0 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63   an index that c
25ac0 61 6e 0a 20 20 2a 2a 20 20 20 20 62 65 20 75 73  an.  **    be us
25ad0 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74  ed to optimize t
25ae0 68 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20  his query, then 
25af0 69 74 20 63 61 6e 20 61 6c 73 6f 20 62 65 20 75  it can also be u
25b00 73 65 64 20 62 79 20 74 68 65 20 46 4b 0a 20 20  sed by the FK.  
25b10 2a 2a 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 61  **    implementa
25b20 74 69 6f 6e 20 74 6f 20 6f 70 74 69 6d 69 7a 65  tion to optimize
25b30 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54   DELETE or UPDAT
25b40 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20  E statements on 
25b50 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20  the parent.  ** 
25b60 20 20 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20     table..  **. 
25b70 20 2a 2a 20 31 2e 20 41 20 47 4c 4f 42 20 70 61   ** 1. A GLOB pa
25b80 74 74 65 72 6e 20 73 75 69 74 61 62 6c 65 20 66  ttern suitable f
25b90 6f 72 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  or sqlite3_strgl
25ba0 6f 62 28 29 2e 20 49 66 20 74 68 65 20 70 6c 61  ob(). If the pla
25bb0 6e 20 6f 75 74 70 75 74 20 62 79 0a 20 20 2a 2a  n output by.  **
25bc0 20 20 20 20 74 68 65 20 45 58 50 4c 41 49 4e 20      the EXPLAIN 
25bd0 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61  QUERY PLAN comma
25be0 6e 64 20 6d 61 74 63 68 65 73 20 74 68 69 73 20  nd matches this 
25bf0 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 74 68  pattern, then th
25c00 65 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 20 20  e schema.  **   
25c10 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 64   contains an ind
25c20 65 78 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  ex that can be u
25c30 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
25c40 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a  the query..  **.
25c50 20 20 2a 2a 20 32 2e 20 48 75 6d 61 6e 20 72 65    ** 2. Human re
25c60 61 64 61 62 6c 65 20 74 65 78 74 20 74 68 61 74  adable text that
25c70 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 63   describes the c
25c80 68 69 6c 64 20 74 61 62 6c 65 20 61 6e 64 20 63  hild table and c
25c90 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a  olumns. e.g..  *
25ca0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 63 68  *.  **       "ch
25cb0 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f  ild_table(child_
25cc0 6b 65 79 31 2c 20 63 68 69 6c 64 5f 6b 65 79 32  key1, child_key2
25cd0 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e 20  )".  **.  ** 3. 
25ce0 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 74  Human readable t
25cf0 65 78 74 20 74 68 61 74 20 64 65 73 63 72 69 62  ext that describ
25d00 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  es the parent ta
25d10 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e  ble and columns.
25d20 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   e.g..  **.  ** 
25d30 20 20 20 20 20 20 22 70 61 72 65 6e 74 5f 74 61        "parent_ta
25d40 62 6c 65 28 70 61 72 65 6e 74 5f 6b 65 79 31 2c  ble(parent_key1,
25d50 20 70 61 72 65 6e 74 5f 6b 65 79 32 29 22 0a 20   parent_key2)". 
25d60 20 2a 2a 0a 20 20 2a 2a 20 34 2e 20 41 20 66 75   **.  ** 4. A fu
25d70 6c 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  ll CREATE INDEX 
25d80 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 61 6e  statement for an
25d90 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 75 6c   index that coul
25da0 64 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a  d be used to.  *
25db0 2a 20 20 20 20 6f 70 74 69 6d 69 7a 65 20 44 45  *    optimize DE
25dc0 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 73  LETE or UPDATE s
25dd0 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65  tatements on the
25de0 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 20 65   parent table. e
25df0 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  .g..  **.  **   
25e00 20 20 20 20 22 43 52 45 41 54 45 20 49 4e 44 45      "CREATE INDE
25e10 58 20 63 68 69 6c 64 5f 74 61 62 6c 65 5f 63 68  X child_table_ch
25e20 69 6c 64 5f 6b 65 79 20 4f 4e 20 63 68 69 6c 64  ild_key ON child
25e30 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79  _table(child_key
25e40 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e 20  )".  **.  ** 5. 
25e50 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
25e60 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20  parent table..  
25e70 2a 2a 0a 20 20 2a 2a 20 54 68 65 73 65 20 73 69  **.  ** These si
25e80 78 20 76 61 6c 75 65 73 20 61 72 65 20 75 73 65  x values are use
25e90 64 20 62 79 20 74 68 65 20 43 20 6c 6f 67 69 63  d by the C logic
25ea0 20 62 65 6c 6f 77 20 74 6f 20 67 65 6e 65 72 61   below to genera
25eb0 74 65 20 74 68 65 20 72 65 70 6f 72 74 2e 0a 20  te the report.. 
25ec0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
25ed0 20 2a 7a 53 71 6c 20 3d 0a 20 20 22 53 45 4c 45   *zSql =.  "SELE
25ee0 43 54 20 22 0a 20 20 20 20 22 20 20 20 20 20 27  CT ".    "     '
25ef0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
25f00 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  AN SELECT 1 FROM
25f10 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61   ' || quote(s.na
25f20 6d 65 29 20 7c 7c 20 27 20 57 48 45 52 45 20 27  me) || ' WHERE '
25f30 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75  ".    "  || grou
25f40 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28 73  p_concat(quote(s
25f50 2e 6e 61 6d 65 29 20 7c 7c 20 27 2e 27 20 7c 7c  .name) || '.' ||
25f60 20 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29   quote(f.[from])
25f70 20 7c 7c 20 27 3d 3f 27 20 22 0a 20 20 20 20 22   || '=?' ".    "
25f80 20 20 7c 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61 74    || fkey_collat
25f90 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22  e_clause(".    "
25fa0 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d         f.[table]
25fb0 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f  , COALESCE(f.[to
25fc0 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e  ], p.[name]), s.
25fd0 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c  name, f.[from]),
25fe0 27 20 41 4e 44 20 27 29 22 0a 20 20 20 20 22 2c  ' AND ')".    ",
25ff0 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 53 45   ".    "     'SE
26000 41 52 43 48 20 54 41 42 4c 45 20 27 20 7c 7c 20  ARCH TABLE ' || 
26010 73 2e 6e 61 6d 65 20 7c 7c 20 27 20 55 53 49 4e  s.name || ' USIN
26020 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  G COVERING INDEX
26030 2a 28 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67  *('".    "  || g
26040 72 6f 75 70 5f 63 6f 6e 63 61 74 28 27 2a 3d 3f  roup_concat('*=?
26050 27 2c 20 27 20 41 4e 44 20 27 29 20 7c 7c 20 27  ', ' AND ') || '
26060 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20  )'".    ", ".   
26070 20 22 20 20 20 20 20 73 2e 6e 61 6d 65 20 20 7c   "     s.name  |
26080 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63  | '(' || group_c
26090 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20  oncat(f.[from], 
260a0 20 27 2c 20 27 29 20 7c 7c 20 27 29 27 22 0a 20   ', ') || ')'". 
260b0 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20     ", ".    "   
260c0 20 20 66 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20 27    f.[table] || '
260d0 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  (' || group_conc
260e0 61 74 28 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74  at(COALESCE(f.[t
260f0 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 29 20 7c  o], p.[name])) |
26100 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a  | ')'".    ", ".
26110 20 20 20 20 22 20 20 20 20 20 27 43 52 45 41 54      "     'CREAT
26120 45 20 49 4e 44 45 58 20 27 20 7c 7c 20 71 75 6f  E INDEX ' || quo
26130 74 65 28 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27 7c  te(s.name ||'_'|
26140 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66  | group_concat(f
26150 2e 5b 66 72 6f 6d 5d 2c 20 27 5f 27 29 29 22 0a  .[from], '_'))".
26160 20 20 20 20 22 20 20 7c 7c 20 27 20 4f 4e 20 27      "  || ' ON '
26170 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65   || quote(s.name
26180 29 20 7c 7c 20 27 28 27 22 0a 20 20 20 20 22 20  ) || '('".    " 
26190 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74   || group_concat
261a0 28 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29  (quote(f.[from])
261b0 20 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20 20   ||".    "      
261c0 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63    fkey_collate_c
261d0 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20 20  lause(".    "   
261e0 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d         f.[table]
261f0 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f  , COALESCE(f.[to
26200 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e  ], p.[name]), s.
26210 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c  name, f.[from]),
26220 20 27 2c 20 27 29 22 0a 20 20 20 20 22 20 20 7c   ', ')".    "  |
26230 7c 20 27 29 3b 27 22 0a 20 20 20 20 22 2c 20 22  | ');'".    ", "
26240 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74 61  .    "     f.[ta
26250 62 6c 65 5d 20 22 0a 20 20 20 20 22 46 52 4f 4d  ble] ".    "FROM
26260 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 41   sqlite_master A
26270 53 20 73 2c 20 70 72 61 67 6d 61 5f 66 6f 72 65  S s, pragma_fore
26280 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 28 73 2e 6e  ign_key_list(s.n
26290 61 6d 65 29 20 41 53 20 66 20 22 0a 20 20 20 20  ame) AS f ".    
262a0 22 4c 45 46 54 20 4a 4f 49 4e 20 70 72 61 67 6d  "LEFT JOIN pragm
262b0 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 20 41 53 20  a_table_info AS 
262c0 70 20 4f 4e 20 28 70 6b 2d 31 3d 73 65 71 20 41  p ON (pk-1=seq A
262d0 4e 44 20 70 2e 61 72 67 3d 66 2e 5b 74 61 62 6c  ND p.arg=f.[tabl
262e0 65 5d 29 20 22 0a 20 20 20 20 22 47 52 4f 55 50  e]) ".    "GROUP
262f0 20 42 59 20 73 2e 6e 61 6d 65 2c 20 66 2e 69 64   BY s.name, f.id
26300 20 22 0a 20 20 20 20 22 4f 52 44 45 52 20 42 59   ".    "ORDER BY
26310 20 28 43 41 53 45 20 57 48 45 4e 20 3f 20 54 48   (CASE WHEN ? TH
26320 45 4e 20 66 2e 5b 74 61 62 6c 65 5d 20 45 4c 53  EN f.[table] ELS
26330 45 20 73 2e 6e 61 6d 65 20 45 4e 44 29 22 0a 20  E s.name END)". 
26340 20 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   ;.  const char 
26350 2a 7a 47 6c 6f 62 49 50 4b 20 3d 20 22 53 45 41  *zGlobIPK = "SEA
26360 52 43 48 20 54 41 42 4c 45 20 2a 20 55 53 49 4e  RCH TABLE * USIN
26370 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  G INTEGER PRIMAR
26380 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 22  Y KEY (rowid=?)"
26390 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c  ;..  for(i=2; i<
263a0 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
263b0 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  int n = strlen30
263c0 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20  (azArg[i]);.    
263d0 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69 74  if( n>1 && sqlit
263e0 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 76 65  e3_strnicmp("-ve
263f0 72 62 6f 73 65 22 2c 20 61 7a 41 72 67 5b 69 5d  rbose", azArg[i]
26400 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , n)==0 ){.     
26410 20 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20   bVerbose = 1;. 
26420 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
26430 28 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65 33  ( n>1 && sqlite3
26440 5f 73 74 72 6e 69 63 6d 70 28 22 2d 67 72 6f 75  _strnicmp("-grou
26450 70 62 79 70 61 72 65 6e 74 22 2c 20 61 7a 41 72  pbyparent", azAr
26460 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  g[i], n)==0 ){. 
26470 20 20 20 20 20 62 47 72 6f 75 70 42 79 50 61 72       bGroupByPar
26480 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a  ent = 1;.      z
26490 49 6e 64 65 6e 74 20 3d 20 22 20 20 20 20 22 3b  Indent = "    ";
264a0 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b  .    }.    else{
264b0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
264c0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
264d0 3a 20 25 73 20 25 73 20 3f 2d 76 65 72 62 6f 73  : %s %s ?-verbos
264e0 65 3f 20 3f 2d 67 72 6f 75 70 62 79 70 61 72 65  e? ?-groupbypare
264f0 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  nt?\n",.        
26500 20 20 61 7a 41 72 67 5b 30 5d 2c 20 61 7a 41 72    azArg[0], azAr
26510 67 5b 31 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20  g[1].      );.  
26520 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26530 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
26540 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65   }..  /* Registe
26550 72 20 74 68 65 20 66 6b 65 79 5f 63 6f 6c 6c 61  r the fkey_colla
26560 74 65 5f 63 6c 61 75 73 65 28 29 20 53 51 4c 20  te_clause() SQL 
26570 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 63  function */.  rc
26580 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
26590 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
265a0 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61  fkey_collate_cla
265b0 75 73 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f  use", 4, SQLITE_
265c0 55 54 46 38 2c 0a 20 20 20 20 20 20 30 2c 20 73  UTF8,.      0, s
265d0 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74 65 43  hellFkeyCollateC
265e0 6c 61 75 73 65 2c 20 30 2c 20 30 0a 20 20 29 3b  lause, 0, 0.  );
265f0 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
26600 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
26610 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
26620 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20  re_v2(db, zSql, 
26630 2d 31 2c 20 26 70 53 71 6c 2c 20 30 29 3b 0a 20  -1, &pSql, 0);. 
26640 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
26650 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
26660 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
26670 53 71 6c 2c 20 31 2c 20 62 47 72 6f 75 70 42 79  Sql, 1, bGroupBy
26680 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20  Parent);.  }..  
26690 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
266a0 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  K ){.    int rc2
266b0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65  ;.    char *zPre
266c0 76 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  v = 0;.    while
266d0 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
266e0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29  lite3_step(pSql)
266f0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 65   ){.      int re
26700 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71  s = -1;.      sq
26710 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70  lite3_stmt *pExp
26720 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  lain = 0;.      
26730 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 51 50  const char *zEQP
26740 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
26750 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
26760 65 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20  ext(pSql, 0);.  
26770 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
26780 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20 63  zGlob = (const c
26790 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
267a0 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 31  umn_text(pSql, 1
267b0 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
267c0 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 28 63 6f  har *zFrom = (co
267d0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
267e0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
267f0 71 6c 2c 20 32 29 3b 0a 20 20 20 20 20 20 63 6f  ql, 2);.      co
26800 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67 65  nst char *zTarge
26810 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  t = (const char*
26820 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
26830 74 65 78 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20  text(pSql, 3);. 
26840 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
26850 2a 7a 43 49 20 3d 20 28 63 6f 6e 73 74 20 63 68  *zCI = (const ch
26860 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
26870 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 34 29  mn_text(pSql, 4)
26880 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
26890 61 72 20 2a 7a 50 61 72 65 6e 74 20 3d 20 28 63  ar *zParent = (c
268a0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
268b0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
268c0 53 71 6c 2c 20 35 29 3b 0a 0a 20 20 20 20 20 20  Sql, 5);..      
268d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
268e0 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50  pare_v2(db, zEQP
268f0 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c  , -1, &pExplain,
26900 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
26910 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
26920 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
26930 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
26940 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69  te3_step(pExplai
26950 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  n) ){.        co
26960 6e 73 74 20 63 68 61 72 20 2a 7a 50 6c 61 6e 20  nst char *zPlan 
26970 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
26980 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
26990 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b  xt(pExplain, 3);
269a0 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 28  .        res = (
269b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  .              0
269c0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ==sqlite3_strglo
269d0 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c 61 6e 29 0a  b(zGlob, zPlan).
269e0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 30 3d             || 0=
269f0 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62  =sqlite3_strglob
26a00 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a 50 6c 61 6e  (zGlobIPK, zPlan
26a10 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
26a20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
26a30 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
26a40 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  (pExplain);.    
26a50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26a60 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  _OK ) break;..  
26a70 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
26a80 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
26a90 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
26aa0 6f 72 3a 20 69 6e 74 65 72 6e 61 6c 20 65 72 72  or: internal err
26ab0 6f 72 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  or");.        br
26ac0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
26ad0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 47  {.        if( bG
26ae0 72 6f 75 70 42 79 50 61 72 65 6e 74 0a 20 20 20  roupByParent.   
26af0 20 20 20 20 20 26 26 20 28 62 56 65 72 62 6f 73       && (bVerbos
26b00 65 20 7c 7c 20 72 65 73 3d 3d 30 29 0a 20 20 20  e || res==0).   
26b10 20 20 20 20 20 26 26 20 28 7a 50 72 65 76 3d 3d       && (zPrev==
26b20 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72  0 || sqlite3_str
26b30 69 63 6d 70 28 7a 50 61 72 65 6e 74 2c 20 7a 50  icmp(zParent, zP
26b40 72 65 76 29 29 0a 20 20 20 20 20 20 20 20 29 7b  rev)).        ){
26b50 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
26b60 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 50  rintf(out, "-- P
26b70 61 72 65 6e 74 20 74 61 62 6c 65 20 25 73 5c 6e  arent table %s\n
26b80 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20  ", zParent);.   
26b90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
26ba0 72 65 65 28 7a 50 72 65 76 29 3b 0a 20 20 20 20  ree(zPrev);.    
26bb0 20 20 20 20 20 20 7a 50 72 65 76 20 3d 20 73 71        zPrev = sq
26bc0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
26bd0 73 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20  s", zParent);.  
26be0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
26bf0 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
26c00 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
26c10 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73 20 2d  ntf(out, "%s%s -
26c20 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49 6e 64 65 6e  -> %s\n", zInden
26c30 74 2c 20 7a 43 49 2c 20 7a 54 61 72 67 65 74 29  t, zCI, zTarget)
26c40 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
26c50 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a  if( bVerbose ){.
26c60 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
26c70 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 2f 2a 20  intf(out, "%s/* 
26c80 6e 6f 20 65 78 74 72 61 20 69 6e 64 65 78 65 73  no extra indexes
26c90 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 25 73   required for %s
26ca0 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20   -> %s */\n",.  
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 7a 49 6e 64              zInd
26cc0 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20 7a 54 61 72  ent, zFrom, zTar
26cd0 67 65 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b  get.          );
26ce0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26cf0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
26d00 69 74 65 33 5f 66 72 65 65 28 7a 50 72 65 76 29  ite3_free(zPrev)
26d10 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  ;..    if( rc!=S
26d20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26d30 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
26d40 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  err, "%s\n", sql
26d50 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
26d60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 32  ;.    }..    rc2
26d70 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
26d80 69 7a 65 28 70 53 71 6c 29 3b 0a 20 20 20 20 69  ize(pSql);.    i
26d90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26da0 20 26 26 20 72 63 32 21 3d 53 51 4c 49 54 45 5f   && rc2!=SQLITE_
26db0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
26dc0 20 72 63 32 3b 0a 20 20 20 20 20 20 72 61 77 5f   rc2;.      raw_
26dd0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
26de0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
26df0 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
26e00 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
26e10 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
26e20 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
26e30 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
26e40 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
26e50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
26e60 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 6c 69  entation of ".li
26e70 6e 74 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e  nt" dot command.
26e80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
26e90 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20  intDotCommand(. 
26ea0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74   ShellState *pSt
26eb0 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
26ec0 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c   /* Current shel
26ed0 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a  l tool state */.
26ee0 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20    char **azArg, 
26ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f00 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
26f10 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
26f20 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f  o dot command */
26f30 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20  .  int nArg     
26f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f50 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
26f60 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67  entries in azArg
26f70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  [] */.){.  int n
26f80 3b 0a 20 20 6e 20 3d 20 28 6e 41 72 67 3e 3d 32  ;.  n = (nArg>=2
26f90 20 3f 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72   ? strlen30(azAr
26fa0 67 5b 31 5d 29 20 3a 20 30 29 3b 0a 20 20 69 66  g[1]) : 0);.  if
26fb0 28 20 6e 3c 31 20 7c 7c 20 73 71 6c 69 74 65 33  ( n<1 || sqlite3
26fc0 5f 73 74 72 6e 69 63 6d 70 28 61 7a 41 72 67 5b  _strnicmp(azArg[
26fd0 31 5d 2c 20 22 66 6b 65 79 2d 69 6e 64 65 78 65  1], "fkey-indexe
26fe0 73 22 2c 20 6e 29 20 29 20 67 6f 74 6f 20 75 73  s", n) ) goto us
26ff0 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 6c 69  age;.  return li
27000 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28 70 53  ntFkeyIndexes(pS
27010 74 61 74 65 2c 20 61 7a 41 72 67 2c 20 6e 41 72  tate, azArg, nAr
27020 67 29 3b 0a 0a 20 75 73 61 67 65 3a 0a 20 20 72  g);.. usage:.  r
27030 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
27040 2c 20 22 55 73 61 67 65 20 25 73 20 73 75 62 2d  , "Usage %s sub-
27050 63 6f 6d 6d 61 6e 64 20 3f 73 77 69 74 63 68 65  command ?switche
27060 73 2e 2e 2e 3f 5c 6e 22 2c 20 61 7a 41 72 67 5b  s...?\n", azArg[
27070 30 5d 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74  0]);.  raw_print
27080 66 28 73 74 64 65 72 72 2c 20 22 57 68 65 72 65  f(stderr, "Where
27090 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 20 61 72   sub-commands ar
270a0 65 3a 5c 6e 22 29 3b 0a 20 20 72 61 77 5f 70 72  e:\n");.  raw_pr
270b0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20 20  intf(stderr, "  
270c0 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 5c 6e    fkey-indexes\n
270d0 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ");.  return SQL
270e0 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 23 69  ITE_ERROR;.}..#i
270f0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
27100 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
27110 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  BLE) && defined(
27120 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42  SQLITE_HAVE_ZLIB
27130 29 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  )./*************
27140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27180 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 22 2e 61 72  ****.** The ".ar
27190 63 68 69 76 65 22 20 6f 72 20 22 2e 61 72 22 20  chive" or ".ar" 
271a0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  command..*/.stat
271b0 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 72 65  ic void shellPre
271c0 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20  pare(.  sqlite3 
271d0 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63  *db, .  int *pRc
271e0 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
271f0 2a 7a 53 71 6c 2c 20 0a 20 20 73 71 6c 69 74 65  *zSql, .  sqlite
27200 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 0a  3_stmt **ppStmt.
27210 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30  ){.  *ppStmt = 0
27220 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  ;.  if( *pRc==SQ
27230 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
27240 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
27250 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
27260 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c  Sql, -1, ppStmt,
27270 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
27280 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27290 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
272a0 74 64 65 72 72 2c 20 22 73 71 6c 20 65 72 72 6f  tderr, "sql erro
272b0 72 3a 20 25 73 20 28 25 64 29 5c 6e 22 2c 20 0a  r: %s (%d)\n", .
272c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
272d0 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 73 71  3_errmsg(db), sq
272e0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
272f0 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
27300 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20   *pRc = rc;.    
27310 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
27320 76 6f 69 64 20 73 68 65 6c 6c 50 72 65 70 61 72  void shellPrepar
27330 65 50 72 69 6e 74 66 28 0a 20 20 73 71 6c 69 74  ePrintf(.  sqlit
27340 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a  e3 *db, .  int *
27350 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  pRc, .  sqlite3_
27360 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20  stmt **ppStmt,. 
27370 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
27380 74 2c 20 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 2a  t, .  ....){.  *
27390 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66  ppStmt = 0;.  if
273a0 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
273b0 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74  K ){.    va_list
273c0 20 61 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   ap;.    char *z
273d0 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  ;.    va_start(a
273e0 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20  p, zFmt);.    z 
273f0 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e  = sqlite3_vmprin
27400 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20  tf(zFmt, ap);.  
27410 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
27420 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
27430 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
27440 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
27450 73 65 7b 0a 20 20 20 20 20 20 73 68 65 6c 6c 50  se{.      shellP
27460 72 65 70 61 72 65 28 64 62 2c 20 70 52 63 2c 20  repare(db, pRc, 
27470 7a 2c 20 70 70 53 74 6d 74 29 3b 0a 20 20 20 20  z, ppStmt);.    
27480 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
27490 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
274a0 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
274b0 6c 46 69 6e 61 6c 69 7a 65 28 0a 20 20 69 6e 74  lFinalize(.  int
274c0 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65   *pRc, .  sqlite
274d0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b  3_stmt *pStmt.){
274e0 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
274f0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
27500 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e  = sqlite3_db_han
27510 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  dle(pStmt);.    
27520 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
27530 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
27540 3b 0a 20 20 20 20 69 66 28 20 2a 70 52 63 3d 3d  ;.    if( *pRc==
27550 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27560 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27570 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
27580 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
27590 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a 20 25  r, "SQL error: %
275a0 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
275b0 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20  rmsg(db));.     
275c0 20 7d 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20   }.      *pRc = 
275d0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  rc;.    }.  }.}.
275e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
275f0 6c 6c 52 65 73 65 74 28 0a 20 20 69 6e 74 20 2a  llReset(.  int *
27600 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  pRc, .  sqlite3_
27610 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a 20  stmt *pStmt.){. 
27620 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
27630 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
27640 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
27650 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
27660 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27670 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
27680 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62  *db = sqlite3_db
27690 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a  _handle(pStmt);.
276a0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
276b0 28 73 74 64 65 72 72 2c 20 22 53 51 4c 20 65 72  (stderr, "SQL er
276c0 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
276d0 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
276e0 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 63 20  .    }.    *pRc 
276f0 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 2f 2a 0a 2a  = rc;.  }.}./*.*
27700 2a 20 53 74 72 75 63 74 75 72 65 20 72 65 70 72  * Structure repr
27710 65 73 65 6e 74 69 6e 67 20 61 20 73 69 6e 67 6c  esenting a singl
27720 65 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e  e ".ar" command.
27730 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
27740 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20 41 72 43  ct ArCommand ArC
27750 6f 6d 6d 61 6e 64 3b 0a 73 74 72 75 63 74 20 41  ommand;.struct A
27760 72 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20 75 38 20  rCommand {.  u8 
27770 65 43 6d 64 3b 20 20 20 20 20 20 20 20 20 20 20  eCmd;           
27780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27790 41 6e 20 41 52 5f 43 4d 44 5f 2a 20 76 61 6c 75  An AR_CMD_* valu
277a0 65 20 2a 2f 0a 20 20 75 38 20 62 56 65 72 62 6f  e */.  u8 bVerbo
277b0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
277c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
277d0 66 20 2d 2d 76 65 72 62 6f 73 65 20 2a 2f 0a 20  f --verbose */. 
277e0 20 75 38 20 62 5a 69 70 3b 20 20 20 20 20 20 20   u8 bZip;       
277f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27800 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
27810 61 72 63 68 69 76 65 20 69 73 20 61 20 5a 49 50  archive is a ZIP
27820 20 2a 2f 0a 20 20 75 38 20 62 44 72 79 52 75 6e   */.  u8 bDryRun
27830 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27840 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
27850 20 2d 2d 64 72 79 2d 72 75 6e 20 2a 2f 0a 20 20   --dry-run */.  
27860 75 38 20 62 41 70 70 65 6e 64 3b 20 20 20 20 20  u8 bAppend;     
27870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27880 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 61 70 70  /* True if --app
27890 65 6e 64 20 2a 2f 0a 20 20 75 38 20 66 72 6f 6d  end */.  u8 from
278a0 43 6d 64 4c 69 6e 65 3b 20 20 20 20 20 20 20 20  CmdLine;        
278b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20           /* Run 
278c0 66 72 6f 6d 20 2d 41 20 69 6e 73 74 65 61 64 20  from -A instead 
278d0 6f 66 20 2e 61 72 63 68 69 76 65 20 2a 2f 0a 20  of .archive */. 
278e0 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20   int nArg;      
278f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27900 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
27910 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
27920 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 72 63 54  */.  char *zSrcT
27930 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
27940 20 20 20 20 20 2f 2a 20 22 73 71 6c 61 72 22 2c       /* "sqlar",
27950 20 22 7a 69 70 66 69 6c 65 28 24 66 69 6c 65 29   "zipfile($file)
27960 22 20 6f 72 20 22 7a 69 70 22 20 2a 2f 0a 20 20  " or "zip" */.  
27970 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
27980 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
27990 2f 2a 20 2d 2d 66 69 6c 65 20 61 72 67 75 6d 65  /* --file argume
279a0 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  nt, or NULL */. 
279b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
279c0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
279d0 20 2f 2a 20 2d 2d 64 69 72 65 63 74 6f 72 79 20   /* --directory 
279e0 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c  argument, or NUL
279f0 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  L */.  char **az
27a00 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
27a10 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
27a20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  of command argum
27a30 65 6e 74 73 20 2a 2f 0a 20 20 53 68 65 6c 6c 53  ents */.  ShellS
27a40 74 61 74 65 20 2a 70 3b 20 20 20 20 20 20 20 20  tate *p;        
27a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 65            /* She
27a60 6c 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 71  ll state */.  sq
27a70 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
27a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27a90 20 44 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   Database contai
27aa0 6e 69 6e 67 20 74 68 65 20 61 72 63 68 69 76 65  ning the archive
27ab0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72   */.};../*.** Pr
27ac0 69 6e 74 20 61 20 75 73 61 67 65 20 6d 65 73 73  int a usage mess
27ad0 61 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72 20  age for the .ar 
27ae0 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65 72  command to stder
27af0 72 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  r and return SQL
27b00 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74  ITE_ERROR..*/.st
27b10 61 74 69 63 20 69 6e 74 20 61 72 55 73 61 67 65  atic int arUsage
27b20 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 73 68 6f  (FILE *f){.  sho
27b30 77 48 65 6c 70 28 66 2c 22 61 72 63 68 69 76 65  wHelp(f,"archive
27b40 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ");.  return SQL
27b50 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  ITE_ERROR;.}../*
27b60 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72  .** Print an err
27b70 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 74  or message for t
27b80 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74  he .ar command t
27b90 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65 74  o stderr and ret
27ba0 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  urn .** SQLITE_E
27bb0 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  RROR..*/.static 
27bc0 69 6e 74 20 61 72 45 72 72 6f 72 4d 73 67 28 41  int arErrorMsg(A
27bd0 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63  rCommand *pAr, c
27be0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c  onst char *zFmt,
27bf0 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
27c00 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a   ap;.  char *z;.
27c10 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
27c20 46 6d 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  Fmt);.  z = sqli
27c30 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d  te3_vmprintf(zFm
27c40 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
27c50 28 61 70 29 3b 0a 20 20 75 74 66 38 5f 70 72 69  (ap);.  utf8_pri
27c60 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
27c70 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  or: %s\n", z);. 
27c80 20 69 66 28 20 70 41 72 2d 3e 66 72 6f 6d 43 6d   if( pAr->fromCm
27c90 64 4c 69 6e 65 20 29 7b 0a 20 20 20 20 75 74 66  dLine ){.    utf
27ca0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
27cb0 20 22 55 73 65 20 5c 22 2d 41 5c 22 20 66 6f 72   "Use \"-A\" for
27cc0 20 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 29 3b 0a   more help\n");.
27cd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 74 66    }else{.    utf
27ce0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
27cf0 20 22 55 73 65 20 5c 22 2e 61 72 63 68 69 76 65   "Use \".archive
27d00 20 2d 2d 68 65 6c 70 5c 22 20 66 6f 72 20 6d 6f   --help\" for mo
27d10 72 65 20 68 65 6c 70 5c 6e 22 29 3b 0a 20 20 7d  re help\n");.  }
27d20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
27d30 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  z);.  return SQL
27d40 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  ITE_ERROR;.}../*
27d50 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f 72 20 41  .** Values for A
27d60 72 43 6f 6d 6d 61 6e 64 2e 65 43 6d 64 2e 0a 2a  rCommand.eCmd..*
27d70 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44  /.#define AR_CMD
27d80 5f 43 52 45 41 54 45 20 20 20 20 20 20 20 31 0a  _CREATE       1.
27d90 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 45  #define AR_CMD_E
27da0 58 54 52 41 43 54 20 20 20 20 20 20 32 0a 23 64  XTRACT      2.#d
27db0 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 4c 49 53  efine AR_CMD_LIS
27dc0 54 20 20 20 20 20 20 20 20 20 33 0a 23 64 65 66  T         3.#def
27dd0 69 6e 65 20 41 52 5f 43 4d 44 5f 55 50 44 41 54  ine AR_CMD_UPDAT
27de0 45 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e  E       4.#defin
27df0 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 20 20 20  e AR_CMD_HELP   
27e00 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 4f        5../*.** O
27e10 74 68 65 72 20 28 6e 6f 6e 2d 63 6f 6d 6d 61 6e  ther (non-comman
27e20 64 29 20 73 77 69 74 63 68 65 73 2e 0a 2a 2f 0a  d) switches..*/.
27e30 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43  #define AR_SWITC
27e40 48 5f 56 45 52 42 4f 53 45 20 20 20 20 20 36 0a  H_VERBOSE     6.
27e50 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43  #define AR_SWITC
27e60 48 5f 46 49 4c 45 20 20 20 20 20 20 20 20 37 0a  H_FILE        7.
27e70 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43  #define AR_SWITC
27e80 48 5f 44 49 52 45 43 54 4f 52 59 20 20 20 38 0a  H_DIRECTORY   8.
27e90 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43  #define AR_SWITC
27ea0 48 5f 41 50 50 45 4e 44 20 20 20 20 20 20 39 0a  H_APPEND      9.
27eb0 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43  #define AR_SWITC
27ec0 48 5f 44 52 59 52 55 4e 20 20 20 20 20 31 30 0a  H_DRYRUN     10.
27ed0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 50 72  .static int arPr
27ee0 6f 63 65 73 73 53 77 69 74 63 68 28 41 72 43 6f  ocessSwitch(ArCo
27ef0 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 69 6e 74 20  mmand *pAr, int 
27f00 65 53 77 69 74 63 68 2c 20 63 6f 6e 73 74 20 63  eSwitch, const c
27f10 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73 77  har *zArg){.  sw
27f20 69 74 63 68 28 20 65 53 77 69 74 63 68 20 29 7b  itch( eSwitch ){
27f30 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44  .    case AR_CMD
27f40 5f 43 52 45 41 54 45 3a 0a 20 20 20 20 63 61 73  _CREATE:.    cas
27f50 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54  e AR_CMD_EXTRACT
27f60 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d  :.    case AR_CM
27f70 44 5f 4c 49 53 54 3a 0a 20 20 20 20 63 61 73 65  D_LIST:.    case
27f80 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 3a 0a   AR_CMD_UPDATE:.
27f90 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
27fa0 48 45 4c 50 3a 0a 20 20 20 20 20 20 69 66 28 20  HELP:.      if( 
27fb0 70 41 72 2d 3e 65 43 6d 64 20 29 7b 0a 20 20 20  pAr->eCmd ){.   
27fc0 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72       return arEr
27fd0 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 6d 75 6c  rorMsg(pAr, "mul
27fe0 74 69 70 6c 65 20 63 6f 6d 6d 61 6e 64 20 6f 70  tiple command op
27ff0 74 69 6f 6e 73 22 29 3b 0a 20 20 20 20 20 20 7d  tions");.      }
28000 0a 20 20 20 20 20 20 70 41 72 2d 3e 65 43 6d 64  .      pAr->eCmd
28010 20 3d 20 65 53 77 69 74 63 68 3b 0a 20 20 20 20   = eSwitch;.    
28020 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
28030 73 65 20 41 52 5f 53 57 49 54 43 48 5f 44 52 59  se AR_SWITCH_DRY
28040 52 55 4e 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e  RUN:.      pAr->
28050 62 44 72 79 52 75 6e 20 3d 20 31 3b 0a 20 20 20  bDryRun = 1;.   
28060 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
28070 73 65 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52  se AR_SWITCH_VER
28080 42 4f 53 45 3a 0a 20 20 20 20 20 20 70 41 72 2d  BOSE:.      pAr-
28090 3e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20  >bVerbose = 1;. 
280a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
280b0 63 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 41  case AR_SWITCH_A
280c0 50 50 45 4e 44 3a 0a 20 20 20 20 20 20 70 41 72  PPEND:.      pAr
280d0 2d 3e 62 41 70 70 65 6e 64 20 3d 20 31 3b 0a 20  ->bAppend = 1;. 
280e0 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
280f0 75 20 69 6e 74 6f 20 2d 2d 66 69 6c 65 20 2a 2f  u into --file */
28100 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49  .    case AR_SWI
28110 54 43 48 5f 46 49 4c 45 3a 0a 20 20 20 20 20 20  TCH_FILE:.      
28120 70 41 72 2d 3e 7a 46 69 6c 65 20 3d 20 7a 41 72  pAr->zFile = zAr
28130 67 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  g;.      break;.
28140 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54      case AR_SWIT
28150 43 48 5f 44 49 52 45 43 54 4f 52 59 3a 0a 20 20  CH_DIRECTORY:.  
28160 20 20 20 20 70 41 72 2d 3e 7a 44 69 72 20 3d 20      pAr->zDir = 
28170 7a 41 72 67 3b 0a 20 20 20 20 20 20 62 72 65 61  zArg;.      brea
28180 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
28190 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
281a0 2a 0a 2a 2a 20 50 61 72 73 65 20 74 68 65 20 63  *.** Parse the c
281b0 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 66 6f 72 20  ommand line for 
281c0 61 6e 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64  an ".ar" command
281d0 2e 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  . The results ar
281e0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  e written into.*
281f0 2a 20 73 74 72 75 63 74 75 72 65 20 28 2a 70 41  * structure (*pA
28200 72 29 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  r). SQLITE_OK is
28210 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
28220 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 69 73   command line is
28230 20 70 61 72 73 65 64 0a 2a 2a 20 73 75 63 63 65   parsed.** succe
28240 73 73 66 75 6c 6c 79 2c 20 6f 74 68 65 72 77 69  ssfully, otherwi
28250 73 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  se an error mess
28260 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 74  age is written t
28270 6f 20 73 74 64 65 72 72 20 61 6e 64 20 0a 2a 2a  o stderr and .**
28280 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 72 65   SQLITE_ERROR re
28290 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
282a0 63 20 69 6e 74 20 61 72 50 61 72 73 65 43 6f 6d  c int arParseCom
282b0 6d 61 6e 64 28 0a 20 20 63 68 61 72 20 2a 2a 61  mand(.  char **a
282c0 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  zArg,           
282d0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
282e0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61   of arguments pa
282f0 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d  ssed to dot comm
28300 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  and */.  int nAr
28310 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
28320 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
28330 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
28340 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 41 72   azArg[] */.  Ar
28350 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 20 20 20 20  Command *pAr    
28360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28370 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 6f   Populate this o
28380 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  bject */.){.  st
28390 72 75 63 74 20 41 72 53 77 69 74 63 68 20 7b 0a  ruct ArSwitch {.
283a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
283b0 7a 4c 6f 6e 67 3b 0a 20 20 20 20 63 68 61 72 20  zLong;.    char 
283c0 63 53 68 6f 72 74 3b 0a 20 20 20 20 75 38 20 65  cShort;.    u8 e
283d0 53 77 69 74 63 68 3b 0a 20 20 20 20 75 38 20 62  Switch;.    u8 b
283e0 41 72 67 3b 0a 20 20 7d 20 61 53 77 69 74 63 68  Arg;.  } aSwitch
283f0 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 63 72  [] = {.    { "cr
28400 65 61 74 65 22 2c 20 20 20 20 27 63 27 2c 20 41  eate",    'c', A
28410 52 5f 43 4d 44 5f 43 52 45 41 54 45 2c 20 20 20  R_CMD_CREATE,   
28420 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22      0 },.    { "
28430 65 78 74 72 61 63 74 22 2c 20 20 20 27 78 27 2c  extract",   'x',
28440 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 2c   AR_CMD_EXTRACT,
28450 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b        0 },.    {
28460 20 22 6c 69 73 74 22 2c 20 20 20 20 20 20 27 74   "list",      't
28470 27 2c 20 41 52 5f 43 4d 44 5f 4c 49 53 54 2c 20  ', AR_CMD_LIST, 
28480 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20          0 },.   
28490 20 7b 20 22 75 70 64 61 74 65 22 2c 20 20 20 20   { "update",    
284a0 27 75 27 2c 20 41 52 5f 43 4d 44 5f 55 50 44 41  'u', AR_CMD_UPDA
284b0 54 45 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 20  TE,       0 },. 
284c0 20 20 20 7b 20 22 68 65 6c 70 22 2c 20 20 20 20     { "help",    
284d0 20 20 27 68 27 2c 20 41 52 5f 43 4d 44 5f 48 45    'h', AR_CMD_HE
284e0 4c 50 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c  LP,         0 },
284f0 0a 20 20 20 20 7b 20 22 76 65 72 62 6f 73 65 22  .    { "verbose"
28500 2c 20 20 20 27 76 27 2c 20 41 52 5f 53 57 49 54  ,   'v', AR_SWIT
28510 43 48 5f 56 45 52 42 4f 53 45 2c 20 20 20 30 20  CH_VERBOSE,   0 
28520 7d 2c 0a 20 20 20 20 7b 20 22 66 69 6c 65 22 2c  },.    { "file",
28530 20 20 20 20 20 20 27 66 27 2c 20 41 52 5f 53 57        'f', AR_SW
28540 49 54 43 48 5f 46 49 4c 45 2c 20 20 20 20 20 20  ITCH_FILE,      
28550 31 20 7d 2c 0a 20 20 20 20 7b 20 22 61 70 70 65  1 },.    { "appe
28560 6e 64 22 2c 20 20 20 20 27 61 27 2c 20 41 52 5f  nd",    'a', AR_
28570 53 57 49 54 43 48 5f 41 50 50 45 4e 44 2c 20 20  SWITCH_APPEND,  
28580 20 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69    1 },.    { "di
28590 72 65 63 74 6f 72 79 22 2c 20 27 43 27 2c 20 41  rectory", 'C', A
285a0 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54 4f  R_SWITCH_DIRECTO
285b0 52 59 2c 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22  RY, 1 },.    { "
285c0 64 72 79 72 75 6e 22 2c 20 20 20 20 27 6e 27 2c  dryrun",    'n',
285d0 20 41 52 5f 53 57 49 54 43 48 5f 44 52 59 52 55   AR_SWITCH_DRYRU
285e0 4e 2c 20 20 20 20 30 20 7d 2c 0a 20 20 7d 3b 0a  N,    0 },.  };.
285f0 20 20 69 6e 74 20 6e 53 77 69 74 63 68 20 3d 20    int nSwitch = 
28600 73 69 7a 65 6f 66 28 61 53 77 69 74 63 68 29 20  sizeof(aSwitch) 
28610 2f 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  / sizeof(struct 
28620 41 72 53 77 69 74 63 68 29 3b 0a 20 20 73 74 72  ArSwitch);.  str
28630 75 63 74 20 41 72 53 77 69 74 63 68 20 2a 70 45  uct ArSwitch *pE
28640 6e 64 20 3d 20 26 61 53 77 69 74 63 68 5b 6e 53  nd = &aSwitch[nS
28650 77 69 74 63 68 5d 3b 0a 0a 20 20 69 66 28 20 6e  witch];..  if( n
28660 41 72 67 3c 3d 31 20 29 7b 0a 20 20 20 20 75 74  Arg<=1 ){.    ut
28670 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
28680 2c 20 22 57 72 6f 6e 67 20 6e 75 6d 62 65 72 20  , "Wrong number 
28690 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 55  of arguments.  U
286a0 73 61 67 65 3a 5c 6e 22 29 3b 0a 20 20 20 20 72  sage:\n");.    r
286b0 65 74 75 72 6e 20 61 72 55 73 61 67 65 28 73 74  eturn arUsage(st
286c0 64 65 72 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  derr);.  }else{.
286d0 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a      char *z = az
286e0 41 72 67 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20  Arg[1];.    if( 
286f0 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20  z[0]!='-' ){.   
28700 20 20 20 2f 2a 20 54 72 61 64 69 74 69 6f 6e 61     /* Traditiona
28710 6c 20 73 74 79 6c 65 20 5b 74 61 72 5d 20 69 6e  l style [tar] in
28720 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  vocation */.    
28730 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
28740 6e 74 20 69 41 72 67 20 3d 20 32 3b 0a 20 20 20  nt iArg = 2;.   
28750 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d     for(i=0; z[i]
28760 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
28770 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
28780 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 74   = 0;.        st
28790 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a 70  ruct ArSwitch *p
287a0 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  Opt;.        for
287b0 28 70 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30  (pOpt=&aSwitch[0
287c0 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f  ]; pOpt<pEnd; pO
287d0 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  pt++){.         
287e0 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d   if( z[i]==pOpt-
287f0 3e 63 53 68 6f 72 74 20 29 20 62 72 65 61 6b 3b  >cShort ) break;
28800 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28810 20 20 20 69 66 28 20 70 4f 70 74 3d 3d 70 45 6e     if( pOpt==pEn
28820 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  d ){.          r
28830 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
28840 28 70 41 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69  (pAr, "unrecogni
28850 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c  zed option: %c",
28860 20 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20   z[i]);.        
28870 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  }.        if( pO
28880 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20  pt->bArg ){.    
28890 20 20 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d        if( iArg>=
288a0 6e 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  nArg ){.        
288b0 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72      return arErr
288c0 6f 72 4d 73 67 28 70 41 72 2c 20 22 6f 70 74 69  orMsg(pAr, "opti
288d0 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61  on requires an a
288e0 72 67 75 6d 65 6e 74 3a 20 25 63 22 2c 7a 5b 69  rgument: %c",z[i
288f0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ]);.          }.
28900 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d            zArg =
28910 20 61 7a 41 72 67 5b 69 41 72 67 2b 2b 5d 3b 0a   azArg[iArg++];.
28920 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28930 20 20 69 66 28 20 61 72 50 72 6f 63 65 73 73 53    if( arProcessS
28940 77 69 74 63 68 28 70 41 72 2c 20 70 4f 70 74 2d  witch(pAr, pOpt-
28950 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20  >eSwitch, zArg) 
28960 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
28970 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
28980 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d       pAr->nArg =
28990 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20 20 20 20   nArg-iArg;.    
289a0 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 3e    if( pAr->nArg>
289b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72  0 ){.        pAr
289c0 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41 72 67  ->azArg = &azArg
289d0 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 7d 0a  [iArg];.      }.
289e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
289f0 20 2f 2a 20 4e 6f 6e 2d 74 72 61 64 69 74 69 6f   /* Non-traditio
28a00 6e 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a  nal invocation *
28a10 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41 72 67  /.      int iArg
28a20 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 41 72 67  ;.      for(iArg
28a30 3d 31 3b 20 69 41 72 67 3c 6e 41 72 67 3b 20 69  =1; iArg<nArg; i
28a40 41 72 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Arg++){.        
28a50 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 7a  int n;.        z
28a60 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a   = azArg[iArg];.
28a70 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d          if( z[0]
28a80 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  !='-' ){.       
28a90 20 20 20 2f 2a 20 41 6c 6c 20 72 65 6d 61 69 6e     /* All remain
28aa0 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ing command line
28ab0 20 77 6f 72 64 73 20 61 72 65 20 63 6f 6d 6d 61   words are comma
28ac0 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f  nd arguments. */
28ad0 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e  .          pAr->
28ae0 61 7a 41 72 67 20 3d 20 26 61 7a 41 72 67 5b 69  azArg = &azArg[i
28af0 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Arg];.          
28b00 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67  pAr->nArg = nArg
28b10 2d 69 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20  -iArg;.         
28b20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
28b30 7d 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 73 74  }.        n = st
28b40 72 6c 65 6e 33 30 28 7a 29 3b 0a 0a 20 20 20 20  rlen30(z);..    
28b50 20 20 20 20 69 66 28 20 7a 5b 31 5d 21 3d 27 2d      if( z[1]!='-
28b60 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ' ){.          i
28b70 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
28b80 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  /* One or more s
28b90 68 6f 72 74 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a  hort options */.
28ba0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
28bb0 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<n; i++){.  
28bc0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
28bd0 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a  char *zArg = 0;.
28be0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
28bf0 63 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70  ct ArSwitch *pOp
28c00 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  t;.            f
28c10 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74 63 68  or(pOpt=&aSwitch
28c20 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20  [0]; pOpt<pEnd; 
28c30 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pOpt++){.       
28c40 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d         if( z[i]=
28c50 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74 20 29 20  =pOpt->cShort ) 
28c60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
28c70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
28c80 20 69 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20   if( pOpt==pEnd 
28c90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
28ca0 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
28cb0 73 67 28 70 41 72 2c 20 22 75 6e 72 65 63 6f 67  sg(pAr, "unrecog
28cc0 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 63  nized option: %c
28cd0 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20  ", z[i]);.      
28ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28cf0 20 20 20 20 69 66 28 20 70 4f 70 74 2d 3e 62 41      if( pOpt->bA
28d00 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rg ){.          
28d10 20 20 20 20 69 66 28 20 69 3c 28 6e 2d 31 29 20      if( i<(n-1) 
28d20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
28d30 20 20 20 7a 41 72 67 20 3d 20 26 7a 5b 69 2b 31     zArg = &z[i+1
28d40 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
28d50 20 20 20 69 20 3d 20 6e 3b 0a 20 20 20 20 20 20     i = n;.      
28d60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
28d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
28d80 66 28 20 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31  f( iArg>=(nArg-1
28d90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
28da0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
28db0 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 6f  ErrorMsg(pAr, "o
28dc0 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61  ption requires a
28dd0 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 63 22 2c  n argument: %c",
28de0 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  z[i]);.         
28df0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28e00 20 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20           zArg = 
28e10 61 7a 41 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20  azArg[++iArg];. 
28e20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
28e30 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28e40 20 20 20 20 20 20 20 20 20 69 66 28 20 61 72 50           if( arP
28e50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70 41 72  rocessSwitch(pAr
28e60 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63 68 2c  , pOpt->eSwitch,
28e70 20 7a 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   zArg) ) return 
28e80 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
28e90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28ea0 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 32 5d    }else if( z[2]
28eb0 3d 3d 27 5c 30 27 20 29 7b 0a 20 20 20 20 20 20  =='\0' ){.      
28ec0 20 20 20 20 2f 2a 20 41 20 2d 2d 20 6f 70 74 69      /* A -- opti
28ed0 6f 6e 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  on, indicating t
28ee0 68 61 74 20 61 6c 6c 20 72 65 6d 61 69 6e 69 6e  hat all remainin
28ef0 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77  g command line w
28f00 6f 72 64 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ords.          *
28f10 2a 20 61 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72  * are command ar
28f20 67 75 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20  guments.  */.   
28f30 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72         pAr->azAr
28f40 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 2b  g = &azArg[iArg+
28f50 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 41  1];.          pA
28f60 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69  r->nArg = nArg-i
28f70 41 72 67 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  Arg-1;.         
28f80 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
28f90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
28fa0 20 2f 2a 20 41 20 6c 6f 6e 67 20 6f 70 74 69 6f   /* A long optio
28fb0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63  n */.          c
28fc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20  onst char *zArg 
28fd0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
28fe0 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 66 6f 72   /* Argument for
28ff0 20 6f 70 74 69 6f 6e 2c 20 69 66 20 61 6e 79 20   option, if any 
29000 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  */.          str
29010 75 63 74 20 41 72 53 77 69 74 63 68 20 2a 70 4d  uct ArSwitch *pM
29020 61 74 63 68 20 3d 20 30 3b 20 20 20 20 20 20 2f  atch = 0;      /
29030 2a 20 4d 61 74 63 68 69 6e 67 20 6f 70 74 69 6f  * Matching optio
29040 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  n */.          s
29050 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a  truct ArSwitch *
29060 70 4f 70 74 3b 20 20 20 20 20 20 20 20 20 20 20  pOpt;           
29070 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 2a 2f 0a   /* Iterator */.
29080 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f            for(pO
29090 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20  pt=&aSwitch[0]; 
290a0 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b  pOpt<pEnd; pOpt+
290b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
290c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 6e  const char *zLon
290d0 67 20 3d 20 70 4f 70 74 2d 3e 7a 4c 6f 6e 67 3b  g = pOpt->zLong;
290e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
290f0 20 28 6e 2d 32 29 3c 3d 73 74 72 6c 65 6e 33 30   (n-2)<=strlen30
29100 28 7a 4c 6f 6e 67 29 20 26 26 20 30 3d 3d 6d 65  (zLong) && 0==me
29110 6d 63 6d 70 28 26 7a 5b 32 5d 2c 20 7a 4c 6f 6e  mcmp(&z[2], zLon
29120 67 2c 20 6e 2d 32 29 20 29 7b 0a 20 20 20 20 20  g, n-2) ){.     
29130 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 61           if( pMa
29140 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tch ){.         
29150 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
29160 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 61  ErrorMsg(pAr, "a
29170 6d 62 69 67 75 6f 75 73 20 6f 70 74 69 6f 6e 3a  mbiguous option:
29180 20 25 73 22 2c 7a 29 3b 0a 20 20 20 20 20 20 20   %s",z);.       
29190 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
291a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4d                pM
291b0 61 74 63 68 20 3d 20 70 4f 70 74 3b 0a 20 20 20  atch = pOpt;.   
291c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
291d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
291e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
291f0 20 20 69 66 28 20 70 4d 61 74 63 68 3d 3d 30 20    if( pMatch==0 
29200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
29210 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
29220 28 70 41 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69  (pAr, "unrecogni
29230 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c  zed option: %s",
29240 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   z);.          }
29250 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
29260 4d 61 74 63 68 2d 3e 62 41 72 67 20 29 7b 0a 20  Match->bArg ){. 
29270 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
29280 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29 20 29 7b  Arg>=(nArg-1) ){
29290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
292a0 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
292b0 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65  (pAr, "option re
292c0 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65  quires an argume
292d0 6e 74 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20  nt: %s", z);.   
292e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
292f0 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a         zArg = az
29300 41 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20  Arg[++iArg];.   
29310 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29320 20 20 20 69 66 28 20 61 72 50 72 6f 63 65 73 73     if( arProcess
29330 53 77 69 74 63 68 28 70 41 72 2c 20 70 4d 61 74  Switch(pAr, pMat
29340 63 68 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72  ch->eSwitch, zAr
29350 67 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  g) ) return SQLI
29360 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
29370 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
29380 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
29390 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
293a0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
293b0 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 61  n assumes that a
293c0 6c 6c 20 61 72 67 75 6d 65 6e 74 73 20 77 69 74  ll arguments wit
293d0 68 69 6e 20 74 68 65 20 41 72 43 6f 6d 6d 61 6e  hin the ArComman
293e0 64 2e 61 7a 41 72 67 5b 5d 0a 2a 2a 20 61 72 72  d.azArg[].** arr
293f0 61 79 20 72 65 66 65 72 20 74 6f 20 61 72 63 68  ay refer to arch
29400 69 76 65 20 6d 65 6d 62 65 72 73 2c 20 61 73 20  ive members, as 
29410 66 6f 72 20 74 68 65 20 2d 2d 65 78 74 72 61 63  for the --extrac
29420 74 20 6f 72 20 2d 2d 6c 69 73 74 20 63 6f 6d 6d  t or --list comm
29430 61 6e 64 73 2e 20 0a 2a 2a 20 49 74 20 63 68 65  ands. .** It che
29440 63 6b 73 20 74 68 61 74 20 65 61 63 68 20 6f 66  cks that each of
29450 20 74 68 65 6d 20 61 72 65 20 70 72 65 73 65 6e   them are presen
29460 74 2e 20 49 66 20 61 6e 79 20 73 70 65 63 69 66  t. If any specif
29470 69 65 64 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  ied file is not.
29480 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ** present in th
29490 65 20 61 72 63 68 69 76 65 2c 20 61 6e 20 65 72  e archive, an er
294a0 72 6f 72 20 69 73 20 70 72 69 6e 74 65 64 20 74  ror is printed t
294b0 6f 20 73 74 64 65 72 72 20 61 6e 64 20 61 6e 20  o stderr and an 
294c0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 72 65  error.** code re
294d0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
294e0 65 2c 20 69 66 20 61 6c 6c 20 73 70 65 63 69 66  e, if all specif
294f0 69 65 64 20 61 72 67 75 6d 65 6e 74 73 20 61 72  ied arguments ar
29500 65 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20  e present in.** 
29510 74 68 65 20 61 72 63 68 69 76 65 2c 20 53 51 4c  the archive, SQL
29520 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
29530 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
29540 75 6e 63 74 69 6f 6e 20 73 74 72 69 70 73 20 61  unction strips a
29550 6e 79 20 74 72 61 69 6c 69 6e 67 20 27 2f 27 20  ny trailing '/' 
29560 63 68 61 72 61 63 74 65 72 73 20 66 72 6f 6d 20  characters from 
29570 65 61 63 68 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  each argument..*
29580 2a 20 54 68 69 73 20 69 73 20 63 6f 6e 73 69 73  * This is consis
29590 74 65 6e 74 20 77 69 74 68 20 74 68 65 20 77 61  tent with the wa
295a0 79 20 74 68 65 20 5b 74 61 72 5d 20 63 6f 6d 6d  y the [tar] comm
295b0 61 6e 64 20 73 65 65 6d 73 20 74 6f 20 77 6f 72  and seems to wor
295c0 6b 20 6f 6e 0a 2a 2a 20 4c 69 6e 75 78 2e 0a 2a  k on.** Linux..*
295d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 43  /.static int arC
295e0 68 65 63 6b 45 6e 74 72 69 65 73 28 41 72 43 6f  heckEntries(ArCo
295f0 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 69  mmand *pAr){.  i
29600 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
29610 4b 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 6e 41  K;.  if( pAr->nA
29620 72 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  rg ){.    int i,
29630 20 6a 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   j;.    sqlite3_
29640 73 74 6d 74 20 2a 70 54 65 73 74 20 3d 20 30 3b  stmt *pTest = 0;
29650 0a 0a 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61  ..    shellPrepa
29660 72 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62  rePrintf(pAr->db
29670 2c 20 26 72 63 2c 20 26 70 54 65 73 74 2c 0a 20  , &rc, &pTest,. 
29680 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
29690 61 6d 65 20 46 52 4f 4d 20 25 73 20 57 48 45 52  ame FROM %s WHER
296a0 45 20 6e 61 6d 65 3d 24 6e 61 6d 65 22 2c 20 0a  E name=$name", .
296b0 20 20 20 20 20 20 20 20 70 41 72 2d 3e 7a 53 72          pAr->zSr
296c0 63 54 61 62 6c 65 0a 20 20 20 20 29 3b 0a 20 20  cTable.    );.  
296d0 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69    j = sqlite3_bi
296e0 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
296f0 65 78 28 70 54 65 73 74 2c 20 22 24 6e 61 6d 65  ex(pTest, "$name
29700 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ");.    for(i=0;
29710 20 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26 20   i<pAr->nArg && 
29720 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
29730 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ++){.      char 
29740 2a 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b  *z = pAr->azArg[
29750 69 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  i];.      int n 
29760 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20  = strlen30(z);. 
29770 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30       int bOk = 0
29780 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e  ;.      while( n
29790 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f  >0 && z[n-1]=='/
297a0 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a  ' ) n--;.      z
297b0 5b 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  [n] = '\0';.    
297c0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
297d0 65 78 74 28 70 54 65 73 74 2c 20 6a 2c 20 7a 2c  ext(pTest, j, z,
297e0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
297f0 49 43 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53  IC);.      if( S
29800 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
29810 65 33 5f 73 74 65 70 28 70 54 65 73 74 29 20 29  e3_step(pTest) )
29820 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20  {.        bOk = 
29830 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
29840 20 73 68 65 6c 6c 52 65 73 65 74 28 26 72 63 2c   shellReset(&rc,
29850 20 70 54 65 73 74 29 3b 0a 20 20 20 20 20 20 69   pTest);.      i
29860 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29870 20 26 26 20 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20   && bOk==0 ){.  
29880 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
29890 66 28 73 74 64 65 72 72 2c 20 22 6e 6f 74 20 66  f(stderr, "not f
298a0 6f 75 6e 64 20 69 6e 20 61 72 63 68 69 76 65 3a  ound in archive:
298b0 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20   %s\n", z);.    
298c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
298d0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
298e0 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69     }.    shellFi
298f0 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 54 65 73  nalize(&rc, pTes
29900 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
29910 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f   rc;.}../*.** Fo
29920 72 6d 61 74 20 61 20 57 48 45 52 45 20 63 6c 61  rmat a WHERE cla
29930 75 73 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  use that can be 
29940 75 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  used against the
29950 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65 20 74   "sqlar" table t
29960 6f 0a 2a 2a 20 69 64 65 6e 74 69 66 79 20 61 6c  o.** identify al
29970 6c 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72  l archive member
29980 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65  s that match the
29990 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   command argumen
299a0 74 73 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 28 2a  ts held.** in (*
299b0 70 41 72 29 2e 20 4c 65 61 76 65 20 74 68 69 73  pAr). Leave this
299c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
299d0 20 28 2a 70 7a 57 68 65 72 65 29 20 62 65 66 6f   (*pzWhere) befo
299e0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
299f0 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
29a00 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65  esponsible for e
29a10 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 69 6e  ventually callin
29a20 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  g sqlite3_free()
29a30 20 6f 6e 0a 2a 2a 20 61 6e 79 20 6e 6f 6e 2d 4e   on.** any non-N
29a40 55 4c 4c 20 28 2a 70 7a 57 68 65 72 65 29 20 76  ULL (*pzWhere) v
29a50 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
29a60 76 6f 69 64 20 61 72 57 68 65 72 65 43 6c 61 75  void arWhereClau
29a70 73 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  se(.  int *pRc, 
29a80 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  .  ArCommand *pA
29a90 72 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 57  r, .  char **pzW
29aa0 68 65 72 65 20 20 20 20 20 20 20 20 20 20 20 20  here            
29ab0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
29ac0 77 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  w WHERE clause *
29ad0 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 57 68  /.){.  char *zWh
29ae0 65 72 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a  ere = 0;.  if( *
29af0 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
29b00 7b 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 6e  {.    if( pAr->n
29b10 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Arg==0 ){.      
29b20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  zWhere = sqlite3
29b30 5f 6d 70 72 69 6e 74 66 28 22 31 22 29 3b 0a 20  _mprintf("1");. 
29b40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29b50 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 6f 6e  int i;.      con
29b60 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20  st char *zSep = 
29b70 22 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  "";.      for(i=
29b80 30 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67 3b 20  0; i<pAr->nArg; 
29b90 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  i++){.        co
29ba0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 41  nst char *z = pA
29bb0 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20  r->azArg[i];.   
29bc0 20 20 20 20 20 7a 57 68 65 72 65 20 3d 20 73 71       zWhere = sq
29bd0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
29be0 20 20 20 20 20 20 20 20 20 22 25 7a 25 73 20 6e           "%z%s n
29bf0 61 6d 65 20 3d 20 27 25 71 27 20 4f 52 20 73 75  ame = '%q' OR su
29c00 62 73 74 72 28 6e 61 6d 65 2c 31 2c 25 64 29 20  bstr(name,1,%d) 
29c10 3d 20 27 25 71 2f 27 22 2c 20 0a 20 20 20 20 20  = '%q/'", .     
29c20 20 20 20 20 20 7a 57 68 65 72 65 2c 20 7a 53 65       zWhere, zSe
29c30 70 2c 20 7a 2c 20 73 74 72 6c 65 6e 33 30 28 7a  p, z, strlen30(z
29c40 29 2b 31 2c 20 7a 0a 20 20 20 20 20 20 20 20 29  )+1, z.        )
29c50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 57  ;.        if( zW
29c60 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  here==0 ){.     
29c70 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
29c80 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
29c90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
29ca0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 53 65     }.        zSe
29cb0 70 20 3d 20 22 20 4f 52 20 22 3b 0a 20 20 20 20  p = " OR ";.    
29cc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
29cd0 2a 70 7a 57 68 65 72 65 20 3d 20 7a 57 68 65 72  *pzWhere = zWher
29ce0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  e;.}../*.** Impl
29cf0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61  ementation of .a
29d00 72 20 22 6c 69 73 54 22 20 63 6f 6d 6d 61 6e 64  r "lisT" command
29d10 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
29d20 20 61 72 4c 69 73 74 43 6f 6d 6d 61 6e 64 28 41   arListCommand(A
29d30 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a  rCommand *pAr){.
29d40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
29d50 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 25 73 20  ql = "SELECT %s 
29d60 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 25 73  FROM %s WHERE %s
29d70 22 3b 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  "; .  const char
29d80 20 2a 61 7a 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20   *azCols[] = {. 
29d90 20 20 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 22     "name",.    "
29da0 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 2c 20 73 7a  lsmode(mode), sz
29db0 2c 20 64 61 74 65 74 69 6d 65 28 6d 74 69 6d 65  , datetime(mtime
29dc0 2c 20 27 75 6e 69 78 65 70 6f 63 68 27 29 2c 20  , 'unixepoch'), 
29dd0 6e 61 6d 65 22 0a 20 20 7d 3b 0a 0a 20 20 63 68  name".  };..  ch
29de0 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a  ar *zWhere = 0;.
29df0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
29e00 70 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pSql = 0;.  int 
29e10 72 63 3b 0a 0a 20 20 72 63 20 3d 20 61 72 43 68  rc;..  rc = arCh
29e20 65 63 6b 45 6e 74 72 69 65 73 28 70 41 72 29 3b  eckEntries(pAr);
29e30 0a 20 20 61 72 57 68 65 72 65 43 6c 61 75 73 65  .  arWhereClause
29e40 28 26 72 63 2c 20 70 41 72 2c 20 26 7a 57 68 65  (&rc, pAr, &zWhe
29e50 72 65 29 3b 0a 0a 20 20 73 68 65 6c 6c 50 72 65  re);..  shellPre
29e60 70 61 72 65 50 72 69 6e 74 66 28 70 41 72 2d 3e  parePrintf(pAr->
29e70 64 62 2c 20 26 72 63 2c 20 26 70 53 71 6c 2c 20  db, &rc, &pSql, 
29e80 7a 53 71 6c 2c 20 61 7a 43 6f 6c 73 5b 70 41 72  zSql, azCols[pAr
29e90 2d 3e 62 56 65 72 62 6f 73 65 5d 2c 0a 20 20 20  ->bVerbose],.   
29ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29eb0 20 20 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65    pAr->zSrcTable
29ec0 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 69 66 28  , zWhere);.  if(
29ed0 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b   pAr->bDryRun ){
29ee0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
29ef0 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25  (pAr->p->out, "%
29f00 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 73 71  s\n", sqlite3_sq
29f10 6c 28 70 53 71 6c 29 29 3b 0a 20 20 7d 65 6c 73  l(pSql));.  }els
29f20 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  e{.    while( rc
29f30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
29f40 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
29f50 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b  e3_step(pSql) ){
29f60 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e  .      if( pAr->
29f70 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20  bVerbose ){.    
29f80 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
29f90 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73  pAr->p->out, "%s
29fa0 20 25 20 31 30 64 20 20 25 73 20 20 25 73 5c 6e   % 10d  %s  %s\n
29fb0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ",.            s
29fc0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
29fd0 78 74 28 70 53 71 6c 2c 20 30 29 2c 0a 20 20 20  xt(pSql, 0),.   
29fe0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
29ff0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c  _column_int(pSql
2a000 2c 20 31 29 2c 20 0a 20 20 20 20 20 20 20 20 20  , 1), .         
2a010 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
2a020 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 32 29 2c  n_text(pSql, 2),
2a030 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2a040 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
2a050 28 70 53 71 6c 2c 20 33 29 0a 20 20 20 20 20 20  (pSql, 3).      
2a060 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65    );.      }else
2a070 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2a080 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75  rintf(pAr->p->ou
2a090 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  t, "%s\n", sqlit
2a0a0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
2a0b0 53 71 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  Sql, 0));.      
2a0c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 68  }.    }.  }.  sh
2a0d0 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
2a0e0 20 70 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65   pSql);.  sqlite
2a0f0 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29 3b 0a  3_free(zWhere);.
2a100 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a110 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2a120 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 65 58  ation of .ar "eX
2a130 74 72 61 63 74 22 20 63 6f 6d 6d 61 6e 64 2e 20  tract" command. 
2a140 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2a150 72 45 78 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28  rExtractCommand(
2a160 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b  ArCommand *pAr){
2a170 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2a180 53 71 6c 31 20 3d 20 0a 20 20 20 20 22 53 45 4c  Sql1 = .    "SEL
2a190 45 43 54 20 22 0a 20 20 20 20 22 20 28 24 64 69  ECT ".    " ($di
2a1a0 72 20 7c 7c 20 6e 61 6d 65 29 2c 22 0a 20 20 20  r || name),".   
2a1b0 20 22 20 77 72 69 74 65 66 69 6c 65 28 28 24 64   " writefile(($d
2a1c0 69 72 20 7c 7c 20 6e 61 6d 65 29 2c 20 25 73 2c  ir || name), %s,
2a1d0 20 6d 6f 64 65 2c 20 6d 74 69 6d 65 29 20 22 0a   mode, mtime) ".
2a1e0 20 20 20 20 22 46 52 4f 4d 20 25 73 20 57 48 45      "FROM %s WHE
2a1f0 52 45 20 28 25 73 29 20 41 4e 44 20 28 64 61 74  RE (%s) AND (dat
2a200 61 20 49 53 20 4e 55 4c 4c 20 4f 52 20 24 64 69  a IS NULL OR $di
2a210 72 4f 6e 6c 79 20 3d 20 30 29 22 0a 20 20 20 20  rOnly = 0)".    
2a220 22 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 47  " AND name NOT G
2a230 4c 4f 42 20 27 2a 2e 2e 5b 2f 5c 5c 5d 2a 27 22  LOB '*..[/\\]*'"
2a240 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ;..  const char 
2a250 2a 61 7a 45 78 74 72 61 41 72 67 5b 5d 20 3d 20  *azExtraArg[] = 
2a260 7b 20 0a 20 20 20 20 22 73 71 6c 61 72 5f 75 6e  { .    "sqlar_un
2a270 63 6f 6d 70 72 65 73 73 28 64 61 74 61 2c 20 73  compress(data, s
2a280 7a 29 22 2c 0a 20 20 20 20 22 64 61 74 61 22 0a  z)",.    "data".
2a290 20 20 7d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f    };..  sqlite3_
2a2a0 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a  stmt *pSql = 0;.
2a2b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a2c0 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 44  E_OK;.  char *zD
2a2d0 69 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ir = 0;.  char *
2a2e0 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 69 6e  zWhere = 0;.  in
2a2f0 74 20 69 2c 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66  t i, j;..  /* If
2a300 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 73   arguments are s
2a310 70 65 63 69 66 69 65 64 2c 20 63 68 65 63 6b 20  pecified, check 
2a320 74 68 61 74 20 74 68 65 79 20 61 63 74 75 61 6c  that they actual
2a330 6c 79 20 65 78 69 73 74 20 77 69 74 68 69 6e 0a  ly exist within.
2a340 20 20 2a 2a 20 74 68 65 20 61 72 63 68 69 76 65    ** the archive
2a350 20 62 65 66 6f 72 65 20 70 72 6f 63 65 65 64 69   before proceedi
2a360 6e 67 2e 20 41 6e 64 20 66 6f 72 6d 75 6c 61 74  ng. And formulat
2a370 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
2a380 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 74   to.  ** match t
2a390 68 65 6d 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20  hem.  */.  rc = 
2a3a0 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73 28 70  arCheckEntries(p
2a3b0 41 72 29 3b 0a 20 20 61 72 57 68 65 72 65 43 6c  Ar);.  arWhereCl
2a3c0 61 75 73 65 28 26 72 63 2c 20 70 41 72 2c 20 26  ause(&rc, pAr, &
2a3d0 7a 57 68 65 72 65 29 3b 0a 0a 20 20 69 66 28 20  zWhere);..  if( 
2a3e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a3f0 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 7a 44  .    if( pAr->zD
2a400 69 72 20 29 7b 0a 20 20 20 20 20 20 7a 44 69 72  ir ){.      zDir
2a410 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2a420 74 66 28 22 25 73 2f 22 2c 20 70 41 72 2d 3e 7a  tf("%s/", pAr->z
2a430 44 69 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Dir);.    }else{
2a440 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20 73 71  .      zDir = sq
2a450 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 22  lite3_mprintf(""
2a460 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2a470 20 7a 44 69 72 3d 3d 30 20 29 20 72 63 20 3d 20   zDir==0 ) rc = 
2a480 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2a490 7d 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72  }..  shellPrepar
2a4a0 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c  ePrintf(pAr->db,
2a4b0 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71   &rc, &pSql, zSq
2a4c0 6c 31 2c 20 0a 20 20 20 20 20 20 61 7a 45 78 74  l1, .      azExt
2a4d0 72 61 41 72 67 5b 70 41 72 2d 3e 62 5a 69 70 5d  raArg[pAr->bZip]
2a4e0 2c 20 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65  , pAr->zSrcTable
2a4f0 2c 20 7a 57 68 65 72 65 0a 20 20 29 3b 0a 0a 20  , zWhere.  );.. 
2a500 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a510 4f 4b 20 29 7b 0a 20 20 20 20 6a 20 3d 20 73 71  OK ){.    j = sq
2a520 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
2a530 65 74 65 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c  eter_index(pSql,
2a540 20 22 24 64 69 72 22 29 3b 0a 20 20 20 20 73 71   "$dir");.    sq
2a550 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
2a560 70 53 71 6c 2c 20 6a 2c 20 7a 44 69 72 2c 20 2d  pSql, j, zDir, -
2a570 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
2a580 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74  );..    /* Run t
2a590 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
2a5a0 65 6e 74 20 74 77 69 63 65 2e 20 54 68 65 20 66  ent twice. The f
2a5b0 69 72 73 74 20 74 69 6d 65 2c 20 77 72 69 74 65  irst time, write
2a5c0 66 69 6c 65 28 29 20 69 73 20 63 61 6c 6c 65 64  file() is called
2a5d0 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20  .    ** for all 
2a5e0 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20  archive members 
2a5f0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 65  that should be e
2a600 78 74 72 61 63 74 65 64 2e 20 54 68 65 20 73 65  xtracted. The se
2a610 63 6f 6e 64 20 74 69 6d 65 2c 0a 20 20 20 20 2a  cond time,.    *
2a620 2a 20 6f 6e 6c 79 20 66 6f 72 20 74 68 65 20 64  * only for the d
2a630 69 72 65 63 74 6f 72 69 65 73 2e 20 54 68 69 73  irectories. This
2a640 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
2a650 74 69 6d 65 73 74 61 6d 70 73 20 66 6f 72 0a 20  timestamps for. 
2a660 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20     ** extracted 
2a670 64 69 72 65 63 74 6f 72 69 65 73 20 6d 75 73 74  directories must
2a680 20 62 65 20 72 65 73 65 74 20 61 66 74 65 72 20   be reset after 
2a690 74 68 65 79 20 61 72 65 20 70 6f 70 75 6c 61 74  they are populat
2a6a0 65 64 20 28 61 73 0a 20 20 20 20 2a 2a 20 70 6f  ed (as.    ** po
2a6b0 70 75 6c 61 74 69 6e 67 20 74 68 65 6d 20 63 68  pulating them ch
2a6c0 61 6e 67 65 73 20 74 68 65 20 74 69 6d 65 73 74  anges the timest
2a6d0 61 6d 70 29 2e 20 20 2a 2f 0a 20 20 20 20 66 6f  amp).  */.    fo
2a6e0 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
2a6f0 7b 0a 20 20 20 20 20 20 6a 20 3d 20 73 71 6c 69  {.      j = sqli
2a700 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
2a710 65 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c 20 22  er_index(pSql, "
2a720 24 64 69 72 4f 6e 6c 79 22 29 3b 0a 20 20 20 20  $dirOnly");.    
2a730 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
2a740 6e 74 28 70 53 71 6c 2c 20 6a 2c 20 69 29 3b 0a  nt(pSql, j, i);.
2a750 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62        if( pAr->b
2a760 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 20 20  DryRun ){.      
2a770 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
2a780 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  r->p->out, "%s\n
2a790 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70  ", sqlite3_sql(p
2a7a0 53 71 6c 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Sql));.      }el
2a7b0 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  se{.        whil
2a7c0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2a7d0 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
2a7e0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71  sqlite3_step(pSq
2a7f0 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
2a800 69 66 28 20 69 3d 3d 30 20 26 26 20 70 41 72 2d  if( i==0 && pAr-
2a810 3e 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20  >bVerbose ){.   
2a820 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
2a830 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74  intf(pAr->p->out
2a840 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
2a850 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
2a860 71 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 20  ql, 0));.       
2a870 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2a880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68 65       }.      she
2a890 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 53 71  llReset(&rc, pSq
2a8a0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 68  l);.    }.    sh
2a8b0 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
2a8c0 20 70 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 73   pSql);.  }..  s
2a8d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44 69 72  qlite3_free(zDir
2a8e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
2a8f0 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 72 65 74  e(zWhere);.  ret
2a900 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2a910 20 52 75 6e 20 74 68 65 20 53 51 4c 20 73 74 61   Run the SQL sta
2a920 74 65 6d 65 6e 74 20 69 6e 20 7a 53 71 6c 2e 20  tement in zSql. 
2a930 20 4f 72 20 69 66 20 64 6f 69 6e 67 20 61 20 2d   Or if doing a -
2a940 2d 64 72 79 72 75 6e 2c 20 6d 65 72 65 6c 79 20  -dryrun, merely 
2a950 70 72 69 6e 74 20 69 74 20 6f 75 74 2e 0a 2a 2f  print it out..*/
2a960 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 78  .static int arEx
2a970 65 63 53 71 6c 28 41 72 43 6f 6d 6d 61 6e 64 20  ecSql(ArCommand 
2a980 2a 70 41 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  *pAr, const char
2a990 20 2a 7a 53 71 6c 29 7b 0a 20 20 69 6e 74 20 72   *zSql){.  int r
2a9a0 63 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 62 44  c;.  if( pAr->bD
2a9b0 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 75 74 66  ryRun ){.    utf
2a9c0 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d  8_printf(pAr->p-
2a9d0 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53  >out, "%s\n", zS
2a9e0 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ql);.    rc = SQ
2a9f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2aa00 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  {.    char *zErr
2aa10 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
2aa20 71 6c 69 74 65 33 5f 65 78 65 63 28 70 41 72 2d  qlite3_exec(pAr-
2aa30 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c  >db, zSql, 0, 0,
2aa40 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28   &zErr);.    if(
2aa50 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 75   zErr ){.      u
2aa60 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f 75  tf8_printf(stdou
2aa70 74 2c 20 22 45 52 52 4f 52 3a 20 25 73 5c 6e 22  t, "ERROR: %s\n"
2aa80 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 73  , zErr);.      s
2aa90 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
2aaa0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2aab0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2aac0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2aad0 6f 6e 20 6f 66 20 2e 61 72 20 22 63 72 65 61 74  on of .ar "creat
2aae0 65 22 20 61 6e 64 20 22 75 70 64 61 74 65 22 20  e" and "update" 
2aaf0 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20  commands..**.** 
2ab00 43 72 65 61 74 65 20 74 68 65 20 22 73 71 6c 61  Create the "sqla
2ab10 72 22 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  r" table in the 
2ab20 64 61 74 61 62 61 73 65 20 69 66 20 69 74 20 64  database if it d
2ab30 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
2ab40 65 78 69 73 74 2e 0a 2a 2a 20 54 68 65 6e 20 61  exist..** Then a
2ab50 64 64 20 65 61 63 68 20 66 69 6c 65 20 69 6e 20  dd each file in 
2ab60 74 68 65 20 61 7a 46 69 6c 65 5b 5d 20 61 72 72  the azFile[] arr
2ab70 61 79 20 74 6f 20 74 68 65 20 61 72 63 68 69 76  ay to the archiv
2ab80 65 2e 20 44 69 72 65 63 74 6f 72 69 65 73 0a 2a  e. Directories.*
2ab90 2a 20 61 72 65 20 61 64 64 65 64 20 72 65 63 75  * are added recu
2aba0 72 73 69 76 65 6c 79 2e 20 49 66 20 61 72 67 75  rsively. If argu
2abb0 6d 65 6e 74 20 62 56 65 72 62 6f 73 65 20 69 73  ment bVerbose is
2abc0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d 65 73   non-zero, a mes
2abd0 73 61 67 65 20 69 73 0a 2a 2a 20 70 72 69 6e 74  sage is.** print
2abe0 65 64 20 6f 6e 20 73 74 64 6f 75 74 20 66 6f 72  ed on stdout for
2abf0 20 65 61 63 68 20 66 69 6c 65 20 61 72 63 68 69   each file archi
2ac00 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ved..**.** The c
2ac10 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 69 73  reate command is
2ac20 20 74 68 65 20 73 61 6d 65 20 61 73 20 75 70 64   the same as upd
2ac30 61 74 65 2c 20 65 78 63 65 70 74 20 74 68 61 74  ate, except that
2ac40 20 69 74 20 64 72 6f 70 73 0a 2a 2a 20 61 6e 79   it drops.** any
2ac50 20 65 78 69 73 74 69 6e 67 20 22 73 71 6c 61 72   existing "sqlar
2ac60 22 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 62  " table before b
2ac70 65 67 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eginning..*/.sta
2ac80 74 69 63 20 69 6e 74 20 61 72 43 72 65 61 74 65  tic int arCreate
2ac90 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28  OrUpdateCommand(
2aca0 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  .  ArCommand *pA
2acb0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
2acc0 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72     /* Command ar
2acd0 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 70 74 69  guments and opti
2ace0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 55 70  ons */.  int bUp
2acf0 64 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20  date            
2ad00 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65           /* true
2ad10 20 66 6f 72 20 61 20 2d 2d 63 72 65 61 74 65 2e   for a --create.
2ad20 20 20 66 61 6c 73 65 20 66 6f 72 20 2d 2d 75 70    false for --up
2ad30 64 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  date */.){.  con
2ad40 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65  st char *zCreate
2ad50 20 3d 20 0a 20 20 20 20 20 20 22 43 52 45 41 54   = .      "CREAT
2ad60 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
2ad70 58 49 53 54 53 20 73 71 6c 61 72 28 5c 6e 22 0a  XISTS sqlar(\n".
2ad80 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20 54 45        "  name TE
2ad90 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  XT PRIMARY KEY, 
2ada0 20 2d 2d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   -- name of the 
2adb0 66 69 6c 65 5c 6e 22 0a 20 20 20 20 20 20 22 20  file\n".      " 
2adc0 20 6d 6f 64 65 20 49 4e 54 2c 20 20 20 20 20 20   mode INT,      
2add0 20 20 20 20 20 20 20 20 20 2d 2d 20 61 63 63 65           -- acce
2ade0 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 5c 6e  ss permissions\n
2adf0 22 0a 20 20 20 20 20 20 22 20 20 6d 74 69 6d 65  ".      "  mtime
2ae00 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20 20   INT,           
2ae10 20 20 20 2d 2d 20 6c 61 73 74 20 6d 6f 64 69 66     -- last modif
2ae20 69 63 61 74 69 6f 6e 20 74 69 6d 65 5c 6e 22 0a  ication time\n".
2ae30 20 20 20 20 20 20 22 20 20 73 7a 20 49 4e 54 2c        "  sz INT,
2ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae50 20 2d 2d 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c   -- original fil
2ae60 65 20 73 69 7a 65 5c 6e 22 0a 20 20 20 20 20 20  e size\n".      
2ae70 22 20 20 64 61 74 61 20 42 4c 4f 42 20 20 20 20  "  data BLOB    
2ae80 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 63 6f             -- co
2ae90 6d 70 72 65 73 73 65 64 20 63 6f 6e 74 65 6e 74  mpressed content
2aea0 5c 6e 22 0a 20 20 20 20 20 20 22 29 22 3b 0a 20  \n".      ")";. 
2aeb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 72   const char *zDr
2aec0 6f 70 20 3d 20 22 44 52 4f 50 20 54 41 42 4c 45  op = "DROP TABLE
2aed0 20 49 46 20 45 58 49 53 54 53 20 73 71 6c 61 72   IF EXISTS sqlar
2aee0 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ";.  const char 
2aef0 2a 7a 49 6e 73 65 72 74 46 6d 74 5b 32 5d 20 3d  *zInsertFmt[2] =
2af00 20 7b 0a 20 20 20 20 20 22 52 45 50 4c 41 43 45   {.     "REPLACE
2af10 20 49 4e 54 4f 20 25 73 28 6e 61 6d 65 2c 6d 6f   INTO %s(name,mo
2af20 64 65 2c 6d 74 69 6d 65 2c 73 7a 2c 64 61 74 61  de,mtime,sz,data
2af30 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 53 45 4c  )\n".     "  SEL
2af40 45 43 54 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  ECT\n".     "   
2af50 20 25 73 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20   %s,\n".     "  
2af60 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20 20 20    mode,\n".     
2af70 22 20 20 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a 20  "    mtime,\n". 
2af80 20 20 20 20 22 20 20 20 20 43 41 53 45 20 73 75      "    CASE su
2af90 62 73 74 72 28 6c 73 6d 6f 64 65 28 6d 6f 64 65  bstr(lsmode(mode
2afa0 29 2c 31 2c 31 29 5c 6e 22 0a 20 20 20 20 20 22  ),1,1)\n".     "
2afb0 20 20 20 20 20 20 57 48 45 4e 20 27 2d 27 20 54        WHEN '-' T
2afc0 48 45 4e 20 6c 65 6e 67 74 68 28 64 61 74 61 29  HEN length(data)
2afd0 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20 20  \n".     "      
2afe0 57 48 45 4e 20 27 64 27 20 54 48 45 4e 20 30 5c  WHEN 'd' THEN 0\
2aff0 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20 20 45  n".     "      E
2b000 4c 53 45 20 2d 31 20 45 4e 44 2c 5c 6e 22 0a 20  LSE -1 END,\n". 
2b010 20 20 20 20 22 20 20 20 20 73 71 6c 61 72 5f 63      "    sqlar_c
2b020 6f 6d 70 72 65 73 73 28 64 61 74 61 29 5c 6e 22  ompress(data)\n"
2b030 0a 20 20 20 20 20 22 20 20 46 52 4f 4d 20 66 73  .     "  FROM fs
2b040 64 69 72 28 25 51 2c 25 51 29 5c 6e 22 0a 20 20  dir(%Q,%Q)\n".  
2b050 20 20 20 22 20 20 57 48 45 52 45 20 6c 73 6d 6f     "  WHERE lsmo
2b060 64 65 28 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b  de(mode) NOT LIK
2b070 45 20 27 3f 25 25 27 3b 22 2c 0a 20 20 20 20 20  E '?%%';",.     
2b080 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 73  "REPLACE INTO %s
2b090 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65  (name,mode,mtime
2b0a0 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22  ,data)\n".     "
2b0b0 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20 20 20    SELECT\n".    
2b0c0 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a 20 20 20   "    %s,\n".   
2b0d0 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a    "    mode,\n".
2b0e0 20 20 20 20 20 22 20 20 20 20 6d 74 69 6d 65 2c       "    mtime,
2b0f0 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 64 61  \n".     "    da
2b100 74 61 5c 6e 22 0a 20 20 20 20 20 22 20 20 46 52  ta\n".     "  FR
2b110 4f 4d 20 66 73 64 69 72 28 25 51 2c 25 51 29 5c  OM fsdir(%Q,%Q)\
2b120 6e 22 0a 20 20 20 20 20 22 20 20 57 48 45 52 45  n".     "  WHERE
2b130 20 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 20 4e 4f   lsmode(mode) NO
2b140 54 20 4c 49 4b 45 20 27 3f 25 25 27 3b 22 0a 20  T LIKE '?%%';". 
2b150 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   };.  int i;    
2b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b170 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65        /* For ite
2b180 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61  rating through a
2b190 7a 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74  zFile[] */.  int
2b1a0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b1c0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2b1d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
2b1e0 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
2b1f0 20 2f 2a 20 53 51 4c 20 74 61 62 6c 65 20 69 6e   /* SQL table in
2b200 74 6f 20 77 68 69 63 68 20 74 6f 20 69 6e 73 65  to which to inse
2b210 72 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  rt */.  char *zS
2b220 71 6c 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70  ql;.  char zTemp
2b230 5b 35 30 5d 3b 0a 0a 20 20 61 72 45 78 65 63 53  [50];..  arExecS
2b240 71 6c 28 70 41 72 2c 20 22 50 52 41 47 4d 41 20  ql(pAr, "PRAGMA 
2b250 70 61 67 65 5f 73 69 7a 65 3d 35 31 32 22 29 3b  page_size=512");
2b260 0a 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71  .  rc = arExecSq
2b270 6c 28 70 41 72 2c 20 22 53 41 56 45 50 4f 49 4e  l(pAr, "SAVEPOIN
2b280 54 20 61 72 3b 22 29 3b 0a 20 20 69 66 28 20 72  T ar;");.  if( r
2b290 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2b2a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7a 54 65 6d  eturn rc;.  zTem
2b2b0 70 5b 30 5d 20 3d 20 30 3b 20 0a 20 20 69 66 28  p[0] = 0; .  if(
2b2c0 20 70 41 72 2d 3e 62 5a 69 70 20 29 7b 0a 20 20   pAr->bZip ){.  
2b2d0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
2b2e0 74 68 65 20 7a 69 70 66 69 6c 65 20 76 69 72 74  the zipfile virt
2b2f0 75 61 6c 20 74 61 62 6c 65 2c 20 69 66 20 6e 65  ual table, if ne
2b300 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69  cessary */.    i
2b310 66 28 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29 7b  f( pAr->zFile ){
2b320 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75  .      sqlite3_u
2b330 69 6e 74 36 34 20 72 3b 0a 20 20 20 20 20 20 73  int64 r;.      s
2b340 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
2b350 73 28 73 69 7a 65 6f 66 28 72 29 2c 26 72 29 3b  s(sizeof(r),&r);
2b360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2b370 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
2b380 54 65 6d 70 29 2c 7a 54 65 6d 70 2c 22 7a 69 70  Temp),zTemp,"zip
2b390 25 30 31 36 6c 6c 78 22 2c 72 29 3b 0a 20 20 20  %016llx",r);.   
2b3a0 20 20 20 7a 54 61 62 20 3d 20 7a 54 65 6d 70 3b     zTab = zTemp;
2b3b0 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  .      zSql = sq
2b3c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
2b3d0 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
2b3e0 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65  VIRTUAL TABLE te
2b3f0 6d 70 2e 25 73 20 55 53 49 4e 47 20 7a 69 70 66  mp.%s USING zipf
2b400 69 6c 65 28 25 51 29 22 2c 0a 20 20 20 20 20 20  ile(%Q)",.      
2b410 20 20 20 7a 54 61 62 2c 20 70 41 72 2d 3e 7a 46     zTab, pAr->zF
2b420 69 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ile.      );.   
2b430 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71     rc = arExecSq
2b440 6c 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a 20 20  l(pAr, zSql);.  
2b450 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2b460 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  (zSql);.    }els
2b470 65 7b 0a 20 20 20 20 20 20 7a 54 61 62 20 3d 20  e{.      zTab = 
2b480 22 7a 69 70 22 3b 0a 20 20 20 20 7d 0a 20 20 7d  "zip";.    }.  }
2b490 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69  else{.    /* Ini
2b4a0 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c  tialize the tabl
2b4b0 65 20 66 6f 72 20 61 6e 20 53 51 4c 41 52 20 2a  e for an SQLAR *
2b4c0 2f 0a 20 20 20 20 7a 54 61 62 20 3d 20 22 73 71  /.    zTab = "sq
2b4d0 6c 61 72 22 3b 0a 20 20 20 20 69 66 28 20 62 55  lar";.    if( bU
2b4e0 70 64 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pdate==0 ){.    
2b4f0 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c    rc = arExecSql
2b500 28 70 41 72 2c 20 7a 44 72 6f 70 29 3b 0a 20 20  (pAr, zDrop);.  
2b510 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b520 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
2b530 5f 61 72 5f 74 72 61 6e 73 61 63 74 69 6f 6e 3b  _ar_transaction;
2b540 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2b550 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a  arExecSql(pAr, z
2b560 43 72 65 61 74 65 29 3b 0a 20 20 7d 0a 20 20 66  Create);.  }.  f
2b570 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e  or(i=0; i<pAr->n
2b580 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Arg && rc==SQLIT
2b590 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
2b5a0 63 68 61 72 20 2a 7a 53 71 6c 32 20 3d 20 73 71  char *zSql2 = sq
2b5b0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 7a 49  lite3_mprintf(zI
2b5c0 6e 73 65 72 74 46 6d 74 5b 70 41 72 2d 3e 62 5a  nsertFmt[pAr->bZ
2b5d0 69 70 5d 2c 20 7a 54 61 62 2c 0a 20 20 20 20 20  ip], zTab,.     
2b5e0 20 20 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65     pAr->bVerbose
2b5f0 20 3f 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c   ? "shell_putsnl
2b600 28 6e 61 6d 65 29 22 20 3a 20 22 6e 61 6d 65 22  (name)" : "name"
2b610 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61  ,.        pAr->a
2b620 7a 41 72 67 5b 69 5d 2c 20 70 41 72 2d 3e 7a 44  zArg[i], pAr->zD
2b630 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 72  ir);.    rc = ar
2b640 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71  ExecSql(pAr, zSq
2b650 6c 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  l2);.    sqlite3
2b660 5f 66 72 65 65 28 7a 53 71 6c 32 29 3b 0a 20 20  _free(zSql2);.  
2b670 7d 0a 65 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63  }.end_ar_transac
2b680 74 69 6f 6e 3a 0a 20 20 69 66 28 20 72 63 21 3d  tion:.  if( rc!=
2b690 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b6a0 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
2b6b0 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 72 3b  "ROLLBACK TO ar;
2b6c0 20 52 45 4c 45 41 53 45 20 61 72 3b 22 29 3b 0a   RELEASE ar;");.
2b6d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2b6e0 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c  = arExecSql(pAr,
2b6f0 20 22 52 45 4c 45 41 53 45 20 61 72 3b 22 29 3b   "RELEASE ar;");
2b700 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62 5a  .    if( pAr->bZ
2b710 69 70 20 26 26 20 70 41 72 2d 3e 7a 46 69 6c 65  ip && pAr->zFile
2b720 20 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d   ){.      zSql =
2b730 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2b740 28 22 44 52 4f 50 20 54 41 42 4c 45 20 25 73 22  ("DROP TABLE %s"
2b750 2c 20 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  , zTemp);.      
2b760 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a  arExecSql(pAr, z
2b770 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sql);.      sqli
2b780 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
2b790 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2b7a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2b7b0 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
2b7c0 66 20 22 2e 61 72 22 20 64 6f 74 20 63 6f 6d 6d  f ".ar" dot comm
2b7d0 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  and..*/.static i
2b7e0 6e 74 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28  nt arDotCommand(
2b7f0 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
2b800 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  State,          
2b810 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68     /* Current sh
2b820 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a  ell tool state *
2b830 2f 0a 20 20 69 6e 74 20 66 72 6f 6d 43 6d 64 4c  /.  int fromCmdL
2b840 69 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ine,            
2b850 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d      /* True if -
2b860 41 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f  A command-line o
2b870 70 74 69 6f 6e 2c 20 6e 6f 74 20 2e 61 72 20 63  ption, not .ar c
2b880 6d 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  md */.  char **a
2b890 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  zArg,           
2b8a0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
2b8b0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61   of arguments pa
2b8c0 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d  ssed to dot comm
2b8d0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  and */.  int nAr
2b8e0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
2b8f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2b900 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
2b910 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20   azArg[] */.){. 
2b920 20 41 72 43 6f 6d 6d 61 6e 64 20 63 6d 64 3b 0a   ArCommand cmd;.
2b930 20 20 69 6e 74 20 72 63 3b 0a 20 20 6d 65 6d 73    int rc;.  mems
2b940 65 74 28 26 63 6d 64 2c 20 30 2c 20 73 69 7a 65  et(&cmd, 0, size
2b950 6f 66 28 63 6d 64 29 29 3b 0a 20 20 63 6d 64 2e  of(cmd));.  cmd.
2b960 66 72 6f 6d 43 6d 64 4c 69 6e 65 20 3d 20 66 72  fromCmdLine = fr
2b970 6f 6d 43 6d 64 4c 69 6e 65 3b 0a 20 20 72 63 20  omCmdLine;.  rc 
2b980 3d 20 61 72 50 61 72 73 65 43 6f 6d 6d 61 6e 64  = arParseCommand
2b990 28 61 7a 41 72 67 2c 20 6e 41 72 67 2c 20 26 63  (azArg, nArg, &c
2b9a0 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  md);.  if( rc==S
2b9b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b9c0 69 6e 74 20 65 44 62 54 79 70 65 20 3d 20 53 48  int eDbType = SH
2b9d0 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3b  ELL_OPEN_UNSPEC;
2b9e0 0a 20 20 20 20 63 6d 64 2e 70 20 3d 20 70 53 74  .    cmd.p = pSt
2b9f0 61 74 65 3b 0a 20 20 20 20 63 6d 64 2e 64 62 20  ate;.    cmd.db 
2ba00 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b 0a 20 20  = pState->db;.  
2ba10 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 20    if( cmd.zFile 
2ba20 29 7b 0a 20 20 20 20 20 20 65 44 62 54 79 70 65  ){.      eDbType
2ba30 20 3d 20 64 65 64 75 63 65 44 61 74 61 62 61 73   = deduceDatabas
2ba40 65 54 79 70 65 28 63 6d 64 2e 7a 46 69 6c 65 2c  eType(cmd.zFile,
2ba50 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1);.    }else{.
2ba60 20 20 20 20 20 20 65 44 62 54 79 70 65 20 3d 20        eDbType = 
2ba70 70 53 74 61 74 65 2d 3e 6f 70 65 6e 4d 6f 64 65  pState->openMode
2ba80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ba90 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f  eDbType==SHELL_O
2baa0 50 45 4e 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20  PEN_ZIPFILE ){. 
2bab0 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65 43 6d       if( cmd.eCm
2bac0 64 3d 3d 41 52 5f 43 4d 44 5f 45 58 54 52 41 43  d==AR_CMD_EXTRAC
2bad0 54 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d 41  T || cmd.eCmd==A
2bae0 52 5f 43 4d 44 5f 4c 49 53 54 20 29 7b 0a 20 20  R_CMD_LIST ){.  
2baf0 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 46        if( cmd.zF
2bb00 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
2bb10 20 20 20 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c      cmd.zSrcTabl
2bb20 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
2bb30 6e 74 66 28 22 7a 69 70 22 29 3b 0a 20 20 20 20  ntf("zip");.    
2bb40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bb50 20 20 20 20 20 63 6d 64 2e 7a 53 72 63 54 61 62       cmd.zSrcTab
2bb60 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  le = sqlite3_mpr
2bb70 69 6e 74 66 28 22 7a 69 70 66 69 6c 65 28 25 51  intf("zipfile(%Q
2bb80 29 22 2c 20 63 6d 64 2e 7a 46 69 6c 65 29 3b 0a  )", cmd.zFile);.
2bb90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bba0 7d 0a 20 20 20 20 20 20 63 6d 64 2e 62 5a 69 70  }.      cmd.bZip
2bbb0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
2bbc0 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 20 29 7b  if( cmd.zFile ){
2bbd0 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
2bbe0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e  ;.      if( cmd.
2bbf0 62 41 70 70 65 6e 64 20 29 20 65 44 62 54 79 70  bAppend ) eDbTyp
2bc00 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41  e = SHELL_OPEN_A
2bc10 50 50 45 4e 44 56 46 53 3b 0a 20 20 20 20 20 20  PPENDVFS;.      
2bc20 69 66 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52  if( cmd.eCmd==AR
2bc30 5f 43 4d 44 5f 43 52 45 41 54 45 20 7c 7c 20 63  _CMD_CREATE || c
2bc40 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f  md.eCmd==AR_CMD_
2bc50 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UPDATE ){.      
2bc60 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45    flags = SQLITE
2bc70 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
2bc80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
2bc90 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  TE;.      }else{
2bca0 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d  .        flags =
2bcb0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2bcc0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20  DONLY;.      }. 
2bcd0 20 20 20 20 20 63 6d 64 2e 64 62 20 3d 20 30 3b       cmd.db = 0;
2bce0 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 62  .      if( cmd.b
2bcf0 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 20 20  DryRun ){.      
2bd00 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 53    utf8_printf(pS
2bd10 74 61 74 65 2d 3e 6f 75 74 2c 20 22 2d 2d 20 6f  tate->out, "-- o
2bd20 70 65 6e 20 64 61 74 61 62 61 73 65 20 27 25 73  pen database '%s
2bd30 27 25 73 5c 6e 22 2c 20 63 6d 64 2e 7a 46 69 6c  '%s\n", cmd.zFil
2bd40 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2bd50 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f  eDbType==SHELL_O
2bd60 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 3f 20  PEN_APPENDVFS ? 
2bd70 22 20 75 73 69 6e 67 20 27 61 70 6e 64 76 66 73  " using 'apndvfs
2bd80 27 22 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  '" : "");.      
2bd90 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
2bda0 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 63 6d 64  ite3_open_v2(cmd
2bdb0 2e 7a 46 69 6c 65 2c 20 26 63 6d 64 2e 64 62 2c  .zFile, &cmd.db,
2bdc0 20 66 6c 61 67 73 2c 20 0a 20 20 20 20 20 20 20   flags, .       
2bdd0 20 20 20 20 20 20 65 44 62 54 79 70 65 3d 3d 53        eDbType==S
2bde0 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44  HELL_OPEN_APPEND
2bdf0 56 46 53 20 3f 20 22 61 70 6e 64 76 66 73 22 20  VFS ? "apndvfs" 
2be00 3a 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  : 0);.      if( 
2be10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2be20 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
2be30 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63 61  intf(stderr, "ca
2be40 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20  nnot open file: 
2be50 25 73 20 28 25 73 29 5c 6e 22 2c 20 0a 20 20 20  %s (%s)\n", .   
2be60 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 46 69           cmd.zFi
2be70 6c 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  le, sqlite3_errm
2be80 73 67 28 63 6d 64 2e 64 62 29 0a 20 20 20 20 20  sg(cmd.db).     
2be90 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f     );.        go
2bea0 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e  to end_ar_comman
2beb0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
2bec0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f   sqlite3_fileio_
2bed0 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20 30 2c 20  init(cmd.db, 0, 
2bee0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
2bef0 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 63 6d 64  3_sqlar_init(cmd
2bf00 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  .db, 0, 0);.    
2bf10 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
2bf20 5f 66 75 6e 63 74 69 6f 6e 28 63 6d 64 2e 64 62  _function(cmd.db
2bf30 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 22  , "shell_putsnl"
2bf40 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
2bf50 2c 20 63 6d 64 2e 70 2c 0a 20 20 20 20 20 20 20  , cmd.p,.       
2bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf70 20 20 20 20 20 20 20 73 68 65 6c 6c 50 75 74 73         shellPuts
2bf80 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  Func, 0, 0);..  
2bf90 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6d 64 2e    }.    if( cmd.
2bfa0 7a 53 72 63 54 61 62 6c 65 3d 3d 30 20 26 26 20  zSrcTable==0 && 
2bfb0 63 6d 64 2e 62 5a 69 70 3d 3d 30 20 26 26 20 63  cmd.bZip==0 && c
2bfc0 6d 64 2e 65 43 6d 64 21 3d 41 52 5f 43 4d 44 5f  md.eCmd!=AR_CMD_
2bfd0 48 45 4c 50 20 29 7b 0a 20 20 20 20 20 20 69 66  HELP ){.      if
2bfe0 28 20 63 6d 64 2e 65 43 6d 64 21 3d 41 52 5f 43  ( cmd.eCmd!=AR_C
2bff0 4d 44 5f 43 52 45 41 54 45 0a 20 20 20 20 20 20  MD_CREATE.      
2c000 20 26 26 20 73 71 6c 69 74 65 33 5f 74 61 62 6c   && sqlite3_tabl
2c010 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
2c020 61 28 63 6d 64 2e 64 62 2c 30 2c 22 73 71 6c 61  a(cmd.db,0,"sqla
2c030 72 22 2c 22 6e 61 6d 65 22 2c 30 2c 30 2c 30 2c  r","name",0,0,0,
2c040 30 2c 30 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  0,0).      ){.  
2c050 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2c060 66 28 73 74 64 65 72 72 2c 20 22 64 61 74 61 62  f(stderr, "datab
2c070 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ase does not con
2c080 74 61 69 6e 20 61 6e 20 27 73 71 6c 61 72 27 20  tain an 'sqlar' 
2c090 74 61 62 6c 65 5c 6e 22 29 3b 0a 20 20 20 20 20  table\n");.     
2c0a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2c0b0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f  RROR;.        go
2c0c0 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e  to end_ar_comman
2c0d0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
2c0e0 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d   cmd.zSrcTable =
2c0f0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2c100 28 22 73 71 6c 61 72 22 29 3b 0a 20 20 20 20 7d  ("sqlar");.    }
2c110 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 63 6d  ..    switch( cm
2c120 64 2e 65 43 6d 64 20 29 7b 0a 20 20 20 20 20 20  d.eCmd ){.      
2c130 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52 45 41  case AR_CMD_CREA
2c140 54 45 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  TE:.        rc =
2c150 20 61 72 43 72 65 61 74 65 4f 72 55 70 64 61 74   arCreateOrUpdat
2c160 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c 20 30  eCommand(&cmd, 0
2c170 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2c180 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41 52  ;..      case AR
2c190 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20 20  _CMD_EXTRACT:.  
2c1a0 20 20 20 20 20 20 72 63 20 3d 20 61 72 45 78 74        rc = arExt
2c1b0 72 61 63 74 43 6f 6d 6d 61 6e 64 28 26 63 6d 64  ractCommand(&cmd
2c1c0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2c1d0 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41 52  ;..      case AR
2c1e0 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 20  _CMD_LIST:.     
2c1f0 20 20 20 72 63 20 3d 20 61 72 4c 69 73 74 43 6f     rc = arListCo
2c200 6d 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20 20  mmand(&cmd);.   
2c210 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
2c220 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 48     case AR_CMD_H
2c230 45 4c 50 3a 0a 20 20 20 20 20 20 20 20 61 72 55  ELP:.        arU
2c240 73 61 67 65 28 70 53 74 61 74 65 2d 3e 6f 75 74  sage(pState->out
2c250 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2c260 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  ;..      default
2c270 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  :.        assert
2c280 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43  ( cmd.eCmd==AR_C
2c290 4d 44 5f 55 50 44 41 54 45 20 29 3b 0a 20 20 20  MD_UPDATE );.   
2c2a0 20 20 20 20 20 72 63 20 3d 20 61 72 43 72 65 61       rc = arCrea
2c2b0 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e  teOrUpdateComman
2c2c0 64 28 26 63 6d 64 2c 20 31 29 3b 0a 20 20 20 20  d(&cmd, 1);.    
2c2d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2c2e0 0a 20 20 7d 0a 65 6e 64 5f 61 72 5f 63 6f 6d 6d  .  }.end_ar_comm
2c2f0 61 6e 64 3a 0a 20 20 69 66 28 20 63 6d 64 2e 64  and:.  if( cmd.d
2c300 62 21 3d 70 53 74 61 74 65 2d 3e 64 62 20 29 7b  b!=pState->db ){
2c310 0a 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 63 6d  .    close_db(cm
2c320 64 2e 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  d.db);.  }.  sql
2c330 69 74 65 33 5f 66 72 65 65 28 63 6d 64 2e 7a 53  ite3_free(cmd.zS
2c340 72 63 54 61 62 6c 65 29 3b 0a 0a 20 20 72 65 74  rcTable);..  ret
2c350 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45 6e 64  urn rc;.}./* End
2c360 20 6f 66 20 74 68 65 20 22 2e 61 72 63 68 69 76   of the ".archiv
2c370 65 22 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d  e" or ".ar" comm
2c380 61 6e 64 20 6c 6f 67 69 63 0a 2a 2a 2a 2a 2a 2a  and logic.******
2c390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c3a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c3b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c3c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c3d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
2c3e0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
2c3f0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
2c400 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
2c410 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56  fined(SQLITE_HAV
2c420 45 5f 5a 4c 49 42 29 20 2a 2f 0a 0a 0a 2f 2a 0a  E_ZLIB) */.../*.
2c430 2a 2a 20 49 66 20 61 6e 20 69 6e 70 75 74 20 6c  ** If an input l
2c440 69 6e 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  ine begins with 
2c450 22 2e 22 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  "." then invoke 
2c460 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a  this routine to.
2c470 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  ** process that 
2c480 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  line..**.** Retu
2c490 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32  rn 1 on error, 2
2c4a0 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20   to exit, and 0 
2c4b0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
2c4c0 61 74 69 63 20 69 6e 74 20 64 6f 5f 6d 65 74 61  atic int do_meta
2c4d0 5f 63 6f 6d 6d 61 6e 64 28 63 68 61 72 20 2a 7a  _command(char *z
2c4e0 4c 69 6e 65 2c 20 53 68 65 6c 6c 53 74 61 74 65  Line, ShellState
2c4f0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 68 20 3d 20   *p){.  int h = 
2c500 31 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20  1;.  int nArg = 
2c510 30 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 3b 0a 20  0;.  int n, c;. 
2c520 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
2c530 68 61 72 20 2a 61 7a 41 72 67 5b 35 30 5d 3b 0a  har *azArg[50];.
2c540 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c550 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2c560 45 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 65 72  E.  if( p->exper
2c570 74 2e 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20  t.pExpert ){.   
2c580 20 65 78 70 65 72 74 46 69 6e 69 73 68 28 70 2c   expertFinish(p,
2c590 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   1, 0);.  }.#end
2c5a0 69 66 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74  if..  /* Parse t
2c5b0 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e  he input line in
2c5c0 74 6f 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a  to tokens..  */.
2c5d0 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68    while( zLine[h
2c5e0 5d 20 26 26 20 6e 41 72 67 3c 41 72 72 61 79 53  ] && nArg<ArrayS
2c5f0 69 7a 65 28 61 7a 41 72 67 29 20 29 7b 0a 20 20  ize(azArg) ){.  
2c600 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
2c610 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b  (zLine[h]) ){ h+
2c620 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69  +; }.    if( zLi
2c630 6e 65 5b 68 5d 3d 3d 30 20 29 20 62 72 65 61 6b  ne[h]==0 ) break
2c640 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b  ;.    if( zLine[
2c650 68 5d 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e  h]=='\'' || zLin
2c660 65 5b 68 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20  e[h]=='"' ){.   
2c670 20 20 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a     int delim = z
2c680 4c 69 6e 65 5b 68 2b 2b 5d 3b 0a 20 20 20 20 20  Line[h++];.     
2c690 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d   azArg[nArg++] =
2c6a0 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20   &zLine[h];.    
2c6b0 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68    while( zLine[h
2c6c0 5d 20 26 26 20 7a 4c 69 6e 65 5b 68 5d 21 3d 64  ] && zLine[h]!=d
2c6d0 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  elim ){.        
2c6e0 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c  if( zLine[h]=='\
2c6f0 5c 27 20 26 26 20 64 65 6c 69 6d 3d 3d 27 22 27  \' && delim=='"'
2c700 20 26 26 20 7a 4c 69 6e 65 5b 68 2b 31 5d 21 3d   && zLine[h+1]!=
2c710 30 20 29 20 68 2b 2b 3b 0a 20 20 20 20 20 20 20  0 ) h++;.       
2c720 20 68 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   h++;.      }.  
2c730 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d      if( zLine[h]
2c740 3d 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20  ==delim ){.     
2c750 20 20 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20     zLine[h++] = 
2c760 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
2c770 20 69 66 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20   if( delim=='"' 
2c780 29 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c  ) resolve_backsl
2c790 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67  ashes(azArg[nArg
2c7a0 2d 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  -1]);.    }else{
2c7b0 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72  .      azArg[nAr
2c7c0 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d  g++] = &zLine[h]
2c7d0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  ;.      while( z
2c7e0 4c 69 6e 65 5b 68 5d 20 26 26 20 21 49 73 53 70  Line[h] && !IsSp
2c7f0 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b  ace(zLine[h]) ){
2c800 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66   h++; }.      if
2c810 28 20 7a 4c 69 6e 65 5b 68 5d 20 29 20 7a 4c 69  ( zLine[h] ) zLi
2c820 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20  ne[h++] = 0;.   
2c830 20 20 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73     resolve_backs
2c840 6c 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72  lashes(azArg[nAr
2c850 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  g-1]);.    }.  }
2c860 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..  /* Process t
2c870 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20  he input line.. 
2c880 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d   */.  if( nArg==
2c890 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a  0 ) return 0; /*
2c8a0 20 6e 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65   no tokens, no e
2c8b0 72 72 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74  rror */.  n = st
2c8c0 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29  rlen30(azArg[0])
2c8d0 3b 0a 20 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d  ;.  c = azArg[0]
2c8e0 5b 30 5d 3b 0a 20 20 63 6c 65 61 72 54 65 6d 70  [0];.  clearTemp
2c8f0 46 69 6c 65 28 70 29 3b 0a 0a 23 69 66 6e 64 65  File(p);..#ifnde
2c900 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2c910 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66  THORIZATION.  if
2c920 28 20 63 3d 3d 27 61 27 20 26 26 20 73 74 72 6e  ( c=='a' && strn
2c930 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61  cmp(azArg[0], "a
2c940 75 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  uth", n)==0 ){. 
2c950 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29     if( nArg!=2 )
2c960 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2c970 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2c980 65 3a 20 2e 61 75 74 68 20 4f 4e 7c 4f 46 46 5c  e: .auth ON|OFF\
2c990 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2c9a0 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
2c9b0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2c9c0 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
2c9d0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66  db(p, 0);.    if
2c9e0 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  ( booleanValue(a
2c9f0 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20  zArg[1]) ){.    
2ca00 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75    sqlite3_set_au
2ca10 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20  thorizer(p->db, 
2ca20 73 68 65 6c 6c 41 75 74 68 2c 20 70 29 3b 0a 20  shellAuth, p);. 
2ca30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ca40 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68  sqlite3_set_auth
2ca50 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 30 2c  orizer(p->db, 0,
2ca60 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
2ca70 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  se.#endif..#if !
2ca80 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2ca90 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2caa0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
2cab0 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 20  ITE_HAVE_ZLIB). 
2cac0 20 69 66 28 20 63 3d 3d 27 61 27 20 26 26 20 73   if( c=='a' && s
2cad0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2cae0 20 22 61 72 63 68 69 76 65 22 2c 20 6e 29 3d 3d   "archive", n)==
2caf0 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  0 ){.    open_db
2cb00 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  (p, 0);.    rc =
2cb10 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c   arDotCommand(p,
2cb20 20 30 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29   0, azArg, nArg)
2cb30 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
2cb40 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27 62 27 20  ..  if( (c=='b' 
2cb50 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
2cb60 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61  mp(azArg[0], "ba
2cb70 63 6b 75 70 22 2c 20 6e 29 3d 3d 30 29 0a 20 20  ckup", n)==0).  
2cb80 20 7c 7c 20 28 63 3d 3d 27 73 27 20 26 26 20 6e   || (c=='s' && n
2cb90 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
2cba0 7a 41 72 67 5b 30 5d 2c 20 22 73 61 76 65 22 2c  zArg[0], "save",
2cbb0 20 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20   n)==0).  ){.   
2cbc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
2cbd0 73 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20  stFile = 0;.    
2cbe0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
2cbf0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2cc00 20 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c   *pDest;.    sql
2cc10 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61  ite3_backup *pBa
2cc20 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6a 3b  ckup;.    int j;
2cc30 0a 20 20 20 20 69 6e 74 20 62 41 73 79 6e 63 20  .    int bAsync 
2cc40 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
2cc50 68 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20  har *zVfs = 0;. 
2cc60 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41     for(j=1; j<nA
2cc70 72 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; j++){.      
2cc80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
2cc90 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20  azArg[j];.      
2cca0 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b  if( z[0]=='-' ){
2ccb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 31  .        if( z[1
2ccc0 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]=='-' ) z++;.  
2ccd0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
2cce0 28 7a 2c 20 22 2d 61 70 70 65 6e 64 22 29 3d 3d  (z, "-append")==
2ccf0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
2cd00 56 66 73 20 3d 20 22 61 70 6e 64 76 66 73 22 3b  Vfs = "apndvfs";
2cd10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  .        }else. 
2cd20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
2cd30 70 28 7a 2c 20 22 2d 61 73 79 6e 63 22 29 3d 3d  p(z, "-async")==
2cd40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  0 ){.          b
2cd50 41 73 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  Async = 1;.     
2cd60 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20     }else.       
2cd70 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66   {.          utf
2cd80 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2cd90 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "unknown option
2cda0 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a  : %s\n", azArg[j
2cdb0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ]);.          re
2cdc0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
2cdd0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
2cde0 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29  ( zDestFile==0 )
2cdf0 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46  {.        zDestF
2ce00 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a  ile = azArg[j];.
2ce10 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2ce20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  zDb==0 ){.      
2ce30 20 20 7a 44 62 20 3d 20 7a 44 65 73 74 46 69 6c    zDb = zDestFil
2ce40 65 3b 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74  e;.        zDest
2ce50 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b  File = azArg[j];
2ce60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2ce70 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2ce80 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2ce90 20 2e 62 61 63 6b 75 70 20 3f 44 42 3f 20 3f 4f   .backup ?DB? ?O
2cea0 50 54 49 4f 4e 53 3f 20 46 49 4c 45 4e 41 4d 45  PTIONS? FILENAME
2ceb0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  \n");.        re
2cec0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
2ced0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44      }.    if( zD
2cee0 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  estFile==0 ){.  
2cef0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2cf00 74 64 65 72 72 2c 20 22 6d 69 73 73 69 6e 67 20  tderr, "missing 
2cf10 46 49 4c 45 4e 41 4d 45 20 61 72 67 75 6d 65 6e  FILENAME argumen
2cf20 74 20 6f 6e 20 2e 62 61 63 6b 75 70 5c 6e 22 29  t on .backup\n")
2cf30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2cf40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2cf50 7a 44 62 3d 3d 30 20 29 20 7a 44 62 20 3d 20 22  zDb==0 ) zDb = "
2cf60 6d 61 69 6e 22 3b 0a 20 20 20 20 72 63 20 3d 20  main";.    rc = 
2cf70 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
2cf80 7a 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73  zDestFile, &pDes
2cf90 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
2cfa0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
2cfb0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
2cfc0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
2cfd0 7a 56 66 73 29 3b 0a 20 20 20 20 69 66 28 20 72  zVfs);.    if( r
2cfe0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2cff0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2d000 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2d010 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
2d020 25 73 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46 69  %s\"\n", zDestFi
2d030 6c 65 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  le);.      close
2d040 5f 64 62 28 70 44 65 73 74 29 3b 0a 20 20 20 20  _db(pDest);.    
2d050 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2d060 7d 0a 20 20 20 20 69 66 28 20 62 41 73 79 6e 63  }.    if( bAsync
2d070 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2d080 33 5f 65 78 65 63 28 70 44 65 73 74 2c 20 22 50  3_exec(pDest, "P
2d090 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
2d0a0 73 3d 4f 46 46 3b 20 50 52 41 47 4d 41 20 6a 6f  s=OFF; PRAGMA jo
2d0b0 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 3b 22  urnal_mode=OFF;"
2d0c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d0d0 20 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a 20       0, 0, 0);. 
2d0e0 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62     }.    open_db
2d0f0 28 70 2c 20 30 29 3b 0a 20 20 20 20 70 42 61 63  (p, 0);.    pBac
2d100 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  kup = sqlite3_ba
2d110 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74 2c  ckup_init(pDest,
2d120 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62 2c 20   "main", p->db, 
2d130 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42  zDb);.    if( pB
2d140 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ackup==0 ){.    
2d150 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2d160 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
2d170 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
2d180 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20  msg(pDest));.   
2d190 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 44 65 73     close_db(pDes
2d1a0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
2d1b0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68   1;.    }.    wh
2d1c0 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69  ile(  (rc = sqli
2d1d0 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
2d1e0 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53  pBackup,100))==S
2d1f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20  QLITE_OK ){}.   
2d200 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
2d210 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b  finish(pBackup);
2d220 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2d230 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
2d240 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65    rc = 0;.    }e
2d250 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  lse{.      utf8_
2d260 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2d270 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
2d280 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
2d290 73 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  st));.      rc =
2d2a0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c   1;.    }.    cl
2d2b0 6f 73 65 5f 64 62 28 70 44 65 73 74 29 3b 0a 20  ose_db(pDest);. 
2d2c0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2d2d0 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='b' && n>=3 && 
2d2e0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2d2f0 2c 20 22 62 61 69 6c 22 2c 20 6e 29 3d 3d 30 20  , "bail", n)==0 
2d300 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
2d310 3d 32 20 29 7b 0a 20 20 20 20 20 20 62 61 69 6c  =2 ){.      bail
2d320 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 62 6f 6f 6c  _on_error = bool
2d330 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  eanValue(azArg[1
2d340 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
2d350 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2d360 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2d370 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66 5c 6e 22 29  .bail on|off\n")
2d380 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2d390 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2d3a0 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e   if( c=='b' && n
2d3b0 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
2d3c0 7a 41 72 67 5b 30 5d 2c 20 22 62 69 6e 61 72 79  zArg[0], "binary
2d3d0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2d3e0 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
2d3f0 20 20 20 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e       if( boolean
2d400 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20  Value(azArg[1]) 
2d410 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 42 69  ){.        setBi
2d420 6e 61 72 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c  naryMode(p->out,
2d430 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
2d440 7b 0a 20 20 20 20 20 20 20 20 73 65 74 54 65 78  {.        setTex
2d450 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  tMode(p->out, 1)
2d460 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2d470 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2d480 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2d490 73 61 67 65 3a 20 2e 62 69 6e 61 72 79 20 6f 6e  sage: .binary on
2d4a0 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |off\n");.      
2d4b0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
2d4c0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2d4d0 27 63 27 20 26 26 20 73 74 72 63 6d 70 28 61 7a  'c' && strcmp(az
2d4e0 41 72 67 5b 30 5d 2c 22 63 64 22 29 3d 3d 30 20  Arg[0],"cd")==0 
2d4f0 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
2d500 3d 32 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  =2 ){.#if define
2d510 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
2d520 69 6e 65 64 28 57 49 4e 33 32 29 0a 20 20 20 20  ined(WIN32).    
2d530 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73    wchar_t *z = s
2d540 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
2d550 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 61 7a 41  8_to_unicode(azA
2d560 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63  rg[1]);.      rc
2d570 20 3d 20 21 53 65 74 43 75 72 72 65 6e 74 44 69   = !SetCurrentDi
2d580 72 65 63 74 6f 72 79 57 28 7a 29 3b 0a 20 20 20  rectoryW(z);.   
2d590 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2d5a0 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  z);.#else.      
2d5b0 72 63 20 3d 20 63 68 64 69 72 28 61 7a 41 72 67  rc = chdir(azArg
2d5c0 5b 31 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  [1]);.#endif.   
2d5d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2d5e0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2d5f0 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74  (stderr, "Cannot
2d600 20 63 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63   change to direc
2d610 74 6f 72 79 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  tory \"%s\"\n", 
2d620 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
2d630 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2d640 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2d650 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2d660 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2d670 63 64 20 44 49 52 45 43 54 4f 52 59 5c 6e 22 29  cd DIRECTORY\n")
2d680 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2d690 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2d6a0 20 2f 2a 20 54 68 65 20 75 6e 64 6f 63 75 6d 65   /* The undocume
2d6b0 6e 74 65 64 20 22 2e 62 72 65 61 6b 70 6f 69 6e  nted ".breakpoin
2d6c0 74 22 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65  t" command cause
2d6d0 73 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20  s a call to the 
2d6e0 6e 6f 2d 6f 70 0a 20 20 2a 2a 20 72 6f 75 74 69  no-op.  ** routi
2d6f0 6e 65 20 6e 61 6d 65 64 20 74 65 73 74 5f 62 72  ne named test_br
2d700 65 61 6b 70 6f 69 6e 74 28 29 2e 0a 20 20 2a 2f  eakpoint()..  */
2d710 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26  .  if( c=='b' &&
2d720 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
2d730 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 72 65 61  (azArg[0], "brea
2d740 6b 70 6f 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29  kpoint", n)==0 )
2d750 7b 0a 20 20 20 20 74 65 73 74 5f 62 72 65 61 6b  {.    test_break
2d760 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 65 6c 73 65  point();.  }else
2d770 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26  ..  if( c=='c' &
2d780 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
2d790 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68 61  p(azArg[0], "cha
2d7a0 6e 67 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  nges", n)==0 ){.
2d7b0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
2d7c0 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43 6c  ){.      setOrCl
2d7d0 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  earFlag(p, SHFLG
2d7e0 5f 43 6f 75 6e 74 43 68 61 6e 67 65 73 2c 20 61  _CountChanges, a
2d7f0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
2d800 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2d810 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2d820 73 61 67 65 3a 20 2e 63 68 61 6e 67 65 73 20 6f  sage: .changes o
2d830 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20  n|off\n");.     
2d840 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
2d850 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 43 61 6e   }else..  /* Can
2d860 63 65 6c 20 6f 75 74 70 75 74 20 72 65 64 69 72  cel output redir
2d870 65 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 69 73  ection, if it is
2d880 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 28   currently set (
2d890 62 79 20 2e 74 65 73 74 63 61 73 65 29 0a 20 20  by .testcase).  
2d8a0 2a 2a 20 54 68 65 6e 20 72 65 61 64 20 74 68 65  ** Then read the
2d8b0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
2d8c0 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74  testcase-out.txt
2d8d0 20 66 69 6c 65 20 61 6e 64 20 63 6f 6d 70 61 72   file and compar
2d8e0 65 20 61 67 61 69 6e 73 74 0a 20 20 2a 2a 20 61  e against.  ** a
2d8f0 7a 41 72 67 5b 31 5d 2e 20 20 49 66 20 74 68 65  zArg[1].  If the
2d900 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 63  re are differenc
2d910 65 73 2c 20 72 65 70 6f 72 74 20 61 6e 20 65 72  es, report an er
2d920 72 6f 72 20 61 6e 64 20 65 78 69 74 2e 0a 20 20  ror and exit..  
2d930 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20  */.  if( c=='c' 
2d940 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
2d950 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68  mp(azArg[0], "ch
2d960 65 63 6b 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  eck", n)==0 ){. 
2d970 20 20 20 63 68 61 72 20 2a 7a 52 65 73 20 3d 20     char *zRes = 
2d980 30 3b 0a 20 20 20 20 6f 75 74 70 75 74 5f 72 65  0;.    output_re
2d990 73 65 74 28 70 29 3b 0a 20 20 20 20 69 66 28 20  set(p);.    if( 
2d9a0 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20  nArg!=2 ){.     
2d9b0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2d9c0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 68 65  rr, "Usage: .che
2d9d0 63 6b 20 47 4c 4f 42 2d 50 41 54 54 45 52 4e 5c  ck GLOB-PATTERN\
2d9e0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2d9f0 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
2da00 20 28 7a 52 65 73 20 3d 20 72 65 61 64 46 69 6c   (zRes = readFil
2da10 65 28 22 74 65 73 74 63 61 73 65 2d 6f 75 74 2e  e("testcase-out.
2da20 74 78 74 22 2c 20 30 29 29 3d 3d 30 20 29 7b 0a  txt", 0))==0 ){.
2da30 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2da40 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
2da50 20 63 61 6e 6e 6f 74 20 72 65 61 64 20 27 74 65   cannot read 'te
2da60 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c  stcase-out.txt'\
2da70 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2da80 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
2da90 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 61   testcase_glob(a
2daa0 7a 41 72 67 5b 31 5d 2c 7a 52 65 73 29 3d 3d 30  zArg[1],zRes)==0
2dab0 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
2dac0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20  rintf(stderr,.  
2dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2dae0 74 65 73 74 63 61 73 65 2d 25 73 20 46 41 49 4c  testcase-%s FAIL
2daf0 45 44 5c 6e 20 45 78 70 65 63 74 65 64 3a 20 5b  ED\n Expected: [
2db00 25 73 5d 5c 6e 20 20 20 20 20 20 47 6f 74 3a 20  %s]\n      Got: 
2db10 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20  [%s]\n",.       
2db20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 54 65            p->zTe
2db30 73 74 63 61 73 65 2c 20 61 7a 41 72 67 5b 31 5d  stcase, azArg[1]
2db40 2c 20 7a 52 65 73 29 3b 0a 20 20 20 20 20 20 72  , zRes);.      r
2db50 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
2db60 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
2db70 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 74 65 73  ntf(stdout, "tes
2db80 74 63 61 73 65 2d 25 73 20 6f 6b 5c 6e 22 2c 20  tcase-%s ok\n", 
2db90 70 2d 3e 7a 54 65 73 74 63 61 73 65 29 3b 0a 20  p->zTestcase);. 
2dba0 20 20 20 20 20 70 2d 3e 6e 43 68 65 63 6b 2b 2b       p->nCheck++
2dbb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2dbc0 74 65 33 5f 66 72 65 65 28 7a 52 65 73 29 3b 0a  te3_free(zRes);.
2dbd0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2dbe0 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70  =='c' && strncmp
2dbf0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 6c 6f 6e  (azArg[0], "clon
2dc00 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
2dc10 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
2dc20 20 20 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65        tryToClone
2dc30 28 70 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  (p, azArg[1]);. 
2dc40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2dc50 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2dc60 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 6c 6f 6e  r, "Usage: .clon
2dc70 65 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a  e FILENAME\n");.
2dc80 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2dc90 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
2dca0 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 31  f( c=='d' && n>1
2dcb0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2dcc0 67 5b 30 5d 2c 20 22 64 61 74 61 62 61 73 65 73  g[0], "databases
2dcd0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2dce0 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b  ShellState data;
2dcf0 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  .    char *zErrM
2dd00 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e  sg = 0;.    open
2dd10 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d  _db(p, 0);.    m
2dd20 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20  emcpy(&data, p, 
2dd30 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20  sizeof(data));. 
2dd40 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64     data.showHead
2dd50 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61  er = 0;.    data
2dd60 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f  .cMode = data.mo
2dd70 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a  de = MODE_List;.
2dd80 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2dd90 69 6e 74 66 28 73 69 7a 65 6f 66 28 64 61 74 61  intf(sizeof(data
2dda0 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 64  .colSeparator),d
2ddb0 61 74 61 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72  ata.colSeparator
2ddc0 2c 22 3a 20 22 29 3b 0a 20 20 20 20 64 61 74 61  ,": ");.    data
2ddd0 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 71  .cnt = 0;.    sq
2dde0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
2ddf0 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20  , "SELECT name, 
2de00 66 69 6c 65 20 46 52 4f 4d 20 70 72 61 67 6d 61  file FROM pragma
2de10 5f 64 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c  _database_list",
2de20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2de30 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74    callback, &dat
2de40 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  a, &zErrMsg);.  
2de50 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
2de60 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2de70 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
2de80 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
2de90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2dea0 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
2deb0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2dec0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
2ded0 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 3d  f( c=='d' && n>=
2dee0 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
2def0 72 67 5b 30 5d 2c 20 22 64 62 63 6f 6e 66 69 67  rg[0], "dbconfig
2df00 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2df10 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
2df20 75 63 74 20 44 62 43 6f 6e 66 69 67 43 68 6f 69  uct DbConfigChoi
2df30 63 65 73 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ces {.      cons
2df40 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
2df50 20 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20       int op;.   
2df60 20 7d 20 61 44 62 43 6f 6e 66 69 67 5b 5d 20 3d   } aDbConfig[] =
2df70 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 22 65 6e   {.        { "en
2df80 61 62 6c 65 5f 66 6b 65 79 22 2c 20 20 20 20 20  able_fkey",     
2df90 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
2dfa0 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 20 20 20 20  _ENABLE_FKEY    
2dfb0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2dfc0 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 74 72 69     { "enable_tri
2dfd0 67 67 65 72 22 2c 20 20 20 53 51 4c 49 54 45 5f  gger",   SQLITE_
2dfe0 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
2dff0 54 52 49 47 47 45 52 20 20 20 20 20 20 20 20 20  TRIGGER         
2e000 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 66 74  },.        { "ft
2e010 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 22 2c 20 20  s3_tokenizer",  
2e020 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
2e030 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b  _ENABLE_FTS3_TOK
2e040 45 4e 49 5a 45 52 20 20 7d 2c 0a 20 20 20 20 20  ENIZER  },.     
2e050 20 20 20 7b 20 22 6c 6f 61 64 5f 65 78 74 65 6e     { "load_exten
2e060 73 69 6f 6e 22 2c 20 20 20 53 51 4c 49 54 45 5f  sion",   SQLITE_
2e070 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
2e080 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 20  LOAD_EXTENSION  
2e090 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 6e 6f  },.        { "no
2e0a0 5f 63 6b 70 74 5f 6f 6e 5f 63 6c 6f 73 65 22 2c  _ckpt_on_close",
2e0b0 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
2e0c0 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53  _NO_CKPT_ON_CLOS
2e0d0 45 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  E       },.     
2e0e0 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 71 70 73     { "enable_qps
2e0f0 67 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f  g",      SQLITE_
2e100 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
2e110 51 50 53 47 20 20 20 20 20 20 20 20 20 20 20 20  QPSG            
2e120 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 74 72  },.        { "tr
2e130 69 67 67 65 72 5f 65 71 70 22 2c 20 20 20 20 20  igger_eqp",     
2e140 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
2e150 5f 54 52 49 47 47 45 52 5f 45 51 50 20 20 20 20  _TRIGGER_EQP    
2e160 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2e170 20 20 20 7b 20 22 72 65 73 65 74 5f 64 61 74 61     { "reset_data
2e180 62 61 73 65 22 2c 20 20 20 53 51 4c 49 54 45 5f  base",   SQLITE_
2e190 44 42 43 4f 4e 46 49 47 5f 52 45 53 45 54 5f 44  DBCONFIG_RESET_D
2e1a0 41 54 41 42 41 53 45 20 20 20 20 20 20 20 20 20  ATABASE         
2e1b0 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 64 65  },.        { "de
2e1c0 66 65 6e 73 69 76 65 22 2c 20 20 20 20 20 20 20  fensive",       
2e1d0 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
2e1e0 5f 44 45 46 45 4e 53 49 56 45 20 20 20 20 20 20  _DEFENSIVE      
2e1f0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7d          },.    }
2e200 3b 0a 20 20 20 20 69 6e 74 20 69 69 2c 20 76 3b  ;.    int ii, v;
2e210 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
2e220 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  0);.    for(ii=0
2e230 3b 20 69 69 3c 41 72 72 61 79 53 69 7a 65 28 61  ; ii<ArraySize(a
2e240 44 62 43 6f 6e 66 69 67 29 3b 20 69 69 2b 2b 29  DbConfig); ii++)
2e250 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  {.      if( nArg
2e260 3e 31 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41  >1 && strcmp(azA
2e270 72 67 5b 31 5d 2c 20 61 44 62 43 6f 6e 66 69 67  rg[1], aDbConfig
2e280 5b 69 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29  [ii].zName)!=0 )
2e290 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2e2a0 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a   if( nArg>=3 ){.
2e2b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2e2c0 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c  db_config(p->db,
2e2d0 20 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 6f   aDbConfig[ii].o
2e2e0 70 2c 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28  p, booleanValue(
2e2f0 61 7a 41 72 67 5b 32 5d 29 2c 20 30 29 3b 0a 20  azArg[2]), 0);. 
2e300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2e310 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70  ite3_db_config(p
2e320 2d 3e 64 62 2c 20 61 44 62 43 6f 6e 66 69 67 5b  ->db, aDbConfig[
2e330 69 69 5d 2e 6f 70 2c 20 2d 31 2c 20 26 76 29 3b  ii].op, -1, &v);
2e340 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2e350 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 38 73  tf(p->out, "%18s
2e360 20 25 73 5c 6e 22 2c 20 61 44 62 43 6f 6e 66 69   %s\n", aDbConfi
2e370 67 5b 69 69 5d 2e 7a 4e 61 6d 65 2c 20 76 20 3f  g[ii].zName, v ?
2e380 20 22 6f 6e 22 20 3a 20 22 6f 66 66 22 29 3b 0a   "on" : "off");.
2e390 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31        if( nArg>1
2e3a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
2e3b0 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26      if( nArg>1 &
2e3c0 26 20 69 69 3d 3d 41 72 72 61 79 53 69 7a 65 28  & ii==ArraySize(
2e3d0 61 44 62 43 6f 6e 66 69 67 29 20 29 7b 0a 20 20  aDbConfig) ){.  
2e3e0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2e3f0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2e400 75 6e 6b 6e 6f 77 6e 20 64 62 63 6f 6e 66 69 67  unknown dbconfig
2e410 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
2e420 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 75 74 66  g[1]);.      utf
2e430 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2e440 20 22 45 6e 74 65 72 20 5c 22 2e 64 62 63 6f 6e   "Enter \".dbcon
2e450 66 69 67 5c 22 20 77 69 74 68 20 6e 6f 20 61 72  fig\" with no ar
2e460 67 75 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c 69  guments for a li
2e470 73 74 5c 6e 22 29 3b 0a 20 20 20 20 7d 20 20 20  st\n");.    }   
2e480 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2e490 63 3d 3d 27 64 27 20 26 26 20 6e 3e 3d 33 20 26  c=='d' && n>=3 &
2e4a0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2e4b0 30 5d 2c 20 22 64 62 69 6e 66 6f 22 2c 20 6e 29  0], "dbinfo", n)
2e4c0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
2e4d0 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d  shell_dbinfo_com
2e4e0 6d 61 6e 64 28 70 2c 20 6e 41 72 67 2c 20 61 7a  mand(p, nArg, az
2e4f0 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  Arg);.  }else.. 
2e500 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73   if( c=='d' && s
2e510 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2e520 20 22 64 75 6d 70 22 2c 20 6e 29 3d 3d 30 20 29   "dump", n)==0 )
2e530 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2e540 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 0a 20 20 20   *zLike = 0;.   
2e550 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
2e560 73 61 76 65 64 53 68 6f 77 48 65 61 64 65 72 20  savedShowHeader 
2e570 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b  = p->showHeader;
2e580 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64 53 68  .    int savedSh
2e590 65 6c 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 68  ellFlags = p->sh
2e5a0 65 6c 6c 46 6c 67 73 3b 0a 20 20 20 20 53 68 65  ellFlgs;.    She
2e5b0 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53  llClearFlag(p, S
2e5c0 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77  HFLG_PreserveRow
2e5d0 69 64 7c 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65  id|SHFLG_Newline
2e5e0 73 7c 53 48 46 4c 47 5f 45 63 68 6f 29 3b 0a 20  s|SHFLG_Echo);. 
2e5f0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41     for(i=1; i<nA
2e600 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
2e610 69 66 28 20 61 7a 41 72 67 5b 69 5d 5b 30 5d 3d  if( azArg[i][0]=
2e620 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
2e630 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
2e640 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20 20 20 20  azArg[i]+1;.    
2e650 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
2e660 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) z++;.       
2e670 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 70   if( strcmp(z,"p
2e680 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 22 29  reserve-rowids")
2e690 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ==0 ){.#ifdef SQ
2e6a0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2e6b0 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 20  LTABLE.         
2e6c0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2e6d0 72 72 2c 20 22 54 68 65 20 2d 2d 70 72 65 73 65  rr, "The --prese
2e6e0 72 76 65 2d 72 6f 77 69 64 73 20 6f 70 74 69 6f  rve-rowids optio
2e6f0 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69  n is not compati
2e700 62 6c 65 22 0a 20 20 20 20 20 20 20 20 20 20 20  ble".           
2e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e720 20 20 22 20 77 69 74 68 20 53 51 4c 49 54 45 5f    " with SQLITE_
2e730 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2e740 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  E\n");.         
2e750 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
2e760 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
2e770 6d 61 6e 64 5f 65 78 69 74 3b 0a 23 65 6c 73 65  mand_exit;.#else
2e780 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c  .          Shell
2e790 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  SetFlag(p, SHFLG
2e7a0 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 29 3b  _PreserveRowid);
2e7b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
2e7c0 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  }else.        if
2e7d0 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e 65 77 6c  ( strcmp(z,"newl
2e7e0 69 6e 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ines")==0 ){.   
2e7f0 20 20 20 20 20 20 20 53 68 65 6c 6c 53 65 74 46         ShellSetF
2e800 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77  lag(p, SHFLG_New
2e810 6c 69 6e 65 73 29 3b 0a 20 20 20 20 20 20 20 20  lines);.        
2e820 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a  }else.        {.
2e830 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
2e840 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e  intf(stderr, "Un
2e850 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25  known option \"%
2e860 73 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d 70 5c 22  s\" on \".dump\"
2e870 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  \n", azArg[i]);.
2e880 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
2e890 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2e8a0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2e8b0 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  it;.        }.  
2e8c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c      }else if( zL
2e8d0 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ike ){.        r
2e8e0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2e8f0 2c 20 22 55 73 61 67 65 3a 20 2e 64 75 6d 70 20  , "Usage: .dump 
2e900 3f 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f 77 69  ?--preserve-rowi
2e910 64 73 3f 20 22 0a 20 20 20 20 20 20 20 20 20 20  ds? ".          
2e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e930 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f 20 3f   "?--newlines? ?
2e940 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22  LIKE-PATTERN?\n"
2e950 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2e960 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
2e970 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
2e980 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
2e990 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d 20          zLike = 
2e9a0 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
2e9b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  }.    }.    open
2e9c0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 2f  _db(p, 0);.    /
2e9d0 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62  * When playing b
2e9e0 61 63 6b 20 61 20 22 64 75 6d 70 22 2c 20 74 68  ack a "dump", th
2e9f0 65 20 63 6f 6e 74 65 6e 74 20 6d 69 67 68 74 20  e content might 
2ea00 61 70 70 65 61 72 20 69 6e 20 61 6e 20 6f 72 64  appear in an ord
2ea10 65 72 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20  er.    ** which 
2ea20 63 61 75 73 65 73 20 69 6d 6d 65 64 69 61 74 65  causes immediate
2ea30 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
2ea40 73 74 72 61 69 6e 74 73 20 74 6f 20 62 65 20 76  straints to be v
2ea50 69 6f 6c 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  iolated..    ** 
2ea60 53 6f 20 64 69 73 61 62 6c 65 20 66 6f 72 65 69  So disable forei
2ea70 67 6e 2d 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn-key constrain
2ea80 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 74 6f  t enforcement to
2ea90 20 70 72 65 76 65 6e 74 20 70 72 6f 62 6c 65 6d   prevent problem
2eaa0 73 2e 20 2a 2f 0a 20 20 20 20 72 61 77 5f 70 72  s. */.    raw_pr
2eab0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52  intf(p->out, "PR
2eac0 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
2ead0 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20  s=OFF;\n");.    
2eae0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
2eaf0 74 2c 20 22 42 45 47 49 4e 20 54 52 41 4e 53 41  t, "BEGIN TRANSA
2eb00 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20  CTION;\n");.    
2eb10 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d  p->writableSchem
2eb20 61 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 68  a = 0;.    p->sh
2eb30 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  owHeader = 0;.  
2eb40 20 20 2f 2a 20 53 65 74 20 77 72 69 74 61 62 6c    /* Set writabl
2eb50 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 73 69 6e 63  e_schema=ON sinc
2eb60 65 20 64 6f 69 6e 67 20 73 6f 20 66 6f 72 63 65  e doing so force
2eb70 73 20 53 51 4c 69 74 65 20 74 6f 20 69 6e 69 74  s SQLite to init
2eb80 69 61 6c 69 7a 65 0a 20 20 20 20 2a 2a 20 61 73  ialize.    ** as
2eb90 20 6d 75 63 68 20 6f 66 20 74 68 65 20 73 63 68   much of the sch
2eba0 65 6d 61 20 61 73 20 69 74 20 63 61 6e 20 65 76  ema as it can ev
2ebb0 65 6e 20 69 66 20 74 68 65 20 73 71 6c 69 74 65  en if the sqlite
2ebc0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 69 73  _master table is
2ebd0 0a 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 2e  .    ** corrupt.
2ebe0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
2ebf0 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56  exec(p->db, "SAV
2ec00 45 50 4f 49 4e 54 20 64 75 6d 70 3b 20 50 52 41  EPOINT dump; PRA
2ec10 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
2ec20 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20 30  ema=ON", 0, 0, 0
2ec30 29 3b 0a 20 20 20 20 70 2d 3e 6e 45 72 72 20 3d  );.    p->nErr =
2ec40 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6b   0;.    if( zLik
2ec50 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 75  e==0 ){.      ru
2ec60 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75  n_schema_dump_qu
2ec70 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22  ery(p,.        "
2ec80 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70  SELECT name, typ
2ec90 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
2eca0 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
2ecb0 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
2ecc0 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65  OT NULL AND type
2ecd0 3d 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61  =='table' AND na
2ece0 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73 65 71 75  me!='sqlite_sequ
2ecf0 65 6e 63 65 27 22 0a 20 20 20 20 20 20 29 3b 0a  ence'".      );.
2ed00 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61        run_schema
2ed10 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20  _dump_query(p,. 
2ed20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
2ed30 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46  ame, type, sql F
2ed40 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
2ed50 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
2ed60 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c 69 74 65  RE name=='sqlite
2ed70 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20  _sequence'".    
2ed80 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74    );.      run_t
2ed90 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28  able_dump_query(
2eda0 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  p,.        "SELE
2edb0 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  CT sql FROM sqli
2edc0 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
2edd0 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
2ede0 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65  OT NULL AND type
2edf0 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72   IN ('index','tr
2ee00 69 67 67 65 72 27 2c 27 76 69 65 77 27 29 22 2c  igger','view')",
2ee10 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
2ee20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
2ee30 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20 20 7a  r *zSql;.      z
2ee40 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
2ee50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22  rintf(.        "
2ee60 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70  SELECT name, typ
2ee70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
2ee80 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
2ee90 20 20 20 20 22 57 48 45 52 45 20 74 62 6c 5f 6e      "WHERE tbl_n
2eea0 61 6d 65 20 4c 49 4b 45 20 25 51 20 41 4e 44 20  ame LIKE %Q AND 
2eeb0 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 22 0a 20  type=='table'". 
2eec0 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 73 71         "  AND sq
2eed0 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 7a 4c 69  l NOT NULL", zLi
2eee0 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73  ke);.      run_s
2eef0 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79  chema_dump_query
2ef00 28 70 2c 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  (p,zSql);.      
2ef10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
2ef20 6c 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  l);.      zSql =
2ef30 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2ef40 28 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  (.        "SELEC
2ef50 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  T sql FROM sqlit
2ef60 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
2ef70 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f     "WHERE sql NO
2ef80 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20  T NULL".        
2ef90 22 20 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28  "  AND type IN (
2efa0 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65 72  'index','trigger
2efb0 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20 20  ','view')".     
2efc0 20 20 20 22 20 20 41 4e 44 20 74 62 6c 5f 6e 61     "  AND tbl_na
2efd0 6d 65 20 4c 49 4b 45 20 25 51 22 2c 20 7a 4c 69  me LIKE %Q", zLi
2efe0 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74  ke);.      run_t
2eff0 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28  able_dump_query(
2f000 70 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 20  p, zSql, 0);.   
2f010 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2f020 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
2f030 20 69 66 28 20 70 2d 3e 77 72 69 74 61 62 6c 65   if( p->writable
2f040 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
2f050 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
2f060 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  t, "PRAGMA writa
2f070 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 5c  ble_schema=OFF;\
2f080 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72  n");.      p->wr
2f090 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30  itableSchema = 0
2f0a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2f0b0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
2f0c0 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
2f0d0 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30  _schema=OFF;", 0
2f0e0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
2f0f0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
2f100 20 22 52 45 4c 45 41 53 45 20 64 75 6d 70 3b 22   "RELEASE dump;"
2f110 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
2f120 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
2f130 74 2c 20 70 2d 3e 6e 45 72 72 20 3f 20 22 52 4f  t, p->nErr ? "RO
2f140 4c 4c 42 41 43 4b 3b 20 2d 2d 20 64 75 65 20 74  LLBACK; -- due t
2f150 6f 20 65 72 72 6f 72 73 5c 6e 22 20 3a 20 22 43  o errors\n" : "C
2f160 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 20 20  OMMIT;\n");.    
2f170 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  p->showHeader = 
2f180 73 61 76 65 64 53 68 6f 77 48 65 61 64 65 72 3b  savedShowHeader;
2f190 0a 20 20 20 20 70 2d 3e 73 68 65 6c 6c 46 6c 67  .    p->shellFlg
2f1a0 73 20 3d 20 73 61 76 65 64 53 68 65 6c 6c 46 6c  s = savedShellFl
2f1b0 61 67 73 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  ags;.  }else..  
2f1c0 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
2f1d0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2f1e0 22 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b  "echo", n)==0 ){
2f1f0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
2f200 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43   ){.      setOrC
2f210 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c  learFlag(p, SHFL
2f220 47 5f 45 63 68 6f 2c 20 61 7a 41 72 67 5b 31 5d  G_Echo, azArg[1]
2f230 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2f240 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2f250 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2f260 65 63 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  echo on|off\n");
2f270 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2f280 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
2f290 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
2f2a0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2f2b0 22 65 71 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  "eqp", n)==0 ){.
2f2c0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
2f2d0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  ){.      p->auto
2f2e0 45 51 50 74 65 73 74 20 3d 20 30 3b 0a 20 20 20  EQPtest = 0;.   
2f2f0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
2f300 41 72 67 5b 31 5d 2c 22 66 75 6c 6c 22 29 3d 3d  Arg[1],"full")==
2f310 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
2f320 61 75 74 6f 45 51 50 20 3d 20 41 55 54 4f 45 51  autoEQP = AUTOEQ
2f330 50 5f 66 75 6c 6c 3b 0a 20 20 20 20 20 20 7d 65  P_full;.      }e
2f340 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
2f350 7a 41 72 67 5b 31 5d 2c 22 74 72 69 67 67 65 72  zArg[1],"trigger
2f360 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
2f370 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41 55   p->autoEQP = AU
2f380 54 4f 45 51 50 5f 74 72 69 67 67 65 72 3b 0a 20  TOEQP_trigger;. 
2f390 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
2f3a0 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
2f3b0 74 65 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  test")==0 ){.   
2f3c0 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20       p->autoEQP 
2f3d0 3d 20 41 55 54 4f 45 51 50 5f 6f 6e 3b 0a 20 20  = AUTOEQP_on;.  
2f3e0 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50        p->autoEQP
2f3f0 74 65 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  test = 1;.      
2f400 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2f410 2d 3e 61 75 74 6f 45 51 50 20 3d 20 28 75 38 29  ->autoEQP = (u8)
2f420 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
2f430 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  rg[1]);.      }.
2f440 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f450 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2f460 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65 71 70  rr, "Usage: .eqp
2f470 20 6f 66 66 7c 6f 6e 7c 74 72 69 67 67 65 72 7c   off|on|trigger|
2f480 66 75 6c 6c 5c 6e 22 29 3b 0a 20 20 20 20 20 20  full\n");.      
2f490 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
2f4a0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2f4b0 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'e' && strncmp(a
2f4c0 7a 41 72 67 5b 30 5d 2c 20 22 65 78 69 74 22 2c  zArg[0], "exit",
2f4d0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
2f4e0 28 20 6e 41 72 67 3e 31 20 26 26 20 28 72 63 20  ( nArg>1 && (rc 
2f4f0 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61  = (int)integerVa
2f500 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 29 21 3d  lue(azArg[1]))!=
2f510 30 20 29 20 65 78 69 74 28 72 63 29 3b 0a 20 20  0 ) exit(rc);.  
2f520 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73    rc = 2;.  }els
2f530 65 0a 0a 20 20 2f 2a 20 54 68 65 20 22 2e 65 78  e..  /* The ".ex
2f540 70 6c 61 69 6e 22 20 63 6f 6d 6d 61 6e 64 20 69  plain" command i
2f550 73 20 61 75 74 6f 6d 61 74 69 63 20 6e 6f 77 2e  s automatic now.
2f560 20 20 49 74 20 69 73 20 6c 61 72 67 65 6c 79 20    It is largely 
2f570 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 74 0a 20  pointless.  It. 
2f580 20 2a 2a 20 72 65 74 61 69 6e 65 64 20 70 75 72   ** retained pur
2f590 65 6c 79 20 66 6f 72 20 62 61 63 6b 77 61 72 64  ely for backward
2f5a0 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
2f5b0 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20  */.  if( c=='e' 
2f5c0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2f5d0 5b 30 5d 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20  [0], "explain", 
2f5e0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  n)==0 ){.    int
2f5f0 20 76 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66   val = 1;.    if
2f600 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20  ( nArg>=2 ){.   
2f610 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
2f620 41 72 67 5b 31 5d 2c 22 61 75 74 6f 22 29 3d 3d  Arg[1],"auto")==
2f630 30 20 29 7b 0a 20 20 20 20 20 20 20 20 76 61 6c  0 ){.        val
2f640 20 3d 20 39 39 3b 0a 20 20 20 20 20 20 7d 65 6c   = 99;.      }el
2f650 73 65 7b 0a 20 20 20 20 20 20 20 20 76 61 6c 20  se{.        val 
2f660 3d 20 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28  =  booleanValue(
2f670 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
2f680 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2f690 20 76 61 6c 3d 3d 31 20 26 26 20 70 2d 3e 6d 6f   val==1 && p->mo
2f6a0 64 65 21 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  de!=MODE_Explain
2f6b0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 6f 72   ){.      p->nor
2f6c0 6d 61 6c 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64  malMode = p->mod
2f6d0 65 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  e;.      p->mode
2f6e0 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b   = MODE_Explain;
2f6f0 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78  .      p->autoEx
2f700 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  plain = 0;.    }
2f710 65 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d 30 20  else if( val==0 
2f720 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
2f730 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61  mode==MODE_Expla
2f740 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d 20 70  in ) p->mode = p
2f750 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20 20  ->normalMode;.  
2f760 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61      p->autoExpla
2f770 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  in = 0;.    }els
2f780 65 20 69 66 28 20 76 61 6c 3d 3d 39 39 20 29 7b  e if( val==99 ){
2f790 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f  .      if( p->mo
2f7a0 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  de==MODE_Explain
2f7b0 20 29 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e   ) p->mode = p->
2f7c0 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20 20 20 20  normalMode;.    
2f7d0 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e    p->autoExplain
2f7e0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
2f7f0 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  lse..#ifndef SQL
2f800 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2f810 54 41 42 4c 45 0a 20 20 69 66 28 20 63 3d 3d 27  TABLE.  if( c=='
2f820 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  e' && strncmp(az
2f830 41 72 67 5b 30 5d 2c 20 22 65 78 70 65 72 74 22  Arg[0], "expert"
2f840 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  , n)==0 ){.    o
2f850 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
2f860 20 20 65 78 70 65 72 74 44 6f 74 43 6f 6d 6d 61    expertDotComma
2f870 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72  nd(p, azArg, nAr
2f880 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  g);.  }else.#end
2f890 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 66 27  if..  if( c=='f'
2f8a0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2f8b0 67 5b 30 5d 2c 20 22 66 75 6c 6c 73 63 68 65 6d  g[0], "fullschem
2f8c0 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  a", n)==0 ){.   
2f8d0 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61   ShellState data
2f8e0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  ;.    char *zErr
2f8f0 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Msg = 0;.    int
2f900 20 64 6f 53 74 61 74 73 20 3d 20 30 3b 0a 20 20   doStats = 0;.  
2f910 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20    memcpy(&data, 
2f920 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29  p, sizeof(data))
2f930 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48  ;.    data.showH
2f940 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64  eader = 0;.    d
2f950 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
2f960 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d  .mode = MODE_Sem
2f970 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  i;.    if( nArg=
2f980 3d 32 20 26 26 20 6f 70 74 69 6f 6e 4d 61 74 63  =2 && optionMatc
2f990 68 28 61 7a 41 72 67 5b 31 5d 2c 20 22 69 6e 64  h(azArg[1], "ind
2f9a0 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 64  ent") ){.      d
2f9b0 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
2f9c0 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 50 72 65  .mode = MODE_Pre
2f9d0 74 74 79 3b 0a 20 20 20 20 20 20 6e 41 72 67 20  tty;.      nArg 
2f9e0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
2f9f0 66 28 20 6e 41 72 67 21 3d 31 20 29 7b 0a 20 20  f( nArg!=1 ){.  
2fa00 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2fa10 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2fa20 66 75 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e  fullschema ?--in
2fa30 64 65 6e 74 3f 5c 6e 22 29 3b 0a 20 20 20 20 20  dent?\n");.     
2fa40 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
2fa50 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2fa60 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
2fa70 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
2fa80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2fa90 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20  _exec(p->db,.   
2faa0 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20      "SELECT sql 
2fab0 46 52 4f 4d 22 0a 20 20 20 20 20 20 20 22 20 20  FROM".       "  
2fac0 28 53 45 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c  (SELECT sql sql,
2fad0 20 74 79 70 65 20 74 79 70 65 2c 20 74 62 6c 5f   type type, tbl_
2fae0 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e  name tbl_name, n
2faf0 61 6d 65 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20  ame name, rowid 
2fb00 78 22 0a 20 20 20 20 20 20 20 22 20 20 20 20 20  x".       "     
2fb10 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
2fb20 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20  er UNION ALL".  
2fb30 20 20 20 20 20 22 20 20 20 53 45 4c 45 43 54 20       "   SELECT 
2fb40 73 71 6c 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e  sql, type, tbl_n
2fb50 61 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64  ame, name, rowid
2fb60 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d   FROM sqlite_tem
2fb70 70 5f 6d 61 73 74 65 72 29 20 22 0a 20 20 20 20  p_master) ".    
2fb80 20 20 20 22 57 48 45 52 45 20 74 79 70 65 21 3d     "WHERE type!=
2fb90 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 4e  'meta' AND sql N
2fba0 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20  OTNULL AND name 
2fbb0 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65  NOT LIKE 'sqlite
2fbc0 5f 25 27 20 22 0a 20 20 20 20 20 20 20 22 4f 52  _%' ".       "OR
2fbd0 44 45 52 20 42 59 20 72 6f 77 69 64 22 2c 0a 20  DER BY rowid",. 
2fbe0 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20        callback, 
2fbf0 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a  &data, &zErrMsg.
2fc00 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72      );.    if( r
2fc10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2fc20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
2fc30 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 20  mt *pStmt;.     
2fc40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
2fc50 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a  epare_v2(p->db,.
2fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2fc70 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
2fc80 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
2fc90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2fca0 22 20 57 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f  " WHERE name GLO
2fcb0 42 20 27 73 71 6c 69 74 65 5f 73 74 61 74 5b 31  B 'sqlite_stat[1
2fcc0 33 34 5d 27 22 2c 0a 20 20 20 20 20 20 20 20 20  34]'",.         
2fcd0 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74        -1, &pStmt
2fce0 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 6f 53 74  , 0);.      doSt
2fcf0 61 74 73 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  ats = sqlite3_st
2fd00 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
2fd10 45 5f 52 4f 57 3b 0a 20 20 20 20 20 20 73 71 6c  E_ROW;.      sql
2fd20 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
2fd30 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tmt);.    }.    
2fd40 69 66 28 20 64 6f 53 74 61 74 73 3d 3d 30 20 29  if( doStats==0 )
2fd50 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2fd60 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 20 4e  tf(p->out, "/* N
2fd70 6f 20 53 54 41 54 20 74 61 62 6c 65 73 20 61 76  o STAT tables av
2fd80 61 69 6c 61 62 6c 65 20 2a 2f 5c 6e 22 29 3b 0a  ailable */\n");.
2fd90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2fda0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
2fdb0 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c  ut, "ANALYZE sql
2fdc0 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b  ite_master;\n");
2fdd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65  .      sqlite3_e
2fde0 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45  xec(p->db, "SELE
2fdf0 43 54 20 27 41 4e 41 4c 59 5a 45 20 73 71 6c 69  CT 'ANALYZE sqli
2fe00 74 65 5f 6d 61 73 74 65 72 27 22 2c 0a 20 20 20  te_master'",.   
2fe10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
2fe30 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
2fe40 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64    data.cMode = d
2fe50 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f  ata.mode = MODE_
2fe60 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 64 61  Insert;.      da
2fe70 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  ta.zDestTable = 
2fe80 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 3b 0a  "sqlite_stat1";.
2fe90 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63        shell_exec
2fea0 28 26 64 61 74 61 2c 20 22 53 45 4c 45 43 54 20  (&data, "SELECT 
2feb0 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  * FROM sqlite_st
2fec0 61 74 31 22 2c 20 26 7a 45 72 72 4d 73 67 29 3b  at1", &zErrMsg);
2fed0 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44 65 73  .      data.zDes
2fee0 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69 74 65  tTable = "sqlite
2fef0 5f 73 74 61 74 33 22 3b 0a 20 20 20 20 20 20 73  _stat3";.      s
2ff00 68 65 6c 6c 5f 65 78 65 63 28 26 64 61 74 61 2c  hell_exec(&data,
2ff10 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
2ff20 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 20 26  sqlite_stat3", &
2ff30 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
2ff40 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20  data.zDestTable 
2ff50 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22  = "sqlite_stat4"
2ff60 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78  ;.      shell_ex
2ff70 65 63 28 26 64 61 74 61 2c 20 22 53 45 4c 45 43  ec(&data, "SELEC
2ff80 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
2ff90 73 74 61 74 34 22 2c 20 26 7a 45 72 72 4d 73 67  stat4", &zErrMsg
2ffa0 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
2ffb0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41  ntf(p->out, "ANA
2ffc0 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74  LYZE sqlite_mast
2ffd0 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20  er;\n");.    }. 
2ffe0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2fff0 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='h' && strncmp(
30000 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 61 64 65  azArg[0], "heade
30010 72 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  rs", n)==0 ){.  
30020 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
30030 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f 77 48 65  .      p->showHe
30040 61 64 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61  ader = booleanVa
30050 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
30060 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30070 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
30080 72 2c 20 22 55 73 61 67 65 3a 20 2e 68 65 61 64  r, "Usage: .head
30090 65 72 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a  ers on|off\n");.
300a0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
300b0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
300c0 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72  f( c=='h' && str
300d0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
300e0 68 65 6c 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  help", n)==0 ){.
300f0 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 32 20      if( nArg>=2 
30100 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 68 6f  ){.      n = sho
30110 77 48 65 6c 70 28 70 2d 3e 6f 75 74 2c 20 61 7a  wHelp(p->out, az
30120 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69  Arg[1]);.      i
30130 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
30140 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
30150 2d 3e 6f 75 74 2c 20 22 4e 6f 74 68 69 6e 67 20  ->out, "Nothing 
30160 6d 61 74 63 68 65 73 20 27 25 73 27 5c 6e 22 2c  matches '%s'\n",
30170 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
30180 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
30190 20 20 20 20 20 73 68 6f 77 48 65 6c 70 28 70 2d       showHelp(p-
301a0 3e 6f 75 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  >out, 0);.    }.
301b0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
301c0 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70  =='i' && strncmp
301d0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f  (azArg[0], "impo
301e0 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  rt", n)==0 ){.  
301f0 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20    char *zTable; 
30200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30210 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74   Insert data int
30220 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  o this table */.
30230 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b      char *zFile;
30240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30250 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
30260 74 6f 20 65 78 74 72 61 20 63 6f 6e 74 65 6e 74  to extra content
30270 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 73 71 6c   from */.    sql
30280 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
30290 20 3d 20 4e 55 4c 4c 3b 20 2f 2a 20 41 20 73 74   = NULL; /* A st
302a0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
302b0 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
302c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
302d0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
302e0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
302f0 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20      int nByte;  
30300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30310 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
30320 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74 72  es in an SQL str
30330 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ing */.    int i
30340 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
30350 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
30360 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 69  ounters */.    i
30370 6e 74 20 6e 65 65 64 43 6f 6d 6d 69 74 3b 20 20  nt needCommit;  
30380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
30390 75 65 20 74 6f 20 43 4f 4d 4d 49 54 20 6f 72 20  ue to COMMIT or 
303a0 52 4f 4c 4c 42 41 43 4b 20 61 74 20 65 6e 64 20  ROLLBACK at end 
303b0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b  */.    int nSep;
303c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
303d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
303e0 62 79 74 65 73 20 69 6e 20 70 2d 3e 63 6f 6c 53  bytes in p->colS
303f0 65 70 61 72 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20  eparator[] */.  
30400 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20    char *zSql;   
30410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30420 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   An SQL statemen
30430 74 20 2a 2f 0a 20 20 20 20 49 6d 70 6f 72 74 43  t */.    ImportC
30440 74 78 20 73 43 74 78 3b 20 20 20 20 20 20 20 20  tx sCtx;        
30450 20 20 20 20 20 2f 2a 20 52 65 61 64 65 72 20 63       /* Reader c
30460 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 63 68  ontext */.    ch
30470 61 72 20 2a 28 53 51 4c 49 54 45 5f 43 44 45 43  ar *(SQLITE_CDEC
30480 4c 20 2a 78 52 65 61 64 29 28 49 6d 70 6f 72 74  L *xRead)(Import
30490 43 74 78 2a 29 3b 20 2f 2a 20 46 75 6e 63 20 74  Ctx*); /* Func t
304a0 6f 20 72 65 61 64 20 6f 6e 65 20 76 61 6c 75 65  o read one value
304b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28 53 51 4c   */.    int (SQL
304c0 49 54 45 5f 43 44 45 43 4c 20 2a 78 43 6c 6f 73  ITE_CDECL *xClos
304d0 65 72 29 28 46 49 4c 45 2a 29 3b 20 20 20 20 20  er)(FILE*);     
304e0 20 2f 2a 20 46 75 6e 63 20 74 6f 20 63 6c 6f 73   /* Func to clos
304f0 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 69  e file */..    i
30500 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20  f( nArg!=3 ){.  
30510 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
30520 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
30530 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41 42 4c  import FILE TABL
30540 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 67 6f 74  E\n");.      got
30550 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
30560 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  xit;.    }.    z
30570 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b  File = azArg[1];
30580 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a  .    zTable = az
30590 41 72 67 5b 32 5d 3b 0a 20 20 20 20 73 65 65 6e  Arg[2];.    seen
305a0 49 6e 74 65 72 72 75 70 74 20 3d 20 30 3b 0a 20  Interrupt = 0;. 
305b0 20 20 20 6d 65 6d 73 65 74 28 26 73 43 74 78 2c     memset(&sCtx,
305c0 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 74 78 29   0, sizeof(sCtx)
305d0 29 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  );.    open_db(p
305e0 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d  , 0);.    nSep =
305f0 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c   strlen30(p->col
30600 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
30610 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20  if( nSep==0 ){. 
30620 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
30630 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20  stderr,.        
30640 20 20 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a           "Error:
30650 20 6e 6f 6e 2d 6e 75 6c 6c 20 63 6f 6c 75 6d 6e   non-null column
30660 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69   separator requi
30670 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e  red for import\n
30680 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
30690 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
306a0 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20 20 20 20  ( nSep>1 ){.    
306b0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
306c0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75 6c  err, "Error: mul
306d0 74 69 2d 63 68 61 72 61 63 74 65 72 20 63 6f 6c  ti-character col
306e0 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73 20 6e  umn separators n
306f0 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20  ot allowed".    
30700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30710 20 20 22 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e    " for import\n
30720 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
30730 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53   1;.    }.    nS
30740 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d  ep = strlen30(p-
30750 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
30760 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20      if( nSep==0 
30770 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
30780 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
30790 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 72 6f 77  or: non-null row
307a0 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69   separator requi
307b0 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e  red for import\n
307c0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
307d0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
307e0 28 20 6e 53 65 70 3d 3d 32 20 26 26 20 70 2d 3e  ( nSep==2 && p->
307f0 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 43 73 76 20 26  mode==MODE_Csv &
30800 26 20 73 74 72 63 6d 70 28 70 2d 3e 72 6f 77 53  & strcmp(p->rowS
30810 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 72  eparator, SEP_Cr
30820 4c 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Lf)==0 ){.      
30830 2f 2a 20 57 68 65 6e 20 69 6d 70 6f 72 74 69 6e  /* When importin
30840 67 20 43 53 56 20 28 6f 6e 6c 79 29 2c 20 69 66  g CSV (only), if
30850 20 74 68 65 20 72 6f 77 20 73 65 70 61 72 61 74   the row separat
30860 6f 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  or is set to the
30870 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  .      ** defaul
30880 74 20 6f 75 74 70 75 74 20 72 6f 77 20 73 65 70  t output row sep
30890 61 72 61 74 6f 72 2c 20 63 68 61 6e 67 65 20 69  arator, change i
308a0 74 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74  t to the default
308b0 20 69 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a 20   input.      ** 
308c0 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20  row separator.  
308d0 54 68 69 73 20 61 76 6f 69 64 73 20 68 61 76 69  This avoids havi
308e0 6e 67 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 64  ng to maintain d
308f0 69 66 66 65 72 65 6e 74 20 69 6e 70 75 74 0a 20  ifferent input. 
30900 20 20 20 20 20 2a 2a 20 61 6e 64 20 6f 75 74 70       ** and outp
30910 75 74 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  ut row separator
30920 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  s. */.      sqli
30930 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
30940 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
30950 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61  tor), p->rowSepa
30960 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b  rator, SEP_Row);
30970 0a 20 20 20 20 20 20 6e 53 65 70 20 3d 20 73 74  .      nSep = st
30980 72 6c 65 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70  rlen30(p->rowSep
30990 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  arator);.    }. 
309a0 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20 29 7b     if( nSep>1 ){
309b0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
309c0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
309d0 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61 63 74 65  : multi-characte
309e0 72 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 73  r row separators
309f0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20   not allowed".  
30a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a10 20 20 20 20 22 20 66 6f 72 20 69 6d 70 6f 72 74      " for import
30a20 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
30a30 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
30a40 73 43 74 78 2e 7a 46 69 6c 65 20 3d 20 7a 46 69  sCtx.zFile = zFi
30a50 6c 65 3b 0a 20 20 20 20 73 43 74 78 2e 6e 4c 69  le;.    sCtx.nLi
30a60 6e 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ne = 1;.    if( 
30a70 73 43 74 78 2e 7a 46 69 6c 65 5b 30 5d 3d 3d 27  sCtx.zFile[0]=='
30a80 7c 27 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  |' ){.#ifdef SQL
30a90 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20  ITE_OMIT_POPEN. 
30aa0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
30ab0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
30ac0 70 69 70 65 73 20 61 72 65 20 6e 6f 74 20 73 75  pipes are not su
30ad0 70 70 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20  pported in this 
30ae0 4f 53 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  OS\n");.      re
30af0 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20  turn 1;.#else.  
30b00 20 20 20 20 73 43 74 78 2e 69 6e 20 3d 20 70 6f      sCtx.in = po
30b10 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65 2b 31  pen(sCtx.zFile+1
30b20 2c 20 22 72 22 29 3b 0a 20 20 20 20 20 20 73 43  , "r");.      sC
30b30 74 78 2e 7a 46 69 6c 65 20 3d 20 22 3c 70 69 70  tx.zFile = "<pip
30b40 65 3e 22 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73  e>";.      xClos
30b50 65 72 20 3d 20 70 63 6c 6f 73 65 3b 0a 23 65 6e  er = pclose;.#en
30b60 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
30b70 20 20 20 20 20 73 43 74 78 2e 69 6e 20 3d 20 66       sCtx.in = f
30b80 6f 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65 2c  open(sCtx.zFile,
30b90 20 22 72 62 22 29 3b 0a 20 20 20 20 20 20 78 43   "rb");.      xC
30ba0 6c 6f 73 65 72 20 3d 20 66 63 6c 6f 73 65 3b 0a  loser = fclose;.
30bb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
30bc0 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73 63 69  >mode==MODE_Asci
30bd0 69 20 29 7b 0a 20 20 20 20 20 20 78 52 65 61 64  i ){.      xRead
30be0 20 3d 20 61 73 63 69 69 5f 72 65 61 64 5f 6f 6e   = ascii_read_on
30bf0 65 5f 66 69 65 6c 64 3b 0a 20 20 20 20 7d 65 6c  e_field;.    }el
30c00 73 65 7b 0a 20 20 20 20 20 20 78 52 65 61 64 20  se{.      xRead 
30c10 3d 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66  = csv_read_one_f
30c20 69 65 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ield;.    }.    
30c30 69 66 28 20 73 43 74 78 2e 69 6e 3d 3d 30 20 29  if( sCtx.in==0 )
30c40 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
30c50 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
30c60 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
30c70 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65  \"%s\"\n", zFile
30c80 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
30c90 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 74  1;.    }.    sCt
30ca0 78 2e 63 43 6f 6c 53 65 70 20 3d 20 70 2d 3e 63  x.cColSep = p->c
30cb0 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a  olSeparator[0];.
30cc0 20 20 20 20 73 43 74 78 2e 63 52 6f 77 53 65 70      sCtx.cRowSep
30cd0 20 3d 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74   = p->rowSeparat
30ce0 6f 72 5b 30 5d 3b 0a 20 20 20 20 7a 53 71 6c 20  or[0];.    zSql 
30cf0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
30d00 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
30d10 20 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20   %s", zTable);. 
30d20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
30d30 7b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28  {.      xCloser(
30d40 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20  sCtx.in);.      
30d50 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d  shell_out_of_mem
30d60 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ory();.    }.   
30d70 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33   nByte = strlen3
30d80 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20  0(zSql);.    rc 
30d90 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
30da0 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
30db0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
30dc0 3b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70  ;.    import_app
30dd0 65 6e 64 5f 63 68 61 72 28 26 73 43 74 78 2c 20  end_char(&sCtx, 
30de0 30 29 3b 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73  0);    /* To ens
30df0 75 72 65 20 73 43 74 78 2e 7a 20 69 73 20 61 6c  ure sCtx.z is al
30e00 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 69  located */.    i
30e10 66 28 20 72 63 20 26 26 20 73 71 6c 69 74 65 33  f( rc && sqlite3
30e20 5f 73 74 72 67 6c 6f 62 28 22 6e 6f 20 73 75 63  _strglob("no suc
30e30 68 20 74 61 62 6c 65 3a 20 2a 22 2c 20 73 71 6c  h table: *", sql
30e40 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
30e50 62 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  b))==0 ){.      
30e60 63 68 61 72 20 2a 7a 43 72 65 61 74 65 20 3d 20  char *zCreate = 
30e70 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
30e80 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 73  "CREATE TABLE %s
30e90 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  ", zTable);.    
30ea0 20 20 63 68 61 72 20 63 53 65 70 20 3d 20 27 28    char cSep = '(
30eb0 27 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ';.      while( 
30ec0 78 52 65 61 64 28 26 73 43 74 78 29 20 29 7b 0a  xRead(&sCtx) ){.
30ed0 20 20 20 20 20 20 20 20 7a 43 72 65 61 74 65 20          zCreate 
30ee0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
30ef0 66 28 22 25 7a 25 63 5c 6e 20 20 5c 22 25 77 5c  f("%z%c\n  \"%w\
30f00 22 20 54 45 58 54 22 2c 20 7a 43 72 65 61 74 65  " TEXT", zCreate
30f10 2c 20 63 53 65 70 2c 20 73 43 74 78 2e 7a 29 3b  , cSep, sCtx.z);
30f20 0a 20 20 20 20 20 20 20 20 63 53 65 70 20 3d 20  .        cSep = 
30f30 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ',';.        if(
30f40 20 73 43 74 78 2e 63 54 65 72 6d 21 3d 73 43 74   sCtx.cTerm!=sCt
30f50 78 2e 63 43 6f 6c 53 65 70 20 29 20 62 72 65 61  x.cColSep ) brea
30f60 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
30f70 20 69 66 28 20 63 53 65 70 3d 3d 27 28 27 20 29   if( cSep=='(' )
30f80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
30f90 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b  3_free(zCreate);
30fa0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30fb0 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20  _free(sCtx.z);. 
30fc0 20 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73         xCloser(s
30fd0 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20  Ctx.in);.       
30fe0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
30ff0 65 72 72 2c 22 25 73 3a 20 65 6d 70 74 79 20 66  err,"%s: empty f
31000 69 6c 65 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69  ile\n", sCtx.zFi
31010 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  le);.        ret
31020 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
31030 20 20 20 20 20 7a 43 72 65 61 74 65 20 3d 20 73       zCreate = s
31040 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
31050 25 7a 5c 6e 29 22 2c 20 7a 43 72 65 61 74 65 29  %z\n)", zCreate)
31060 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
31070 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
31080 20 7a 43 72 65 61 74 65 2c 20 30 2c 20 30 2c 20   zCreate, 0, 0, 
31090 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
310a0 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b  3_free(zCreate);
310b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
310c0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
310d0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43 52  intf(stderr, "CR
310e0 45 41 54 45 20 54 41 42 4c 45 20 25 73 28 2e 2e  EATE TABLE %s(..
310f0 2e 29 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22  .) failed: %s\n"
31100 2c 20 7a 54 61 62 6c 65 2c 0a 20 20 20 20 20 20  , zTable,.      
31110 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31120 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
31130 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
31140 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a  3_free(sCtx.z);.
31150 20 20 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28          xCloser(
31160 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20  sCtx.in);.      
31170 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
31180 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
31190 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
311a0 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
311b0 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
311c0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
311d0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
311e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
311f0 20 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69   if (pStmt) sqli
31200 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
31210 6d 74 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  mt);.      utf8_
31220 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
31230 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
31240 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
31250 62 29 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73  b));.      xClos
31260 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20  er(sCtx.in);.   
31270 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
31280 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71   }.    nCol = sq
31290 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
312a0 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73  nt(pStmt);.    s
312b0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
312c0 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d  pStmt);.    pStm
312d0 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e  t = 0;.    if( n
312e0 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Col==0 ) return 
312f0 30 3b 20 2f 2a 20 6e 6f 20 63 6f 6c 75 6d 6e 73  0; /* no columns
31300 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20  , no error */.  
31310 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
31320 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 42 79 74 65  _malloc64( nByte
31330 2a 32 20 2b 20 32 30 20 2b 20 6e 43 6f 6c 2a 32  *2 + 20 + nCol*2
31340 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   );.    if( zSql
31350 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 78 43 6c  ==0 ){.      xCl
31360 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20  oser(sCtx.in);. 
31370 20 20 20 20 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f       shell_out_o
31380 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20  f_memory();.    
31390 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  }.    sqlite3_sn
313a0 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 32 30 2c  printf(nByte+20,
313b0 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 49   zSql, "INSERT I
313c0 4e 54 4f 20 5c 22 25 77 5c 22 20 56 41 4c 55 45  NTO \"%w\" VALUE
313d0 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  S(?", zTable);. 
313e0 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28     j = strlen30(
313f0 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69  zSql);.    for(i
31400 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =1; i<nCol; i++)
31410 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  {.      zSql[j++
31420 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a  ] = ',';.      z
31430 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a  Sql[j++] = '?';.
31440 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a      }.    zSql[j
31450 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a  ++] = ')';.    z
31460 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  Sql[j] = 0;.    
31470 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
31480 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
31490 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
314a0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
314b0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
314c0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
314d0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
314e0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
314f0 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
31500 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
31510 20 20 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c    if (pStmt) sql
31520 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
31530 74 6d 74 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f  tmt);.      xClo
31540 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20  ser(sCtx.in);.  
31550 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
31560 20 20 7d 0a 20 20 20 20 6e 65 65 64 43 6f 6d 6d    }.    needComm
31570 69 74 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74  it = sqlite3_get
31580 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 70 2d 3e 64  _autocommit(p->d
31590 62 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64  b);.    if( need
315a0 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69 74 65 33  Commit ) sqlite3
315b0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 42 45  _exec(p->db, "BE
315c0 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  GIN", 0, 0, 0);.
315d0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 6e      do{.      in
315e0 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 73 43  t startLine = sC
315f0 74 78 2e 6e 4c 69 6e 65 3b 0a 20 20 20 20 20 20  tx.nLine;.      
31600 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
31610 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
31620 68 61 72 20 2a 7a 20 3d 20 78 52 65 61 64 28 26  har *z = xRead(&
31630 73 43 74 78 29 3b 0a 20 20 20 20 20 20 20 20 2f  sCtx);.        /
31640 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 69 64  *.        ** Did
31650 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d 6f 66   we reach end-of
31660 2d 66 69 6c 65 20 62 65 66 6f 72 65 20 66 69 6e  -file before fin
31670 64 69 6e 67 20 61 6e 79 20 63 6f 6c 75 6d 6e 73  ding any columns
31680 3f 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20  ?.        ** If 
31690 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65 61 64  so, stop instead
316a0 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67   of NULL filling
316b0 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 63   the remaining c
316c0 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 20 20 20 20  olumns..        
316d0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  */.        if( z
316e0 3d 3d 30 20 26 26 20 69 3d 3d 30 20 29 20 62 72  ==0 && i==0 ) br
316f0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a  eak;.        /*.
31700 20 20 20 20 20 20 20 20 2a 2a 20 44 69 64 20 77          ** Did w
31710 65 20 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66  e reach end-of-f
31720 69 6c 65 20 4f 52 20 65 6e 64 2d 6f 66 2d 6c 69  ile OR end-of-li
31730 6e 65 20 62 65 66 6f 72 65 20 66 69 6e 64 69 6e  ne before findin
31740 67 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a  g any.        **
31750 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 41 53 43 49   columns in ASCI
31760 49 20 6d 6f 64 65 3f 20 20 49 66 20 73 6f 2c 20  I mode?  If so, 
31770 73 74 6f 70 20 69 6e 73 74 65 61 64 20 6f 66 20  stop instead of 
31780 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67 0a 20 20 20  NULL filling.   
31790 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 6d 61       ** the rema
317a0 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ining columns.. 
317b0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
317c0 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d    if( p->mode==M
317d0 4f 44 45 5f 41 73 63 69 69 20 26 26 20 28 7a 3d  ODE_Ascii && (z=
317e0 3d 30 20 7c 7c 20 7a 5b 30 5d 3d 3d 30 29 20 26  =0 || z[0]==0) &
317f0 26 20 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  & i==0 ) break;.
31800 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
31810 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
31820 20 69 2b 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c   i+1, z, -1, SQL
31830 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
31840 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43          if( i<nC
31850 6f 6c 2d 31 20 26 26 20 73 43 74 78 2e 63 54 65  ol-1 && sCtx.cTe
31860 72 6d 21 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70  rm!=sCtx.cColSep
31870 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
31880 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
31890 2c 20 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74  , "%s:%d: expect
318a0 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75  ed %d columns bu
318b0 74 20 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20  t found %d - ". 
318c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318d0 20 20 20 20 20 20 20 20 20 22 66 69 6c 6c 69 6e           "fillin
318e0 67 20 74 68 65 20 72 65 73 74 20 77 69 74 68 20  g the rest with 
318f0 4e 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20  NULL\n",.       
31900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31910 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73     sCtx.zFile, s
31920 74 61 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20  tartLine, nCol, 
31930 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  i+1);.          
31940 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
31950 20 20 77 68 69 6c 65 28 20 69 3c 3d 6e 43 6f 6c    while( i<=nCol
31960 20 29 7b 20 73 71 6c 69 74 65 33 5f 62 69 6e 64   ){ sqlite3_bind
31970 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b  _null(pStmt, i);
31980 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20   i++; }.        
31990 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
319a0 69 66 28 20 73 43 74 78 2e 63 54 65 72 6d 3d 3d  if( sCtx.cTerm==
319b0 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 7b 0a  sCtx.cColSep ){.
319c0 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
319d0 20 20 20 20 20 20 78 52 65 61 64 28 26 73 43 74        xRead(&sCt
319e0 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b  x);.          i+
319f0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 77 68 69 6c  +;.        }whil
31a00 65 28 20 73 43 74 78 2e 63 54 65 72 6d 3d 3d 73  e( sCtx.cTerm==s
31a10 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 3b 0a 20  Ctx.cColSep );. 
31a20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
31a30 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25  tf(stderr, "%s:%
31a40 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63  d: expected %d c
31a50 6f 6c 75 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64  olumns but found
31a60 20 25 64 20 2d 20 22 0a 20 20 20 20 20 20 20 20   %d - ".        
31a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a80 22 65 78 74 72 61 73 20 69 67 6e 6f 72 65 64 5c  "extras ignored\
31a90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
31aa0 20 20 20 20 20 20 20 20 20 20 20 20 73 43 74 78              sCtx
31ab0 2e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e  .zFile, startLin
31ac0 65 2c 20 6e 43 6f 6c 2c 20 69 29 3b 0a 20 20 20  e, nCol, i);.   
31ad0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
31ae0 3e 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  >=nCol ){.      
31af0 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
31b00 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Stmt);.        r
31b10 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
31b20 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
31b30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31b40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
31b50 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
31b60 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 49 4e 53  err, "%s:%d: INS
31b70 45 52 54 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e  ERT failed: %s\n
31b80 22 2c 20 73 43 74 78 2e 7a 46 69 6c 65 2c 0a 20  ", sCtx.zFile,. 
31b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ba0 20 20 20 20 20 73 74 61 72 74 4c 69 6e 65 2c 20       startLine, 
31bb0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
31bc0 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  ->db));.        
31bd0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77  }.      }.    }w
31be0 68 69 6c 65 28 20 73 43 74 78 2e 63 54 65 72 6d  hile( sCtx.cTerm
31bf0 21 3d 45 4f 46 20 29 3b 0a 0a 20 20 20 20 78 43  !=EOF );..    xC
31c00 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a  loser(sCtx.in);.
31c10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
31c20 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20 73 71  (sCtx.z);.    sq
31c30 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
31c40 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  Stmt);.    if( n
31c50 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69  eedCommit ) sqli
31c60 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
31c70 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20  "COMMIT", 0, 0, 
31c80 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66  0);.  }else..#if
31c90 6e 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 54 45  ndef SQLITE_UNTE
31ca0 53 54 41 42 4c 45 0a 20 20 69 66 28 20 63 3d 3d  STABLE.  if( c==
31cb0 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'i' && strncmp(a
31cc0 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 73 74  zArg[0], "impost
31cd0 65 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  er", n)==0 ){.  
31ce0 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
31cf0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 69 73 74    char *zCollist
31d00 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
31d10 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
31d20 20 20 20 69 6e 74 20 74 6e 75 6d 20 3d 20 30 3b     int tnum = 0;
31d30 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
31d40 69 66 28 20 21 28 6e 41 72 67 3d 3d 33 20 7c 7c  if( !(nArg==3 ||
31d50 20 28 6e 41 72 67 3d 3d 32 20 26 26 20 73 71 6c   (nArg==2 && sql
31d60 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 41  ite3_stricmp(azA
31d70 72 67 5b 31 5d 2c 22 6f 66 66 22 29 3d 3d 30 29  rg[1],"off")==0)
31d80 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  ) ){.      utf8_
31d90 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
31da0 55 73 61 67 65 3a 20 2e 69 6d 70 6f 73 74 65 72  Usage: .imposter
31db0 20 49 4e 44 45 58 20 49 4d 50 4f 53 54 45 52 5c   INDEX IMPOSTER\
31dc0 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
31dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
31de0 20 20 20 20 20 2e 69 6d 70 6f 73 74 65 72 20 6f       .imposter o
31df0 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ff\n");.      rc
31e00 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
31e10 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
31e20 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70  it;.    }.    op
31e30 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
31e40 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
31e50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65        sqlite3_te
31e60 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
31e70 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
31e80 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69  TER, p->db, "mai
31e90 6e 22 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20  n", 0, 1);.     
31ea0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
31eb0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
31ec0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
31ed0 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
31ee0 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20  T rootpage FROM 
31ef0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
31f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f10 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
31f20 45 20 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20  E name='%q' AND 
31f30 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 61  type='index'", a
31f40 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 73 71  zArg[1]);.    sq
31f50 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
31f60 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
31f70 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
31f80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
31f90 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 73 71  Sql);.    if( sq
31fa0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
31fb0 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
31fc0 0a 20 20 20 20 20 20 74 6e 75 6d 20 3d 20 73 71  .      tnum = sq
31fd0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
31fe0 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
31ff0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  }.    sqlite3_fi
32000 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
32010 20 20 20 69 66 28 20 74 6e 75 6d 3d 3d 30 20 29     if( tnum==0 )
32020 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
32030 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6e 6f 20  ntf(stderr, "no 
32040 73 75 63 68 20 69 6e 64 65 78 3a 20 5c 22 25 73  such index: \"%s
32050 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29  \"\n", azArg[1])
32060 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
32070 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
32080 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
32090 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73    }.    zSql = s
320a0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
320b0 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e  PRAGMA index_xin
320c0 66 6f 3d 27 25 71 27 22 2c 20 61 7a 41 72 67 5b  fo='%q'", azArg[
320d0 31 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  1]);.    rc = sq
320e0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
320f0 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
32100 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
32110 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
32120 53 71 6c 29 3b 0a 20 20 20 20 69 20 3d 20 30 3b  Sql);.    i = 0;
32130 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69  .    while( sqli
32140 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
32150 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
32160 20 20 20 20 20 63 68 61 72 20 7a 4c 61 62 65 6c       char zLabel
32170 5b 32 30 5d 3b 0a 20 20 20 20 20 20 63 6f 6e 73  [20];.      cons
32180 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 28  t char *zCol = (
32190 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
321a0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
321b0 70 53 74 6d 74 2c 32 29 3b 0a 20 20 20 20 20 20  pStmt,2);.      
321c0 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  i++;.      if( z
321d0 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col==0 ){.      
321e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f    if( sqlite3_co
321f0 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 31  lumn_int(pStmt,1
32200 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  )==-1 ){.       
32210 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57 49     zCol = "_ROWI
32220 44 5f 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  D_";.        }el
32230 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
32240 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
32250 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 2c 7a 4c  izeof(zLabel),zL
32260 61 62 65 6c 2c 22 65 78 70 72 25 64 22 2c 69 29  abel,"expr%d",i)
32270 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c  ;.          zCol
32280 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20   = zLabel;.     
32290 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
322a0 20 20 20 69 66 28 20 7a 43 6f 6c 6c 69 73 74 3d     if( zCollist=
322b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  =0 ){.        zC
322c0 6f 6c 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  ollist = sqlite3
322d0 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22  _mprintf("\"%w\"
322e0 22 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  ", zCol);.      
322f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
32300 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c 69 74 65  Collist = sqlite
32310 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2c 5c 22  3_mprintf("%z,\"
32320 25 77 5c 22 22 2c 20 7a 43 6f 6c 6c 69 73 74 2c  %w\"", zCollist,
32330 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   zCol);.      }.
32340 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
32350 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
32360 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  );.    zSql = sq
32370 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
32380 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
32390 20 54 41 42 4c 45 20 5c 22 25 77 5c 22 28 25 73   TABLE \"%w\"(%s
323a0 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 25 73 29  ,PRIMARY KEY(%s)
323b0 29 57 49 54 48 4f 55 54 20 52 4f 57 49 44 22 2c  )WITHOUT ROWID",
323c0 0a 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67  .          azArg
323d0 5b 32 5d 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a  [2], zCollist, z
323e0 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 73 71  Collist);.    sq
323f0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c  lite3_free(zColl
32400 69 73 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ist);.    rc = s
32410 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
32420 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
32430 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
32440 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 20  >db, "main", 1, 
32450 74 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  tnum);.    if( r
32460 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
32470 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32480 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
32490 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  Sql, 0, 0, 0);. 
324a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73       sqlite3_tes
324b0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
324c0 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
324d0 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e  ER, p->db, "main
324e0 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  ", 0, 0);.      
324f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
32500 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
32510 64 65 72 72 2c 20 22 45 72 72 6f 72 20 69 6e 20  derr, "Error in 
32520 5b 25 73 5d 3a 20 25 73 5c 6e 22 2c 20 7a 53 71  [%s]: %s\n", zSq
32530 6c 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  l, sqlite3_errms
32540 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
32550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32560 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f  utf8_printf(stdo
32570 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a 53 71  ut, "%s;\n", zSq
32580 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  l);.        raw_
32590 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 0a 20  printf(stdout,. 
325a0 20 20 20 20 20 20 20 20 20 20 22 57 41 52 4e 49            "WARNI
325b0 4e 47 3a 20 77 72 69 74 69 6e 67 20 74 6f 20 61  NG: writing to a
325c0 6e 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  n imposter table
325d0 20 77 69 6c 6c 20 63 6f 72 72 75 70 74 20 74 68   will corrupt th
325e0 65 20 69 6e 64 65 78 21 5c 6e 22 0a 20 20 20 20  e index!\n".    
325f0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
32600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32610 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
32620 72 2c 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43  r, "SQLITE_TESTC
32630 54 52 4c 5f 49 4d 50 4f 53 54 45 52 20 72 65 74  TRL_IMPOSTER ret
32640 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29 3b  urns %d\n", rc);
32650 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
32660 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
32670 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d  _free(zSql);.  }
32680 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 21  else.#endif /* !
32690 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
326a0 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c  MIT_TEST_CONTROL
326b0 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  ) */..#ifdef SQL
326c0 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
326d0 43 45 0a 20 20 69 66 28 20 63 3d 3d 27 69 27 20  CE.  if( c=='i' 
326e0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
326f0 5b 30 5d 2c 20 22 69 6f 74 72 61 63 65 22 2c 20  [0], "iotrace", 
32700 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 51 4c  n)==0 ){.    SQL
32710 49 54 45 5f 41 50 49 20 65 78 74 65 72 6e 20 76  ITE_API extern v
32720 6f 69 64 20 28 53 51 4c 49 54 45 5f 43 44 45 43  oid (SQLITE_CDEC
32730 4c 20 2a 73 71 6c 69 74 65 33 49 6f 54 72 61 63  L *sqlite3IoTrac
32740 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  e)(const char*, 
32750 2e 2e 2e 29 3b 0a 20 20 20 20 69 66 28 20 69 6f  ...);.    if( io
32760 74 72 61 63 65 20 26 26 20 69 6f 74 72 61 63 65  trace && iotrace
32770 21 3d 73 74 64 6f 75 74 20 29 20 66 63 6c 6f 73  !=stdout ) fclos
32780 65 28 69 6f 74 72 61 63 65 29 3b 0a 20 20 20 20  e(iotrace);.    
32790 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  iotrace = 0;.   
327a0 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20   if( nArg<2 ){. 
327b0 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72       sqlite3IoTr
327c0 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ace = 0;.    }el
327d0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a  se if( strcmp(az
327e0 41 72 67 5b 31 5d 2c 20 22 2d 22 29 3d 3d 30 20  Arg[1], "-")==0 
327f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
32800 49 6f 54 72 61 63 65 20 3d 20 69 6f 74 72 61 63  IoTrace = iotrac
32810 65 50 72 69 6e 74 66 3b 0a 20 20 20 20 20 20 69  ePrintf;.      i
32820 6f 74 72 61 63 65 20 3d 20 73 74 64 6f 75 74 3b  otrace = stdout;
32830 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
32840 20 20 69 6f 74 72 61 63 65 20 3d 20 66 6f 70 65    iotrace = fope
32850 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 77 22 29  n(azArg[1], "w")
32860 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6f 74 72  ;.      if( iotr
32870 61 63 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ace==0 ){.      
32880 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
32890 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61  derr, "Error: ca
328a0 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22  nnot open \"%s\"
328b0 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  \n", azArg[1]);.
328c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
328d0 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  oTrace = 0;.    
328e0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
328f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32900 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20   sqlite3IoTrace 
32910 3d 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66 3b  = iotracePrintf;
32920 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
32930 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
32940 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 6e   if( c=='l' && n
32950 3e 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=5 && strncmp(a
32960 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6d 69 74 73  zArg[0], "limits
32970 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
32980 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
32990 75 63 74 20 7b 0a 20 20 20 20 20 20 20 63 6f 6e  uct {.       con
329a0 73 74 20 63 68 61 72 20 2a 7a 4c 69 6d 69 74 4e  st char *zLimitN
329b0 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame;   /* Name o
329c0 66 20 61 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20  f a limit */.   
329d0 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 43 6f 64      int limitCod
329e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
329f0 20 49 6e 74 65 67 65 72 20 63 6f 64 65 20 66 6f   Integer code fo
32a00 72 20 74 68 61 74 20 6c 69 6d 69 74 20 2a 2f 0a  r that limit */.
32a10 20 20 20 20 7d 20 61 4c 69 6d 69 74 5b 5d 20 3d      } aLimit[] =
32a20 20 7b 0a 20 20 20 20 20 20 7b 20 22 6c 65 6e 67   {.      { "leng
32a30 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  th",            
32a40 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
32a50 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20 20  _LENGTH         
32a60 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
32a70 20 20 20 20 7b 20 22 73 71 6c 5f 6c 65 6e 67 74      { "sql_lengt
32a80 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53  h",            S
32a90 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f  QLITE_LIMIT_SQL_
32aa0 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20  LENGTH          
32ab0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
32ac0 20 22 63 6f 6c 75 6d 6e 22 2c 20 20 20 20 20 20   "column",      
32ad0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
32ae0 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20 20  _LIMIT_COLUMN   
32af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b00 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 65 78 70   },.      { "exp
32b10 72 5f 64 65 70 74 68 22 2c 20 20 20 20 20 20 20  r_depth",       
32b20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
32b30 54 5f 45 58 50 52 5f 44 45 50 54 48 20 20 20 20  T_EXPR_DEPTH    
32b40 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
32b50 20 20 20 20 20 7b 20 22 63 6f 6d 70 6f 75 6e 64       { "compound
32b60 5f 73 65 6c 65 63 74 22 2c 20 20 20 20 20 20 20  _select",       
32b70 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
32b80 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 20 20 20  POUND_SELECT    
32b90 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
32ba0 7b 20 22 76 64 62 65 5f 6f 70 22 2c 20 20 20 20  { "vdbe_op",    
32bb0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
32bc0 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 20  E_LIMIT_VDBE_OP 
32bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32be0 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 66 75    },.      { "fu
32bf0 6e 63 74 69 6f 6e 5f 61 72 67 22 2c 20 20 20 20  nction_arg",    
32c00 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
32c10 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  IT_FUNCTION_ARG 
32c20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
32c30 20 20 20 20 20 20 7b 20 22 61 74 74 61 63 68 65        { "attache
32c40 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  d",             
32c50 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54   SQLITE_LIMIT_AT
32c60 54 41 43 48 45 44 20 20 20 20 20 20 20 20 20 20  TACHED          
32c70 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
32c80 20 7b 20 22 6c 69 6b 65 5f 70 61 74 74 65 72 6e   { "like_pattern
32c90 5f 6c 65 6e 67 74 68 22 2c 20 20 20 53 51 4c 49  _length",   SQLI
32ca0 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41  TE_LIMIT_LIKE_PA
32cb0 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20 20 20  TTERN_LENGTH    
32cc0 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 76     },.      { "v
32cd0 61 72 69 61 62 6c 65 5f 6e 75 6d 62 65 72 22 2c  ariable_number",
32ce0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
32cf0 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
32d00 42 45 52 20 20 20 20 20 20 20 20 20 20 20 7d 2c  BER           },
32d10 0a 20 20 20 20 20 20 7b 20 22 74 72 69 67 67 65  .      { "trigge
32d20 72 5f 64 65 70 74 68 22 2c 20 20 20 20 20 20 20  r_depth",       
32d30 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54    SQLITE_LIMIT_T
32d40 52 49 47 47 45 52 5f 44 45 50 54 48 20 20 20 20  RIGGER_DEPTH    
32d50 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
32d60 20 20 7b 20 22 77 6f 72 6b 65 72 5f 74 68 72 65    { "worker_thre
32d70 61 64 73 22 2c 20 20 20 20 20 20 20 20 53 51 4c  ads",        SQL
32d80 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
32d90 5f 54 48 52 45 41 44 53 20 20 20 20 20 20 20 20  _THREADS        
32da0 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20      },.    };.  
32db0 20 20 69 6e 74 20 69 2c 20 6e 32 3b 0a 20 20 20    int i, n2;.   
32dc0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
32dd0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 31 20      if( nArg==1 
32de0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
32df0 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4c  ; i<ArraySize(aL
32e00 69 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  imit); i++){.   
32e10 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 32 30       printf("%20
32e20 73 20 25 64 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b  s %d\n", aLimit[
32e30 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20  i].zLimitName,. 
32e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
32e50 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64  lite3_limit(p->d
32e60 62 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e 6c 69 6d  b, aLimit[i].lim
32e70 69 74 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20  itCode, -1));.  
32e80 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
32e90 69 66 28 20 6e 41 72 67 3e 33 20 29 7b 0a 20 20  if( nArg>3 ){.  
32ea0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
32eb0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
32ec0 6c 69 6d 69 74 20 4e 41 4d 45 20 3f 4e 45 57 2d  limit NAME ?NEW-
32ed0 56 41 4c 55 45 3f 5c 6e 22 29 3b 0a 20 20 20 20  VALUE?\n");.    
32ee0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
32ef0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
32f00 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 65 6c 73  d_exit;.    }els
32f10 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 69  e{.      int iLi
32f20 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mit = -1;.      
32f30 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a  n2 = strlen30(az
32f40 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 66  Arg[1]);.      f
32f50 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
32f60 69 7a 65 28 61 4c 69 6d 69 74 29 3b 20 69 2b 2b  ize(aLimit); i++
32f70 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
32f80 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
32f90 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74  aLimit[i].zLimit
32fa0 4e 61 6d 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20  Name, azArg[1], 
32fb0 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
32fc0 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 30      if( iLimit<0
32fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32fe0 69 4c 69 6d 69 74 20 3d 20 69 3b 0a 20 20 20 20  iLimit = i;.    
32ff0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33000 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
33010 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 61 6d  intf(stderr, "am
33020 62 69 67 75 6f 75 73 20 6c 69 6d 69 74 3a 20 5c  biguous limit: \
33030 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  "%s\"\n", azArg[
33040 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1]);.           
33050 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
33060 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
33070 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
33080 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33090 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
330a0 20 69 66 28 20 69 4c 69 6d 69 74 3c 30 20 29 7b   if( iLimit<0 ){
330b0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
330c0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e  intf(stderr, "un
330d0 6b 6e 6f 77 6e 20 6c 69 6d 69 74 3a 20 5c 22 25  known limit: \"%
330e0 73 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  s\"\n".         
330f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
33100 65 6e 74 65 72 20 5c 22 2e 6c 69 6d 69 74 73 5c  enter \".limits\
33110 22 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65  " with no argume
33120 6e 74 73 20 66 6f 72 20 61 20 6c 69 73 74 2e 5c  nts for a list.\
33130 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
33140 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41               azA
33150 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[1]);.        
33160 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
33170 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
33180 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
33190 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d        if( nArg==
331a0 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  3 ){.        sql
331b0 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62  ite3_limit(p->db
331c0 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d  , aLimit[iLimit]
331d0 2e 6c 69 6d 69 74 43 6f 64 65 2c 0a 20 20 20 20  .limitCode,.    
331e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
331f0 20 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61    (int)integerVa
33200 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 29 3b 0a  lue(azArg[2]));.
33210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72        }.      pr
33220 69 6e 74 66 28 22 25 32 30 73 20 25 64 5c 6e 22  intf("%20s %d\n"
33230 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d  , aLimit[iLimit]
33240 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20 20 20  .zLimitName,.   
33250 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
33260 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61  3_limit(p->db, a
33270 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69  Limit[iLimit].li
33280 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20  mitCode, -1));. 
33290 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
332a0 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 6e 3e  if( c=='l' && n>
332b0 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  2 && strncmp(azA
332c0 72 67 5b 30 5d 2c 20 22 6c 69 6e 74 22 2c 20 6e  rg[0], "lint", n
332d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e  )==0 ){.    open
332e0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6c  _db(p, 0);.    l
332f0 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c  intDotCommand(p,
33300 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20   azArg, nArg);. 
33310 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20   }else..#ifndef 
33320 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
33330 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 69 66 28  _EXTENSION.  if(
33340 20 63 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e 63   c=='l' && strnc
33350 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f  mp(azArg[0], "lo
33360 61 64 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ad", n)==0 ){.  
33370 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
33380 69 6c 65 2c 20 2a 7a 50 72 6f 63 3b 0a 20 20 20  ile, *zProc;.   
33390 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
333a0 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   0;.    if( nArg
333b0 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  <2 ){.      raw_
333c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
333d0 55 73 61 67 65 3a 20 2e 6c 6f 61 64 20 46 49 4c  Usage: .load FIL
333e0 45 20 3f 45 4e 54 52 59 50 4f 49 4e 54 3f 5c 6e  E ?ENTRYPOINT?\n
333f0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
33400 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
33410 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
33420 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65 20      }.    zFile 
33430 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
33440 7a 50 72 6f 63 20 3d 20 6e 41 72 67 3e 3d 33 20  zProc = nArg>=3 
33450 3f 20 61 7a 41 72 67 5b 32 5d 20 3a 20 30 3b 0a  ? azArg[2] : 0;.
33460 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
33470 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
33480 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  te3_load_extensi
33490 6f 6e 28 70 2d 3e 64 62 2c 20 7a 46 69 6c 65 2c  on(p->db, zFile,
334a0 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67   zProc, &zErrMsg
334b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
334c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
334d0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
334e0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
334f0 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  \n", zErrMsg);. 
33500 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
33510 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
33520 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
33530 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
33540 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20    if( c=='l' && 
33550 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
33560 2c 20 22 6c 6f 67 22 2c 20 6e 29 3d 3d 30 20 29  , "log", n)==0 )
33570 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d  {.    if( nArg!=
33580 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  2 ){.      raw_p
33590 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
335a0 73 61 67 65 3a 20 2e 6c 6f 67 20 46 49 4c 45 4e  sage: .log FILEN
335b0 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  AME\n");.      r
335c0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
335d0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
335e0 61 72 20 2a 7a 46 69 6c 65 20 3d 20 61 7a 41 72  ar *zFile = azAr
335f0 67 5b 31 5d 3b 0a 20 20 20 20 20 20 6f 75 74 70  g[1];.      outp
33600 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d  ut_file_close(p-
33610 3e 70 4c 6f 67 29 3b 0a 20 20 20 20 20 20 70 2d  >pLog);.      p-
33620 3e 70 4c 6f 67 20 3d 20 6f 75 74 70 75 74 5f 66  >pLog = output_f
33630 69 6c 65 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c 20  ile_open(zFile, 
33640 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0);.    }.  }els
33650 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6d 27 20  e..  if( c=='m' 
33660 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
33670 5b 30 5d 2c 20 22 6d 6f 64 65 22 2c 20 6e 29 3d  [0], "mode", n)=
33680 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
33690 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 6e 41  char *zMode = nA
336a0 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d  rg>=2 ? azArg[1]
336b0 20 3a 20 22 22 3b 0a 20 20 20 20 69 6e 74 20 6e   : "";.    int n
336c0 32 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4d 6f  2 = strlen30(zMo
336d0 64 65 29 3b 0a 20 20 20 20 69 6e 74 20 63 32 20  de);.    int c2 
336e0 3d 20 7a 4d 6f 64 65 5b 30 5d 3b 0a 20 20 20 20  = zMode[0];.    
336f0 69 66 28 20 63 32 3d 3d 27 6c 27 20 26 26 20 6e  if( c2=='l' && n
33700 32 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61  2>2 && strncmp(a
33710 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e 65 73 22 2c  zArg[1],"lines",
33720 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
33730 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c  p->mode = MODE_L
33740 69 6e 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ine;.      sqlit
33750 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
33760 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
33770 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
33780 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a  ator, SEP_Row);.
33790 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
337a0 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70  =='c' && strncmp
337b0 28 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d  (azArg[1],"colum
337c0 6e 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  ns",n2)==0 ){.  
337d0 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
337e0 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  DE_Column;.     
337f0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
33800 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53  f(sizeof(p->rowS
33810 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f  eparator), p->ro
33820 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  wSeparator, SEP_
33830 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Row);.    }else 
33840 69 66 28 20 63 32 3d 3d 27 6c 27 20 26 26 20 6e  if( c2=='l' && n
33850 32 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61  2>2 && strncmp(a
33860 7a 41 72 67 5b 31 5d 2c 22 6c 69 73 74 22 2c 6e  zArg[1],"list",n
33870 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
33880 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69  ->mode = MODE_Li
33890 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  st;.      sqlite
338a0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
338b0 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  f(p->colSeparato
338c0 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  r), p->colSepara
338d0 74 6f 72 2c 20 53 45 50 5f 43 6f 6c 75 6d 6e 29  tor, SEP_Column)
338e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
338f0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
33900 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
33910 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
33920 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20  r, SEP_Row);.   
33930 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
33940 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  h' && strncmp(az
33950 41 72 67 5b 31 5d 2c 22 68 74 6d 6c 22 2c 6e 32  Arg[1],"html",n2
33960 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
33970 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 48 74 6d  >mode = MODE_Htm
33980 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
33990 20 63 32 3d 3d 27 74 27 20 26 26 20 73 74 72 6e   c2=='t' && strn
339a0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 63  cmp(azArg[1],"tc
339b0 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  l",n2)==0 ){.   
339c0 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
339d0 45 5f 54 63 6c 3b 0a 20 20 20 20 20 20 73 71 6c  E_Tcl;.      sql
339e0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
339f0 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72  zeof(p->colSepar
33a00 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70  ator), p->colSep
33a10 61 72 61 74 6f 72 2c 20 53 45 50 5f 53 70 61 63  arator, SEP_Spac
33a20 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
33a30 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
33a40 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
33a50 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
33a60 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20  tor, SEP_Row);. 
33a70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
33a80 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='c' && strncmp(
33a90 61 7a 41 72 67 5b 31 5d 2c 22 63 73 76 22 2c 6e  azArg[1],"csv",n
33aa0 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
33ab0 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 73  ->mode = MODE_Cs
33ac0 76 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  v;.      sqlite3
33ad0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
33ae0 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
33af0 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ), p->colSeparat
33b00 6f 72 2c 20 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a  or, SEP_Comma);.
33b10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
33b20 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
33b30 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
33b40 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
33b50 20 53 45 50 5f 43 72 4c 66 29 3b 0a 20 20 20 20   SEP_CrLf);.    
33b60 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 74  }else if( c2=='t
33b70 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
33b80 72 67 5b 31 5d 2c 22 74 61 62 73 22 2c 6e 32 29  rg[1],"tabs",n2)
33b90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
33ba0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74  mode = MODE_List
33bb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
33bc0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
33bd0 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
33be0 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
33bf0 72 2c 20 53 45 50 5f 54 61 62 29 3b 0a 20 20 20  r, SEP_Tab);.   
33c00 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
33c10 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  i' && strncmp(az
33c20 41 72 67 5b 31 5d 2c 22 69 6e 73 65 72 74 22 2c  Arg[1],"insert",
33c30 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
33c40 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49  p->mode = MODE_I
33c50 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 73 65 74  nsert;.      set
33c60 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70 2c 20 6e  _table_name(p, n
33c70 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32  Arg>=3 ? azArg[2
33c80 5d 20 3a 20 22 74 61 62 6c 65 22 29 3b 0a 20 20  ] : "table");.  
33c90 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d    }else if( c2==
33ca0 27 71 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'q' && strncmp(a
33cb0 7a 41 72 67 5b 31 5d 2c 22 71 75 6f 74 65 22 2c  zArg[1],"quote",
33cc0 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
33cd0 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 51  p->mode = MODE_Q
33ce0 75 6f 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20  uote;.    }else 
33cf0 69 66 28 20 63 32 3d 3d 27 61 27 20 26 26 20 73  if( c2=='a' && s
33d00 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
33d10 22 61 73 63 69 69 22 2c 6e 32 29 3d 3d 30 20 29  "ascii",n2)==0 )
33d20 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
33d30 3d 20 4d 4f 44 45 5f 41 73 63 69 69 3b 0a 20 20  = MODE_Ascii;.  
33d40 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
33d50 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63  intf(sizeof(p->c
33d60 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  olSeparator), p-
33d70 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53  >colSeparator, S
33d80 45 50 5f 55 6e 69 74 29 3b 0a 20 20 20 20 20 20  EP_Unit);.      
33d90 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
33da0 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65  (sizeof(p->rowSe
33db0 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77  parator), p->row
33dc0 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52  Separator, SEP_R
33dd0 65 63 6f 72 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ecord);.    }els
33de0 65 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b  e if( nArg==1 ){
33df0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
33e00 66 28 70 2d 3e 6f 75 74 2c 20 22 63 75 72 72 65  f(p->out, "curre
33e10 6e 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 3a 20  nt output mode: 
33e20 25 73 5c 6e 22 2c 20 6d 6f 64 65 44 65 73 63 72  %s\n", modeDescr
33e30 5b 70 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20 20 20  [p->mode]);.    
33e40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
33e50 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
33e60 22 45 72 72 6f 72 3a 20 6d 6f 64 65 20 73 68 6f  "Error: mode sho
33e70 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22  uld be one of: "
33e80 0a 20 20 20 20 20 20 20 20 20 22 61 73 63 69 69  .         "ascii
33e90 20 63 6f 6c 75 6d 6e 20 63 73 76 20 68 74 6d 6c   column csv html
33ea0 20 69 6e 73 65 72 74 20 6c 69 6e 65 20 6c 69 73   insert line lis
33eb0 74 20 71 75 6f 74 65 20 74 61 62 73 20 74 63 6c  t quote tabs tcl
33ec0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
33ed0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d   1;.    }.    p-
33ee0 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  >cMode = p->mode
33ef0 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
33f00 20 63 3d 3d 27 6e 27 20 26 26 20 73 74 72 6e 63   c=='n' && strnc
33f10 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6e 75  mp(azArg[0], "nu
33f20 6c 6c 76 61 6c 75 65 22 2c 20 6e 29 3d 3d 30 20  llvalue", n)==0 
33f30 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
33f40 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =2 ){.      sqli
33f50 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
33f60 65 6f 66 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  eof(p->nullValue
33f70 29 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c  ), p->nullValue,
33f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33f90 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20          "%.*s", 
33fa0 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70  (int)ArraySize(p
33fb0 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 2d 31 2c 20  ->nullValue)-1, 
33fc0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d  azArg[1]);.    }
33fd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
33fe0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
33ff0 55 73 61 67 65 3a 20 2e 6e 75 6c 6c 76 61 6c 75  Usage: .nullvalu
34000 65 20 53 54 52 49 4e 47 5c 6e 22 29 3b 0a 20 20  e STRING\n");.  
34010 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
34020 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
34030 20 63 3d 3d 27 6f 27 20 26 26 20 73 74 72 6e 63   c=='o' && strnc
34040 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 70  mp(azArg[0], "op
34050 65 6e 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 3e  en", n)==0 && n>
34060 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =2 ){.    char *
34070 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 20 20 2f  zNewFilename;  /
34080 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
34090 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
340a0 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  pen */.    int i
340b0 4e 61 6d 65 20 3d 20 31 3b 20 20 20 20 20 20 20  Name = 1;       
340c0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 7a 41 72  /* Index in azAr
340d0 67 5b 5d 20 6f 66 20 74 68 65 20 66 69 6c 65 6e  g[] of the filen
340e0 61 6d 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ame */.    int n
340f0 65 77 46 6c 61 67 20 3d 20 30 3b 20 20 20 20 20  ewFlag = 0;     
34100 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65 74  /* True to delet
34110 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 6f 70  e file before op
34120 65 6e 69 6e 67 20 2a 2f 0a 20 20 20 20 2f 2a 20  ening */.    /* 
34130 43 6c 6f 73 65 20 74 68 65 20 65 78 69 73 74 69  Close the existi
34140 6e 67 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ng database */. 
34150 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65     session_close
34160 5f 61 6c 6c 28 70 29 3b 0a 20 20 20 20 63 6c 6f  _all(p);.    clo
34170 73 65 5f 64 62 28 70 2d 3e 64 62 29 3b 0a 20 20  se_db(p->db);.  
34180 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 20    p->db = 0;.   
34190 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20   p->zDbFilename 
341a0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
341b0 5f 66 72 65 65 28 70 2d 3e 7a 46 72 65 65 4f 6e  _free(p->zFreeOn
341c0 43 6c 6f 73 65 29 3b 0a 20 20 20 20 70 2d 3e 7a  Close);.    p->z
341d0 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b  FreeOnClose = 0;
341e0 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65  .    p->openMode
341f0 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e   = SHELL_OPEN_UN
34200 53 50 45 43 3b 0a 20 20 20 20 2f 2a 20 43 68 65  SPEC;.    /* Che
34210 63 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 2d 6c  ck for command-l
34220 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ine arguments */
34230 0a 20 20 20 20 66 6f 72 28 69 4e 61 6d 65 3d 31  .    for(iName=1
34240 3b 20 69 4e 61 6d 65 3c 6e 41 72 67 20 26 26 20  ; iName<nArg && 
34250 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 5b 30 5d 3d  azArg[iName][0]=
34260 3d 27 2d 27 3b 20 69 4e 61 6d 65 2b 2b 29 7b 0a  ='-'; iName++){.
34270 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
34280 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 4e 61 6d   *z = azArg[iNam
34290 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70  e];.      if( op
342a0 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 22 6e 65 77  tionMatch(z,"new
342b0 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  ") ){.        ne
342c0 77 46 6c 61 67 20 3d 20 31 3b 0a 23 69 66 64 65  wFlag = 1;.#ifde
342d0 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c  f SQLITE_HAVE_ZL
342e0 49 42 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  IB.      }else i
342f0 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a  f( optionMatch(z
34300 2c 20 22 7a 69 70 22 29 20 29 7b 0a 20 20 20 20  , "zip") ){.    
34310 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20      p->openMode 
34320 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50  = SHELL_OPEN_ZIP
34330 46 49 4c 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20  FILE;.#endif.   
34340 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 74     }else if( opt
34350 69 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 61 70 70  ionMatch(z, "app
34360 65 6e 64 22 29 20 29 7b 0a 20 20 20 20 20 20 20  end") ){.       
34370 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53   p->openMode = S
34380 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44  HELL_OPEN_APPEND
34390 56 46 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  VFS;.      }else
343a0 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68   if( optionMatch
343b0 28 7a 2c 20 22 72 65 61 64 6f 6e 6c 79 22 29 20  (z, "readonly") 
343c0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70  ){.        p->op
343d0 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f  enMode = SHELL_O
343e0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 69  PEN_READONLY;.#i
343f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
34400 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a 20  LE_DESERIALIZE. 
34410 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f       }else if( o
34420 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 64  ptionMatch(z, "d
34430 65 73 65 72 69 61 6c 69 7a 65 22 29 20 29 7b 0a  eserialize") ){.
34440 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d          p->openM
34450 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e  ode = SHELL_OPEN
34460 5f 44 45 53 45 52 49 41 4c 49 5a 45 3b 0a 20 20  _DESERIALIZE;.  
34470 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
34480 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 68 65  tionMatch(z, "he
34490 78 64 62 22 29 20 29 7b 0a 20 20 20 20 20 20 20  xdb") ){.       
344a0 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53   p->openMode = S
344b0 48 45 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44 42 3b  HELL_OPEN_HEXDB;
344c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
344d0 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41  E_ENABLE_DESERIA
344e0 4c 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20 7d 65  LIZE */.      }e
344f0 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d  lse if( z[0]=='-
34500 27 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  ' ){.        utf
34510 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
34520 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "unknown option
34530 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20  : %s\n", z);.   
34540 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
34550 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
34560 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
34570 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f     }.    }.    /
34580 2a 20 49 66 20 61 20 66 69 6c 65 6e 61 6d 65 20  * If a filename 
34590 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 74 72  is specified, tr
345a0 79 20 74 6f 20 6f 70 65 6e 20 69 74 20 66 69 72  y to open it fir
345b0 73 74 20 2a 2f 0a 20 20 20 20 7a 4e 65 77 46 69  st */.    zNewFi
345c0 6c 65 6e 61 6d 65 20 3d 20 6e 41 72 67 3e 69 4e  lename = nArg>iN
345d0 61 6d 65 20 3f 20 73 71 6c 69 74 65 33 5f 6d 70  ame ? sqlite3_mp
345e0 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 41 72  rintf("%s", azAr
345f0 67 5b 69 4e 61 6d 65 5d 29 20 3a 20 30 3b 0a 20  g[iName]) : 0;. 
34600 20 20 20 69 66 28 20 7a 4e 65 77 46 69 6c 65 6e     if( zNewFilen
34610 61 6d 65 20 7c 7c 20 70 2d 3e 6f 70 65 6e 4d 6f  ame || p->openMo
34620 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 48  de==SHELL_OPEN_H
34630 45 58 44 42 20 29 7b 0a 20 20 20 20 20 20 69 66  EXDB ){.      if
34640 28 20 6e 65 77 46 6c 61 67 20 29 20 73 68 65 6c  ( newFlag ) shel
34650 6c 44 65 6c 65 74 65 46 69 6c 65 28 7a 4e 65 77  lDeleteFile(zNew
34660 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
34670 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20   p->zDbFilename 
34680 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 0a  = zNewFilename;.
34690 20 20 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c        open_db(p,
346a0 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49   OPEN_DB_KEEPALI
346b0 56 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  VE);.      if( p
346c0 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->db==0 ){.     
346d0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
346e0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63  tderr, "Error: c
346f0 61 6e 6e 6f 74 20 6f 70 65 6e 20 27 25 73 27 5c  annot open '%s'\
34700 6e 22 2c 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65  n", zNewFilename
34710 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
34720 65 33 5f 66 72 65 65 28 7a 4e 65 77 46 69 6c 65  e3_free(zNewFile
34730 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
34740 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a  se{.        p->z
34750 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 4e  FreeOnClose = zN
34760 65 77 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20  ewFilename;.    
34770 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
34780 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20  ( p->db==0 ){.  
34790 20 20 20 20 2f 2a 20 41 73 20 61 20 66 61 6c 6c      /* As a fall
347a0 2d 62 61 63 6b 20 6f 70 65 6e 20 61 20 54 45 4d  -back open a TEM
347b0 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  P database */.  
347c0 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61      p->zDbFilena
347d0 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 6f 70  me = 0;.      op
347e0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
347f0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
34800 28 20 28 63 3d 3d 27 6f 27 0a 20 20 20 20 20 20  ( (c=='o'.      
34810 20 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61 7a    && (strncmp(az
34820 41 72 67 5b 30 5d 2c 20 22 6f 75 74 70 75 74 22  Arg[0], "output"
34830 2c 20 6e 29 3d 3d 30 7c 7c 73 74 72 6e 63 6d 70  , n)==0||strncmp
34840 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 6e 63 65  (azArg[0], "once
34850 22 2c 20 6e 29 3d 3d 30 29 29 0a 20 20 20 7c 7c  ", n)==0)).   ||
34860 20 28 63 3d 3d 27 65 27 20 26 26 20 6e 3d 3d 35   (c=='e' && n==5
34870 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67   && strcmp(azArg
34880 5b 30 5d 2c 22 65 78 63 65 6c 22 29 3d 3d 30 29  [0],"excel")==0)
34890 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  .  ){.    const 
348a0 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 6e 41  char *zFile = nA
348b0 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d  rg>=2 ? azArg[1]
348c0 20 3a 20 22 73 74 64 6f 75 74 22 3b 0a 20 20 20   : "stdout";.   
348d0 20 69 6e 74 20 62 54 78 74 4d 6f 64 65 20 3d 20   int bTxtMode = 
348e0 30 3b 0a 20 20 20 20 69 66 28 20 61 7a 41 72 67  0;.    if( azArg
348f0 5b 30 5d 5b 30 5d 3d 3d 27 65 27 20 29 7b 0a 20  [0][0]=='e' ){. 
34900 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 6f 72       /* Transfor
34910 6d 20 74 68 65 20 22 2e 65 78 63 65 6c 22 20 63  m the ".excel" c
34920 6f 6d 6d 61 6e 64 20 69 6e 74 6f 20 22 2e 6f 6e  ommand into ".on
34930 63 65 20 2d 78 22 20 2a 2f 0a 20 20 20 20 20 20  ce -x" */.      
34940 6e 41 72 67 20 3d 20 32 3b 0a 20 20 20 20 20 20  nArg = 2;.      
34950 61 7a 41 72 67 5b 30 5d 20 3d 20 22 6f 6e 63 65  azArg[0] = "once
34960 22 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 20 3d  ";.      zFile =
34970 20 61 7a 41 72 67 5b 31 5d 20 3d 20 22 2d 78 22   azArg[1] = "-x"
34980 3b 0a 20 20 20 20 20 20 6e 20 3d 20 34 3b 0a 20  ;.      n = 4;. 
34990 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72     }.    if( nAr
349a0 67 3e 32 20 29 7b 0a 20 20 20 20 20 20 75 74 66  g>2 ){.      utf
349b0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
349c0 20 22 55 73 61 67 65 3a 20 2e 25 73 20 5b 2d 65   "Usage: .%s [-e
349d0 7c 2d 78 7c 46 49 4c 45 5d 5c 6e 22 2c 20 61 7a  |-x|FILE]\n", az
349e0 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 72  Arg[0]);.      r
349f0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
34a00 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
34a10 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  xit;.    }.    i
34a20 66 28 20 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d  f( n>1 && strncm
34a30 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 6e 63  p(azArg[0], "onc
34a40 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
34a50 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b     if( nArg<2 ){
34a60 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
34a70 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
34a80 67 65 3a 20 2e 6f 6e 63 65 20 28 2d 65 7c 2d 78  ge: .once (-e|-x
34a90 7c 46 49 4c 45 29 5c 6e 22 29 3b 0a 20 20 20 20  |FILE)\n");.    
34aa0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
34ab0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
34ac0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
34ad0 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74    }.      p->out
34ae0 43 6f 75 6e 74 20 3d 20 32 3b 0a 20 20 20 20 7d  Count = 2;.    }
34af0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f  else{.      p->o
34b00 75 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  utCount = 0;.   
34b10 20 7d 0a 20 20 20 20 6f 75 74 70 75 74 5f 72 65   }.    output_re
34b20 73 65 74 28 70 29 3b 0a 20 20 20 20 69 66 28 20  set(p);.    if( 
34b30 7a 46 69 6c 65 5b 30 5d 3d 3d 27 2d 27 20 26 26  zFile[0]=='-' &&
34b40 20 7a 46 69 6c 65 5b 31 5d 3d 3d 27 2d 27 20 29   zFile[1]=='-' )
34b50 20 7a 46 69 6c 65 2b 2b 3b 0a 23 69 66 6e 64 65   zFile++;.#ifnde
34b60 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f  f SQLITE_NOHAVE_
34b70 53 59 53 54 45 4d 0a 20 20 20 20 69 66 28 20 73  SYSTEM.    if( s
34b80 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 2d 65  trcmp(zFile, "-e
34b90 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28  ")==0 || strcmp(
34ba0 7a 46 69 6c 65 2c 20 22 2d 78 22 29 3d 3d 30 20  zFile, "-x")==0 
34bb0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 64 6f 58 64  ){.      p->doXd
34bc0 67 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  gOpen = 1;.     
34bd0 20 6f 75 74 70 75 74 4d 6f 64 65 50 75 73 68 28   outputModePush(
34be0 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46  p);.      if( zF
34bf0 69 6c 65 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20  ile[1]=='x' ){. 
34c00 20 20 20 20 20 20 20 6e 65 77 54 65 6d 70 46 69         newTempFi
34c10 6c 65 28 70 2c 20 22 63 73 76 22 29 3b 0a 20 20  le(p, "csv");.  
34c20 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
34c30 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20 20 20 20  MODE_Csv;.      
34c40 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
34c50 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c  tf(sizeof(p->col
34c60 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63  Separator), p->c
34c70 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  olSeparator, SEP
34c80 5f 43 6f 6d 6d 61 29 3b 0a 20 20 20 20 20 20 20  _Comma);.       
34c90 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
34ca0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53  f(sizeof(p->rowS
34cb0 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f  eparator), p->ro
34cc0 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  wSeparator, SEP_
34cd0 43 72 4c 66 29 3b 0a 20 20 20 20 20 20 7d 65 6c  CrLf);.      }el
34ce0 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 54  se{.        newT
34cf0 65 6d 70 46 69 6c 65 28 70 2c 20 22 74 78 74 22  empFile(p, "txt"
34d00 29 3b 0a 20 20 20 20 20 20 20 20 62 54 78 74 4d  );.        bTxtM
34d10 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ode = 1;.      }
34d20 0a 20 20 20 20 20 20 7a 46 69 6c 65 20 3d 20 70  .      zFile = p
34d30 2d 3e 7a 54 65 6d 70 46 69 6c 65 3b 0a 20 20 20  ->zTempFile;.   
34d40 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
34d50 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45  ITE_NOHAVE_SYSTE
34d60 4d 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 46 69  M */.    if( zFi
34d70 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69  le[0]=='|' ){.#i
34d80 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
34d90 5f 50 4f 50 45 4e 0a 20 20 20 20 20 20 72 61 77  _POPEN.      raw
34da0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
34db0 22 45 72 72 6f 72 3a 20 70 69 70 65 73 20 61 72  "Error: pipes ar
34dc0 65 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  e not supported 
34dd0 69 6e 20 74 68 69 73 20 4f 53 5c 6e 22 29 3b 0a  in this OS\n");.
34de0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
34df0 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64      p->out = std
34e00 6f 75 74 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  out;.#else.     
34e10 20 70 2d 3e 6f 75 74 20 3d 20 70 6f 70 65 6e 28   p->out = popen(
34e20 7a 46 69 6c 65 20 2b 20 31 2c 20 22 77 22 29 3b  zFile + 1, "w");
34e30 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 75  .      if( p->ou
34e40 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
34e50 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
34e60 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  rr,"Error: canno
34e70 74 20 6f 70 65 6e 20 70 69 70 65 20 5c 22 25 73  t open pipe \"%s
34e80 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 20 2b 20 31  \"\n", zFile + 1
34e90 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 75  );.        p->ou
34ea0 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20  t = stdout;.    
34eb0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
34ec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34ed0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
34ee0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66  f(sizeof(p->outf
34ef0 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65  ile), p->outfile
34f00 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a  , "%s", zFile);.
34f10 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
34f20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34f30 70 2d 3e 6f 75 74 20 3d 20 6f 75 74 70 75 74 5f  p->out = output_
34f40 66 69 6c 65 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c  file_open(zFile,
34f50 20 62 54 78 74 4d 6f 64 65 29 3b 0a 20 20 20 20   bTxtMode);.    
34f60 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20    if( p->out==0 
34f70 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
34f80 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22 6f 66 66  trcmp(zFile,"off
34f90 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")!=0 ){.       
34fa0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
34fb0 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 63 61  tderr,"Error: ca
34fc0 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 5c 22  nnot write to \"
34fd0 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b  %s\"\n", zFile);
34fe0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34ff0 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f     p->out = stdo
35000 75 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ut;.        rc =
35010 20 31 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   1;.      } else
35020 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
35030 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
35040 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20  of(p->outfile), 
35050 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22 25 73 22  p->outfile, "%s"
35060 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  , zFile);.      
35070 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
35080 0a 20 20 69 66 28 20 63 3d 3d 27 70 27 20 26 26  .  if( c=='p' &&
35090 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
350a0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70 72 69 6e  (azArg[0], "prin
350b0 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  t", n)==0 ){.   
350c0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
350d0 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=1; i<nArg; i++
350e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 31  ){.      if( i>1
350f0 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d   ) raw_printf(p-
35100 3e 6f 75 74 2c 20 22 20 22 29 3b 0a 20 20 20 20  >out, " ");.    
35110 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
35120 3e 6f 75 74 2c 20 22 25 73 22 2c 20 61 7a 41 72  >out, "%s", azAr
35130 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  g[i]);.    }.   
35140 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
35150 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 65 6c  ut, "\n");.  }el
35160 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70 27  se..  if( c=='p'
35170 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
35180 67 5b 30 5d 2c 20 22 70 72 6f 6d 70 74 22 2c 20  g[0], "prompt", 
35190 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
351a0 20 6e 41 72 67 20 3e 3d 20 32 29 20 7b 0a 20 20   nArg >= 2) {.  
351b0 20 20 20 20 73 74 72 6e 63 70 79 28 6d 61 69 6e      strncpy(main
351c0 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 31 5d 2c  Prompt,azArg[1],
351d0 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 6d  (int)ArraySize(m
351e0 61 69 6e 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20  ainPrompt)-1);. 
351f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72     }.    if( nAr
35200 67 20 3e 3d 20 33 29 20 7b 0a 20 20 20 20 20 20  g >= 3) {.      
35210 73 74 72 6e 63 70 79 28 63 6f 6e 74 69 6e 75 65  strncpy(continue
35220 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 32 5d 2c  Prompt,azArg[2],
35230 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 63  (int)ArraySize(c
35240 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 29 2d 31  ontinuePrompt)-1
35250 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
35260 0a 0a 20 20 69 66 28 20 63 3d 3d 27 71 27 20 26  ..  if( c=='q' &
35270 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
35280 30 5d 2c 20 22 71 75 69 74 22 2c 20 6e 29 3d 3d  0], "quit", n)==
35290 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 32 3b  0 ){.    rc = 2;
352a0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
352b0 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33 20 26  c=='r' && n>=3 &
352c0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
352d0 30 5d 2c 20 22 72 65 61 64 22 2c 20 6e 29 3d 3d  0], "read", n)==
352e0 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 61  0 ){.    FILE *a
352f0 6c 74 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  lt;.    if( nArg
35300 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77  !=2 ){.      raw
35310 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
35320 22 55 73 61 67 65 3a 20 2e 72 65 61 64 20 46 49  "Usage: .read FI
35330 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  LE\n");.      rc
35340 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
35350 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
35360 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6c  it;.    }.    al
35370 74 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b  t = fopen(azArg[
35380 31 5d 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69  1], "rb");.    i
35390 66 28 20 61 6c 74 3d 3d 30 20 29 7b 0a 20 20 20  f( alt==0 ){.   
353a0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
353b0 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 63 61  tderr,"Error: ca
353c0 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22  nnot open \"%s\"
353d0 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  \n", azArg[1]);.
353e0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
353f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
35400 63 20 3d 20 70 72 6f 63 65 73 73 5f 69 6e 70 75  c = process_inpu
35410 74 28 70 2c 20 61 6c 74 29 3b 0a 20 20 20 20 20  t(p, alt);.     
35420 20 66 63 6c 6f 73 65 28 61 6c 74 29 3b 0a 20 20   fclose(alt);.  
35430 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
35440 66 28 20 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d  f( c=='r' && n>=
35450 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
35460 72 67 5b 30 5d 2c 20 22 72 65 73 74 6f 72 65 22  rg[0], "restore"
35470 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
35480 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63 46  onst char *zSrcF
35490 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ile;.    const c
354a0 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20 20 73 71  har *zDb;.    sq
354b0 6c 69 74 65 33 20 2a 70 53 72 63 3b 0a 20 20 20  lite3 *pSrc;.   
354c0 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
354d0 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e  *pBackup;.    in
354e0 74 20 6e 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a  t nTimeout = 0;.
354f0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
35500 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 46 69   ){.      zSrcFi
35510 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  le = azArg[1];. 
35520 20 20 20 20 20 7a 44 62 20 3d 20 22 6d 61 69 6e       zDb = "main
35530 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
35540 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20   nArg==3 ){.    
35550 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 61 7a 41    zSrcFile = azA
35560 72 67 5b 32 5d 3b 0a 20 20 20 20 20 20 7a 44 62  rg[2];.      zDb
35570 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20   = azArg[1];.   
35580 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
35590 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
355a0 20 22 55 73 61 67 65 3a 20 2e 72 65 73 74 6f 72   "Usage: .restor
355b0 65 20 3f 44 42 3f 20 46 49 4c 45 5c 6e 22 29 3b  e ?DB? FILE\n");
355c0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
355d0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
355e0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
355f0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
35600 74 65 33 5f 6f 70 65 6e 28 7a 53 72 63 46 69 6c  te3_open(zSrcFil
35610 65 2c 20 26 70 53 72 63 29 3b 0a 20 20 20 20 69  e, &pSrc);.    i
35620 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
35630 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
35640 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
35650 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  rror: cannot ope
35660 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 53 72  n \"%s\"\n", zSr
35670 63 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 63 6c  cFile);.      cl
35680 6f 73 65 5f 64 62 28 70 53 72 63 29 3b 0a 20 20  ose_db(pSrc);.  
35690 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
356a0 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28    }.    open_db(
356b0 70 2c 20 30 29 3b 0a 20 20 20 20 70 42 61 63 6b  p, 0);.    pBack
356c0 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  up = sqlite3_bac
356d0 6b 75 70 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  kup_init(p->db, 
356e0 7a 44 62 2c 20 70 53 72 63 2c 20 22 6d 61 69 6e  zDb, pSrc, "main
356f0 22 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63  ");.    if( pBac
35700 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  kup==0 ){.      
35710 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
35720 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
35730 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
35740 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
35750 20 63 6c 6f 73 65 5f 64 62 28 70 53 72 63 29 3b   close_db(pSrc);
35760 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
35770 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
35780 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  ( (rc = sqlite3_
35790 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63  backup_step(pBac
357a0 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54  kup,100))==SQLIT
357b0 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 7c  E_OK.          |
357c0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  | rc==SQLITE_BUS
357d0 59 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  Y  ){.      if( 
357e0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
357f0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
35800 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33 20 29  Timeout++ >= 3 )
35810 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
35820 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30  sqlite3_sleep(10
35830 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
35840 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61  }.    sqlite3_ba
35850 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63  ckup_finish(pBac
35860 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  kup);.    if( rc
35870 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
35880 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  .      rc = 0;. 
35890 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
358a0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
358b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rc==SQLITE_LOCKE
358c0 44 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  D ){.      raw_p
358d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
358e0 72 72 6f 72 3a 20 73 6f 75 72 63 65 20 64 61 74  rror: source dat
358f0 61 62 61 73 65 20 69 73 20 62 75 73 79 5c 6e 22  abase is busy\n"
35900 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
35910 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
35920 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
35930 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
35940 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
35950 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
35960 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
35970 0a 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 53  .    close_db(pS
35980 72 63 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  rc);.  }else..  
35990 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74  if( c=='s' && st
359a0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
359b0 22 73 63 61 6e 73 74 61 74 73 22 2c 20 6e 29 3d  "scanstats", n)=
359c0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
359d0 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 70  rg==2 ){.      p
359e0 2d 3e 73 63 61 6e 73 74 61 74 73 4f 6e 20 3d 20  ->scanstatsOn = 
359f0 28 75 38 29 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  (u8)booleanValue
35a00 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 69 66 6e  (azArg[1]);.#ifn
35a10 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
35a20 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
35a30 53 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  S.      raw_prin
35a40 74 66 28 73 74 64 65 72 72 2c 20 22 57 61 72 6e  tf(stderr, "Warn
35a50 69 6e 67 3a 20 2e 73 63 61 6e 73 74 61 74 73 20  ing: .scanstats 
35a60 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  not available in
35a70 20 74 68 69 73 20 62 75 69 6c 64 2e 5c 6e 22 29   this build.\n")
35a80 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
35a90 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
35aa0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
35ab0 61 67 65 3a 20 2e 73 63 61 6e 73 74 61 74 73 20  age: .scanstats 
35ac0 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20  on|off\n");.    
35ad0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
35ae0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
35af0 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70  =='s' && strncmp
35b00 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 63 68 65  (azArg[0], "sche
35b10 6d 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ma", n)==0 ){.  
35b20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 53 65 6c    ShellText sSel
35b30 65 63 74 3b 0a 20 20 20 20 53 68 65 6c 6c 53 74  ect;.    ShellSt
35b40 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68  ate data;.    ch
35b50 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
35b60 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
35b70 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20 20 20  *zDiv = "(";.   
35b80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
35b90 6d 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  me = 0;.    int 
35ba0 69 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20  iSchema = 0;.   
35bb0 20 69 6e 74 20 62 44 65 62 75 67 20 3d 20 30 3b   int bDebug = 0;
35bc0 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20  .    int ii;..  
35bd0 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
35be0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
35bf0 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74  a, p, sizeof(dat
35c00 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68  a));.    data.sh
35c10 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  owHeader = 0;.  
35c20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64    data.cMode = d
35c30 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f  ata.mode = MODE_
35c40 53 65 6d 69 3b 0a 20 20 20 20 69 6e 69 74 54 65  Semi;.    initTe
35c50 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20  xt(&sSelect);.  
35c60 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e    for(ii=1; ii<n
35c70 41 72 67 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Arg; ii++){.    
35c80 20 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63    if( optionMatc
35c90 68 28 61 7a 41 72 67 5b 69 69 5d 2c 22 69 6e 64  h(azArg[ii],"ind
35ca0 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 20  ent") ){.       
35cb0 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61   data.cMode = da
35cc0 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 50  ta.mode = MODE_P
35cd0 72 65 74 74 79 3b 0a 20 20 20 20 20 20 7d 65 6c  retty;.      }el
35ce0 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74  se if( optionMat
35cf0 63 68 28 61 7a 41 72 67 5b 69 69 5d 2c 22 64 65  ch(azArg[ii],"de
35d00 62 75 67 22 29 20 29 7b 0a 20 20 20 20 20 20 20  bug") ){.       
35d10 20 62 44 65 62 75 67 20 3d 20 31 3b 0a 20 20 20   bDebug = 1;.   
35d20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4e 61     }else if( zNa
35d30 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
35d40 20 7a 4e 61 6d 65 20 3d 20 61 7a 41 72 67 5b 69   zName = azArg[i
35d50 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  i];.      }else{
35d60 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
35d70 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
35d80 67 65 3a 20 2e 73 63 68 65 6d 61 20 3f 2d 2d 69  ge: .schema ?--i
35d90 6e 64 65 6e 74 3f 20 3f 4c 49 4b 45 2d 50 41 54  ndent? ?LIKE-PAT
35da0 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20  TERN?\n");.     
35db0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
35dc0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
35dd0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
35de0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
35df0 20 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20   zName!=0 ){.   
35e00 20 20 20 69 6e 74 20 69 73 4d 61 73 74 65 72 20     int isMaster 
35e10 3d 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  = sqlite3_strlik
35e20 65 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  e(zName, "sqlite
35e30 5f 6d 61 73 74 65 72 22 2c 20 27 5c 5c 27 29 3d  _master", '\\')=
35e40 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73  =0;.      if( is
35e50 4d 61 73 74 65 72 20 7c 7c 20 73 71 6c 69 74 65  Master || sqlite
35e60 33 5f 73 74 72 6c 69 6b 65 28 7a 4e 61 6d 65 2c  3_strlike(zName,
35e70 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73  "sqlite_temp_mas
35e80 74 65 72 22 2c 20 27 5c 5c 27 29 3d 3d 30 20 29  ter", '\\')==0 )
35e90 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
35ea0 6e 65 77 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e 65  new_argv[2], *ne
35eb0 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20 20  w_colv[2];.     
35ec0 20 20 20 6e 65 77 5f 61 72 67 76 5b 30 5d 20 3d     new_argv[0] =
35ed0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
35ee0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
35ef0 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
35f00 54 41 42 4c 45 20 25 73 20 28 5c 6e 22 0a 20 20  TABLE %s (\n".  
35f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f20 20 20 20 20 22 20 20 74 79 70 65 20 74 65 78 74      "  type text
35f30 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ,\n".           
35f40 20 20 20 20 20 20 20 20 20 20 20 22 20 20 6e 61             "  na
35f50 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  me text,\n".    
35f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f70 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65 20 74 65    "  tbl_name te
35f80 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  xt,\n".         
35f90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
35fa0 72 6f 6f 74 70 61 67 65 20 69 6e 74 65 67 65 72  rootpage integer
35fb0 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ,\n".           
35fc0 20 20 20 20 20 20 20 20 20 20 20 22 20 20 73 71             "  sq
35fd0 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20 20 20 20  l text\n".      
35fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ff0 22 29 22 2c 20 69 73 4d 61 73 74 65 72 20 3f 20  ")", isMaster ? 
36000 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20  "sqlite_master" 
36010 3a 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  : "sqlite_temp_m
36020 61 73 74 65 72 22 29 3b 0a 20 20 20 20 20 20 20  aster");.       
36030 20 6e 65 77 5f 61 72 67 76 5b 31 5d 20 3d 20 30   new_argv[1] = 0
36040 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f  ;.        new_co
36050 6c 76 5b 30 5d 20 3d 20 22 73 71 6c 22 3b 0a 20  lv[0] = "sql";. 
36060 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b         new_colv[
36070 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  1] = 0;.        
36080 63 61 6c 6c 62 61 63 6b 28 26 64 61 74 61 2c 20  callback(&data, 
36090 31 2c 20 6e 65 77 5f 61 72 67 76 2c 20 6e 65 77  1, new_argv, new
360a0 5f 63 6f 6c 76 29 3b 0a 20 20 20 20 20 20 20 20  _colv);.        
360b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6e 65 77  sqlite3_free(new
360c0 5f 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  _argv[0]);.     
360d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
360e0 20 7a 44 69 76 20 29 7b 0a 20 20 20 20 20 20 73   zDiv ){.      s
360f0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
36100 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  mt = 0;.      rc
36110 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
36120 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 22 53 45  re_v2(p->db, "SE
36130 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 70  LECT name FROM p
36140 72 61 67 6d 61 5f 64 61 74 61 62 61 73 65 5f 6c  ragma_database_l
36150 69 73 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ist",.          
36160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36170 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20      -1, &pStmt, 
36180 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
36190 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
361a0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
361b0 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73  "Error: %s\n", s
361c0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
361d0 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 73  >db));.        s
361e0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
361f0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
36200 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
36210 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
36220 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
36230 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
36240 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45 4c 45  (&sSelect, "SELE
36250 43 54 20 73 71 6c 20 46 52 4f 4d 22 2c 20 30 29  CT sql FROM", 0)
36260 3b 0a 20 20 20 20 20 20 69 53 63 68 65 6d 61 20  ;.      iSchema 
36270 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 0;.      while
36280 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
36290 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
362a0 57 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  W ){.        con
362b0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 28  st char *zDb = (
362c0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
362d0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
362e0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
362f0 20 20 20 63 68 61 72 20 7a 53 63 4e 75 6d 5b 33     char zScNum[3
36300 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0];.        sqli
36310 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
36320 65 6f 66 28 7a 53 63 4e 75 6d 29 2c 20 7a 53 63  eof(zScNum), zSc
36330 4e 75 6d 2c 20 22 25 64 22 2c 20 2b 2b 69 53 63  Num, "%d", ++iSc
36340 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 61  hema);.        a
36350 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
36360 63 74 2c 20 7a 44 69 76 2c 20 30 29 3b 0a 20 20  ct, zDiv, 0);.  
36370 20 20 20 20 20 20 7a 44 69 76 20 3d 20 22 20 55        zDiv = " U
36380 4e 49 4f 4e 20 41 4c 4c 20 22 3b 0a 20 20 20 20  NION ALL ";.    
36390 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
363a0 73 53 65 6c 65 63 74 2c 20 22 53 45 4c 45 43 54  sSelect, "SELECT
363b0 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d   shell_add_schem
363c0 61 28 73 71 6c 2c 22 2c 20 30 29 3b 0a 20 20 20  a(sql,", 0);.   
363d0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
363e0 5f 73 74 72 69 63 6d 70 28 7a 44 62 2c 20 22 6d  _stricmp(zDb, "m
363f0 61 69 6e 22 29 21 3d 30 20 29 7b 0a 20 20 20 20  ain")!=0 ){.    
36400 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
36410 28 26 73 53 65 6c 65 63 74 2c 20 7a 44 62 2c 20  (&sSelect, zDb, 
36420 27 22 27 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  '"');.        }e
36430 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
36440 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
36450 63 74 2c 20 22 4e 55 4c 4c 22 2c 20 30 29 3b 0a  ct, "NULL", 0);.
36460 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36470 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
36480 65 6c 65 63 74 2c 20 22 2c 6e 61 6d 65 29 20 41  elect, ",name) A
36490 53 20 73 71 6c 2c 20 74 79 70 65 2c 20 74 62 6c  S sql, type, tbl
364a0 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f 77  _name, name, row
364b0 69 64 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  id,", 0);.      
364c0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
364d0 65 6c 65 63 74 2c 20 7a 53 63 4e 75 6d 2c 20 30  elect, zScNum, 0
364e0 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  );.        appen
364f0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
36500 22 20 41 53 20 73 6e 75 6d 2c 20 22 2c 20 30 29  " AS snum, ", 0)
36510 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ;.        append
36520 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a  Text(&sSelect, z
36530 44 62 2c 20 27 5c 27 27 29 3b 0a 20 20 20 20 20  Db, '\'');.     
36540 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
36550 53 65 6c 65 63 74 2c 20 22 20 41 53 20 73 6e 61  Select, " AS sna
36560 6d 65 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20  me FROM ", 0);. 
36570 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
36580 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44 62 2c  t(&sSelect, zDb,
36590 20 27 22 27 29 3b 0a 20 20 20 20 20 20 20 20 61   '"');.        a
365a0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
365b0 63 74 2c 20 22 2e 73 71 6c 69 74 65 5f 6d 61 73  ct, ".sqlite_mas
365c0 74 65 72 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ter", 0);.      
365d0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
365e0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
365f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
36600 4e 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50 52 41  NTROSPECTION_PRA
36610 47 4d 41 53 0a 20 20 20 20 20 20 69 66 28 20 7a  GMAS.      if( z
36620 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
36630 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
36640 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ect,.           
36650 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  " UNION ALL SELE
36660 43 54 20 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f  CT shell_module_
36670 73 63 68 65 6d 61 28 6e 61 6d 65 29 2c 22 0a 20  schema(name),". 
36680 20 20 20 20 20 20 20 20 20 20 22 20 27 74 61 62            " 'tab
36690 6c 65 27 2c 20 6e 61 6d 65 2c 20 6e 61 6d 65 2c  le', name, name,
366a0 20 6e 61 6d 65 2c 20 39 65 2b 39 39 2c 20 27 6d   name, 9e+99, 'm
366b0 61 69 6e 27 20 46 52 4f 4d 20 70 72 61 67 6d 61  ain' FROM pragma
366c0 5f 6d 6f 64 75 6c 65 5f 6c 69 73 74 22 2c 20 30  _module_list", 0
366d0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
366e0 66 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  f.      appendTe
366f0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 29 20  xt(&sSelect, ") 
36700 57 48 45 52 45 20 22 2c 20 30 29 3b 0a 20 20 20  WHERE ", 0);.   
36710 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a     if( zName ){.
36720 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51          char *zQ
36730 61 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  arg = sqlite3_mp
36740 72 69 6e 74 66 28 22 25 51 22 2c 20 7a 4e 61 6d  rintf("%Q", zNam
36750 65 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  e);.        int 
36760 62 47 6c 6f 62 20 3d 20 73 74 72 63 68 72 28 7a  bGlob = strchr(z
36770 4e 61 6d 65 2c 20 27 2a 27 29 20 21 3d 20 30 20  Name, '*') != 0 
36780 7c 7c 20 73 74 72 63 68 72 28 7a 4e 61 6d 65 2c  || strchr(zName,
36790 20 27 3f 27 29 20 21 3d 20 30 20 7c 7c 0a 20 20   '?') != 0 ||.  
367a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
367b0 20 20 73 74 72 63 68 72 28 7a 4e 61 6d 65 2c 20    strchr(zName, 
367c0 27 5b 27 29 20 21 3d 20 30 3b 0a 20 20 20 20 20  '[') != 0;.     
367d0 20 20 20 69 66 28 20 73 74 72 63 68 72 28 7a 4e     if( strchr(zN
367e0 61 6d 65 2c 20 27 2e 27 29 20 29 7b 0a 20 20 20  ame, '.') ){.   
367f0 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
36800 74 28 26 73 53 65 6c 65 63 74 2c 20 22 6c 6f 77  t(&sSelect, "low
36810 65 72 28 70 72 69 6e 74 66 28 27 25 73 2e 25 73  er(printf('%s.%s
36820 27 2c 73 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65  ',sname,tbl_name
36830 29 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ))", 0);.       
36840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
36850 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
36860 65 6c 65 63 74 2c 20 22 6c 6f 77 65 72 28 74 62  elect, "lower(tb
36870 6c 5f 6e 61 6d 65 29 22 2c 20 30 29 3b 0a 20 20  l_name)", 0);.  
36880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36890 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
368a0 65 63 74 2c 20 62 47 6c 6f 62 20 3f 20 22 20 47  ect, bGlob ? " G
368b0 4c 4f 42 20 22 20 3a 20 22 20 4c 49 4b 45 20 22  LOB " : " LIKE "
368c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70  , 0);.        ap
368d0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
368e0 74 2c 20 7a 51 61 72 67 2c 20 30 29 3b 0a 20 20  t, zQarg, 0);.  
368f0 20 20 20 20 20 20 69 66 28 20 21 62 47 6c 6f 62        if( !bGlob
36900 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70   ){.          ap
36910 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
36920 74 2c 20 22 20 45 53 43 41 50 45 20 27 5c 5c 27  t, " ESCAPE '\\'
36930 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   ", 0);.        
36940 7d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  }.        append
36950 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
36960 20 41 4e 44 20 22 2c 20 30 29 3b 0a 20 20 20 20   AND ", 0);.    
36970 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
36980 28 7a 51 61 72 67 29 3b 0a 20 20 20 20 20 20 7d  (zQarg);.      }
36990 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
369a0 74 28 26 73 53 65 6c 65 63 74 2c 20 22 74 79 70  t(&sSelect, "typ
369b0 65 21 3d 27 6d 65 74 61 27 20 41 4e 44 20 73 71  e!='meta' AND sq
369c0 6c 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20  l IS NOT NULL". 
369d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
369e0 20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45            " ORDE
369f0 52 20 42 59 20 73 6e 75 6d 2c 20 72 6f 77 69 64  R BY snum, rowid
36a00 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ", 0);.      if(
36a10 20 62 44 65 62 75 67 20 29 7b 0a 20 20 20 20 20   bDebug ){.     
36a20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
36a30 2d 3e 6f 75 74 2c 20 22 53 51 4c 3a 20 25 73 3b  ->out, "SQL: %s;
36a40 5c 6e 22 2c 20 73 53 65 6c 65 63 74 2e 7a 29 3b  \n", sSelect.z);
36a50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
36a60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36a70 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 73  e3_exec(p->db, s
36a80 53 65 6c 65 63 74 2e 7a 2c 20 63 61 6c 6c 62 61  Select.z, callba
36a90 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
36aa0 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Msg);.      }.  
36ab0 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73 53      freeText(&sS
36ac0 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20  elect);.    }.  
36ad0 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
36ae0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
36af0 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
36b00 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
36b10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
36b20 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
36b30 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
36b40 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20 21    }else if( rc !
36b50 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  = SQLITE_OK ){. 
36b60 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
36b70 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 71  stderr,"Error: q
36b80 75 65 72 79 69 6e 67 20 73 63 68 65 6d 61 20 69  uerying schema i
36b90 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e 22 29 3b 0a  nformation\n");.
36ba0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
36bb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
36bc0 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 0;.    }.  }
36bd0 65 6c 73 65 0a 0a 23 69 66 20 64 65 66 69 6e 65  else..#if define
36be0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
36bf0 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
36c00 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54  E_ENABLE_SELECTT
36c10 52 41 43 45 29 0a 20 20 69 66 28 20 63 3d 3d 27  RACE).  if( c=='
36c20 73 27 20 26 26 20 6e 3d 3d 31 31 20 26 26 20 73  s' && n==11 && s
36c30 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
36c40 20 22 73 65 6c 65 63 74 74 72 61 63 65 22 2c 20   "selecttrace", 
36c50 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  n)==0 ){.    sql
36c60 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
36c70 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61  = (int)integerVa
36c80 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
36c90 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23   }else.#endif..#
36ca0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
36cb0 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e  E_ENABLE_SESSION
36cc0 29 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ).  if( c=='s' &
36cd0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
36ce0 30 5d 2c 22 73 65 73 73 69 6f 6e 22 2c 6e 29 3d  0],"session",n)=
36cf0 3d 30 20 26 26 20 6e 3e 3d 33 20 29 7b 0a 20 20  =0 && n>=3 ){.  
36d00 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70    OpenSession *p
36d10 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53  Session = &p->aS
36d20 65 73 73 69 6f 6e 5b 30 5d 3b 0a 20 20 20 20 63  ession[0];.    c
36d30 68 61 72 20 2a 2a 61 7a 43 6d 64 20 3d 20 26 61  har **azCmd = &a
36d40 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 69 6e 74  zArg[1];.    int
36d50 20 69 53 65 73 20 3d 20 30 3b 0a 20 20 20 20 69   iSes = 0;.    i
36d60 6e 74 20 6e 43 6d 64 20 3d 20 6e 41 72 67 20 2d  nt nCmd = nArg -
36d70 20 31 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   1;.    int i;. 
36d80 20 20 20 69 66 28 20 6e 41 72 67 3c 3d 31 20 29     if( nArg<=1 )
36d90 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79   goto session_sy
36da0 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
36db0 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
36dc0 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29     if( nArg>=3 )
36dd0 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 73  {.      for(iSes
36de0 3d 30 3b 20 69 53 65 73 3c 70 2d 3e 6e 53 65 73  =0; iSes<p->nSes
36df0 73 69 6f 6e 3b 20 69 53 65 73 2b 2b 29 7b 0a 20  sion; iSes++){. 
36e00 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
36e10 70 28 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 53  p(p->aSession[iS
36e20 65 73 5d 2e 7a 4e 61 6d 65 2c 20 61 7a 41 72 67  es].zName, azArg
36e30 5b 31 5d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  [1])==0 ) break;
36e40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
36e50 66 28 20 69 53 65 73 3c 70 2d 3e 6e 53 65 73 73  f( iSes<p->nSess
36e60 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ion ){.        p
36e70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53  Session = &p->aS
36e80 65 73 73 69 6f 6e 5b 69 53 65 73 5d 3b 0a 20 20  ession[iSes];.  
36e90 20 20 20 20 20 20 61 7a 43 6d 64 2b 2b 3b 0a 20        azCmd++;. 
36ea0 20 20 20 20 20 20 20 6e 43 6d 64 2d 2d 3b 0a 20         nCmd--;. 
36eb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
36ec0 20 20 20 20 70 53 65 73 73 69 6f 6e 20 3d 20 26      pSession = &
36ed0 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 30 5d 3b 0a  p->aSession[0];.
36ee0 20 20 20 20 20 20 20 20 69 53 65 73 20 3d 20 30          iSes = 0
36ef0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36f00 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e  .    /* .session
36f10 20 61 74 74 61 63 68 20 54 41 42 4c 45 0a 20 20   attach TABLE.  
36f20 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    ** Invoke the 
36f30 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 61  sqlite3session_a
36f40 74 74 61 63 68 28 29 20 69 6e 74 65 72 66 61 63  ttach() interfac
36f50 65 20 74 6f 20 61 74 74 61 63 68 20 61 20 70 61  e to attach a pa
36f60 72 74 69 63 75 6c 61 72 0a 20 20 20 20 2a 2a 20  rticular.    ** 
36f70 74 61 62 6c 65 20 73 6f 20 74 68 61 74 20 69 74  table so that it
36f80 20 69 73 20 6e 65 76 65 72 20 66 69 6c 74 65 72   is never filter
36f90 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
36fa0 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b  f( strcmp(azCmd[
36fb0 30 5d 2c 22 61 74 74 61 63 68 22 29 3d 3d 30 20  0],"attach")==0 
36fc0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d  ){.      if( nCm
36fd0 64 21 3d 32 20 29 20 67 6f 74 6f 20 73 65 73 73  d!=2 ) goto sess
36fe0 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  ion_syntax_error
36ff0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 73  ;.      if( pSes
37000 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29 7b 0a 20 20  sion->p==0 ){.  
37010 20 20 20 20 20 20 73 65 73 73 69 6f 6e 5f 6e 6f        session_no
37020 74 5f 6f 70 65 6e 3a 0a 20 20 20 20 20 20 20 20  t_open:.        
37030 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
37040 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 20 73 65  r, "ERROR: No se
37050 73 73 69 6f 6e 73 20 61 72 65 20 6f 70 65 6e 5c  ssions are open\
37060 6e 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n");.      }else
37070 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
37080 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 61 74  qlite3session_at
37090 74 61 63 68 28 70 53 65 73 73 69 6f 6e 2d 3e 70  tach(pSession->p
370a0 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20  , azCmd[1]);.   
370b0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
370c0 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
370d0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 52 52  ntf(stderr, "ERR
370e0 4f 52 3a 20 73 71 6c 69 74 65 33 73 65 73 73 69  OR: sqlite3sessi
370f0 6f 6e 5f 61 74 74 61 63 68 28 29 20 72 65 74 75  on_attach() retu
37100 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a  rns %d\n", rc);.
37110 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 30            rc = 0
37120 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37130 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20    }.    }else.. 
37140 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 63     /* .session c
37150 68 61 6e 67 65 73 65 74 20 46 49 4c 45 0a 20 20  hangeset FILE.  
37160 20 20 2a 2a 20 2e 73 65 73 73 69 6f 6e 20 70 61    ** .session pa
37170 74 63 68 73 65 74 20 46 49 4c 45 0a 20 20 20 20  tchset FILE.    
37180 2a 2a 20 57 72 69 74 65 20 61 20 63 68 61 6e 67  ** Write a chang
37190 65 73 65 74 20 6f 72 20 70 61 74 63 68 73 65 74  eset or patchset
371a0 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 54   into a file.  T
371b0 68 65 20 66 69 6c 65 20 69 73 20 6f 76 65 72 77  he file is overw
371c0 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
371d0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
371e0 43 6d 64 5b 30 5d 2c 22 63 68 61 6e 67 65 73 65  Cmd[0],"changese
371f0 74 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70  t")==0 || strcmp
37200 28 61 7a 43 6d 64 5b 30 5d 2c 22 70 61 74 63 68  (azCmd[0],"patch
37210 73 65 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  set")==0 ){.    
37220 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 30 3b    FILE *out = 0;
37230 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64 21  .      if( nCmd!
37240 3d 32 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f  =2 ) goto sessio
37250 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  n_syntax_error;.
37260 20 20 20 20 20 20 69 66 28 20 70 53 65 73 73 69        if( pSessi
37270 6f 6e 2d 3e 70 3d 3d 30 20 29 20 67 6f 74 6f 20  on->p==0 ) goto 
37280 73 65 73 73 69 6f 6e 5f 6e 6f 74 5f 6f 70 65 6e  session_not_open
37290 3b 0a 20 20 20 20 20 20 6f 75 74 20 3d 20 66 6f  ;.      out = fo
372a0 70 65 6e 28 61 7a 43 6d 64 5b 31 5d 2c 20 22 77  pen(azCmd[1], "w
372b0 62 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  b");.      if( o
372c0 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
372d0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
372e0 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 63 61 6e  err, "ERROR: can
372f0 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20  not open \"%s\" 
37300 66 6f 72 20 77 72 69 74 69 6e 67 5c 6e 22 2c 20  for writing\n", 
37310 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20  azCmd[1]);.     
37320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
37330 69 6e 74 20 73 7a 43 68 6e 67 3b 0a 20 20 20 20  int szChng;.    
37340 20 20 20 20 76 6f 69 64 20 2a 70 43 68 6e 67 3b      void *pChng;
37350 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 7a 43  .        if( azC
37360 6d 64 5b 30 5d 5b 30 5d 3d 3d 27 63 27 20 29 7b  md[0][0]=='c' ){
37370 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
37380 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63  sqlite3session_c
37390 68 61 6e 67 65 73 65 74 28 70 53 65 73 73 69 6f  hangeset(pSessio
373a0 6e 2d 3e 70 2c 20 26 73 7a 43 68 6e 67 2c 20 26  n->p, &szChng, &
373b0 70 43 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20  pChng);.        
373c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
373d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73 65 73   rc = sqlite3ses
373e0 73 69 6f 6e 5f 70 61 74 63 68 73 65 74 28 70 53  sion_patchset(pS
373f0 65 73 73 69 6f 6e 2d 3e 70 2c 20 26 73 7a 43 68  ession->p, &szCh
37400 6e 67 2c 20 26 70 43 68 6e 67 29 3b 0a 20 20 20  ng, &pChng);.   
37410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
37420 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
37430 20 20 20 70 72 69 6e 74 66 28 22 45 72 72 6f 72     printf("Error
37440 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 25 64 5c  : error code %d\
37450 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  n", rc);.       
37460 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20     rc = 0;.     
37470 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
37480 20 70 43 68 6e 67 0a 20 20 20 20 20 20 20 20 20   pChng.         
37490 20 26 26 20 66 77 72 69 74 65 28 70 43 68 6e 67   && fwrite(pChng
374a0 2c 20 73 7a 43 68 6e 67 2c 20 31 2c 20 6f 75 74  , szChng, 1, out
374b0 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=1 ){.        
374c0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
374d0 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 46 61 69  err, "ERROR: Fai
374e0 6c 65 64 20 74 6f 20 77 72 69 74 65 20 65 6e 74  led to write ent
374f0 69 72 65 20 25 64 2d 62 79 74 65 20 6f 75 74 70  ire %d-byte outp
37500 75 74 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ut\n",.         
37510 20 20 20 20 20 20 20 20 20 73 7a 43 68 6e 67 29           szChng)
37520 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37530 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
37540 28 70 43 68 6e 67 29 3b 0a 20 20 20 20 20 20 20  (pChng);.       
37550 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
37560 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a      }.    }else.
37570 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e  .    /* .session
37580 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 43 6c   close.    ** Cl
37590 6f 73 65 20 74 68 65 20 69 64 65 6e 74 69 66 69  ose the identifi
375a0 65 64 20 73 65 73 73 69 6f 6e 0a 20 20 20 20 2a  ed session.    *
375b0 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  /.    if( strcmp
375c0 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 63 6c 6f 73  (azCmd[0], "clos
375d0 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
375e0 69 66 28 20 6e 43 6d 64 21 3d 31 20 29 20 67 6f  if( nCmd!=1 ) go
375f0 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61  to session_synta
37600 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69  x_error;.      i
37610 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29  f( p->nSession )
37620 7b 0a 20 20 20 20 20 20 20 20 73 65 73 73 69 6f  {.        sessio
37630 6e 5f 63 6c 6f 73 65 28 70 53 65 73 73 69 6f 6e  n_close(pSession
37640 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 53  );.        p->aS
37650 65 73 73 69 6f 6e 5b 69 53 65 73 5d 20 3d 20 70  ession[iSes] = p
37660 2d 3e 61 53 65 73 73 69 6f 6e 5b 2d 2d 70 2d 3e  ->aSession[--p->
37670 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20 20 20 20 20  nSession];.     
37680 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20   }.    }else..  
37690 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 65 6e    /* .session en
376a0 61 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 20  able ?BOOLEAN?. 
376b0 20 20 20 2a 2a 20 51 75 65 72 79 20 6f 72 20 73     ** Query or s
376c0 65 74 20 74 68 65 20 65 6e 61 62 6c 65 20 66 6c  et the enable fl
376d0 61 67 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ag.    */.    if
376e0 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30  ( strcmp(azCmd[0
376f0 5d 2c 20 22 65 6e 61 62 6c 65 22 29 3d 3d 30 20  ], "enable")==0 
37700 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
37710 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64 3e  .      if( nCmd>
37720 32 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e  2 ) goto session
37730 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20  _syntax_error;. 
37740 20 20 20 20 20 69 69 20 3d 20 6e 43 6d 64 3d 3d       ii = nCmd==
37750 31 20 3f 20 2d 31 20 3a 20 62 6f 6f 6c 65 61 6e  1 ? -1 : boolean
37760 56 61 6c 75 65 28 61 7a 43 6d 64 5b 31 5d 29 3b  Value(azCmd[1]);
37770 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
37780 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  ession ){.      
37790 20 20 69 69 20 3d 20 73 71 6c 69 74 65 33 73 65    ii = sqlite3se
377a0 73 73 69 6f 6e 5f 65 6e 61 62 6c 65 28 70 53 65  ssion_enable(pSe
377b0 73 73 69 6f 6e 2d 3e 70 2c 20 69 69 29 3b 0a 20  ssion->p, ii);.