/ Hex Artifact Content
Login

Artifact 2162b1dc99b806298207c9c202aa7b49ac8553b8b1e73bb28cd80d5a1861df39:


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 6e  ut graph */.  un
6be0: 73 69 67 6e 65 64 20 6d 45 71 70 4c 69 6e 65 73  signed mEqpLines
6bf0: 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
6c00: 76 65 72 69 74 69 63 61 6c 20 6c 69 6e 65 73 20  veritical lines 
6c10: 69 6e 20 74 68 65 20 45 51 50 20 6f 75 74 70 75  in the EQP outpu
6c20: 74 20 67 72 61 70 68 20 2a 2f 0a 20 20 69 6e 74  t graph */.  int
6c30: 20 6f 75 74 43 6f 75 6e 74 3b 20 20 20 20 20 20   outCount;      
6c40: 20 20 20 20 2f 2a 20 52 65 76 65 72 74 20 74 6f      /* Revert to
6c50: 20 73 74 64 6f 75 74 20 77 68 65 6e 20 72 65 61   stdout when rea
6c60: 63 68 69 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20 20  ching zero */.  
6c70: 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20  int cnt;        
6c80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6c90: 20 6f 66 20 72 65 63 6f 72 64 73 20 64 69 73 70   of records disp
6ca0: 6c 61 79 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  layed so far */.
6cb0: 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20    FILE *out;    
6cc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
6cd0: 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
6ce0: 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61 63 65 4f  /.  FILE *traceO
6cf0: 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 75  ut;        /* Ou
6d00: 74 70 75 74 20 66 6f 72 20 73 71 6c 69 74 65 33  tput for sqlite3
6d10: 5f 74 72 61 63 65 28 29 20 2a 2f 0a 20 20 69 6e  _trace() */.  in
6d20: 74 20 6e 45 72 72 3b 20 20 20 20 20 20 20 20 20  t nErr;         
6d30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6d40: 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f  f errors seen */
6d50: 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20 20 20  .  int mode;    
6d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
6d70: 6f 75 74 70 75 74 20 6d 6f 64 65 20 73 65 74 74  output mode sett
6d80: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64  ing */.  int mod
6d90: 65 50 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20  ePrior;         
6da0: 2f 2a 20 53 61 76 65 64 20 6d 6f 64 65 20 2a 2f  /* Saved mode */
6db0: 0a 20 20 69 6e 74 20 63 4d 6f 64 65 3b 20 20 20  .  int cMode;   
6dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 6d            /* tem
6dd0: 70 6f 72 61 72 79 20 6f 75 74 70 75 74 20 6d 6f  porary output mo
6de0: 64 65 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  de for the curre
6df0: 6e 74 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nt query */.  in
6e00: 74 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 20 20 20  t normalMode;   
6e10: 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6d       /* Output m
6e20: 6f 64 65 20 62 65 66 6f 72 65 20 22 2e 65 78 70  ode before ".exp
6e30: 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e  lain on" */.  in
6e40: 74 20 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  t writableSchema
6e50: 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  ;    /* True if 
6e60: 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
6e70: 73 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69  schema=ON */.  i
6e80: 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20  nt showHeader;  
6e90: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
6ea0: 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d   show column nam
6eb0: 65 73 20 69 6e 20 4c 69 73 74 20 6f 72 20 43 6f  es in List or Co
6ec0: 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 69  lumn mode */.  i
6ed0: 6e 74 20 6e 43 68 65 63 6b 3b 20 20 20 20 20 20  nt nCheck;      
6ee0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6ef0: 6f 66 20 22 2e 63 68 65 63 6b 22 20 63 6f 6d 6d  of ".check" comm
6f00: 61 6e 64 73 20 72 75 6e 20 2a 2f 0a 20 20 75 6e  ands run */.  un
6f10: 73 69 67 6e 65 64 20 73 68 65 6c 6c 46 6c 67 73  signed shellFlgs
6f20: 3b 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20  ;    /* Various 
6f30: 66 6c 61 67 73 20 2a 2f 0a 20 20 63 68 61 72 20  flags */.  char 
6f40: 2a 7a 44 65 73 74 54 61 62 6c 65 3b 20 20 20 20  *zDestTable;    
6f50: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 65 73    /* Name of des
6f60: 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 77  tination table w
6f70: 68 65 6e 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20  hen MODE_Insert 
6f80: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  */.  char *zTemp
6f90: 46 69 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  File;       /* T
6fa0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 74 68  emporary file th
6fb0: 61 74 20 6d 69 67 68 74 20 6e 65 65 64 20 64 65  at might need de
6fc0: 6c 65 74 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72  leting */.  char
6fd0: 20 7a 54 65 73 74 63 61 73 65 5b 33 30 5d 3b 20   zTestcase[30]; 
6fe0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 75     /* Name of cu
6ff0: 72 72 65 6e 74 20 74 65 73 74 20 63 61 73 65 20  rrent test case 
7000: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6c 53 65 70  */.  char colSep
7010: 61 72 61 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20 43  arator[20]; /* C
7020: 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20  olumn separator 
7030: 63 68 61 72 61 63 74 65 72 20 66 6f 72 20 73 65  character for se
7040: 76 65 72 61 6c 20 6d 6f 64 65 73 20 2a 2f 0a 20  veral modes */. 
7050: 20 63 68 61 72 20 72 6f 77 53 65 70 61 72 61 74   char rowSeparat
7060: 6f 72 5b 32 30 5d 3b 20 2f 2a 20 52 6f 77 20 73  or[20]; /* Row s
7070: 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
7080: 65 72 20 66 6f 72 20 4d 4f 44 45 5f 41 73 63 69  er for MODE_Asci
7090: 69 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6c 53  i */.  char colS
70a0: 65 70 50 72 69 6f 72 5b 32 30 5d 3b 20 20 2f 2a  epPrior[20];  /*
70b0: 20 53 61 76 65 64 20 63 6f 6c 75 6d 6e 20 73 65   Saved column se
70c0: 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20 63 68 61  parator */.  cha
70d0: 72 20 72 6f 77 53 65 70 50 72 69 6f 72 5b 32 30  r rowSepPrior[20
70e0: 5d 3b 20 20 2f 2a 20 53 61 76 65 64 20 72 6f 77  ];  /* Saved row
70f0: 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20   separator */.  
7100: 69 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31 30 30  int colWidth[100
7110: 5d 3b 20 20 20 20 20 2f 2a 20 52 65 71 75 65 73  ];     /* Reques
7120: 74 65 64 20 77 69 64 74 68 20 6f 66 20 65 61 63  ted width of eac
7130: 68 20 63 6f 6c 75 6d 6e 20 77 68 65 6e 20 69 6e  h column when in
7140: 20 63 6f 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a 20   column mode*/. 
7150: 20 69 6e 74 20 61 63 74 75 61 6c 57 69 64 74 68   int actualWidth
7160: 5b 31 30 30 5d 3b 20 20 2f 2a 20 41 63 74 75 61  [100];  /* Actua
7170: 6c 20 77 69 64 74 68 20 6f 66 20 65 61 63 68 20  l width of each 
7180: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72  column */.  char
7190: 20 6e 75 6c 6c 56 61 6c 75 65 5b 32 30 5d 3b 20   nullValue[20]; 
71a0: 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 74     /* The text t
71b0: 6f 20 70 72 69 6e 74 20 77 68 65 6e 20 61 20 4e  o print when a N
71c0: 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66  ULL comes back f
71d0: 72 6f 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rom.            
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
71f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
7200: 20 20 63 68 61 72 20 6f 75 74 66 69 6c 65 5b 46    char outfile[F
7210: 49 4c 45 4e 41 4d 45 5f 4d 41 58 5d 3b 20 2f 2a  ILENAME_MAX]; /*
7220: 20 46 69 6c 65 6e 61 6d 65 20 66 6f 72 20 2a 6f   Filename for *o
7230: 75 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ut */.  const ch
7240: 61 72 20 2a 7a 44 62 46 69 6c 65 6e 61 6d 65 3b  ar *zDbFilename;
7250: 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
7260: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
7270: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 72 65   */.  char *zFre
7280: 65 4f 6e 43 6c 6f 73 65 3b 20 20 20 20 20 20 20  eOnClose;       
7290: 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 74 6f    /* Filename to
72a0: 20 66 72 65 65 20 77 68 65 6e 20 63 6c 6f 73 69   free when closi
72b0: 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ng */.  const ch
72c0: 61 72 20 2a 7a 56 66 73 3b 20 20 20 20 20 20 20  ar *zVfs;       
72d0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56      /* Name of V
72e0: 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 73  FS to use */.  s
72f0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
7300: 6d 74 3b 20 20 20 2f 2a 20 43 75 72 72 65 6e 74  mt;   /* Current
7310: 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 61 6e   statement if an
7320: 79 2e 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 70 4c  y. */.  FILE *pL
7330: 6f 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  og;            /
7340: 2a 20 57 72 69 74 65 20 6c 6f 67 20 6f 75 74 70  * Write log outp
7350: 75 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ut here */.  int
7360: 20 2a 61 69 49 6e 64 65 6e 74 3b 20 20 20 20 20   *aiIndent;     
7370: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
7380: 69 6e 64 65 6e 74 73 20 75 73 65 64 20 69 6e 20  indents used in 
7390: 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 2a 2f 0a  MODE_Explain */.
73a0: 20 20 69 6e 74 20 6e 49 6e 64 65 6e 74 3b 20 20    int nIndent;  
73b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
73c0: 20 6f 66 20 61 72 72 61 79 20 61 69 49 6e 64 65   of array aiInde
73d0: 6e 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 49  nt[] */.  int iI
73e0: 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  ndent;          
73f0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75 72   /* Index of cur
7400: 72 65 6e 74 20 6f 70 20 69 6e 20 61 69 49 6e 64  rent op in aiInd
7410: 65 6e 74 5b 5d 20 2a 2f 0a 20 20 45 51 50 47 72  ent[] */.  EQPGr
7420: 61 70 68 20 73 47 72 61 70 68 3b 20 20 20 20 20  aph sGraph;     
7430: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
7440: 20 66 6f 72 20 74 68 65 20 67 72 61 70 68 69 63   for the graphic
7450: 61 6c 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  al EXPLAIN QUERY
7460: 20 50 4c 41 4e 20 2a 2f 0a 23 69 66 20 64 65 66   PLAN */.#if def
7470: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
7480: 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 69 6e  LE_SESSION).  in
7490: 74 20 6e 53 65 73 73 69 6f 6e 3b 20 20 20 20 20  t nSession;     
74a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
74b0: 72 20 6f 66 20 61 63 74 69 76 65 20 73 65 73 73  r of active sess
74c0: 69 6f 6e 73 20 2a 2f 0a 20 20 4f 70 65 6e 53 65  ions */.  OpenSe
74d0: 73 73 69 6f 6e 20 61 53 65 73 73 69 6f 6e 5b 34  ssion aSession[4
74e0: 5d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  ];  /* Array of 
74f0: 73 65 73 73 69 6f 6e 73 2e 20 20 5b 30 5d 20 69  sessions.  [0] i
7500: 73 20 69 6e 20 66 6f 63 75 73 2e 20 2a 2f 0a 23  s in focus. */.#
7510: 65 6e 64 69 66 0a 20 20 45 78 70 65 72 74 49 6e  endif.  ExpertIn
7520: 66 6f 20 65 78 70 65 72 74 3b 20 20 20 20 20 20  fo expert;      
7530: 20 20 2f 2a 20 56 61 6c 69 64 20 69 66 20 70 72    /* Valid if pr
7540: 65 76 69 6f 75 73 20 63 6f 6d 6d 61 6e 64 20 77  evious command w
7550: 61 73 20 22 2e 65 78 70 65 72 74 20 4f 50 54 2e  as ".expert OPT.
7560: 2e 2e 22 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 20 41  .." */.};.../* A
7570: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f  llowed values fo
7580: 72 20 53 68 65 6c 6c 53 74 61 74 65 2e 61 75 74  r ShellState.aut
7590: 6f 45 51 50 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  oEQP.*/.#define 
75a0: 41 55 54 4f 45 51 50 5f 6f 66 66 20 20 20 20 20  AUTOEQP_off     
75b0: 20 30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0           /* 
75c0: 41 75 74 6f 6d 61 74 69 63 20 45 58 50 4c 41 49  Automatic EXPLAI
75d0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 69 73 20  N QUERY PLAN is 
75e0: 6f 66 66 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41  off */.#define A
75f0: 55 54 4f 45 51 50 5f 6f 6e 20 20 20 20 20 20 20  UTOEQP_on       
7600: 31 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  1           /* A
7610: 75 74 6f 6d 61 74 69 63 20 45 51 50 20 69 73 20  utomatic EQP is 
7620: 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55  on */.#define AU
7630: 54 4f 45 51 50 5f 74 72 69 67 67 65 72 20 20 32  TOEQP_trigger  2
7640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
7650: 20 61 6e 64 20 61 6c 73 6f 20 73 68 6f 77 20 70   and also show p
7660: 6c 61 6e 73 20 66 6f 72 20 74 72 69 67 67 65 72  lans for trigger
7670: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54  s */.#define AUT
7680: 4f 45 51 50 5f 66 75 6c 6c 20 20 20 20 20 33 20  OEQP_full     3 
7690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6f            /* Sho
76a0: 77 20 66 75 6c 6c 20 45 58 50 4c 41 49 4e 20 2a  w full EXPLAIN *
76b0: 2f 0a 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61  /../* Allowed va
76c0: 6c 75 65 73 20 66 6f 72 20 53 68 65 6c 6c 53 74  lues for ShellSt
76d0: 61 74 65 2e 6f 70 65 6e 4d 6f 64 65 0a 2a 2f 0a  ate.openMode.*/.
76e0: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50  #define SHELL_OP
76f0: 45 4e 5f 55 4e 53 50 45 43 20 20 20 20 20 30 20  EN_UNSPEC     0 
7700: 20 20 20 20 20 2f 2a 20 4e 6f 20 6f 70 65 6e 2d       /* No open-
7710: 6d 6f 64 65 20 73 70 65 63 69 66 69 65 64 20 2a  mode specified *
7720: 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f  /.#define SHELL_
7730: 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 20 20 20 20 20  OPEN_NORMAL     
7740: 31 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c  1      /* Normal
7750: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
7760: 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f  /.#define SHELL_
7770: 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 20  OPEN_APPENDVFS  
7780: 32 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 70  2      /* Use ap
7790: 70 65 6e 64 76 66 73 20 2a 2f 0a 23 64 65 66 69  pendvfs */.#defi
77a0: 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49  ne SHELL_OPEN_ZI
77b0: 50 46 49 4c 45 20 20 20 20 33 20 20 20 20 20 20  PFILE    3      
77c0: 2f 2a 20 55 73 65 20 74 68 65 20 7a 69 70 66 69  /* Use the zipfi
77d0: 6c 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  le virtual table
77e0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c   */.#define SHEL
77f0: 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  L_OPEN_READONLY 
7800: 20 20 34 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e    4      /* Open
7810: 20 61 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61   a normal databa
7820: 73 65 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a  se read-only */.
7830: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  ./*.** These are
7840: 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 73 68 65   the allowed she
7850: 6c 6c 46 6c 67 73 20 76 61 6c 75 65 73 0a 2a 2f  llFlgs values.*/
7860: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50  .#define SHFLG_P
7870: 61 67 65 63 61 63 68 65 20 20 20 20 20 20 30 78  agecache      0x
7880: 30 30 30 30 30 30 30 31 20 2f 2a 20 54 68 65 20  00000001 /* The 
7890: 2d 2d 70 61 67 65 63 61 63 68 65 20 6f 70 74 69  --pagecache opti
78a0: 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64  on is used */.#d
78b0: 65 66 69 6e 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b  efine SHFLG_Look
78c0: 61 73 69 64 65 20 20 20 20 20 20 30 78 30 30 30  aside      0x000
78d0: 30 30 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61 73 69  00002 /* Lookasi
78e0: 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65  de memory is use
78f0: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46  d */.#define SHF
7900: 4c 47 5f 42 61 63 6b 73 6c 61 73 68 20 20 20 20  LG_Backslash    
7910: 20 20 30 78 30 30 30 30 30 30 30 34 20 2f 2a 20    0x00000004 /* 
7920: 54 68 65 20 2d 2d 62 61 63 6b 73 6c 61 73 68 20  The --backslash 
7930: 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a  option is used *
7940: 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f  /.#define SHFLG_
7950: 50 72 65 73 65 72 76 65 52 6f 77 69 64 20 20 30  PreserveRowid  0
7960: 78 30 30 30 30 30 30 30 38 20 2f 2a 20 2e 64 75  x00000008 /* .du
7970: 6d 70 20 70 72 65 73 65 72 76 65 73 20 72 6f 77  mp preserves row
7980: 69 64 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65  id values */.#de
7990: 66 69 6e 65 20 53 48 46 4c 47 5f 4e 65 77 6c 69  fine SHFLG_Newli
79a0: 6e 65 73 20 20 20 20 20 20 20 30 78 30 30 30 30  nes       0x0000
79b0: 30 30 31 30 20 2f 2a 20 2e 64 75 6d 70 20 2d 2d  0010 /* .dump --
79c0: 6e 65 77 6c 69 6e 65 20 66 6c 61 67 20 2a 2f 0a  newline flag */.
79d0: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 43 6f  #define SHFLG_Co
79e0: 75 6e 74 43 68 61 6e 67 65 73 20 20 20 30 78 30  untChanges   0x0
79f0: 30 30 30 30 30 32 30 20 2f 2a 20 2e 63 68 61 6e  0000020 /* .chan
7a00: 67 65 73 20 73 65 74 74 69 6e 67 20 2a 2f 0a 23  ges setting */.#
7a10: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 45 63 68  define SHFLG_Ech
7a20: 6f 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30  o           0x00
7a30: 30 30 30 30 34 30 20 2f 2a 20 2e 65 63 68 6f 20  000040 /* .echo 
7a40: 6f 72 20 2d 2d 65 63 68 6f 20 73 65 74 74 69 6e  or --echo settin
7a50: 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  g */../*.** Macr
7a60: 6f 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  os for testing a
7a70: 6e 64 20 73 65 74 74 69 6e 67 20 73 68 65 6c 6c  nd setting shell
7a80: 46 6c 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  Flgs.*/.#define 
7a90: 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 50 2c 58  ShellHasFlag(P,X
7aa0: 29 20 20 20 20 28 28 28 50 29 2d 3e 73 68 65 6c  )    (((P)->shel
7ab0: 6c 46 6c 67 73 20 26 20 28 58 29 29 21 3d 30 29  lFlgs & (X))!=0)
7ac0: 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 53 65  .#define ShellSe
7ad0: 74 46 6c 61 67 28 50 2c 58 29 20 20 20 20 28 28  tFlag(P,X)    ((
7ae0: 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d 28  P)->shellFlgs|=(
7af0: 58 29 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c  X)).#define Shel
7b00: 6c 43 6c 65 61 72 46 6c 61 67 28 50 2c 58 29 20  lClearFlag(P,X) 
7b10: 20 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73   ((P)->shellFlgs
7b20: 26 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a  &=(~(X)))../*.**
7b30: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 61   These are the a
7b40: 6c 6c 6f 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f  llowed modes..*/
7b50: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69  .#define MODE_Li
7b60: 6e 65 20 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65  ne     0  /* One
7b70: 20 63 6f 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65   column per line
7b80: 2e 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65  .  Blank line be
7b90: 74 77 65 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f  tween records */
7ba0: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f  .#define MODE_Co
7bb0: 6c 75 6d 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65  lumn   1  /* One
7bc0: 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65   record per line
7bd0: 20 69 6e 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73   in neat columns
7be0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
7bf0: 5f 4c 69 73 74 20 20 20 20 20 32 20 20 2f 2a 20  _List     2  /* 
7c00: 4f 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c  One record per l
7c10: 69 6e 65 20 77 69 74 68 20 61 20 73 65 70 61 72  ine with a separ
7c20: 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ator */.#define 
7c30: 4d 4f 44 45 5f 53 65 6d 69 20 20 20 20 20 33 20  MODE_Semi     3 
7c40: 20 2f 2a 20 53 61 6d 65 20 61 73 20 4d 4f 44 45   /* Same as MODE
7c50: 5f 4c 69 73 74 20 62 75 74 20 61 70 70 65 6e 64  _List but append
7c60: 20 22 3b 22 20 74 6f 20 65 61 63 68 20 6c 69 6e   ";" to each lin
7c70: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  e */.#define MOD
7c80: 45 5f 48 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a  E_Html     4  /*
7c90: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 58 48 54   Generate an XHT
7ca0: 4d 4c 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66  ML table */.#def
7cb0: 69 6e 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20  ine MODE_Insert 
7cc0: 20 20 35 20 20 2f 2a 20 47 65 6e 65 72 61 74 65    5  /* Generate
7cd0: 20 53 51 4c 20 22 69 6e 73 65 72 74 22 20 73 74   SQL "insert" st
7ce0: 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66  atements */.#def
7cf0: 69 6e 65 20 4d 4f 44 45 5f 51 75 6f 74 65 20 20  ine MODE_Quote  
7d00: 20 20 36 20 20 2f 2a 20 51 75 6f 74 65 20 76 61    6  /* Quote va
7d10: 6c 75 65 73 20 61 73 20 66 6f 72 20 53 51 4c 20  lues as for SQL 
7d20: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7d30: 54 63 6c 20 20 20 20 20 20 37 20 20 2f 2a 20 47  Tcl      7  /* G
7d40: 65 6e 65 72 61 74 65 20 41 4e 53 49 2d 43 20 6f  enerate ANSI-C o
7d50: 72 20 54 43 4c 20 71 75 6f 74 65 64 20 65 6c 65  r TCL quoted ele
7d60: 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65  ments */.#define
7d70: 20 4d 4f 44 45 5f 43 73 76 20 20 20 20 20 20 38   MODE_Csv      8
7d80: 20 20 2f 2a 20 51 75 6f 74 65 20 73 74 72 69 6e    /* Quote strin
7d90: 67 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20  gs, numbers are 
7da0: 70 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  plain */.#define
7db0: 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20 39   MODE_Explain  9
7dc0: 20 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43    /* Like MODE_C
7dd0: 6f 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f  olumn, but do no
7de0: 74 20 74 72 75 6e 63 61 74 65 20 64 61 74 61 20  t truncate data 
7df0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7e00: 41 73 63 69 69 20 20 20 31 30 20 20 2f 2a 20 55  Ascii   10  /* U
7e10: 73 65 20 41 53 43 49 49 20 75 6e 69 74 20 61 6e  se ASCII unit an
7e20: 64 20 72 65 63 6f 72 64 20 73 65 70 61 72 61 74  d record separat
7e30: 6f 72 73 20 28 30 78 31 46 2f 30 78 31 45 29 20  ors (0x1F/0x1E) 
7e40: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7e50: 50 72 65 74 74 79 20 20 31 31 20 20 2f 2a 20 50  Pretty  11  /* P
7e60: 72 65 74 74 79 2d 70 72 69 6e 74 20 73 63 68 65  retty-print sche
7e70: 6d 61 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  mas */.#define M
7e80: 4f 44 45 5f 45 51 50 20 20 20 20 20 31 32 20 20  ODE_EQP     12  
7e90: 2f 2a 20 43 6f 6e 76 65 72 74 73 20 45 58 50 4c  /* Converts EXPL
7ea0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 6f  AIN QUERY PLAN o
7eb0: 75 74 70 75 74 20 69 6e 74 6f 20 61 20 67 72 61  utput into a gra
7ec0: 70 68 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f  ph */..static co
7ed0: 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 44 65  nst char *modeDe
7ee0: 73 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e  scr[] = {.  "lin
7ef0: 65 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a  e",.  "column",.
7f00: 20 20 22 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d    "list",.  "sem
7f10: 69 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20  i",.  "html",.  
7f20: 22 69 6e 73 65 72 74 22 2c 0a 20 20 22 71 75 6f  "insert",.  "quo
7f30: 74 65 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20  te",.  "tcl",.  
7f40: 22 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61 69  "csv",.  "explai
7f50: 6e 22 2c 0a 20 20 22 61 73 63 69 69 22 2c 0a 20  n",.  "ascii",. 
7f60: 20 22 70 72 65 74 74 79 70 72 69 6e 74 22 2c 0a   "prettyprint",.
7f70: 20 20 22 65 71 70 22 0a 7d 3b 0a 0a 2f 2a 0a 2a    "eqp".};../*.*
7f80: 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20  * These are the 
7f90: 63 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69 6e 65 20  column/row/line 
7fa0: 73 65 70 61 72 61 74 6f 72 73 20 75 73 65 64 20  separators used 
7fb0: 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a  by the various.*
7fc0: 2a 20 69 6d 70 6f 72 74 2f 65 78 70 6f 72 74 20  * import/export 
7fd0: 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  modes..*/.#defin
7fe0: 65 20 53 45 50 5f 43 6f 6c 75 6d 6e 20 20 20 20  e SEP_Column    
7ff0: 22 7c 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f  "|".#define SEP_
8000: 52 6f 77 20 20 20 20 20 20 20 22 5c 6e 22 0a 23  Row       "\n".#
8010: 64 65 66 69 6e 65 20 53 45 50 5f 54 61 62 20 20  define SEP_Tab  
8020: 20 20 20 20 20 22 5c 74 22 0a 23 64 65 66 69 6e       "\t".#defin
8030: 65 20 53 45 50 5f 53 70 61 63 65 20 20 20 20 20  e SEP_Space     
8040: 22 20 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f  " ".#define SEP_
8050: 43 6f 6d 6d 61 20 20 20 20 20 22 2c 22 0a 23 64  Comma     ",".#d
8060: 65 66 69 6e 65 20 53 45 50 5f 43 72 4c 66 20 20  efine SEP_CrLf  
8070: 20 20 20 20 22 5c 72 5c 6e 22 0a 23 64 65 66 69      "\r\n".#defi
8080: 6e 65 20 53 45 50 5f 55 6e 69 74 20 20 20 20 20  ne SEP_Unit     
8090: 20 22 5c 78 31 46 22 0a 23 64 65 66 69 6e 65 20   "\x1F".#define 
80a0: 53 45 50 5f 52 65 63 6f 72 64 20 20 20 20 22 5c  SEP_Record    "\
80b0: 78 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  x1E"../*.** A ca
80c0: 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73  llback for the s
80d0: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69 6e 74  qlite3_log() int
80e0: 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erface..*/.stati
80f0: 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67 28  c void shellLog(
8100: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
8110: 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20  iErrCode, const 
8120: 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 53  char *zMsg){.  S
8130: 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
8140: 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67  ShellState*)pArg
8150: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67 3d  ;.  if( p->pLog=
8160: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 75  =0 ) return;.  u
8170: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 70 4c  tf8_printf(p->pL
8180: 6f 67 2c 20 22 28 25 64 29 20 25 73 5c 6e 22 2c  og, "(%d) %s\n",
8190: 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67 29   iErrCode, zMsg)
81a0: 3b 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e 70 4c  ;.  fflush(p->pL
81b0: 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  og);.}../*.** SQ
81c0: 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65  L function:  she
81d0: 6c 6c 5f 70 75 74 73 6e 6c 28 58 29 0a 2a 2a 0a  ll_putsnl(X).**.
81e0: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 74 65 78  ** Write the tex
81f0: 74 20 58 20 74 6f 20 74 68 65 20 73 63 72 65 65  t X to the scree
8200: 6e 20 28 6f 72 20 77 68 61 74 65 76 65 72 20 6f  n (or whatever o
8210: 75 74 70 75 74 20 69 73 20 62 65 69 6e 67 20 64  utput is being d
8220: 69 72 65 63 74 65 64 29 0a 2a 2a 20 61 64 64 69  irected).** addi
8230: 6e 67 20 61 20 6e 65 77 6c 69 6e 65 20 61 74 20  ng a newline at 
8240: 74 68 65 20 65 6e 64 2c 20 61 6e 64 20 74 68 65  the end, and the
8250: 6e 20 72 65 74 75 72 6e 20 58 2e 0a 2a 2f 0a 73  n return X..*/.s
8260: 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
8270: 50 75 74 73 46 75 6e 63 28 0a 20 20 73 71 6c 69  PutsFunc(.  sqli
8280: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
8290: 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20  x,.  int nVal,. 
82a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
82b0: 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 53 68 65 6c  *apVal.){.  Shel
82c0: 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65  lState *p = (She
82d0: 6c 6c 53 74 61 74 65 2a 29 73 71 6c 69 74 65 33  llState*)sqlite3
82e0: 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29  _user_data(pCtx)
82f0: 3b 0a 20 20 28 76 6f 69 64 29 6e 56 61 6c 3b 0a  ;.  (void)nVal;.
8300: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
8310: 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71  >out, "%s\n", sq
8320: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
8330: 28 61 70 56 61 6c 5b 30 5d 29 29 3b 0a 20 20 73  (apVal[0]));.  s
8340: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61  qlite3_result_va
8350: 6c 75 65 28 70 43 74 78 2c 20 61 70 56 61 6c 5b  lue(pCtx, apVal[
8360: 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  0]);.}../*.** SQ
8370: 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20 65 64  L function:   ed
8380: 69 74 28 56 41 4c 55 45 29 0a 2a 2a 20 20 20 20  it(VALUE).**    
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69               edi
83a0: 74 28 56 41 4c 55 45 2c 45 44 49 54 4f 52 29 0a  t(VALUE,EDITOR).
83b0: 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 73 74 65 70  **.** These step
83c0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  s:.**.**     (1)
83d0: 20 57 72 69 74 65 20 56 41 4c 55 45 20 69 6e 74   Write VALUE int
83e0: 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  o a temporary fi
83f0: 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  le..**     (2) R
8400: 75 6e 20 70 72 6f 67 72 61 6d 20 45 44 49 54 4f  un program EDITO
8410: 52 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  R on that tempor
8420: 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  ary file..**    
8430: 20 28 33 29 20 52 65 61 64 20 74 68 65 20 74 65   (3) Read the te
8440: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 62 61 63  mporary file bac
8450: 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 73  k and return its
8460: 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 65 20   content as the 
8470: 72 65 73 75 6c 74 2e 0a 2a 2a 20 20 20 20 20 28  result..**     (
8480: 34 29 20 44 65 6c 65 74 65 20 74 68 65 20 74 65  4) Delete the te
8490: 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a 2a 2a 0a  mporary file.**.
84a0: 2a 2a 20 49 66 20 74 68 65 20 45 44 49 54 4f 52  ** If the EDITOR
84b0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 6d 69   argument is omi
84c0: 74 74 65 64 2c 20 75 73 65 20 74 68 65 20 76 61  tted, use the va
84d0: 6c 75 65 20 69 6e 20 74 68 65 20 56 49 53 55 41  lue in the VISUA
84e0: 4c 0a 2a 2a 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  L.** environment
84f0: 20 76 61 72 69 61 62 6c 65 2e 20 20 49 66 20 73   variable.  If s
8500: 74 69 6c 6c 20 74 68 65 72 65 20 69 73 20 6e 6f  till there is no
8510: 20 45 44 49 54 4f 52 2c 20 74 68 72 6f 75 67 68   EDITOR, through
8520: 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
8530: 20 41 6c 73 6f 20 74 68 72 6f 77 20 61 6e 20 65   Also throw an e
8540: 72 72 6f 72 20 69 66 20 74 68 65 20 45 44 49 54  rror if the EDIT
8550: 4f 52 20 70 72 6f 67 72 61 6d 20 72 65 74 75 72  OR program retur
8560: 6e 73 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 65 78  ns a non-zero ex
8570: 69 74 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 6e  it code..*/.#ifn
8580: 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56  def SQLITE_NOHAV
8590: 45 5f 53 59 53 54 45 4d 0a 73 74 61 74 69 63 20  E_SYSTEM.static 
85a0: 76 6f 69 64 20 65 64 69 74 46 75 6e 63 28 0a 20  void editFunc(. 
85b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
85c0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
85d0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
85e0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
85f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8600: 45 64 69 74 6f 72 3b 0a 20 20 63 68 61 72 20 2a  Editor;.  char *
8610: 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20  zTempFile = 0;. 
8620: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
8630: 63 68 61 72 20 2a 7a 43 6d 64 20 3d 20 30 3b 0a  char *zCmd = 0;.
8640: 20 20 69 6e 74 20 62 42 69 6e 3b 0a 20 20 69 6e    int bBin;.  in
8650: 74 20 72 63 3b 0a 20 20 69 6e 74 20 68 61 73 43  t rc;.  int hasC
8660: 52 4e 4c 20 3d 20 30 3b 0a 20 20 46 49 4c 45 20  RNL = 0;.  FILE 
8670: 2a 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  *f = 0;.  sqlite
8680: 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 73 71  3_int64 sz;.  sq
8690: 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20  lite3_int64 x;. 
86a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
86b0: 70 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72  p = 0;..  if( ar
86c0: 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 45 64  gc==2 ){.    zEd
86d0: 69 74 6f 72 20 3d 20 28 63 6f 6e 73 74 20 63 68  itor = (const ch
86e0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
86f0: 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b  e_text(argv[1]);
8700: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45  .  }else{.    zE
8710: 64 69 74 6f 72 20 3d 20 67 65 74 65 6e 76 28 22  ditor = getenv("
8720: 56 49 53 55 41 4c 22 29 3b 0a 20 20 7d 0a 20 20  VISUAL");.  }.  
8730: 69 66 28 20 7a 45 64 69 74 6f 72 3d 3d 30 20 29  if( zEditor==0 )
8740: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8750: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
8760: 78 74 2c 20 22 6e 6f 20 65 64 69 74 6f 72 20 66  xt, "no editor f
8770: 6f 72 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b  or edit()", -1);
8780: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8790: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
87a0: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
87b0: 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])==SQLITE_NULL 
87c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
87d0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
87e0: 65 78 74 2c 20 22 4e 55 4c 4c 20 69 6e 70 75 74  ext, "NULL input
87f0: 20 74 6f 20 65 64 69 74 28 29 22 2c 20 2d 31 29   to edit()", -1)
8800: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
8810: 7d 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33  }.  db = sqlite3
8820: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
8830: 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7a  le(context);.  z
8840: 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  TempFile = 0;.  
8850: 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
8860: 74 72 6f 6c 28 64 62 2c 20 30 2c 20 53 51 4c 49  trol(db, 0, SQLI
8870: 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c  TE_FCNTL_TEMPFIL
8880: 45 4e 41 4d 45 2c 20 26 7a 54 65 6d 70 46 69 6c  ENAME, &zTempFil
8890: 65 29 3b 0a 20 20 69 66 28 20 7a 54 65 6d 70 46  e);.  if( zTempF
88a0: 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ile==0 ){.    sq
88b0: 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72 20 3d  lite3_uint64 r =
88c0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
88d0: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
88e0: 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 7a  f(r), &r);.    z
88f0: 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  TempFile = sqlit
8900: 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d 70  e3_mprintf("temp
8910: 25 6c 6c 78 22 2c 20 72 29 3b 0a 20 20 20 20 69  %llx", r);.    i
8920: 66 28 20 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20  f( zTempFile==0 
8930: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8940: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
8950: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
8960: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
8970: 7d 0a 20 20 7d 0a 20 20 62 42 69 6e 20 3d 20 73  }.  }.  bBin = s
8980: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
8990: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
89a0: 54 45 5f 42 4c 4f 42 3b 0a 20 20 2f 2a 20 57 68  TE_BLOB;.  /* Wh
89b0: 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 66  en writing the f
89c0: 69 6c 65 20 74 6f 20 62 65 20 65 64 69 74 65 64  ile to be edited
89d0: 2c 20 64 6f 20 5c 6e 20 74 6f 20 5c 72 5c 6e 20  , do \n to \r\n 
89e0: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 6f 6e 20 73  conversions on s
89f0: 79 73 74 65 6d 73 0a 20 20 2a 2a 20 74 68 61 74  ystems.  ** that
8a00: 20 77 61 6e 74 20 5c 72 5c 6e 20 6c 69 6e 65 20   want \r\n line 
8a10: 65 6e 64 69 6e 67 73 20 2a 2f 0a 20 20 66 20 3d  endings */.  f =
8a20: 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69 6c 65   fopen(zTempFile
8a30: 2c 20 62 42 69 6e 20 3f 20 22 77 62 22 20 3a 20  , bBin ? "wb" : 
8a40: 22 77 22 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30  "w");.  if( f==0
8a50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8a60: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
8a70: 74 65 78 74 2c 20 22 65 64 69 74 28 29 20 63 61  text, "edit() ca
8a80: 6e 6e 6f 74 20 6f 70 65 6e 20 74 65 6d 70 20 66  nnot open temp f
8a90: 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67  ile", -1);.    g
8aa0: 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e  oto edit_func_en
8ab0: 64 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20 73 71  d;.  }.  sz = sq
8ac0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
8ad0: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  s(argv[0]);.  if
8ae0: 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 78 20  ( bBin ){.    x 
8af0: 3d 20 66 77 72 69 74 65 28 73 71 6c 69 74 65 33  = fwrite(sqlite3
8b00: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
8b10: 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b  [0]), 1, sz, f);
8b20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
8b30: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63  nst char *z = (c
8b40: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
8b50: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
8b60: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 2f 2a 20 52  gv[0]);.    /* R
8b70: 65 6d 65 6d 62 65 72 20 77 68 65 74 68 65 72 20  emember whether 
8b80: 6f 72 20 6e 6f 74 20 74 68 65 20 76 61 6c 75 65  or not the value
8b90: 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 74   originally cont
8ba0: 61 69 6e 65 64 20 5c 72 5c 6e 20 2a 2f 0a 20 20  ained \r\n */.  
8bb0: 20 20 69 66 28 20 7a 20 26 26 20 73 74 72 73 74    if( z && strst
8bc0: 72 28 7a 2c 22 5c 72 5c 6e 22 29 21 3d 30 20 29  r(z,"\r\n")!=0 )
8bd0: 20 68 61 73 43 52 4e 4c 20 3d 20 31 3b 0a 20 20   hasCRNL = 1;.  
8be0: 20 20 78 20 3d 20 66 77 72 69 74 65 28 73 71 6c    x = fwrite(sql
8bf0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8c00: 61 72 67 76 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c  argv[0]), 1, sz,
8c10: 20 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73   f);.  }.  fclos
8c20: 65 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20  e(f);.  f = 0;. 
8c30: 20 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20   if( x!=sz ){.  
8c40: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8c50: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
8c60: 22 65 64 69 74 28 29 20 63 6f 75 6c 64 20 6e 6f  "edit() could no
8c70: 74 20 77 72 69 74 65 20 74 68 65 20 77 68 6f 6c  t write the whol
8c80: 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20  e file", -1);.  
8c90: 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63    goto edit_func
8ca0: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64  _end;.  }.  zCmd
8cb0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
8cc0: 74 66 28 22 25 73 20 5c 22 25 73 5c 22 22 2c 20  tf("%s \"%s\"", 
8cd0: 7a 45 64 69 74 6f 72 2c 20 7a 54 65 6d 70 46 69  zEditor, zTempFi
8ce0: 6c 65 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d  le);.  if( zCmd=
8cf0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
8d00: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
8d10: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
8d20: 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e     goto edit_fun
8d30: 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 72 63 20  c_end;.  }.  rc 
8d40: 3d 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a  = system(zCmd);.
8d50: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8d60: 43 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cmd);.  if( rc )
8d70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8d80: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
8d90: 78 74 2c 20 22 45 44 49 54 4f 52 20 72 65 74 75  xt, "EDITOR retu
8da0: 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20  rned non-zero", 
8db0: 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64  -1);.    goto ed
8dc0: 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d  it_func_end;.  }
8dd0: 0a 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 54 65  .  f = fopen(zTe
8de0: 6d 70 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20  mpFile, "rb");. 
8df0: 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20   if( f==0 ){.   
8e00: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8e10: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 0a 20  error(context,. 
8e20: 20 20 20 20 20 22 65 64 69 74 28 29 20 63 61 6e       "edit() can
8e30: 6e 6f 74 20 72 65 6f 70 65 6e 20 74 65 6d 70 20  not reopen temp 
8e40: 66 69 6c 65 20 61 66 74 65 72 20 65 64 69 74 22  file after edit"
8e50: 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20  , -1);.    goto 
8e60: 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20  edit_func_end;. 
8e70: 20 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 30 2c   }.  fseek(f, 0,
8e80: 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a   SEEK_END);.  sz
8e90: 20 3d 20 66 74 65 6c 6c 28 66 29 3b 0a 20 20 72   = ftell(f);.  r
8ea0: 65 77 69 6e 64 28 66 29 3b 0a 20 20 70 20 3d 20  ewind(f);.  p = 
8eb0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
8ec0: 28 20 73 7a 2b 28 62 42 69 6e 3d 3d 30 29 20 29  ( sz+(bBin==0) )
8ed0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
8ee0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8ef0: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
8f00: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 67 6f 74  ontext);.    got
8f10: 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b  o edit_func_end;
8f20: 0a 20 20 7d 0a 20 20 78 20 3d 20 66 72 65 61 64  .  }.  x = fread
8f30: 28 70 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20  (p, 1, sz, f);. 
8f40: 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 66 20   fclose(f);.  f 
8f50: 3d 20 30 3b 0a 20 20 69 66 28 20 78 21 3d 73 7a  = 0;.  if( x!=sz
8f60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8f70: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
8f80: 74 65 78 74 2c 20 22 63 6f 75 6c 64 20 6e 6f 74  text, "could not
8f90: 20 72 65 61 64 20 62 61 63 6b 20 74 68 65 20 77   read back the w
8fa0: 68 6f 6c 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b  hole file", -1);
8fb0: 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66  .    goto edit_f
8fc0: 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  unc_end;.  }.  i
8fd0: 66 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 73  f( bBin ){.    s
8fe0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
8ff0: 6f 62 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2c  ob64(context, p,
9000: 20 73 7a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65   sz, sqlite3_fre
9010: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
9020: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 69   int i, j;.    i
9030: 66 28 20 68 61 73 43 52 4e 4c 20 29 7b 0a 20 20  f( hasCRNL ){.  
9040: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 72      /* If the or
9050: 69 67 69 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  iginal contains 
9060: 5c 72 5c 6e 20 74 68 65 6e 20 64 6f 20 6e 6f 20  \r\n then do no 
9070: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 62 61 63 6b  conversions back
9080: 20 74 6f 20 5c 6e 20 2a 2f 0a 20 20 20 20 20 20   to \n */.      
9090: 6a 20 3d 20 73 7a 3b 0a 20 20 20 20 7d 65 6c 73  j = sz;.    }els
90a0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  e{.      /* If t
90b0: 68 65 20 66 69 6c 65 20 64 69 64 20 6e 6f 74 20  he file did not 
90c0: 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 74 61  originally conta
90d0: 69 6e 20 5c 72 5c 6e 20 74 68 65 6e 20 63 6f 6e  in \r\n then con
90e0: 76 65 72 74 20 61 6e 79 20 6e 65 77 0a 20 20 20  vert any new.   
90f0: 20 20 20 2a 2a 20 5c 72 5c 6e 20 62 61 63 6b 20     ** \r\n back 
9100: 69 6e 74 6f 20 5c 6e 20 2a 2f 0a 20 20 20 20 20  into \n */.     
9110: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 73 7a   for(i=j=0; i<sz
9120: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
9130: 69 66 28 20 70 5b 69 5d 3d 3d 27 5c 72 27 20 26  if( p[i]=='\r' &
9140: 26 20 70 5b 69 2b 31 5d 3d 3d 27 5c 6e 27 20 29  & p[i+1]=='\n' )
9150: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 5b   i++;.        p[
9160: 6a 2b 2b 5d 20 3d 20 70 5b 69 5d 3b 0a 20 20 20  j++] = p[i];.   
9170: 20 20 20 7d 0a 20 20 20 20 20 20 73 7a 20 3d 20     }.      sz = 
9180: 6a 3b 0a 20 20 20 20 20 20 70 5b 73 7a 5d 20 3d  j;.      p[sz] =
9190: 20 30 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 73   0;.    } .    s
91a0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
91b0: 78 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 28 63  xt64(context, (c
91c0: 6f 6e 73 74 20 63 68 61 72 2a 29 70 2c 20 73 7a  onst char*)p, sz
91d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
91f0: 74 65 33 5f 66 72 65 65 2c 20 53 51 4c 49 54 45  te3_free, SQLITE
9200: 5f 55 54 46 38 29 3b 0a 20 20 7d 0a 20 20 70 20  _UTF8);.  }.  p 
9210: 3d 20 30 3b 0a 0a 65 64 69 74 5f 66 75 6e 63 5f  = 0;..edit_func_
9220: 65 6e 64 3a 0a 20 20 69 66 28 20 66 20 29 20 66  end:.  if( f ) f
9230: 63 6c 6f 73 65 28 66 29 3b 0a 20 20 75 6e 6c 69  close(f);.  unli
9240: 6e 6b 28 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20  nk(zTempFile);. 
9250: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
9260: 65 6d 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69  empFile);.  sqli
9270: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 23  te3_free(p);.}.#
9280: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9290: 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 20 2a 2f  NOHAVE_SYSTEM */
92a0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 6f 72 20  ../*.** Save or 
92b0: 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72  restore the curr
92c0: 65 6e 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 0a  ent output mode.
92d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
92e0: 75 74 70 75 74 4d 6f 64 65 50 75 73 68 28 53 68  utputModePush(Sh
92f0: 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
9300: 70 2d 3e 6d 6f 64 65 50 72 69 6f 72 20 3d 20 70  p->modePrior = p
9310: 2d 3e 6d 6f 64 65 3b 0a 20 20 6d 65 6d 63 70 79  ->mode;.  memcpy
9320: 28 70 2d 3e 63 6f 6c 53 65 70 50 72 69 6f 72 2c  (p->colSepPrior,
9330: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
9340: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53  , sizeof(p->colS
9350: 65 70 61 72 61 74 6f 72 29 29 3b 0a 20 20 6d 65  eparator));.  me
9360: 6d 63 70 79 28 70 2d 3e 72 6f 77 53 65 70 50 72  mcpy(p->rowSepPr
9370: 69 6f 72 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  ior, p->rowSepar
9380: 61 74 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  ator, sizeof(p->
9390: 72 6f 77 53 65 70 61 72 61 74 6f 72 29 29 3b 0a  rowSeparator));.
93a0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  }.static void ou
93b0: 74 70 75 74 4d 6f 64 65 50 6f 70 28 53 68 65 6c  tputModePop(Shel
93c0: 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 70 2d  lState *p){.  p-
93d0: 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 50  >mode = p->modeP
93e0: 72 69 6f 72 3b 0a 20 20 6d 65 6d 63 70 79 28 70  rior;.  memcpy(p
93f0: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20  ->colSeparator, 
9400: 70 2d 3e 63 6f 6c 53 65 70 50 72 69 6f 72 2c 20  p->colSepPrior, 
9410: 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70  sizeof(p->colSep
9420: 61 72 61 74 6f 72 29 29 3b 0a 20 20 6d 65 6d 63  arator));.  memc
9430: 70 79 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  py(p->rowSeparat
9440: 6f 72 2c 20 70 2d 3e 72 6f 77 53 65 70 50 72 69  or, p->rowSepPri
9450: 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 72 6f  or, sizeof(p->ro
9460: 77 53 65 70 61 72 61 74 6f 72 29 29 3b 0a 7d 0a  wSeparator));.}.
9470: 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68  ./*.** Output th
9480: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
9490: 73 20 61 20 68 65 78 2d 65 6e 63 6f 64 65 64 20  s a hex-encoded 
94a0: 62 6c 6f 62 20 28 65 67 2e 20 58 27 31 32 33 34  blob (eg. X'1234
94b0: 27 20 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ' ).*/.static vo
94c0: 69 64 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c  id output_hex_bl
94d0: 6f 62 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f  ob(FILE *out, co
94e0: 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 2c  nst void *pBlob,
94f0: 20 69 6e 74 20 6e 42 6c 6f 62 29 7b 0a 20 20 69   int nBlob){.  i
9500: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 42  nt i;.  char *zB
9510: 6c 6f 62 20 3d 20 28 63 68 61 72 20 2a 29 70 42  lob = (char *)pB
9520: 6c 6f 62 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74  lob;.  raw_print
9530: 66 28 6f 75 74 2c 22 58 27 22 29 3b 0a 20 20 66  f(out,"X'");.  f
9540: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 6c 6f 62 3b  or(i=0; i<nBlob;
9550: 20 69 2b 2b 29 7b 20 72 61 77 5f 70 72 69 6e 74   i++){ raw_print
9560: 66 28 6f 75 74 2c 22 25 30 32 78 22 2c 7a 42 6c  f(out,"%02x",zBl
9570: 6f 62 5b 69 5d 26 30 78 66 66 29 3b 20 7d 0a 20  ob[i]&0xff); }. 
9580: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
9590: 22 27 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  "'");.}../*.** F
95a0: 69 6e 64 20 61 20 73 74 72 69 6e 67 20 74 68 61  ind a string tha
95b0: 74 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61  t is not found a
95c0: 6e 79 77 68 65 72 65 20 69 6e 20 7a 5b 5d 2e 20  nywhere in z[]. 
95d0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
95e0: 72 0a 2a 2a 20 74 6f 20 74 68 61 74 20 73 74 72  r.** to that str
95f0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74  ing..**.** Try t
9600: 6f 20 75 73 65 20 7a 41 20 61 6e 64 20 7a 42 20  o use zA and zB 
9610: 66 69 72 73 74 2e 20 20 49 66 20 62 6f 74 68 20  first.  If both 
9620: 6f 66 20 74 68 6f 73 65 20 61 72 65 20 61 6c 72  of those are alr
9630: 65 61 64 79 20 66 6f 75 6e 64 20 69 6e 20 7a 5b  eady found in z[
9640: 5d 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 75  ].** then make u
9650: 70 20 73 6f 6d 65 20 73 74 72 69 6e 67 20 61 6e  p some string an
9660: 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68  d store it in th
9670: 65 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a  e buffer zBuf..*
9680: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
9690: 68 61 72 20 2a 75 6e 75 73 65 64 5f 73 74 72 69  har *unused_stri
96a0: 6e 67 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ng(.  const char
96b0: 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20   *z,            
96c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
96d0: 74 20 6d 75 73 74 20 6e 6f 74 20 61 70 70 65 61  t must not appea
96e0: 72 20 61 6e 79 77 68 65 72 65 20 69 6e 20 7a 20  r anywhere in z 
96f0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
9700: 2a 7a 41 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *zA, const char 
9710: 2a 7a 42 2c 20 20 20 2f 2a 20 54 72 79 20 74 68  *zB,   /* Try th
9720: 65 73 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 63  ese first */.  c
9730: 68 61 72 20 2a 7a 42 75 66 20 20 20 20 20 20 20  har *zBuf       
9740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9750: 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 73 74 6f   /* Space to sto
9760: 72 65 20 61 20 67 65 6e 65 72 61 74 65 64 20 73  re a generated s
9770: 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75 6e  tring */.){.  un
9780: 73 69 67 6e 65 64 20 69 20 3d 20 30 3b 0a 20 20  signed i = 0;.  
9790: 69 66 28 20 73 74 72 73 74 72 28 7a 2c 20 7a 41  if( strstr(z, zA
97a0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 41  )==0 ) return zA
97b0: 3b 0a 20 20 69 66 28 20 73 74 72 73 74 72 28 7a  ;.  if( strstr(z
97c0: 2c 20 7a 42 29 3d 3d 30 20 29 20 72 65 74 75 72  , zB)==0 ) retur
97d0: 6e 20 7a 42 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  n zB;.  do{.    
97e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
97f0: 28 32 30 2c 7a 42 75 66 2c 22 28 25 73 25 75 29  (20,zBuf,"(%s%u)
9800: 22 2c 20 7a 41 2c 20 69 2b 2b 29 3b 0a 20 20 7d  ", zA, i++);.  }
9810: 77 68 69 6c 65 28 20 73 74 72 73 74 72 28 7a 2c  while( strstr(z,
9820: 7a 42 75 66 29 21 3d 30 20 29 3b 0a 20 20 72 65  zBuf)!=0 );.  re
9830: 74 75 72 6e 20 7a 42 75 66 3b 0a 7d 0a 0a 2f 2a  turn zBuf;.}../*
9840: 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67  .** Output the g
9850: 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61  iven string as a
9860: 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 75   quoted string u
9870: 73 69 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e 67  sing SQL quoting
9880: 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a 2a   conventions..**
9890: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 6f 75  .** See also: ou
98a0: 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61  tput_quoted_esca
98b0: 70 65 64 5f 73 74 72 69 6e 67 28 29 0a 2a 2f 0a  ped_string().*/.
98c0: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
98d0: 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67  ut_quoted_string
98e0: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73  (FILE *out, cons
98f0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
9900: 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20  t i;.  char c;. 
9910: 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 6f   setBinaryMode(o
9920: 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d  ut, 1);.  for(i=
9930: 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  0; (c = z[i])!=0
9940: 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b   && c!='\''; i++
9950: 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20 29  ){}.  if( c==0 )
9960: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
9970: 66 28 6f 75 74 2c 22 27 25 73 27 22 2c 7a 29 3b  f(out,"'%s'",z);
9980: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61  .  }else{.    ra
9990: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27  w_printf(out, "'
99a0: 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  ");.    while( *
99b0: 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  z ){.      for(i
99c0: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
99d0: 30 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b  0 && c!='\''; i+
99e0: 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 63  +){}.      if( c
99f0: 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b 0a 20 20  =='\'' ) i++;.  
9a00: 20 20 20 20 69 66 28 20 69 20 29 7b 0a 20 20 20      if( i ){.   
9a10: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
9a20: 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69 2c  (out, "%.*s", i,
9a30: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a 20 2b   z);.        z +
9a40: 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = i;.      }.   
9a50: 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29     if( c=='\'' )
9a60: 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
9a70: 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a  intf(out, "'");.
9a80: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
9a90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9aa0: 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
9ab0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9ac0: 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20   }.      z++;.  
9ad0: 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e    }.    raw_prin
9ae0: 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20  tf(out, "'");.  
9af0: 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28  }.  setTextMode(
9b00: 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  out, 1);.}../*.*
9b10: 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76  * Output the giv
9b20: 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 71  en string as a q
9b30: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 75 73 69  uoted string usi
9b40: 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e 67 20 63  ng SQL quoting c
9b50: 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a 2a 20 41  onventions..** A
9b60: 64 64 69 74 69 6f 6e 61 6c 6c 6c 79 20 2c 20 65  dditionallly , e
9b70: 73 63 61 70 65 20 74 68 65 20 22 5c 6e 22 20 61  scape the "\n" a
9b80: 6e 64 20 22 5c 72 22 20 63 68 61 72 61 63 74 65  nd "\r" characte
9b90: 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  rs so that they 
9ba0: 64 6f 20 6e 6f 74 0a 2a 2a 20 67 65 74 20 63 6f  do not.** get co
9bb0: 72 72 75 70 74 65 64 20 62 79 20 65 6e 64 2d 6f  rrupted by end-o
9bc0: 66 2d 6c 69 6e 65 20 74 72 61 6e 73 6c 61 74 69  f-line translati
9bd0: 6f 6e 20 66 61 63 69 6c 69 74 69 65 73 20 69 6e  on facilities in
9be0: 20 73 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 0a   some operating.
9bf0: 2a 2a 20 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a  ** systems..**.*
9c00: 2a 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 6f  * This is like o
9c10: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
9c20: 69 6e 67 28 29 20 62 75 74 20 77 69 74 68 20 74  ing() but with t
9c30: 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74  he addition of t
9c40: 68 65 20 5c 72 5c 6e 0a 2a 2a 20 65 73 63 61 70  he \r\n.** escap
9c50: 65 20 6d 65 63 68 61 6e 69 73 6d 2e 0a 2a 2f 0a  e mechanism..*/.
9c60: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
9c70: 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70 65  ut_quoted_escape
9c80: 64 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f  d_string(FILE *o
9c90: 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ut, const char *
9ca0: 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  z){.  int i;.  c
9cb0: 68 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e 61  har c;.  setBina
9cc0: 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a  ryMode(out, 1);.
9cd0: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
9ce0: 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  z[i])!=0 && c!='
9cf0: 5c 27 27 20 26 26 20 63 21 3d 27 5c 6e 27 20 26  \'' && c!='\n' &
9d00: 26 20 63 21 3d 27 5c 72 27 3b 20 69 2b 2b 29 7b  & c!='\r'; i++){
9d10: 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a  }.  if( c==0 ){.
9d20: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
9d30: 6f 75 74 2c 22 27 25 73 27 22 2c 7a 29 3b 0a 20  out,"'%s'",z);. 
9d40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
9d50: 74 20 63 68 61 72 20 2a 7a 4e 4c 20 3d 20 30 3b  t char *zNL = 0;
9d60: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
9d70: 2a 7a 43 52 20 3d 20 30 3b 0a 20 20 20 20 69 6e  *zCR = 0;.    in
9d80: 74 20 6e 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 69  t nNL = 0;.    i
9d90: 6e 74 20 6e 43 52 20 3d 20 30 3b 0a 20 20 20 20  nt nCR = 0;.    
9da0: 63 68 61 72 20 7a 42 75 66 31 5b 32 30 5d 2c 20  char zBuf1[20], 
9db0: 7a 42 75 66 32 5b 32 30 5d 3b 0a 20 20 20 20 66  zBuf2[20];.    f
9dc0: 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(i=0; z[i]; i+
9dd0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  +){.      if( z[
9de0: 69 5d 3d 3d 27 5c 6e 27 20 29 20 6e 4e 4c 2b 2b  i]=='\n' ) nNL++
9df0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d  ;.      if( z[i]
9e00: 3d 3d 27 5c 72 27 20 29 20 6e 43 52 2b 2b 3b 0a  =='\r' ) nCR++;.
9e10: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4e      }.    if( nN
9e20: 4c 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  L ){.      raw_p
9e30: 72 69 6e 74 66 28 6f 75 74 2c 20 22 72 65 70 6c  rintf(out, "repl
9e40: 61 63 65 28 22 29 3b 0a 20 20 20 20 20 20 7a 4e  ace(");.      zN
9e50: 4c 20 3d 20 75 6e 75 73 65 64 5f 73 74 72 69 6e  L = unused_strin
9e60: 67 28 7a 2c 20 22 5c 5c 6e 22 2c 20 22 5c 5c 30  g(z, "\\n", "\\0
9e70: 31 32 22 2c 20 7a 42 75 66 31 29 3b 0a 20 20 20  12", zBuf1);.   
9e80: 20 7d 0a 20 20 20 20 69 66 28 20 6e 43 52 20 29   }.    if( nCR )
9e90: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
9ea0: 74 66 28 6f 75 74 2c 20 22 72 65 70 6c 61 63 65  tf(out, "replace
9eb0: 28 22 29 3b 0a 20 20 20 20 20 20 7a 43 52 20 3d  (");.      zCR =
9ec0: 20 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28 7a   unused_string(z
9ed0: 2c 20 22 5c 5c 72 22 2c 20 22 5c 5c 30 31 35 22  , "\\r", "\\015"
9ee0: 2c 20 7a 42 75 66 32 29 3b 0a 20 20 20 20 7d 0a  , zBuf2);.    }.
9ef0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
9f00: 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77 68  ut, "'");.    wh
9f10: 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20  ile( *z ){.     
9f20: 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a   for(i=0; (c = z
9f30: 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c  [i])!=0 && c!='\
9f40: 6e 27 20 26 26 20 63 21 3d 27 5c 72 27 20 26 26  n' && c!='\r' &&
9f50: 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d   c!='\''; i++){}
9f60: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  .      if( c=='\
9f70: 27 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20  '' ) i++;.      
9f80: 69 66 28 20 69 20 29 7b 0a 20 20 20 20 20 20 20  if( i ){.       
9f90: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
9fa0: 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b  , "%.*s", i, z);
9fb0: 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 69 3b  .        z += i;
9fc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9fd0: 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20  f( c=='\'' ){.  
9fe0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
9ff0: 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20  (out, "'");.    
a000: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
a010: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a020: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
a030: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
a040: 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20       z++;.      
a050: 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20  if( c=='\n' ){. 
a060: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
a070: 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 4e 4c  f(out, "%s", zNL
a080: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
a090: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
a0a0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
a0b0: 74 2c 20 22 25 73 22 2c 20 7a 43 52 29 3b 0a 20  t, "%s", zCR);. 
a0c0: 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69     }.    raw_pri
a0d0: 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20  ntf(out, "'");. 
a0e0: 20 20 20 69 66 28 20 6e 43 52 20 29 7b 0a 20 20     if( nCR ){.  
a0f0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
a100: 75 74 2c 20 22 2c 27 25 73 27 2c 63 68 61 72 28  ut, ",'%s',char(
a110: 31 33 29 29 22 2c 20 7a 43 52 29 3b 0a 20 20 20  13))", zCR);.   
a120: 20 7d 0a 20 20 20 20 69 66 28 20 6e 4e 4c 20 29   }.    if( nNL )
a130: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
a140: 74 66 28 6f 75 74 2c 20 22 2c 27 25 73 27 2c 63  tf(out, ",'%s',c
a150: 68 61 72 28 31 30 29 29 22 2c 20 7a 4e 4c 29 3b  har(10))", zNL);
a160: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 65 74  .    }.  }.  set
a170: 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29  TextMode(out, 1)
a180: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  ;.}../*.** Outpu
a190: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
a1a0: 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 61  ng as a quoted a
a1b0: 63 63 6f 72 64 69 6e 67 20 74 6f 20 43 20 6f 72  ccording to C or
a1c0: 20 54 43 4c 20 71 75 6f 74 69 6e 67 20 72 75 6c   TCL quoting rul
a1d0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
a1e0: 69 64 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69  id output_c_stri
a1f0: 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f  ng(FILE *out, co
a200: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
a210: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 3b 0a  unsigned int c;.
a220: 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75 74    fputc('"', out
a230: 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d  );.  while( (c =
a240: 20 2a 28 7a 2b 2b 29 29 21 3d 30 20 29 7b 0a 20   *(z++))!=0 ){. 
a250: 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29     if( c=='\\' )
a260: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c  {.      fputc(c,
a270: 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75   out);.      fpu
a280: 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20  tc(c, out);.    
a290: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22 27  }else if( c=='"'
a2a0: 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28   ){.      fputc(
a2b0: 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  '\\', out);.    
a2c0: 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75 74    fputc('"', out
a2d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
a2e0: 20 63 3d 3d 27 5c 74 27 20 29 7b 0a 20 20 20 20   c=='\t' ){.    
a2f0: 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75    fputc('\\', ou
a300: 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28  t);.      fputc(
a310: 27 74 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d  't', out);.    }
a320: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 6e 27  else if( c=='\n'
a330: 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28   ){.      fputc(
a340: 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  '\\', out);.    
a350: 20 20 66 70 75 74 63 28 27 6e 27 2c 20 6f 75 74    fputc('n', out
a360: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
a370: 20 63 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20   c=='\r' ){.    
a380: 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75    fputc('\\', ou
a390: 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28  t);.      fputc(
a3a0: 27 72 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d  'r', out);.    }
a3b0: 65 6c 73 65 20 69 66 28 20 21 69 73 70 72 69 6e  else if( !isprin
a3c0: 74 28 63 26 30 78 66 66 29 20 29 7b 0a 20 20 20  t(c&0xff) ){.   
a3d0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
a3e0: 74 2c 20 22 5c 5c 25 30 33 6f 22 2c 20 63 26 30  t, "\\%03o", c&0
a3f0: 78 66 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  xff);.    }else{
a400: 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20  .      fputc(c, 
a410: 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  out);.    }.  }.
a420: 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75 74    fputc('"', out
a430: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70  );.}../*.** Outp
a440: 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  ut the given str
a450: 69 6e 67 20 77 69 74 68 20 63 68 61 72 61 63 74  ing with charact
a460: 65 72 73 20 74 68 61 74 20 61 72 65 20 73 70 65  ers that are spe
a470: 63 69 61 6c 20 74 6f 0a 2a 2a 20 48 54 4d 4c 20  cial to.** HTML 
a480: 65 73 63 61 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  escaped..*/.stat
a490: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 68  ic void output_h
a4a0: 74 6d 6c 5f 73 74 72 69 6e 67 28 46 49 4c 45 20  tml_string(FILE 
a4b0: 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  *out, const char
a4c0: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
a4d0: 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20   if( z==0 ) z = 
a4e0: 22 22 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20  "";.  while( *z 
a4f0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
a500: 20 20 7a 5b 69 5d 0a 20 20 20 20 20 20 20 20 20    z[i].         
a510: 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 3c 27 0a     && z[i]!='<'.
a520: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a              && z
a530: 5b 69 5d 21 3d 27 26 27 0a 20 20 20 20 20 20 20  [i]!='&'.       
a540: 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 3e       && z[i]!='>
a550: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  '.            &&
a560: 20 7a 5b 69 5d 21 3d 27 5c 22 27 0a 20 20 20 20   z[i]!='\"'.    
a570: 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21          && z[i]!
a580: 3d 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 69  ='\'';.        i
a590: 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 69 3e  ++){}.    if( i>
a5a0: 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  0 ){.      utf8_
a5b0: 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73  printf(out,"%.*s
a5c0: 22 2c 69 2c 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  ",i,z);.    }.  
a5d0: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3c 27 20    if( z[i]=='<' 
a5e0: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
a5f0: 6e 74 66 28 6f 75 74 2c 22 26 6c 74 3b 22 29 3b  ntf(out,"&lt;");
a600: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
a610: 5b 69 5d 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20  [i]=='&' ){.    
a620: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a630: 2c 22 26 61 6d 70 3b 22 29 3b 0a 20 20 20 20 7d  ,"&amp;");.    }
a640: 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  else if( z[i]=='
a650: 3e 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  >' ){.      raw_
a660: 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 67 74 3b  printf(out,"&gt;
a670: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ");.    }else if
a680: 28 20 7a 5b 69 5d 3d 3d 27 5c 22 27 20 29 7b 0a  ( z[i]=='\"' ){.
a690: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
a6a0: 28 6f 75 74 2c 22 26 71 75 6f 74 3b 22 29 3b 0a  (out,"&quot;");.
a6b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
a6c0: 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20  i]=='\'' ){.    
a6d0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a6e0: 2c 22 26 23 33 39 3b 22 29 3b 0a 20 20 20 20 7d  ,"&#39;");.    }
a6f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61  else{.      brea
a700: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b  k;.    }.    z +
a710: 3d 20 69 20 2b 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  = i + 1;.  }.}..
a720: 2f 2a 0a 2a 2a 20 49 66 20 61 20 66 69 65 6c 64  /*.** If a field
a730: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 63 68   contains any ch
a740: 61 72 61 63 74 65 72 20 69 64 65 6e 74 69 66 69  aracter identifi
a750: 65 64 20 62 79 20 61 20 31 20 69 6e 20 74 68 65  ed by a 1 in the
a760: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 61 72   following.** ar
a770: 72 61 79 2c 20 74 68 65 6e 20 74 68 65 20 73 74  ray, then the st
a780: 72 69 6e 67 20 6d 75 73 74 20 62 65 20 71 75 6f  ring must be quo
a790: 74 65 64 20 66 6f 72 20 43 53 56 2e 0a 2a 2f 0a  ted for CSV..*/.
a7a0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
a7b0: 72 20 6e 65 65 64 43 73 76 51 75 6f 74 65 5b 5d  r needCsvQuote[]
a7c0: 20 3d 20 7b 0a 20 20 31 2c 20 31 2c 20 31 2c 20   = {.  1, 1, 1, 
a7d0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
a7e0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a7f0: 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c  1, 1, 1,.  1, 1,
a800: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a810: 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,   1, 1, 1, 1,
a820: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31   1, 1, 1, 1,.  1
a830: 2c 20 30 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 1, 0, 0, 0,
a840: 20 30 2c 20 31 2c 20 20 20 30 2c 20 30 2c 20 30   0, 1,   0, 0, 0
a850: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a860: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
a870: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20  , 0, 0, 0,   0, 
a880: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a890: 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,.  0, 0, 0, 
a8a0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
a8b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a8c0: 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c  0, 0, 0,.  0, 0,
a8d0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a8e0: 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,   0, 0, 0, 0,
a8f0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30   0, 0, 0, 0,.  0
a900: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a910: 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30   0, 0,   0, 0, 0
a920: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a930: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
a940: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20  , 0, 0, 0,   0, 
a950: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a960: 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,.  1, 1, 1, 
a970: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
a980: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a990: 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c  1, 1, 1,.  1, 1,
a9a0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a9b0: 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,   1, 1, 1, 1,
a9c0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31   1, 1, 1, 1,.  1
a9d0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a9e0: 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31   1, 1,   1, 1, 1
a9f0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
aa00: 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  .  1, 1, 1, 1, 1
aa10: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20  , 1, 1, 1,   1, 
aa20: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
aa30: 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,.  1, 1, 1, 
aa40: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
aa50: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
aa60: 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c  1, 1, 1,.  1, 1,
aa70: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
aa80: 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,   1, 1, 1, 1,
aa90: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31   1, 1, 1, 1,.  1
aaa0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
aab0: 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31   1, 1,   1, 1, 1
aac0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
aad0: 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  .  1, 1, 1, 1, 1
aae0: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20  , 1, 1, 1,   1, 
aaf0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
ab00: 2c 20 31 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f  , 1,.};../*.** O
ab10: 75 74 70 75 74 20 61 20 73 69 6e 67 6c 65 20 74  utput a single t
ab20: 65 72 6d 20 6f 66 20 43 53 56 2e 20 20 41 63 74  erm of CSV.  Act
ab30: 75 61 6c 6c 79 2c 20 70 2d 3e 63 6f 6c 53 65 70  ually, p->colSep
ab40: 61 72 61 74 6f 72 20 69 73 20 75 73 65 64 20 66  arator is used f
ab50: 6f 72 0a 2a 2a 20 74 68 65 20 73 65 70 61 72 61  or.** the separa
ab60: 74 6f 72 2c 20 77 68 69 63 68 20 6d 61 79 20 6f  tor, which may o
ab70: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63  r may not be a c
ab80: 6f 6d 6d 61 2e 20 20 70 2d 3e 6e 75 6c 6c 56 61  omma.  p->nullVa
ab90: 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75  lue is.** the nu
aba0: 6c 6c 20 76 61 6c 75 65 2e 20 20 53 74 72 69 6e  ll value.  Strin
abb0: 67 73 20 61 72 65 20 71 75 6f 74 65 64 20 69 66  gs are quoted if
abc0: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
abd0: 20 73 65 70 61 72 61 74 6f 72 0a 2a 2a 20 69 73   separator.** is
abe0: 20 6f 6e 6c 79 20 69 73 73 75 65 64 20 69 66 20   only issued if 
abf0: 62 53 65 70 20 69 73 20 74 72 75 65 2e 0a 2a 2f  bSep is true..*/
ac00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
ac10: 70 75 74 5f 63 73 76 28 53 68 65 6c 6c 53 74 61  put_csv(ShellSta
ac20: 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  te *p, const cha
ac30: 72 20 2a 7a 2c 20 69 6e 74 20 62 53 65 70 29 7b  r *z, int bSep){
ac40: 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70  .  FILE *out = p
ac50: 2d 3e 6f 75 74 3b 0a 20 20 69 66 28 20 7a 3d 3d  ->out;.  if( z==
ac60: 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
ac70: 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 70 2d  intf(out,"%s",p-
ac80: 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 7d  >nullValue);.  }
ac90: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b  else{.    int i;
aca0: 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 20 3d 20  .    int nSep = 
acb0: 73 74 72 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c 53  strlen30(p->colS
acc0: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 66  eparator);.    f
acd0: 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(i=0; z[i]; i+
ace0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  +){.      if( ne
acf0: 65 64 43 73 76 51 75 6f 74 65 5b 28 28 75 6e 73  edCsvQuote[((uns
ad00: 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 29 5b 69  igned char*)z)[i
ad10: 5d 5d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ]].         || (
ad20: 7a 5b 69 5d 3d 3d 70 2d 3e 63 6f 6c 53 65 70 61  z[i]==p->colSepa
ad30: 72 61 74 6f 72 5b 30 5d 20 26 26 0a 20 20 20 20  rator[0] &&.    
ad40: 20 20 20 20 20 20 20 20 20 28 6e 53 65 70 3d 3d           (nSep==
ad50: 31 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 2c 20 70  1 || memcmp(z, p
ad60: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20  ->colSeparator, 
ad70: 6e 53 65 70 29 3d 3d 30 29 29 20 29 7b 0a 20 20  nSep)==0)) ){.  
ad80: 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20        i = 0;.   
ad90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ada0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
adb0: 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i==0 ){.      
adc0: 63 68 61 72 20 2a 7a 51 75 6f 74 65 64 20 3d 20  char *zQuoted = 
add0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
ade0: 22 5c 22 25 77 5c 22 22 2c 20 7a 29 3b 0a 20 20  "\"%w\"", z);.  
adf0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
ae00: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 51 75 6f 74  out, "%s", zQuot
ae10: 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
ae20: 65 33 5f 66 72 65 65 28 7a 51 75 6f 74 65 64 29  e3_free(zQuoted)
ae30: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ae40: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
ae50: 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20  ut, "%s", z);.  
ae60: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 62 53    }.  }.  if( bS
ae70: 65 70 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  ep ){.    utf8_p
ae80: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
ae90: 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  s", p->colSepara
aea0: 74 6f 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  tor);.  }.}../*.
aeb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
aec0: 72 75 6e 73 20 77 68 65 6e 20 74 68 65 20 75 73  runs when the us
aed0: 65 72 20 70 72 65 73 73 65 73 20 43 74 72 6c 2d  er presses Ctrl-
aee0: 43 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  C.*/.static void
aef0: 20 69 6e 74 65 72 72 75 70 74 5f 68 61 6e 64 6c   interrupt_handl
af00: 65 72 28 69 6e 74 20 4e 6f 74 55 73 65 64 29 7b  er(int NotUsed){
af10: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
af20: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
af30: 73 65 65 6e 49 6e 74 65 72 72 75 70 74 2b 2b 3b  seenInterrupt++;
af40: 0a 20 20 69 66 28 20 73 65 65 6e 49 6e 74 65 72  .  if( seenInter
af50: 72 75 70 74 3e 32 20 29 20 65 78 69 74 28 31 29  rupt>2 ) exit(1)
af60: 3b 0a 20 20 69 66 28 20 67 6c 6f 62 61 6c 44 62  ;.  if( globalDb
af70: 20 29 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72   ) sqlite3_inter
af80: 72 75 70 74 28 67 6c 6f 62 61 6c 44 62 29 3b 0a  rupt(globalDb);.
af90: 7d 0a 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28  }..#if (defined(
afa0: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
afb0: 65 64 28 57 49 4e 33 32 29 29 20 26 26 20 21 64  ed(WIN32)) && !d
afc0: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43  efined(_WIN32_WC
afd0: 45 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  E)./*.** This ro
afe0: 75 74 69 6e 65 20 72 75 6e 73 20 66 6f 72 20 63  utine runs for c
aff0: 6f 6e 73 6f 6c 65 20 65 76 65 6e 74 73 20 28 65  onsole events (e
b000: 2e 67 2e 20 43 74 72 6c 2d 43 29 20 6f 6e 20 57  .g. Ctrl-C) on W
b010: 69 6e 33 32 0a 2a 2f 0a 73 74 61 74 69 63 20 42  in32.*/.static B
b020: 4f 4f 4c 20 57 49 4e 41 50 49 20 43 6f 6e 73 6f  OOL WINAPI Conso
b030: 6c 65 43 74 72 6c 48 61 6e 64 6c 65 72 28 0a 20  leCtrlHandler(. 
b040: 20 44 57 4f 52 44 20 64 77 43 74 72 6c 54 79 70   DWORD dwCtrlTyp
b050: 65 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20  e /* One of the 
b060: 43 54 52 4c 5f 2a 5f 45 56 45 4e 54 20 63 6f 6e  CTRL_*_EVENT con
b070: 73 74 61 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  stants */.){.  i
b080: 66 28 20 64 77 43 74 72 6c 54 79 70 65 3d 3d 43  f( dwCtrlType==C
b090: 54 52 4c 5f 43 5f 45 56 45 4e 54 20 29 7b 0a 20  TRL_C_EVENT ){. 
b0a0: 20 20 20 69 6e 74 65 72 72 75 70 74 5f 68 61 6e     interrupt_han
b0b0: 64 6c 65 72 28 30 29 3b 0a 20 20 20 20 72 65 74  dler(0);.    ret
b0c0: 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 20 20  urn TRUE;.  }.  
b0d0: 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a  return FALSE;.}.
b0e0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
b0f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
b100: 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  ORIZATION./*.** 
b110: 57 68 65 6e 20 74 68 65 20 22 2e 61 75 74 68 20  When the ".auth 
b120: 4f 4e 22 20 69 73 20 73 65 74 2c 20 74 68 65 20  ON" is set, the 
b130: 66 6f 6c 6c 6f 77 69 6e 67 20 61 75 74 68 6f 72  following author
b140: 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73  izer callback is
b150: 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 20 20 49 74  .** invoked.  It
b160: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
b170: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
b180: 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 41 75  atic int shellAu
b190: 74 68 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69  th(.  void *pCli
b1a0: 65 6e 74 44 61 74 61 2c 0a 20 20 69 6e 74 20 6f  entData,.  int o
b1b0: 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p,.  const char 
b1c0: 2a 7a 41 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68  *zA1,.  const ch
b1d0: 61 72 20 2a 7a 41 32 2c 0a 20 20 63 6f 6e 73 74  ar *zA2,.  const
b1e0: 20 63 68 61 72 20 2a 7a 41 33 2c 0a 20 20 63 6f   char *zA3,.  co
b1f0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 34 0a 29 7b  nst char *zA4.){
b200: 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
b210: 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29   = (ShellState*)
b220: 70 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 73  pClientData;.  s
b230: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
b240: 20 2a 61 7a 41 63 74 69 6f 6e 5b 5d 20 3d 20 7b   *azAction[] = {
b250: 20 30 2c 0a 20 20 20 20 20 22 43 52 45 41 54 45   0,.     "CREATE
b260: 5f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20 20  _INDEX",        
b270: 20 22 43 52 45 41 54 45 5f 54 41 42 4c 45 22 2c   "CREATE_TABLE",
b280: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
b290: 5f 54 45 4d 50 5f 49 4e 44 45 58 22 2c 0a 20 20  _TEMP_INDEX",.  
b2a0: 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f     "CREATE_TEMP_
b2b0: 54 41 42 4c 45 22 2c 20 20 20 20 22 43 52 45 41  TABLE",    "CREA
b2c0: 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22  TE_TEMP_TRIGGER"
b2d0: 2c 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f  ,  "CREATE_TEMP_
b2e0: 56 49 45 57 22 2c 0a 20 20 20 20 20 22 43 52 45  VIEW",.     "CRE
b2f0: 41 54 45 5f 54 52 49 47 47 45 52 22 2c 20 20 20  ATE_TRIGGER",   
b300: 20 20 20 20 22 43 52 45 41 54 45 5f 56 49 45 57      "CREATE_VIEW
b310: 22 2c 20 20 20 20 20 20 20 20 20 20 22 44 45 4c  ",          "DEL
b320: 45 54 45 22 2c 0a 20 20 20 20 20 22 44 52 4f 50  ETE",.     "DROP
b330: 5f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20 20  _INDEX",        
b340: 20 20 20 22 44 52 4f 50 5f 54 41 42 4c 45 22 2c     "DROP_TABLE",
b350: 20 20 20 20 20 20 20 20 20 20 20 22 44 52 4f 50             "DROP
b360: 5f 54 45 4d 50 5f 49 4e 44 45 58 22 2c 0a 20 20  _TEMP_INDEX",.  
b370: 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54 41     "DROP_TEMP_TA
b380: 42 4c 45 22 2c 20 20 20 20 20 20 22 44 52 4f 50  BLE",      "DROP
b390: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 2c 20  _TEMP_TRIGGER", 
b3a0: 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 56 49     "DROP_TEMP_VI
b3b0: 45 57 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f  EW",.     "DROP_
b3c0: 54 52 49 47 47 45 52 22 2c 20 20 20 20 20 20 20  TRIGGER",       
b3d0: 20 20 22 44 52 4f 50 5f 56 49 45 57 22 2c 20 20    "DROP_VIEW",  
b3e0: 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52            "INSER
b3f0: 54 22 2c 0a 20 20 20 20 20 22 50 52 41 47 4d 41  T",.     "PRAGMA
b400: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
b410: 20 22 52 45 41 44 22 2c 20 20 20 20 20 20 20 20   "READ",        
b420: 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
b430: 22 2c 0a 20 20 20 20 20 22 54 52 41 4e 53 41 43  ",.     "TRANSAC
b440: 54 49 4f 4e 22 2c 20 20 20 20 20 20 20 20 20 20  TION",          
b450: 22 55 50 44 41 54 45 22 2c 20 20 20 20 20 20 20  "UPDATE",       
b460: 20 20 20 20 20 20 20 20 22 41 54 54 41 43 48 22          "ATTACH"
b470: 2c 0a 20 20 20 20 20 22 44 45 54 41 43 48 22 2c  ,.     "DETACH",
b480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
b490: 41 4c 54 45 52 5f 54 41 42 4c 45 22 2c 20 20 20  ALTER_TABLE",   
b4a0: 20 20 20 20 20 20 20 22 52 45 49 4e 44 45 58 22         "REINDEX"
b4b0: 2c 0a 20 20 20 20 20 22 41 4e 41 4c 59 5a 45 22  ,.     "ANALYZE"
b4c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,              "
b4d0: 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22 2c 20  CREATE_VTABLE", 
b4e0: 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56 54 41         "DROP_VTA
b4f0: 42 4c 45 22 2c 0a 20 20 20 20 20 22 46 55 4e 43  BLE",.     "FUNC
b500: 54 49 4f 4e 22 2c 20 20 20 20 20 20 20 20 20 20  TION",          
b510: 20 20 20 22 53 41 56 45 50 4f 49 4e 54 22 2c 20     "SAVEPOINT", 
b520: 20 20 20 20 20 20 20 20 20 20 20 22 52 45 43 55             "RECU
b530: 52 53 49 56 45 22 0a 20 20 7d 3b 0a 20 20 69 6e  RSIVE".  };.  in
b540: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
b550: 72 20 2a 61 7a 5b 34 5d 3b 0a 20 20 61 7a 5b 30  r *az[4];.  az[0
b560: 5d 20 3d 20 7a 41 31 3b 0a 20 20 61 7a 5b 31 5d  ] = zA1;.  az[1]
b570: 20 3d 20 7a 41 32 3b 0a 20 20 61 7a 5b 32 5d 20   = zA2;.  az[2] 
b580: 3d 20 7a 41 33 3b 0a 20 20 61 7a 5b 33 5d 20 3d  = zA3;.  az[3] =
b590: 20 7a 41 34 3b 0a 20 20 75 74 66 38 5f 70 72 69   zA4;.  utf8_pri
b5a0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 61 75 74  ntf(p->out, "aut
b5b0: 68 6f 72 69 7a 65 72 3a 20 25 73 22 2c 20 61 7a  horizer: %s", az
b5c0: 41 63 74 69 6f 6e 5b 6f 70 5d 29 3b 0a 20 20 66  Action[op]);.  f
b5d0: 6f 72 28 69 3d 30 3b 20 69 3c 34 3b 20 69 2b 2b  or(i=0; i<4; i++
b5e0: 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  ){.    raw_print
b5f0: 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29 3b 0a  f(p->out, " ");.
b600: 20 20 20 20 69 66 28 20 61 7a 5b 69 5d 20 29 7b      if( az[i] ){
b610: 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f  .      output_c_
b620: 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61  string(p->out, a
b630: 7a 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  z[i]);.    }else
b640: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
b650: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 4e 55 4c 4c  tf(p->out, "NULL
b660: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
b670: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
b680: 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 72 65 74 75  t, "\n");.  retu
b690: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b6a0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72  #endif../*.** Pr
b6b0: 69 6e 74 20 61 20 73 63 68 65 6d 61 20 73 74 61  int a schema sta
b6c0: 74 65 6d 65 6e 74 2e 20 20 50 61 72 74 20 6f 66  tement.  Part of
b6d0: 20 4d 4f 44 45 5f 53 65 6d 69 20 61 6e 64 20 4d   MODE_Semi and M
b6e0: 4f 44 45 5f 50 72 65 74 74 79 20 6f 75 74 70 75  ODE_Pretty outpu
b6f0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
b700: 75 74 69 6e 65 20 63 6f 6e 76 65 72 74 73 20 73  utine converts s
b710: 6f 6d 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  ome CREATE TABLE
b720: 20 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72 20   statements for 
b730: 73 68 61 64 6f 77 20 74 61 62 6c 65 73 0a 2a 2a  shadow tables.**
b740: 20 69 6e 20 46 54 53 33 2f 34 2f 35 20 69 6e 74   in FTS3/4/5 int
b750: 6f 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 49  o CREATE TABLE I
b760: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 74 61  F NOT EXISTS sta
b770: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
b780: 69 63 20 76 6f 69 64 20 70 72 69 6e 74 53 63 68  ic void printSch
b790: 65 6d 61 4c 69 6e 65 28 46 49 4c 45 20 2a 6f 75  emaLine(FILE *ou
b7a0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
b7b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
b7c0: 61 69 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  ail){.  if( sqli
b7d0: 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 43 52 45  te3_strglob("CRE
b7e0: 41 54 45 20 54 41 42 4c 45 20 5b 27 5c 22 5d 2a  ATE TABLE ['\"]*
b7f0: 22 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", z)==0 ){.    
b800: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
b810: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
b820: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73 25  F NOT EXISTS %s%
b830: 73 22 2c 20 7a 2b 31 33 2c 20 7a 54 61 69 6c 29  s", z+13, zTail)
b840: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
b850: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
b860: 22 25 73 25 73 22 2c 20 7a 2c 20 7a 54 61 69 6c  "%s%s", z, zTail
b870: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
b880: 76 6f 69 64 20 70 72 69 6e 74 53 63 68 65 6d 61  void printSchema
b890: 4c 69 6e 65 4e 28 46 49 4c 45 20 2a 6f 75 74 2c  LineN(FILE *out,
b8a0: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c   char *z, int n,
b8b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
b8c0: 69 6c 29 7b 0a 20 20 63 68 61 72 20 63 20 3d 20  il){.  char c = 
b8d0: 7a 5b 6e 5d 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30  z[n];.  z[n] = 0
b8e0: 3b 0a 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c  ;.  printSchemaL
b8f0: 69 6e 65 28 6f 75 74 2c 20 7a 2c 20 7a 54 61 69  ine(out, z, zTai
b900: 6c 29 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 63 3b 0a  l);.  z[n] = c;.
b910: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
b920: 74 72 75 65 20 69 66 20 73 74 72 69 6e 67 20 7a  true if string z
b930: 5b 5d 20 68 61 73 20 6e 6f 74 68 69 6e 67 20 62  [] has nothing b
b940: 75 74 20 77 68 69 74 65 73 70 61 63 65 20 61 6e  ut whitespace an
b950: 64 20 63 6f 6d 6d 65 6e 74 73 20 74 6f 20 74 68  d comments to th
b960: 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20  e.** end of the 
b970: 66 69 72 73 74 20 6c 69 6e 65 2e 0a 2a 2f 0a 73  first line..*/.s
b980: 74 61 74 69 63 20 69 6e 74 20 77 73 54 6f 45 6f  tatic int wsToEo
b990: 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  l(const char *z)
b9a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
b9b0: 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  (i=0; z[i]; i++)
b9c0: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  {.    if( z[i]==
b9d0: 27 5c 6e 27 20 29 20 72 65 74 75 72 6e 20 31 3b  '\n' ) return 1;
b9e0: 0a 20 20 20 20 69 66 28 20 49 73 53 70 61 63 65  .    if( IsSpace
b9f0: 28 7a 5b 69 5d 29 20 29 20 63 6f 6e 74 69 6e 75  (z[i]) ) continu
ba00: 65 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  e;.    if( z[i]=
ba10: 3d 27 2d 27 20 26 26 20 7a 5b 69 2b 31 5d 3d 3d  ='-' && z[i+1]==
ba20: 27 2d 27 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  '-' ) return 1;.
ba30: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ba40: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
ba50: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
ba60: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 45 58   entry to the EX
ba70: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
ba80: 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63 20   data.*/.static 
ba90: 76 6f 69 64 20 65 71 70 5f 61 70 70 65 6e 64 28  void eqp_append(
baa0: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69  ShellState *p, i
bab0: 6e 74 20 69 45 71 70 49 64 2c 20 69 6e 74 20 70  nt iEqpId, int p
bac0: 32 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  2, const char *z
bad0: 54 65 78 74 29 7b 0a 20 20 45 51 50 47 72 61 70  Text){.  EQPGrap
bae0: 68 52 6f 77 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  hRow *pNew;.  in
baf0: 74 20 6e 54 65 78 74 20 3d 20 73 74 72 6c 65 6e  t nText = strlen
bb00: 33 30 28 7a 54 65 78 74 29 3b 0a 20 20 69 66 28  30(zText);.  if(
bb10: 20 70 2d 3e 61 75 74 6f 45 51 50 74 65 73 74 20   p->autoEQPtest 
bb20: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
bb30: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 2c 25  tf(p->out, "%d,%
bb40: 64 2c 25 73 5c 6e 22 2c 20 69 45 71 70 49 64 2c  d,%s\n", iEqpId,
bb50: 20 70 32 2c 20 7a 54 65 78 74 29 3b 0a 20 20 7d   p2, zText);.  }
bb60: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
bb70: 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65  3_malloc64( size
bb80: 6f 66 28 2a 70 4e 65 77 29 20 2b 20 6e 54 65 78  of(*pNew) + nTex
bb90: 74 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  t );.  if( pNew=
bba0: 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f  =0 ) shell_out_o
bbb0: 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 70 4e  f_memory();.  pN
bbc0: 65 77 2d 3e 69 45 71 70 49 64 20 3d 20 69 45 71  ew->iEqpId = iEq
bbd0: 70 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 50 61  pId;.  pNew->iPa
bbe0: 72 65 6e 74 49 64 20 3d 20 70 32 3b 0a 20 20 6d  rentId = p2;.  m
bbf0: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 54 65 78  emcpy(pNew->zTex
bc00: 74 2c 20 7a 54 65 78 74 2c 20 6e 54 65 78 74 2b  t, zText, nText+
bc10: 31 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78  1);.  pNew->pNex
bc20: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  t = 0;.  if( p->
bc30: 73 47 72 61 70 68 2e 70 4c 61 73 74 20 29 7b 0a  sGraph.pLast ){.
bc40: 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c      p->sGraph.pL
bc50: 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ast->pNext = pNe
bc60: 77 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  w;.  }else{.    
bc70: 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 20 3d  p->sGraph.pRow =
bc80: 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 2d 3e   pNew;.  }.  p->
bc90: 73 47 72 61 70 68 2e 70 4c 61 73 74 20 3d 20 70  sGraph.pLast = p
bca0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  New;.}../*.** Fr
bcb0: 65 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65  ee and reset the
bcc0: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
bcd0: 4c 41 4e 20 64 61 74 61 20 74 68 61 74 20 68 61  LAN data that ha
bce0: 73 20 62 65 65 6e 20 63 6f 6c 6c 65 63 74 65 64  s been collected
bcf0: 0a 2a 2a 20 69 6e 20 70 2d 3e 73 47 72 61 70 68  .** in p->sGraph
bd00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bd10: 20 65 71 70 5f 72 65 73 65 74 28 53 68 65 6c 6c   eqp_reset(Shell
bd20: 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 45 51 50  State *p){.  EQP
bd30: 47 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 2c 20  GraphRow *pRow, 
bd40: 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 52  *pNext;.  for(pR
bd50: 6f 77 20 3d 20 70 2d 3e 73 47 72 61 70 68 2e 70  ow = p->sGraph.p
bd60: 52 6f 77 3b 20 70 52 6f 77 3b 20 70 52 6f 77 20  Row; pRow; pRow 
bd70: 3d 20 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  = pNext){.    pN
bd80: 65 78 74 20 3d 20 70 52 6f 77 2d 3e 70 4e 65 78  ext = pRow->pNex
bd90: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  t;.    sqlite3_f
bda0: 72 65 65 28 70 52 6f 77 29 3b 0a 20 20 7d 0a 20  ree(pRow);.  }. 
bdb0: 20 6d 65 6d 73 65 74 28 26 70 2d 3e 73 47 72 61   memset(&p->sGra
bdc0: 70 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d  ph, 0, sizeof(p-
bdd0: 3e 73 47 72 61 70 68 29 29 3b 0a 7d 0a 0a 2f 2a  >sGraph));.}../*
bde0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74   Return the next
bdf0: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
be00: 4c 41 4e 20 6c 69 6e 65 20 77 69 74 68 20 69 45  LAN line with iE
be10: 71 70 49 64 20 74 68 61 74 20 6f 63 63 75 72 73  qpId that occurs
be20: 20 61 66 74 65 72 0a 2a 2a 20 70 4f 6c 64 2c 20   after.** pOld, 
be30: 6f 72 20 72 65 74 75 72 6e 20 74 68 65 20 66 69  or return the fi
be40: 72 73 74 20 73 75 63 68 20 6c 69 6e 65 20 69 66  rst such line if
be50: 20 70 4f 6c 64 20 69 73 20 4e 55 4c 4c 0a 2a 2f   pOld is NULL.*/
be60: 0a 73 74 61 74 69 63 20 45 51 50 47 72 61 70 68  .static EQPGraph
be70: 52 6f 77 20 2a 65 71 70 5f 6e 65 78 74 5f 72 6f  Row *eqp_next_ro
be80: 77 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  w(ShellState *p,
be90: 20 69 6e 74 20 69 45 71 70 49 64 2c 20 45 51 50   int iEqpId, EQP
bea0: 47 72 61 70 68 52 6f 77 20 2a 70 4f 6c 64 29 7b  GraphRow *pOld){
beb0: 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a  .  EQPGraphRow *
bec0: 70 52 6f 77 20 3d 20 70 4f 6c 64 20 3f 20 70 4f  pRow = pOld ? pO
bed0: 6c 64 2d 3e 70 4e 65 78 74 20 3a 20 70 2d 3e 73  ld->pNext : p->s
bee0: 47 72 61 70 68 2e 70 52 6f 77 3b 0a 20 20 77 68  Graph.pRow;.  wh
bef0: 69 6c 65 28 20 70 52 6f 77 20 26 26 20 70 52 6f  ile( pRow && pRo
bf00: 77 2d 3e 69 50 61 72 65 6e 74 49 64 21 3d 69 45  w->iParentId!=iE
bf10: 71 70 49 64 20 29 20 70 52 6f 77 20 3d 20 70 52  qpId ) pRow = pR
bf20: 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74  ow->pNext;.  ret
bf30: 75 72 6e 20 70 52 6f 77 3b 0a 7d 0a 0a 2f 2a 20  urn pRow;.}../* 
bf40: 52 65 6e 64 65 72 20 61 20 73 69 6e 67 6c 65 20  Render a single 
bf50: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 67 72 61  level of the gra
bf60: 70 68 20 74 68 61 74 20 68 61 73 20 69 45 71 70  ph that has iEqp
bf70: 49 64 20 61 73 20 69 74 73 20 70 61 72 65 6e 74  Id as its parent
bf80: 2e 20 20 43 61 6c 6c 65 64 0a 2a 2a 20 72 65 63  .  Called.** rec
bf90: 75 72 73 69 76 65 6c 79 20 74 6f 20 72 65 6e 64  ursively to rend
bfa0: 65 72 20 73 75 62 6c 65 76 65 6c 73 2e 0a 2a 2f  er sublevels..*/
bfb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 71 70  .static void eqp
bfc0: 5f 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 53 68  _render_level(Sh
bfd0: 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74  ellState *p, int
bfe0: 20 69 45 71 70 49 64 29 7b 0a 20 20 45 51 50 47   iEqpId){.  EQPG
bff0: 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 2c 20 2a  raphRow *pRow, *
c000: 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 6e 20 3d  pNext;.  int n =
c010: 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 73 47 72   strlen30(p->sGr
c020: 61 70 68 2e 7a 50 72 65 66 69 78 29 3b 0a 20 20  aph.zPrefix);.  
c030: 63 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72 28 70  char *z;.  for(p
c040: 52 6f 77 20 3d 20 65 71 70 5f 6e 65 78 74 5f 72  Row = eqp_next_r
c050: 6f 77 28 70 2c 20 69 45 71 70 49 64 2c 20 30 29  ow(p, iEqpId, 0)
c060: 3b 20 70 52 6f 77 3b 20 70 52 6f 77 20 3d 20 70  ; pRow; pRow = p
c070: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
c080: 20 3d 20 65 71 70 5f 6e 65 78 74 5f 72 6f 77 28   = eqp_next_row(
c090: 70 2c 20 69 45 71 70 49 64 2c 20 70 52 6f 77 29  p, iEqpId, pRow)
c0a0: 3b 0a 20 20 20 20 7a 20 3d 20 70 52 6f 77 2d 3e  ;.    z = pRow->
c0b0: 7a 54 65 78 74 3b 0a 20 20 20 20 75 74 66 38 5f  zText;.    utf8_
c0c0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
c0d0: 25 73 25 73 25 73 5c 6e 22 2c 20 70 2d 3e 73 47  %s%s%s\n", p->sG
c0e0: 72 61 70 68 2e 7a 50 72 65 66 69 78 2c 20 70 4e  raph.zPrefix, pN
c0f0: 65 78 74 20 3f 20 22 7c 2d 2d 22 20 3a 20 22 60  ext ? "|--" : "`
c100: 2d 2d 22 2c 20 7a 29 3b 0a 20 20 20 20 69 66 28  --", z);.    if(
c110: 20 6e 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70   n<(int)sizeof(p
c120: 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78  ->sGraph.zPrefix
c130: 29 2d 37 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  )-7 ){.      mem
c140: 63 70 79 28 26 70 2d 3e 73 47 72 61 70 68 2e 7a  cpy(&p->sGraph.z
c150: 50 72 65 66 69 78 5b 6e 5d 2c 20 70 4e 65 78 74  Prefix[n], pNext
c160: 20 3f 20 22 7c 20 20 22 20 3a 20 22 20 20 20 22   ? "|  " : "   "
c170: 2c 20 34 29 3b 0a 20 20 20 20 20 20 65 71 70 5f  , 4);.      eqp_
c180: 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 70 2c 20  render_level(p, 
c190: 70 52 6f 77 2d 3e 69 45 71 70 49 64 29 3b 0a 20  pRow->iEqpId);. 
c1a0: 20 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 7a       p->sGraph.z
c1b0: 50 72 65 66 69 78 5b 6e 5d 20 3d 20 30 3b 0a 20  Prefix[n] = 0;. 
c1c0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
c1d0: 2a 20 44 69 73 70 6c 61 79 20 61 6e 64 20 72 65  * Display and re
c1e0: 73 65 74 20 74 68 65 20 45 58 50 4c 41 49 4e 20  set the EXPLAIN 
c1f0: 51 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61 0a  QUERY PLAN data.
c200: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
c210: 71 70 5f 72 65 6e 64 65 72 28 53 68 65 6c 6c 53  qp_render(ShellS
c220: 74 61 74 65 20 2a 70 29 7b 0a 20 20 45 51 50 47  tate *p){.  EQPG
c230: 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d 20  raphRow *pRow = 
c240: 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 3b 0a  p->sGraph.pRow;.
c250: 20 20 69 66 28 20 70 52 6f 77 20 29 7b 0a 20 20    if( pRow ){.  
c260: 20 20 69 66 28 20 70 52 6f 77 2d 3e 7a 54 65 78    if( pRow->zTex
c270: 74 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  t[0]=='-' ){.   
c280: 20 20 20 69 66 28 20 70 52 6f 77 2d 3e 70 4e 65     if( pRow->pNe
c290: 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  xt==0 ){.       
c2a0: 20 65 71 70 5f 72 65 73 65 74 28 70 29 3b 0a 20   eqp_reset(p);. 
c2b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
c2c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74 66       }.      utf
c2d0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
c2e0: 20 22 25 73 5c 6e 22 2c 20 70 52 6f 77 2d 3e 7a   "%s\n", pRow->z
c2f0: 54 65 78 74 2b 33 29 3b 0a 20 20 20 20 20 20 70  Text+3);.      p
c300: 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 20 3d 20  ->sGraph.pRow = 
c310: 70 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pRow->pNext;.   
c320: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c330: 70 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRow);.    }else
c340: 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
c350: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 51 55 45  ntf(p->out, "QUE
c360: 52 59 20 50 4c 41 4e 5c 6e 22 29 3b 0a 20 20 20  RY PLAN\n");.   
c370: 20 7d 0a 20 20 20 20 70 2d 3e 73 47 72 61 70 68   }.    p->sGraph
c380: 2e 7a 50 72 65 66 69 78 5b 30 5d 20 3d 20 30 3b  .zPrefix[0] = 0;
c390: 0a 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72 5f  .    eqp_render_
c3a0: 6c 65 76 65 6c 28 70 2c 20 30 29 3b 0a 20 20 20  level(p, 0);.   
c3b0: 20 65 71 70 5f 72 65 73 65 74 28 70 29 3b 0a 20   eqp_reset(p);. 
c3c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
c3d0: 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   is the callback
c3e0: 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68   routine that th
c3f0: 65 20 73 68 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b  e shell.** invok
c400: 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  es for each row 
c410: 6f 66 20 61 20 71 75 65 72 79 20 72 65 73 75 6c  of a query resul
c420: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
c430: 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28   shell_callback(
c440: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20  .  void *pArg,. 
c450: 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
c460: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
c470: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
c480: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
c490: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
c4a0: 61 63 68 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ach result colum
c4b0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  n */.  char **az
c4c0: 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col,    /* Colum
c4d0: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74  n names */.  int
c4e0: 20 2a 61 69 54 79 70 65 20 20 20 20 20 20 2f 2a   *aiType      /*
c4f0: 20 43 6f 6c 75 6d 6e 20 74 79 70 65 73 20 2a 2f   Column types */
c500: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  .){.  int i;.  S
c510: 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
c520: 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67  ShellState*)pArg
c530: 3b 0a 0a 20 20 69 66 28 20 61 7a 41 72 67 3d 3d  ;..  if( azArg==
c540: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
c550: 73 77 69 74 63 68 28 20 70 2d 3e 63 4d 6f 64 65  switch( p->cMode
c560: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44   ){.    case MOD
c570: 45 5f 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  E_Line: {.      
c580: 69 6e 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20  int w = 5;.     
c590: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
c5a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72  break;.      for
c5b0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
c5c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
c5d0: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61  len = strlen30(a
c5e0: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
c5f0: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
c600: 20 20 69 66 28 20 6c 65 6e 3e 77 20 29 20 77 20    if( len>w ) w 
c610: 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  = len;.      }. 
c620: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
c630: 2b 3e 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74  +>0 ) utf8_print
c640: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
c650: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
c660: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
c670: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
c680: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
c690: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d  tf(p->out,"%*s =
c6a0: 20 25 73 25 73 22 2c 20 77 2c 20 61 7a 43 6f 6c   %s%s", w, azCol
c6b0: 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
c6c0: 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20       azArg[i] ? 
c6d0: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
c6e0: 6c 6c 56 61 6c 75 65 2c 20 70 2d 3e 72 6f 77 53  llValue, p->rowS
c6f0: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
c700: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
c710: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
c720: 4f 44 45 5f 45 78 70 6c 61 69 6e 3a 0a 20 20 20  ODE_Explain:.   
c730: 20 63 61 73 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d   case MODE_Colum
c740: 6e 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69  n: {.      stati
c750: 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 45 78 70  c const int aExp
c760: 6c 61 69 6e 57 69 64 74 68 73 5b 5d 20 3d 20 7b  lainWidths[] = {
c770: 34 2c 20 31 33 2c 20 34 2c 20 34 2c 20 34 2c 20  4, 13, 4, 4, 4, 
c780: 31 33 2c 20 32 2c 20 31 33 7d 3b 0a 20 20 20 20  13, 2, 13};.    
c790: 20 20 63 6f 6e 73 74 20 69 6e 74 20 2a 63 6f 6c    const int *col
c7a0: 57 69 64 74 68 3b 0a 20 20 20 20 20 20 69 6e 74  Width;.      int
c7b0: 20 73 68 6f 77 48 64 72 3b 0a 20 20 20 20 20 20   showHdr;.      
c7c0: 63 68 61 72 20 2a 72 6f 77 53 65 70 3b 0a 20 20  char *rowSep;.  
c7d0: 20 20 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65      if( p->cMode
c7e0: 3d 3d 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 29 7b  ==MODE_Column ){
c7f0: 0a 20 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74  .        colWidt
c800: 68 20 3d 20 70 2d 3e 63 6f 6c 57 69 64 74 68 3b  h = p->colWidth;
c810: 0a 20 20 20 20 20 20 20 20 73 68 6f 77 48 64 72  .        showHdr
c820: 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72   = p->showHeader
c830: 3b 0a 20 20 20 20 20 20 20 20 72 6f 77 53 65 70  ;.        rowSep
c840: 20 3d 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74   = p->rowSeparat
c850: 6f 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  or;.      }else{
c860: 0a 20 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74  .        colWidt
c870: 68 20 3d 20 61 45 78 70 6c 61 69 6e 57 69 64 74  h = aExplainWidt
c880: 68 73 3b 0a 20 20 20 20 20 20 20 20 73 68 6f 77  hs;.        show
c890: 48 64 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Hdr = 1;.       
c8a0: 20 72 6f 77 53 65 70 20 3d 20 53 45 50 5f 52 6f   rowSep = SEP_Ro
c8b0: 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  w;.      }.     
c8c0: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30   if( p->cnt++==0
c8d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
c8e0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
c8f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
c900: 20 77 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20   w, n;.         
c910: 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65   if( i<ArraySize
c920: 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b  (p->colWidth) ){
c930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  .            w =
c940: 20 63 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20   colWidth[i];.  
c950: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c960: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 30             w = 0
c970: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
c980: 20 20 20 20 20 20 20 20 69 66 28 20 77 3d 3d 30          if( w==0
c990: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
c9a0: 77 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61  w = strlenChar(a
c9b0: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
c9c0: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
c9d0: 20 20 20 20 20 20 69 66 28 20 77 3c 31 30 20 29        if( w<10 )
c9e0: 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20   w = 10;.       
c9f0: 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 43       n = strlenC
ca00: 68 61 72 28 61 7a 41 72 67 20 26 26 20 61 7a 41  har(azArg && azA
ca10: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
ca20: 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29   : p->nullValue)
ca30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
ca40: 28 20 77 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20  ( w<n ) w = n;. 
ca50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ca60: 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61 79       if( i<Array
ca70: 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69  Size(p->actualWi
ca80: 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20  dth) ){.        
ca90: 20 20 20 20 70 2d 3e 61 63 74 75 61 6c 57 69 64      p->actualWid
caa0: 74 68 5b 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20  th[i] = w;.     
cab0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
cac0: 20 69 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a   if( showHdr ){.
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
cae0: 5f 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e  _width_print(p->
caf0: 6f 75 74 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d  out, w, azCol[i]
cb00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  );.            u
cb10: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
cb20: 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67  t, "%s", i==nArg
cb30: 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20  -1 ? rowSep : " 
cb40: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   ");.          }
cb50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cb60: 20 20 20 69 66 28 20 73 68 6f 77 48 64 72 20 29     if( showHdr )
cb70: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
cb80: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
cb90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
cba0: 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20  nt w;.          
cbb0: 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a    if( i<ArraySiz
cbc0: 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  e(p->actualWidth
cbd0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
cbe0: 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61      w = p->actua
cbf0: 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20  lWidth[i];.     
cc00: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3c            if( w<
cc10: 30 20 29 20 77 20 3d 20 2d 77 3b 0a 20 20 20 20  0 ) w = -w;.    
cc20: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 20                w 
cc40: 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20  = 10;.          
cc50: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
cc60: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
cc70: 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c  ut,"%-*.*s%s",w,
cc80: 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
cc90: 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d        "---------
cca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccd0: 2d 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  -".             
cce0: 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d        "---------
ccf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd20: 2d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  -",.            
cd30: 20 20 20 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d          i==nArg-
cd40: 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20  1 ? rowSep : "  
cd50: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
cd60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cd70: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  }.      if( azAr
cd80: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
cd90: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
cda0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
cdb0: 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20     int w;.      
cdc0: 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a    if( i<ArraySiz
cdd0: 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  e(p->actualWidth
cde0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
cdf0: 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64  w = p->actualWid
ce00: 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d  th[i];.        }
ce10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ce20: 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20   w = 10;.       
ce30: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
ce40: 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78  ->cMode==MODE_Ex
ce50: 70 6c 61 69 6e 20 26 26 20 61 7a 41 72 67 5b 69  plain && azArg[i
ce60: 5d 20 26 26 20 73 74 72 6c 65 6e 43 68 61 72 28  ] && strlenChar(
ce70: 61 7a 41 72 67 5b 69 5d 29 3e 77 20 29 7b 0a 20  azArg[i])>w ){. 
ce80: 20 20 20 20 20 20 20 20 20 77 20 3d 20 73 74 72           w = str
ce90: 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d  lenChar(azArg[i]
cea0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
ceb0: 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20 26 26       if( i==1 &&
cec0: 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 26 26 20   p->aiIndent && 
ced0: 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  p->pStmt ){.    
cee0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e        if( p->iIn
cef0: 64 65 6e 74 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20  dent<p->nIndent 
cf00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
cf10: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
cf20: 74 2c 20 22 25 2a 2e 73 22 2c 20 70 2d 3e 61 69  t, "%*.s", p->ai
cf30: 49 6e 64 65 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e  Indent[p->iInden
cf40: 74 5d 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20  t], "");.       
cf50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
cf60: 2d 3e 69 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20  ->iIndent++;.   
cf70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
cf80: 74 66 38 5f 77 69 64 74 68 5f 70 72 69 6e 74 28  tf8_width_print(
cf90: 70 2d 3e 6f 75 74 2c 20 77 2c 20 61 7a 41 72 67  p->out, w, azArg
cfa0: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
cfb0: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a   p->nullValue);.
cfc0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
cfd0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
cfe0: 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f  , i==nArg-1 ? ro
cff0: 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20  wSep : "  ");.  
d000: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
d010: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
d020: 65 20 4d 4f 44 45 5f 53 65 6d 69 3a 20 7b 20 20  e MODE_Semi: {  
d030: 20 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20   /* .schema and 
d040: 2e 66 75 6c 6c 73 63 68 65 6d 61 20 6f 75 74 70  .fullschema outp
d050: 75 74 20 2a 2f 0a 20 20 20 20 20 20 70 72 69 6e  ut */.      prin
d060: 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f  tSchemaLine(p->o
d070: 75 74 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 22 3b  ut, azArg[0], ";
d080: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
d090: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
d0a0: 65 20 4d 4f 44 45 5f 50 72 65 74 74 79 3a 20 7b  e MODE_Pretty: {
d0b0: 20 20 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64    /* .schema and
d0c0: 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20 77 69 74   .fullschema wit
d0d0: 68 20 2d 2d 69 6e 64 65 6e 74 20 2a 2f 0a 20 20  h --indent */.  
d0e0: 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
d0f0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
d100: 69 6e 74 20 6e 50 61 72 65 6e 20 3d 20 30 3b 0a  int nParen = 0;.
d110: 20 20 20 20 20 20 63 68 61 72 20 63 45 6e 64 20        char cEnd 
d120: 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  = 0;.      char 
d130: 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  c;.      int nLi
d140: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  ne = 0;.      as
d150: 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b  sert( nArg==1 );
d160: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
d170: 5b 30 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  [0]==0 ) break;.
d180: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
d190: 33 5f 73 74 72 6c 69 6b 65 28 22 43 52 45 41 54  3_strlike("CREAT
d1a0: 45 20 56 49 45 57 25 22 2c 20 61 7a 41 72 67 5b  E VIEW%", azArg[
d1b0: 30 5d 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20  0], 0)==0.      
d1c0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6c   || sqlite3_strl
d1d0: 69 6b 65 28 22 43 52 45 41 54 45 20 54 52 49 47  ike("CREATE TRIG
d1e0: 25 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29  %", azArg[0], 0)
d1f0: 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
d200: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
d210: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22  (p->out, "%s;\n"
d220: 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20  , azArg[0]);.   
d230: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d240: 20 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20 73 71    }.      z = sq
d250: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
d260: 73 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  s", azArg[0]);. 
d270: 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
d280: 20 20 66 6f 72 28 69 3d 30 3b 20 49 73 53 70 61    for(i=0; IsSpa
d290: 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  ce(z[i]); i++){}
d2a0: 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 28 63 20  .      for(; (c 
d2b0: 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  = z[i])!=0; i++)
d2c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  {.        if( Is
d2d0: 53 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20  Space(c) ){.    
d2e0: 20 20 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d        if( z[j-1]
d2f0: 3d 3d 27 5c 72 27 20 29 20 7a 5b 6a 2d 31 5d 20  =='\r' ) z[j-1] 
d300: 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
d310: 20 20 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b    if( IsSpace(z[
d320: 6a 2d 31 5d 29 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d  j-1]) || z[j-1]=
d330: 3d 27 28 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='(' ) continue;
d340: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
d350: 66 28 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d  f( (c=='(' || c=
d360: 3d 27 29 27 29 20 26 26 20 6a 3e 30 20 26 26 20  =')') && j>0 && 
d370: 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20  IsSpace(z[j-1]) 
d380: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 2d 2d  ){.          j--
d390: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d3a0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a      z[j++] = c;.
d3b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
d3c0: 69 6c 65 28 20 6a 3e 30 20 26 26 20 49 73 53 70  ile( j>0 && IsSp
d3d0: 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a  ace(z[j-1]) ){ j
d3e0: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 7a 5b 6a 5d  --; }.      z[j]
d3f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
d400: 73 74 72 6c 65 6e 33 30 28 7a 29 3e 3d 37 39 20  strlen30(z)>=79 
d410: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
d420: 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  =j=0; (c = z[i])
d430: 21 3d 30 3b 20 69 2b 2b 29 7b 20 20 2f 2a 20 43  !=0; i++){  /* C
d440: 6f 70 79 20 63 68 61 6e 67 65 73 20 66 72 6f 6d  opy changes from
d450: 20 7a 5b 69 5d 20 62 61 63 6b 20 74 6f 20 7a 5b   z[i] back to z[
d460: 6a 5d 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  j] */.          
d470: 69 66 28 20 63 3d 3d 63 45 6e 64 20 29 7b 0a 20  if( c==cEnd ){. 
d480: 20 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20             cEnd 
d490: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
d4a0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20  else if( c=='"' 
d4b0: 7c 7c 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d  || c=='\'' || c=
d4c0: 3d 27 60 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='`' ){.        
d4d0: 20 20 20 20 63 45 6e 64 20 3d 20 63 3b 0a 20 20      cEnd = c;.  
d4e0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
d4f0: 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20  ( c=='[' ){.    
d500: 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20 27          cEnd = '
d510: 5d 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ]';.          }e
d520: 6c 73 65 20 69 66 28 20 63 3d 3d 27 2d 27 20 26  lse if( c=='-' &
d530: 26 20 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 7b  & z[i+1]=='-' ){
d540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 45 6e  .            cEn
d550: 64 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20  d = '\n';.      
d560: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
d570: 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='(' ){.        
d580: 20 20 20 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20      nParen++;.  
d590: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
d5a0: 28 20 63 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20  ( c==')' ){.    
d5b0: 20 20 20 20 20 20 20 20 6e 50 61 72 65 6e 2d 2d          nParen--
d5c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
d5d0: 28 20 6e 4c 69 6e 65 3e 30 20 26 26 20 6e 50 61  ( nLine>0 && nPa
d5e0: 72 65 6e 3d 3d 30 20 26 26 20 6a 3e 30 20 29 7b  ren==0 && j>0 ){
d5f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
d600: 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28  rintSchemaLineN(
d610: 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c  p->out, z, j, "\
d620: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n");.           
d630: 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20     j = 0;.      
d640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d650: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 5b    }.          z[
d660: 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20  j++] = c;.      
d670: 20 20 20 20 69 66 28 20 6e 50 61 72 65 6e 3d 3d      if( nParen==
d680: 31 20 26 26 20 63 45 6e 64 3d 3d 30 0a 20 20 20  1 && cEnd==0.   
d690: 20 20 20 20 20 20 20 20 26 26 20 28 63 3d 3d 27          && (c=='
d6a0: 28 27 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20 7c 7c  (' || c=='\n' ||
d6b0: 20 28 63 3d 3d 27 2c 27 20 26 26 20 21 77 73 54   (c==',' && !wsT
d6c0: 6f 45 6f 6c 28 7a 2b 69 2b 31 29 29 29 0a 20 20  oEol(z+i+1))).  
d6d0: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
d6e0: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c         if( c=='\
d6f0: 6e 27 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 20 20  n' ) j--;.      
d700: 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d        printSchem
d710: 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a  aLineN(p->out, z
d720: 2c 20 6a 2c 20 22 5c 6e 20 20 22 29 3b 0a 20 20  , j, "\n  ");.  
d730: 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b            j = 0;
d740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 69  .            nLi
d750: 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ne++;.          
d760: 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
d770: 28 7a 5b 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b  (z[i+1]) ){ i++;
d780: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
d790: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d7a0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[j] = 0;.     
d7b0: 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63   }.      printSc
d7c0: 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c  hemaLine(p->out,
d7d0: 20 7a 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20   z, ";\n");.    
d7e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
d7f0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
d800: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
d810: 4f 44 45 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20  ODE_List: {.    
d820: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d    if( p->cnt++==
d830: 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64  0 && p->showHead
d840: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  er ){.        fo
d850: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
d860: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  ++){.          u
d870: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
d880: 74 2c 22 25 73 25 73 22 2c 61 7a 43 6f 6c 5b 69  t,"%s%s",azCol[i
d890: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
d8a0: 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f       i==nArg-1 ?
d8b0: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
d8c0: 20 3a 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74   : p->colSeparat
d8d0: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  or);.        }. 
d8e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d8f0: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
d900: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  k;.      for(i=0
d910: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
d920: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20          char *z 
d930: 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  = azArg[i];.    
d940: 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a      if( z==0 ) z
d950: 20 3d 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b   = p->nullValue;
d960: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
d970: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
d980: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 69  ", z);.        i
d990: 66 28 20 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20  f( i<nArg-1 ){. 
d9a0: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
d9b0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
d9c0: 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ", p->colSeparat
d9d0: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  or);.        }el
d9e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74  se{.          ut
d9f0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
da00: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
da10: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
da20: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
da30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
da40: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 48 74 6d     case MODE_Htm
da50: 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  l: {.      if( p
da60: 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d  ->cnt++==0 && p-
da70: 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20  >showHeader ){. 
da80: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
da90: 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29  f(p->out,"<TR>")
daa0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
dab0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
dac0: 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
dad0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54  rintf(p->out,"<T
dae0: 48 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  H>");.          
daf0: 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69  output_html_stri
db00: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c  ng(p->out, azCol
db10: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
db20: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
db30: 74 2c 22 3c 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20  t,"</TH>\n");.  
db40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
db50: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
db60: 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20  t,"</TR>\n");.  
db70: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
db80: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
db90: 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
dba0: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22  tf(p->out,"<TR>"
dbb0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
dbc0: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
dbd0: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
dbe0: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22  tf(p->out,"<TD>"
dbf0: 29 3b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75  );.        outpu
dc00: 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d  t_html_string(p-
dc10: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f  >out, azArg[i] ?
dc20: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
dc30: 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullValue);.     
dc40: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
dc50: 3e 6f 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b  >out,"</TD>\n");
dc60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
dc70: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
dc80: 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20  ,"</TR>\n");.   
dc90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
dca0: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 54 63      case MODE_Tc
dcb0: 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  l: {.      if( p
dcc0: 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d  ->cnt++==0 && p-
dcd0: 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20  >showHeader ){. 
dce0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
dcf0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
dd00: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63          output_c
dd10: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61  _string(p->out,a
dd20: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
dd30: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
dd40: 20 20 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29      if(i<nArg-1)
dd50: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
dd60: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f  out, "%s", p->co
dd70: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
dd80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
dd90: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
dda0: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53  t, "%s", p->rowS
ddb0: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
ddc0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
ddd0: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
dde0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
ddf0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
de00: 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72      output_c_str
de10: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
de20: 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20  g[i] ? azArg[i] 
de30: 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b  : p->nullValue);
de40: 0a 20 20 20 20 20 20 20 20 69 66 28 69 3c 6e 41  .        if(i<nA
de50: 72 67 2d 31 29 20 75 74 66 38 5f 70 72 69 6e 74  rg-1) utf8_print
de60: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
de70: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
de80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
de90: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
dea0: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
deb0: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
dec0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ded0: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 43 73 76     case MODE_Csv
dee0: 3a 20 7b 0a 20 20 20 20 20 20 73 65 74 42 69 6e  : {.      setBin
def0: 61 72 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20  aryMode(p->out, 
df00: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  1);.      if( p-
df10: 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e  >cnt++==0 && p->
df20: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
df30: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
df40: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
df50: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73         output_cs
df60: 76 28 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20  v(p, azCol[i] ? 
df70: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20 69  azCol[i] : "", i
df80: 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20  <nArg-1);.      
df90: 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38    }.        utf8
dfa0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
dfb0: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
dfc0: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
dfd0: 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e 30        if( nArg>0
dfe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
dff0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
e000: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  ){.          out
e010: 70 75 74 5f 63 73 76 28 70 2c 20 61 7a 41 72 67  put_csv(p, azArg
e020: 5b 69 5d 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a  [i], i<nArg-1);.
e030: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e040: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
e050: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72  >out, "%s", p->r
e060: 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
e070: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 74 54      }.      setT
e080: 65 78 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20  extMode(p->out, 
e090: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
e0a0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e0b0: 4d 4f 44 45 5f 49 6e 73 65 72 74 3a 20 7b 0a 20  MODE_Insert: {. 
e0c0: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
e0d0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
e0e0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
e0f0: 6f 75 74 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f  out,"INSERT INTO
e100: 20 25 73 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62   %s",p->zDestTab
e110: 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  le);.      if( p
e120: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
e130: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
e140: 74 66 28 70 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a  tf(p->out,"(");.
e150: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
e160: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
e170: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
e180: 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d   ) raw_printf(p-
e190: 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20  >out, ",");.    
e1a0: 20 20 20 20 20 20 69 66 28 20 71 75 6f 74 65 43        if( quoteC
e1b0: 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b  har(azCol[i]) ){
e1c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
e1d0: 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  r *z = sqlite3_m
e1e0: 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c  printf("\"%w\"",
e1f0: 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20   azCol[i]);.    
e200: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
e210: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
e220: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , z);.          
e230: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
e240: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
e250: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
e260: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
e270: 74 2c 20 22 25 73 22 2c 20 61 7a 43 6f 6c 5b 69  t, "%s", azCol[i
e280: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ]);.          }.
e290: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e2a0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
e2b0: 6f 75 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20  out,")");.      
e2c0: 7d 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b  }.      p->cnt++
e2d0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
e2e0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
e2f0: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
e300: 66 28 70 2d 3e 6f 75 74 2c 20 69 3e 30 20 3f 20  f(p->out, i>0 ? 
e310: 22 2c 22 20 3a 20 22 20 56 41 4c 55 45 53 28 22  "," : " VALUES("
e320: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
e330: 61 7a 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20  azArg[i]==0) || 
e340: 28 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70  (aiType && aiTyp
e350: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  e[i]==SQLITE_NUL
e360: 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
e370: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
e380: 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  ut,"NULL");.    
e390: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
e3a0: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
e3b0: 5d 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  ]==SQLITE_TEXT )
e3c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
e3d0: 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20  ShellHasFlag(p, 
e3e0: 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20  SHFLG_Newlines) 
e3f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  ){.            o
e400: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
e410: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
e420: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[i]);.         
e430: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e440: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
e450: 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67  d_escaped_string
e460: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
e470: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ]);.          }.
e480: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
e490: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
e4a0: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e  pe[i]==SQLITE_IN
e4b0: 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
e4c0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
e4d0: 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72  ->out,"%s", azAr
e4e0: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
e4f0: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
e500: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
e510: 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  LITE_FLOAT ){.  
e520: 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35          char z[5
e530: 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f  0];.          do
e540: 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
e550: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
e560: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
e570: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75         sqlite3_u
e580: 69 6e 74 36 34 20 75 72 3b 0a 20 20 20 20 20 20  int64 ur;.      
e590: 20 20 20 20 6d 65 6d 63 70 79 28 26 75 72 2c 26      memcpy(&ur,&
e5a0: 72 2c 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20  r,sizeof(r));.  
e5b0: 20 20 20 20 20 20 20 20 69 66 28 20 75 72 3d 3d          if( ur==
e5c0: 30 78 37 66 66 30 30 30 30 30 30 30 30 30 30 30  0x7ff00000000000
e5d0: 30 30 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  00LL ){.        
e5e0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
e5f0: 2d 3e 6f 75 74 2c 20 22 31 65 39 39 39 22 29 3b  ->out, "1e999");
e600: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
e610: 20 69 66 28 20 75 72 3d 3d 30 78 66 66 66 30 30   if( ur==0xfff00
e620: 30 30 30 30 30 30 30 30 30 30 30 4c 4c 20 29 7b  00000000000LL ){
e630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77  .            raw
e640: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e650: 22 2d 31 65 39 39 39 22 29 3b 0a 20 20 20 20 20  "-1e999");.     
e660: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e670: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e680: 73 6e 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25  snprintf(50,z,"%
e690: 21 2e 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20  !.20g", r);.    
e6a0: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
e6b0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
e6c0: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   z);.          }
e6d0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
e6e0: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
e6f0: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42  ype[i]==SQLITE_B
e700: 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20  LOB && p->pStmt 
e710: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
e720: 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d  st void *pBlob =
e730: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
e740: 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69  blob(p->pStmt, i
e750: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
e760: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
e770: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d  _column_bytes(p-
e780: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
e790: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78        output_hex
e7a0: 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42  _blob(p->out, pB
e7b0: 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20  lob, nBlob);.   
e7c0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
e7d0: 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d  sNumber(azArg[i]
e7e0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
e7f0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
e800: 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67  >out,"%s", azArg
e810: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
e820: 6c 73 65 20 69 66 28 20 53 68 65 6c 6c 48 61 73  lse if( ShellHas
e830: 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65  Flag(p, SHFLG_Ne
e840: 77 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20  wlines) ){.     
e850: 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74       output_quot
e860: 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ed_string(p->out
e870: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
e880: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e890: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f        output_quo
e8a0: 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69  ted_escaped_stri
e8b0: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
e8c0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
e8d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61        }.      ra
e8e0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e8f0: 22 29 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62  ");\n");.      b
e900: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e910: 63 61 73 65 20 4d 4f 44 45 5f 51 75 6f 74 65 3a  case MODE_Quote:
e920: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   {.      if( azA
e930: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
e940: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 3d       if( p->cnt=
e950: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
e960: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66  der ){.        f
e970: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
e980: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
e990: 69 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72  if( i>0 ) raw_pr
e9a0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22  intf(p->out, ","
e9b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  );.          out
e9c0: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
e9d0: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b  g(p->out, azCol[
e9e0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
e9f0: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
ea00: 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a  f(p->out,"\n");.
ea10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
ea20: 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f  >cnt++;.      fo
ea30: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
ea40: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
ea50: 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74   i>0 ) raw_print
ea60: 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a  f(p->out, ",");.
ea70: 20 20 20 20 20 20 20 20 69 66 28 20 28 61 7a 41          if( (azA
ea80: 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69  rg[i]==0) || (ai
ea90: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
eaa0: 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20  ]==SQLITE_NULL) 
eab0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
eac0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
ead0: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20  "NULL");.       
eae0: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
eaf0: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
eb00: 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
eb10: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
eb20: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d  quoted_string(p-
eb30: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  >out, azArg[i]);
eb40: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
eb50: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
eb60: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49  ype[i]==SQLITE_I
eb70: 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
eb80: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
eb90: 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41  p->out,"%s", azA
eba0: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
ebb0: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
ebc0: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
ebd0: 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20  QLITE_FLOAT ){. 
ebe0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 5b           char z[
ebf0: 35 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 64  50];.          d
ec00: 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65  ouble r = sqlite
ec10: 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  3_column_double(
ec20: 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  p->pStmt, i);.  
ec30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ec40: 73 6e 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25  snprintf(50,z,"%
ec50: 21 2e 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20  !.20g", r);.    
ec60: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
ec70: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
ec80: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
ec90: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61   if( aiType && a
eca0: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
ecb0: 5f 42 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d  _BLOB && p->pStm
ecc0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  t ){.          c
ecd0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62  onst void *pBlob
ece0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
ecf0: 6e 5f 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c  n_blob(p->pStmt,
ed00: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   i);.          i
ed10: 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74  nt nBlob = sqlit
ed20: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
ed30: 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  p->pStmt, i);.  
ed40: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68          output_h
ed50: 65 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20  ex_blob(p->out, 
ed60: 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20  pBlob, nBlob);. 
ed70: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
ed80: 20 69 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b   isNumber(azArg[
ed90: 69 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  i], 0) ){.      
eda0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
edb0: 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41  p->out,"%s", azA
edc0: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
edd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ede0: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73   output_quoted_s
edf0: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
ee00: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
ee10: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
ee20: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
ee30: 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ut,"\n");.      
ee40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ee50: 20 63 61 73 65 20 4d 4f 44 45 5f 41 73 63 69 69   case MODE_Ascii
ee60: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
ee70: 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e  >cnt++==0 && p->
ee80: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
ee90: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
eea0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
eeb0: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
eec0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
eed0: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f  out, "%s", p->co
eee0: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
eef0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
ef00: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61  tf(p->out,"%s",a
ef10: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
ef20: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
ef30: 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38    }.        utf8
ef40: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
ef50: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
ef60: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
ef70: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
ef80: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
ef90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
efa0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
efb0: 20 69 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f   if( i>0 ) utf8_
efc0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
efd0: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
efe0: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 75  ator);.        u
eff0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
f000: 74 2c 22 25 73 22 2c 61 7a 41 72 67 5b 69 5d 20  t,"%s",azArg[i] 
f010: 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e  ? azArg[i] : p->
f020: 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20  nullValue);.    
f030: 20 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70    }.      utf8_p
f040: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
f050: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
f060: 74 6f 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tor);.      brea
f070: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f080: 65 20 4d 4f 44 45 5f 45 51 50 3a 20 7b 0a 20 20  e MODE_EQP: {.  
f090: 20 20 20 20 65 71 70 5f 61 70 70 65 6e 64 28 70      eqp_append(p
f0a0: 2c 20 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29  , atoi(azArg[0])
f0b0: 2c 20 61 74 6f 69 28 61 7a 41 72 67 5b 31 5d 29  , atoi(azArg[1])
f0c0: 2c 20 61 7a 41 72 67 5b 33 5d 29 3b 0a 20 20 20  , azArg[3]);.   
f0d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f0e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
f0f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
f100: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f   the callback ro
f110: 75 74 69 6e 65 20 74 68 61 74 20 74 68 65 20 53  utine that the S
f120: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 0a 2a 2a  QLite library.**
f130: 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63   invokes for eac
f140: 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79  h row of a query
f150: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
f160: 69 63 20 69 6e 74 20 63 61 6c 6c 62 61 63 6b 28  ic int callback(
f170: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
f180: 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41  nArg, char **azA
f190: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  rg, char **azCol
f1a0: 29 7b 0a 20 20 2f 2a 20 73 69 6e 63 65 20 77 65  ){.  /* since we
f1b0: 20 64 6f 6e 27 74 20 68 61 76 65 20 74 79 70 65   don't have type
f1c0: 20 69 6e 66 6f 2c 20 63 61 6c 6c 20 74 68 65 20   info, call the 
f1d0: 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 20 77  shell_callback w
f1e0: 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ith a NULL value
f1f0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 68 65   */.  return she
f200: 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67  ll_callback(pArg
f210: 2c 20 6e 41 72 67 2c 20 61 7a 41 72 67 2c 20 61  , nArg, azArg, a
f220: 7a 43 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a  zCol, NULL);.}..
f230: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
f240: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
f250: 6e 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ne from sqlite3_
f260: 65 78 65 63 28 29 20 74 68 61 74 20 61 70 70 65  exec() that appe
f270: 6e 64 73 20 61 6c 6c 0a 2a 2a 20 6f 75 74 70 75  nds all.** outpu
f280: 74 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  t onto the end o
f290: 66 20 61 20 53 68 65 6c 6c 54 65 78 74 20 6f 62  f a ShellText ob
f2a0: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
f2b0: 69 6e 74 20 63 61 70 74 75 72 65 4f 75 74 70 75  int captureOutpu
f2c0: 74 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  tCallback(void *
f2d0: 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20  pArg, int nArg, 
f2e0: 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68  char **azArg, ch
f2f0: 61 72 20 2a 2a 61 7a 29 7b 0a 20 20 53 68 65 6c  ar **az){.  Shel
f300: 6c 54 65 78 74 20 2a 70 20 3d 20 28 53 68 65 6c  lText *p = (Shel
f310: 6c 54 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 69  lText*)pArg;.  i
f320: 6e 74 20 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50  nt i;.  UNUSED_P
f330: 41 52 41 4d 45 54 45 52 28 61 7a 29 3b 0a 20 20  ARAMETER(az);.  
f340: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 72  if( azArg==0 ) r
f350: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
f360: 2d 3e 6e 20 29 20 61 70 70 65 6e 64 54 65 78 74  ->n ) appendText
f370: 28 70 2c 20 22 7c 22 2c 20 30 29 3b 0a 20 20 66  (p, "|", 0);.  f
f380: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
f390: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 20  i++){.    if( i 
f3a0: 29 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20  ) appendText(p, 
f3b0: 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ",", 0);.    if(
f3c0: 20 61 7a 41 72 67 5b 69 5d 20 29 20 61 70 70 65   azArg[i] ) appe
f3d0: 6e 64 54 65 78 74 28 70 2c 20 61 7a 41 72 67 5b  ndText(p, azArg[
f3e0: 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  i], 0);.  }.  re
f3f0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
f400: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 61 70 70   Generate an app
f410: 72 6f 70 72 69 61 74 65 20 53 45 4c 46 54 45 53  ropriate SELFTES
f420: 54 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d  T table in the m
f430: 61 69 6e 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  ain database..*/
f440: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
f450: 61 74 65 53 65 6c 66 74 65 73 74 54 61 62 6c 65  ateSelftestTable
f460: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
f470: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
f480: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
f490: 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20  exec(p->db,.    
f4a0: 22 53 41 56 45 50 4f 49 4e 54 20 73 65 6c 66 74  "SAVEPOINT selft
f4b0: 65 73 74 5f 69 6e 69 74 3b 5c 6e 22 0a 20 20 20  est_init;\n".   
f4c0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
f4d0: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 65 6c  F NOT EXISTS sel
f4e0: 66 74 65 73 74 28 5c 6e 22 0a 20 20 20 20 22 20  ftest(\n".    " 
f4f0: 20 74 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49   tno INTEGER PRI
f500: 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 20 20 20 2f  MARY KEY,\n"   /
f510: 2a 20 54 65 73 74 20 6e 75 6d 62 65 72 20 2a 2f  * Test number */
f520: 0a 20 20 20 20 22 20 20 6f 70 20 54 45 58 54 2c  .    "  op TEXT,
f530: 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  \n"             
f540: 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f        /* Operato
f550: 72 3a 20 20 6d 65 6d 6f 20 72 75 6e 20 2a 2f 0a  r:  memo run */.
f560: 20 20 20 20 22 20 20 63 6d 64 20 54 45 58 54 2c      "  cmd TEXT,
f570: 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  \n"             
f580: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20       /* Command 
f590: 74 65 78 74 20 2a 2f 0a 20 20 20 20 22 20 20 61  text */.    "  a
f5a0: 6e 73 20 54 45 58 54 5c 6e 22 20 20 20 20 20 20  ns TEXT\n"      
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f5c0: 44 65 73 69 72 65 64 20 61 6e 73 77 65 72 20 2a  Desired answer *
f5d0: 2f 0a 20 20 20 20 22 29 3b 22 0a 20 20 20 20 22  /.    ");".    "
f5e0: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
f5f0: 45 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28  E [_shell$self](
f600: 6f 70 2c 63 6d 64 2c 61 6e 73 29 3b 5c 6e 22 0a  op,cmd,ans);\n".
f610: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
f620: 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 72   [_shell$self](r
f630: 6f 77 69 64 2c 6f 70 2c 63 6d 64 29 5c 6e 22 0a  owid,op,cmd)\n".
f640: 20 20 20 20 22 20 20 56 41 4c 55 45 53 28 63 6f      "  VALUES(co
f650: 61 6c 65 73 63 65 28 28 53 45 4c 45 43 54 20 28  alesce((SELECT (
f660: 6d 61 78 28 74 6e 6f 29 2b 31 30 30 29 2f 31 30  max(tno)+100)/10
f670: 20 46 52 4f 4d 20 73 65 6c 66 74 65 73 74 29 2c   FROM selftest),
f680: 31 30 29 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20  10),\n".    "   
f690: 20 20 20 20 20 20 27 6d 65 6d 6f 27 2c 27 54 65        'memo','Te
f6a0: 73 74 73 20 67 65 6e 65 72 61 74 65 64 20 62 79  sts generated by
f6b0: 20 2d 2d 69 6e 69 74 27 29 3b 5c 6e 22 0a 20 20   --init');\n".  
f6c0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b    "INSERT INTO [
f6d0: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a  _shell$self]\n".
f6e0: 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 27 72      "  SELECT 'r
f6f0: 75 6e 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20  un',\n".    "   
f700: 20 27 53 45 4c 45 43 54 20 68 65 78 28 73 68 61   'SELECT hex(sha
f710: 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45 43 54  3_query(''SELECT
f720: 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e   type,name,tbl_n
f730: 61 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20  ame,sql ".      
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f750: 20 20 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d             "FROM
f760: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f   sqlite_master O
f770: 52 44 45 52 20 42 59 20 32 27 27 2c 32 32 34 29  RDER BY 2'',224)
f780: 29 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  )',\n".    "    
f790: 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 27  hex(sha3_query('
f7a0: 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d 65  SELECT type,name
f7b0: 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a  ,tbl_name,sql ".
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7d0: 20 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20            "FROM 
f7e0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52  sqlite_master OR
f7f0: 44 45 52 20 42 59 20 32 27 2c 32 32 34 29 29 3b  DER BY 2',224));
f800: 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20  \n".    "INSERT 
f810: 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c  INTO [_shell$sel
f820: 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53 45 4c  f]\n".    "  SEL
f830: 45 43 54 20 27 72 75 6e 27 2c 22 0a 20 20 20 20  ECT 'run',".    
f840: 22 20 20 20 20 27 53 45 4c 45 43 54 20 68 65 78  "    'SELECT hex
f850: 28 73 68 61 33 5f 71 75 65 72 79 28 27 27 53 45  (sha3_query(''SE
f860: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 27 20  LECT * FROM \"' 
f870: 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  ||".    "       
f880: 20 70 72 69 6e 74 66 28 27 25 77 27 2c 6e 61 6d   printf('%w',nam
f890: 65 29 20 7c 7c 20 27 5c 22 20 4e 4f 54 20 49 4e  e) || '\" NOT IN
f8a0: 44 45 58 45 44 27 27 2c 32 32 34 29 29 27 2c 5c  DEXED'',224))',\
f8b0: 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65 78 28  n".    "    hex(
f8c0: 73 68 61 33 5f 71 75 65 72 79 28 70 72 69 6e 74  sha3_query(print
f8d0: 66 28 27 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f('SELECT * FROM
f8e0: 20 5c 22 25 77 5c 22 20 4e 4f 54 20 49 4e 44 45   \"%w\" NOT INDE
f8f0: 58 45 44 27 2c 6e 61 6d 65 29 2c 32 32 34 29 29  XED',name),224))
f900: 5c 6e 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20  \n".    "  FROM 
f910: 28 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 53 45  (\n".    "    SE
f920: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
f930: 71 6c 69 74 65 5f 6d 61 73 74 65 72 5c 6e 22 0a  qlite_master\n".
f940: 20 20 20 20 22 20 20 20 20 20 57 48 45 52 45 20      "     WHERE 
f950: 74 79 70 65 3d 27 74 61 62 6c 65 27 5c 6e 22 0a  type='table'\n".
f960: 20 20 20 20 22 20 20 20 20 20 20 20 41 4e 44 20      "       AND 
f970: 6e 61 6d 65 3c 3e 27 73 65 6c 66 74 65 73 74 27  name<>'selftest'
f980: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  \n".    "       
f990: 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f  AND coalesce(roo
f9a0: 74 70 61 67 65 2c 30 29 3e 30 5c 6e 22 0a 20 20  tpage,0)>0\n".  
f9b0: 20 20 22 20 20 29 5c 6e 22 0a 20 20 20 20 22 20    "  )\n".    " 
f9c0: 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b 5c 6e  ORDER BY name;\n
f9d0: 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e  ".    "INSERT IN
f9e0: 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d  TO [_shell$self]
f9f0: 5c 6e 22 0a 20 20 20 20 22 20 20 56 41 4c 55 45  \n".    "  VALUE
fa00: 53 28 27 72 75 6e 27 2c 27 50 52 41 47 4d 41 20  S('run','PRAGMA 
fa10: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 27  integrity_check'
fa20: 2c 27 6f 6b 27 29 3b 5c 6e 22 0a 20 20 20 20 22  ,'ok');\n".    "
fa30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 65 6c 66  INSERT INTO self
fa40: 74 65 73 74 28 74 6e 6f 2c 6f 70 2c 63 6d 64 2c  test(tno,op,cmd,
fa50: 61 6e 73 29 22 0a 20 20 20 20 22 20 20 53 45 4c  ans)".    "  SEL
fa60: 45 43 54 20 72 6f 77 69 64 2a 31 30 2c 6f 70 2c  ECT rowid*10,op,
fa70: 63 6d 64 2c 61 6e 73 20 46 52 4f 4d 20 5b 5f 73  cmd,ans FROM [_s
fa80: 68 65 6c 6c 24 73 65 6c 66 5d 3b 5c 6e 22 0a 20  hell$self];\n". 
fa90: 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20 5b     "DROP TABLE [
faa0: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 3b 22 0a 20  _shell$self];". 
fab0: 20 20 20 2c 30 2c 30 2c 26 7a 45 72 72 4d 73 67     ,0,0,&zErrMsg
fac0: 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67  );.  if( zErrMsg
fad0: 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
fae0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 45 4c  ntf(stderr, "SEL
faf0: 46 54 45 53 54 20 69 6e 69 74 69 61 6c 69 7a 61  FTEST initializa
fb00: 74 69 6f 6e 20 66 61 69 6c 75 72 65 3a 20 25 73  tion failure: %s
fb10: 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  \n", zErrMsg);. 
fb20: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
fb30: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20  zErrMsg);.  }.  
fb40: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
fb50: 64 62 2c 20 22 52 45 4c 45 41 53 45 20 73 65 6c  db, "RELEASE sel
fb60: 66 74 65 73 74 5f 69 6e 69 74 22 2c 30 2c 30 2c  ftest_init",0,0,
fb70: 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65  0);.}.../*.** Se
fb80: 74 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  t the destinatio
fb90: 6e 20 74 61 62 6c 65 20 66 69 65 6c 64 20 6f 66  n table field of
fba0: 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74 65 20   the ShellState 
fbb0: 73 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20  structure to.** 
fbc0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
fbd0: 74 61 62 6c 65 20 67 69 76 65 6e 2e 20 20 45 73  table given.  Es
fbe0: 63 61 70 65 20 61 6e 79 20 71 75 6f 74 65 20 63  cape any quote c
fbf0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
fc00: 0a 2a 2a 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a  .** table name..
fc10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
fc20: 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 53 68  et_table_name(Sh
fc30: 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  ellState *p, con
fc40: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
fc50: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 63  .  int i, n;.  c
fc60: 68 61 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68  har cQuote;.  ch
fc70: 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 2d  ar *z;..  if( p-
fc80: 3e 7a 44 65 73 74 54 61 62 6c 65 20 29 7b 0a 20  >zDestTable ){. 
fc90: 20 20 20 66 72 65 65 28 70 2d 3e 7a 44 65 73 74     free(p->zDest
fca0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 7a  Table);.    p->z
fcb0: 44 65 73 74 54 61 62 6c 65 20 3d 20 30 3b 0a 20  DestTable = 0;. 
fcc0: 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d   }.  if( zName==
fcd0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 63 51  0 ) return;.  cQ
fce0: 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72  uote = quoteChar
fcf0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 73  (zName);.  n = s
fd00: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
fd10: 20 20 69 66 28 20 63 51 75 6f 74 65 20 29 20 6e    if( cQuote ) n
fd20: 20 2b 3d 20 6e 2b 32 3b 0a 20 20 7a 20 3d 20 70   += n+2;.  z = p
fd30: 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 6d  ->zDestTable = m
fd40: 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20  alloc( n+1 );.  
fd50: 69 66 28 20 7a 3d 3d 30 20 29 20 73 68 65 6c 6c  if( z==0 ) shell
fd60: 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29  _out_of_memory()
fd70: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28  ;.  n = 0;.  if(
fd80: 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d   cQuote ) z[n++]
fd90: 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 66 6f 72   = cQuote;.  for
fda0: 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20  (i=0; zName[i]; 
fdb0: 69 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d  i++){.    z[n++]
fdc0: 20 3d 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20   = zName[i];.   
fdd0: 20 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 63   if( zName[i]==c
fde0: 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d  Quote ) z[n++] =
fdf0: 20 63 51 75 6f 74 65 3b 0a 20 20 7d 0a 20 20 69   cQuote;.  }.  i
fe00: 66 28 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b  f( cQuote ) z[n+
fe10: 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7a  +] = cQuote;.  z
fe20: 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  [n] = 0;.}.../*.
fe30: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 65  ** Execute a que
fe40: 72 79 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  ry statement tha
fe50: 74 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  t will generate 
fe60: 53 51 4c 20 6f 75 74 70 75 74 2e 20 20 50 72 69  SQL output.  Pri
fe70: 6e 74 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  nt.** the result
fe80: 20 63 6f 6c 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d   columns, comma-
fe90: 73 65 70 61 72 61 74 65 64 2c 20 6f 6e 20 61 20  separated, on a 
fea0: 6c 69 6e 65 20 61 6e 64 20 74 68 65 6e 20 61 64  line and then ad
feb0: 64 20 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e  d a.** semicolon
fec0: 20 74 65 72 6d 69 6e 61 74 6f 72 20 74 6f 20 74   terminator to t
fed0: 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 6c  he end of that l
fee0: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ine..**.** If th
fef0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
ff00: 6d 6e 73 20 69 73 20 31 20 61 6e 64 20 74 68 61  mns is 1 and tha
ff10: 74 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  t column contain
ff20: 73 20 74 65 78 74 20 22 2d 2d 22 0a 2a 2a 20 74  s text "--".** t
ff30: 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 73 65  hen write the se
ff40: 6d 69 63 6f 6c 6f 6e 20 6f 6e 20 61 20 73 65 70  micolon on a sep
ff50: 61 72 61 74 65 20 6c 69 6e 65 2e 20 20 54 68 61  arate line.  Tha
ff60: 74 20 77 61 79 2c 20 69 66 20 61 0a 2a 2a 20 22  t way, if a.** "
ff70: 2d 2d 22 20 63 6f 6d 6d 65 6e 74 20 6f 63 63 75  --" comment occu
ff80: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
ff90: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
ffa0: 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77  the comment.** w
ffb0: 6f 6e 27 74 20 63 6f 6e 73 75 6d 65 20 74 68 65  on't consume the
ffc0: 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69   semicolon termi
ffd0: 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  nator..*/.static
ffe0: 20 69 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64   int run_table_d
fff0: 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65  ump_query(.  She
10000 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20  llState *p,     
10010 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 63        /* Query c
10020 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73  ontext */.  cons
10030 74 20 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 2c  t char *zSelect,
10040 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
10050 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 74 72  tatement to extr
10060 61 63 74 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  act content */. 
10070 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
10080 72 73 74 52 6f 77 20 20 20 20 2f 2a 20 50 72 69  rstRow    /* Pri
10090 6e 74 20 62 65 66 6f 72 65 20 66 69 72 73 74 20  nt before first 
100a0 72 6f 77 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  row, if not NULL
100b0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
100c0 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a  _stmt *pSelect;.
100d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
100e0 6e 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69  nResult;.  int i
100f0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
10100 7a 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  z;.  rc = sqlite
10110 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
10120 64 62 2c 20 7a 53 65 6c 65 63 74 2c 20 2d 31 2c  db, zSelect, -1,
10130 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20   &pSelect, 0);. 
10140 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10150 4f 4b 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29  OK || !pSelect )
10160 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
10170 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a  f(p->out, "/****
10180 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20   ERROR: (%d) %s 
10190 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20  *****/\n", rc,. 
101a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
101b0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
101c0 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28  >db));.    if( (
101d0 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45  rc&0xff)!=SQLITE
101e0 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45  _CORRUPT ) p->nE
101f0 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
10200 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   rc;.  }.  rc = 
10210 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65  sqlite3_step(pSe
10220 6c 65 63 74 29 3b 0a 20 20 6e 52 65 73 75 6c 74  lect);.  nResult
10230 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
10240 6e 5f 63 6f 75 6e 74 28 70 53 65 6c 65 63 74 29  n_count(pSelect)
10250 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
10260 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
10270 20 69 66 28 20 7a 46 69 72 73 74 52 6f 77 20 29   if( zFirstRow )
10280 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
10290 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
102a0 2c 20 7a 46 69 72 73 74 52 6f 77 29 3b 0a 20 20  , zFirstRow);.  
102b0 20 20 20 20 7a 46 69 72 73 74 52 6f 77 20 3d 20      zFirstRow = 
102c0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d  0;.    }.    z =
102d0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
102e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
102f0 74 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  t(pSelect, 0);. 
10300 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
10310 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  ->out, "%s", z);
10320 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
10330 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20  nResult; i++){. 
10340 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
10350 28 70 2d 3e 6f 75 74 2c 20 22 2c 25 73 22 2c 20  (p->out, ",%s", 
10360 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
10370 65 78 74 28 70 53 65 6c 65 63 74 2c 20 69 29 29  ext(pSelect, i))
10380 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10390 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20  z==0 ) z = "";. 
103a0 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20 26     while( z[0] &
103b0 26 20 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20  & (z[0]!='-' || 
103c0 7a 5b 31 5d 21 3d 27 2d 27 29 20 29 20 7a 2b 2b  z[1]!='-') ) z++
103d0 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 20 29  ;.    if( z[0] )
103e0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
103f0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c  tf(p->out, "\n;\
10400 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n");.    }else{.
10410 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
10420 28 70 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b  (p->out, ";\n");
10430 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
10440 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65  sqlite3_step(pSe
10450 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  lect);.  }.  rc 
10460 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
10470 7a 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69  ze(pSelect);.  i
10480 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10490 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
104a0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a  ntf(p->out, "/**
104b0 2a 2a 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25  ** ERROR: (%d) %
104c0 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c  s *****/\n", rc,
104d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
104e0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
104f0 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28  p->db));.    if(
10500 20 28 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49   (rc&0xff)!=SQLI
10510 54 45 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e  TE_CORRUPT ) p->
10520 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nErr++;.  }.  re
10530 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10540 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
10550 20 61 6e 64 20 73 61 76 65 20 6f 66 66 20 63 75   and save off cu
10560 72 72 65 6e 74 20 65 72 72 6f 72 20 73 74 72 69  rrent error stri
10570 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ng..*/.static ch
10580 61 72 20 2a 73 61 76 65 5f 65 72 72 5f 6d 73 67  ar *save_err_msg
10590 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  (.  sqlite3 *db 
105a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
105b0 74 61 62 61 73 65 20 74 6f 20 71 75 65 72 79 20  tabase to query 
105c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72  */.){.  int nErr
105d0 4d 73 67 20 3d 20 31 2b 73 74 72 6c 65 6e 33 30  Msg = 1+strlen30
105e0 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
105f0 64 62 29 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45  db));.  char *zE
10600 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
10610 6d 61 6c 6c 6f 63 36 34 28 6e 45 72 72 4d 73 67  malloc64(nErrMsg
10620 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67  );.  if( zErrMsg
10630 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   ){.    memcpy(z
10640 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f  ErrMsg, sqlite3_
10650 65 72 72 6d 73 67 28 64 62 29 2c 20 6e 45 72 72  errmsg(db), nErr
10660 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Msg);.  }.  retu
10670 72 6e 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 23  rn zErrMsg;.}..#
10680 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a  ifdef __linux__.
10690 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
106a0 20 64 69 73 70 6c 61 79 20 49 2f 4f 20 73 74 61   display I/O sta
106b0 74 73 20 6f 6e 20 4c 69 6e 75 78 20 75 73 69 6e  ts on Linux usin
106c0 67 20 2f 70 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a  g /proc/PID/io.*
106d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
106e0 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61 74  splayLinuxIoStat
106f0 73 28 46 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20  s(FILE *out){.  
10700 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72  FILE *in;.  char
10710 20 7a 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74   z[200];.  sqlit
10720 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
10730 6f 66 28 7a 29 2c 20 7a 2c 20 22 2f 70 72 6f 63  of(z), z, "/proc
10740 2f 25 64 2f 69 6f 22 2c 20 67 65 74 70 69 64 28  /%d/io", getpid(
10750 29 29 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e  ));.  in = fopen
10760 28 7a 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28  (z, "rb");.  if(
10770 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b   in==0 ) return;
10780 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73 28  .  while( fgets(
10790 7a 2c 20 73 69 7a 65 6f 66 28 7a 29 2c 20 69 6e  z, sizeof(z), in
107a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  )!=0 ){.    stat
107b0 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
107c0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
107d0 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b 0a 20 20  ar *zPattern;.  
107e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
107f0 7a 44 65 73 63 3b 0a 20 20 20 20 7d 20 61 54 72  zDesc;.    } aTr
10800 61 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ans[] = {.      
10810 7b 20 22 72 63 68 61 72 3a 20 22 2c 20 20 20 20  { "rchar: ",    
10820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42                "B
10830 79 74 65 73 20 72 65 63 65 69 76 65 64 20 62 79  ytes received by
10840 20 72 65 61 64 28 29 3a 22 20 7d 2c 0a 20 20 20   read():" },.   
10850 20 20 20 7b 20 22 77 63 68 61 72 3a 20 22 2c 20     { "wchar: ", 
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10870 20 22 42 79 74 65 73 20 73 65 6e 74 20 74 6f 20   "Bytes sent to 
10880 77 72 69 74 65 28 29 3a 22 20 20 20 20 7d 2c 0a  write():"    },.
10890 20 20 20 20 20 20 7b 20 22 73 79 73 63 72 3a 20        { "syscr: 
108a0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
108b0 20 20 20 20 22 52 65 61 64 28 29 20 73 79 73 74      "Read() syst
108c0 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 20  em calls:"      
108d0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 79 73 63  },.      { "sysc
108e0 77 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20  w: ",           
108f0 20 20 20 20 20 20 20 22 57 72 69 74 65 28 29 20         "Write() 
10900 73 79 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20  system calls:"  
10910 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72     },.      { "r
10920 65 61 64 5f 62 79 74 65 73 3a 20 22 2c 20 20 20  ead_bytes: ",   
10930 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73            "Bytes
10940 20 72 65 61 64 20 66 72 6f 6d 20 73 74 6f 72 61   read from stora
10950 67 65 3a 22 20 20 7d 2c 0a 20 20 20 20 20 20 7b  ge:"  },.      {
10960 20 22 77 72 69 74 65 5f 62 79 74 65 73 3a 20 22   "write_bytes: "
10970 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79  ,            "By
10980 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73  tes written to s
10990 74 6f 72 61 67 65 3a 22 20 7d 2c 0a 20 20 20 20  torage:" },.    
109a0 20 20 7b 20 22 63 61 6e 63 65 6c 6c 65 64 5f 77    { "cancelled_w
109b0 72 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20  rite_bytes: ",  
109c0 22 43 61 6e 63 65 6c 6c 65 64 20 77 72 69 74 65  "Cancelled write
109d0 20 62 79 74 65 73 3a 22 20 20 20 20 7d 2c 0a 20   bytes:"    },. 
109e0 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b     };.    int i;
109f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10a00 41 72 72 61 79 53 69 7a 65 28 61 54 72 61 6e 73  ArraySize(aTrans
10a10 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
10a20 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28  nt n = strlen30(
10a30 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65  aTrans[i].zPatte
10a40 72 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  rn);.      if( s
10a50 74 72 6e 63 6d 70 28 61 54 72 61 6e 73 5b 69 5d  trncmp(aTrans[i]
10a60 2e 7a 50 61 74 74 65 72 6e 2c 20 7a 2c 20 6e 29  .zPattern, z, n)
10a70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==0 ){.        u
10a80 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
10a90 22 25 2d 33 36 73 20 25 73 22 2c 20 61 54 72 61  "%-36s %s", aTra
10aa0 6e 73 5b 69 5d 2e 7a 44 65 73 63 2c 20 26 7a 5b  ns[i].zDesc, &z[
10ab0 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  n]);.        bre
10ac0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
10ad0 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69  }.  }.  fclose(i
10ae0 6e 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  n);.}.#endif../*
10af0 0a 2a 2a 20 44 69 73 70 6c 61 79 20 61 20 73 69  .** Display a si
10b00 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 73 74 61  ngle line of sta
10b10 74 75 73 20 75 73 69 6e 67 20 36 34 2d 62 69 74  tus using 64-bit
10b20 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74   values..*/.stat
10b30 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 53  ic void displayS
10b40 74 61 74 4c 69 6e 65 28 0a 20 20 53 68 65 6c 6c  tatLine(.  Shell
10b50 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20  State *p,       
10b60 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 65 6c       /* The shel
10b70 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63  l context */.  c
10b80 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20  har *zLabel,    
10b90 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65           /* Labe
10ba0 6c 20 66 6f 72 20 74 68 69 73 20 6f 6e 65 20 6c  l for this one l
10bb0 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ine */.  char *z
10bc0 46 6f 72 6d 61 74 2c 20 20 20 20 20 20 20 20 20  Format,         
10bd0 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20 66 6f 72     /* Format for
10be0 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20   the result */. 
10bf0 20 69 6e 74 20 69 53 74 61 74 75 73 43 74 72 6c   int iStatusCtrl
10c00 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ,          /* Wh
10c10 69 63 68 20 73 74 61 74 75 73 20 74 6f 20 64 69  ich status to di
10c20 73 70 6c 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62  splay */.  int b
10c30 52 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20  Reset           
10c40 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
10c50 72 65 73 65 74 20 74 68 65 20 73 74 61 74 73 20  reset the stats 
10c60 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
10c70 69 6e 74 36 34 20 69 43 75 72 20 3d 20 2d 31 3b  int64 iCur = -1;
10c80 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
10c90 20 69 48 69 77 74 72 20 3d 20 2d 31 3b 0a 20 20   iHiwtr = -1;.  
10ca0 69 6e 74 20 69 2c 20 6e 50 65 72 63 65 6e 74 3b  int i, nPercent;
10cb0 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30  .  char zLine[20
10cc0 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  0];.  sqlite3_st
10cd0 61 74 75 73 36 34 28 69 53 74 61 74 75 73 43 74  atus64(iStatusCt
10ce0 72 6c 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  rl, &iCur, &iHiw
10cf0 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 66  tr, bReset);.  f
10d00 6f 72 28 69 3d 30 2c 20 6e 50 65 72 63 65 6e 74  or(i=0, nPercent
10d10 3d 30 3b 20 7a 46 6f 72 6d 61 74 5b 69 5d 3b 20  =0; zFormat[i]; 
10d20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 46  i++){.    if( zF
10d30 6f 72 6d 61 74 5b 69 5d 3d 3d 27 25 27 20 29 20  ormat[i]=='%' ) 
10d40 6e 50 65 72 63 65 6e 74 2b 2b 3b 0a 20 20 7d 0a  nPercent++;.  }.
10d50 20 20 69 66 28 20 6e 50 65 72 63 65 6e 74 3e 31    if( nPercent>1
10d60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
10d70 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
10d80 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a  zLine), zLine, z
10d90 46 6f 72 6d 61 74 2c 20 69 43 75 72 2c 20 69 48  Format, iCur, iH
10da0 69 77 74 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iwtr);.  }else{.
10db0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
10dc0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e  intf(sizeof(zLin
10dd0 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d  e), zLine, zForm
10de0 61 74 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 7d  at, iHiwtr);.  }
10df0 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d  .  raw_printf(p-
10e00 3e 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c  >out, "%-36s %s\
10e10 6e 22 2c 20 7a 4c 61 62 65 6c 2c 20 7a 4c 69 6e  n", zLabel, zLin
10e20 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  e);.}../*.** Dis
10e30 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73 74 61 74  play memory stat
10e40 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
10e50 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73 28 0a   display_stats(.
10e60 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
10e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10e80 20 44 61 74 61 62 61 73 65 20 74 6f 20 71 75 65   Database to que
10e90 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61  ry */.  ShellSta
10ea0 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20  te *pArg,       
10eb0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
10ec0 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a  o ShellState */.
10ed0 20 20 69 6e 74 20 62 52 65 73 65 74 20 20 20 20    int bReset    
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10ef0 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 74   True to reset t
10f00 68 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20  he stats */.){. 
10f10 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74   int iCur;.  int
10f20 20 69 48 69 77 74 72 3b 0a 20 20 46 49 4c 45 20   iHiwtr;.  FILE 
10f30 2a 6f 75 74 3b 0a 20 20 69 66 28 20 70 41 72 67  *out;.  if( pArg
10f40 3d 3d 30 20 7c 7c 20 70 41 72 67 2d 3e 6f 75 74  ==0 || pArg->out
10f50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
10f60 20 20 6f 75 74 20 3d 20 70 41 72 67 2d 3e 6f 75    out = pArg->ou
10f70 74 3b 0a 0a 20 20 69 66 28 20 70 41 72 67 2d 3e  t;..  if( pArg->
10f80 70 53 74 6d 74 20 26 26 20 28 70 41 72 67 2d 3e  pStmt && (pArg->
10f90 73 74 61 74 73 4f 6e 20 26 20 32 29 20 29 7b 0a  statsOn & 2) ){.
10fa0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 2c      int nCol, i,
10fb0 20 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   x;.    sqlite3_
10fc0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 41  stmt *pStmt = pA
10fd0 72 67 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 63  rg->pStmt;.    c
10fe0 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 20 20 20 20  har z[100];.    
10ff0 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
11000 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
11010 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  t);.    raw_prin
11020 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  tf(out, "%-36s %
11030 64 5c 6e 22 2c 20 22 4e 75 6d 62 65 72 20 6f 66  d\n", "Number of
11040 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 3a   output columns:
11050 22 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 66 6f  ", nCol);.    fo
11060 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
11070 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
11080 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
11090 6f 66 28 7a 29 2c 7a 2c 22 43 6f 6c 75 6d 6e 20  of(z),z,"Column 
110a0 25 64 20 25 6e 6e 61 6d 65 3a 22 2c 20 69 2c 20  %d %nname:", i, 
110b0 26 78 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  &x);.      utf8_
110c0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
110d0 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c  6s %s\n", z, sql
110e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
110f0 28 70 53 74 6d 74 2c 69 29 29 3b 0a 23 69 66 6e  (pStmt,i));.#ifn
11100 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11110 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20 20 73  DECLTYPE.      s
11120 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
11130 33 30 2c 20 7a 2b 78 2c 20 22 64 65 63 6c 61 72  30, z+x, "declar
11140 65 64 20 74 79 70 65 3a 22 29 3b 0a 20 20 20 20  ed type:");.    
11150 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
11160 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c  t, "%-36s %s\n",
11170 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   z, sqlite3_colu
11180 6d 6e 5f 64 65 63 6c 74 79 70 65 28 70 53 74 6d  mn_decltype(pStm
11190 74 2c 20 69 29 29 3b 0a 23 65 6e 64 69 66 0a 23  t, i));.#endif.#
111a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
111b0 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
111c0 41 54 41 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ATA.      sqlite
111d0 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a  3_snprintf(30, z
111e0 2b 78 2c 20 22 64 61 74 61 62 61 73 65 20 6e 61  +x, "database na
111f0 6d 65 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66  me:");.      utf
11200 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
11210 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73  -36s %s\n", z, s
11220 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61  qlite3_column_da
11230 74 61 62 61 73 65 5f 6e 61 6d 65 28 70 53 74 6d  tabase_name(pStm
11240 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  t,i));.      sql
11250 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30  ite3_snprintf(30
11260 2c 20 7a 2b 78 2c 20 22 74 61 62 6c 65 20 6e 61  , z+x, "table na
11270 6d 65 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66  me:");.      utf
11280 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
11290 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73  -36s %s\n", z, s
112a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61  qlite3_column_ta
112b0 62 6c 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69  ble_name(pStmt,i
112c0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
112d0 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a  3_snprintf(30, z
112e0 2b 78 2c 20 22 6f 72 69 67 69 6e 20 6e 61 6d 65  +x, "origin name
112f0 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  :");.      utf8_
11300 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
11310 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c  6s %s\n", z, sql
11320 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67  ite3_column_orig
11330 69 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29  in_name(pStmt,i)
11340 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
11350 20 20 7d 0a 0a 20 20 64 69 73 70 6c 61 79 53 74    }..  displaySt
11360 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4d 65  atLine(pArg, "Me
11370 6d 6f 72 79 20 55 73 65 64 3a 22 2c 0a 20 20 20  mory Used:",.   
11380 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c    "%lld (max %ll
11390 64 29 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54  d) bytes", SQLIT
113a0 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f  E_STATUS_MEMORY_
113b0 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20  USED, bReset);. 
113c0 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
113d0 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f  (pArg, "Number o
113e0 66 20 4f 75 74 73 74 61 6e 64 69 6e 67 20 41 6c  f Outstanding Al
113f0 6c 6f 63 61 74 69 6f 6e 73 3a 22 2c 0a 20 20 20  locations:",.   
11400 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c    "%lld (max %ll
11410 64 29 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  d)", SQLITE_STAT
11420 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c  US_MALLOC_COUNT,
11430 20 62 52 65 73 65 74 29 3b 0a 20 20 69 66 28 20   bReset);.  if( 
11440 70 41 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20  pArg->shellFlgs 
11450 26 20 53 48 46 4c 47 5f 50 61 67 65 63 61 63 68  & SHFLG_Pagecach
11460 65 20 29 7b 0a 20 20 20 20 64 69 73 70 6c 61 79  e ){.    display
11470 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
11480 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65  Number of Pcache
11490 20 50 61 67 65 73 20 55 73 65 64 3a 22 2c 0a 20   Pages Used:",. 
114a0 20 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78        "%lld (max
114b0 20 25 6c 6c 64 29 20 70 61 67 65 73 22 2c 20 53   %lld) pages", S
114c0 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47  QLITE_STATUS_PAG
114d0 45 43 41 43 48 45 5f 55 53 45 44 2c 20 62 52 65  ECACHE_USED, bRe
114e0 73 65 74 29 3b 0a 20 20 7d 0a 20 20 64 69 73 70  set);.  }.  disp
114f0 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67  layStatLine(pArg
11500 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 50 63 61  , "Number of Pca
11510 63 68 65 20 4f 76 65 72 66 6c 6f 77 20 42 79 74  che Overflow Byt
11520 65 73 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64  es:",.     "%lld
11530 20 28 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65   (max %lld) byte
11540 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55  s", SQLITE_STATU
11550 53 5f 50 41 47 45 43 41 43 48 45 5f 4f 56 45 52  S_PAGECACHE_OVER
11560 46 4c 4f 57 2c 20 62 52 65 73 65 74 29 3b 0a 20  FLOW, bReset);. 
11570 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
11580 28 70 41 72 67 2c 20 22 4c 61 72 67 65 73 74 20  (pArg, "Largest 
11590 41 6c 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20 20  Allocation:",.  
115a0 20 20 20 22 25 6c 6c 64 20 62 79 74 65 73 22 2c     "%lld bytes",
115b0 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d   SQLITE_STATUS_M
115c0 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20 62 52 65 73  ALLOC_SIZE, bRes
115d0 65 74 29 3b 0a 20 20 64 69 73 70 6c 61 79 53 74  et);.  displaySt
115e0 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c 61  atLine(pArg, "La
115f0 72 67 65 73 74 20 50 63 61 63 68 65 20 41 6c 6c  rgest Pcache All
11600 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20  ocation:",.     
11610 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51  "%lld bytes", SQ
11620 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45  LITE_STATUS_PAGE
11630 43 41 43 48 45 5f 53 49 5a 45 2c 20 62 52 65 73  CACHE_SIZE, bRes
11640 65 74 29 3b 0a 23 69 66 64 65 66 20 59 59 54 52  et);.#ifdef YYTR
11650 41 43 4b 4d 41 58 53 54 41 43 4b 44 45 50 54 48  ACKMAXSTACKDEPTH
11660 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69  .  displayStatLi
11670 6e 65 28 70 41 72 67 2c 20 22 44 65 65 70 65 73  ne(pArg, "Deepes
11680 74 20 50 61 72 73 65 72 20 53 74 61 63 6b 3a 22  t Parser Stack:"
11690 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61  ,.     "%lld (ma
116a0 78 20 25 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45  x %lld)", SQLITE
116b0 5f 53 54 41 54 55 53 5f 50 41 52 53 45 52 5f 53  _STATUS_PARSER_S
116c0 54 41 43 4b 2c 20 62 52 65 73 65 74 29 3b 0a 23  TACK, bReset);.#
116d0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 64 62 20  endif..  if( db 
116e0 29 7b 0a 20 20 20 20 69 66 28 20 70 41 72 67 2d  ){.    if( pArg-
116f0 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 53 48 46  >shellFlgs & SHF
11700 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65 20 29 7b 0a  LG_Lookaside ){.
11710 20 20 20 20 20 20 69 48 69 77 74 72 20 3d 20 69        iHiwtr = i
11720 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Cur = -1;.      
11730 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
11740 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
11750 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f  TATUS_LOOKASIDE_
11760 55 53 45 44 2c 0a 20 20 20 20 20 20 20 20 20 20  USED,.          
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69                &i
11780 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
11790 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77  eset);.      raw
117a0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
117b0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
117c0 20 22 4c 6f 6f 6b 61 73 69 64 65 20 53 6c 6f 74   "Lookaside Slot
117d0 73 20 55 73 65 64 3a 20 20 20 20 20 20 20 20 20  s Used:         
117e0 20 20 20 20 20 20 20 25 64 20 28 6d 61 78 20 25         %d (max %
117f0 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  d)\n",.         
11800 20 20 20 20 20 69 43 75 72 2c 20 69 48 69 77 74       iCur, iHiwt
11810 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
11820 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
11830 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
11840 4c 4f 4f 4b 41 53 49 44 45 5f 48 49 54 2c 0a 20  LOOKASIDE_HIT,. 
11850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11860 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69         &iCur, &i
11870 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
11880 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
11890 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 75 63  (pArg->out, "Suc
118a0 63 65 73 73 66 75 6c 20 6c 6f 6f 6b 61 73 69 64  cessful lookasid
118b0 65 20 61 74 74 65 6d 70 74 73 3a 20 20 20 20 20  e attempts:     
118c0 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20    %d\n",.       
118d0 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a         iHiwtr);.
118e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
118f0 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
11900 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
11910 41 53 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c  ASIDE_MISS_SIZE,
11920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11930 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20           &iCur, 
11940 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
11950 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
11960 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c  tf(pArg->out, "L
11970 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65  ookaside failure
11980 73 20 64 75 65 20 74 6f 20 73 69 7a 65 3a 20 20  s due to size:  
11990 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20      %d\n",.     
119a0 20 20 20 20 20 20 20 20 20 69 48 69 77 74 72 29           iHiwtr)
119b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
119c0 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
119d0 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f  LITE_DBSTATUS_LO
119e0 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c  OKASIDE_MISS_FUL
119f0 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
11a00 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72             &iCur
11a10 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
11a20 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  t);.      raw_pr
11a30 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
11a40 22 4c 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c 75  "Lookaside failu
11a50 72 65 73 20 64 75 65 20 74 6f 20 4f 4f 4d 3a 20  res due to OOM: 
11a60 20 20 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20        %d\n",.   
11a70 20 20 20 20 20 20 20 20 20 20 20 69 48 69 77 74             iHiwt
11a80 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 48  r);.    }.    iH
11a90 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
11aa0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
11ab0 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
11ac0 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
11ad0 45 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26  E_USED, &iCur, &
11ae0 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
11af0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
11b00 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65  pArg->out, "Page
11b10 72 20 48 65 61 70 20 55 73 61 67 65 3a 20 20 20  r Heap Usage:   
11b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b30 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20   %d bytes\n",.  
11b40 20 20 20 20 20 20 20 20 20 20 69 43 75 72 29 3b            iCur);
11b50 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
11b60 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
11b70 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
11b80 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
11b90 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 26 69  US_CACHE_HIT, &i
11ba0 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29  Cur, &iHiwtr, 1)
11bb0 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
11bc0 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67  (pArg->out, "Pag
11bd0 65 20 63 61 63 68 65 20 68 69 74 73 3a 20 20 20  e cache hits:   
11be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bf0 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
11c00 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
11c10 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
11c20 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
11c30 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
11c40 53 5f 43 41 43 48 45 5f 4d 49 53 53 2c 20 26 69  S_CACHE_MISS, &i
11c50 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29  Cur, &iHiwtr, 1)
11c60 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
11c70 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67  (pArg->out, "Pag
11c80 65 20 63 61 63 68 65 20 6d 69 73 73 65 73 3a 20  e cache misses: 
11c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ca0 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
11cb0 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
11cc0 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
11cd0 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
11ce0 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
11cf0 53 5f 43 41 43 48 45 5f 57 52 49 54 45 2c 20 26  S_CACHE_WRITE, &
11d00 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31  iCur, &iHiwtr, 1
11d10 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
11d20 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61  f(pArg->out, "Pa
11d30 67 65 20 63 61 63 68 65 20 77 72 69 74 65 73 3a  ge cache writes:
11d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d50 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
11d60 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
11d70 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
11d80 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
11d90 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
11da0 55 53 5f 43 41 43 48 45 5f 53 50 49 4c 4c 2c 20  US_CACHE_SPILL, 
11db0 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
11dc0 31 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  1);.    raw_prin
11dd0 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50  tf(pArg->out, "P
11de0 61 67 65 20 63 61 63 68 65 20 73 70 69 6c 6c 73  age cache spills
11df0 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
11e00 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
11e10 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  ;.    iHiwtr = i
11e20 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
11e30 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
11e40 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
11e50 54 55 53 5f 53 43 48 45 4d 41 5f 55 53 45 44 2c  TUS_SCHEMA_USED,
11e60 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
11e70 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61   bReset);.    ra
11e80 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
11e90 75 74 2c 20 22 53 63 68 65 6d 61 20 48 65 61 70  ut, "Schema Heap
11ea0 20 55 73 61 67 65 3a 20 20 20 20 20 20 20 20 20   Usage:         
11eb0 20 20 20 20 20 20 20 20 20 20 25 64 20 62 79 74            %d byt
11ec0 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
11ed0 20 20 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48     iCur);.    iH
11ee0 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
11ef0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
11f00 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
11f10 54 45 5f 44 42 53 54 41 54 55 53 5f 53 54 4d 54  TE_DBSTATUS_STMT
11f20 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69  _USED, &iCur, &i
11f30 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
11f40 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
11f50 41 72 67 2d 3e 6f 75 74 2c 20 22 53 74 61 74 65  Arg->out, "State
11f60 6d 65 6e 74 20 48 65 61 70 2f 4c 6f 6f 6b 61 73  ment Heap/Lookas
11f70 69 64 65 20 55 73 61 67 65 3a 20 20 20 20 20 20  ide Usage:      
11f80 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20  %d bytes\n",.   
11f90 20 20 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a           iCur);.
11fa0 20 20 7d 0a 0a 20 20 69 66 28 20 70 41 72 67 2d    }..  if( pArg-
11fb0 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 43  >pStmt ){.    iC
11fc0 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  ur = sqlite3_stm
11fd0 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70  t_status(pArg->p
11fe0 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d  Stmt, SQLITE_STM
11ff0 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
12000 5f 53 54 45 50 2c 0a 20 20 20 20 20 20 20 20 20  _STEP,.         
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12020 20 20 20 20 20 20 62 52 65 73 65 74 29 3b 0a 20        bReset);. 
12030 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12040 72 67 2d 3e 6f 75 74 2c 20 22 46 75 6c 6c 73 63  rg->out, "Fullsc
12050 61 6e 20 53 74 65 70 73 3a 20 20 20 20 20 20 20  an Steps:       
12060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12070 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
12080 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
12090 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
120a0 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
120b0 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c  STMTSTATUS_SORT,
120c0 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61   bReset);.    ra
120d0 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
120e0 75 74 2c 20 22 53 6f 72 74 20 4f 70 65 72 61 74  ut, "Sort Operat
120f0 69 6f 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20  ions:           
12100 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
12110 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72   iCur);.    iCur
12120 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
12130 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74  status(pArg->pSt
12140 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  mt, SQLITE_STMTS
12150 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c  TATUS_AUTOINDEX,
12160 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
12170 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12180 74 2c 20 22 41 75 74 6f 69 6e 64 65 78 20 49 6e  t, "Autoindex In
12190 73 65 72 74 73 3a 20 20 20 20 20 20 20 20 20 20  serts:          
121a0 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
121b0 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20  iCur);.    iCur 
121c0 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
121d0 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d  tatus(pArg->pStm
121e0 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  t, SQLITE_STMTST
121f0 41 54 55 53 5f 56 4d 5f 53 54 45 50 2c 20 62 52  ATUS_VM_STEP, bR
12200 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12210 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12220 20 22 56 69 72 74 75 61 6c 20 4d 61 63 68 69 6e   "Virtual Machin
12230 65 20 53 74 65 70 73 3a 20 20 20 20 20 20 20 20  e Steps:        
12240 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
12250 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
12260 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
12270 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
12280 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
12290 55 53 5f 52 45 50 52 45 50 41 52 45 2c 20 62 52  US_REPREPARE, bR
122a0 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
122b0 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
122c0 20 22 52 65 70 72 65 70 61 72 65 20 6f 70 65 72   "Reprepare oper
122d0 61 74 69 6f 6e 73 3a 20 20 20 20 20 20 20 20 20  ations:         
122e0 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
122f0 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
12300 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
12310 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
12320 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
12330 55 53 5f 52 55 4e 2c 20 62 52 65 73 65 74 29 3b  US_RUN, bReset);
12340 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
12350 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62  pArg->out, "Numb
12360 65 72 20 6f 66 20 74 69 6d 65 73 20 72 75 6e 3a  er of times run:
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12380 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12390 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65     iCur = sqlite
123a0 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41  3_stmt_status(pA
123b0 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54  rg->pStmt, SQLIT
123c0 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 4d 45 4d  E_STMTSTATUS_MEM
123d0 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20  USED, bReset);. 
123e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
123f0 72 67 2d 3e 6f 75 74 2c 20 22 4d 65 6d 6f 72 79  rg->out, "Memory
12400 20 75 73 65 64 20 62 79 20 70 72 65 70 61 72 65   used by prepare
12410 64 20 73 74 6d 74 3a 20 20 20 20 20 20 20 20 25  d stmt:        %
12420 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 7d  d\n", iCur);.  }
12430 0a 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78  ..#ifdef __linux
12440 5f 5f 0a 20 20 64 69 73 70 6c 61 79 4c 69 6e 75  __.  displayLinu
12450 78 49 6f 53 74 61 74 73 28 70 41 72 67 2d 3e 6f  xIoStats(pArg->o
12460 75 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ut);.#endif..  /
12470 2a 20 44 6f 20 6e 6f 74 20 72 65 6d 6f 76 65 20  * Do not remove 
12480 74 68 69 73 20 6d 61 63 68 69 6e 65 20 72 65 61  this machine rea
12490 64 61 62 6c 65 20 63 6f 6d 6d 65 6e 74 3a 20 65  dable comment: e
124a0 78 74 72 61 2d 73 74 61 74 73 2d 6f 75 74 70 75  xtra-stats-outpu
124b0 74 2d 68 65 72 65 20 2a 2f 0a 0a 20 20 72 65 74  t-here */..  ret
124c0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
124d0 44 69 73 70 6c 61 79 20 73 63 61 6e 20 73 74 61  Display scan sta
124e0 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
124f0 69 64 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73  id display_scans
12500 74 61 74 73 28 0a 20 20 73 71 6c 69 74 65 33 20  tats(.  sqlite3 
12510 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
12520 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
12530 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  ase to query */.
12540 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41    ShellState *pA
12550 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
12560 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
12570 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 29 7b  ShellState */.){
12580 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12590 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
125a0 53 54 41 54 55 53 0a 20 20 55 4e 55 53 45 44 5f  STATUS.  UNUSED_
125b0 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20  PARAMETER(db);. 
125c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
125d0 52 28 70 41 72 67 29 3b 0a 23 65 6c 73 65 0a 20  R(pArg);.#else. 
125e0 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78   int i, k, n, mx
125f0 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70  ;.  raw_printf(p
12600 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d  Arg->out, "-----
12610 2d 2d 2d 20 73 63 61 6e 73 74 61 74 73 20 2d 2d  --- scanstats --
12620 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78  ------\n");.  mx
12630 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b   = 0;.  for(k=0;
12640 20 6b 3c 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20   k<=mx; k++){.  
12650 20 20 64 6f 75 62 6c 65 20 72 45 73 74 4c 6f 6f    double rEstLoo
12660 70 20 3d 20 31 2e 30 3b 0a 20 20 20 20 66 6f 72  p = 1.0;.    for
12670 28 69 3d 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b  (i=n=0; 1; i++){
12680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
12690 74 6d 74 20 2a 70 20 3d 20 70 41 72 67 2d 3e 70  tmt *p = pArg->p
126a0 53 74 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Stmt;.      sqli
126b0 74 65 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c  te3_int64 nLoop,
126c0 20 6e 56 69 73 69 74 3b 0a 20 20 20 20 20 20 64   nVisit;.      d
126d0 6f 75 62 6c 65 20 72 45 73 74 3b 0a 20 20 20 20  ouble rEst;.    
126e0 20 20 69 6e 74 20 69 53 69 64 3b 0a 20 20 20 20    int iSid;.    
126f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
12700 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 69 66  xplain;.      if
12710 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  ( sqlite3_stmt_s
12720 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20  canstatus(p, i, 
12730 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
12740 4e 4c 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e  NLOOP, (void*)&n
12750 4c 6f 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20  Loop) ){.       
12760 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
12770 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
12780 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c  mt_scanstatus(p,
12790 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53   i, SQLITE_SCANS
127a0 54 41 54 5f 53 45 4c 45 43 54 49 44 2c 20 28 76  TAT_SELECTID, (v
127b0 6f 69 64 2a 29 26 69 53 69 64 29 3b 0a 20 20 20  oid*)&iSid);.   
127c0 20 20 20 69 66 28 20 69 53 69 64 3e 6d 78 20 29     if( iSid>mx )
127d0 20 6d 78 20 3d 20 69 53 69 64 3b 0a 20 20 20 20   mx = iSid;.    
127e0 20 20 69 66 28 20 69 53 69 64 21 3d 6b 20 29 20    if( iSid!=k ) 
127f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
12800 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
12810 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 3d 20 28      rEstLoop = (
12820 64 6f 75 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20  double)nLoop;.  
12830 20 20 20 20 20 20 69 66 28 20 6b 3e 30 20 29 20        if( k>0 ) 
12840 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
12850 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20  >out, "-------- 
12860 73 75 62 71 75 65 72 79 20 25 64 20 2d 2d 2d 2d  subquery %d ----
12870 2d 2d 2d 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20 20  ---\n", k);.    
12880 20 20 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20    }.      n++;. 
12890 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
128a0 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20  t_scanstatus(p, 
128b0 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54  i, SQLITE_SCANST
128c0 41 54 5f 4e 56 49 53 49 54 2c 20 28 76 6f 69 64  AT_NVISIT, (void
128d0 2a 29 26 6e 56 69 73 69 74 29 3b 0a 20 20 20 20  *)&nVisit);.    
128e0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
128f0 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20  canstatus(p, i, 
12900 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
12910 45 53 54 2c 20 28 76 6f 69 64 2a 29 26 72 45 73  EST, (void*)&rEs
12920 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
12930 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
12940 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53  s(p, i, SQLITE_S
12950 43 41 4e 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c  CANSTAT_EXPLAIN,
12960 20 28 76 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69   (void*)&zExplai
12970 6e 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  n);.      utf8_p
12980 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12990 20 22 4c 6f 6f 70 20 25 32 64 3a 20 25 73 5c 6e   "Loop %2d: %s\n
129a0 22 2c 20 6e 2c 20 7a 45 78 70 6c 61 69 6e 29 3b  ", n, zExplain);
129b0 0a 20 20 20 20 20 20 72 45 73 74 4c 6f 6f 70 20  .      rEstLoop 
129c0 2a 3d 20 72 45 73 74 3b 0a 20 20 20 20 20 20 72  *= rEst;.      r
129d0 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
129e0 6f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 22  out,.          "
129f0 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70 3d 25           nLoop=%
12a00 2d 38 6c 6c 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c  -8lld nRow=%-8ll
12a10 64 20 65 73 74 52 6f 77 3d 25 2d 38 6c 6c 64 20  d estRow=%-8lld 
12a20 65 73 74 52 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67  estRow/Loop=%-8g
12a30 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  \n",.          n
12a40 4c 6f 6f 70 2c 20 6e 56 69 73 69 74 2c 20 28 73  Loop, nVisit, (s
12a50 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72 45  qlite3_int64)(rE
12a60 73 74 4c 6f 6f 70 2b 30 2e 35 29 2c 20 72 45 73  stLoop+0.5), rEs
12a70 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  t.      );.    }
12a80 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74  .  }.  raw_print
12a90 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d  f(pArg->out, "--
12aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23  ---------\n");.#
12ac0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  endif.}../*.** P
12ad0 61 72 61 6d 65 74 65 72 20 61 7a 41 72 72 61 79  arameter azArray
12ae0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 7a 65 72   points to a zer
12af0 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 61 72 72  o-terminated arr
12b00 61 79 20 6f 66 20 73 74 72 69 6e 67 73 2e 20 7a  ay of strings. z
12b10 53 74 72 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  Str.** points to
12b20 20 61 20 73 69 6e 67 6c 65 20 6e 75 6c 2d 74 65   a single nul-te
12b30 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
12b40 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
12b50 20 69 66 20 7a 53 74 72 0a 2a 2a 20 69 73 20 65   if zStr.** is e
12b60 71 75 61 6c 2c 20 61 63 63 6f 72 64 69 6e 67 20  qual, according 
12b70 74 6f 20 73 74 72 63 6d 70 28 29 2c 20 74 6f 20  to strcmp(), to 
12b80 61 6e 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e  any of the strin
12b90 67 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  gs in the array.
12ba0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
12bb0 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  eturn zero..*/.s
12bc0 74 61 74 69 63 20 69 6e 74 20 73 74 72 5f 69 6e  tatic int str_in
12bd0 5f 61 72 72 61 79 28 63 6f 6e 73 74 20 63 68 61  _array(const cha
12be0 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63  r *zStr, const c
12bf0 68 61 72 20 2a 2a 61 7a 41 72 72 61 79 29 7b 0a  har **azArray){.
12c00 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
12c10 3d 30 3b 20 61 7a 41 72 72 61 79 5b 69 5d 3b 20  =0; azArray[i]; 
12c20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d  i++){.    if( 0=
12c30 3d 73 74 72 63 6d 70 28 7a 53 74 72 2c 20 61 7a  =strcmp(zStr, az
12c40 41 72 72 61 79 5b 69 5d 29 20 29 20 72 65 74 75  Array[i]) ) retu
12c50 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
12c60 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
12c70 66 20 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  f compiled state
12c80 6d 65 6e 74 20 70 53 71 6c 20 61 70 70 65 61 72  ment pSql appear
12c90 73 20 74 6f 20 62 65 20 61 6e 20 45 58 50 4c 41  s to be an EXPLA
12ca0 49 4e 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6c  IN statement, al
12cb0 6c 6f 63 61 74 65 0a 2a 2a 20 61 6e 64 20 70 6f  locate.** and po
12cc0 70 75 6c 61 74 65 20 74 68 65 20 53 68 65 6c 6c  pulate the Shell
12cd0 53 74 61 74 65 2e 61 69 49 6e 64 65 6e 74 5b 5d  State.aiIndent[]
12ce0 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20   array with the 
12cf0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 70 61  number of.** spa
12d00 63 65 73 20 65 61 63 68 20 6f 70 63 6f 64 65 20  ces each opcode 
12d10 73 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74  should be indent
12d20 65 64 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  ed before it is 
12d30 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  output..**.** Th
12d40 65 20 69 6e 64 65 6e 74 69 6e 67 20 72 75 6c 65  e indenting rule
12d50 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  s are:.**.**    
12d60 20 2a 20 46 6f 72 20 65 61 63 68 20 22 4e 65 78   * For each "Nex
12d70 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56 4e 65  t", "Prev", "VNe
12d80 78 74 22 20 6f 72 20 22 56 50 72 65 76 22 20 69  xt" or "VPrev" i
12d90 6e 73 74 72 75 63 74 69 6f 6e 2c 20 69 6e 64 65  nstruction, inde
12da0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 61 6c 6c 20  nt.**       all 
12db0 6f 70 63 6f 64 65 73 20 74 68 61 74 20 6f 63 63  opcodes that occ
12dc0 75 72 20 62 65 74 77 65 65 6e 20 74 68 65 20 70  ur between the p
12dd0 32 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  2 jump destinati
12de0 6f 6e 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64  on and the opcod
12df0 65 0a 2a 2a 20 20 20 20 20 20 20 69 74 73 65 6c  e.**       itsel
12e00 66 20 62 79 20 32 20 73 70 61 63 65 73 2e 0a 2a  f by 2 spaces..*
12e10 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65  *.**     * For e
12e20 61 63 68 20 22 47 6f 74 6f 22 2c 20 69 66 20 74  ach "Goto", if t
12e30 68 65 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74  he jump destinat
12e40 69 6f 6e 20 69 73 20 65 61 72 6c 69 65 72 20 69  ion is earlier i
12e50 6e 20 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a  n the program.**
12e60 20 20 20 20 20 20 20 61 6e 64 20 65 6e 64 73 20         and ends 
12e70 6f 6e 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20  on one of:.**   
12e80 20 20 20 20 20 20 20 59 69 65 6c 64 20 20 53 65         Yield  Se
12e90 65 6b 47 74 20 20 53 65 65 6b 4c 74 20 20 52 6f  ekGt  SeekLt  Ro
12ea0 77 53 65 74 52 65 61 64 20 20 52 65 77 69 6e 64  wSetRead  Rewind
12eb0 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 69 66 20  .**       or if 
12ec0 74 68 65 20 50 31 20 70 61 72 61 6d 65 74 65 72  the P1 parameter
12ed0 20 69 73 20 6f 6e 65 20 69 6e 73 74 65 61 64 20   is one instead 
12ee0 6f 66 20 7a 65 72 6f 2c 0a 2a 2a 20 20 20 20 20  of zero,.**     
12ef0 20 20 74 68 65 6e 20 69 6e 64 65 6e 74 20 61 6c    then indent al
12f00 6c 20 6f 70 63 6f 64 65 73 20 62 65 74 77 65 65  l opcodes betwee
12f10 6e 20 74 68 65 20 65 61 72 6c 69 65 72 20 69 6e  n the earlier in
12f20 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  struction.**    
12f30 20 20 20 61 6e 64 20 22 47 6f 74 6f 22 20 62 79     and "Goto" by
12f40 20 32 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74   2 spaces..*/.st
12f50 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
12f60 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 53  n_data_prepare(S
12f70 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 73 71  hellState *p, sq
12f80 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c  lite3_stmt *pSql
12f90 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
12fa0 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20  *zSql;          
12fb0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74       /* The text
12fc0 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61 74   of the SQL stat
12fd0 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ement */.  const
12fe0 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
12ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
13000 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
13010 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49  his is an EXPLAI
13020 4e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 62 59 69  N */.  int *abYi
13030 65 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  eld = 0;        
13040 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
13050 66 20 6f 70 20 69 73 20 61 6e 20 4f 50 5f 59 69  f op is an OP_Yi
13060 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c  eld */.  int nAl
13070 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  loc = 0;        
13080 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
13090 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 70 2d  cated size of p-
130a0 3e 61 69 49 6e 64 65 6e 74 5b 5d 2c 20 61 62 59  >aiIndent[], abY
130b0 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  ield */.  int iO
130c0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
130d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
130e0 65 78 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20  ex of operation 
130f0 69 6e 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d  in p->aiIndent[]
13100 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61   */..  const cha
13110 72 20 2a 61 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20  r *azNext[] = { 
13120 22 4e 65 78 74 22 2c 20 22 50 72 65 76 22 2c 20  "Next", "Prev", 
13130 22 56 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22  "VPrev", "VNext"
13140 2c 20 22 53 6f 72 74 65 72 4e 65 78 74 22 2c 20  , "SorterNext", 
13150 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  0 };.  const cha
13160 72 20 2a 61 7a 59 69 65 6c 64 5b 5d 20 3d 20 7b  r *azYield[] = {
13170 20 22 59 69 65 6c 64 22 2c 20 22 53 65 65 6b 4c   "Yield", "SeekL
13180 54 22 2c 20 22 53 65 65 6b 47 54 22 2c 20 22 52  T", "SeekGT", "R
13190 6f 77 53 65 74 52 65 61 64 22 2c 0a 20 20 20 20  owSetRead",.    
131a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131b0 20 20 20 20 20 20 20 20 22 52 65 77 69 6e 64 22          "Rewind"
131c0 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63  , 0 };.  const c
131d0 68 61 72 20 2a 61 7a 47 6f 74 6f 5b 5d 20 3d 20  har *azGoto[] = 
131e0 7b 20 22 47 6f 74 6f 22 2c 20 30 20 7d 3b 0a 0a  { "Goto", 0 };..
131f0 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 67 75    /* Try to figu
13200 72 65 20 6f 75 74 20 69 66 20 74 68 69 73 20 69  re out if this i
13210 73 20 72 65 61 6c 6c 79 20 61 6e 20 45 58 50 4c  s really an EXPL
13220 41 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e 20 49  AIN statement. I
13230 66 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 6e 6e  f this.  ** cann
13240 6f 74 20 62 65 20 76 65 72 69 66 69 65 64 2c 20  ot be verified, 
13250 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 20 2a  return early.  *
13260 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
13270 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 71  column_count(pSq
13280 6c 29 21 3d 38 20 29 7b 0a 20 20 20 20 70 2d 3e  l)!=8 ){.    p->
13290 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b  cMode = p->mode;
132a0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
132b0 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
132c0 33 5f 73 71 6c 28 70 53 71 6c 29 3b 0a 20 20 69  3_sql(pSql);.  i
132d0 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74  f( zSql==0 ) ret
132e0 75 72 6e 3b 0a 20 20 66 6f 72 28 7a 3d 7a 53 71  urn;.  for(z=zSq
132f0 6c 3b 20 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a  l; *z==' ' || *z
13300 3d 3d 27 5c 74 27 20 7c 7c 20 2a 7a 3d 3d 27 5c  =='\t' || *z=='\
13310 6e 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 66 27 20 7c  n' || *z=='\f' |
13320 7c 20 2a 7a 3d 3d 27 5c 72 27 3b 20 7a 2b 2b 29  | *z=='\r'; z++)
13330 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
13340 73 74 72 6e 69 63 6d 70 28 7a 2c 20 22 65 78 70  strnicmp(z, "exp
13350 6c 61 69 6e 22 2c 20 37 29 20 29 7b 0a 20 20 20  lain", 7) ){.   
13360 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d   p->cMode = p->m
13370 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ode;.    return;
13380 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 4f 70 3d  .  }..  for(iOp=
13390 30 3b 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  0; SQLITE_ROW==s
133a0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c  qlite3_step(pSql
133b0 29 3b 20 69 4f 70 2b 2b 29 7b 0a 20 20 20 20 69  ); iOp++){.    i
133c0 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 69 41  nt i;.    int iA
133d0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ddr = sqlite3_co
133e0 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 30  lumn_int(pSql, 0
133f0 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
13400 72 20 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20  r *zOp = (const 
13410 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
13420 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
13430 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  1);..    /* Set 
13440 70 32 20 74 6f 20 74 68 65 20 50 32 20 66 69 65  p2 to the P2 fie
13450 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ld of the curren
13460 74 20 6f 70 63 6f 64 65 2e 20 54 68 65 6e 2c 20  t opcode. Then, 
13470 61 73 73 75 6d 69 6e 67 20 74 68 61 74 0a 20 20  assuming that.  
13480 20 20 2a 2a 20 70 32 20 69 73 20 61 6e 20 69 6e    ** p2 is an in
13490 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 65 73  struction addres
134a0 73 2c 20 73 65 74 20 76 61 72 69 61 62 6c 65 20  s, set variable 
134b0 70 32 6f 70 20 74 6f 20 74 68 65 20 69 6e 64 65  p2op to the inde
134c0 78 20 6f 66 20 74 68 61 74 0a 20 20 20 20 2a 2a  x of that.    **
134d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20   instruction in 
134e0 74 68 65 20 61 69 49 6e 64 65 6e 74 5b 5d 20 61  the aiIndent[] a
134f0 72 72 61 79 2e 20 70 32 20 61 6e 64 20 70 32 6f  rray. p2 and p2o
13500 70 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65  p may be differe
13510 6e 74 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65  nt if.    ** the
13520 20 63 75 72 72 65 6e 74 20 69 6e 73 74 72 75 63   current instruc
13530 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  tion is part of 
13540 61 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 67 65  a sub-program ge
13550 6e 65 72 61 74 65 64 20 62 79 20 61 6e 0a 20 20  nerated by an.  
13560 20 20 2a 2a 20 53 51 4c 20 74 72 69 67 67 65 72    ** SQL trigger
13570 20 6f 72 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e   or foreign key.
13580 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70 32 20    */.    int p2 
13590 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
135a0 5f 69 6e 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20  _int(pSql, 3);. 
135b0 20 20 20 69 6e 74 20 70 32 6f 70 20 3d 20 28 70     int p2op = (p
135c0 32 20 2b 20 28 69 4f 70 2d 69 41 64 64 72 29 29  2 + (iOp-iAddr))
135d0 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74  ;..    /* Grow t
135e0 68 65 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 61  he p->aiIndent a
135f0 72 72 61 79 20 61 73 20 72 65 71 75 69 72 65 64  rray as required
13600 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4f 70 3e   */.    if( iOp>
13610 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  =nAlloc ){.     
13620 20 69 66 28 20 69 4f 70 3d 3d 30 20 29 7b 0a 20   if( iOp==0 ){. 
13630 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 66 75 72         /* Do fur
13640 74 68 65 72 20 76 65 72 66 69 63 61 74 69 6f 6e  ther verfication
13650 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65 78   that this is ex
13660 70 6c 61 69 6e 20 6f 75 74 70 75 74 2e 20 20 41  plain output.  A
13670 62 6f 72 74 20 69 66 0a 20 20 20 20 20 20 20 20  bort if.        
13680 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 2a 2f 0a  ** it is not */.
13690 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
136a0 6f 6e 73 74 20 63 68 61 72 20 2a 65 78 70 6c 61  onst char *expla
136b0 69 6e 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20  inCols[] = {.   
136c0 20 20 20 20 20 20 20 20 22 61 64 64 72 22 2c 20          "addr", 
136d0 22 6f 70 63 6f 64 65 22 2c 20 22 70 31 22 2c 20  "opcode", "p1", 
136e0 22 70 32 22 2c 20 22 70 33 22 2c 20 22 70 34 22  "p2", "p3", "p4"
136f0 2c 20 22 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74  , "p5", "comment
13700 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  " };.        int
13710 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72   jj;.        for
13720 28 6a 6a 3d 30 3b 20 6a 6a 3c 41 72 72 61 79 53  (jj=0; jj<ArrayS
13730 69 7a 65 28 65 78 70 6c 61 69 6e 43 6f 6c 73 29  ize(explainCols)
13740 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; jj++){.       
13750 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 73 71     if( strcmp(sq
13760 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
13770 65 28 70 53 71 6c 2c 6a 6a 29 2c 65 78 70 6c 61  e(pSql,jj),expla
13780 69 6e 43 6f 6c 73 5b 6a 6a 5d 29 21 3d 30 20 29  inCols[jj])!=0 )
13790 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
137a0 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  >cMode = p->mode
137b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
137c0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 71 6c  lite3_reset(pSql
137d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
137e0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20  eturn;.         
137f0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
13800 20 20 20 7d 0a 20 20 20 20 20 20 6e 41 6c 6c 6f     }.      nAllo
13810 63 20 2b 3d 20 31 30 30 3b 0a 20 20 20 20 20 20  c += 100;.      
13820 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d 20 28 69  p->aiIndent = (i
13830 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  nt*)sqlite3_real
13840 6c 6f 63 36 34 28 70 2d 3e 61 69 49 6e 64 65 6e  loc64(p->aiInden
13850 74 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  t, nAlloc*sizeof
13860 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66  (int));.      if
13870 28 20 70 2d 3e 61 69 49 6e 64 65 6e 74 3d 3d 30  ( p->aiIndent==0
13880 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
13890 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 20 20  memory();.      
138a0 61 62 59 69 65 6c 64 20 3d 20 28 69 6e 74 2a 29  abYield = (int*)
138b0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
138c0 34 28 61 62 59 69 65 6c 64 2c 20 6e 41 6c 6c 6f  4(abYield, nAllo
138d0 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a  c*sizeof(int));.
138e0 20 20 20 20 20 20 69 66 28 20 61 62 59 69 65 6c        if( abYiel
138f0 64 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74  d==0 ) shell_out
13900 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20  _of_memory();.  
13910 20 20 7d 0a 20 20 20 20 61 62 59 69 65 6c 64 5b    }.    abYield[
13920 69 4f 70 5d 20 3d 20 73 74 72 5f 69 6e 5f 61 72  iOp] = str_in_ar
13930 72 61 79 28 7a 4f 70 2c 20 61 7a 59 69 65 6c 64  ray(zOp, azYield
13940 29 3b 0a 20 20 20 20 70 2d 3e 61 69 49 6e 64 65  );.    p->aiInde
13950 6e 74 5b 69 4f 70 5d 20 3d 20 30 3b 0a 20 20 20  nt[iOp] = 0;.   
13960 20 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 69 4f   p->nIndent = iO
13970 70 2b 31 3b 0a 0a 20 20 20 20 69 66 28 20 73 74  p+1;..    if( st
13980 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20  r_in_array(zOp, 
13990 61 7a 4e 65 78 74 29 20 29 7b 0a 20 20 20 20 20  azNext) ){.     
139a0 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69   for(i=p2op; i<i
139b0 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e  Op; i++) p->aiIn
139c0 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20  dent[i] += 2;.  
139d0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 5f    }.    if( str_
139e0 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a  in_array(zOp, az
139f0 47 6f 74 6f 29 20 26 26 20 70 32 6f 70 3c 70 2d  Goto) && p2op<p-
13a00 3e 6e 49 6e 64 65 6e 74 0a 20 20 20 20 20 26 26  >nIndent.     &&
13a10 20 28 61 62 59 69 65 6c 64 5b 70 32 6f 70 5d 20   (abYield[p2op] 
13a20 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  || sqlite3_colum
13a30 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 32 29 29 0a  n_int(pSql, 2)).
13a40 20 20 20 20 29 7b 0a 20 20 20 20 20 20 66 6f 72      ){.      for
13a50 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20  (i=p2op; i<iOp; 
13a60 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74  i++) p->aiIndent
13a70 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a  [i] += 2;.    }.
13a80 20 20 7d 0a 0a 20 20 70 2d 3e 69 49 6e 64 65 6e    }..  p->iInden
13a90 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
13aa0 5f 66 72 65 65 28 61 62 59 69 65 6c 64 29 3b 0a  _free(abYield);.
13ab0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
13ac0 70 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pSql);.}../*.** 
13ad0 46 72 65 65 20 74 68 65 20 61 72 72 61 79 20 61  Free the array a
13ae0 6c 6c 6f 63 61 74 65 64 20 62 79 20 65 78 70 6c  llocated by expl
13af0 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65  ain_data_prepare
13b00 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
13b10 69 64 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f  id explain_data_
13b20 64 65 6c 65 74 65 28 53 68 65 6c 6c 53 74 61 74  delete(ShellStat
13b30 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
13b40 5f 66 72 65 65 28 70 2d 3e 61 69 49 6e 64 65 6e  _free(p->aiInden
13b50 74 29 3b 0a 20 20 70 2d 3e 61 69 49 6e 64 65 6e  t);.  p->aiInden
13b60 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 49 6e 64  t = 0;.  p->nInd
13b70 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 49  ent = 0;.  p->iI
13b80 6e 64 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ndent = 0;.}../*
13b90 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 6e 64 20  .** Disable and 
13ba0 72 65 73 74 6f 72 65 20 2e 77 68 65 72 65 74 72  restore .wheretr
13bb0 61 63 65 20 61 6e 64 20 2e 73 65 6c 65 63 74 74  ace and .selectt
13bc0 72 61 63 65 20 73 65 74 74 69 6e 67 73 2e 0a 2a  race settings..*
13bd0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
13be0 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
13bf0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
13c00 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45  ABLE_SELECTTRACE
13c10 29 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ).extern int sql
13c20 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 3b  ite3SelectTrace;
13c30 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
13c40 64 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 23 65  dSelectTrace;.#e
13c50 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
13c60 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26  (SQLITE_DEBUG) &
13c70 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
13c80 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41  _ENABLE_WHERETRA
13c90 43 45 29 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  CE).extern int s
13ca0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
13cb0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
13cc0 65 64 57 68 65 72 65 54 72 61 63 65 3b 0a 23 65  edWhereTrace;.#e
13cd0 6e 64 69 66 0a 73 74 61 74 69 63 20 76 6f 69 64  ndif.static void
13ce0 20 64 69 73 61 62 6c 65 5f 64 65 62 75 67 5f 74   disable_debug_t
13cf0 72 61 63 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29  race_modes(void)
13d00 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
13d10 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
13d20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
13d30 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45  ABLE_SELECTTRACE
13d40 29 0a 20 20 73 61 76 65 64 53 65 6c 65 63 74 54  ).  savedSelectT
13d50 72 61 63 65 20 3d 20 73 71 6c 69 74 65 33 53 65  race = sqlite3Se
13d60 6c 65 63 74 54 72 61 63 65 3b 0a 20 20 73 71 6c  lectTrace;.  sql
13d70 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
13d80 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  = 0;.#endif.#if 
13d90 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
13da0 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64  EBUG) && defined
13db0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57  (SQLITE_ENABLE_W
13dc0 48 45 52 45 54 52 41 43 45 29 0a 20 20 73 61 76  HERETRACE).  sav
13dd0 65 64 57 68 65 72 65 54 72 61 63 65 20 3d 20 73  edWhereTrace = s
13de0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
13df0 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  ;.  sqlite3Where
13e00 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Trace = 0;.#endi
13e10 66 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  f.}.static void 
13e20 72 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72  restore_debug_tr
13e30 61 63 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b  ace_modes(void){
13e40 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
13e50 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65  ITE_DEBUG) && de
13e60 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
13e70 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29  BLE_SELECTTRACE)
13e80 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
13e90 54 72 61 63 65 20 3d 20 73 61 76 65 64 53 65 6c  Trace = savedSel
13ea0 65 63 74 54 72 61 63 65 3b 0a 23 65 6e 64 69 66  ectTrace;.#endif
13eb0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
13ec0 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65  ITE_DEBUG) && de
13ed0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
13ee0 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a  BLE_WHERETRACE).
13ef0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72    sqlite3WhereTr
13f00 61 63 65 20 3d 20 73 61 76 65 64 57 68 65 72 65  ace = savedWhere
13f10 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a  Trace;.#endif.}.
13f20 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 70 72 65  ./*.** Run a pre
13f30 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a  pared statement.
13f40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
13f50 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d  xec_prepared_stm
13f60 74 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  t(.  ShellState 
13f70 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
13f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f90 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
13fa0 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a   to ShellState *
13fb0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
13fc0 20 2a 70 53 74 6d 74 20 20 20 20 20 20 20 20 20   *pStmt         
13fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fe0 20 20 20 20 20 2f 2a 20 53 74 61 74 6d 65 6e 74       /* Statment
13ff0 20 74 6f 20 72 75 6e 20 2a 2f 0a 29 7b 0a 20 20   to run */.){.  
14000 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 70 65  int rc;..  /* pe
14010 72 66 6f 72 6d 20 74 68 65 20 66 69 72 73 74 20  rform the first 
14020 73 74 65 70 2e 20 20 74 68 69 73 20 77 69 6c 6c  step.  this will
14030 20 74 65 6c 6c 20 75 73 20 69 66 20 77 65 0a 20   tell us if we. 
14040 20 2a 2a 20 68 61 76 65 20 61 20 72 65 73 75 6c   ** have a resul
14050 74 20 73 65 74 20 6f 72 20 6e 6f 74 20 61 6e 64  t set or not and
14060 20 68 6f 77 20 77 69 64 65 20 69 74 20 69 73 2e   how wide it is.
14070 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
14080 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
14090 3b 0a 20 20 2f 2a 20 69 66 20 77 65 20 68 61 76  ;.  /* if we hav
140a0 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 2e 2e  e a result set..
140b0 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
140c0 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a 20  E_ROW == rc ){. 
140d0 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73     /* allocate s
140e0 70 61 63 65 20 66 6f 72 20 63 6f 6c 20 6e 61 6d  pace for col nam
140f0 65 20 70 74 72 2c 20 76 61 6c 75 65 20 70 74 72  e ptr, value ptr
14100 2c 20 61 6e 64 20 74 79 70 65 20 2a 2f 0a 20 20  , and type */.  
14110 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73 71 6c    int nCol = sql
14120 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
14130 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 76 6f  t(pStmt);.    vo
14140 69 64 20 2a 70 44 61 74 61 20 3d 20 73 71 6c 69  id *pData = sqli
14150 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 33 2a 6e  te3_malloc64(3*n
14160 43 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e 73 74  Col*sizeof(const
14170 20 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a 20 20   char*) + 1);.  
14180 20 20 69 66 28 20 21 70 44 61 74 61 20 29 7b 0a    if( !pData ){.
14190 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
141a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
141b0 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
141c0 2a 61 7a 43 6f 6c 73 20 3d 20 28 63 68 61 72 20  *azCols = (char 
141d0 2a 2a 29 70 44 61 74 61 3b 20 20 20 20 20 20 2f  **)pData;      /
141e0 2a 20 4e 61 6d 65 73 20 6f 66 20 72 65 73 75 6c  * Names of resul
141f0 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  t columns */.   
14200 20 20 20 63 68 61 72 20 2a 2a 61 7a 56 61 6c 73     char **azVals
14210 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e 43 6f 6c 5d   = &azCols[nCol]
14220 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
14230 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
14240 2a 61 69 54 79 70 65 73 20 3d 20 28 69 6e 74 20  *aiTypes = (int 
14250 2a 29 26 61 7a 56 61 6c 73 5b 6e 43 6f 6c 5d 3b  *)&azVals[nCol];
14260 20 2f 2a 20 52 65 73 75 6c 74 20 74 79 70 65 73   /* Result types
14270 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   */.      int i,
14280 20 78 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   x;.      assert
14290 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 3c 3d 20  (sizeof(int) <= 
142a0 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 29 3b  sizeof(char *));
142b0 0a 20 20 20 20 20 20 2f 2a 20 73 61 76 65 20 6f  .      /* save o
142c0 66 66 20 70 74 72 73 20 74 6f 20 63 6f 6c 75 6d  ff ptrs to colum
142d0 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20  n names */.     
142e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
142f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
14300 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28 63 68 61  azCols[i] = (cha
14310 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
14320 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  mn_name(pStmt, i
14330 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14340 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20   do{.        /* 
14350 65 78 74 72 61 63 74 20 74 68 65 20 64 61 74 61  extract the data
14360 20 61 6e 64 20 64 61 74 61 20 74 79 70 65 73 20   and data types 
14370 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
14380 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
14390 7b 0a 20 20 20 20 20 20 20 20 20 20 61 69 54 79  {.          aiTy
143a0 70 65 73 5b 69 5d 20 3d 20 78 20 3d 20 73 71 6c  pes[i] = x = sql
143b0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
143c0 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
143d0 20 20 20 20 20 20 69 66 28 20 78 3d 3d 53 51 4c        if( x==SQL
143e0 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 41 72 67  ITE_BLOB && pArg
143f0 20 26 26 20 70 41 72 67 2d 3e 63 4d 6f 64 65 3d   && pArg->cMode=
14400 3d 4d 4f 44 45 5f 49 6e 73 65 72 74 20 29 7b 0a  =MODE_Insert ){.
14410 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 56 61              azVa
14420 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a 20 20 20 20  ls[i] = "";.    
14430 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14440 20 20 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b           azVals[
14450 69 5d 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  i] = (char*)sqli
14460 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
14470 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
14480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14490 20 69 66 28 20 21 61 7a 56 61 6c 73 5b 69 5d 20   if( !azVals[i] 
144a0 26 26 20 28 61 69 54 79 70 65 73 5b 69 5d 21 3d  && (aiTypes[i]!=
144b0 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a  SQLITE_NULL) ){.
144c0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
144d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
144e0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
144f0 3b 20 2f 2a 20 66 72 6f 6d 20 66 6f 72 20 2a 2f  ; /* from for */
14500 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14510 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 66 6f       } /* end fo
14520 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a  r */..        /*
14530 20 69 66 20 64 61 74 61 20 61 6e 64 20 74 79 70   if data and typ
14540 65 73 20 65 78 74 72 61 63 74 65 64 20 73 75 63  es extracted suc
14550 63 65 73 73 66 75 6c 6c 79 2e 2e 2e 20 2a 2f 0a  cessfully... */.
14560 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
14570 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a  TE_ROW == rc ){.
14580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61 6c            /* cal
14590 6c 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 63  l the supplied c
145a0 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
145b0 20 72 65 73 75 6c 74 20 72 6f 77 20 64 61 74 61   result row data
145c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
145d0 28 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b  ( shell_callback
145e0 28 70 41 72 67 2c 20 6e 43 6f 6c 2c 20 61 7a 56  (pArg, nCol, azV
145f0 61 6c 73 2c 20 61 7a 43 6f 6c 73 2c 20 61 69 54  als, azCols, aiT
14600 79 70 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20  ypes) ){.       
14610 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14620 5f 41 42 4f 52 54 3b 0a 20 20 20 20 20 20 20 20  _ABORT;.        
14630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14640 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14650 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
14660 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14670 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 77 68 69     }.      } whi
14680 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d  le( SQLITE_ROW =
14690 3d 20 72 63 20 29 3b 0a 20 20 20 20 20 20 73 71  = rc );.      sq
146a0 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61  lite3_free(pData
146b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
146c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
146d0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
146e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
146f0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
14700 6f 20 70 72 6f 63 65 73 73 20 53 51 4c 20 69 66  o process SQL if
14710 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 68   the previous sh
14720 65 6c 6c 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 77  ell command.** w
14730 61 73 20 22 2e 65 78 70 65 72 74 22 2e 20 49 74  as ".expert". It
14740 20 70 61 73 73 65 73 20 74 68 65 20 53 51 4c 20   passes the SQL 
14750 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  in the second ar
14760 67 75 6d 65 6e 74 20 64 69 72 65 63 74 6c 79 20  gument directly 
14770 74 6f 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  to.** the sqlite
14780 33 65 78 70 65 72 74 20 6f 62 6a 65 63 74 2e 0a  3expert object..
14790 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
147a0 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
147b0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
147c0 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65  rwise, an SQLite
147d0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20   error.** code. 
147e0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 28 2a  In this case, (*
147f0 70 7a 45 72 72 29 20 6d 61 79 20 62 65 20 73 65  pzErr) may be se
14800 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
14810 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
14820 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20  g.** an English 
14830 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d  language error m
14840 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
14850 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
14860 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
14870 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
14880 66 72 65 65 20 74 68 69 73 20 62 75 66 66 65 72  free this buffer
14890 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66   using sqlite3_f
148a0 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
148b0 20 69 6e 74 20 65 78 70 65 72 74 48 61 6e 64 6c   int expertHandl
148c0 65 53 51 4c 28 0a 20 20 53 68 65 6c 6c 53 74 61  eSQL(.  ShellSta
148d0 74 65 20 2a 70 53 74 61 74 65 2c 20 0a 20 20 63  te *pState, .  c
148e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
148f0 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72   .  char **pzErr
14900 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 53  .){.  assert( pS
14910 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
14920 70 65 72 74 20 29 3b 0a 20 20 61 73 73 65 72 74  pert );.  assert
14930 28 20 70 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a 70  ( pzErr==0 || *p
14940 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20 72 65 74  zErr==0 );.  ret
14950 75 72 6e 20 73 71 6c 69 74 65 33 5f 65 78 70 65  urn sqlite3_expe
14960 72 74 5f 73 71 6c 28 70 53 74 61 74 65 2d 3e 65  rt_sql(pState->e
14970 78 70 65 72 74 2e 70 45 78 70 65 72 74 2c 20 7a  xpert.pExpert, z
14980 53 71 6c 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a  Sql, pzErr);.}..
14990 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
149a0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 65 69  ion is called ei
149b0 74 68 65 72 20 74 6f 20 73 69 6c 65 6e 74 6c 79  ther to silently
149c0 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 6f 62   clean up the ob
149d0 6a 65 63 74 0a 2a 2a 20 63 72 65 61 74 65 64 20  ject.** created 
149e0 62 79 20 74 68 65 20 22 2e 65 78 70 65 72 74 22  by the ".expert"
149f0 20 63 6f 6d 6d 61 6e 64 20 28 69 66 20 62 43 61   command (if bCa
14a00 6e 63 65 6c 3d 3d 31 29 2c 20 6f 72 20 74 6f 20  ncel==1), or to 
14a10 67 65 6e 65 72 61 74 65 20 61 20 0a 2a 2a 20 72  generate a .** r
14a20 65 70 6f 72 74 20 66 72 6f 6d 20 69 74 20 61 6e  eport from it an
14a30 64 20 74 68 65 6e 20 63 6c 65 61 6e 20 69 74 20  d then clean it 
14a40 75 70 20 28 69 66 20 62 43 61 6e 63 65 6c 3d 3d  up (if bCancel==
14a50 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  0)..**.** If suc
14a60 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
14a70 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
14a80 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51  Otherwise, an SQ
14a90 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  Lite error.** co
14aa0 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  de. In this case
14ab0 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79 20 62  , (*pzErr) may b
14ac0 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
14ad0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
14ae0 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c  ining.** an Engl
14af0 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72  ish language err
14b00 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  or message. It i
14b10 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
14b20 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63  lity of the.** c
14b30 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
14b40 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 62 75  lly free this bu
14b50 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ffer using sqlit
14b60 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
14b70 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74 46  atic int expertF
14b80 69 6e 69 73 68 28 0a 20 20 53 68 65 6c 6c 53 74  inish(.  ShellSt
14b90 61 74 65 20 2a 70 53 74 61 74 65 2c 0a 20 20 69  ate *pState,.  i
14ba0 6e 74 20 62 43 61 6e 63 65 6c 2c 0a 20 20 63 68  nt bCancel,.  ch
14bb0 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
14bc0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14bd0 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 65 78 70  OK;.  sqlite3exp
14be0 65 72 74 20 2a 70 20 3d 20 70 53 74 61 74 65 2d  ert *p = pState-
14bf0 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 3b  >expert.pExpert;
14c00 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a  .  assert( p );.
14c10 20 20 61 73 73 65 72 74 28 20 62 43 61 6e 63 65    assert( bCance
14c20 6c 20 7c 7c 20 70 7a 45 72 72 3d 3d 30 20 7c 7c  l || pzErr==0 ||
14c30 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20   *pzErr==0 );.  
14c40 69 66 28 20 62 43 61 6e 63 65 6c 3d 3d 30 20 29  if( bCancel==0 )
14c50 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
14c60 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b 0a 20  = pState->out;. 
14c70 20 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20     int bVerbose 
14c80 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74  = pState->expert
14c90 2e 62 56 65 72 62 6f 73 65 3b 0a 0a 20 20 20 20  .bVerbose;..    
14ca0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  rc = sqlite3_exp
14cb0 65 72 74 5f 61 6e 61 6c 79 7a 65 28 70 2c 20 70  ert_analyze(p, p
14cc0 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 72  zErr);.    if( r
14cd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14ce0 20 20 20 20 20 20 69 6e 74 20 6e 51 75 65 72 79        int nQuery
14cf0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72   = sqlite3_exper
14d00 74 5f 63 6f 75 6e 74 28 70 29 3b 0a 20 20 20 20  t_count(p);.    
14d10 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20    int i;..      
14d20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a  if( bVerbose ){.
14d30 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
14d40 61 72 20 2a 7a 43 61 6e 64 20 3d 20 73 71 6c 69  ar *zCand = sqli
14d50 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72  te3_expert_repor
14d60 74 28 70 2c 30 2c 45 58 50 45 52 54 5f 52 45 50  t(p,0,EXPERT_REP
14d70 4f 52 54 5f 43 41 4e 44 49 44 41 54 45 53 29 3b  ORT_CANDIDATES);
14d80 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
14d90 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 43 61 6e  ntf(out, "-- Can
14da0 64 69 64 61 74 65 73 20 2d 2d 2d 2d 2d 2d 2d 2d  didates --------
14db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14dc0 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 20 20 20  -----\n");.     
14dd0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
14de0 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 43 61 6e 64  t, "%s\n", zCand
14df0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14e00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 51 75 65   for(i=0; i<nQue
14e10 72 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ry; i++){.      
14e20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
14e30 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  ql = sqlite3_exp
14e40 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c  ert_report(p, i,
14e50 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 53   EXPERT_REPORT_S
14e60 51 4c 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  QL);.        con
14e70 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20 3d 20  st char *zIdx = 
14e80 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72  sqlite3_expert_r
14e90 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45  eport(p, i, EXPE
14ea0 52 54 5f 52 45 50 4f 52 54 5f 49 4e 44 45 58 45  RT_REPORT_INDEXE
14eb0 53 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  S);.        cons
14ec0 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d 20 73  t char *zEQP = s
14ed0 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65  qlite3_expert_re
14ee0 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45 52  port(p, i, EXPER
14ef0 54 5f 52 45 50 4f 52 54 5f 50 4c 41 4e 29 3b 0a  T_REPORT_PLAN);.
14f00 20 20 20 20 20 20 20 20 69 66 28 20 7a 49 64 78          if( zIdx
14f10 3d 3d 30 20 29 20 7a 49 64 78 20 3d 20 22 28 6e  ==0 ) zIdx = "(n
14f20 6f 20 6e 65 77 20 69 6e 64 65 78 65 73 29 5c 6e  o new indexes)\n
14f30 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  ";.        if( b
14f40 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20  Verbose ){.     
14f50 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
14f60 6f 75 74 2c 20 22 2d 2d 20 51 75 65 72 79 20 25  out, "-- Query %
14f70 64 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  d --------------
14f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f90 2d 2d 5c 6e 22 2c 69 2b 31 29 3b 0a 20 20 20 20  --\n",i+1);.    
14fa0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
14fb0 28 6f 75 74 2c 20 22 25 73 5c 6e 5c 6e 22 2c 20  (out, "%s\n\n", 
14fc0 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  zSql);.        }
14fd0 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
14fe0 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  ntf(out, "%s\n",
14ff0 20 7a 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   zIdx);.        
15000 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
15010 22 25 73 5c 6e 22 2c 20 7a 45 51 50 29 3b 0a 20  "%s\n", zEQP);. 
15020 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15030 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72  .  sqlite3_exper
15040 74 5f 64 65 73 74 72 6f 79 28 70 29 3b 0a 20 20  t_destroy(p);.  
15050 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
15060 45 78 70 65 72 74 20 3d 20 30 3b 0a 20 20 72 65  Expert = 0;.  re
15070 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15080 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
15090 20 6f 66 20 22 2e 65 78 70 65 72 74 22 20 64 6f   of ".expert" do
150a0 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74  t command..*/.st
150b0 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74 44  atic int expertD
150c0 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65  otCommand(.  She
150d0 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
150e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
150f0 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f  Current shell to
15100 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68  ol state */.  ch
15110 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20  ar **azArg,     
15120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15130 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65   Array of argume
15140 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f  nts passed to do
15150 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  t command */.  i
15160 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20 20  nt nArg         
15170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15180 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
15190 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a  ies in azArg[] *
151a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
151b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61  SQLITE_OK;.  cha
151c0 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69  r *zErr = 0;.  i
151d0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 53 61 6d  nt i;.  int iSam
151e0 70 6c 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ple = 0;..  asse
151f0 72 74 28 20 70 53 74 61 74 65 2d 3e 65 78 70 65  rt( pState->expe
15200 72 74 2e 70 45 78 70 65 72 74 3d 3d 30 20 29 3b  rt.pExpert==0 );
15210 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 74 61 74  .  memset(&pStat
15220 65 2d 3e 65 78 70 65 72 74 2c 20 30 2c 20 73 69  e->expert, 0, si
15230 7a 65 6f 66 28 45 78 70 65 72 74 49 6e 66 6f 29  zeof(ExpertInfo)
15240 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72  );..  for(i=1; r
15250 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15260 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
15270 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72    char *z = azAr
15280 67 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  g[i];.    int n;
15290 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
152a0 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20  -' && z[1]=='-' 
152b0 29 20 7a 2b 2b 3b 0a 20 20 20 20 6e 20 3d 20 73  ) z++;.    n = s
152c0 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
152d0 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73  if( n>=2 && 0==s
152e0 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 76 65 72 62  trncmp(z, "-verb
152f0 6f 73 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20  ose", n) ){.    
15300 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74    pState->expert
15310 2e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20  .bVerbose = 1;. 
15320 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
15330 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73 74 72  ( n>=2 && 0==str
15340 6e 63 6d 70 28 7a 2c 20 22 2d 73 61 6d 70 6c 65  ncmp(z, "-sample
15350 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20 69  ", n) ){.      i
15360 66 28 20 69 3d 3d 28 6e 41 72 67 2d 31 29 20 29  f( i==(nArg-1) )
15370 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
15380 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f 70  intf(stderr, "op
15390 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e  tion requires an
153a0 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 5c 6e 22   argument: %s\n"
153b0 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 63  , z);.        rc
153c0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
153d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
153e0 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d 20        iSample = 
153f0 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75  (int)integerValu
15400 65 28 61 7a 41 72 67 5b 2b 2b 69 5d 29 3b 0a 20  e(azArg[++i]);. 
15410 20 20 20 20 20 20 20 69 66 28 20 69 53 61 6d 70         if( iSamp
15420 6c 65 3c 30 20 7c 7c 20 69 53 61 6d 70 6c 65 3e  le<0 || iSample>
15430 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  100 ){.         
15440 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
15450 72 72 2c 20 22 76 61 6c 75 65 20 6f 75 74 20 6f  rr, "value out o
15460 66 20 72 61 6e 67 65 3a 20 25 73 5c 6e 22 2c 20  f range: %s\n", 
15470 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
15480 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15490 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
154a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
154b0 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
154c0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
154d0 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  r, "unknown opti
154e0 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  on: %s\n", z);. 
154f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15500 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
15510 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
15520 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 53  ITE_OK ){.    pS
15530 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
15540 70 65 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 65  pert = sqlite3_e
15550 78 70 65 72 74 5f 6e 65 77 28 70 53 74 61 74 65  xpert_new(pState
15560 2d 3e 64 62 2c 20 26 7a 45 72 72 29 3b 0a 20 20  ->db, &zErr);.  
15570 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e 65 78    if( pState->ex
15580 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d 30 20  pert.pExpert==0 
15590 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
155a0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 71 6c  ntf(stderr, "sql
155b0 69 74 65 33 5f 65 78 70 65 72 74 5f 6e 65 77 3a  ite3_expert_new:
155c0 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20   %s\n", zErr);. 
155d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
155e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
155f0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
15600 5f 65 78 70 65 72 74 5f 63 6f 6e 66 69 67 28 0a  _expert_config(.
15610 20 20 20 20 20 20 20 20 20 20 70 53 74 61 74 65            pState
15620 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
15630 2c 20 45 58 50 45 52 54 5f 43 4f 4e 46 49 47 5f  , EXPERT_CONFIG_
15640 53 41 4d 50 4c 45 2c 20 69 53 61 6d 70 6c 65 0a  SAMPLE, iSample.
15650 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
15660 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
15670 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e  .}.#endif /* ifn
15680 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15690 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
156a0 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
156b0 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 65   statement or se
156c0 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 2e  t of statements.
156d0 20 20 50 72 69 6e 74 0a 2a 2a 20 61 6e 79 20 72    Print.** any r
156e0 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f 6c 75 6d  esult rows/colum
156f0 6e 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ns depending on 
15700 74 68 65 20 63 75 72 72 65 6e 74 20 6d 6f 64 65  the current mode
15710 0a 2a 2a 20 73 65 74 20 76 69 61 20 74 68 65 20  .** set via the 
15720 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63  supplied callbac
15730 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  k..**.** This is
15740 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20 74 6f   very similar to
15750 20 53 51 4c 69 74 65 27 73 20 62 75 69 6c 74 2d   SQLite's built-
15760 69 6e 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  in sqlite3_exec(
15770 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 65 78  ).** function ex
15780 63 65 70 74 20 69 74 20 74 61 6b 65 73 20 61 20  cept it takes a 
15790 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65  slightly differe
157a0 6e 74 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 61  nt callback.** a
157b0 6e 64 20 63 61 6c 6c 62 61 63 6b 20 64 61 74 61  nd callback data
157c0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
157d0 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 65  atic int shell_e
157e0 78 65 63 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  xec(.  ShellStat
157f0 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20  e *pArg,        
15800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15810 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
15820 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 63  hellState */.  c
15830 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15850 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
15860 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  to be evaluated 
15870 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
15880 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20 20  rMsg            
15890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
158a0 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72 69 74  * Error msg writ
158b0 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
158c0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
158d0 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 20 20 20  Stmt = NULL;    
158e0 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 74 6f   /* Statement to
158f0 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20 69   execute. */.  i
15900 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15910 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
15920 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
15930 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 63 6f  .  int rc2;.  co
15940 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66 74 6f  nst char *zLefto
15950 76 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ver;          /*
15960 20 54 61 69 6c 20 6f 66 20 75 6e 70 72 6f 63 65   Tail of unproce
15970 73 73 65 64 20 53 51 4c 20 2a 2f 0a 20 20 73 71  ssed SQL */.  sq
15980 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 41 72 67  lite3 *db = pArg
15990 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 7a 45  ->db;..  if( pzE
159a0 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 2a 70 7a  rrMsg ){.    *pz
159b0 45 72 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20  ErrMsg = NULL;. 
159c0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
159d0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
159e0 41 42 4c 45 0a 20 20 69 66 28 20 70 41 72 67 2d  ABLE.  if( pArg-
159f0 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20  >expert.pExpert 
15a00 29 7b 0a 20 20 20 20 72 63 20 3d 20 65 78 70 65  ){.    rc = expe
15a10 72 74 48 61 6e 64 6c 65 53 51 4c 28 70 41 72 67  rtHandleSQL(pArg
15a20 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72 4d 73 67  , zSql, pzErrMsg
15a30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 65 78  );.    return ex
15a40 70 65 72 74 46 69 6e 69 73 68 28 70 41 72 67 2c  pertFinish(pArg,
15a50 20 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29   (rc!=SQLITE_OK)
15a60 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d  , pzErrMsg);.  }
15a70 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65  .#endif..  while
15a80 28 20 7a 53 71 6c 5b 30 5d 20 26 26 20 28 53 51  ( zSql[0] && (SQ
15a90 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72 63 29 20 29  LITE_OK == rc) )
15aa0 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
15ab0 73 74 20 63 68 61 72 20 2a 7a 53 74 6d 74 53 71  st char *zStmtSq
15ac0 6c 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  l;.    rc = sqli
15ad0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
15ae0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
15af0 74 6d 74 2c 20 26 7a 4c 65 66 74 6f 76 65 72 29  tmt, &zLeftover)
15b00 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
15b10 5f 4f 4b 20 21 3d 20 72 63 20 29 7b 0a 20 20 20  _OK != rc ){.   
15b20 20 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20     if( pzErrMsg 
15b30 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  ){.        *pzEr
15b40 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72 5f  rMsg = save_err_
15b50 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  msg(db);.      }
15b60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15b70 20 20 69 66 28 20 21 70 53 74 6d 74 20 29 7b 0a    if( !pStmt ){.
15b80 20 20 20 20 20 20 20 20 2f 2a 20 74 68 69 73 20          /* this 
15b90 68 61 70 70 65 6e 73 20 66 6f 72 20 61 20 63 6f  happens for a co
15ba0 6d 6d 65 6e 74 20 6f 72 20 77 68 69 74 65 2d 73  mment or white-s
15bb0 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  pace */.        
15bc0 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72  zSql = zLeftover
15bd0 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
15be0 20 49 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d   IsSpace(zSql[0]
15bf0 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20  ) ) zSql++;.    
15c00 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
15c10 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 74 6d      }.      zStm
15c20 74 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73  tSql = sqlite3_s
15c30 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ql(pStmt);.     
15c40 20 69 66 28 20 7a 53 74 6d 74 53 71 6c 3d 3d 30   if( zStmtSql==0
15c50 20 29 20 7a 53 74 6d 74 53 71 6c 20 3d 20 22 22   ) zStmtSql = ""
15c60 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49  ;.      while( I
15c70 73 53 70 61 63 65 28 7a 53 74 6d 74 53 71 6c 5b  sSpace(zStmtSql[
15c80 30 5d 29 20 29 20 7a 53 74 6d 74 53 71 6c 2b 2b  0]) ) zStmtSql++
15c90 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 73 61 76 65  ;..      /* save
15ca0 20 6f 66 66 20 74 68 65 20 70 72 65 70 61 72 65   off the prepare
15cb0 64 20 73 74 61 74 6d 65 6e 74 20 68 61 6e 64 6c  d statment handl
15cc0 65 20 61 6e 64 20 72 65 73 65 74 20 72 6f 77 20  e and reset row 
15cd0 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69  count */.      i
15ce0 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20  f( pArg ){.     
15cf0 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d     pArg->pStmt =
15d00 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20   pStmt;.        
15d10 70 41 72 67 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20  pArg->cnt = 0;. 
15d20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
15d30 20 65 63 68 6f 20 74 68 65 20 73 71 6c 20 73 74   echo the sql st
15d40 61 74 65 6d 65 6e 74 20 69 66 20 65 63 68 6f 20  atement if echo 
15d50 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  on */.      if( 
15d60 70 41 72 67 20 26 26 20 53 68 65 6c 6c 48 61 73  pArg && ShellHas
15d70 46 6c 61 67 28 70 41 72 67 2c 20 53 48 46 4c 47  Flag(pArg, SHFLG
15d80 5f 45 63 68 6f 29 20 29 7b 0a 20 20 20 20 20 20  _Echo) ){.      
15d90 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
15da0 72 67 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  rg->out, "%s\n",
15db0 20 7a 53 74 6d 74 53 71 6c 20 3f 20 7a 53 74 6d   zStmtSql ? zStm
15dc0 74 53 71 6c 20 3a 20 7a 53 71 6c 29 3b 0a 20 20  tSql : zSql);.  
15dd0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
15de0 53 68 6f 77 20 74 68 65 20 45 58 50 4c 41 49 4e  Show the EXPLAIN
15df0 20 51 55 45 52 59 20 50 4c 41 4e 20 69 66 20 2e   QUERY PLAN if .
15e00 65 71 70 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 20  eqp is on */.   
15e10 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70     if( pArg && p
15e20 41 72 67 2d 3e 61 75 74 6f 45 51 50 20 26 26 20  Arg->autoEQP && 
15e30 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
15e40 22 45 58 50 4c 41 49 4e 25 22 2c 7a 53 74 6d 74  "EXPLAIN%",zStmt
15e50 53 71 6c 2c 30 29 21 3d 30 20 29 7b 0a 20 20 20  Sql,0)!=0 ){.   
15e60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
15e70 74 20 2a 70 45 78 70 6c 61 69 6e 3b 0a 20 20 20  t *pExplain;.   
15e80 20 20 20 20 20 63 68 61 72 20 2a 7a 45 51 50 3b       char *zEQP;
15e90 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 72 69  .        int tri
15ea0 67 67 65 72 45 51 50 20 3d 20 30 3b 0a 20 20 20  ggerEQP = 0;.   
15eb0 20 20 20 20 20 64 69 73 61 62 6c 65 5f 64 65 62       disable_deb
15ec0 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28 29  ug_trace_modes()
15ed0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15ee0 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20  3_db_config(db, 
15ef0 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
15f00 54 52 49 47 47 45 52 5f 45 51 50 2c 20 2d 31 2c  TRIGGER_EQP, -1,
15f10 20 26 74 72 69 67 67 65 72 45 51 50 29 3b 0a 20   &triggerEQP);. 
15f20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d         if( pArg-
15f30 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45 51  >autoEQP>=AUTOEQ
15f40 50 5f 74 72 69 67 67 65 72 20 29 7b 0a 20 20 20  P_trigger ){.   
15f50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
15f60 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c  b_config(db, SQL
15f70 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49  ITE_DBCONFIG_TRI
15f80 47 47 45 52 5f 45 51 50 2c 20 31 2c 20 30 29 3b  GGER_EQP, 1, 0);
15f90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15fa0 20 20 20 7a 45 51 50 20 3d 20 73 71 6c 69 74 65     zEQP = sqlite
15fb0 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41  3_mprintf("EXPLA
15fc0 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 25 73  IN QUERY PLAN %s
15fd0 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20 20  ", zStmtSql);.  
15fe0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15ff0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
16000 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78  , zEQP, -1, &pEx
16010 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20  plain, 0);.     
16020 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16030 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16040 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
16050 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29 3d  _step(pExplain)=
16060 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
16070 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
16080 20 63 68 61 72 20 2a 7a 45 51 50 4c 69 6e 65 20   char *zEQPLine 
16090 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
160a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
160b0 78 74 28 70 45 78 70 6c 61 69 6e 2c 33 29 3b 0a  xt(pExplain,3);.
160c0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
160d0 69 45 71 70 49 64 20 3d 20 73 71 6c 69 74 65 33  iEqpId = sqlite3
160e0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70  _column_int(pExp
160f0 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lain, 0);.      
16100 20 20 20 20 20 20 69 6e 74 20 69 50 61 72 65 6e        int iParen
16110 74 49 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  tId = sqlite3_co
16120 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69  lumn_int(pExplai
16130 6e 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  n, 1);.         
16140 20 20 20 69 66 28 20 7a 45 51 50 4c 69 6e 65 5b     if( zEQPLine[
16150 30 5d 3d 3d 27 2d 27 20 29 20 65 71 70 5f 72 65  0]=='-' ) eqp_re
16160 6e 64 65 72 28 70 41 72 67 29 3b 0a 20 20 20 20  nder(pArg);.    
16170 20 20 20 20 20 20 20 20 65 71 70 5f 61 70 70 65          eqp_appe
16180 6e 64 28 70 41 72 67 2c 20 69 45 71 70 49 64 2c  nd(pArg, iEqpId,
16190 20 69 50 61 72 65 6e 74 49 64 2c 20 7a 45 51 50   iParentId, zEQP
161a0 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Line);.         
161b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 71 70   }.          eqp
161c0 5f 72 65 6e 64 65 72 28 70 41 72 67 29 3b 0a 20  _render(pArg);. 
161d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
161e0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
161f0 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20  e(pExplain);.   
16200 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
16210 65 28 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 20  e(zEQP);.       
16220 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45   if( pArg->autoE
16230 51 50 3e 3d 41 55 54 4f 45 51 50 5f 66 75 6c 6c  QP>=AUTOEQP_full
16240 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
16250 20 41 6c 73 6f 20 64 6f 20 61 6e 20 45 58 50 4c   Also do an EXPL
16260 41 49 4e 20 66 6f 72 20 22 2e 65 71 70 20 66 75  AIN for ".eqp fu
16270 6c 6c 22 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  ll" mode */.    
16280 20 20 20 20 20 20 7a 45 51 50 20 3d 20 73 71 6c        zEQP = sql
16290 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58  ite3_mprintf("EX
162a0 50 4c 41 49 4e 20 25 73 22 2c 20 7a 53 74 6d 74  PLAIN %s", zStmt
162b0 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Sql);.          
162c0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
162d0 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50  pare_v2(db, zEQP
162e0 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c  , -1, &pExplain,
162f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
16300 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16310 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16320 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f  pArg->cMode = MO
16330 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  DE_Explain;.    
16340 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f          explain_
16350 64 61 74 61 5f 70 72 65 70 61 72 65 28 70 41 72  data_prepare(pAr
16360 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20  g, pExplain);.  
16370 20 20 20 20 20 20 20 20 20 20 65 78 65 63 5f 70            exec_p
16380 72 65 70 61 72 65 64 5f 73 74 6d 74 28 70 41 72  repared_stmt(pAr
16390 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20  g, pExplain);.  
163a0 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69            explai
163b0 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70 41  n_data_delete(pA
163c0 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rg);.          }
163d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
163e0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70  e3_finalize(pExp
163f0 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  lain);.         
16400 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
16410 51 50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  QP);.        }. 
16420 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d         if( pArg-
16430 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45 51  >autoEQP>=AUTOEQ
16440 50 5f 74 72 69 67 67 65 72 20 26 26 20 74 72 69  P_trigger && tri
16450 67 67 65 72 45 51 50 3d 3d 30 20 29 7b 0a 20 20  ggerEQP==0 ){.  
16460 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
16470 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51  db_config(db, SQ
16480 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52  LITE_DBCONFIG_TR
16490 49 47 47 45 52 5f 45 51 50 2c 20 30 2c 20 30 29  IGGER_EQP, 0, 0)
164a0 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;.          /* R
164b0 65 70 72 65 70 61 72 65 20 70 53 74 6d 74 20 62  eprepare pStmt b
164c0 65 66 6f 72 65 20 72 65 61 63 74 69 76 69 6e 67  efore reactiving
164d0 20 74 72 61 63 65 20 6d 6f 64 65 73 20 2a 2f 0a   trace modes */.
164e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
164f0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
16500 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
16510 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
16520 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
16530 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
16540 20 20 20 20 69 66 28 20 70 41 72 67 20 29 20 70      if( pArg ) p
16550 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74  Arg->pStmt = pSt
16560 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  mt;.        }.  
16570 20 20 20 20 20 20 72 65 73 74 6f 72 65 5f 64 65        restore_de
16580 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28  bug_trace_modes(
16590 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
165a0 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20    if( pArg ){.  
165b0 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64        pArg->cMod
165c0 65 20 3d 20 70 41 72 67 2d 3e 6d 6f 64 65 3b 0a  e = pArg->mode;.
165d0 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67          if( pArg
165e0 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 29 7b  ->autoExplain ){
165f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
16600 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
16610 75 6e 74 28 70 53 74 6d 74 29 3d 3d 38 0a 20 20  unt(pStmt)==8.  
16620 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
16630 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 45 58 50  te3_strlike("EXP
16640 4c 41 49 4e 25 22 2c 20 7a 53 74 6d 74 53 71 6c  LAIN%", zStmtSql
16650 2c 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ,0)==0.         
16660 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16670 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f  pArg->cMode = MO
16680 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  DE_Explain;.    
16690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
166a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f    if( sqlite3_co
166b0 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
166c0 29 3d 3d 34 0a 20 20 20 20 20 20 20 20 20 20 20  )==4.           
166d0 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  && sqlite3_strli
166e0 6b 65 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52  ke("EXPLAIN QUER
166f0 59 20 50 4c 41 4e 25 22 2c 20 7a 53 74 6d 74 53  Y PLAN%", zStmtS
16700 71 6c 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ql,0)==0 ){.    
16710 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d          pArg->cM
16720 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 51 50 3b 0a  ode = MODE_EQP;.
16730 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16740 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
16750 2a 20 49 66 20 74 68 65 20 73 68 65 6c 6c 20 69  * If the shell i
16760 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 22  s currently in "
16770 2e 65 78 70 6c 61 69 6e 22 20 6d 6f 64 65 2c 20  .explain" mode, 
16780 67 61 74 68 65 72 20 74 68 65 20 65 78 74 72 61  gather the extra
16790 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
167a0 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 64 64   required to add
167b0 20 69 6e 64 65 6e 74 73 20 74 6f 20 74 68 65 20   indents to the 
167c0 6f 75 74 70 75 74 2e 2a 2f 0a 20 20 20 20 20 20  output.*/.      
167d0 20 20 69 66 28 20 70 41 72 67 2d 3e 63 4d 6f 64    if( pArg->cMod
167e0 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  e==MODE_Explain 
167f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70  ){.          exp
16800 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72  lain_data_prepar
16810 65 28 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a  e(pArg, pStmt);.
16820 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16830 7d 0a 0a 20 20 20 20 20 20 65 78 65 63 5f 70 72  }..      exec_pr
16840 65 70 61 72 65 64 5f 73 74 6d 74 28 70 41 72 67  epared_stmt(pArg
16850 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  , pStmt);.      
16860 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c  explain_data_del
16870 65 74 65 28 70 41 72 67 29 3b 0a 20 20 20 20 20  ete(pArg);.     
16880 20 65 71 70 5f 72 65 6e 64 65 72 28 70 41 72 67   eqp_render(pArg
16890 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 70 72 69  );..      /* pri
168a0 6e 74 20 75 73 61 67 65 20 73 74 61 74 73 20 69  nt usage stats i
168b0 66 20 73 74 61 74 73 20 6f 6e 20 2a 2f 0a 20 20  f stats on */.  
168c0 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20      if( pArg && 
168d0 70 41 72 67 2d 3e 73 74 61 74 73 4f 6e 20 29 7b  pArg->statsOn ){
168e0 0a 20 20 20 20 20 20 20 20 64 69 73 70 6c 61 79  .        display
168f0 5f 73 74 61 74 73 28 64 62 2c 20 70 41 72 67 2c  _stats(db, pArg,
16900 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
16910 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 6c 6f 6f      /* print loo
16920 70 2d 63 6f 75 6e 74 65 72 73 20 69 66 20 72 65  p-counters if re
16930 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  quired */.      
16940 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
16950 2d 3e 73 63 61 6e 73 74 61 74 73 4f 6e 20 29 7b  ->scanstatsOn ){
16960 0a 20 20 20 20 20 20 20 20 64 69 73 70 6c 61 79  .        display
16970 5f 73 63 61 6e 73 74 61 74 73 28 64 62 2c 20 70  _scanstats(db, p
16980 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Arg);.      }.. 
16990 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65       /* Finalize
169a0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
169b0 75 73 74 20 65 78 65 63 75 74 65 64 2e 20 49 66  ust executed. If
169c0 20 74 68 69 73 20 66 61 69 6c 73 2c 20 73 61 76   this fails, sav
169d0 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
169e0 79 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d  y of the error m
169f0 65 73 73 61 67 65 2e 20 4f 74 68 65 72 77 69 73  essage. Otherwis
16a00 65 2c 20 73 65 74 20 7a 53 71 6c 20 74 6f 20 70  e, set zSql to p
16a10 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20  oint to the.    
16a20 20 20 2a 2a 20 6e 65 78 74 20 73 74 61 74 65 6d    ** next statem
16a30 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65 2e 20  ent to execute. 
16a40 2a 2f 0a 20 20 20 20 20 20 72 63 32 20 3d 20 73  */.      rc2 = s
16a50 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
16a60 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66  pStmt);.      if
16a70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc!=SQLITE_NOM
16a80 45 4d 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  EM ) rc = rc2;. 
16a90 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
16aa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16ab0 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76    zSql = zLeftov
16ac0 65 72 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  er;.        whil
16ad0 65 28 20 49 73 53 70 61 63 65 28 7a 53 71 6c 5b  e( IsSpace(zSql[
16ae0 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20  0]) ) zSql++;.  
16af0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 7a      }else if( pz
16b00 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
16b10 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 61    *pzErrMsg = sa
16b20 76 65 5f 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a  ve_err_msg(db);.
16b30 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
16b40 2a 20 63 6c 65 61 72 20 73 61 76 65 64 20 73 74  * clear saved st
16b50 6d 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20  mt handle */.   
16b60 20 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20     if( pArg ){. 
16b70 20 20 20 20 20 20 20 70 41 72 67 2d 3e 70 53 74         pArg->pSt
16b80 6d 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20  mt = NULL;.     
16b90 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20   }.    }.  } /* 
16ba0 65 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 0a 20 20  end while */..  
16bb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16bc0 0a 2a 2a 20 52 65 6c 65 61 73 65 20 6d 65 6d 6f  .** Release memo
16bd0 72 79 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c  ry previously al
16be0 6c 6f 63 61 74 65 64 20 62 79 20 74 61 62 6c 65  located by table
16bf0 43 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2f  ColumnList()..*/
16c00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
16c10 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 63 68 61 72  eColumnList(char
16c20 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74   **azCol){.  int
16c30 20 69 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 61   i;.  for(i=1; a
16c40 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  zCol[i]; i++){. 
16c50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
16c60 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20  azCol[i]);.  }. 
16c70 20 2f 2a 20 61 7a 43 6f 6c 5b 30 5d 20 69 73 20   /* azCol[0] is 
16c80 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
16c90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
16ca0 65 28 61 7a 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  e(azCol);.}../*.
16cb0 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74  ** Return a list
16cc0 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
16cd0 73 74 72 69 6e 67 73 20 77 68 69 63 68 20 61 72  strings which ar
16ce0 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  e the names of a
16cf0 6c 6c 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e  ll.** columns in
16d00 20 74 61 62 6c 65 20 7a 54 61 62 2e 20 20 20 54   table zTab.   T
16d10 68 65 20 6d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c  he memory to hol
16d20 64 20 74 68 65 20 6e 61 6d 65 73 20 69 73 20 64  d the names is d
16d30 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c  ynamically.** al
16d40 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 75 73 74  located and must
16d50 20 62 65 20 72 65 6c 65 61 73 65 64 20 62 79 20   be released by 
16d60 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
16d70 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   a subsequent ca
16d80 6c 6c 0a 2a 2a 20 74 6f 20 66 72 65 65 43 6f 6c  ll.** to freeCol
16d90 75 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2a 0a 2a 2a  umnList()..**.**
16da0 20 54 68 65 20 61 7a 43 6f 6c 5b 30 5d 20 65 6e   The azCol[0] en
16db0 74 72 79 20 69 73 20 75 73 75 61 6c 6c 79 20 4e  try is usually N
16dc0 55 4c 4c 2e 20 20 48 6f 77 65 76 65 72 2c 20 69  ULL.  However, i
16dd0 66 20 7a 54 61 62 20 63 6f 6e 74 61 69 6e 73 20  f zTab contains 
16de0 61 20 72 6f 77 69 64 0a 2a 2a 20 76 61 6c 75 65  a rowid.** value
16df0 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
16e00 65 20 70 72 65 73 65 72 76 65 64 2c 20 74 68 65  e preserved, the
16e10 6e 20 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 66 69  n azCol[0] is fi
16e20 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 74 68 65  lled in with the
16e30 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  .** name of the 
16e40 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  rowid column..**
16e50 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 72 65  .** The first re
16e60 67 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 69 6e 20  gular column in 
16e70 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 7a 43  the table is azC
16e80 6f 6c 5b 31 5d 2e 20 20 54 68 65 20 6c 69 73 74  ol[1].  The list
16e90 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a   is terminated.*
16ea0 2a 20 62 79 20 61 6e 20 65 6e 74 72 79 20 77 69  * by an entry wi
16eb0 74 68 20 61 7a 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a  th azCol[i]==0..
16ec0 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
16ed0 2a 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74  *tableColumnList
16ee0 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
16ef0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
16f00 29 7b 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  ){.  char **azCo
16f10 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  l = 0;.  sqlite3
16f20 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
16f30 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
16f40 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e  t nCol = 0;.  in
16f50 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  t nAlloc = 0;.  
16f60 69 6e 74 20 6e 50 4b 20 3d 20 30 3b 20 20 20 20  int nPK = 0;    
16f70 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16f80 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
16f90 6d 6e 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e  mns seen */.  in
16fa0 74 20 69 73 49 50 4b 20 3d 20 30 3b 20 20 20 20  t isIPK = 0;    
16fb0 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 6e 65 20   /* True if one 
16fc0 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
16fd0 6d 6e 20 6f 66 20 74 79 70 65 20 49 4e 54 45 47  mn of type INTEG
16fe0 45 52 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 73  ER */.  int pres
16ff0 65 72 76 65 52 6f 77 69 64 20 3d 20 53 68 65 6c  erveRowid = Shel
17000 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c  lHasFlag(p, SHFL
17010 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 29  G_PreserveRowid)
17020 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 7a  ;.  int rc;..  z
17030 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
17040 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 74 61  rintf("PRAGMA ta
17050 62 6c 65 5f 69 6e 66 6f 3d 25 51 22 2c 20 7a 54  ble_info=%Q", zT
17060 61 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ab);.  rc = sqli
17070 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
17080 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
17090 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71  &pStmt, 0);.  sq
170a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
170b0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
170c0 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  urn 0;.  while( 
170d0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
170e0 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
170f0 29 7b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e  ){.    if( nCol>
17100 3d 6e 41 6c 6c 6f 63 2d 32 20 29 7b 0a 20 20 20  =nAlloc-2 ){.   
17110 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c     nAlloc = nAll
17120 6f 63 2a 32 20 2b 20 6e 43 6f 6c 20 2b 20 31 30  oc*2 + nCol + 10
17130 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c 20 3d 20  ;.      azCol = 
17140 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
17150 61 7a 43 6f 6c 2c 20 6e 41 6c 6c 6f 63 2a 73 69  azCol, nAlloc*si
17160 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 29 3b  zeof(azCol[0]));
17170 0a 20 20 20 20 20 20 69 66 28 20 61 7a 43 6f 6c  .      if( azCol
17180 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f  ==0 ) shell_out_
17190 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20  of_memory();.   
171a0 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 5b 2b 2b 6e   }.    azCol[++n
171b0 43 6f 6c 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Col] = sqlite3_m
171c0 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
171d0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
171e0 28 70 53 74 6d 74 2c 20 31 29 29 3b 0a 20 20 20  (pStmt, 1));.   
171f0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c   if( sqlite3_col
17200 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 35  umn_int(pStmt, 5
17210 29 20 29 7b 0a 20 20 20 20 20 20 6e 50 4b 2b 2b  ) ){.      nPK++
17220 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 4b 3d  ;.      if( nPK=
17230 3d 31 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  =1.       && sql
17240 69 74 65 33 5f 73 74 72 69 63 6d 70 28 28 63 6f  ite3_stricmp((co
17250 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
17260 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
17270 74 6d 74 2c 32 29 2c 0a 20 20 20 20 20 20 20 20  tmt,2),.        
17280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17290 20 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a    "INTEGER")==0.
172a0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
172b0 20 69 73 49 50 4b 20 3d 20 31 3b 0a 20 20 20 20   isIPK = 1;.    
172c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
172d0 20 69 73 49 50 4b 20 3d 20 30 3b 0a 20 20 20 20   isIPK = 0;.    
172e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
172f0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
17300 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 61  (pStmt);.  if( a
17310 7a 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zCol==0 ) return
17320 20 30 3b 0a 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d   0;.  azCol[0] =
17330 20 30 3b 0a 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c   0;.  azCol[nCol
17340 2b 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54  +1] = 0;..  /* T
17350 68 65 20 64 65 63 69 73 69 6f 6e 20 6f 66 20 77  he decision of w
17360 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
17370 72 6f 77 69 64 20 72 65 61 6c 6c 79 20 6e 65 65  rowid really nee
17380 64 73 20 74 6f 20 62 65 20 70 72 65 73 65 72 76  ds to be preserv
17390 65 64 0a 20 20 2a 2a 20 69 73 20 74 72 69 63 6b  ed.  ** is trick
173a0 79 2e 20 20 57 65 20 6e 65 76 65 72 20 6e 65 65  y.  We never nee
173b0 64 20 74 6f 20 70 72 65 73 65 72 76 65 20 61 20  d to preserve a 
173c0 72 6f 77 69 64 20 66 6f 72 20 61 20 57 49 54 48  rowid for a WITH
173d0 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 0a  OUT ROWID table.
173e0 20 20 2a 2a 20 6f 72 20 61 20 74 61 62 6c 65 20    ** or a table 
173f0 77 69 74 68 20 61 6e 20 49 4e 54 45 47 45 52 20  with an INTEGER 
17400 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 57 65  PRIMARY KEY.  We
17410 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 70   are unable to p
17420 72 65 73 65 72 76 65 0a 20 20 2a 2a 20 72 6f 77  reserve.  ** row
17430 69 64 73 20 6f 6e 20 74 61 62 6c 65 73 20 77 68  ids on tables wh
17440 65 72 65 20 74 68 65 20 72 6f 77 69 64 20 69 73  ere the rowid is
17450 20 69 6e 61 63 63 65 73 73 69 62 6c 65 20 62 65   inaccessible be
17460 63 61 75 73 65 20 74 68 65 72 65 20 61 72 65 20  cause there are 
17470 6f 74 68 65 72 0a 20 20 2a 2a 20 63 6f 6c 75 6d  other.  ** colum
17480 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
17490 6e 61 6d 65 64 20 22 72 6f 77 69 64 22 2c 20 22  named "rowid", "
174a0 5f 72 6f 77 69 64 5f 22 2c 20 61 6e 64 20 22 6f  _rowid_", and "o
174b0 69 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  id"..  */.  if( 
174c0 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 26 26  preserveRowid &&
174d0 20 69 73 49 50 4b 20 29 7b 0a 20 20 20 20 2f 2a   isIPK ){.    /*
174e0 20 49 66 20 61 20 73 69 6e 67 6c 65 20 50 52 49   If a single PRI
174f0 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
17500 77 69 74 68 20 74 79 70 65 20 49 4e 54 45 47 45  with type INTEGE
17510 52 20 77 61 73 20 73 65 65 6e 2c 20 74 68 65 6e  R was seen, then
17520 20 69 74 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74   it.    ** might
17530 20 62 65 20 61 6e 20 61 6c 69 73 65 20 66 6f 72   be an alise for
17540 20 74 68 65 20 52 4f 57 49 44 2e 20 20 42 75 74   the ROWID.  But
17550 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 20 62   it might also b
17560 65 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  e a WITHOUT ROWI
17570 44 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f  D.    ** table o
17580 72 20 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d  r a INTEGER PRIM
17590 41 52 59 20 4b 45 59 20 44 45 53 43 20 63 6f 6c  ARY KEY DESC col
175a0 75 6d 6e 2c 20 6e 65 69 74 68 65 72 20 6f 66 20  umn, neither of 
175b0 77 68 69 63 68 20 61 72 65 0a 20 20 20 20 2a 2a  which are.    **
175c0 20 52 4f 57 49 44 20 61 6c 69 61 73 65 73 2e 20   ROWID aliases. 
175d0 20 54 6f 20 64 69 73 74 69 6e 67 75 69 73 68 20   To distinguish 
175e0 74 68 65 73 65 20 63 61 73 65 73 2c 20 63 68 65  these cases, che
175f0 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20  ck to see if.   
17600 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 22   ** there is a "
17610 70 6b 22 20 65 6e 74 72 79 20 69 6e 20 22 50 52  pk" entry in "PR
17620 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 22  AGMA index_list"
17630 2e 20 20 54 68 65 72 65 20 77 69 6c 6c 20 62 65  .  There will be
17640 0a 20 20 20 20 2a 2a 20 6e 6f 20 22 70 6b 22 20  .    ** no "pk" 
17650 69 6e 64 65 78 20 69 66 20 74 68 65 20 50 52 49  index if the PRI
17660 4d 41 52 59 20 4b 45 59 20 72 65 61 6c 6c 79 20  MARY KEY really 
17670 69 73 20 61 6e 20 61 6c 69 61 73 20 66 6f 72 20  is an alias for 
17680 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 20 20 2a  the ROWID..    *
17690 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  /.    zSql = sql
176a0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
176b0 4c 45 43 54 20 31 20 46 52 4f 4d 20 70 72 61 67  LECT 1 FROM prag
176c0 6d 61 5f 69 6e 64 65 78 5f 6c 69 73 74 28 25 51  ma_index_list(%Q
176d0 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )".             
176e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
176f0 57 48 45 52 45 20 6f 72 69 67 69 6e 3d 27 70 6b  WHERE origin='pk
17700 27 22 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20 72  '", zTab);.    r
17710 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
17720 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
17730 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
17740 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
17750 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
17760 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
17770 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 61  freeColumnList(a
17780 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 72 65 74  zCol);.      ret
17790 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
177a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
177b0 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73  ep(pStmt);.    s
177c0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
177d0 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 72 65 73  pStmt);.    pres
177e0 65 72 76 65 52 6f 77 69 64 20 3d 20 72 63 3d 3d  erveRowid = rc==
177f0 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a  SQLITE_ROW;.  }.
17800 20 20 69 66 28 20 70 72 65 73 65 72 76 65 52 6f    if( preserveRo
17810 77 69 64 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e  wid ){.    /* On
17820 6c 79 20 70 72 65 73 65 72 76 65 20 74 68 65 20  ly preserve the 
17830 72 6f 77 69 64 20 69 66 20 77 65 20 63 61 6e 20  rowid if we can 
17840 66 69 6e 64 20 61 20 6e 61 6d 65 20 74 6f 20 75  find a name to u
17850 73 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  se for the.    *
17860 2a 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 73  * rowid */.    s
17870 74 61 74 69 63 20 63 68 61 72 20 2a 61 7a 52 6f  tatic char *azRo
17880 77 69 64 5b 5d 20 3d 20 7b 20 22 72 6f 77 69 64  wid[] = { "rowid
17890 22 2c 20 22 5f 72 6f 77 69 64 5f 22 2c 20 22 6f  ", "_rowid_", "o
178a0 69 64 22 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69  id" };.    int i
178b0 2c 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  , j;.    for(j=0
178c0 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
178d0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e     for(i=1; i<=n
178e0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
178f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
17900 74 72 69 63 6d 70 28 61 7a 52 6f 77 69 64 5b 6a  tricmp(azRowid[j
17910 5d 2c 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20 29  ],azCol[i])==0 )
17920 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
17930 20 20 20 20 20 20 69 66 28 20 69 3e 6e 43 6f 6c        if( i>nCol
17940 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
17950 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65  t this point, we
17960 20 6b 6e 6f 77 20 74 68 61 74 20 61 7a 52 6f 77   know that azRow
17970 69 64 5b 6a 5d 20 69 73 20 6e 6f 74 20 74 68 65  id[j] is not the
17980 20 6e 61 6d 65 20 6f 66 20 61 6e 79 0a 20 20 20   name of any.   
17990 20 20 20 20 20 2a 2a 20 6f 72 64 69 6e 61 72 79       ** ordinary
179a0 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74   column in the t
179b0 61 62 6c 65 2e 20 20 56 65 72 69 66 79 20 74 68  able.  Verify th
179c0 61 74 20 61 7a 52 6f 77 69 64 5b 6a 5d 20 69 73  at azRowid[j] is
179d0 20 61 20 76 61 6c 69 64 0a 20 20 20 20 20 20 20   a valid.       
179e0 20 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68 65   ** name for the
179f0 20 72 6f 77 69 64 20 62 65 66 6f 72 65 20 61 64   rowid before ad
17a00 64 69 6e 67 20 69 74 20 74 6f 20 61 7a 43 6f 6c  ding it to azCol
17a10 5b 30 5d 2e 20 20 57 49 54 48 4f 55 54 20 52 4f  [0].  WITHOUT RO
17a20 57 49 44 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  WID.        ** t
17a30 61 62 6c 65 73 20 77 69 6c 6c 20 66 61 69 6c 20  ables will fail 
17a40 74 68 69 73 20 6c 61 73 74 20 63 68 65 63 6b 20  this last check 
17a50 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
17a60 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
17a70 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 70 2d  lumn_metadata(p-
17a80 3e 64 62 2c 30 2c 7a 54 61 62 2c 61 7a 52 6f 77  >db,0,zTab,azRow
17a90 69 64 5b 6a 5d 2c 30 2c 30 2c 30 2c 30 2c 30 29  id[j],0,0,0,0,0)
17aa0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
17ab0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 61 7a  ==SQLITE_OK ) az
17ac0 43 6f 6c 5b 30 5d 20 3d 20 61 7a 52 6f 77 69 64  Col[0] = azRowid
17ad0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 62 72 65  [j];.        bre
17ae0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
17af0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  }.  }.  return a
17b00 7a 43 6f 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  zCol;.}../*.** T
17b10 6f 67 67 6c 65 20 74 68 65 20 72 65 76 65 72 73  oggle the revers
17b20 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65  e_unordered_sele
17b30 63 74 73 20 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a  cts setting..*/.
17b40 73 74 61 74 69 63 20 76 6f 69 64 20 74 6f 67 67  static void togg
17b50 6c 65 53 65 6c 65 63 74 4f 72 64 65 72 28 73 71  leSelectOrder(sq
17b60 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 71  lite3 *db){.  sq
17b70 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
17b80 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 53 65  t = 0;.  int iSe
17b90 74 74 69 6e 67 20 3d 20 30 3b 0a 20 20 63 68 61  tting = 0;.  cha
17ba0 72 20 7a 53 74 6d 74 5b 31 30 30 5d 3b 0a 20 20  r zStmt[100];.  
17bb0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
17bc0 76 32 28 64 62 2c 20 22 50 52 41 47 4d 41 20 72  v2(db, "PRAGMA r
17bd0 65 76 65 72 73 65 5f 75 6e 6f 72 64 65 72 65 64  everse_unordered
17be0 5f 73 65 6c 65 63 74 73 22 2c 20 2d 31 2c 20 26  _selects", -1, &
17bf0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
17c00 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
17c10 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
17c20 20 29 7b 0a 20 20 20 20 69 53 65 74 74 69 6e 67   ){.    iSetting
17c30 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
17c40 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
17c50 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
17c60 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
17c70 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
17c80 74 66 28 73 69 7a 65 6f 66 28 7a 53 74 6d 74 29  tf(sizeof(zStmt)
17c90 2c 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 20  , zStmt,.       
17ca0 22 50 52 41 47 4d 41 20 72 65 76 65 72 73 65 5f  "PRAGMA reverse_
17cb0 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74  unordered_select
17cc0 73 28 25 64 29 22 2c 20 21 69 53 65 74 74 69 6e  s(%d)", !iSettin
17cd0 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78  g);.  sqlite3_ex
17ce0 65 63 28 64 62 2c 20 7a 53 74 6d 74 2c 20 30 2c  ec(db, zStmt, 0,
17cf0 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0, 0);.}../*.**
17d00 20 54 68 69 73 20 69 73 20 61 20 64 69 66 66 65   This is a diffe
17d10 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 20 72 6f  rent callback ro
17d20 75 74 69 6e 65 20 75 73 65 64 20 66 6f 72 20 64  utine used for d
17d30 75 6d 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  umping the datab
17d40 61 73 65 2e 0a 2a 2a 20 45 61 63 68 20 72 6f 77  ase..** Each row
17d50 20 72 65 63 65 69 76 65 64 20 62 79 20 74 68 69   received by thi
17d60 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  s callback consi
17d70 73 74 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6e  sts of a table n
17d80 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 74 61 62 6c  ame,.** the tabl
17d90 65 20 74 79 70 65 20 28 22 69 6e 64 65 78 22 20  e type ("index" 
17da0 6f 72 20 22 74 61 62 6c 65 22 29 20 61 6e 64 20  or "table") and 
17db0 53 51 4c 20 74 6f 20 63 72 65 61 74 65 20 74 68  SQL to create th
17dc0 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73  e table..** This
17dd0 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
17de0 70 72 69 6e 74 20 74 65 78 74 20 73 75 66 66 69  print text suffi
17df0 63 69 65 6e 74 20 74 6f 20 72 65 63 72 65 61 74  cient to recreat
17e00 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  e the table..*/.
17e10 73 74 61 74 69 63 20 69 6e 74 20 64 75 6d 70 5f  static int dump_
17e20 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  callback(void *p
17e30 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63  Arg, int nArg, c
17e40 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61  har **azArg, cha
17e50 72 20 2a 2a 61 7a 4e 6f 74 55 73 65 64 29 7b 0a  r **azNotUsed){.
17e60 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73    int rc;.  cons
17e70 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a  t char *zTable;.
17e80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
17e90 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ype;.  const cha
17ea0 72 20 2a 7a 53 71 6c 3b 0a 20 20 53 68 65 6c 6c  r *zSql;.  Shell
17eb0 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c  State *p = (Shel
17ec0 6c 53 74 61 74 65 20 2a 29 70 41 72 67 3b 0a 0a  lState *)pArg;..
17ed0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
17ee0 45 52 28 61 7a 4e 6f 74 55 73 65 64 29 3b 0a 20  ER(azNotUsed);. 
17ef0 20 69 66 28 20 6e 41 72 67 21 3d 33 20 7c 7c 20   if( nArg!=3 || 
17f00 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72  azArg==0 ) retur
17f10 6e 20 30 3b 0a 20 20 7a 54 61 62 6c 65 20 3d 20  n 0;.  zTable = 
17f20 61 7a 41 72 67 5b 30 5d 3b 0a 20 20 7a 54 79 70  azArg[0];.  zTyp
17f30 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20  e = azArg[1];.  
17f40 7a 53 71 6c 20 3d 20 61 7a 41 72 67 5b 32 5d 3b  zSql = azArg[2];
17f50 0a 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a  ..  if( strcmp(z
17f60 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 73  Table, "sqlite_s
17f70 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a  equence")==0 ){.
17f80 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
17f90 2d 3e 6f 75 74 2c 20 22 44 45 4c 45 54 45 20 46  ->out, "DELETE F
17fa0 52 4f 4d 20 73 71 6c 69 74 65 5f 73 65 71 75 65  ROM sqlite_seque
17fb0 6e 63 65 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73  nce;\n");.  }els
17fc0 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74  e if( sqlite3_st
17fd0 72 67 6c 6f 62 28 22 73 71 6c 69 74 65 5f 73 74  rglob("sqlite_st
17fe0 61 74 3f 22 2c 20 7a 54 61 62 6c 65 29 3d 3d 30  at?", zTable)==0
17ff0 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e   ){.    raw_prin
18000 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c  tf(p->out, "ANAL
18010 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  YZE sqlite_maste
18020 72 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20  r;\n");.  }else 
18030 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 54 61 62  if( strncmp(zTab
18040 6c 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  le, "sqlite_", 7
18050 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
18060 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rn 0;.  }else if
18070 28 20 73 74 72 6e 63 6d 70 28 7a 53 71 6c 2c 20  ( strncmp(zSql, 
18080 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20  "CREATE VIRTUAL 
18090 54 41 42 4c 45 22 2c 20 32 30 29 3d 3d 30 20 29  TABLE", 20)==0 )
180a0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 73  {.    char *zIns
180b0 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 77 72  ;.    if( !p->wr
180c0 69 74 61 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a  itableSchema ){.
180d0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
180e0 28 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41  (p->out, "PRAGMA
180f0 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
18100 3d 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  =ON;\n");.      
18110 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d  p->writableSchem
18120 61 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  a = 1;.    }.   
18130 20 7a 49 6e 73 20 3d 20 73 71 6c 69 74 65 33 5f   zIns = sqlite3_
18140 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
18150 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 71 6c  "INSERT INTO sql
18160 69 74 65 5f 6d 61 73 74 65 72 28 74 79 70 65 2c  ite_master(type,
18170 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f  name,tbl_name,ro
18180 6f 74 70 61 67 65 2c 73 71 6c 29 22 0a 20 20 20  otpage,sql)".   
18190 20 20 20 20 22 56 41 4c 55 45 53 28 27 74 61 62      "VALUES('tab
181a0 6c 65 27 2c 27 25 71 27 2c 27 25 71 27 2c 30 2c  le','%q','%q',0,
181b0 27 25 71 27 29 3b 22 2c 0a 20 20 20 20 20 20 20  '%q');",.       
181c0 7a 54 61 62 6c 65 2c 20 7a 54 61 62 6c 65 2c 20  zTable, zTable, 
181d0 7a 53 71 6c 29 3b 0a 20 20 20 20 75 74 66 38 5f  zSql);.    utf8_
181e0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
181f0 25 73 5c 6e 22 2c 20 7a 49 6e 73 29 3b 0a 20 20  %s\n", zIns);.  
18200 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
18210 49 6e 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ins);.    return
18220 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
18230 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65   printSchemaLine
18240 28 70 2d 3e 6f 75 74 2c 20 7a 53 71 6c 2c 20 22  (p->out, zSql, "
18250 3b 5c 6e 22 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ;\n");.  }..  if
18260 28 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 20  ( strcmp(zType, 
18270 22 74 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  "table")==0 ){. 
18280 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 53 65     ShellText sSe
18290 6c 65 63 74 3b 0a 20 20 20 20 53 68 65 6c 6c 54  lect;.    ShellT
182a0 65 78 74 20 73 54 61 62 6c 65 3b 0a 20 20 20 20  ext sTable;.    
182b0 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 0a 20 20  char **azCol;.  
182c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61    int i;.    cha
182d0 72 20 2a 73 61 76 65 64 44 65 73 74 54 61 62 6c  r *savedDestTabl
182e0 65 3b 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64  e;.    int saved
182f0 4d 6f 64 65 3b 0a 0a 20 20 20 20 61 7a 43 6f 6c  Mode;..    azCol
18300 20 3d 20 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69   = tableColumnLi
18310 73 74 28 70 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  st(p, zTable);. 
18320 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20     if( azCol==0 
18330 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 45 72 72  ){.      p->nErr
18340 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
18350 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
18360 2a 20 41 6c 77 61 79 73 20 71 75 6f 74 65 20 74  * Always quote t
18370 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20 65  he table name, e
18380 76 65 6e 20 69 66 20 69 74 20 61 70 70 65 61 72  ven if it appear
18390 73 20 74 6f 20 62 65 20 70 75 72 65 20 61 73 63  s to be pure asc
183a0 69 69 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61  ii,.    ** in ca
183b0 73 65 20 69 74 20 69 73 20 61 20 6b 65 79 77 6f  se it is a keywo
183c0 72 64 2e 20 45 78 3a 20 20 49 4e 53 45 52 54 20  rd. Ex:  INSERT 
183d0 49 4e 54 4f 20 22 74 61 62 6c 65 22 20 2e 2e 2e  INTO "table" ...
183e0 20 2a 2f 0a 20 20 20 20 69 6e 69 74 54 65 78 74   */.    initText
183f0 28 26 73 54 61 62 6c 65 29 3b 0a 20 20 20 20 61  (&sTable);.    a
18400 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c  ppendText(&sTabl
18410 65 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65  e, zTable, quote
18420 43 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 20  Char(zTable));. 
18430 20 20 20 2f 2a 20 49 66 20 70 72 65 73 65 72 76     /* If preserv
18440 69 6e 67 20 74 68 65 20 72 6f 77 69 64 2c 20 61  ing the rowid, a
18450 64 64 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74  dd a column list
18460 20 61 66 74 65 72 20 74 68 65 20 74 61 62 6c 65   after the table
18470 20 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 49 6e   name..    ** In
18480 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 20 20 22   other words:  "
18490 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62 28  INSERT INTO tab(
184a0 72 6f 77 69 64 2c 61 2c 62 2c 63 2c 2e 2e 2e 29  rowid,a,b,c,...)
184b0 20 56 41 4c 55 45 53 28 2e 2e 2e 29 22 0a 20 20   VALUES(...)".  
184c0 20 20 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20    ** instead of 
184d0 74 68 65 20 75 73 75 61 6c 20 22 49 4e 53 45 52  the usual "INSER
184e0 54 20 49 4e 54 4f 20 74 61 62 20 56 41 4c 55 45  T INTO tab VALUE
184f0 53 28 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a  S(...)"..    */.
18500 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d      if( azCol[0]
18510 20 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64   ){.      append
18520 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22 28  Text(&sTable, "(
18530 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 70 70  ", 0);.      app
18540 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c  endText(&sTable,
18550 20 61 7a 43 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20   azCol[0], 0);. 
18560 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a       for(i=1; az
18570 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  Col[i]; i++){.  
18580 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
18590 28 26 73 54 61 62 6c 65 2c 20 22 2c 22 2c 20 30  (&sTable, ",", 0
185a0 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  );.        appen
185b0 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 61  dText(&sTable, a
185c0 7a 43 6f 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68  zCol[i], quoteCh
185d0 61 72 28 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20  ar(azCol[i]));. 
185e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70       }.      app
185f0 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c  endText(&sTable,
18600 20 22 29 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a   ")", 0);.    }.
18610 0a 20 20 20 20 2f 2a 20 42 75 69 6c 64 20 61 6e  .    /* Build an
18620 20 61 70 70 72 6f 70 72 69 61 74 65 20 53 45 4c   appropriate SEL
18630 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
18640 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73  .    initText(&s
18650 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 61 70 70  Select);.    app
18660 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
18670 2c 20 22 53 45 4c 45 43 54 20 22 2c 20 30 29 3b  , "SELECT ", 0);
18680 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 5b 30  .    if( azCol[0
18690 5d 20 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e  ] ){.      appen
186a0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
186b0 61 7a 43 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20  azCol[0], 0);.  
186c0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
186d0 73 53 65 6c 65 63 74 2c 20 22 2c 22 2c 20 30 29  sSelect, ",", 0)
186e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
186f0 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69  i=1; azCol[i]; i
18700 2b 2b 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e  ++){.      appen
18710 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
18720 61 7a 43 6f 6c 5b 69 5d 2c 20 71 75 6f 74 65 43  azCol[i], quoteC
18730 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a  har(azCol[i]));.
18740 20 20 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 5b        if( azCol[
18750 69 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  i+1] ){.        
18760 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
18770 65 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20  ect, ",", 0);.  
18780 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
18790 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 61  freeColumnList(a
187a0 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70 65 6e  zCol);.    appen
187b0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
187c0 22 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20  " FROM ", 0);.  
187d0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
187e0 65 6c 65 63 74 2c 20 7a 54 61 62 6c 65 2c 20 71  elect, zTable, q
187f0 75 6f 74 65 43 68 61 72 28 7a 54 61 62 6c 65 29  uoteChar(zTable)
18800 29 3b 0a 0a 20 20 20 20 73 61 76 65 64 44 65 73  );..    savedDes
18810 74 54 61 62 6c 65 20 3d 20 70 2d 3e 7a 44 65 73  tTable = p->zDes
18820 74 54 61 62 6c 65 3b 0a 20 20 20 20 73 61 76 65  tTable;.    save
18830 64 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b  dMode = p->mode;
18840 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62  .    p->zDestTab
18850 6c 65 20 3d 20 73 54 61 62 6c 65 2e 7a 3b 0a 20  le = sTable.z;. 
18860 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e     p->mode = p->
18870 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73  cMode = MODE_Ins
18880 65 72 74 3b 0a 20 20 20 20 72 63 20 3d 20 73 68  ert;.    rc = sh
18890 65 6c 6c 5f 65 78 65 63 28 70 2c 20 73 53 65 6c  ell_exec(p, sSel
188a0 65 63 74 2e 7a 2c 20 30 29 3b 0a 20 20 20 20 69  ect.z, 0);.    i
188b0 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51  f( (rc&0xff)==SQ
188c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a  LITE_CORRUPT ){.
188d0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
188e0 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a  (p->out, "/*****
188f0 2a 20 43 4f 52 52 55 50 54 49 4f 4e 20 45 52 52  * CORRUPTION ERR
18900 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b  OR *******/\n");
18910 0a 20 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c  .      toggleSel
18920 65 63 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b  ectOrder(p->db);
18930 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65  .      shell_exe
18940 63 28 70 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20  c(p, sSelect.z, 
18950 30 29 3b 0a 20 20 20 20 20 20 74 6f 67 67 6c 65  0);.      toggle
18960 53 65 6c 65 63 74 4f 72 64 65 72 28 70 2d 3e 64  SelectOrder(p->d
18970 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  b);.    }.    p-
18980 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 73 61  >zDestTable = sa
18990 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20 20  vedDestTable;.  
189a0 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 73 61 76 65    p->mode = save
189b0 64 4d 6f 64 65 3b 0a 20 20 20 20 66 72 65 65 54  dMode;.    freeT
189c0 65 78 74 28 26 73 54 61 62 6c 65 29 3b 0a 20 20  ext(&sTable);.  
189d0 20 20 66 72 65 65 54 65 78 74 28 26 73 53 65 6c    freeText(&sSel
189e0 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ect);.    if( rc
189f0 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   ) p->nErr++;.  
18a00 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
18a10 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 7a 51 75 65 72  ./*.** Run zQuer
18a20 79 2e 20 20 55 73 65 20 64 75 6d 70 5f 63 61 6c  y.  Use dump_cal
18a30 6c 62 61 63 6b 28 29 20 61 73 20 74 68 65 20 63  lback() as the c
18a40 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
18a50 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  so that.** the c
18a60 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 71  ontents of the q
18a70 75 65 72 79 20 61 72 65 20 6f 75 74 70 75 74 20  uery are output 
18a80 61 73 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  as SQL statement
18a90 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 67  s..**.** If we g
18aa0 65 74 20 61 20 53 51 4c 49 54 45 5f 43 4f 52 52  et a SQLITE_CORR
18ab0 55 50 54 20 65 72 72 6f 72 2c 20 72 65 72 75 6e  UPT error, rerun
18ac0 20 74 68 65 20 71 75 65 72 79 20 61 66 74 65 72   the query after
18ad0 20 61 70 70 65 6e 64 69 6e 67 0a 2a 2a 20 22 4f   appending.** "O
18ae0 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45  RDER BY rowid DE
18af0 53 43 22 20 74 6f 20 74 68 65 20 65 6e 64 2e 0a  SC" to the end..
18b00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75  */.static int ru
18b10 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75  n_schema_dump_qu
18b20 65 72 79 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  ery(.  ShellStat
18b30 65 20 2a 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68  e *p,.  const ch
18b40 61 72 20 2a 7a 51 75 65 72 79 0a 29 7b 0a 20 20  ar *zQuery.){.  
18b50 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
18b60 7a 45 72 72 20 3d 20 30 3b 0a 20 20 72 63 20 3d  zErr = 0;.  rc =
18b70 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
18b80 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 64 75 6d  >db, zQuery, dum
18b90 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26  p_callback, p, &
18ba0 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  zErr);.  if( rc=
18bb0 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
18bc0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 51 32  ){.    char *zQ2
18bd0 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20  ;.    int len = 
18be0 73 74 72 6c 65 6e 33 30 28 7a 51 75 65 72 79 29  strlen30(zQuery)
18bf0 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
18c00 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a  (p->out, "/*****
18c10 2a 20 43 4f 52 52 55 50 54 49 4f 4e 20 45 52 52  * CORRUPTION ERR
18c20 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b  OR *******/\n");
18c30 0a 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b  .    if( zErr ){
18c40 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
18c50 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a  tf(p->out, "/***
18c60 2a 2a 2a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e  *** %s ******/\n
18c70 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  ", zErr);.      
18c80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
18c90 72 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d  r);.      zErr =
18ca0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 51   0;.    }.    zQ
18cb0 32 20 3d 20 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b  2 = malloc( len+
18cc0 31 30 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  100 );.    if( z
18cd0 51 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72  Q2==0 ) return r
18ce0 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  c;.    sqlite3_s
18cf0 6e 70 72 69 6e 74 66 28 6c 65 6e 2b 31 30 30 2c  nprintf(len+100,
18d00 20 7a 51 32 2c 20 22 25 73 20 4f 52 44 45 52 20   zQ2, "%s ORDER 
18d10 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20  BY rowid DESC", 
18d20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 72 63 20  zQuery);.    rc 
18d30 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
18d40 2d 3e 64 62 2c 20 7a 51 32 2c 20 64 75 6d 70 5f  ->db, zQ2, dump_
18d50 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45  callback, p, &zE
18d60 72 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rr);.    if( rc 
18d70 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
18d80 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a  intf(p->out, "/*
18d90 2a 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 25 73 20  ***** ERROR: %s 
18da0 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72  ******/\n", zErr
18db0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
18dc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18dd0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20  CORRUPT;.    }. 
18de0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18df0 7a 45 72 72 29 3b 0a 20 20 20 20 66 72 65 65 28  zErr);.    free(
18e00 7a 51 32 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  zQ2);.  }.  retu
18e10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18e20 54 65 78 74 20 6f 66 20 68 65 6c 70 20 6d 65 73  Text of help mes
18e30 73 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  sages..**.** The
18e40 20 68 65 6c 70 20 74 65 78 74 20 66 6f 72 20 65   help text for e
18e50 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 63  ach individual c
18e60 6f 6d 6d 61 6e 64 20 62 65 67 69 6e 73 20 77 69  ommand begins wi
18e70 74 68 20 61 20 6c 69 6e 65 20 74 68 61 74 20 73  th a line that s
18e80 74 61 72 74 73 0a 2a 2a 20 77 69 74 68 20 22 2e  tarts.** with ".
18e90 22 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 6c  ".  Subsequent l
18ea0 69 6e 65 73 20 61 72 65 20 73 75 70 70 6c 69 6d  ines are supplim
18eb0 65 6e 74 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ental informatio
18ec0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  n..**.** There m
18ed0 75 73 74 20 62 65 20 74 77 6f 20 6f 72 20 6d 6f  ust be two or mo
18ee0 72 65 20 73 70 61 63 65 73 20 62 65 74 77 65 65  re spaces betwee
18ef0 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  n the end of the
18f00 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 74 68 65   command and the
18f10 0a 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65  .** start of the
18f20 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
18f30 77 68 61 74 20 74 68 61 74 20 63 6f 6d 6d 61 6e  what that comman
18f40 64 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  d does..*/.stati
18f50 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 61  c const char *(a
18f60 7a 48 65 6c 70 5b 5d 29 20 3d 20 7b 0a 23 69 66  zHelp[]) = {.#if
18f70 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
18f80 48 41 56 45 5f 5a 4c 49 42 29 20 26 26 20 21 64  HAVE_ZLIB) && !d
18f90 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
18fa0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
18fb0 0a 20 20 22 2e 61 72 63 68 69 76 65 20 2e 2e 2e  .  ".archive ...
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 61 6e               Man
18fd0 61 67 65 20 53 51 4c 20 61 72 63 68 69 76 65 73  age SQL archives
18fe0 22 2c 0a 20 20 22 20 20 20 45 61 63 68 20 63 6f  ",.  "   Each co
18ff0 6d 6d 61 6e 64 20 6d 75 73 74 20 68 61 76 65 20  mmand must have 
19000 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74  exactly one of t
19010 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74  he following opt
19020 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20  ions:",.  "     
19030 2d 63 2c 20 2d 2d 63 72 65 61 74 65 20 20 20 20  -c, --create    
19040 20 20 20 20 20 20 20 20 20 20 20 43 72 65 61 74             Creat
19050 65 20 61 20 6e 65 77 20 61 72 63 68 69 76 65 22  e a new archive"
19060 2c 0a 20 20 22 20 20 20 20 20 2d 75 2c 20 2d 2d  ,.  "     -u, --
19070 75 70 64 61 74 65 20 20 20 20 20 20 20 20 20 20  update          
19080 20 20 20 20 20 55 70 64 61 74 65 20 6f 72 20 61       Update or a
19090 64 64 20 66 69 6c 65 73 20 74 6f 20 61 6e 20 65  dd files to an e
190a0 78 69 73 74 69 6e 67 20 61 72 63 68 69 76 65 22  xisting archive"
190b0 2c 0a 20 20 22 20 20 20 20 20 2d 74 2c 20 2d 2d  ,.  "     -t, --
190c0 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
190d0 20 20 20 20 20 4c 69 73 74 20 63 6f 6e 74 65 6e       List conten
190e0 74 73 20 6f 66 20 61 72 63 68 69 76 65 22 2c 0a  ts of archive",.
190f0 20 20 22 20 20 20 20 20 2d 78 2c 20 2d 2d 65 78    "     -x, --ex
19100 74 72 61 63 74 20 20 20 20 20 20 20 20 20 20 20  tract           
19110 20 20 20 45 78 74 72 61 63 74 20 66 69 6c 65 73     Extract files
19120 20 66 72 6f 6d 20 61 72 63 68 69 76 65 22 2c 0a   from archive",.
19130 20 20 22 20 20 20 4f 70 74 69 6f 6e 61 6c 20 61    "   Optional a
19140 72 67 75 6d 65 6e 74 73 3a 22 2c 0a 20 20 22 20  rguments:",.  " 
19150 20 20 20 20 2d 76 2c 20 2d 2d 76 65 72 62 6f 73      -v, --verbos
19160 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50  e              P
19170 72 69 6e 74 20 65 61 63 68 20 66 69 6c 65 6e 61  rint each filena
19180 6d 65 20 61 73 20 69 74 20 69 73 20 70 72 6f 63  me as it is proc
19190 65 73 73 65 64 22 2c 0a 20 20 22 20 20 20 20 20  essed",.  "     
191a0 2d 66 20 46 49 4c 45 2c 20 2d 2d 66 69 6c 65 20  -f FILE, --file 
191b0 46 49 4c 45 20 20 20 20 20 20 20 4f 70 65 72 61  FILE       Opera
191c0 74 65 20 6f 6e 20 61 72 63 68 69 76 65 20 46 49  te on archive FI
191d0 4c 45 20 28 64 65 66 61 75 6c 74 20 69 73 20 63  LE (default is c
191e0 75 72 72 65 6e 74 20 64 62 29 22 2c 0a 20 20 22  urrent db)",.  "
191f0 20 20 20 20 20 2d 61 20 46 49 4c 45 2c 20 2d 2d       -a FILE, --
19200 61 70 70 65 6e 64 20 46 49 4c 45 20 20 20 20 20  append FILE     
19210 4f 70 65 72 61 74 65 20 6f 6e 20 46 49 4c 45 20  Operate on FILE 
19220 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65  opened using the
19230 20 61 70 6e 64 76 66 73 20 56 46 53 22 2c 0a 20   apndvfs VFS",. 
19240 20 22 20 20 20 20 20 2d 43 20 44 49 52 2c 20 2d   "     -C DIR, -
19250 2d 64 69 72 65 63 74 6f 72 79 20 44 49 52 20 20  -directory DIR  
19260 20 20 43 68 61 6e 67 65 20 74 6f 20 64 69 72 65    Change to dire
19270 63 74 6f 72 79 20 44 49 52 20 74 6f 20 72 65 61  ctory DIR to rea
19280 64 2f 65 78 74 72 61 63 74 20 66 69 6c 65 73 22  d/extract files"
19290 2c 0a 20 20 22 20 20 20 20 20 2d 6e 2c 20 2d 2d  ,.  "     -n, --
192a0 64 72 79 72 75 6e 20 20 20 20 20 20 20 20 20 20  dryrun          
192b0 20 20 20 20 20 53 68 6f 77 20 74 68 65 20 53 51       Show the SQ
192c0 4c 20 74 68 61 74 20 77 6f 75 6c 64 20 68 61 76  L that would hav
192d0 65 20 6f 63 63 75 72 72 65 64 22 2c 0a 20 20 22  e occurred",.  "
192e0 20 20 20 45 78 61 6d 70 6c 65 73 3a 22 2c 0a 20     Examples:",. 
192f0 20 22 20 20 20 20 20 2e 61 72 20 2d 63 66 20 61   "     .ar -cf a
19300 72 63 68 69 76 65 2e 73 61 72 20 66 6f 6f 20 62  rchive.sar foo b
19310 61 72 20 20 23 20 43 72 65 61 74 65 20 61 72 63  ar  # Create arc
19320 68 69 76 65 2e 73 61 72 20 66 72 6f 6d 20 66 69  hive.sar from fi
19330 6c 65 73 20 66 6f 6f 20 61 6e 64 20 62 61 72 22  les foo and bar"
19340 2c 0a 20 20 22 20 20 20 20 20 2e 61 72 20 2d 74  ,.  "     .ar -t
19350 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 20 20  f archive.sar   
19360 20 20 20 20 20 20 20 23 20 4c 69 73 74 20 6d 65         # List me
19370 6d 62 65 72 73 20 6f 66 20 61 72 63 68 69 76 65  mbers of archive
19380 2e 73 61 72 22 2c 0a 20 20 22 20 20 20 20 20 2e  .sar",.  "     .
19390 61 72 20 2d 78 76 66 20 61 72 63 68 69 76 65 2e  ar -xvf archive.
193a0 73 61 72 20 20 20 20 20 20 20 20 20 23 20 56 65  sar         # Ve
193b0 72 62 6f 73 65 6c 79 20 65 78 74 72 61 63 74 20  rbosely extract 
193c0 66 69 6c 65 73 20 66 72 6f 6d 20 61 72 63 68 69  files from archi
193d0 76 65 2e 73 61 72 22 2c 0a 20 20 22 20 20 20 53  ve.sar",.  "   S
193e0 65 65 20 61 6c 73 6f 3a 22 2c 0a 20 20 22 20 20  ee also:",.  "  
193f0 20 20 20 20 68 74 74 70 3a 2f 2f 73 71 6c 69 74      http://sqlit
19400 65 2e 6f 72 67 2f 63 6c 69 2e 68 74 6d 6c 23 73  e.org/cli.html#s
19410 71 6c 61 72 5f 61 72 63 68 69 76 65 5f 73 75 70  qlar_archive_sup
19420 70 6f 72 74 22 2c 0a 23 65 6e 64 69 66 0a 23 69  port",.#endif.#i
19430 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19440 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
19450 20 20 22 2e 61 75 74 68 20 4f 4e 7c 4f 46 46 20    ".auth ON|OFF 
19460 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77              Show
19470 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c   authorizer call
19480 62 61 63 6b 73 22 2c 0a 23 65 6e 64 69 66 0a 20  backs",.#endif. 
19490 20 22 2e 62 61 63 6b 75 70 20 3f 44 42 3f 20 46   ".backup ?DB? F
194a0 49 4c 45 20 20 20 20 20 20 20 20 42 61 63 6b 75  ILE        Backu
194b0 70 20 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22  p DB (default \"
194c0 6d 61 69 6e 5c 22 29 20 74 6f 20 46 49 4c 45 22  main\") to FILE"
194d0 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 2d 61 70  ,.  "       --ap
194e0 70 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20  pend            
194f0 55 73 65 20 74 68 65 20 61 70 70 65 6e 64 76 66  Use the appendvf
19500 73 22 2c 0a 20 20 22 2e 62 61 69 6c 20 6f 6e 7c  s",.  ".bail on|
19510 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  off             
19520 53 74 6f 70 20 61 66 74 65 72 20 68 69 74 74 69  Stop after hitti
19530 6e 67 20 61 6e 20 65 72 72 6f 72 2e 20 20 44 65  ng an error.  De
19540 66 61 75 6c 74 20 4f 46 46 22 2c 0a 20 20 22 2e  fault OFF",.  ".
19550 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 20 20 20  binary on|off   
19560 20 20 20 20 20 20 20 20 54 75 72 6e 20 62 69 6e          Turn bin
19570 61 72 79 20 6f 75 74 70 75 74 20 6f 6e 20 6f 72  ary output on or
19580 20 6f 66 66 2e 20 20 44 65 66 61 75 6c 74 20 4f   off.  Default O
19590 46 46 22 2c 0a 20 20 22 2e 63 64 20 44 49 52 45  FF",.  ".cd DIRE
195a0 43 54 4f 52 59 20 20 20 20 20 20 20 20 20 20 20  CTORY           
195b0 20 43 68 61 6e 67 65 20 74 68 65 20 77 6f 72 6b   Change the work
195c0 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 74 6f  ing directory to
195d0 20 44 49 52 45 43 54 4f 52 59 22 2c 0a 20 20 22   DIRECTORY",.  "
195e0 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 20  .changes on|off 
195f0 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 6e 75           Show nu
19600 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 63 68 61  mber of rows cha
19610 6e 67 65 64 20 62 79 20 53 51 4c 22 2c 0a 20 20  nged by SQL",.  
19620 22 2e 63 68 65 63 6b 20 47 4c 4f 42 20 20 20 20  ".check GLOB    
19630 20 20 20 20 20 20 20 20 20 20 46 61 69 6c 20 69            Fail i
19640 66 20 6f 75 74 70 75 74 20 73 69 6e 63 65 20 2e  f output since .
19650 74 65 73 74 63 61 73 65 20 64 6f 65 73 20 6e 6f  testcase does no
19660 74 20 6d 61 74 63 68 22 2c 0a 20 20 22 2e 63 6c  t match",.  ".cl
19670 6f 6e 65 20 4e 45 57 44 42 20 20 20 20 20 20 20  one NEWDB       
19680 20 20 20 20 20 20 43 6c 6f 6e 65 20 64 61 74 61        Clone data
19690 20 69 6e 74 6f 20 4e 45 57 44 42 20 66 72 6f 6d   into NEWDB from
196a0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 64 61   the existing da
196b0 74 61 62 61 73 65 22 2c 0a 20 20 22 2e 64 61 74  tabase",.  ".dat
196c0 61 62 61 73 65 73 20 20 20 20 20 20 20 20 20 20  abases          
196d0 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20       List names 
196e0 61 6e 64 20 66 69 6c 65 73 20 6f 66 20 61 74 74  and files of att
196f0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 22  ached databases"
19700 2c 0a 20 20 22 2e 64 62 63 6f 6e 66 69 67 20 3f  ,.  ".dbconfig ?
19710 6f 70 3f 20 3f 76 61 6c 3f 20 20 20 20 20 4c 69  op? ?val?     Li
19720 73 74 20 6f 72 20 63 68 61 6e 67 65 20 73 71 6c  st or change sql
19730 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 29  ite3_db_config()
19740 20 6f 70 74 69 6f 6e 73 22 2c 0a 20 20 22 2e 64   options",.  ".d
19750 62 69 6e 66 6f 20 3f 44 42 3f 20 20 20 20 20 20  binfo ?DB?      
19760 20 20 20 20 20 20 20 53 68 6f 77 20 73 74 61 74         Show stat
19770 75 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  us information a
19780 62 6f 75 74 20 74 68 65 20 64 61 74 61 62 61 73  bout the databas
19790 65 22 2c 0a 20 20 22 2e 64 75 6d 70 20 3f 54 41  e",.  ".dump ?TA
197a0 42 4c 45 3f 20 2e 2e 2e 20 20 20 20 20 20 20 20  BLE? ...        
197b0 52 65 6e 64 65 72 20 61 6c 6c 20 64 61 74 61 62  Render all datab
197c0 61 73 65 20 63 6f 6e 74 65 6e 74 20 61 73 20 53  ase content as S
197d0 51 4c 22 2c 0a 20 20 22 20 20 20 4f 70 74 69 6f  QL",.  "   Optio
197e0 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d 2d  ns:",.  "     --
197f0 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 20  preserve-rowids 
19800 20 20 20 20 20 49 6e 63 6c 75 64 65 20 52 4f 57       Include ROW
19810 49 44 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  ID values in the
19820 20 6f 75 74 70 75 74 22 2c 0a 20 20 22 20 20 20   output",.  "   
19830 20 20 2d 2d 6e 65 77 6c 69 6e 65 73 20 20 20 20    --newlines    
19840 20 20 20 20 20 20 20 20 20 41 6c 6c 6f 77 20 75           Allow u
19850 6e 65 73 63 61 70 65 64 20 6e 65 77 6c 69 6e 65  nescaped newline
19860 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 6f   characters in o
19870 75 74 70 75 74 22 2c 0a 20 20 22 20 20 20 54 41  utput",.  "   TA
19880 42 4c 45 20 69 73 20 4c 49 4b 45 20 70 61 74 74  BLE is LIKE patt
19890 65 72 6e 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ern for the tabl
198a0 65 73 20 74 6f 20 64 75 6d 70 22 2c 0a 20 20 22  es to dump",.  "
198b0 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 20 20 20 20  .echo on|off    
198c0 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 63 6f           Turn co
198d0 6d 6d 61 6e 64 20 65 63 68 6f 20 6f 6e 20 6f 72  mmand echo on or
198e0 20 6f 66 66 22 2c 0a 20 20 22 2e 65 71 70 20 6f   off",.  ".eqp o
198f0 6e 7c 6f 66 66 7c 66 75 6c 6c 20 20 20 20 20 20  n|off|full      
19900 20 20 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73     Enable or dis
19910 61 62 6c 65 20 61 75 74 6f 6d 61 74 69 63 20 45  able automatic E
19920 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
19930 4e 22 2c 0a 20 20 22 2e 65 78 63 65 6c 20 20 20  N",.  ".excel   
19940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19950 44 69 73 70 6c 61 79 20 74 68 65 20 6f 75 74 70  Display the outp
19960 75 74 20 6f 66 20 6e 65 78 74 20 63 6f 6d 6d 61  ut of next comma
19970 6e 64 20 69 6e 20 61 20 73 70 72 65 61 64 73 68  nd in a spreadsh
19980 65 65 74 22 2c 0a 20 20 22 2e 65 78 69 74 20 3f  eet",.  ".exit ?
19990 43 4f 44 45 3f 20 20 20 20 20 20 20 20 20 20 20  CODE?           
199a0 20 20 45 78 69 74 20 74 68 69 73 20 70 72 6f 67    Exit this prog
199b0 72 61 6d 20 77 69 74 68 20 72 65 74 75 72 6e 2d  ram with return-
199c0 63 6f 64 65 20 43 4f 44 45 22 2c 0a 20 20 22 2e  code CODE",.  ".
199d0 65 78 70 65 72 74 20 20 20 20 20 20 20 20 20 20  expert          
199e0 20 20 20 20 20 20 20 20 45 58 50 45 52 49 4d 45          EXPERIME
199f0 4e 54 41 4c 2e 20 53 75 67 67 65 73 74 20 69 6e  NTAL. Suggest in
19a00 64 65 78 65 73 20 66 6f 72 20 73 70 65 63 69 66  dexes for specif
19a10 69 65 64 20 71 75 65 72 69 65 73 22 2c 0a 2f 2a  ied queries",./*
19a20 20 42 65 63 61 75 73 65 20 65 78 70 6c 61 69 6e   Because explain
19a30 20 6d 6f 64 65 20 63 6f 6d 65 73 20 6f 6e 20 61   mode comes on a
19a40 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6e 6f 77  utomatically now
19a50 2c 20 74 68 65 20 22 2e 65 78 70 6c 61 69 6e 22  , the ".explain"
19a60 20 6d 6f 64 65 0a 2a 2a 20 69 73 20 72 65 6d 6f   mode.** is remo
19a70 76 65 64 20 66 72 6f 6d 20 74 68 65 20 68 65 6c  ved from the hel
19a80 70 20 73 63 72 65 65 6e 2e 20 20 49 74 20 69 73  p screen.  It is
19a90 20 73 74 69 6c 6c 20 73 75 70 70 6f 72 74 65 64   still supported
19aa0 20 66 6f 72 20 6c 65 67 61 63 79 2c 20 68 6f 77   for legacy, how
19ab0 65 76 65 72 20 2a 2f 0a 2f 2a 22 2e 65 78 70 6c  ever */./*".expl
19ac0 61 69 6e 20 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f  ain ?on|off|auto
19ad0 3f 20 20 20 54 75 72 6e 20 45 58 50 4c 41 49 4e  ?   Turn EXPLAIN
19ae0 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 6f 6e 20   output mode on 
19af0 6f 72 20 6f 66 66 20 6f 72 20 74 6f 20 61 75 74  or off or to aut
19b00 6f 6d 61 74 69 63 22 2c 2a 2f 0a 20 20 22 2e 66  omatic",*/.  ".f
19b10 75 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64  ullschema ?--ind
19b20 65 6e 74 3f 20 20 20 53 68 6f 77 20 73 63 68 65  ent?   Show sche
19b30 6d 61 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  ma and the conte
19b40 6e 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61  nt of sqlite_sta
19b50 74 20 74 61 62 6c 65 73 22 2c 0a 20 20 22 2e 68  t tables",.  ".h
19b60 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66 20 20 20  eaders on|off   
19b70 20 20 20 20 20 20 20 54 75 72 6e 20 64 69 73 70         Turn disp
19b80 6c 61 79 20 6f 66 20 68 65 61 64 65 72 73 20 6f  lay of headers o
19b90 6e 20 6f 72 20 6f 66 66 22 2c 0a 20 20 22 2e 68  n or off",.  ".h
19ba0 65 6c 70 20 3f 2d 61 6c 6c 3f 20 3f 50 41 54 54  elp ?-all? ?PATT
19bb0 45 52 4e 3f 20 20 20 53 68 6f 77 20 68 65 6c 70  ERN?   Show help
19bc0 20 74 65 78 74 20 66 6f 72 20 50 41 54 54 45 52   text for PATTER
19bd0 4e 22 2c 0a 20 20 22 2e 69 6d 70 6f 72 74 20 46  N",.  ".import F
19be0 49 4c 45 20 54 41 42 4c 45 20 20 20 20 20 20 20  ILE TABLE       
19bf0 49 6d 70 6f 72 74 20 64 61 74 61 20 66 72 6f 6d  Import data from
19c00 20 46 49 4c 45 20 69 6e 74 6f 20 54 41 42 4c 45   FILE into TABLE
19c10 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ",.#ifndef SQLIT
19c20 45 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54  E_OMIT_TEST_CONT
19c30 52 4f 4c 0a 20 20 22 2e 69 6d 70 6f 73 74 65 72  ROL.  ".imposter
19c40 20 49 4e 44 45 58 20 54 41 42 4c 45 20 20 20 20   INDEX TABLE    
19c50 43 72 65 61 74 65 20 69 6d 70 6f 73 74 65 72 20  Create imposter 
19c60 74 61 62 6c 65 20 54 41 42 4c 45 20 6f 6e 20 69  table TABLE on i
19c70 6e 64 65 78 20 49 4e 44 45 58 22 2c 0a 23 65 6e  ndex INDEX",.#en
19c80 64 69 66 0a 20 20 22 2e 69 6e 64 65 78 65 73 20  dif.  ".indexes 
19c90 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20 20  ?TABLE?         
19ca0 53 68 6f 77 20 6e 61 6d 65 73 20 6f 66 20 69 6e  Show names of in
19cb0 64 65 78 65 73 22 2c 0a 20 20 22 20 20 20 20 20  dexes",.  "     
19cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cd0 20 20 20 20 20 20 49 66 20 54 41 42 4c 45 20 69        If TABLE i
19ce0 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c  s specified, onl
19cf0 79 20 73 68 6f 77 20 69 6e 64 65 78 65 73 20 66  y show indexes f
19d00 6f 72 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20  or",.  "        
19d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d20 20 20 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69     tables matchi
19d30 6e 67 20 54 41 42 4c 45 20 75 73 69 6e 67 20 74  ng TABLE using t
19d40 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
19d50 2e 22 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .",.#ifdef SQLIT
19d60 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
19d70 0a 20 20 22 2e 69 6f 74 72 61 63 65 20 46 49 4c  .  ".iotrace FIL
19d80 45 20 20 20 20 20 20 20 20 20 20 20 20 45 6e 61  E            Ena
19d90 62 6c 65 20 49 2f 4f 20 64 69 61 67 6e 6f 73 74  ble I/O diagnost
19da0 69 63 20 6c 6f 67 67 69 6e 67 20 74 6f 20 46 49  ic logging to FI
19db0 4c 45 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e  LE",.#endif.  ".
19dc0 6c 69 6d 69 74 20 3f 4c 49 4d 49 54 3f 20 3f 56  limit ?LIMIT? ?V
19dd0 41 4c 3f 20 20 20 20 20 44 69 73 70 6c 61 79 20  AL?     Display 
19de0 6f 72 20 63 68 61 6e 67 65 20 74 68 65 20 76 61  or change the va
19df0 6c 75 65 20 6f 66 20 61 6e 20 53 51 4c 49 54 45  lue of an SQLITE
19e00 5f 4c 49 4d 49 54 22 2c 0a 20 20 22 2e 6c 69 6e  _LIMIT",.  ".lin
19e10 74 20 4f 50 54 49 4f 4e 53 20 20 20 20 20 20 20  t OPTIONS       
19e20 20 20 20 20 20 52 65 70 6f 72 74 20 70 6f 74 65       Report pote
19e30 6e 74 69 61 6c 20 73 63 68 65 6d 61 20 69 73 73  ntial schema iss
19e40 75 65 73 2e 22 2c 0a 20 20 22 20 20 20 20 20 4f  ues.",.  "     O
19e50 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20  ptions:",.  "   
19e60 20 20 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65       fkey-indexe
19e70 73 20 20 20 20 20 46 69 6e 64 20 6d 69 73 73 69  s     Find missi
19e80 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  ng foreign key i
19e90 6e 64 65 78 65 73 22 2c 0a 23 69 66 6e 64 65 66  ndexes",.#ifndef
19ea0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
19eb0 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e  D_EXTENSION.  ".
19ec0 6c 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54 52 59  load FILE ?ENTRY
19ed0 3f 20 20 20 20 20 20 20 4c 6f 61 64 20 61 6e 20  ?       Load an 
19ee0 65 78 74 65 6e 73 69 6f 6e 20 6c 69 62 72 61 72  extension librar
19ef0 79 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c  y",.#endif.  ".l
19f00 6f 67 20 46 49 4c 45 7c 6f 66 66 20 20 20 20 20  og FILE|off     
19f10 20 20 20 20 20 20 20 54 75 72 6e 20 6c 6f 67 67         Turn logg
19f20 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20  ing on or off.  
19f30 46 49 4c 45 20 63 61 6e 20 62 65 20 73 74 64 65  FILE can be stde
19f40 72 72 2f 73 74 64 6f 75 74 22 2c 0a 20 20 22 2e  rr/stdout",.  ".
19f50 6d 6f 64 65 20 4d 4f 44 45 20 3f 54 41 42 4c 45  mode MODE ?TABLE
19f60 3f 20 20 20 20 20 20 20 53 65 74 20 6f 75 74 70  ?       Set outp
19f70 75 74 20 6d 6f 64 65 22 2c 0a 20 20 22 20 20 20  ut mode",.  "   
19f80 4d 4f 44 45 20 69 73 20 6f 6e 65 20 6f 66 3a 22  MODE is one of:"
19f90 2c 0a 20 20 22 20 20 20 20 20 61 73 63 69 69 20  ,.  "     ascii 
19fa0 20 20 20 43 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20     Columns/rows 
19fb0 64 65 6c 69 6d 69 74 65 64 20 62 79 20 30 78 31  delimited by 0x1
19fc0 46 20 61 6e 64 20 30 78 31 45 22 2c 0a 20 20 22  F and 0x1E",.  "
19fd0 20 20 20 20 20 63 73 76 20 20 20 20 20 20 43 6f       csv      Co
19fe0 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 20 76 61  mma-separated va
19ff0 6c 75 65 73 22 2c 0a 20 20 22 20 20 20 20 20 63  lues",.  "     c
1a000 6f 6c 75 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69  olumn   Left-ali
1a010 67 6e 65 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28  gned columns.  (
1a020 53 65 65 20 2e 77 69 64 74 68 29 22 2c 0a 20 20  See .width)",.  
1a030 22 20 20 20 20 20 68 74 6d 6c 20 20 20 20 20 48  "     html     H
1a040 54 4d 4c 20 3c 74 61 62 6c 65 3e 20 63 6f 64 65  TML <table> code
1a050 22 2c 0a 20 20 22 20 20 20 20 20 69 6e 73 65 72  ",.  "     inser
1a060 74 20 20 20 53 51 4c 20 69 6e 73 65 72 74 20 73  t   SQL insert s
1a070 74 61 74 65 6d 65 6e 74 73 20 66 6f 72 20 54 41  tatements for TA
1a080 42 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 6c 69  BLE",.  "     li
1a090 6e 65 20 20 20 20 20 4f 6e 65 20 76 61 6c 75 65  ne     One value
1a0a0 20 70 65 72 20 6c 69 6e 65 22 2c 0a 20 20 22 20   per line",.  " 
1a0b0 20 20 20 20 6c 69 73 74 20 20 20 20 20 56 61 6c      list     Val
1a0c0 75 65 73 20 64 65 6c 69 6d 69 74 65 64 20 62 79  ues delimited by
1a0d0 20 5c 22 7c 5c 22 22 2c 0a 20 20 22 20 20 20 20   \"|\"",.  "    
1a0e0 20 71 75 6f 74 65 20 20 20 20 45 73 63 61 70 65   quote    Escape
1a0f0 20 61 6e 73 77 65 72 73 20 61 73 20 66 6f 72 20   answers as for 
1a100 53 51 4c 22 2c 0a 20 20 22 20 20 20 20 20 74 61  SQL",.  "     ta
1a110 62 73 20 20 20 20 20 54 61 62 2d 73 65 70 61 72  bs     Tab-separ
1a120 61 74 65 64 20 76 61 6c 75 65 73 22 2c 0a 20 20  ated values",.  
1a130 22 20 20 20 20 20 74 63 6c 20 20 20 20 20 20 54  "     tcl      T
1a140 43 4c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73  CL list elements
1a150 22 2c 0a 20 20 22 2e 6e 75 6c 6c 76 61 6c 75 65  ",.  ".nullvalue
1a160 20 53 54 52 49 4e 47 20 20 20 20 20 20 20 20 55   STRING        U
1a170 73 65 20 53 54 52 49 4e 47 20 69 6e 20 70 6c 61  se STRING in pla
1a180 63 65 20 6f 66 20 4e 55 4c 4c 20 76 61 6c 75 65  ce of NULL value
1a190 73 22 2c 0a 20 20 22 2e 6f 6e 63 65 20 28 2d 65  s",.  ".once (-e
1a1a0 7c 2d 78 7c 46 49 4c 45 29 20 20 20 20 20 20 20  |-x|FILE)       
1a1b0 4f 75 74 70 75 74 20 66 6f 72 20 74 68 65 20 6e  Output for the n
1a1c0 65 78 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20  ext SQL command 
1a1d0 6f 6e 6c 79 20 74 6f 20 46 49 4c 45 22 2c 0a 20  only to FILE",. 
1a1e0 20 22 20 20 20 20 20 49 66 20 46 49 4c 45 20 62   "     If FILE b
1a1f0 65 67 69 6e 73 20 77 69 74 68 20 27 7c 27 20 74  egins with '|' t
1a200 68 65 6e 20 6f 70 65 6e 20 61 73 20 61 20 70 69  hen open as a pi
1a210 70 65 22 2c 0a 20 20 22 20 20 20 20 20 4f 74 68  pe",.  "     Oth
1a220 65 72 20 6f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20  er options:",.  
1a230 22 20 20 20 20 20 20 20 2d 65 20 20 20 20 49 6e  "       -e    In
1a240 76 6f 6b 65 20 73 79 73 74 65 6d 20 74 65 78 74  voke system text
1a250 20 65 64 69 74 6f 72 22 2c 0a 20 20 22 20 20 20   editor",.  "   
1a260 20 20 20 20 2d 78 20 20 20 20 4f 70 65 6e 20 69      -x    Open i
1a270 6e 20 61 20 73 70 72 65 61 64 73 68 65 65 74 22  n a spreadsheet"
1a280 2c 0a 20 20 22 2e 6f 70 65 6e 20 3f 4f 50 54 49  ,.  ".open ?OPTI
1a290 4f 4e 53 3f 20 3f 46 49 4c 45 3f 20 20 20 43 6c  ONS? ?FILE?   Cl
1a2a0 6f 73 65 20 65 78 69 73 74 69 6e 67 20 64 61 74  ose existing dat
1a2b0 61 62 61 73 65 20 61 6e 64 20 72 65 6f 70 65 6e  abase and reopen
1a2c0 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 20 20   FILE",.  "     
1a2d0 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20  Options:",.  "  
1a2e0 20 20 20 20 20 20 2d 2d 61 70 70 65 6e 64 20 20        --append  
1a2f0 20 20 20 20 55 73 65 20 61 70 70 65 6e 64 76 66      Use appendvf
1a300 73 20 74 6f 20 61 70 70 65 6e 64 20 64 61 74 61  s to append data
1a310 62 61 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20  base to the end 
1a320 6f 66 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20  of FILE",.  "   
1a330 20 20 20 20 20 2d 2d 6e 65 77 20 20 20 20 20 20       --new      
1a340 20 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 46 49     Initialize FI
1a350 4c 45 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 64  LE to an empty d
1a360 61 74 61 62 61 73 65 22 2c 0a 20 20 22 20 20 20  atabase",.  "   
1a370 20 20 20 20 20 2d 2d 72 65 61 64 6f 6e 6c 79 20       --readonly 
1a380 20 20 20 4f 70 65 6e 20 46 49 4c 45 20 72 65 61     Open FILE rea
1a390 64 6f 6e 6c 79 22 2c 0a 20 20 22 20 20 20 20 20  donly",.  "     
1a3a0 20 20 20 2d 2d 7a 69 70 20 20 20 20 20 20 20 20     --zip        
1a3b0 20 46 49 4c 45 20 69 73 20 61 20 5a 49 50 20 61   FILE is a ZIP a
1a3c0 72 63 68 69 76 65 22 2c 0a 20 20 22 2e 6f 75 74  rchive",.  ".out
1a3d0 70 75 74 20 3f 46 49 4c 45 3f 20 20 20 20 20 20  put ?FILE?      
1a3e0 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74       Send output
1a3f0 20 74 6f 20 46 49 4c 45 20 6f 72 20 73 74 64 6f   to FILE or stdo
1a400 75 74 20 69 66 20 46 49 4c 45 20 69 73 20 6f 6d  ut if FILE is om
1a410 69 74 74 65 64 22 2c 0a 20 20 22 20 20 20 20 20  itted",.  "     
1a420 49 66 20 46 49 4c 45 20 62 65 67 69 6e 73 20 77  If FILE begins w
1a430 69 74 68 20 27 7c 27 20 74 68 65 6e 20 6f 70 65  ith '|' then ope
1a440 6e 20 69 74 20 61 73 20 61 20 70 69 70 65 2e 22  n it as a pipe."
1a450 2c 0a 20 20 22 2e 70 72 69 6e 74 20 53 54 52 49  ,.  ".print STRI
1a460 4e 47 2e 2e 2e 20 20 20 20 20 20 20 20 20 50 72  NG...         Pr
1a470 69 6e 74 20 6c 69 74 65 72 61 6c 20 53 54 52 49  int literal STRI
1a480 4e 47 22 2c 0a 20 20 22 2e 70 72 6f 6d 70 74 20  NG",.  ".prompt 
1a490 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45 20 20 20  MAIN CONTINUE   
1a4a0 20 52 65 70 6c 61 63 65 20 74 68 65 20 73 74 61   Replace the sta
1a4b0 6e 64 61 72 64 20 70 72 6f 6d 70 74 73 22 2c 0a  ndard prompts",.
1a4c0 20 20 22 2e 71 75 69 74 20 20 20 20 20 20 20 20    ".quit        
1a4d0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 69 74              Exit
1a4e0 20 74 68 69 73 20 70 72 6f 67 72 61 6d 22 2c 0a   this program",.
1a4f0 20 20 22 2e 72 65 61 64 20 46 49 4c 45 20 20 20    ".read FILE   
1a500 20 20 20 20 20 20 20 20 20 20 20 20 52 65 61 64              Read
1a510 20 69 6e 70 75 74 20 66 72 6f 6d 20 46 49 4c 45   input from FILE
1a520 22 2c 0a 20 20 22 2e 72 65 73 74 6f 72 65 20 3f  ",.  ".restore ?
1a530 44 42 3f 20 46 49 4c 45 20 20 20 20 20 20 20 52  DB? FILE       R
1a540 65 73 74 6f 72 65 20 63 6f 6e 74 65 6e 74 20 6f  estore content o
1a550 66 20 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22  f DB (default \"
1a560 6d 61 69 6e 5c 22 29 20 66 72 6f 6d 20 46 49 4c  main\") from FIL
1a570 45 22 2c 0a 20 20 22 2e 73 61 76 65 20 46 49 4c  E",.  ".save FIL
1a580 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
1a590 57 72 69 74 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  Write in-memory 
1a5a0 64 61 74 61 62 61 73 65 20 69 6e 74 6f 20 46 49  database into FI
1a5b0 4c 45 22 2c 0a 20 20 22 2e 73 63 61 6e 73 74 61  LE",.  ".scansta
1a5c0 74 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  ts on|off       
1a5d0 20 54 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74   Turn sqlite3_st
1a5e0 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 20  mt_scanstatus() 
1a5f0 6d 65 74 72 69 63 73 20 6f 6e 20 6f 72 20 6f 66  metrics on or of
1a600 66 22 2c 0a 20 20 22 2e 73 63 68 65 6d 61 20 3f  f",.  ".schema ?
1a610 50 41 54 54 45 52 4e 3f 20 20 20 20 20 20 20 20  PATTERN?        
1a620 53 68 6f 77 20 74 68 65 20 43 52 45 41 54 45 20  Show the CREATE 
1a630 73 74 61 74 65 6d 65 6e 74 73 20 6d 61 74 63 68  statements match
1a640 69 6e 67 20 50 41 54 54 45 52 4e 22 2c 0a 20 20  ing PATTERN",.  
1a650 22 20 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c  "     Options:",
1a660 0a 20 20 22 20 20 20 20 20 20 20 20 20 2d 2d 69  .  "         --i
1a670 6e 64 65 6e 74 20 20 20 20 20 20 20 20 20 20 20  ndent           
1a680 20 54 72 79 20 74 6f 20 70 72 65 74 74 79 2d 70   Try to pretty-p
1a690 72 69 6e 74 20 74 68 65 20 73 63 68 65 6d 61 22  rint the schema"
1a6a0 2c 0a 20 20 22 2e 73 65 6c 66 74 65 73 74 20 3f  ,.  ".selftest ?
1a6b0 4f 50 54 49 4f 4e 53 3f 20 20 20 20 20 20 52 75  OPTIONS?      Ru
1a6c0 6e 20 74 65 73 74 73 20 64 65 66 69 6e 65 64 20  n tests defined 
1a6d0 69 6e 20 74 68 65 20 53 45 4c 46 54 45 53 54 20  in the SELFTEST 
1a6e0 74 61 62 6c 65 22 2c 0a 20 20 22 20 20 20 20 4f  table",.  "    O
1a6f0 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20  ptions:",.  "   
1a700 20 20 20 20 2d 2d 69 6e 69 74 20 20 20 20 20 20      --init      
1a710 20 20 20 20 20 20 20 20 20 43 72 65 61 74 65 20           Create 
1a720 61 20 6e 65 77 20 53 45 4c 46 54 45 53 54 20 74  a new SELFTEST t
1a730 61 62 6c 65 22 2c 0a 20 20 22 20 20 20 20 20 20  able",.  "      
1a740 20 2d 76 20 20 20 20 20 20 20 20 20 20 20 20 20   -v             
1a750 20 20 20 20 20 20 56 65 72 62 6f 73 65 20 6f 75        Verbose ou
1a760 74 70 75 74 22 2c 0a 20 20 22 2e 73 65 70 61 72  tput",.  ".separ
1a770 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f 20 20  ator COL ?ROW?  
1a780 20 20 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f     Change the co
1a790 6c 75 6d 6e 20 61 6e 64 20 72 6f 77 20 73 65 70  lumn and row sep
1a7a0 61 72 61 74 6f 72 73 22 2c 0a 23 69 66 20 64 65  arators",.#if de
1a7b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1a7c0 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 22  BLE_SESSION).  "
1a7d0 2e 73 65 73 73 69 6f 6e 20 3f 4e 41 4d 45 3f 20  .session ?NAME? 
1a7e0 43 4d 44 20 2e 2e 2e 20 20 43 72 65 61 74 65 20  CMD ...  Create 
1a7f0 6f 72 20 63 6f 6e 74 72 6f 6c 20 73 65 73 73 69  or control sessi
1a800 6f 6e 73 22 2c 0a 20 20 22 20 20 20 53 75 62 63  ons",.  "   Subc
1a810 6f 6d 6d 61 6e 64 73 3a 22 2c 0a 20 20 22 20 20  ommands:",.  "  
1a820 20 20 20 61 74 74 61 63 68 20 54 41 42 4c 45 20     attach TABLE 
1a830 20 20 20 20 20 20 20 20 20 20 20 20 41 74 74 61              Atta
1a840 63 68 20 54 41 42 4c 45 22 2c 0a 20 20 22 20 20  ch TABLE",.  "  
1a850 20 20 20 63 68 61 6e 67 65 73 65 74 20 46 49 4c     changeset FIL
1a860 45 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74  E           Writ
1a870 65 20 61 20 63 68 61 6e 67 65 73 65 74 20 69 6e  e a changeset in
1a880 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20  to FILE",.  "   
1a890 20 20 63 6c 6f 73 65 20 20 20 20 20 20 20 20 20    close         
1a8a0 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f 73 65             Close
1a8b0 20 6f 6e 65 20 73 65 73 73 69 6f 6e 22 2c 0a 20   one session",. 
1a8c0 20 22 20 20 20 20 20 65 6e 61 62 6c 65 20 3f 42   "     enable ?B
1a8d0 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20 20 20  OOLEAN?         
1a8e0 53 65 74 20 6f 72 20 71 75 65 72 79 20 74 68 65  Set or query the
1a8f0 20 65 6e 61 62 6c 65 20 62 69 74 22 2c 0a 20 20   enable bit",.  
1a900 22 20 20 20 20 20 66 69 6c 74 65 72 20 47 4c 4f  "     filter GLO
1a910 42 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20 52  B...           R
1a920 65 6a 65 63 74 20 74 61 62 6c 65 73 20 6d 61 74  eject tables mat
1a930 63 68 69 6e 67 20 47 4c 4f 42 73 22 2c 0a 20 20  ching GLOBs",.  
1a940 22 20 20 20 20 20 69 6e 64 69 72 65 63 74 20 3f  "     indirect ?
1a950 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20 4d  BOOLEAN?       M
1a960 61 72 6b 20 6f 72 20 71 75 65 72 79 20 74 68 65  ark or query the
1a970 20 69 6e 64 69 72 65 63 74 20 73 74 61 74 75 73   indirect status
1a980 22 2c 0a 20 20 22 20 20 20 20 20 69 73 65 6d 70  ",.  "     isemp
1a990 74 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ty              
1a9a0 20 20 20 20 51 75 65 72 79 20 77 68 65 74 68 65      Query whethe
1a9b0 72 20 74 68 65 20 73 65 73 73 69 6f 6e 20 69 73  r the session is
1a9c0 20 65 6d 70 74 79 22 2c 0a 20 20 22 20 20 20 20   empty",.  "    
1a9d0 20 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20   list           
1a9e0 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20 63            List c
1a9f0 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65  urrently open se
1aa00 73 73 69 6f 6e 20 6e 61 6d 65 73 22 2c 0a 20 20  ssion names",.  
1aa10 22 20 20 20 20 20 6f 70 65 6e 20 44 42 20 4e 41  "     open DB NA
1aa20 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  ME             O
1aa30 70 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f  pen a new sessio
1aa40 6e 20 6f 6e 20 44 42 22 2c 0a 20 20 22 20 20 20  n on DB",.  "   
1aa50 20 20 70 61 74 63 68 73 65 74 20 46 49 4c 45 20    patchset FILE 
1aa60 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 65             Write
1aa70 20 61 20 70 61 74 63 68 73 65 74 20 69 6e 74 6f   a patchset into
1aa80 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 49 66   FILE",.  "   If
1aa90 20 3f 4e 41 4d 45 3f 20 69 73 20 6f 6d 69 74 74   ?NAME? is omitt
1aaa0 65 64 2c 20 74 68 65 20 66 69 72 73 74 20 64 65  ed, the first de
1aab0 66 69 6e 65 64 20 73 65 73 73 69 6f 6e 20 69 73  fined session is
1aac0 20 75 73 65 64 2e 22 2c 0a 23 65 6e 64 69 66 0a   used.",.#endif.
1aad0 20 20 22 2e 73 68 61 33 73 75 6d 20 2e 2e 2e 20    ".sha3sum ... 
1aae0 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6d 70              Comp
1aaf0 75 74 65 20 61 20 53 48 41 33 20 68 61 73 68 20  ute a SHA3 hash 
1ab00 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
1ab10 65 6e 74 22 2c 0a 20 20 22 20 20 20 20 4f 70 74  ent",.  "    Opt
1ab20 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20  ions:",.  "     
1ab30 20 2d 2d 73 63 68 65 6d 61 20 20 20 20 20 20 20   --schema       
1ab40 20 20 20 20 20 20 20 41 6c 73 6f 20 68 61 73 68         Also hash
1ab50 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
1ab60 65 72 20 74 61 62 6c 65 22 2c 0a 20 20 22 20 20  er table",.  "  
1ab70 20 20 20 20 2d 2d 73 68 61 33 2d 32 32 34 20 20      --sha3-224  
1ab80 20 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68            Use th
1ab90 65 20 73 68 61 33 2d 32 32 34 20 61 6c 67 6f 72  e sha3-224 algor
1aba0 69 74 68 6d 22 2c 0a 20 20 22 20 20 20 20 20 20  ithm",.  "      
1abb0 2d 2d 73 68 61 33 2d 32 35 36 20 20 20 20 20 20  --sha3-256      
1abc0 20 20 20 20 20 20 55 73 65 20 74 68 65 20 73 68        Use the sh
1abd0 61 33 2d 32 35 36 20 61 6c 67 6f 72 69 74 68 6d  a3-256 algorithm
1abe0 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
1abf0 65 66 61 75 6c 74 2e 22 2c 0a 20 20 22 20 20 20  efault.",.  "   
1ac00 20 20 20 2d 2d 73 68 61 33 2d 33 38 34 20 20 20     --sha3-384   
1ac10 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68 65           Use the
1ac20 20 73 68 61 33 2d 33 38 34 20 61 6c 67 6f 72 69   sha3-384 algori
1ac30 74 68 6d 22 2c 0a 20 20 22 20 20 20 20 20 20 2d  thm",.  "      -
1ac40 2d 73 68 61 33 2d 35 31 32 20 20 20 20 20 20 20  -sha3-512       
1ac50 20 20 20 20 20 55 73 65 20 74 68 65 20 73 68 61       Use the sha
1ac60 33 2d 35 31 32 20 61 6c 67 6f 72 69 74 68 6d 22  3-512 algorithm"
1ac70 2c 0a 20 20 22 20 20 20 20 41 6e 79 20 6f 74 68  ,.  "    Any oth
1ac80 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  er argument is a
1ac90 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 66 6f   LIKE pattern fo
1aca0 72 20 74 61 62 6c 65 73 20 74 6f 20 68 61 73 68  r tables to hash
1acb0 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ",.#ifndef SQLIT
1acc0 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a  E_NOHAVE_SYSTEM.
1acd0 20 20 22 2e 73 68 65 6c 6c 20 43 4d 44 20 41 52    ".shell CMD AR
1ace0 47 53 2e 2e 2e 20 20 20 20 20 20 20 52 75 6e 20  GS...       Run 
1acf0 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e 20 61  CMD ARGS... in a
1ad00 20 73 79 73 74 65 6d 20 73 68 65 6c 6c 22 2c 0a   system shell",.
1ad10 23 65 6e 64 69 66 0a 20 20 22 2e 73 68 6f 77 20  #endif.  ".show 
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad30 20 20 20 53 68 6f 77 20 74 68 65 20 63 75 72 72     Show the curr
1ad40 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 76  ent values for v
1ad50 61 72 69 6f 75 73 20 73 65 74 74 69 6e 67 73 22  arious settings"
1ad60 2c 0a 20 20 22 2e 73 74 61 74 73 20 3f 6f 6e 7c  ,.  ".stats ?on|
1ad70 6f 66 66 3f 20 20 20 20 20 20 20 20 20 20 53 68  off?          Sh
1ad80 6f 77 20 73 74 61 74 73 20 6f 72 20 74 75 72 6e  ow stats or turn
1ad90 20 73 74 61 74 73 20 6f 6e 20 6f 72 20 6f 66 66   stats on or off
1ada0 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ",.#ifndef SQLIT
1adb0 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a  E_NOHAVE_SYSTEM.
1adc0 20 20 22 2e 73 79 73 74 65 6d 20 43 4d 44 20 41    ".system CMD A
1add0 52 47 53 2e 2e 2e 20 20 20 20 20 20 52 75 6e 20  RGS...      Run 
1ade0 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e 20 61  CMD ARGS... in a
1adf0 20 73 79 73 74 65 6d 20 73 68 65 6c 6c 22 2c 0a   system shell",.
1ae00 23 65 6e 64 69 66 0a 20 20 22 2e 74 61 62 6c 65  #endif.  ".table
1ae10 73 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20  s ?TABLE?       
1ae20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 6f 66     List names of
1ae30 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67   tables matching
1ae40 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41   LIKE pattern TA
1ae50 42 4c 45 22 2c 0a 20 20 22 2e 74 65 73 74 63 61  BLE",.  ".testca
1ae60 73 65 20 4e 41 4d 45 20 20 20 20 20 20 20 20 20  se NAME         
1ae70 20 20 42 65 67 69 6e 20 72 65 64 69 72 65 63 74    Begin redirect
1ae80 69 6e 67 20 6f 75 74 70 75 74 20 74 6f 20 27 74  ing output to 't
1ae90 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 27  estcase-out.txt'
1aea0 22 2c 0a 20 20 22 2e 74 69 6d 65 6f 75 74 20 4d  ",.  ".timeout M
1aeb0 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  S              T
1aec0 72 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63 6b 65  ry opening locke
1aed0 64 20 74 61 62 6c 65 73 20 66 6f 72 20 4d 53 20  d tables for MS 
1aee0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 22 2c 0a 20  milliseconds",. 
1aef0 20 22 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66 66 20   ".timer on|off 
1af00 20 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20             Turn 
1af10 53 51 4c 20 74 69 6d 65 72 20 6f 6e 20 6f 72 20  SQL timer on or 
1af20 6f 66 66 22 2c 0a 20 20 22 2e 74 72 61 63 65 20  off",.  ".trace 
1af30 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20 20  FILE|off        
1af40 20 20 4f 75 74 70 75 74 20 65 61 63 68 20 53 51    Output each SQ
1af50 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 69  L statement as i
1af60 74 20 69 73 20 72 75 6e 22 2c 0a 20 20 22 2e 76  t is run",.  ".v
1af70 66 73 69 6e 66 6f 20 3f 41 55 58 3f 20 20 20 20  fsinfo ?AUX?    
1af80 20 20 20 20 20 20 20 49 6e 66 6f 72 6d 61 74 69         Informati
1af90 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 74 6f 70  on about the top
1afa0 2d 6c 65 76 65 6c 20 56 46 53 22 2c 0a 20 20 22  -level VFS",.  "
1afb0 2e 76 66 73 6c 69 73 74 20 20 20 20 20 20 20 20  .vfslist        
1afc0 20 20 20 20 20 20 20 20 20 4c 69 73 74 20 61 6c           List al
1afd0 6c 20 61 76 61 69 6c 61 62 6c 65 20 56 46 53 65  l available VFSe
1afe0 73 22 2c 0a 20 20 22 2e 76 66 73 6e 61 6d 65 20  s",.  ".vfsname 
1aff0 3f 41 55 58 3f 20 20 20 20 20 20 20 20 20 20 20  ?AUX?           
1b000 50 72 69 6e 74 20 74 68 65 20 6e 61 6d 65 20 6f  Print the name o
1b010 66 20 74 68 65 20 56 46 53 20 73 74 61 63 6b 22  f the VFS stack"
1b020 2c 0a 20 20 22 2e 77 69 64 74 68 20 4e 55 4d 31  ,.  ".width NUM1
1b030 20 4e 55 4d 32 20 2e 2e 2e 20 20 20 20 20 53 65   NUM2 ...     Se
1b040 74 20 63 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20  t column widths 
1b050 66 6f 72 20 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d  for \"column\" m
1b060 6f 64 65 22 2c 0a 20 20 22 20 20 20 20 20 4e 65  ode",.  "     Ne
1b070 67 61 74 69 76 65 20 76 61 6c 75 65 73 20 72 69  gative values ri
1b080 67 68 74 2d 6a 75 73 74 69 66 79 22 2c 0a 7d 3b  ght-justify",.};
1b090 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 68  ../*.** Output h
1b0a0 65 6c 70 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20  elp text..**.** 
1b0b0 7a 50 61 74 74 65 72 6e 20 64 65 73 63 72 69 62  zPattern describ
1b0c0 65 73 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  es the set of co
1b0d0 6d 6d 61 6e 64 73 20 66 6f 72 20 77 68 69 63 68  mmands for which
1b0e0 20 68 65 6c 70 20 74 65 78 74 20 69 73 20 70 72   help text is pr
1b0f0 6f 76 69 64 65 64 2e 0a 2a 2a 20 49 66 20 7a 50  ovided..** If zP
1b100 61 74 74 65 72 6e 20 69 73 20 4e 55 4c 4c 2c 20  attern is NULL, 
1b110 74 68 65 6e 20 73 68 6f 77 20 61 6c 6c 20 63 6f  then show all co
1b120 6d 6d 61 6e 64 73 2c 20 62 75 74 20 6f 6e 6c 79  mmands, but only
1b130 20 67 69 76 65 20 61 20 6f 6e 65 2d 6c 69 6e 65   give a one-line
1b140 0a 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e 20  .** description 
1b150 6f 66 20 65 61 63 68 2e 0a 2a 2a 0a 2a 2a 20 52  of each..**.** R
1b160 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1b170 20 6f 66 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a   of matches..*/.
1b180 73 74 61 74 69 63 20 69 6e 74 20 73 68 6f 77 48  static int showH
1b190 65 6c 70 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  elp(FILE *out, c
1b1a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 74  onst char *zPatt
1b1b0 65 72 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  ern){.  int i, j
1b1c0 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  ;.  int n = 0;. 
1b1d0 20 63 68 61 72 20 2a 7a 50 61 74 3b 0a 20 20 69   char *zPat;.  i
1b1e0 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d 30 20 7c  f( zPattern==0 |
1b1f0 7c 20 7a 50 61 74 74 65 72 6e 5b 30 5d 3d 3d 27  | zPattern[0]=='
1b200 30 27 20 29 7b 0a 20 20 20 20 2f 2a 20 53 68 6f  0' ){.    /* Sho
1b210 77 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73 2c 20  w all commands, 
1b220 62 75 74 20 6f 6e 6c 79 20 6f 6e 65 20 6c 69 6e  but only one lin
1b230 65 20 70 65 72 20 63 6f 6d 6d 61 6e 64 20 2a 2f  e per command */
1b240 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1b250 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70  ArraySize(azHelp
1b260 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
1b270 66 28 20 61 7a 48 65 6c 70 5b 69 5d 5b 30 5d 3d  f( azHelp[i][0]=
1b280 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
1b290 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
1b2a0 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b   "%s\n", azHelp[
1b2b0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b  i]);.        n++
1b2c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b2d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1b2e0 4c 6f 6f 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64  Look for command
1b2f0 73 20 74 68 61 74 20 66 6f 72 20 77 68 69 63 68  s that for which
1b300 20 7a 50 61 74 74 65 72 6e 20 69 73 20 61 6e 20   zPattern is an 
1b310 65 78 61 63 74 20 70 72 65 66 69 78 20 2a 2f 0a  exact prefix */.
1b320 20 20 20 20 7a 50 61 74 20 3d 20 73 71 6c 69 74      zPat = sqlit
1b330 65 33 5f 6d 70 72 69 6e 74 66 28 22 2e 25 73 2a  e3_mprintf(".%s*
1b340 22 2c 20 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  ", zPattern);.  
1b350 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
1b360 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 3b 20  aySize(azHelp); 
1b370 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
1b380 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
1b390 7a 50 61 74 2c 20 61 7a 48 65 6c 70 5b 69 5d 29  zPat, azHelp[i])
1b3a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==0 ){.        u
1b3b0 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
1b3c0 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 69  "%s\n", azHelp[i
1b3d0 5d 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  ]);.        j = 
1b3e0 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b  i+1;.        n++
1b3f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b400 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1b410 28 7a 50 61 74 29 3b 0a 20 20 20 20 69 66 28 20  (zPat);.    if( 
1b420 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  n ){.      if( n
1b430 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==1 ){.        /
1b440 2a 20 77 68 65 6e 20 7a 50 61 74 74 65 72 6e 20  * when zPattern 
1b450 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 65  is a prefix of e
1b460 78 61 63 74 6c 79 20 6f 6e 65 20 63 6f 6d 6d 61  xactly one comma
1b470 6e 64 2c 20 74 68 65 6e 20 69 6e 63 6c 75 64 65  nd, then include
1b480 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1b490 64 65 74 61 69 6c 73 20 6f 66 20 74 68 61 74 20  details of that 
1b4a0 63 6f 6d 6d 61 6e 64 2c 20 77 68 69 63 68 20 73  command, which s
1b4b0 68 6f 75 6c 64 20 62 65 67 69 6e 20 61 74 20 6f  hould begin at o
1b4c0 66 66 73 65 74 20 6a 20 2a 2f 0a 20 20 20 20 20  ffset j */.     
1b4d0 20 20 20 77 68 69 6c 65 28 20 6a 3c 41 72 72 61     while( j<Arra
1b4e0 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 2d 31 20  ySize(azHelp)-1 
1b4f0 26 26 20 61 7a 48 65 6c 70 5b 6a 5d 5b 30 5d 21  && azHelp[j][0]!
1b500 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
1b510 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
1b520 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c  t, "%s\n", azHel
1b530 70 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  p[j]);.         
1b540 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a   j++;.        }.
1b550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1b560 74 75 72 6e 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  turn n;.    }.  
1b570 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 63 6f    /* Look for co
1b580 6d 6d 61 6e 64 73 20 74 68 61 74 20 63 6f 6e 74  mmands that cont
1b590 61 69 6e 20 7a 50 61 74 74 65 72 6e 20 61 6e 79  ain zPattern any
1b5a0 77 68 65 72 65 2e 20 20 53 68 6f 77 20 74 68 65  where.  Show the
1b5b0 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a   complete.    **
1b5c0 20 74 65 78 74 20 6f 66 20 61 6c 6c 20 63 6f 6d   text of all com
1b5d0 6d 61 6e 64 73 20 74 68 61 74 20 6d 61 74 63 68  mands that match
1b5e0 2e 20 2a 2f 0a 20 20 20 20 7a 50 61 74 20 3d 20  . */.    zPat = 
1b5f0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1b600 22 25 25 25 73 25 25 22 2c 20 7a 50 61 74 74 65  "%%%s%%", zPatte
1b610 72 6e 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  rn);.    for(i=0
1b620 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 7a  ; i<ArraySize(az
1b630 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  Help); i++){.   
1b640 20 20 20 69 66 28 20 61 7a 48 65 6c 70 5b 69 5d     if( azHelp[i]
1b650 5b 30 5d 3d 3d 27 2e 27 20 29 20 6a 20 3d 20 69  [0]=='.' ) j = i
1b660 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
1b670 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a 50 61 74  te3_strlike(zPat
1b680 2c 20 61 7a 48 65 6c 70 5b 69 5d 2c 20 30 29 3d  , azHelp[i], 0)=
1b690 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  =0 ){.        ut
1b6a0 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
1b6b0 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d  %s\n", azHelp[j]
1b6c0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
1b6d0 28 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 61 7a  ( j<ArraySize(az
1b6e0 48 65 6c 70 29 2d 31 20 26 26 20 61 7a 48 65 6c  Help)-1 && azHel
1b6f0 70 5b 6a 2b 31 5d 5b 30 5d 21 3d 27 2e 27 20 29  p[j+1][0]!='.' )
1b700 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b  {.          j++;
1b710 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
1b720 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c  printf(out, "%s\
1b730 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b 0a  n", azHelp[j]);.
1b740 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b750 20 20 69 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20    i = j;.       
1b760 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   n++;.      }.  
1b770 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
1b780 66 72 65 65 28 7a 50 61 74 29 3b 0a 20 20 7d 0a  free(zPat);.  }.
1b790 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
1b7a0 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
1b7b0 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
1b7c0 74 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28  t process_input(
1b7d0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 46  ShellState *p, F
1b7e0 49 4c 45 20 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a 2a  ILE *in);../*.**
1b7f0 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
1b800 74 20 6f 66 20 66 69 6c 65 20 7a 4e 61 6d 65 20  t of file zName 
1b810 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
1b820 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
1b830 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 0a 2a 2a 20  3_malloc64().** 
1b840 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
1b850 6e 74 65 72 20 74 6f 20 74 68 65 20 62 75 66 66  nter to the buff
1b860 65 72 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 69  er. The caller i
1b870 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1b880 72 20 66 72 65 65 69 6e 67 0a 2a 2a 20 74 68 65  r freeing.** the
1b890 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 49   memory..**.** I
1b8a0 66 20 70 61 72 61 6d 65 74 65 72 20 70 6e 42 79  f parameter pnBy
1b8b0 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  te is not NULL, 
1b8c0 28 2a 70 6e 42 79 74 65 29 20 69 73 20 73 65 74  (*pnByte) is set
1b8d0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
1b8e0 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e  f bytes.** read.
1b8f0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 76 65  .**.** For conve
1b900 6e 69 65 6e 63 65 2c 20 61 20 6e 75 6c 2d 74 65  nience, a nul-te
1b910 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73  rminator byte is
1b920 20 61 6c 77 61 79 73 20 61 70 70 65 6e 64 65 64   always appended
1b930 20 74 6f 20 74 68 65 20 64 61 74 61 20 72 65 61   to the data rea
1b940 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
1b950 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 62 75  le before the bu
1b960 66 66 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ffer is returned
1b970 2e 20 54 68 69 73 20 62 79 74 65 20 69 73 20 6e  . This byte is n
1b980 6f 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 2a  ot included in.*
1b990 2a 20 74 68 65 20 66 69 6e 61 6c 20 76 61 6c 75  * the final valu
1b9a0 65 20 6f 66 20 28 2a 70 6e 42 79 74 65 29 2c 20  e of (*pnByte), 
1b9b0 69 66 20 61 70 70 6c 69 63 61 62 6c 65 2e 0a 2a  if applicable..*
1b9c0 2a 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74  *.** NULL is ret
1b9d0 75 72 6e 65 64 20 69 66 20 61 6e 79 20 65 72 72  urned if any err
1b9e0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
1b9f0 64 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c  d. The final val
1ba00 75 65 20 6f 66 20 2a 70 6e 42 79 74 65 0a 2a 2a  ue of *pnByte.**
1ba10 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   is undefined in
1ba20 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73   this case..*/.s
1ba30 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 61 64  tatic char *read
1ba40 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  File(const char 
1ba50 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e 42  *zName, int *pnB
1ba60 79 74 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e  yte){.  FILE *in
1ba70 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20   = fopen(zName, 
1ba80 22 72 62 22 29 3b 0a 20 20 6c 6f 6e 67 20 6e 49  "rb");.  long nI
1ba90 6e 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52 65 61  n;.  size_t nRea
1baa0 64 3b 0a 20 20 63 68 61 72 20 2a 70 42 75 66 3b  d;.  char *pBuf;
1bab0 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72  .  if( in==0 ) r
1bac0 65 74 75 72 6e 20 30 3b 0a 20 20 66 73 65 65 6b  eturn 0;.  fseek
1bad0 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44  (in, 0, SEEK_END
1bae0 29 3b 0a 20 20 6e 49 6e 20 3d 20 66 74 65 6c 6c  );.  nIn = ftell
1baf0 28 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28 69  (in);.  rewind(i
1bb00 6e 29 3b 0a 20 20 70 42 75 66 20 3d 20 73 71 6c  n);.  pBuf = sql
1bb10 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e  ite3_malloc64( n
1bb20 49 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 42  In+1 );.  if( pB
1bb30 75 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  uf==0 ) return 0
1bb40 3b 0a 20 20 6e 52 65 61 64 20 3d 20 66 72 65 61  ;.  nRead = frea
1bb50 64 28 70 42 75 66 2c 20 6e 49 6e 2c 20 31 2c 20  d(pBuf, nIn, 1, 
1bb60 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e  in);.  fclose(in
1bb70 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 21 3d  );.  if( nRead!=
1bb80 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
1bb90 5f 66 72 65 65 28 70 42 75 66 29 3b 0a 20 20 20  _free(pBuf);.   
1bba0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1bbb0 20 70 42 75 66 5b 6e 49 6e 5d 20 3d 20 30 3b 0a   pBuf[nIn] = 0;.
1bbc0 20 20 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a    if( pnByte ) *
1bbd0 70 6e 42 79 74 65 20 3d 20 6e 49 6e 3b 0a 20 20  pnByte = nIn;.  
1bbe0 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a  return pBuf;.}..
1bbf0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1bc00 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
1bc10 4e 29 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  N)./*.** Close a
1bc20 20 73 69 6e 67 6c 65 20 4f 70 65 6e 53 65 73 73   single OpenSess
1bc30 69 6f 6e 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  ion object and r
1bc40 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 69 74  elease all of it
1bc50 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  s associated.** 
1bc60 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 73 74  resources..*/.st
1bc70 61 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f  atic void sessio
1bc80 6e 5f 63 6c 6f 73 65 28 4f 70 65 6e 53 65 73 73  n_close(OpenSess
1bc90 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 29 7b 0a  ion *pSession){.
1bca0 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
1bcb0 65 33 73 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65  e3session_delete
1bcc0 28 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20  (pSession->p);. 
1bcd0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
1bce0 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a  ession->zName);.
1bcf0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65    for(i=0; i<pSe
1bd00 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20  ssion->nFilter; 
1bd10 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1bd20 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d  3_free(pSession-
1bd30 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 29 3b 0a 20  >azFilter[i]);. 
1bd40 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
1bd50 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69  e(pSession->azFi
1bd60 6c 74 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28  lter);.  memset(
1bd70 70 53 65 73 73 69 6f 6e 2c 20 30 2c 20 73 69 7a  pSession, 0, siz
1bd80 65 6f 66 28 4f 70 65 6e 53 65 73 73 69 6f 6e 29  eof(OpenSession)
1bd90 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
1bda0 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 4f 70 65  ** Close all Ope
1bdb0 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73  nSession objects
1bdc0 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
1bdd0 20 61 73 73 6f 63 69 61 74 65 64 20 72 65 73 6f   associated reso
1bde0 75 72 63 65 73 2e 0a 2a 2f 0a 23 69 66 20 64 65  urces..*/.#if de
1bdf0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1be00 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61  BLE_SESSION).sta
1be10 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e  tic void session
1be20 5f 63 6c 6f 73 65 5f 61 6c 6c 28 53 68 65 6c 6c  _close_all(Shell
1be30 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74  State *p){.  int
1be40 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
1be50 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b  <p->nSession; i+
1be60 2b 29 7b 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f  +){.    session_
1be70 63 6c 6f 73 65 28 26 70 2d 3e 61 53 65 73 73 69  close(&p->aSessi
1be80 6f 6e 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 2d  on[i]);.  }.  p-
1be90 3e 6e 53 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 7d  >nSession = 0;.}
1bea0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1beb0 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c  session_close_al
1bec0 6c 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  l(X).#endif../*.
1bed0 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
1bee0 6e 20 6f 66 20 74 68 65 20 78 46 69 6c 74 65 72  n of the xFilter
1bef0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e   function for an
1bf00 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 2e 20 20   open session.  
1bf10 4f 6d 69 74 0a 2a 2a 20 61 6e 79 20 74 61 62 6c  Omit.** any tabl
1bf20 65 73 20 6e 61 6d 65 64 20 62 79 20 22 2e 73 65  es named by ".se
1bf30 73 73 69 6f 6e 20 66 69 6c 74 65 72 22 20 62 75  ssion filter" bu
1bf40 74 20 6c 65 74 20 61 6c 6c 20 6f 74 68 65 72 20  t let all other 
1bf50 74 61 62 6c 65 20 74 68 72 6f 75 67 68 2e 0a 2a  table through..*
1bf60 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
1bf70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
1bf80 49 4f 4e 29 0a 73 74 61 74 69 63 20 69 6e 74 20  ION).static int 
1bf90 73 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72 28 76  session_filter(v
1bfa0 6f 69 64 20 2a 70 43 74 78 2c 20 63 6f 6e 73 74  oid *pCtx, const
1bfb0 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20   char *zTab){.  
1bfc0 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65  OpenSession *pSe
1bfd0 73 73 69 6f 6e 20 3d 20 28 4f 70 65 6e 53 65 73  ssion = (OpenSes
1bfe0 73 69 6f 6e 2a 29 70 43 74 78 3b 0a 20 20 69 6e  sion*)pCtx;.  in
1bff0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1c000 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c  i<pSession->nFil
1c010 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ter; i++){.    i
1c020 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
1c030 6f 62 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46  ob(pSession->azF
1c040 69 6c 74 65 72 5b 69 5d 2c 20 7a 54 61 62 29 3d  ilter[i], zTab)=
1c050 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1c060 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
1c070 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1c080 72 79 20 74 6f 20 64 65 64 75 63 65 20 74 68 65  ry to deduce the
1c090 20 74 79 70 65 20 6f 66 20 66 69 6c 65 20 66 6f   type of file fo
1c0a0 72 20 7a 4e 61 6d 65 20 62 61 73 65 64 20 6f 6e  r zName based on
1c0b0 20 69 74 73 20 63 6f 6e 74 65 6e 74 2e 20 20 52   its content.  R
1c0c0 65 74 75 72 6e 0a 2a 2a 20 6f 6e 65 20 6f 66 20  eturn.** one of 
1c0d0 74 68 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 2a  the SHELL_OPEN_*
1c0e0 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 2a 2a 0a 2a   constants..**.*
1c0f0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f  * If the file do
1c100 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
1c110 69 73 20 65 6d 70 74 79 20 62 75 74 20 69 74 73  is empty but its
1c120 20 6e 61 6d 65 20 6c 6f 6f 6b 73 20 6c 69 6b 65   name looks like
1c130 20 61 20 5a 49 50 0a 2a 2a 20 61 72 63 68 69 76   a ZIP.** archiv
1c140 65 20 61 6e 64 20 74 68 65 20 64 66 6c 74 5a 69  e and the dfltZi
1c150 70 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  p flag is true, 
1c160 74 68 65 6e 20 61 73 73 75 6d 65 20 69 74 20 69  then assume it i
1c170 73 20 61 20 5a 49 50 20 61 72 63 68 69 76 65 2e  s a ZIP archive.
1c180 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
1c190 73 73 75 6d 65 20 61 6e 20 6f 72 64 69 6e 61 72  ssume an ordinar
1c1a0 79 20 64 61 74 61 62 61 73 65 20 72 65 67 61 72  y database regar
1c1b0 64 6c 65 73 73 20 6f 66 20 74 68 65 20 66 69 6c  dless of the fil
1c1c0 65 6e 61 6d 65 20 69 66 0a 2a 2a 20 74 68 65 20  ename if.** the 
1c1d0 74 79 70 65 20 63 61 6e 6e 6f 74 20 62 65 20 64  type cannot be d
1c1e0 65 74 65 72 6d 69 6e 65 64 20 66 72 6f 6d 20 63  etermined from c
1c1f0 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 64  ontent..*/.int d
1c200 65 64 75 63 65 44 61 74 61 62 61 73 65 54 79 70  educeDatabaseTyp
1c210 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  e(const char *zN
1c220 61 6d 65 2c 20 69 6e 74 20 64 66 6c 74 5a 69 70  ame, int dfltZip
1c230 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20 66  ){.  FILE *f = f
1c240 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22  open(zName, "rb"
1c250 29 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 3b 0a 20  );.  size_t n;. 
1c260 20 69 6e 74 20 72 63 20 3d 20 53 48 45 4c 4c 5f   int rc = SHELL_
1c270 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 63  OPEN_UNSPEC;.  c
1c280 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20  har zBuf[100];. 
1c290 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20   if( f==0 ){.   
1c2a0 20 69 66 28 20 64 66 6c 74 5a 69 70 20 26 26 20   if( dfltZip && 
1c2b0 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
1c2c0 22 25 2e 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29  "%.zip",zName,0)
1c2d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 72 65  ==0 ){.       re
1c2e0 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  turn SHELL_OPEN_
1c2f0 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d 65 6c  ZIPFILE;.    }el
1c300 73 65 7b 0a 20 20 20 20 20 20 20 72 65 74 75 72  se{.       retur
1c310 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52  n SHELL_OPEN_NOR
1c320 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MAL;.    }.  }. 
1c330 20 66 73 65 65 6b 28 66 2c 20 2d 32 35 2c 20 53   fseek(f, -25, S
1c340 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 20 3d 20  EEK_END);.  n = 
1c350 66 72 65 61 64 28 7a 42 75 66 2c 20 32 35 2c 20  fread(zBuf, 25, 
1c360 31 2c 20 66 29 3b 0a 20 20 69 66 28 20 6e 3d 3d  1, f);.  if( n==
1c370 31 20 26 26 20 6d 65 6d 63 6d 70 28 7a 42 75 66  1 && memcmp(zBuf
1c380 2c 20 22 53 74 61 72 74 2d 4f 66 2d 53 51 4c 69  , "Start-Of-SQLi
1c390 74 65 33 2d 22 2c 20 31 37 29 3d 3d 30 20 29 7b  te3-", 17)==0 ){
1c3a0 0a 20 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f  .    rc = SHELL_
1c3b0 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a  OPEN_APPENDVFS;.
1c3c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 73 65    }else{.    fse
1c3d0 65 6b 28 66 2c 20 2d 32 32 2c 20 53 45 45 4b 5f  ek(f, -22, SEEK_
1c3e0 45 4e 44 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72  END);.    n = fr
1c3f0 65 61 64 28 7a 42 75 66 2c 20 32 32 2c 20 31 2c  ead(zBuf, 22, 1,
1c400 20 66 29 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d   f);.    if( n==
1c410 31 20 26 26 20 7a 42 75 66 5b 30 5d 3d 3d 30 78  1 && zBuf[0]==0x
1c420 35 30 20 26 26 20 7a 42 75 66 5b 31 5d 3d 3d 30  50 && zBuf[1]==0
1c430 78 34 62 20 26 26 20 7a 42 75 66 5b 32 5d 3d 3d  x4b && zBuf[2]==
1c440 30 78 30 35 0a 20 20 20 20 20 20 20 26 26 20 7a  0x05.       && z
1c450 42 75 66 5b 33 5d 3d 3d 30 78 30 36 20 29 7b 0a  Buf[3]==0x06 ){.
1c460 20 20 20 20 20 20 72 63 20 3d 20 53 48 45 4c 4c        rc = SHELL
1c470 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20  _OPEN_ZIPFILE;. 
1c480 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d     }else if( n==
1c490 30 20 26 26 20 64 66 6c 74 5a 69 70 20 26 26 20  0 && dfltZip && 
1c4a0 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
1c4b0 22 25 2e 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29  "%.zip",zName,0)
1c4c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1c4d0 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50  = SHELL_OPEN_ZIP
1c4e0 46 49 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FILE;.    }.  }.
1c4f0 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 72    fclose(f);.  r
1c500 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 2f  eturn rc;  .}../
1c510 2a 20 46 6c 61 67 73 20 66 6f 72 20 6f 70 65 6e  * Flags for open
1c520 5f 64 62 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  _db()..**.** The
1c530 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f   default behavio
1c540 72 20 6f 66 20 6f 70 65 6e 5f 64 62 28 29 20 69  r of open_db() i
1c550 73 20 74 6f 20 65 78 69 74 28 31 29 20 69 66 20  s to exit(1) if 
1c560 74 68 65 20 64 61 74 61 62 61 73 65 20 66 61 69  the database fai
1c570 6c 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 2e 20 20  ls to.** open.  
1c580 54 68 65 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50  The OPEN_DB_KEEP
1c590 41 4c 49 56 45 20 66 6c 61 67 20 63 68 61 6e 67  ALIVE flag chang
1c5a0 65 73 20 74 68 61 74 20 73 6f 20 74 68 61 74 20  es that so that 
1c5b0 69 74 20 70 72 69 6e 74 73 20 61 6e 20 65 72 72  it prints an err
1c5c0 6f 72 0a 2a 2a 20 62 75 74 20 73 74 69 6c 6c 20  or.** but still 
1c5d0 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20  returns without 
1c5e0 63 61 6c 6c 69 6e 67 20 65 78 69 74 2e 0a 2a 2a  calling exit..**
1c5f0 0a 2a 2a 20 54 68 65 20 4f 50 45 4e 5f 44 42 5f  .** The OPEN_DB_
1c600 5a 49 50 46 49 4c 45 20 66 6c 61 67 20 63 61 75  ZIPFILE flag cau
1c610 73 65 73 20 6f 70 65 6e 5f 64 62 28 29 20 74 6f  ses open_db() to
1c620 20 70 72 65 66 65 72 20 74 6f 20 6f 70 65 6e 20   prefer to open 
1c630 66 69 6c 65 73 20 61 73 20 61 0a 2a 2a 20 5a 49  files as a.** ZI
1c640 50 20 61 72 63 68 69 76 65 20 69 66 20 74 68 65  P archive if the
1c650 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
1c660 78 69 73 74 20 6f 72 20 69 73 20 65 6d 70 74 79  xist or is empty
1c670 20 61 6e 64 20 69 74 73 20 6e 61 6d 65 20 6d 61   and its name ma
1c680 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 2a 2e 7a  tches.** the *.z
1c690 69 70 20 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a 23  ip pattern..*/.#
1c6a0 64 65 66 69 6e 65 20 4f 50 45 4e 5f 44 42 5f 4b  define OPEN_DB_K
1c6b0 45 45 50 41 4c 49 56 45 20 20 20 30 78 30 30 31  EEPALIVE   0x001
1c6c0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 66 74     /* Return aft
1c6d0 65 72 20 65 72 72 6f 72 20 69 66 20 74 72 75 65  er error if true
1c6e0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e   */.#define OPEN
1c6f0 5f 44 42 5f 5a 49 50 46 49 4c 45 20 20 20 20 20  _DB_ZIPFILE     
1c700 30 78 30 30 32 20 20 20 2f 2a 20 4f 70 65 6e 20  0x002   /* Open 
1c710 61 73 20 5a 49 50 20 69 66 20 6e 61 6d 65 20 6d  as ZIP if name m
1c720 61 74 63 68 65 73 20 2a 2e 7a 69 70 20 2a 2f 0a  atches *.zip */.
1c730 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1c740 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1c750 20 6f 70 65 6e 2e 20 20 49 66 20 69 74 20 69 73   open.  If it is
1c760 20 6e 6f 74 2c 20 74 68 65 6e 20 6f 70 65 6e 20   not, then open 
1c770 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 64  it.  If.** the d
1c780 61 74 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f  atabase fails to
1c790 20 6f 70 65 6e 2c 20 70 72 69 6e 74 20 61 6e 20   open, print an 
1c7a0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e  error message an
1c7b0 64 20 65 78 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  d exit..*/.stati
1c7c0 63 20 76 6f 69 64 20 6f 70 65 6e 5f 64 62 28 53  c void open_db(S
1c7d0 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e  hellState *p, in
1c7e0 74 20 6f 70 65 6e 46 6c 61 67 73 29 7b 0a 20 20  t openFlags){.  
1c7f0 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a  if( p->db==0 ){.
1c800 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d      if( p->openM
1c810 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f  ode==SHELL_OPEN_
1c820 55 4e 53 50 45 43 20 29 7b 0a 20 20 20 20 20 20  UNSPEC ){.      
1c830 69 66 28 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61  if( p->zDbFilena
1c840 6d 65 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 62 46  me==0 || p->zDbF
1c850 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b  ilename[0]==0 ){
1c860 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e  .        p->open
1c870 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45  Mode = SHELL_OPE
1c880 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20  N_NORMAL;.      
1c890 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1c8a0 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 28 75 38  ->openMode = (u8
1c8b0 29 64 65 64 75 63 65 44 61 74 61 62 61 73 65 54  )deduceDatabaseT
1c8c0 79 70 65 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61  ype(p->zDbFilena
1c8d0 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  me, .           
1c8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8f0 20 20 28 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f    (openFlags & O
1c900 50 45 4e 5f 44 42 5f 5a 49 50 46 49 4c 45 29 21  PEN_DB_ZIPFILE)!
1c910 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  =0);.      }.   
1c920 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 70   }.    switch( p
1c930 2d 3e 6f 70 65 6e 4d 6f 64 65 20 29 7b 0a 20 20  ->openMode ){.  
1c940 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f      case SHELL_O
1c950 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3a 20 7b  PEN_APPENDVFS: {
1c960 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c970 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a 44 62 46  _open_v2(p->zDbF
1c980 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 2c  ilename, &p->db,
1c990 20 0a 20 20 20 20 20 20 20 20 20 20 20 53 51 4c   .           SQL
1c9a0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1c9b0 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
1c9c0 52 45 41 54 45 2c 20 22 61 70 6e 64 76 66 73 22  REATE, "apndvfs"
1c9d0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1c9e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c9f0 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  case SHELL_OPEN_
1ca00 5a 49 50 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  ZIPFILE: {.     
1ca10 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28     sqlite3_open(
1ca20 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 26 70 2d 3e  ":memory:", &p->
1ca30 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  db);.        bre
1ca40 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1ca50 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45    case SHELL_OPE
1ca60 4e 5f 52 45 41 44 4f 4e 4c 59 3a 20 7b 0a 20 20  N_READONLY: {.  
1ca70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70        sqlite3_op
1ca80 65 6e 5f 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65  en_v2(p->zDbFile
1ca90 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 2c 20 53 51  name, &p->db, SQ
1caa0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1cab0 4c 59 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  LY, 0);.        
1cac0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1cad0 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f       case SHELL_
1cae0 4f 50 45 4e 5f 55 4e 53 50 45 43 3a 0a 20 20 20  OPEN_UNSPEC:.   
1caf0 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50     case SHELL_OP
1cb00 45 4e 5f 4e 4f 52 4d 41 4c 3a 20 7b 0a 20 20 20  EN_NORMAL: {.   
1cb10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65       sqlite3_ope
1cb20 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  n(p->zDbFilename
1cb30 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  , &p->db);.     
1cb40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1cb50 7d 0a 20 20 20 20 7d 0a 20 20 20 20 67 6c 6f 62  }.    }.    glob
1cb60 61 6c 44 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  alDb = p->db;.  
1cb70 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 7c    if( p->db==0 |
1cb80 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  | SQLITE_OK!=sql
1cb90 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e  ite3_errcode(p->
1cba0 64 62 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66  db) ){.      utf
1cbb0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1cbc0 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c 65 20 74  "Error: unable t
1cbd0 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
1cbe0 5c 22 25 73 5c 22 3a 20 25 73 5c 6e 22 2c 0a 20  \"%s\": %s\n",. 
1cbf0 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 46           p->zDbF
1cc00 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  ilename, sqlite3
1cc10 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
1cc20 0a 20 20 20 20 20 20 69 66 28 20 6f 70 65 6e 46  .      if( openF
1cc30 6c 61 67 73 20 26 20 4f 50 45 4e 5f 44 42 5f 4b  lags & OPEN_DB_K
1cc40 45 45 50 41 4c 49 56 45 20 29 20 72 65 74 75 72  EEPALIVE ) retur
1cc50 6e 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29  n;.      exit(1)
1cc60 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1cc70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
1cc80 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 73  _EXTENSION.    s
1cc90 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f  qlite3_enable_lo
1cca0 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e  ad_extension(p->
1ccb0 64 62 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20  db, 1);.#endif. 
1ccc0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69     sqlite3_filei
1ccd0 6f 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c  o_init(p->db, 0,
1cce0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1ccf0 5f 73 68 61 74 68 72 65 65 5f 69 6e 69 74 28 70  _shathree_init(p
1cd00 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
1cd10 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
1cd20 69 6f 6e 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  ion_init(p->db, 
1cd30 30 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51  0, 0);.#ifdef SQ
1cd40 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 20  LITE_HAVE_ZLIB. 
1cd50 20 20 20 73 71 6c 69 74 65 33 5f 7a 69 70 66 69     sqlite3_zipfi
1cd60 6c 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30  le_init(p->db, 0
1cd70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1cd80 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 70 2d 3e  3_sqlar_init(p->
1cd90 64 62 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69  db, 0, 0);.#endi
1cda0 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  f.    sqlite3_cr
1cdb0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d  eate_function(p-
1cdc0 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 61 64 64 5f  >db, "shell_add_
1cdd0 73 63 68 65 6d 61 22 2c 20 33 2c 20 53 51 4c 49  schema", 3, SQLI
1cde0 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce00 20 20 20 20 20 20 20 20 73 68 65 6c 6c 41 64 64          shellAdd
1ce10 53 63 68 65 6d 61 4e 61 6d 65 2c 20 30 2c 20 30  SchemaName, 0, 0
1ce20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1ce30 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
1ce40 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 6d 6f 64  ->db, "shell_mod
1ce50 75 6c 65 5f 73 63 68 65 6d 61 22 2c 20 31 2c 20  ule_schema", 1, 
1ce60 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_UTF8, 0,.
1ce70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c              shel
1ce90 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 2c 20 30  lModuleSchema, 0
1cea0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1ceb0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1cec0 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f  n(p->db, "shell_
1ced0 70 75 74 73 6e 6c 22 2c 20 31 2c 20 53 51 4c 49  putsnl", 1, SQLI
1cee0 54 45 5f 55 54 46 38 2c 20 70 2c 0a 20 20 20 20  TE_UTF8, p,.    
1cef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf00 20 20 20 20 20 20 20 20 73 68 65 6c 6c 50 75 74          shellPut
1cf10 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 23 69  sFunc, 0, 0);.#i
1cf20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48  fndef SQLITE_NOH
1cf30 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20 73  AVE_SYSTEM.    s
1cf40 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1cf50 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 65  nction(p->db, "e
1cf60 64 69 74 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  dit", 1, SQLITE_
1cf70 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
1cf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf90 20 20 20 20 20 65 64 69 74 46 75 6e 63 2c 20 30       editFunc, 0
1cfa0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1cfb0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1cfc0 6e 28 70 2d 3e 64 62 2c 20 22 65 64 69 74 22 2c  n(p->db, "edit",
1cfd0 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   2, SQLITE_UTF8,
1cfe0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d000 65 64 69 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b  editFunc, 0, 0);
1d010 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1d020 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45  p->openMode==SHE
1d030 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 20  LL_OPEN_ZIPFILE 
1d040 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
1d050 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
1d060 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
1d070 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20  "CREATE VIRTUAL 
1d080 54 41 42 4c 45 20 7a 69 70 20 55 53 49 4e 47 20  TABLE zip USING 
1d090 7a 69 70 66 69 6c 65 28 25 51 29 3b 22 2c 20 70  zipfile(%Q);", p
1d0a0 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a  ->zDbFilename);.
1d0b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
1d0c0 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  ec(p->db, zSql, 
1d0d0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
1d0e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
1d0f0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
1d100 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
1d110 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 61 74 61  o close the data
1d120 62 61 65 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  baes connection.
1d130 20 20 52 65 70 6f 72 74 20 65 72 72 6f 72 73 2e    Report errors.
1d140 0a 2a 2f 0a 76 6f 69 64 20 63 6c 6f 73 65 5f 64  .*/.void close_d
1d150 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  b(sqlite3 *db){.
1d160 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1d170 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
1d180 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74  if( rc ){.    ut
1d190 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1d1a0 2c 20 22 45 72 72 6f 72 3a 20 73 71 6c 69 74 65  , "Error: sqlite
1d1b0 33 5f 63 6c 6f 73 65 28 29 20 72 65 74 75 72 6e  3_close() return
1d1c0 73 20 25 64 3a 20 25 73 5c 6e 22 2c 0a 20 20 20  s %d: %s\n",.   
1d1d0 20 20 20 20 20 72 63 2c 20 73 71 6c 69 74 65 33       rc, sqlite3
1d1e0 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
1d1f0 7d 20 0a 7d 0a 0a 23 69 66 20 48 41 56 45 5f 52  } .}..#if HAVE_R
1d200 45 41 44 4c 49 4e 45 20 7c 7c 20 48 41 56 45 5f  EADLINE || HAVE_
1d210 45 44 49 54 4c 49 4e 45 0a 2f 2a 0a 2a 2a 20 52  EDITLINE./*.** R
1d220 65 61 64 6c 69 6e 65 20 63 6f 6d 70 6c 65 74 69  eadline completi
1d230 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2f 0a  on callbacks.*/.
1d240 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 61  static char *rea
1d250 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e  dline_completion
1d260 5f 67 65 6e 65 72 61 74 6f 72 28 63 6f 6e 73 74  _generator(const
1d270 20 63 68 61 72 20 2a 74 65 78 74 2c 20 69 6e 74   char *text, int
1d280 20 73 74 61 74 65 29 7b 0a 20 20 73 74 61 74 69   state){.  stati
1d290 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  c sqlite3_stmt *
1d2a0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
1d2b0 72 20 2a 7a 52 65 74 3b 0a 20 20 69 66 28 20 73  r *zRet;.  if( s
1d2c0 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 63  tate==0 ){.    c
1d2d0 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 73  har *zSql;.    s
1d2e0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1d2f0 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c  pStmt);.    zSql
1d300 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1d310 74 66 28 22 53 45 4c 45 43 54 20 44 49 53 54 49  tf("SELECT DISTI
1d320 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20 43 4f  NCT candidate CO
1d330 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20 20  LLATE nocase".  
1d340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d350 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d           "  FROM
1d360 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 29 20   completion(%Q) 
1d370 4f 52 44 45 52 20 42 59 20 31 22 2c 20 74 65 78  ORDER BY 1", tex
1d380 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
1d390 70 72 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61  prepare_v2(globa
1d3a0 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  lDb, zSql, -1, &
1d3b0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73  pStmt, 0);.    s
1d3c0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
1d3d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  );.  }.  if( sql
1d3e0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
1d3f0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
1d400 20 20 20 20 7a 52 65 74 20 3d 20 73 74 72 64 75      zRet = strdu
1d410 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  p((const char*)s
1d420 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1d430 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20  xt(pStmt, 0));. 
1d440 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
1d450 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
1d460 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d  mt);.    pStmt =
1d470 20 30 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20 30   0;.    zRet = 0
1d480 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
1d490 52 65 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63 68  Ret;.}.static ch
1d4a0 61 72 20 2a 2a 72 65 61 64 6c 69 6e 65 5f 63 6f  ar **readline_co
1d4b0 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20 63  mpletion(const c
1d4c0 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20  har *zText, int 
1d4d0 69 53 74 61 72 74 2c 20 69 6e 74 20 69 45 6e 64  iStart, int iEnd
1d4e0 29 7b 0a 20 20 72 6c 5f 61 74 74 65 6d 70 74 65  ){.  rl_attempte
1d4f0 64 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6f 76 65  d_completion_ove
1d500 72 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  r = 1;.  return 
1d510 72 6c 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6d 61  rl_completion_ma
1d520 74 63 68 65 73 28 7a 54 65 78 74 2c 20 72 65 61  tches(zText, rea
1d530 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e  dline_completion
1d540 5f 67 65 6e 65 72 61 74 6f 72 29 3b 0a 7d 0a 0a  _generator);.}..
1d550 23 65 6c 69 66 20 48 41 56 45 5f 4c 49 4e 45 4e  #elif HAVE_LINEN
1d560 4f 49 53 45 0a 2f 2a 0a 2a 2a 20 4c 69 6e 65 6e  OISE./*.** Linen
1d570 6f 69 73 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20  oise completion 
1d580 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74 61 74  callback.*/.stat
1d590 69 63 20 76 6f 69 64 20 6c 69 6e 65 6e 6f 69 73  ic void linenois
1d5a0 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e  e_completion(con
1d5b0 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20  st char *zLine, 
1d5c0 6c 69 6e 65 6e 6f 69 73 65 43 6f 6d 70 6c 65 74  linenoiseComplet
1d5d0 69 6f 6e 73 20 2a 6c 63 29 7b 0a 20 20 69 6e 74  ions *lc){.  int
1d5e0 20 6e 4c 69 6e 65 20 3d 20 73 74 72 6c 65 6e 33   nLine = strlen3
1d5f0 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 69 6e 74 20  0(zLine);.  int 
1d600 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 73 71 6c  i, iStart;.  sql
1d610 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1d620 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53   = 0;.  char *zS
1d630 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  ql;.  char zBuf[
1d640 31 30 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6e 4c  1000];..  if( nL
1d650 69 6e 65 3e 73 69 7a 65 6f 66 28 7a 42 75 66 29  ine>sizeof(zBuf)
1d660 2d 33 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  -30 ) return;.  
1d670 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e  if( zLine[0]=='.
1d680 27 20 7c 7c 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27  ' || zLine[0]=='
1d690 23 27 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  #') return;.  fo
1d6a0 72 28 69 3d 6e 4c 69 6e 65 2d 31 3b 20 69 3e 3d  r(i=nLine-1; i>=
1d6b0 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 7a 4c  0 && (isalnum(zL
1d6c0 69 6e 65 5b 69 5d 29 20 7c 7c 20 7a 4c 69 6e 65  ine[i]) || zLine
1d6d0 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69 2d 2d 29 7b  [i]=='_'); i--){
1d6e0 7d 0a 20 20 69 66 28 20 69 3d 3d 6e 4c 69 6e 65  }.  if( i==nLine
1d6f0 2d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  -1 ) return;.  i
1d700 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20 6d  Start = i+1;.  m
1d710 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69 6e  emcpy(zBuf, zLin
1d720 65 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 7a 53  e, iStart);.  zS
1d730 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
1d740 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49 53  intf("SELECT DIS
1d750 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20  TINCT candidate 
1d760 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a  COLLATE nocase".
1d770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d780 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d           "  FROM
1d790 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 2c 25   completion(%Q,%
1d7a0 51 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c 0a  Q) ORDER BY 1",.
1d7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7c0 20 20 20 20 20 20 20 20 20 26 7a 4c 69 6e 65 5b           &zLine[
1d7d0 69 53 74 61 72 74 5d 2c 20 7a 4c 69 6e 65 29 3b  iStart], zLine);
1d7e0 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  .  sqlite3_prepa
1d7f0 72 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20  re_v2(globalDb, 
1d800 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
1d810 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
1d820 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 71  free(zSql);.  sq
1d830 6c 69 74 65 33 5f 65 78 65 63 28 67 6c 6f 62 61  lite3_exec(globa
1d840 6c 44 62 2c 20 22 50 52 41 47 4d 41 20 70 61 67  lDb, "PRAGMA pag
1d850 65 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 30 2c 20  e_count", 0, 0, 
1d860 30 29 3b 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20  0); /* Load the 
1d870 73 63 68 65 6d 61 20 2a 2f 0a 20 20 77 68 69 6c  schema */.  whil
1d880 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
1d890 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
1d8a0 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OW ){.    const 
1d8b0 63 68 61 72 20 2a 7a 43 6f 6d 70 6c 65 74 69 6f  char *zCompletio
1d8c0 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  n = (const char*
1d8d0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
1d8e0 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  text(pStmt, 0);.
1d8f0 20 20 20 20 69 6e 74 20 6e 43 6f 6d 70 6c 65 74      int nComplet
1d900 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ion = sqlite3_co
1d910 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
1d920 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 53  , 0);.    if( iS
1d930 74 61 72 74 2b 6e 43 6f 6d 70 6c 65 74 69 6f 6e  tart+nCompletion
1d940 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d   < sizeof(zBuf)-
1d950 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
1d960 79 28 7a 42 75 66 2b 69 53 74 61 72 74 2c 20 7a  y(zBuf+iStart, z
1d970 43 6f 6d 70 6c 65 74 69 6f 6e 2c 20 6e 43 6f 6d  Completion, nCom
1d980 70 6c 65 74 69 6f 6e 2b 31 29 3b 0a 20 20 20 20  pletion+1);.    
1d990 20 20 6c 69 6e 65 6e 6f 69 73 65 41 64 64 43 6f    linenoiseAddCo
1d9a0 6d 70 6c 65 74 69 6f 6e 28 6c 63 2c 20 7a 42 75  mpletion(lc, zBu
1d9b0 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  f);.    }.  }.  
1d9c0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1d9d0 28 70 53 74 6d 74 29 3b 0a 7d 0a 23 65 6e 64 69  (pStmt);.}.#endi
1d9e0 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d 6c 61  f../*.** Do C-la
1d9f0 6e 67 75 61 67 65 20 73 74 79 6c 65 20 64 65 71  nguage style deq
1da00 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  uoting..**.**   
1da10 20 5c 61 20 20 20 20 2d 3e 20 61 6c 61 72 6d 0a   \a    -> alarm.
1da20 2a 2a 20 20 20 20 5c 62 20 20 20 20 2d 3e 20 62  **    \b    -> b
1da30 61 63 6b 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c  ackspace.**    \
1da40 74 20 20 20 20 2d 3e 20 74 61 62 0a 2a 2a 20 20  t    -> tab.**  
1da50 20 20 5c 6e 20 20 20 20 2d 3e 20 6e 65 77 6c 69    \n    -> newli
1da60 6e 65 0a 2a 2a 20 20 20 20 5c 76 20 20 20 20 2d  ne.**    \v    -
1da70 3e 20 76 65 72 74 69 63 61 6c 20 74 61 62 0a 2a  > vertical tab.*
1da80 2a 20 20 20 20 5c 66 20 20 20 20 2d 3e 20 66 6f  *    \f    -> fo
1da90 72 6d 20 66 65 65 64 0a 2a 2a 20 20 20 20 5c 72  rm feed.**    \r
1daa0 20 20 20 20 2d 3e 20 63 61 72 72 69 61 67 65 20      -> carriage 
1dab0 72 65 74 75 72 6e 0a 2a 2a 20 20 20 20 5c 73 20  return.**    \s 
1dac0 20 20 20 2d 3e 20 73 70 61 63 65 0a 2a 2a 20 20     -> space.**  
1dad0 20 20 5c 22 20 20 20 20 2d 3e 20 22 0a 2a 2a 20    \"    -> ".** 
1dae0 20 20 20 5c 27 20 20 20 20 2d 3e 20 27 0a 2a 2a     \'    -> '.**
1daf0 20 20 20 20 5c 5c 20 20 20 20 2d 3e 20 62 61 63      \\    -> bac
1db00 6b 73 6c 61 73 68 0a 2a 2a 20 20 20 20 5c 4e 4e  kslash.**    \NN
1db10 4e 20 20 2d 3e 20 61 73 63 69 69 20 63 68 61 72  N  -> ascii char
1db20 61 63 74 65 72 20 4e 4e 4e 20 69 6e 20 6f 63 74  acter NNN in oct
1db30 61 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  al.*/.static voi
1db40 64 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c  d resolve_backsl
1db50 61 73 68 65 73 28 63 68 61 72 20 2a 7a 29 7b 0a  ashes(char *z){.
1db60 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68    int i, j;.  ch
1db70 61 72 20 63 3b 0a 20 20 77 68 69 6c 65 28 20 2a  ar c;.  while( *
1db80 7a 20 26 26 20 2a 7a 21 3d 27 5c 5c 27 20 29 20  z && *z!='\\' ) 
1db90 7a 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  z++;.  for(i=j=0
1dba0 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b  ; (c = z[i])!=0;
1dbb0 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
1dbc0 69 66 28 20 63 3d 3d 27 5c 5c 27 20 26 26 20 7a  if( c=='\\' && z
1dbd0 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20  [i+1]!=0 ){.    
1dbe0 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20    c = z[++i];.  
1dbf0 20 20 20 20 69 66 28 20 63 3d 3d 27 61 27 20 29      if( c=='a' )
1dc00 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
1dc10 61 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  a';.      }else 
1dc20 69 66 28 20 63 3d 3d 27 62 27 20 29 7b 0a 20 20  if( c=='b' ){.  
1dc30 20 20 20 20 20 20 63 20 3d 20 27 5c 62 27 3b 0a        c = '\b';.
1dc40 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1dc50 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20  c=='t' ){.      
1dc60 20 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20 20 20    c = '\t';.    
1dc70 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
1dc80 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  n' ){.        c 
1dc90 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 7d 65  = '\n';.      }e
1dca0 6c 73 65 20 69 66 28 20 63 3d 3d 27 76 27 20 29  lse if( c=='v' )
1dcb0 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
1dcc0 76 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  v';.      }else 
1dcd0 69 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20 20  if( c=='f' ){.  
1dce0 20 20 20 20 20 20 63 20 3d 20 27 5c 66 27 3b 0a        c = '\f';.
1dcf0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1dd00 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20 20  c=='r' ){.      
1dd10 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20 20    c = '\r';.    
1dd20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
1dd30 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  "' ){.        c 
1dd40 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 7d 65 6c  = '"';.      }el
1dd50 73 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29  se if( c=='\'' )
1dd60 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
1dd70 27 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  '';.      }else 
1dd80 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20  if( c=='\\' ){. 
1dd90 20 20 20 20 20 20 20 63 20 3d 20 27 5c 5c 27 3b         c = '\\';
1dda0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1ddb0 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 37   c>='0' && c<='7
1ddc0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 2d  ' ){.        c -
1ddd0 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69  = '0';.        i
1dde0 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26  f( z[i+1]>='0' &
1ddf0 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b  & z[i+1]<='7' ){
1de00 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  .          i++;.
1de10 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 28 63            c = (c
1de20 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30  <<3) + z[i] - '0
1de30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ';.          if(
1de40 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20   z[i+1]>='0' && 
1de50 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20  z[i+1]<='7' ){. 
1de60 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a             i++;.
1de70 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20              c = 
1de80 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20  (c<<3) + z[i] - 
1de90 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  '0';.          }
1dea0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1deb0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
1dec0 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28  ] = c;.  }.  if(
1ded0 20 6a 3c 69 20 29 20 7a 5b 6a 5d 20 3d 20 30 3b   j<i ) z[j] = 0;
1dee0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70  .}../*.** Interp
1def0 72 65 74 20 7a 41 72 67 20 61 73 20 65 69 74 68  ret zArg as eith
1df00 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72  er an integer or
1df10 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
1df20 2e 20 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30  .  Return 1 or 0
1df30 0a 2a 2a 20 66 6f 72 20 54 52 55 45 20 61 6e 64  .** for TRUE and
1df40 20 46 41 4c 53 45 2e 20 20 52 65 74 75 72 6e 20   FALSE.  Return 
1df50 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
1df60 65 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65  e if appropriate
1df70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1df80 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 63 6f 6e  booleanValue(con
1df90 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a  st char *zArg){.
1dfa0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a    int i;.  if( z
1dfb0 41 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a  Arg[0]=='0' && z
1dfc0 41 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20  Arg[1]=='x' ){. 
1dfd0 20 20 20 66 6f 72 28 69 3d 32 3b 20 68 65 78 44     for(i=2; hexD
1dfe0 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67 5b 69  igitValue(zArg[i
1dff0 5d 29 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ])>=0; i++){}.  
1e000 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
1e010 3d 30 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27 30 27  =0; zArg[i]>='0'
1e020 20 26 26 20 7a 41 72 67 5b 69 5d 3c 3d 27 39 27   && zArg[i]<='9'
1e030 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 0a 20 20 69  ; i++){}.  }.  i
1e040 66 28 20 69 3e 30 20 26 26 20 7a 41 72 67 5b 69  f( i>0 && zArg[i
1e050 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28 69  ]==0 ) return (i
1e060 6e 74 29 28 69 6e 74 65 67 65 72 56 61 6c 75 65  nt)(integerValue
1e070 28 7a 41 72 67 29 20 26 20 30 78 66 66 66 66 66  (zArg) & 0xfffff
1e080 66 66 66 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  fff);.  if( sqli
1e090 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67  te3_stricmp(zArg
1e0a0 2c 20 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20 73 71  , "on")==0 || sq
1e0b0 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41  lite3_stricmp(zA
1e0c0 72 67 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a  rg,"yes")==0 ){.
1e0d0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e0e0 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  }.  if( sqlite3_
1e0f0 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f  stricmp(zArg, "o
1e100 66 66 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ff")==0 || sqlit
1e110 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c  e3_stricmp(zArg,
1e120 22 6e 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  "no")==0 ){.    
1e130 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1e140 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1e150 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 74 20  rr, "ERROR: Not 
1e160 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a  a boolean value:
1e170 20 5c 22 25 73 5c 22 2e 20 41 73 73 75 6d 69 6e   \"%s\". Assumin
1e180 67 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20 20  g \"no\".\n",.  
1e190 20 20 20 20 20 20 20 20 7a 41 72 67 29 3b 0a 20          zArg);. 
1e1a0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1e1b0 0a 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72  .** Set or clear
1e1c0 20 61 20 73 68 65 6c 6c 20 66 6c 61 67 20 61 63   a shell flag ac
1e1d0 63 6f 72 64 69 6e 67 20 74 6f 20 61 20 62 6f 6f  cording to a boo
1e1e0 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  lean value..*/.s
1e1f0 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4f 72  tatic void setOr
1e200 43 6c 65 61 72 46 6c 61 67 28 53 68 65 6c 6c 53  ClearFlag(ShellS
1e210 74 61 74 65 20 2a 70 2c 20 75 6e 73 69 67 6e 65  tate *p, unsigne
1e220 64 20 6d 46 6c 61 67 2c 20 63 6f 6e 73 74 20 63  d mFlag, const c
1e230 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 66  har *zArg){.  if
1e240 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 7a  ( booleanValue(z
1e250 41 72 67 29 20 29 7b 0a 20 20 20 20 53 68 65 6c  Arg) ){.    Shel
1e260 6c 53 65 74 46 6c 61 67 28 70 2c 20 6d 46 6c 61  lSetFlag(p, mFla
1e270 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  g);.  }else{.   
1e280 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28   ShellClearFlag(
1e290 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 0a 7d  p, mFlag);.  }.}
1e2a0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
1e2b0 20 6f 75 74 70 75 74 20 66 69 6c 65 2c 20 61 73   output file, as
1e2c0 73 75 6d 69 6e 67 20 69 74 20 69 73 20 6e 6f 74  suming it is not
1e2d0 20 73 74 64 65 72 72 20 6f 72 20 73 74 64 6f 75   stderr or stdou
1e2e0 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
1e2f0 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f   output_file_clo
1e300 73 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 69  se(FILE *f){.  i
1e310 66 28 20 66 20 26 26 20 66 21 3d 73 74 64 6f 75  f( f && f!=stdou
1e320 74 20 26 26 20 66 21 3d 73 74 64 65 72 72 20 29  t && f!=stderr )
1e330 20 66 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a 2f   fclose(f);.}../
1e340 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 70 65 6e  *.** Try to open
1e350 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2e   an output file.
1e360 20 20 20 54 68 65 20 6e 61 6d 65 73 20 22 73 74     The names "st
1e370 64 6f 75 74 22 20 61 6e 64 20 22 73 74 64 65 72  dout" and "stder
1e380 72 22 20 61 72 65 0a 2a 2a 20 72 65 63 6f 67 6e  r" are.** recogn
1e390 69 7a 65 64 20 61 6e 64 20 64 6f 20 74 68 65 20  ized and do the 
1e3a0 72 69 67 68 74 20 74 68 69 6e 67 2e 20 20 4e 55  right thing.  NU
1e3b0 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  LL is returned i
1e3c0 66 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  f the output.** 
1e3d0 66 69 6c 65 6e 61 6d 65 20 69 73 20 22 6f 66 66  filename is "off
1e3e0 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 49 4c  "..*/.static FIL
1e3f0 45 20 2a 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f  E *output_file_o
1e400 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
1e410 7a 46 69 6c 65 2c 20 69 6e 74 20 62 54 65 78 74  zFile, int bText
1e420 4d 6f 64 65 29 7b 0a 20 20 46 49 4c 45 20 2a 66  Mode){.  FILE *f
1e430 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a  ;.  if( strcmp(z
1e440 46 69 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d 3d  File,"stdout")==
1e450 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64  0 ){.    f = std
1e460 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  out;.  }else if(
1e470 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22   strcmp(zFile, "
1e480 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20  stderr")==0 ){. 
1e490 20 20 20 66 20 3d 20 73 74 64 65 72 72 3b 0a 20     f = stderr;. 
1e4a0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1e4b0 70 28 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29 3d  p(zFile, "off")=
1e4c0 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 30 3b  =0 ){.    f = 0;
1e4d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 20  .  }else{.    f 
1e4e0 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 62  = fopen(zFile, b
1e4f0 54 65 78 74 4d 6f 64 65 20 3f 20 22 77 22 20 3a  TextMode ? "w" :
1e500 20 22 77 62 22 29 3b 0a 20 20 20 20 69 66 28 20   "wb");.    if( 
1e510 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74  f==0 ){.      ut
1e520 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1e530 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  , "Error: cannot
1e540 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c   open \"%s\"\n",
1e550 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20   zFile);.    }. 
1e560 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 3b 0a 7d   }.  return f;.}
1e570 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
1e580 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
1e590 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
1e5a0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1e5b0 4e 47 5f 50 4f 49 4e 54 29 0a 2f 2a 0a 2a 2a 20  NG_POINT)./*.** 
1e5c0 41 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 68 61  A routine for ha
1e5d0 6e 64 6c 69 6e 67 20 6f 75 74 70 75 74 20 66 72  ndling output fr
1e5e0 6f 6d 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65  om sqlite3_trace
1e5f0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1e600 74 20 73 71 6c 5f 74 72 61 63 65 5f 63 61 6c 6c  t sql_trace_call
1e610 62 61 63 6b 28 0a 20 20 75 6e 73 69 67 6e 65 64  back(.  unsigned
1e620 20 6d 54 79 70 65 2c 0a 20 20 76 6f 69 64 20 2a   mType,.  void *
1e630 70 41 72 67 2c 0a 20 20 76 6f 69 64 20 2a 70 50  pArg,.  void *pP
1e640 2c 0a 20 20 76 6f 69 64 20 2a 70 58 0a 29 7b 0a  ,.  void *pX.){.
1e650 20 20 46 49 4c 45 20 2a 66 20 3d 20 28 46 49 4c    FILE *f = (FIL
1e660 45 2a 29 70 41 72 67 3b 0a 20 20 55 4e 55 53 45  E*)pArg;.  UNUSE
1e670 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 54 79 70  D_PARAMETER(mTyp
1e680 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
1e690 41 4d 45 54 45 52 28 70 50 29 3b 0a 20 20 69 66  AMETER(pP);.  if
1e6a0 28 20 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ( f ){.    const
1e6b0 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
1e6c0 74 20 63 68 61 72 2a 29 70 58 3b 0a 20 20 20 20  t char*)pX;.    
1e6d0 69 6e 74 20 69 20 3d 20 73 74 72 6c 65 6e 33 30  int i = strlen30
1e6e0 28 7a 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  (z);.    while( 
1e6f0 69 3e 30 20 26 26 20 7a 5b 69 2d 31 5d 3d 3d 27  i>0 && z[i-1]=='
1e700 3b 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ;' ){ i--; }.   
1e710 20 75 74 66 38 5f 70 72 69 6e 74 66 28 66 2c 20   utf8_printf(f, 
1e720 22 25 2e 2a 73 3b 5c 6e 22 2c 20 69 2c 20 7a 29  "%.*s;\n", i, z)
1e730 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1e740 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1e750 2a 20 41 20 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e  * A no-op routin
1e760 65 20 74 68 61 74 20 72 75 6e 73 20 77 69 74 68  e that runs with
1e770 20 74 68 65 20 22 2e 62 72 65 61 6b 70 6f 69 6e   the ".breakpoin
1e780 74 22 20 64 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20  t" doc-command. 
1e790 20 54 68 69 73 20 69 73 0a 2a 2a 20 61 20 75 73   This is.** a us
1e7a0 65 66 75 6c 20 73 70 6f 74 20 74 6f 20 73 65 74  eful spot to set
1e7b0 20 61 20 64 65 62 75 67 67 65 72 20 62 72 65 61   a debugger brea
1e7c0 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  kpoint..*/.stati
1e7d0 63 20 76 6f 69 64 20 74 65 73 74 5f 62 72 65 61  c void test_brea
1e7e0 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20  kpoint(void){.  
1e7f0 73 74 61 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c  static int nCall
1e800 20 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b   = 0;.  nCall++;
1e810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a  .}../*.** An obj
1e820 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 61 64  ect used to read
1e830 20 61 20 43 53 56 20 61 6e 64 20 6f 74 68 65 72   a CSV and other
1e840 20 66 69 6c 65 73 20 66 6f 72 20 69 6d 70 6f 72   files for impor
1e850 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
1e860 72 75 63 74 20 49 6d 70 6f 72 74 43 74 78 20 49  ruct ImportCtx I
1e870 6d 70 6f 72 74 43 74 78 3b 0a 73 74 72 75 63 74  mportCtx;.struct
1e880 20 49 6d 70 6f 72 74 43 74 78 20 7b 0a 20 20 63   ImportCtx {.  c
1e890 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1e8a0 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
1e8b0 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
1e8c0 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20    FILE *in;     
1e8d0 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
1e8e0 65 20 43 53 56 20 74 65 78 74 20 66 72 6f 6d 20  e CSV text from 
1e8f0 74 68 69 73 20 69 6e 70 75 74 20 73 74 72 65 61  this input strea
1e900 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  m */.  char *z; 
1e910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63             /* Ac
1e920 63 75 6d 75 6c 61 74 65 64 20 74 65 78 74 20 66  cumulated text f
1e930 6f 72 20 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20  or a field */.  
1e940 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
1e950 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e960 20 62 79 74 65 73 20 69 6e 20 7a 20 2a 2f 0a 20   bytes in z */. 
1e970 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20   int nAlloc;    
1e980 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c       /* Space al
1e990 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20  located for z[] 
1e9a0 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20  */.  int nLine; 
1e9b0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1e9c0 65 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ent line number 
1e9d0 2a 2f 0a 20 20 69 6e 74 20 62 4e 6f 74 46 69 72  */.  int bNotFir
1e9e0 73 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  st;      /* True
1e9f0 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
1ea00 62 79 74 65 73 20 61 6c 72 65 61 64 79 20 72 65  bytes already re
1ea10 61 64 20 2a 2f 0a 20 20 69 6e 74 20 63 54 65 72  ad */.  int cTer
1ea20 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  m;          /* C
1ea30 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65  haracter that te
1ea40 72 6d 69 6e 61 74 65 64 20 74 68 65 20 6d 6f 73  rminated the mos
1ea50 74 20 72 65 63 65 6e 74 20 66 69 65 6c 64 20 2a  t recent field *
1ea60 2f 0a 20 20 69 6e 74 20 63 43 6f 6c 53 65 70 3b  /.  int cColSep;
1ea70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1ea80 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20  olumn separator 
1ea90 63 68 61 72 61 63 74 65 72 2e 20 20 28 55 73 75  character.  (Usu
1eaa0 61 6c 6c 79 20 22 2c 22 29 20 2a 2f 0a 20 20 69  ally ",") */.  i
1eab0 6e 74 20 63 52 6f 77 53 65 70 3b 20 20 20 20 20  nt cRowSep;     
1eac0 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 20 73 65     /* The row se
1ead0 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
1eae0 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 5c 6e  r.  (Usually "\n
1eaf0 22 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70  ") */.};../* App
1eb00 65 6e 64 20 61 20 73 69 6e 67 6c 65 20 62 79 74  end a single byt
1eb10 65 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74  e to z[] */.stat
1eb20 69 63 20 76 6f 69 64 20 69 6d 70 6f 72 74 5f 61  ic void import_a
1eb30 70 70 65 6e 64 5f 63 68 61 72 28 49 6d 70 6f 72  ppend_char(Impor
1eb40 74 43 74 78 20 2a 70 2c 20 69 6e 74 20 63 29 7b  tCtx *p, int c){
1eb50 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70  .  if( p->n+1>=p
1eb60 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
1eb70 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e  p->nAlloc += p->
1eb80 6e 41 6c 6c 6f 63 20 2b 20 31 30 30 3b 0a 20 20  nAlloc + 100;.  
1eb90 20 20 70 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33    p->z = sqlite3
1eba0 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c  _realloc64(p->z,
1ebb0 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
1ebc0 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73   if( p->z==0 ) s
1ebd0 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
1ebe0 72 79 28 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a  ry();.  }.  p->z
1ebf0 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61 72  [p->n++] = (char
1ec00 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61  )c;.}../* Read a
1ec10 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66   single field of
1ec20 20 43 53 56 20 74 65 78 74 2e 20 20 43 6f 6d 70   CSV text.  Comp
1ec30 61 74 69 62 6c 65 20 77 69 74 68 20 72 66 63 34  atible with rfc4
1ec40 31 38 30 20 61 6e 64 20 65 78 74 65 6e 64 65 64  180 and extended
1ec50 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 70 74  .** with the opt
1ec60 69 6f 6e 20 6f 66 20 68 61 76 69 6e 67 20 61 20  ion of having a 
1ec70 73 65 70 61 72 61 74 6f 72 20 6f 74 68 65 72 20  separator other 
1ec80 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20  than ","..**.** 
1ec90 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65 73    +  Input comes
1eca0 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20   from p->in..** 
1ecb0 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75 6c    +  Store resul
1ecc0 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65  ts in p->z of le
1ecd0 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63  ngth p->n.  Spac
1ece0 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63  e to hold p->z c
1ecf0 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f  omes.**      fro
1ed00 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
1ed10 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73  64()..**   +  Us
1ed20 65 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68 65  e p->cSep as the
1ed30 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
1ed40 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  r.  The default 
1ed50 69 73 20 22 2c 22 2e 0a 2a 2a 20 20 20 2b 20 20  is ","..**   +  
1ed60 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74  Use p->rSep as t
1ed70 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  he row separator
1ed80 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
1ed90 73 20 22 5c 6e 22 2e 0a 2a 2a 20 20 20 2b 20 20  s "\n"..**   +  
1eda0 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
1edb0 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e  e line number in
1edc0 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20   p->nLine..**   
1edd0 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61  +  Store the cha
1ede0 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d  racter that term
1edf0 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64  inates the field
1ee00 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53   in p->cTerm.  S
1ee10 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46  tore.**      EOF
1ee20 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e   on end-of-file.
1ee30 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20  .**   +  Report 
1ee40 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e  syntax errors on
1ee50 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69   stderr.*/.stati
1ee60 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43  c char *SQLITE_C
1ee70 44 45 43 4c 20 63 73 76 5f 72 65 61 64 5f 6f 6e  DECL csv_read_on
1ee80 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43 74  e_field(ImportCt
1ee90 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a  x *p){.  int c;.
1eea0 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e    int cSep = p->
1eeb0 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72  cColSep;.  int r
1eec0 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70  Sep = p->cRowSep
1eed0 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20  ;.  p->n = 0;.  
1eee0 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
1eef0 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c  ;.  if( c==EOF |
1ef00 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20  | seenInterrupt 
1ef10 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20  ){.    p->cTerm 
1ef20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 72  = EOF;.    retur
1ef30 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  n 0;.  }.  if( c
1ef40 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 69 6e 74  =='"' ){.    int
1ef50 20 70 63 2c 20 70 70 63 3b 0a 20 20 20 20 69 6e   pc, ppc;.    in
1ef60 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 70 2d  t startLine = p-
1ef70 3e 6e 4c 69 6e 65 3b 0a 20 20 20 20 69 6e 74 20  >nLine;.    int 
1ef80 63 51 75 6f 74 65 20 3d 20 63 3b 0a 20 20 20 20  cQuote = c;.    
1ef90 70 63 20 3d 20 70 70 63 20 3d 20 30 3b 0a 20 20  pc = ppc = 0;.  
1efa0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
1efb0 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d      c = fgetc(p-
1efc0 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >in);.      if( 
1efd0 63 3d 3d 72 53 65 70 20 29 20 70 2d 3e 6e 4c 69  c==rSep ) p->nLi
1efe0 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ne++;.      if( 
1eff0 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20 20  c==cQuote ){.   
1f000 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51 75       if( pc==cQu
1f010 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ote ){.         
1f020 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   pc = 0;.       
1f030 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1f040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1f050 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63 53 65       if( (c==cSe
1f060 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29  p && pc==cQuote)
1f070 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72  .       || (c==r
1f080 53 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74  Sep && pc==cQuot
1f090 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d  e).       || (c=
1f0a0 3d 72 53 65 70 20 26 26 20 70 63 3d 3d 27 5c 72  =rSep && pc=='\r
1f0b0 27 20 26 26 20 70 70 63 3d 3d 63 51 75 6f 74 65  ' && ppc==cQuote
1f0c0 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d  ).       || (c==
1f0d0 45 4f 46 20 26 26 20 70 63 3d 3d 63 51 75 6f 74  EOF && pc==cQuot
1f0e0 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  e).      ){.    
1f0f0 20 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20      do{ p->n--; 
1f100 7d 77 68 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e  }while( p->z[p->
1f110 6e 5d 21 3d 63 51 75 6f 74 65 20 29 3b 0a 20 20  n]!=cQuote );.  
1f120 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d        p->cTerm =
1f130 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   c;.        brea
1f140 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1f150 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20   if( pc==cQuote 
1f160 26 26 20 63 21 3d 27 5c 72 27 20 29 7b 0a 20 20  && c!='\r' ){.  
1f170 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
1f180 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64  f(stderr, "%s:%d
1f190 3a 20 75 6e 65 73 63 61 70 65 64 20 25 63 20 63  : unescaped %c c
1f1a0 68 61 72 61 63 74 65 72 5c 6e 22 2c 0a 20 20 20  haracter\n",.   
1f1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
1f1c0 7a 46 69 6c 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c  zFile, p->nLine,
1f1d0 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20   cQuote);.      
1f1e0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 45  }.      if( c==E
1f1f0 4f 46 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  OF ){.        ut
1f200 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1f210 2c 20 22 25 73 3a 25 64 3a 20 75 6e 74 65 72 6d  , "%s:%d: unterm
1f220 69 6e 61 74 65 64 20 25 63 2d 71 75 6f 74 65 64  inated %c-quoted
1f230 20 66 69 65 6c 64 5c 6e 22 2c 0a 20 20 20 20 20   field\n",.     
1f240 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46             p->zF
1f250 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20  ile, startLine, 
1f260 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 20  cQuote);.       
1f270 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20   p->cTerm = c;. 
1f280 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1f290 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6d 70 6f      }.      impo
1f2a0 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70  rt_append_char(p
1f2b0 2c 20 63 29 3b 0a 20 20 20 20 20 20 70 70 63 20  , c);.      ppc 
1f2c0 3d 20 70 63 3b 0a 20 20 20 20 20 20 70 63 20 3d  = pc;.      pc =
1f2d0 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   c;.    }.  }els
1f2e0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  e{.    /* If thi
1f2f0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66  s is the first f
1f300 69 65 6c 64 20 62 65 69 6e 67 20 70 61 72 73 65  ield being parse
1f310 64 20 61 6e 64 20 69 74 20 62 65 67 69 6e 73 20  d and it begins 
1f320 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20  with the.    ** 
1f330 55 54 46 2d 38 20 42 4f 4d 20 20 28 30 78 45 46  UTF-8 BOM  (0xEF
1f340 20 42 42 20 42 46 29 20 74 68 65 6e 20 73 6b 69   BB BF) then ski
1f350 70 20 74 68 65 20 42 4f 4d 20 2a 2f 0a 20 20 20  p the BOM */.   
1f360 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30   if( (c&0xff)==0
1f370 78 65 66 20 26 26 20 70 2d 3e 62 4e 6f 74 46 69  xef && p->bNotFi
1f380 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rst==0 ){.      
1f390 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68  import_append_ch
1f3a0 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20  ar(p, c);.      
1f3b0 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
1f3c0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63 26 30  ;.      if( (c&0
1f3d0 78 66 66 29 3d 3d 30 78 62 62 20 29 7b 0a 20 20  xff)==0xbb ){.  
1f3e0 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70        import_app
1f3f0 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a  end_char(p, c);.
1f400 20 20 20 20 20 20 20 20 63 20 3d 20 66 67 65 74          c = fget
1f410 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20  c(p->in);.      
1f420 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d    if( (c&0xff)==
1f430 30 78 62 66 20 29 7b 0a 20 20 20 20 20 20 20 20  0xbf ){.        
1f440 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d    p->bNotFirst =
1f450 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   1;.          p-
1f460 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  >n = 0;.        
1f470 20 20 72 65 74 75 72 6e 20 63 73 76 5f 72 65 61    return csv_rea
1f480 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 70 29 3b 0a  d_one_field(p);.
1f490 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f4a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  }.    }.    whil
1f4b0 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d  e( c!=EOF && c!=
1f4c0 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70 20  cSep && c!=rSep 
1f4d0 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f  ){.      import_
1f4e0 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
1f4f0 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65  );.      c = fge
1f500 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d  tc(p->in);.    }
1f510 0a 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65 70  .    if( c==rSep
1f520 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69   ){.      p->nLi
1f530 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ne++;.      if( 
1f540 70 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b 70  p->n>0 && p->z[p
1f550 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 70  ->n-1]=='\r' ) p
1f560 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  ->n--;.    }.   
1f570 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20   p->cTerm = c;. 
1f580 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20   }.  if( p->z ) 
1f590 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a  p->z[p->n] = 0;.
1f5a0 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d    p->bNotFirst =
1f5b0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   1;.  return p->
1f5c0 7a 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20  z;.}../* Read a 
1f5d0 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66 20  single field of 
1f5e0 41 53 43 49 49 20 64 65 6c 69 6d 69 74 65 64 20  ASCII delimited 
1f5f0 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20  text..**.**   + 
1f600 20 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f   Input comes fro
1f610 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20  m p->in..**   + 
1f620 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
1f630 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68  n p->z of length
1f640 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f   p->n.  Space to
1f650 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73   hold p->z comes
1f660 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71  .**      from sq
1f670 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29  lite3_malloc64()
1f680 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d  ..**   +  Use p-
1f690 3e 63 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c  >cSep as the col
1f6a0 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20  umn separator.  
1f6b0 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22  The default is "
1f6c0 5c 78 31 46 22 2e 0a 2a 2a 20 20 20 2b 20 20 55  \x1F"..**   +  U
1f6d0 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74 68  se p->rSep as th
1f6e0 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e  e row separator.
1f6f0 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
1f700 20 22 5c 78 31 45 22 2e 0a 2a 2a 20 20 20 2b 20   "\x1E"..**   + 
1f710 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
1f720 68 65 20 72 6f 77 20 6e 75 6d 62 65 72 20 69 6e  he row number in
1f730 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20   p->nLine..**   
1f740 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61  +  Store the cha
1f750 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d  racter that term
1f760 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64  inates the field
1f770 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53   in p->cTerm.  S
1f780 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46  tore.**      EOF
1f790 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e   on end-of-file.
1f7a0 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20  .**   +  Report 
1f7b0 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e  syntax errors on
1f7c0 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69   stderr.*/.stati
1f7d0 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43  c char *SQLITE_C
1f7e0 44 45 43 4c 20 61 73 63 69 69 5f 72 65 61 64 5f  DECL ascii_read_
1f7f0 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74  one_field(Import
1f800 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63  Ctx *p){.  int c
1f810 3b 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70  ;.  int cSep = p
1f820 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74  ->cColSep;.  int
1f830 20 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53   rSep = p->cRowS
1f840 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a  ep;.  p->n = 0;.
1f850 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
1f860 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46  n);.  if( c==EOF
1f870 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70   || seenInterrup
1f880 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72  t ){.    p->cTer
1f890 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74  m = EOF;.    ret
1f8a0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69  urn 0;.  }.  whi
1f8b0 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21  le( c!=EOF && c!
1f8c0 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70  =cSep && c!=rSep
1f8d0 20 29 7b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61   ){.    import_a
1f8e0 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29  ppend_char(p, c)
1f8f0 3b 0a 20 20 20 20 63 20 3d 20 66 67 65 74 63 28  ;.    c = fgetc(
1f900 70 2d 3e 69 6e 29 3b 0a 20 20 7d 0a 20 20 69 66  p->in);.  }.  if
1f910 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20  ( c==rSep ){.   
1f920 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 7d   p->nLine++;.  }
1f930 0a 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b  .  p->cTerm = c;
1f940 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d  .  if( p->z ) p-
1f950 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  >z[p->n] = 0;.  
1f960 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a  return p->z;.}..
1f970 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72 61  /*.** Try to tra
1f980 6e 73 66 65 72 20 64 61 74 61 20 66 6f 72 20 74  nsfer data for t
1f990 61 62 6c 65 20 7a 54 61 62 6c 65 2e 20 20 49 66  able zTable.  If
1f9a0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
1f9b0 6e 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e  n while.** movin
1f9c0 67 20 66 6f 72 77 61 72 64 2c 20 74 72 79 20 74  g forward, try t
1f9d0 6f 20 67 6f 20 62 61 63 6b 77 61 72 64 73 2e 20  o go backwards. 
1f9e0 20 54 68 65 20 62 61 63 6b 77 61 72 64 73 20 6d   The backwards m
1f9f0 6f 76 65 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a  ovement won't.**
1fa00 20 77 6f 72 6b 20 66 6f 72 20 57 49 54 48 4f 55   work for WITHOU
1fa10 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e 0a  T ROWID tables..
1fa20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
1fa30 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61 28 0a 20  ryToCloneData(. 
1fa40 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a   ShellState *p,.
1fa50 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62    sqlite3 *newDb
1fa60 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
1fa70 7a 54 61 62 6c 65 0a 29 7b 0a 20 20 73 71 6c 69  zTable.){.  sqli
1fa80 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79  te3_stmt *pQuery
1fa90 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1faa0 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20  stmt *pInsert = 
1fab0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72  0;.  char *zQuer
1fac0 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  y = 0;.  char *z
1fad0 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 69 6e  Insert = 0;.  in
1fae0 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  t rc;.  int i, j
1faf0 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 54 61 62 6c  , n;.  int nTabl
1fb00 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54 61  e = strlen30(zTa
1fb10 62 6c 65 29 3b 0a 20 20 69 6e 74 20 6b 20 3d 20  ble);.  int k = 
1fb20 30 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  0;.  int cnt = 0
1fb30 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 70  ;.  const int sp
1fb40 69 6e 52 61 74 65 20 3d 20 31 30 30 30 30 3b 0a  inRate = 10000;.
1fb50 0a 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69  .  zQuery = sqli
1fb60 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
1fb70 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c  ECT * FROM \"%w\
1fb80 22 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 72  "", zTable);.  r
1fb90 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1fba0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
1fbb0 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
1fbc0 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  y, 0);.  if( rc 
1fbd0 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
1fbe0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
1fbf0 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d  r %d: %s on [%s]
1fc00 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1fc10 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
1fc20 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  d_errcode(p->db)
1fc30 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
1fc40 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20  (p->db),.       
1fc50 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
1fc60 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f    goto end_data_
1fc70 78 66 65 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20  xfer;.  }.  n = 
1fc80 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
1fc90 6f 75 6e 74 28 70 51 75 65 72 79 29 3b 0a 20 20  ount(pQuery);.  
1fca0 7a 49 6e 73 65 72 74 20 3d 20 73 71 6c 69 74 65  zInsert = sqlite
1fcb0 33 5f 6d 61 6c 6c 6f 63 36 34 28 32 30 30 20 2b  3_malloc64(200 +
1fcc0 20 6e 54 61 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a   nTable + n*3);.
1fcd0 20 20 69 66 28 20 7a 49 6e 73 65 72 74 3d 3d 30    if( zInsert==0
1fce0 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
1fcf0 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 73 71 6c 69  memory();.  sqli
1fd00 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 30  te3_snprintf(200
1fd10 2b 6e 54 61 62 6c 65 2c 7a 49 6e 73 65 72 74 2c  +nTable,zInsert,
1fd20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fd30 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49      "INSERT OR I
1fd40 47 4e 4f 52 45 20 49 4e 54 4f 20 5c 22 25 73 5c  GNORE INTO \"%s\
1fd50 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61  " VALUES(?", zTa
1fd60 62 6c 65 29 3b 0a 20 20 69 20 3d 20 73 74 72 6c  ble);.  i = strl
1fd70 65 6e 33 30 28 7a 49 6e 73 65 72 74 29 3b 0a 20  en30(zInsert);. 
1fd80 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a   for(j=1; j<n; j
1fd90 2b 2b 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ++){.    memcpy(
1fda0 7a 49 6e 73 65 72 74 2b 69 2c 20 22 2c 3f 22 2c  zInsert+i, ",?",
1fdb0 20 32 29 3b 0a 20 20 20 20 69 20 2b 3d 20 32 3b   2);.    i += 2;
1fdc0 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 49  .  }.  memcpy(zI
1fdd0 6e 73 65 72 74 2b 69 2c 20 22 29 3b 22 2c 20 33  nsert+i, ");", 3
1fde0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1fdf0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 6e 65 77  3_prepare_v2(new
1fe00 44 62 2c 20 7a 49 6e 73 65 72 74 2c 20 2d 31 2c  Db, zInsert, -1,
1fe10 20 26 70 49 6e 73 65 72 74 2c 20 30 29 3b 0a 20   &pInsert, 0);. 
1fe20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75   if( rc ){.    u
1fe30 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1fe40 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73  r, "Error %d: %s
1fe50 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20   on [%s]\n",.   
1fe60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1fe70 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
1fe80 65 28 6e 65 77 44 62 29 2c 20 73 71 6c 69 74 65  e(newDb), sqlite
1fe90 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29 2c  3_errmsg(newDb),
1fea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75  .            zQu
1feb0 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ery);.    goto e
1fec0 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20  nd_data_xfer;.  
1fed0 7d 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 32  }.  for(k=0; k<2
1fee0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 77 68 69 6c  ; k++){.    whil
1fef0 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  e( (rc = sqlite3
1ff00 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d  _step(pQuery))==
1ff10 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1ff20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1ff30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1ff40 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
1ff50 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 51 75 65  column_type(pQue
1ff60 72 79 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20  ry, i) ){.      
1ff70 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ff80 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  NULL: {.        
1ff90 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1ffa0 5f 6e 75 6c 6c 28 70 49 6e 73 65 72 74 2c 20 69  _null(pInsert, i
1ffb0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +1);.           
1ffc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1ffd0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61    }.          ca
1ffe0 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
1fff0 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  R: {.           
20000 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
20010 74 36 34 28 70 49 6e 73 65 72 74 2c 20 69 2b 31  t64(pInsert, i+1
20020 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
20030 5f 69 6e 74 36 34 28 70 51 75 65 72 79 2c 69 29  _int64(pQuery,i)
20040 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
20050 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
20060 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  }.          case
20070 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
20080 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
20090 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
200a0 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73  (pInsert, i+1, s
200b0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
200c0 75 62 6c 65 28 70 51 75 65 72 79 2c 69 29 29 3b  uble(pQuery,i));
200d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
200e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
200f0 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
20100 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20  QLITE_TEXT: {.  
20110 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
20120 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 49 6e 73  3_bind_text(pIns
20130 65 72 74 2c 20 69 2b 31 2c 0a 20 20 20 20 20 20  ert, i+1,.      
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20150 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68         (const ch
20160 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
20170 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 69  mn_text(pQuery,i
20180 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
20190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201a0 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
201b0 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
201c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
201d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   }.          cas
201e0 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
201f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
20200 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
20210 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c  Insert, i+1, sql
20220 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
20230 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20  (pQuery,i),.    
20240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20260 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
20270 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 51 75  column_bytes(pQu
20280 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20  ery,i),.        
20290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202b0 20 20 20 20 53 51 4c 49 54 45 5f 53 54 41 54 49      SQLITE_STATI
202c0 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
202d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
202e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
202f0 20 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 20     } /* End for 
20300 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
20310 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73 65  lite3_step(pInse
20320 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rt);.      if( r
20330 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
20340 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26  rc!=SQLITE_ROW &
20350 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  & rc!=SQLITE_DON
20360 45 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  E ){.        utf
20370 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
20380 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 5c 6e   "Error %d: %s\n
20390 22 2c 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  ", sqlite3_exten
203a0 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44  ded_errcode(newD
203b0 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b),.            
203c0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
203d0 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62  te3_errmsg(newDb
203e0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
203f0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
20400 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20  pInsert);.      
20410 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
20420 20 28 63 6e 74 25 73 70 69 6e 52 61 74 65 29 3d   (cnt%spinRate)=
20430 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  =0 ){.        pr
20440 69 6e 74 66 28 22 25 63 5c 62 22 2c 20 22 7c 2f  intf("%c\b", "|/
20450 2d 5c 5c 22 5b 28 63 6e 74 2f 73 70 69 6e 52 61  -\\"[(cnt/spinRa
20460 74 65 29 25 34 5d 29 3b 0a 20 20 20 20 20 20 20  te)%4]);.       
20470 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
20480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f  .      }.    } /
20490 2a 20 45 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 20  * End while */. 
204a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
204b0 45 5f 44 4f 4e 45 20 29 20 62 72 65 61 6b 3b 0a  E_DONE ) break;.
204c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
204d0 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20  lize(pQuery);.  
204e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
204f0 51 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65  Query);.    zQue
20500 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
20510 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46  intf("SELECT * F
20520 52 4f 4d 20 5c 22 25 77 5c 22 20 4f 52 44 45 52  ROM \"%w\" ORDER
20530 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 3b 22   BY rowid DESC;"
20540 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
20560 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  Table);.    rc =
20570 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
20580 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  _v2(p->db, zQuer
20590 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20  y, -1, &pQuery, 
205a0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
205b0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
205c0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 61 72  ntf(stderr, "War
205d0 6e 69 6e 67 3a 20 63 61 6e 6e 6f 74 20 73 74 65  ning: cannot ste
205e0 70 20 5c 22 25 73 5c 22 20 62 61 63 6b 77 61 72  p \"%s\" backwar
205f0 64 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  ds", zTable);.  
20600 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20610 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 28  .  } /* End for(
20620 6b 3d 30 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e 64 5f  k=0...) */..end_
20630 64 61 74 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c  data_xfer:.  sql
20640 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
20650 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  uery);.  sqlite3
20660 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72  _finalize(pInser
20670 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
20680 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 73 71  ee(zQuery);.  sq
20690 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 65  lite3_free(zInse
206a0 72 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  rt);.}.../*.** T
206b0 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20 61  ry to transfer a
206c0 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 73  ll rows of the s
206d0 63 68 65 6d 61 20 74 68 61 74 20 6d 61 74 63 68  chema that match
206e0 20 7a 57 68 65 72 65 2e 20 20 46 6f 72 0a 2a 2a   zWhere.  For.**
206f0 20 65 61 63 68 20 72 6f 77 2c 20 69 6e 76 6f 6b   each row, invok
20700 65 20 78 46 6f 72 45 61 63 68 28 29 20 6f 6e 20  e xForEach() on 
20710 74 68 65 20 6f 62 6a 65 63 74 20 64 65 66 69 6e  the object defin
20720 65 64 20 62 79 20 74 68 61 74 20 72 6f 77 2e 0a  ed by that row..
20730 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
20740 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68  s encountered wh
20750 69 6c 65 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61  ile moving forwa
20760 72 64 20 74 68 72 6f 75 67 68 20 74 68 65 0a 2a  rd through the.*
20770 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
20780 74 61 62 6c 65 2c 20 74 72 79 20 61 67 61 69 6e  table, try again
20790 20 6d 6f 76 69 6e 67 20 62 61 63 6b 77 61 72 64   moving backward
207a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
207b0 64 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65  d tryToCloneSche
207c0 6d 61 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ma(.  ShellState
207d0 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p,.  sqlite3 *
207e0 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63  newDb,.  const c
207f0 68 61 72 20 2a 7a 57 68 65 72 65 2c 0a 20 20 76  har *zWhere,.  v
20800 6f 69 64 20 28 2a 78 46 6f 72 45 61 63 68 29 28  oid (*xForEach)(
20810 53 68 65 6c 6c 53 74 61 74 65 2a 2c 73 71 6c 69  ShellState*,sqli
20820 74 65 33 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  te3*,const char*
20830 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ).){.  sqlite3_s
20840 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b  tmt *pQuery = 0;
20850 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20  .  char *zQuery 
20860 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
20870 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
20880 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63  char *zName;.  c
20890 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
208a0 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
208b0 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a   *zErrMsg = 0;..
208c0 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74    zQuery = sqlit
208d0 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
208e0 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f  CT name, sql FRO
208f0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
20900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20910 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
20920 45 52 45 20 25 73 22 2c 20 7a 57 68 65 72 65 29  ERE %s", zWhere)
20930 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
20940 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
20950 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26  b, zQuery, -1, &
20960 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69 66  pQuery, 0);.  if
20970 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38  ( rc ){.    utf8
20980 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
20990 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20  "Error: (%d) %s 
209a0 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20  on [%s]\n",.    
209b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209c0 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
209d0 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c  _errcode(p->db),
209e0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
209f0 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20  p->db),.        
20a00 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
20a10 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  ry);.    goto en
20a20 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20  d_schema_xfer;. 
20a30 20 7d 0a 20 20 77 68 69 6c 65 28 20 28 72 63 20   }.  while( (rc 
20a40 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
20a50 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f  Query))==SQLITE_
20a60 52 4f 57 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ROW ){.    zName
20a70 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
20a80 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 30  n_text(pQuery, 0
20a90 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  );.    zSql = sq
20aa0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
20ab0 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20  t(pQuery, 1);.  
20ac0 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20    printf("%s... 
20ad0 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73  ", zName); fflus
20ae0 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 73  h(stdout);.    s
20af0 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44  qlite3_exec(newD
20b00 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  b, (const char*)
20b10 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72  zSql, 0, 0, &zEr
20b20 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a  rMsg);.    if( z
20b30 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
20b40 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
20b50 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
20b60 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45  SQL: [%s]\n", zE
20b70 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20  rrMsg, zSql);.  
20b80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
20b90 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
20ba0 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20   zErrMsg = 0;.  
20bb0 20 20 7d 0a 20 20 20 20 69 66 28 20 78 46 6f 72    }.    if( xFor
20bc0 45 61 63 68 20 29 7b 0a 20 20 20 20 20 20 78 46  Each ){.      xF
20bd0 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c  orEach(p, newDb,
20be0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e   (const char*)zN
20bf0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
20c00 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29  printf("done\n")
20c10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
20c20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
20c30 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
20c40 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 20  ize(pQuery);.   
20c50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
20c60 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65 72  uery);.    zQuer
20c70 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
20c80 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d 65  ntf("SELECT name
20c90 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
20ca0 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20  e_master".      
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cc0 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 25         " WHERE %
20cd0 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64  s ORDER BY rowid
20ce0 20 44 45 53 43 22 2c 20 7a 57 68 65 72 65 29 3b   DESC", zWhere);
20cf0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
20d00 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
20d10 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
20d20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  &pQuery, 0);.   
20d30 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
20d40 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
20d50 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 28 25 64  err, "Error: (%d
20d60 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c  ) %s on [%s]\n",
20d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20d80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
20d90 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
20da0 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f  p->db), sqlite3_
20db0 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20  errmsg(p->db),. 
20dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20dd0 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
20de0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68      goto end_sch
20df0 65 6d 61 5f 78 66 65 72 3b 0a 20 20 20 20 7d 0a  ema_xfer;.    }.
20e00 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d      while( (rc =
20e10 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51   sqlite3_step(pQ
20e20 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52  uery))==SQLITE_R
20e30 4f 57 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  OW ){.      zNam
20e40 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
20e50 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20  mn_text(pQuery, 
20e60 30 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  0);.      zSql =
20e70 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
20e80 74 65 78 74 28 70 51 75 65 72 79 2c 20 31 29 3b  text(pQuery, 1);
20e90 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25  .      printf("%
20ea0 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20  s... ", zName); 
20eb0 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
20ec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
20ed0 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74  ec(newDb, (const
20ee0 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20   char*)zSql, 0, 
20ef0 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0, &zErrMsg);.  
20f00 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
20f10 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
20f20 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
20f30 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20  Error: %s\nSQL: 
20f40 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  [%s]\n", zErrMsg
20f50 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
20f60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
20f70 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
20f80 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
20f90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 78     }.      if( x
20fa0 46 6f 72 45 61 63 68 20 29 7b 0a 20 20 20 20 20  ForEach ){.     
20fb0 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c 20 6e     xForEach(p, n
20fc0 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61  ewDb, (const cha
20fd0 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  r*)zName);.     
20fe0 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28   }.      printf(
20ff0 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 20 20 7d  "done\n");.    }
21000 0a 20 20 7d 0a 65 6e 64 5f 73 63 68 65 6d 61 5f  .  }.end_schema_
21010 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f  xfer:.  sqlite3_
21020 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29  finalize(pQuery)
21030 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
21040 28 7a 51 75 65 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a  (zQuery);.}../*.
21050 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
21060 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
21070 64 20 22 7a 4e 65 77 44 62 22 2e 20 20 54 72 79  d "zNewDb".  Try
21080 20 74 6f 20 72 65 63 6f 76 65 72 20 61 73 20 6d   to recover as m
21090 75 63 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  uch information.
210a0 2a 2a 20 61 73 20 70 6f 73 73 69 62 6c 65 20 6f  ** as possible o
210b0 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64  ut of the main d
210c0 61 74 61 62 61 73 65 20 28 77 68 69 63 68 20 6d  atabase (which m
210d0 69 67 68 74 20 62 65 20 63 6f 72 72 75 70 74 29  ight be corrupt)
210e0 20 61 6e 64 20 77 72 69 74 65 20 69 74 0a 2a 2a   and write it.**
210f0 20 69 6e 74 6f 20 7a 4e 65 77 44 62 2e 0a 2a 2f   into zNewDb..*/
21100 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79  .static void try
21110 54 6f 43 6c 6f 6e 65 28 53 68 65 6c 6c 53 74 61  ToClone(ShellSta
21120 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  te *p, const cha
21130 72 20 2a 7a 4e 65 77 44 62 29 7b 0a 20 20 69 6e  r *zNewDb){.  in
21140 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  t rc;.  sqlite3 
21150 2a 6e 65 77 44 62 20 3d 20 30 3b 0a 20 20 69 66  *newDb = 0;.  if
21160 28 20 61 63 63 65 73 73 28 7a 4e 65 77 44 62 2c  ( access(zNewDb,
21170 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66  0)==0 ){.    utf
21180 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
21190 20 22 46 69 6c 65 20 5c 22 25 73 5c 22 20 61 6c   "File \"%s\" al
211a0 72 65 61 64 79 20 65 78 69 73 74 73 2e 5c 6e 22  ready exists.\n"
211b0 2c 20 7a 4e 65 77 44 62 29 3b 0a 20 20 20 20 72  , zNewDb);.    r
211c0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
211d0 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a  = sqlite3_open(z
211e0 4e 65 77 44 62 2c 20 26 6e 65 77 44 62 29 3b 0a  NewDb, &newDb);.
211f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
21200 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
21210 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 72 65 61  rr, "Cannot crea
21220 74 65 20 6f 75 74 70 75 74 20 64 61 74 61 62 61  te output databa
21230 73 65 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  se: %s\n",.     
21240 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
21250 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20  rrmsg(newDb));. 
21260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
21270 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
21280 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
21290 5f 73 63 68 65 6d 61 3d 4f 4e 3b 22 2c 20 30 2c  _schema=ON;", 0,
212a0 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
212b0 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20  te3_exec(newDb, 
212c0 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45  "BEGIN EXCLUSIVE
212d0 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
212e0 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65    tryToCloneSche
212f0 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79  ma(p, newDb, "ty
21300 70 65 3d 27 74 61 62 6c 65 27 22 2c 20 74 72 79  pe='table'", try
21310 54 6f 43 6c 6f 6e 65 44 61 74 61 29 3b 0a 20 20  ToCloneData);.  
21320 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65    tryToCloneSche
21330 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79  ma(p, newDb, "ty
21340 70 65 21 3d 27 74 61 62 6c 65 27 22 2c 20 30 29  pe!='table'", 0)
21350 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
21360 65 63 28 6e 65 77 44 62 2c 20 22 43 4f 4d 4d 49  ec(newDb, "COMMI
21370 54 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  T;", 0, 0, 0);. 
21380 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
21390 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77  p->db, "PRAGMA w
213a0 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
213b0 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  FF;", 0, 0, 0);.
213c0 20 20 7d 0a 20 20 63 6c 6f 73 65 5f 64 62 28 6e    }.  close_db(n
213d0 65 77 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ewDb);.}../*.** 
213e0 43 68 61 6e 67 65 20 74 68 65 20 6f 75 74 70 75  Change the outpu
213f0 74 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 73  t file back to s
21400 74 64 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tdout..**.** If 
21410 74 68 65 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e  the p->doXdgOpen
21420 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
21430 61 74 20 6d 65 61 6e 73 20 74 68 65 20 6f 75 74  at means the out
21440 70 75 74 20 77 61 73 20 62 65 69 6e 67 0a 2a 2a  put was being.**
21450 20 72 65 64 69 72 65 63 74 65 64 20 74 6f 20 61   redirected to a
21460 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
21470 6e 61 6d 65 64 20 62 79 20 70 2d 3e 7a 54 65 6d  named by p->zTem
21480 70 46 69 6c 65 2e 20 20 49 6e 20 74 68 61 74 20  pFile.  In that 
21490 63 61 73 65 2c 0a 2a 2a 20 6c 61 75 6e 63 68 20  case,.** launch 
214a0 73 74 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f  start/open/xdg-o
214b0 70 65 6e 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  pen on that temp
214c0 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73  orary file..*/.s
214d0 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
214e0 74 5f 72 65 73 65 74 28 53 68 65 6c 6c 53 74 61  t_reset(ShellSta
214f0 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  te *p){.  if( p-
21500 3e 6f 75 74 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27  >outfile[0]=='|'
21510 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
21520 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20  TE_OMIT_POPEN.  
21530 20 20 70 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29    pclose(p->out)
21540 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
21550 7b 0a 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c  {.    output_fil
21560 65 5f 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b  e_close(p->out);
21570 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21580 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20  NOHAVE_SYSTEM.  
21590 20 20 69 66 28 20 70 2d 3e 64 6f 58 64 67 4f 70    if( p->doXdgOp
215a0 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  en ){.      cons
215b0 74 20 63 68 61 72 20 2a 7a 58 64 67 4f 70 65 6e  t char *zXdgOpen
215c0 43 6d 64 20 3d 0a 23 69 66 20 64 65 66 69 6e 65  Cmd =.#if define
215d0 64 28 5f 57 49 4e 33 32 29 0a 20 20 20 20 20 20  d(_WIN32).      
215e0 22 73 74 61 72 74 22 3b 0a 23 65 6c 69 66 20 64  "start";.#elif d
215f0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
21600 29 0a 20 20 20 20 20 20 22 6f 70 65 6e 22 3b 0a  ).      "open";.
21610 23 65 6c 73 65 0a 20 20 20 20 20 20 22 78 64 67  #else.      "xdg
21620 2d 6f 70 65 6e 22 3b 0a 23 65 6e 64 69 66 0a 20  -open";.#endif. 
21630 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b       char *zCmd;
21640 0a 20 20 20 20 20 20 7a 43 6d 64 20 3d 20 73 71  .      zCmd = sq
21650 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
21660 73 20 25 73 22 2c 20 7a 58 64 67 4f 70 65 6e 43  s %s", zXdgOpenC
21670 6d 64 2c 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  md, p->zTempFile
21680 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 79 73  );.      if( sys
21690 74 65 6d 28 7a 43 6d 64 29 20 29 7b 0a 20 20 20  tem(zCmd) ){.   
216a0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
216b0 28 73 74 64 65 72 72 2c 20 22 46 61 69 6c 65 64  (stderr, "Failed
216c0 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 43 6d 64 29  : [%s]\n", zCmd)
216d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
216e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d  sqlite3_free(zCm
216f0 64 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  d);.      output
21700 4d 6f 64 65 50 6f 70 28 70 29 3b 0a 20 20 20 20  ModePop(p);.    
21710 20 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 3d    p->doXdgOpen =
21720 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   0;.    }.#endif
21730 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
21740 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45  ITE_NOHAVE_SYSTE
21750 4d 29 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 6f  M) */.  }.  p->o
21760 75 74 66 69 6c 65 5b 30 5d 20 3d 20 30 3b 0a 20  utfile[0] = 0;. 
21770 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74   p->out = stdout
21780 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61  ;.}../*.** Run a
21790 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 61 6e  n SQL command an
217a0 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 69 6e  d return the sin
217b0 67 6c 65 20 69 6e 74 65 67 65 72 20 72 65 73 75  gle integer resu
217c0 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  lt..*/.static in
217d0 74 20 64 62 5f 69 6e 74 28 53 68 65 6c 6c 53 74  t db_int(ShellSt
217e0 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ate *p, const ch
217f0 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 73 71 6c  ar *zSql){.  sql
21800 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
21810 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b  ;.  int res = 0;
21820 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  .  sqlite3_prepa
21830 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
21840 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
21850 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 26  );.  if( pStmt &
21860 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  & sqlite3_step(p
21870 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
21880 57 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 73  W ){.    res = s
21890 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
218a0 74 28 70 53 74 6d 74 2c 30 29 3b 0a 20 20 7d 0a  t(pStmt,0);.  }.
218b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
218c0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 72 65 74  ze(pStmt);.  ret
218d0 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
218e0 2a 20 43 6f 6e 76 65 72 74 20 61 20 32 2d 62 79  * Convert a 2-by
218f0 74 65 20 6f 72 20 34 2d 62 79 74 65 20 62 69 67  te or 4-byte big
21900 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
21910 69 6e 74 6f 20 61 20 6e 61 74 69 76 65 20 69 6e  into a native in
21920 74 65 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20  teger.*/.static 
21930 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67 65 74  unsigned int get
21940 32 62 79 74 65 49 6e 74 28 75 6e 73 69 67 6e 65  2byteInt(unsigne
21950 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20 72 65  d char *a){.  re
21960 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 38 29 20 2b  turn (a[0]<<8) +
21970 20 61 5b 31 5d 3b 0a 7d 0a 73 74 61 74 69 63 20   a[1];.}.static 
21980 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67 65 74  unsigned int get
21990 34 62 79 74 65 49 6e 74 28 75 6e 73 69 67 6e 65  4byteInt(unsigne
219a0 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20 72 65  d char *a){.  re
219b0 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 32 34 29 20  turn (a[0]<<24) 
219c0 2b 20 28 61 5b 31 5d 3c 3c 31 36 29 20 2b 20 28  + (a[1]<<16) + (
219d0 61 5b 32 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b  a[2]<<8) + a[3];
219e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
219f0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
21a00 22 2e 69 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64 2e  ".info" command.
21a10 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  .**.** Return 1 
21a20 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f 20 65  on error, 2 to e
21a30 78 69 74 2c 20 61 6e 64 20 30 20 6f 74 68 65 72  xit, and 0 other
21a40 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
21a50 69 6e 74 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f  int shell_dbinfo
21a60 5f 63 6f 6d 6d 61 6e 64 28 53 68 65 6c 6c 53 74  _command(ShellSt
21a70 61 74 65 20 2a 70 2c 20 69 6e 74 20 6e 41 72 67  ate *p, int nArg
21a80 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 29 7b  , char **azArg){
21a90 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
21aa0 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74 20 63  struct { const c
21ab0 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 69 6e 74 20  har *zName; int 
21ac0 6f 66 73 74 3b 20 7d 20 61 46 69 65 6c 64 5b 5d  ofst; } aField[]
21ad0 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 66 69 6c   = {.     { "fil
21ae0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
21af0 3a 22 2c 20 20 32 34 20 20 7d 2c 0a 20 20 20 20  :",  24  },.    
21b00 20 7b 20 22 64 61 74 61 62 61 73 65 20 70 61 67   { "database pag
21b10 65 20 63 6f 75 6e 74 3a 22 2c 20 20 32 38 20 20  e count:",  28  
21b20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 72 65 65 6c  },.     { "freel
21b30 69 73 74 20 70 61 67 65 20 63 6f 75 6e 74 3a 22  ist page count:"
21b40 2c 20 20 33 36 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  36  },.     {
21b50 20 22 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 3a   "schema cookie:
21b60 22 2c 20 20 20 20 20 20 20 20 34 30 20 20 7d 2c  ",        40  },
21b70 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d 61 20  .     { "schema 
21b80 66 6f 72 6d 61 74 3a 22 2c 20 20 20 20 20 20 20  format:",       
21b90 20 34 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   44  },.     { "
21ba0 64 65 66 61 75 6c 74 20 63 61 63 68 65 20 73 69  default cache si
21bb0 7a 65 3a 22 2c 20 20 20 34 38 20 20 7d 2c 0a 20  ze:",   48  },. 
21bc0 20 20 20 20 7b 20 22 61 75 74 6f 76 61 63 75 75      { "autovacuu
21bd0 6d 20 74 6f 70 20 72 6f 6f 74 3a 22 2c 20 20 35  m top root:",  5
21be0 32 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 69 6e  2  },.     { "in
21bf0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
21c00 3a 22 2c 20 20 20 36 34 20 20 7d 2c 0a 20 20 20  :",   64  },.   
21c10 20 20 7b 20 22 74 65 78 74 20 65 6e 63 6f 64 69    { "text encodi
21c20 6e 67 3a 22 2c 20 20 20 20 20 20 20 20 35 36 20  ng:",        56 
21c30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73 65 72   },.     { "user
21c40 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20   version:",     
21c50 20 20 20 20 36 30 20 20 7d 2c 0a 20 20 20 20 20      60  },.     
21c60 7b 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 20 69  { "application i
21c70 64 3a 22 2c 20 20 20 20 20 20 20 36 38 20 20 7d  d:",       68  }
21c80 2c 0a 20 20 20 20 20 7b 20 22 73 6f 66 74 77 61  ,.     { "softwa
21c90 72 65 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20  re version:",   
21ca0 20 20 39 36 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20    96  },.  };.  
21cb0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
21cc0 75 63 74 20 7b 20 63 6f 6e 73 74 20 63 68 61 72  uct { const char
21cd0 20 2a 7a 4e 61 6d 65 3b 20 63 6f 6e 73 74 20 63   *zName; const c
21ce0 68 61 72 20 2a 7a 53 71 6c 3b 20 7d 20 61 51 75  har *zSql; } aQu
21cf0 65 72 79 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b  ery[] = {.     {
21d00 20 22 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c   "number of tabl
21d10 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45  es:",.       "SE
21d20 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
21d30 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70 65  OM %s WHERE type
21d40 3d 27 74 61 62 6c 65 27 22 20 7d 2c 0a 20 20 20  ='table'" },.   
21d50 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 69    { "number of i
21d60 6e 64 65 78 65 73 3a 22 2c 0a 20 20 20 20 20 20  ndexes:",.      
21d70 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
21d80 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20  ) FROM %s WHERE 
21d90 74 79 70 65 3d 27 69 6e 64 65 78 27 22 20 7d 2c  type='index'" },
21da0 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20  .     { "number 
21db0 6f 66 20 74 72 69 67 67 65 72 73 3a 22 2c 0a 20  of triggers:",. 
21dc0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f        "SELECT co
21dd0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57  unt(*) FROM %s W
21de0 48 45 52 45 20 74 79 70 65 3d 27 74 72 69 67 67  HERE type='trigg
21df0 65 72 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22  er'" },.     { "
21e00 6e 75 6d 62 65 72 20 6f 66 20 76 69 65 77 73 3a  number of views:
21e10 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  ",.       "SELEC
21e20 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
21e30 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 76  %s WHERE type='v
21e40 69 65 77 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20  iew'" },.     { 
21e50 22 73 63 68 65 6d 61 20 73 69 7a 65 3a 22 2c 0a  "schema size:",.
21e60 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 74         "SELECT t
21e70 6f 74 61 6c 28 6c 65 6e 67 74 68 28 73 71 6c 29  otal(length(sql)
21e80 29 20 46 52 4f 4d 20 25 73 22 20 7d 2c 0a 20 20  ) FROM %s" },.  
21e90 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e  };.  int i;.  un
21ea0 73 69 67 6e 65 64 20 69 44 61 74 61 56 65 72 73  signed iDataVers
21eb0 69 6f 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 63  ion;.  char *zSc
21ec0 68 65 6d 61 54 61 62 3b 0a 20 20 63 68 61 72 20  hemaTab;.  char 
21ed0 2a 7a 44 62 20 3d 20 6e 41 72 67 3e 3d 32 20 3f  *zDb = nArg>=2 ?
21ee0 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 6d 61 69   azArg[1] : "mai
21ef0 6e 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  n";.  sqlite3_st
21f00 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
21f10 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
21f20 48 64 72 5b 31 30 30 5d 3b 0a 20 20 6f 70 65 6e  Hdr[100];.  open
21f30 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  _db(p, 0);.  if(
21f40 20 70 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75   p->db==0 ) retu
21f50 72 6e 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f  rn 1;.  sqlite3_
21f60 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
21f70 2c 22 53 45 4c 45 43 54 20 64 61 74 61 20 46 52  ,"SELECT data FR
21f80 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70 61 67 65  OM sqlite_dbpage
21f90 28 3f 31 29 20 57 48 45 52 45 20 70 67 6e 6f 3d  (?1) WHERE pgno=
21fa0 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  1",.            
21fb0 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53           -1, &pS
21fc0 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  tmt, 0);.  sqlit
21fd0 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
21fe0 6d 74 2c 20 31 2c 20 7a 44 62 2c 20 2d 31 2c 20  mt, 1, zDb, -1, 
21ff0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
22000 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
22010 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
22020 45 5f 52 4f 57 0a 20 20 20 26 26 20 73 71 6c 69  E_ROW.   && sqli
22030 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
22040 28 70 53 74 6d 74 2c 30 29 3e 31 30 30 0a 20 20  (pStmt,0)>100.  
22050 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 61 48  ){.    memcpy(aH
22060 64 72 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  dr, sqlite3_colu
22070 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 30 29  mn_blob(pStmt,0)
22080 2c 20 31 30 30 29 3b 0a 20 20 20 20 73 71 6c 69  , 100);.    sqli
22090 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
220a0 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mt);.  }else{.  
220b0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
220c0 65 72 72 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  err, "unable to 
220d0 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65  read database he
220e0 61 64 65 72 5c 6e 22 29 3b 0a 20 20 20 20 73 71  ader\n");.    sq
220f0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
22100 53 74 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 72  Stmt);.    retur
22110 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 67  n 1;.  }.  i = g
22120 65 74 32 62 79 74 65 49 6e 74 28 61 48 64 72 2b  et2byteInt(aHdr+
22130 31 36 29 3b 0a 20 20 69 66 28 20 69 3d 3d 31 20  16);.  if( i==1 
22140 29 20 69 20 3d 20 36 35 35 33 36 3b 0a 20 20 75  ) i = 65536;.  u
22150 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
22160 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c  t, "%-20s %d\n",
22170 20 22 64 61 74 61 62 61 73 65 20 70 61 67 65 20   "database page 
22180 73 69 7a 65 3a 22 2c 20 69 29 3b 0a 20 20 75 74  size:", i);.  ut
22190 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
221a0 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20  , "%-20s %d\n", 
221b0 22 77 72 69 74 65 20 66 6f 72 6d 61 74 3a 22 2c  "write format:",
221c0 20 61 48 64 72 5b 31 38 5d 29 3b 0a 20 20 75 74   aHdr[18]);.  ut
221d0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
221e0 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20  , "%-20s %d\n", 
221f0 22 72 65 61 64 20 66 6f 72 6d 61 74 3a 22 2c 20  "read format:", 
22200 61 48 64 72 5b 31 39 5d 29 3b 0a 20 20 75 74 66  aHdr[19]);.  utf
22210 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
22220 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22   "%-20s %d\n", "
22230 72 65 73 65 72 76 65 64 20 62 79 74 65 73 3a 22  reserved bytes:"
22240 2c 20 61 48 64 72 5b 32 30 5d 29 3b 0a 20 20 66  , aHdr[20]);.  f
22250 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
22260 69 7a 65 28 61 46 69 65 6c 64 29 3b 20 69 2b 2b  ize(aField); i++
22270 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 20  ){.    int ofst 
22280 3d 20 61 46 69 65 6c 64 5b 69 5d 2e 6f 66 73 74  = aField[i].ofst
22290 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
222a0 6e 74 20 76 61 6c 20 3d 20 67 65 74 34 62 79 74  nt val = get4byt
222b0 65 49 6e 74 28 61 48 64 72 20 2b 20 6f 66 73 74  eInt(aHdr + ofst
222c0 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
222d0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
222e0 73 20 25 75 22 2c 20 61 46 69 65 6c 64 5b 69 5d  s %u", aField[i]
222f0 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20  .zName, val);.  
22300 20 20 73 77 69 74 63 68 28 20 6f 66 73 74 20 29    switch( ofst )
22310 7b 0a 20 20 20 20 20 20 63 61 73 65 20 35 36 3a  {.      case 56:
22320 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76   {.        if( v
22330 61 6c 3d 3d 31 20 29 20 72 61 77 5f 70 72 69 6e  al==1 ) raw_prin
22340 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74  tf(p->out, " (ut
22350 66 38 29 22 29 3b 0a 20 20 20 20 20 20 20 20 69  f8)");.        i
22360 66 28 20 76 61 6c 3d 3d 32 20 29 20 72 61 77 5f  f( val==2 ) raw_
22370 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
22380 20 28 75 74 66 31 36 6c 65 29 22 29 3b 0a 20 20   (utf16le)");.  
22390 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 33        if( val==3
223a0 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d   ) raw_printf(p-
223b0 3e 6f 75 74 2c 20 22 20 28 75 74 66 31 36 62 65  >out, " (utf16be
223c0 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )");.      }.   
223d0 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74   }.    raw_print
223e0 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b  f(p->out, "\n");
223f0 0a 20 20 7d 0a 20 20 69 66 28 20 7a 44 62 3d 3d  .  }.  if( zDb==
22400 30 20 29 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61  0 ){.    zSchema
22410 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Tab = sqlite3_mp
22420 72 69 6e 74 66 28 22 6d 61 69 6e 2e 73 71 6c 69  rintf("main.sqli
22430 74 65 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d  te_master");.  }
22440 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
22450 7a 44 62 2c 22 74 65 6d 70 22 29 3d 3d 30 20 29  zDb,"temp")==0 )
22460 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62  {.    zSchemaTab
22470 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
22480 74 66 28 22 25 73 22 2c 20 22 73 71 6c 69 74 65  tf("%s", "sqlite
22490 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 29 3b 0a  _temp_master");.
224a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 63    }else{.    zSc
224b0 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65  hemaTab = sqlite
224c0 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c  3_mprintf("\"%w\
224d0 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  ".sqlite_master"
224e0 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 66 6f  , zDb);.  }.  fo
224f0 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
22500 7a 65 28 61 51 75 65 72 79 29 3b 20 69 2b 2b 29  ze(aQuery); i++)
22510 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  {.    char *zSql
22520 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
22530 74 66 28 61 51 75 65 72 79 5b 69 5d 2e 7a 53 71  tf(aQuery[i].zSq
22540 6c 2c 20 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a  l, zSchemaTab);.
22550 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 64 62      int val = db
22560 5f 69 6e 74 28 70 2c 20 7a 53 71 6c 29 3b 0a 20  _int(p, zSql);. 
22570 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22580 7a 53 71 6c 29 3b 0a 20 20 20 20 75 74 66 38 5f  zSql);.    utf8_
22590 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
225a0 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 61 51 75  %-20s %d\n", aQu
225b0 65 72 79 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61  ery[i].zName, va
225c0 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  l);.  }.  sqlite
225d0 33 5f 66 72 65 65 28 7a 53 63 68 65 6d 61 54 61  3_free(zSchemaTa
225e0 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  b);.  sqlite3_fi
225f0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
22600 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43  , zDb, SQLITE_FC
22610 4e 54 4c 5f 44 41 54 41 5f 56 45 52 53 49 4f 4e  NTL_DATA_VERSION
22620 2c 20 26 69 44 61 74 61 56 65 72 73 69 6f 6e 29  , &iDataVersion)
22630 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
22640 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
22650 75 5c 6e 22 2c 20 22 64 61 74 61 20 76 65 72 73  u\n", "data vers
22660 69 6f 6e 22 2c 20 69 44 61 74 61 56 65 72 73 69  ion", iDataVersi
22670 6f 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  on);.  return 0;
22680 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  .}../*.** Print 
22690 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69  the current sqli
226a0 74 65 33 5f 65 72 72 6d 73 67 28 29 20 76 61 6c  te3_errmsg() val
226b0 75 65 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64  ue to stderr and
226c0 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 73 74   return 1..*/.st
226d0 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 44 61  atic int shellDa
226e0 74 61 62 61 73 65 45 72 72 6f 72 28 73 71 6c 69  tabaseError(sqli
226f0 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73  te3 *db){.  cons
22700 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 73  t char *zErr = s
22710 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
22720 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  );.  utf8_printf
22730 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
22740 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20   %s\n", zErr);. 
22750 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
22760 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
22770 70 61 74 74 65 72 6e 20 69 6e 20 7a 47 6c 6f 62  pattern in zGlob
22780 5b 5d 20 61 67 61 69 6e 73 74 20 74 68 65 20 74  [] against the t
22790 65 78 74 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74  ext in z[].  Ret
227a0 75 72 6e 20 54 52 55 45 0a 2a 2a 20 69 66 20 74  urn TRUE.** if t
227b0 68 65 79 20 6d 61 74 63 68 20 61 6e 64 20 46 41  hey match and FA
227c0 4c 53 45 20 28 30 29 20 69 66 20 74 68 65 79 20  LSE (0) if they 
227d0 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
227e0 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20 72 75 6c  .** Globbing rul
227f0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  es:.**.**      '
22800 2a 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  *'       Matches
22810 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66   any sequence of
22820 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68   zero or more ch
22830 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  aracters..**.** 
22840 20 20 20 20 20 27 3f 27 20 20 20 20 20 20 20 4d       '?'       M
22850 61 74 63 68 65 73 20 65 78 61 63 74 6c 79 20 6f  atches exactly o
22860 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a  ne character..**
22870 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20 20 20  .**     [...]   
22880 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63     Matches one c
22890 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20 74 68  haracter from th
228a0 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 20  e enclosed list 
228b0 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  of.**           
228c0 20 20 20 20 20 63 68 61 72 61 63 74 65 72 73 2e       characters.
228d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e  .**.**     [^...
228e0 5d 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e  ]     Matches on
228f0 65 20 63 68 61 72 61 63 74 65 72 20 6e 6f 74 20  e character not 
22900 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20  in the enclosed 
22910 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  list..**.**     
22920 20 27 23 27 20 20 20 20 20 20 20 4d 61 74 63 68   '#'       Match
22930 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20  es any sequence 
22940 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 64  of one or more d
22950 69 67 69 74 73 20 77 69 74 68 20 61 6e 0a 2a 2a  igits with an.**
22960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22970 6f 70 74 69 6f 6e 61 6c 20 2b 20 6f 72 20 2d 20  optional + or - 
22980 73 69 67 6e 20 69 6e 20 66 72 6f 6e 74 0a 2a 2a  sign in front.**
22990 0a 2a 2a 20 20 20 20 20 20 27 20 27 20 20 20 20  .**      ' '    
229a0 20 20 20 41 6e 79 20 73 70 61 6e 20 6f 66 20 77     Any span of w
229b0 68 69 74 65 73 70 61 63 65 20 6d 61 74 63 68 65  hitespace matche
229c0 73 20 61 6e 79 20 6f 74 68 65 72 20 73 70 61 6e  s any other span
229d0 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
229e0 20 20 20 20 20 20 77 68 69 74 65 73 70 61 63 65        whitespace
229f0 2e 0a 2a 2a 0a 2a 2a 20 45 78 74 72 61 20 77 68  ..**.** Extra wh
22a00 69 74 65 73 70 61 63 65 20 61 74 20 74 68 65 20  itespace at the 
22a10 65 6e 64 20 6f 66 20 7a 5b 5d 20 69 73 20 69 67  end of z[] is ig
22a20 6e 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  nored..*/.static
22a30 20 69 6e 74 20 74 65 73 74 63 61 73 65 5f 67 6c   int testcase_gl
22a40 6f 62 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ob(const char *z
22a50 47 6c 6f 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  Glob, const char
22a60 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 63 2c 20 63   *z){.  int c, c
22a70 32 3b 0a 20 20 69 6e 74 20 69 6e 76 65 72 74 3b  2;.  int invert;
22a80 0a 20 20 69 6e 74 20 73 65 65 6e 3b 0a 0a 20 20  .  int seen;..  
22a90 77 68 69 6c 65 28 20 28 63 20 3d 20 28 2a 28 7a  while( (c = (*(z
22aa0 47 6c 6f 62 2b 2b 29 29 29 21 3d 30 20 29 7b 0a  Glob++)))!=0 ){.
22ab0 20 20 20 20 69 66 28 20 49 73 53 70 61 63 65 28      if( IsSpace(
22ac0 63 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  c) ){.      if( 
22ad0 21 49 73 53 70 61 63 65 28 2a 7a 29 20 29 20 72  !IsSpace(*z) ) r
22ae0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 77  eturn 0;.      w
22af0 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a  hile( IsSpace(*z
22b00 47 6c 6f 62 29 20 29 20 7a 47 6c 6f 62 2b 2b 3b  Glob) ) zGlob++;
22b10 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73  .      while( Is
22b20 53 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b  Space(*z) ) z++;
22b30 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
22b40 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 77  =='*' ){.      w
22b50 68 69 6c 65 28 20 28 63 3d 28 2a 28 7a 47 6c 6f  hile( (c=(*(zGlo
22b60 62 2b 2b 29 29 29 20 3d 3d 20 27 2a 27 20 7c 7c  b++))) == '*' ||
22b70 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20   c=='?' ){.     
22b80 20 20 20 69 66 28 20 63 3d 3d 27 3f 27 20 26 26     if( c=='?' &&
22b90 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29 20 72   (*(z++))==0 ) r
22ba0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
22bb0 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
22bc0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
22bd0 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 1;.      }else
22be0 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20   if( c=='[' ){. 
22bf0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a         while( *z
22c00 20 26 26 20 74 65 73 74 63 61 73 65 5f 67 6c 6f   && testcase_glo
22c10 62 28 7a 47 6c 6f 62 2d 31 2c 7a 29 3d 3d 30 20  b(zGlob-1,z)==0 
22c20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 2b 2b  ){.          z++
22c30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22c40 20 20 20 20 72 65 74 75 72 6e 20 28 2a 7a 29 21      return (*z)!
22c50 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  =0;.      }.    
22c60 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 28    while( (c2 = (
22c70 2a 28 7a 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20  *(z++)))!=0 ){. 
22c80 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 32         while( c2
22c90 21 3d 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=c ){.         
22ca0 20 63 32 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20   c2 = *(z++);.  
22cb0 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d          if( c2==
22cc0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
22cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22ce0 69 66 28 20 74 65 73 74 63 61 73 65 5f 67 6c 6f  if( testcase_glo
22cf0 62 28 7a 47 6c 6f 62 2c 7a 29 20 29 20 72 65 74  b(zGlob,z) ) ret
22d00 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
22d10 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
22d20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
22d30 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '?' ){.      if(
22d40 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29 20 72   (*(z++))==0 ) r
22d50 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
22d60 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b  se if( c=='[' ){
22d70 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72  .      int prior
22d80 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 65  _c = 0;.      se
22d90 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  en = 0;.      in
22da0 76 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  vert = 0;.      
22db0 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20  c = *(z++);.    
22dc0 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74    if( c==0 ) ret
22dd0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 63 32 20  urn 0;.      c2 
22de0 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20  = *(zGlob++);.  
22df0 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5e 27 20      if( c2=='^' 
22e00 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 65 72  ){.        inver
22e10 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63  t = 1;.        c
22e20 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a  2 = *(zGlob++);.
22e30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
22e40 28 20 63 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20  ( c2==']' ){.   
22e50 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20       if( c==']' 
22e60 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  ) seen = 1;.    
22e70 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62      c2 = *(zGlob
22e80 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ++);.      }.   
22e90 20 20 20 77 68 69 6c 65 28 20 63 32 20 26 26 20     while( c2 && 
22ea0 63 32 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20  c2!=']' ){.     
22eb0 20 20 20 69 66 28 20 63 32 3d 3d 27 2d 27 20 26     if( c2=='-' &
22ec0 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d 27 5d 27 20  & zGlob[0]!=']' 
22ed0 26 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d 30 20 26  && zGlob[0]!=0 &
22ee0 26 20 70 72 69 6f 72 5f 63 3e 30 20 29 7b 0a 20  & prior_c>0 ){. 
22ef0 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28           c2 = *(
22f00 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
22f10 20 20 20 20 69 66 28 20 63 3e 3d 70 72 69 6f 72      if( c>=prior
22f20 5f 63 20 26 26 20 63 3c 3d 63 32 20 29 20 73 65  _c && c<=c2 ) se
22f30 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
22f40 20 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20    prior_c = 0;. 
22f50 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22f60 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63          if( c==c
22f70 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
22f80 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20   seen = 1;.     
22f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22fa0 20 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20   prior_c = c2;. 
22fb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22fc0 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29   c2 = *(zGlob++)
22fd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22fe0 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65  if( c2==0 || (se
22ff0 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20  en ^ invert)==0 
23000 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
23010 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 23 27  }else if( c=='#'
23020 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 7a   ){.      if( (z
23030 5b 30 5d 3d 3d 27 2d 27 20 7c 7c 20 7a 5b 30 5d  [0]=='-' || z[0]
23040 3d 3d 27 2b 27 29 20 26 26 20 49 73 44 69 67 69  =='+') && IsDigi
23050 74 28 7a 5b 31 5d 29 20 29 20 7a 2b 2b 3b 0a 20  t(z[1]) ) z++;. 
23060 20 20 20 20 20 69 66 28 20 21 49 73 44 69 67 69       if( !IsDigi
23070 74 28 7a 5b 30 5d 29 20 29 20 72 65 74 75 72 6e  t(z[0]) ) return
23080 20 30 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20   0;.      z++;. 
23090 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 44 69       while( IsDi
230a0 67 69 74 28 7a 5b 30 5d 29 20 29 7b 20 7a 2b 2b  git(z[0]) ){ z++
230b0 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ; }.    }else{. 
230c0 20 20 20 20 20 69 66 28 20 63 21 3d 28 2a 28 7a       if( c!=(*(z
230d0 2b 2b 29 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ++)) ) return 0;
230e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69  .    }.  }.  whi
230f0 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a 29 20  le( IsSpace(*z) 
23100 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 72 65 74 75  ){ z++; }.  retu
23110 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a  rn *z==0;.}.../*
23120 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
23130 73 74 72 69 6e 67 20 61 73 20 61 20 63 6f 6d 6d  string as a comm
23140 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20  and-line option 
23150 77 69 74 68 20 65 69 74 68 65 72 20 6f 6e 65 20  with either one 
23160 6f 72 20 74 77 6f 0a 2a 2a 20 69 6e 69 74 69 61  or two.** initia
23170 6c 20 22 2d 22 20 63 68 61 72 61 63 74 65 72 73  l "-" characters
23180 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23190 6f 70 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73  optionMatch(cons
231a0 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 63 6f  t char *zStr, co
231b0 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 29 7b  nst char *zOpt){
231c0 0a 20 20 69 66 28 20 7a 53 74 72 5b 30 5d 21 3d  .  if( zStr[0]!=
231d0 27 2d 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  '-' ) return 0;.
231e0 20 20 7a 53 74 72 2b 2b 3b 0a 20 20 69 66 28 20    zStr++;.  if( 
231f0 7a 53 74 72 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a  zStr[0]=='-' ) z
23200 53 74 72 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  Str++;.  return 
23210 73 74 72 63 6d 70 28 7a 53 74 72 2c 20 7a 4f 70  strcmp(zStr, zOp
23220 74 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t)==0;.}../*.** 
23230 44 65 6c 65 74 65 20 61 20 66 69 6c 65 2e 0a 2a  Delete a file..*
23240 2f 0a 69 6e 74 20 73 68 65 6c 6c 44 65 6c 65 74  /.int shellDelet
23250 65 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  eFile(const char
23260 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
23270 69 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20 5f  int rc;.#ifdef _
23280 57 49 4e 33 32 0a 20 20 77 63 68 61 72 5f 74 20  WIN32.  wchar_t 
23290 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  *z = sqlite3_win
232a0 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f  32_utf8_to_unico
232b0 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
232c0 20 72 63 20 3d 20 5f 77 75 6e 6c 69 6e 6b 28 7a   rc = _wunlink(z
232d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
232e0 65 28 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63  e(z);.#else.  rc
232f0 20 3d 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e   = unlink(zFilen
23300 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  ame);.#endif.  r
23310 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23320 2a 2a 20 54 72 79 20 74 6f 20 64 65 6c 65 74 65  ** Try to delete
23330 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
23340 69 6c 65 20 28 69 66 20 74 68 65 72 65 20 69 73  ile (if there is
23350 20 6f 6e 65 29 20 61 6e 64 20 66 72 65 65 20 74   one) and free t
23360 68 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 75 73 65  he.** memory use
23370 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  d to hold the na
23380 6d 65 20 6f 66 20 74 68 65 20 74 65 6d 70 20 66  me of the temp f
23390 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ile..*/.static v
233a0 6f 69 64 20 63 6c 65 61 72 54 65 6d 70 46 69 6c  oid clearTempFil
233b0 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  e(ShellState *p)
233c0 7b 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70  {.  if( p->zTemp
233d0 46 69 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  File==0 ) return
233e0 3b 0a 20 20 69 66 28 20 70 2d 3e 64 6f 58 64 67  ;.  if( p->doXdg
233f0 4f 70 65 6e 20 29 20 72 65 74 75 72 6e 3b 0a 20  Open ) return;. 
23400 20 69 66 28 20 73 68 65 6c 6c 44 65 6c 65 74 65   if( shellDelete
23410 46 69 6c 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c  File(p->zTempFil
23420 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  e) ) return;.  s
23430 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
23440 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70 2d 3e  TempFile);.  p->
23450 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 7d  zTempFile = 0;.}
23460 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
23470 20 6e 65 77 20 74 65 6d 70 20 66 69 6c 65 20 6e   new temp file n
23480 61 6d 65 20 77 69 74 68 20 74 68 65 20 67 69 76  ame with the giv
23490 65 6e 20 73 75 66 66 69 78 2e 0a 2a 2f 0a 73 74  en suffix..*/.st
234a0 61 74 69 63 20 76 6f 69 64 20 6e 65 77 54 65 6d  atic void newTem
234b0 70 46 69 6c 65 28 53 68 65 6c 6c 53 74 61 74 65  pFile(ShellState
234c0 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
234d0 2a 7a 53 75 66 66 69 78 29 7b 0a 20 20 63 6c 65  *zSuffix){.  cle
234e0 61 72 54 65 6d 70 46 69 6c 65 28 70 29 3b 0a 20  arTempFile(p);. 
234f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
23500 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70  >zTempFile);.  p
23510 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b  ->zTempFile = 0;
23520 0a 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a  .  if( p->db ){.
23530 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
23540 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20  _control(p->db, 
23550 30 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  0, SQLITE_FCNTL_
23560 54 45 4d 50 46 49 4c 45 4e 41 4d 45 2c 20 26 70  TEMPFILENAME, &p
23570 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20  ->zTempFile);.  
23580 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70  }.  if( p->zTemp
23590 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  File==0 ){.    s
235a0 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72 3b  qlite3_uint64 r;
235b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
235c0 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72  domness(sizeof(r
235d0 29 2c 20 26 72 29 3b 0a 20 20 20 20 70 2d 3e 7a  ), &r);.    p->z
235e0 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  TempFile = sqlit
235f0 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d 70  e3_mprintf("temp
23600 25 6c 6c 78 2e 25 73 22 2c 20 72 2c 20 7a 53 75  %llx.%s", r, zSu
23610 66 66 69 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ffix);.  }else{.
23620 20 20 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65      p->zTempFile
23630 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
23640 74 66 28 22 25 7a 2e 25 73 22 2c 20 70 2d 3e 7a  tf("%z.%s", p->z
23650 54 65 6d 70 46 69 6c 65 2c 20 7a 53 75 66 66 69  TempFile, zSuffi
23660 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  x);.  }.  if( p-
23670 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b  >zTempFile==0 ){
23680 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
23690 73 74 64 65 72 72 2c 20 22 6f 75 74 20 6f 66 20  stderr, "out of 
236a0 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20  memory\n");.    
236b0 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  exit(1);.  }.}..
236c0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  ./*.** The imple
236d0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 53 51 4c  mentation of SQL
236e0 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
236f0 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c   fkey_collate_cl
23700 61 75 73 65 28 29 2c 20 75 73 65 64 0a 2a 2a 20  ause(), used.** 
23710 62 79 20 74 68 65 20 22 2e 6c 69 6e 74 20 66 6b  by the ".lint fk
23720 65 79 2d 69 6e 64 65 78 65 73 22 20 63 6f 6d 6d  ey-indexes" comm
23730 61 6e 64 2e 20 54 68 69 73 20 73 63 61 6c 61 72  and. This scalar
23740 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 77   function is alw
23750 61 79 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69  ays.** called wi
23760 74 68 20 66 6f 75 72 20 61 72 67 75 6d 65 6e 74  th four argument
23770 73 20 2d 20 74 68 65 20 70 61 72 65 6e 74 20 74  s - the parent t
23780 61 62 6c 65 20 6e 61 6d 65 2c 20 74 68 65 20 70  able name, the p
23790 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  arent column nam
237a0 65 2c 0a 2a 2a 20 74 68 65 20 63 68 69 6c 64 20  e,.** the child 
237b0 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
237c0 68 65 20 63 68 69 6c 64 20 63 6f 6c 75 6d 6e 20  he child column 
237d0 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 6b  name..**.**   fk
237e0 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73  ey_collate_claus
237f0 65 28 27 70 61 72 65 6e 74 2d 74 61 62 27 2c 20  e('parent-tab', 
23800 27 70 61 72 65 6e 74 2d 63 6f 6c 27 2c 20 27 63  'parent-col', 'c
23810 68 69 6c 64 2d 74 61 62 27 2c 20 27 63 68 69 6c  hild-tab', 'chil
23820 64 2d 63 6f 6c 27 29 0a 2a 2a 0a 2a 2a 20 49 66  d-col').**.** If
23830 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 6e   either of the n
23840 61 6d 65 64 20 74 61 62 6c 65 73 20 6f 72 20 63  amed tables or c
23850 6f 6c 75 6d 6e 73 20 64 6f 20 6e 6f 74 20 65 78  olumns do not ex
23860 69 73 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ist, this functi
23870 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e  on.** returns an
23880 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 41   empty string. A
23890 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69  n empty string i
238a0 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
238b0 69 66 20 62 6f 74 68 20 74 61 62 6c 65 73 0a 2a  if both tables.*
238c0 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 20 65 78  * and columns ex
238d0 69 73 74 20 62 75 74 20 68 61 76 65 20 74 68 65  ist but have the
238e0 20 73 61 6d 65 20 64 65 66 61 75 6c 74 20 63 6f   same default co
238f0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
23900 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 62 6f 74 68  . Or,.** if both
23910 20 65 78 69 73 74 20 62 75 74 20 74 68 65 20 64   exist but the d
23920 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
23930 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 64   sequences are d
23940 69 66 66 65 72 65 6e 74 2c 20 74 68 69 73 0a 2a  ifferent, this.*
23950 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
23960 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 22 20  ns the string " 
23970 43 4f 4c 4c 41 54 45 20 3c 70 61 72 65 6e 74 2d  COLLATE <parent-
23980 63 6f 6c 6c 61 74 69 6f 6e 3e 22 2c 20 77 68 65  collation>", whe
23990 72 65 0a 2a 2a 20 3c 70 61 72 65 6e 74 2d 63 6f  re.** <parent-co
239a0 6c 6c 61 74 69 6f 6e 3e 20 69 73 20 74 68 65 20  llation> is the 
239b0 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f  default collatio
239c0 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68  n sequence of th
239d0 65 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 2e  e parent column.
239e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
239f0 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74 65  shellFkeyCollate
23a00 43 6c 61 75 73 65 28 0a 20 20 73 71 6c 69 74 65  Clause(.  sqlite
23a10 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
23a20 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73  .  int nVal,.  s
23a30 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
23a40 70 56 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65  pVal.){.  sqlite
23a50 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
23a60 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
23a70 65 28 70 43 74 78 29 3b 0a 20 20 63 6f 6e 73 74  e(pCtx);.  const
23a80 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 3b 0a   char *zParent;.
23a90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
23aa0 61 72 65 6e 74 43 6f 6c 3b 0a 20 20 63 6f 6e 73  arentCol;.  cons
23ab0 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 53  t char *zParentS
23ac0 65 71 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  eq;.  const char
23ad0 20 2a 7a 43 68 69 6c 64 3b 0a 20 20 63 6f 6e 73   *zChild;.  cons
23ae0 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 43 6f  t char *zChildCo
23af0 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
23b00 2a 7a 43 68 69 6c 64 53 65 71 20 3d 20 30 3b 20  *zChildSeq = 0; 
23b10 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
23b20 6f 20 61 76 6f 69 64 20 66 61 6c 73 65 2d 70 6f  o avoid false-po
23b30 73 69 74 69 76 65 20 77 61 72 6e 69 6e 67 20 2a  sitive warning *
23b40 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
23b50 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d 34 20 29  ssert( nVal==4 )
23b60 3b 0a 20 20 7a 50 61 72 65 6e 74 20 3d 20 28 63  ;.  zParent = (c
23b70 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
23b80 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
23b90 56 61 6c 5b 30 5d 29 3b 0a 20 20 7a 50 61 72 65  Val[0]);.  zPare
23ba0 6e 74 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63  ntCol = (const c
23bb0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
23bc0 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d  ue_text(apVal[1]
23bd0 29 3b 0a 20 20 7a 43 68 69 6c 64 20 3d 20 28 63  );.  zChild = (c
23be0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
23bf0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
23c00 56 61 6c 5b 32 5d 29 3b 0a 20 20 7a 43 68 69 6c  Val[2]);.  zChil
23c10 64 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  dCol = (const ch
23c20 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
23c30 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 33 5d 29  e_text(apVal[3])
23c40 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ;..  sqlite3_res
23c50 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 22  ult_text(pCtx, "
23c60 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  ", -1, SQLITE_ST
23c70 41 54 49 43 29 3b 0a 20 20 72 63 20 3d 20 73 71  ATIC);.  rc = sq
23c80 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
23c90 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20  mn_metadata(.   
23ca0 20 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a     db, "main", z
23cb0 50 61 72 65 6e 74 2c 20 7a 50 61 72 65 6e 74 43  Parent, zParentC
23cc0 6f 6c 2c 20 30 2c 20 26 7a 50 61 72 65 6e 74 53  ol, 0, &zParentS
23cd0 65 71 2c 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b  eq, 0, 0, 0.  );
23ce0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
23cf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
23d00 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
23d10 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
23d20 20 20 20 20 20 20 20 20 64 62 2c 20 22 6d 61 69          db, "mai
23d30 6e 22 2c 20 7a 43 68 69 6c 64 2c 20 7a 43 68 69  n", zChild, zChi
23d40 6c 64 43 6f 6c 2c 20 30 2c 20 26 7a 43 68 69 6c  ldCol, 0, &zChil
23d50 64 53 65 71 2c 20 30 2c 20 30 2c 20 30 0a 20 20  dSeq, 0, 0, 0.  
23d60 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20    );.  }..  if( 
23d70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
23d80 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
23d90 28 7a 50 61 72 65 6e 74 53 65 71 2c 20 7a 43 68  (zParentSeq, zCh
23da0 69 6c 64 53 65 71 29 20 29 7b 0a 20 20 20 20 63  ildSeq) ){.    c
23db0 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
23dc0 5f 6d 70 72 69 6e 74 66 28 22 20 43 4f 4c 4c 41  _mprintf(" COLLA
23dd0 54 45 20 25 73 22 2c 20 7a 50 61 72 65 6e 74 53  TE %s", zParentS
23de0 65 71 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eq);.    sqlite3
23df0 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
23e00 78 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  x, z, -1, SQLITE
23e10 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
23e20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
23e30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
23e40 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
23e50 6f 6e 20 6f 66 20 64 6f 74 2d 63 6f 6d 6d 61 6e  on of dot-comman
23e60 64 20 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e  d ".lint fkey-in
23e70 64 65 78 65 73 22 2e 0a 2a 2f 0a 73 74 61 74 69  dexes"..*/.stati
23e80 63 20 69 6e 74 20 6c 69 6e 74 46 6b 65 79 49 6e  c int lintFkeyIn
23e90 64 65 78 65 73 28 0a 20 20 53 68 65 6c 6c 53 74  dexes(.  ShellSt
23ea0 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20  ate *pState,    
23eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
23ec0 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73  ent shell tool s
23ed0 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tate */.  char *
23ee0 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20  *azArg,         
23ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
23f00 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
23f10 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f  passed to dot co
23f20 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  mmand */.  int n
23f30 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
23f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
23f50 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
23f60 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b  in azArg[] */.){
23f70 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
23f80 20 70 53 74 61 74 65 2d 3e 64 62 3b 20 20 20 20   pState->db;    
23f90 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
23fa0 61 6e 64 6c 65 20 74 6f 20 71 75 65 72 79 20 22  andle to query "
23fb0 6d 61 69 6e 22 20 64 62 20 6f 66 20 2a 2f 0a 20  main" db of */. 
23fc0 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53 74   FILE *out = pSt
23fd0 61 74 65 2d 3e 6f 75 74 3b 20 20 20 20 20 20 20  ate->out;       
23fe0 20 2f 2a 20 53 74 72 65 61 6d 20 74 6f 20 77 72   /* Stream to wr
23ff0 69 74 65 20 6e 6f 6e 2d 65 72 72 6f 72 20 6f 75  ite non-error ou
24000 74 70 75 74 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  tput to */.  int
24010 20 62 56 65 72 62 6f 73 65 20 3d 20 30 3b 20 20   bVerbose = 0;  
24020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24030 49 66 20 2d 76 65 72 62 6f 73 65 20 69 73 20 70  If -verbose is p
24040 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
24050 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 20 3d  bGroupByParent =
24060 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
24070 66 20 2d 67 72 6f 75 70 62 79 70 61 72 65 6e 74  f -groupbyparent
24080 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
24090 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
240a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240b0 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74   /* To iterate t
240c0 68 72 6f 75 67 68 20 61 7a 41 72 67 5b 5d 20 2a  hrough azArg[] *
240d0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
240e0 7a 49 6e 64 65 6e 74 20 3d 20 22 22 3b 20 20 20  zIndent = "";   
240f0 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20      /* How much 
24100 74 6f 20 69 6e 64 65 6e 74 20 43 52 45 41 54 45  to indent CREATE
24110 20 49 4e 44 45 58 20 62 79 20 2a 2f 0a 20 20 69   INDEX by */.  i
24120 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
24130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24140 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
24150 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
24160 2a 70 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20  *pSql = 0;      
24170 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 76     /* Compiled v
24180 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c 20 73 74  ersion of SQL st
24190 61 74 65 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  atement below */
241a0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  /*.  ** This
241b0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
241c0 74 20 72 65 74 75 72 6e 73 20 6f 6e 65 20 72 6f  t returns one ro
241d0 77 20 66 6f 72 20 65 61 63 68 20 66 6f 72 65 69  w for each forei
241e0 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
241f0 74 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 73 63  t.  ** in the sc
24200 68 65 6d 61 20 6f 66 20 74 68 65 20 6d 61 69 6e  hema of the main
24210 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 63   database. The c
24220 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65  olumn values are
24230 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 30 2e 20 54  :.  **.  ** 0. T
24240 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 53 51  he text of an SQ
24250 4c 20 73 74 61 74 65 6d 65 6e 74 20 73 69 6d 69  L statement simi
24260 6c 61 72 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  lar to:.  **.  *
24270 2a 20 20 20 20 20 20 22 45 58 50 4c 41 49 4e 20  *      "EXPLAIN 
24280 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43  QUERY PLAN SELEC
24290 54 20 31 20 46 52 4f 4d 20 63 68 69 6c 64 5f 74  T 1 FROM child_t
242a0 61 62 6c 65 20 57 48 45 52 45 20 63 68 69 6c 64  able WHERE child
242b0 5f 6b 65 79 3d 3f 22 0a 20 20 2a 2a 0a 20 20 2a  _key=?".  **.  *
242c0 2a 20 20 20 20 54 68 69 73 20 53 45 4c 45 43 54  *    This SELECT
242d0 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74   is similar to t
242e0 68 65 20 6f 6e 65 20 74 68 61 74 20 74 68 65 20  he one that the 
242f0 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 69 6d 70  foreign keys imp
24300 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 2a 2a  lementation.  **
24310 20 20 20 20 6e 65 65 64 73 20 74 6f 20 72 75 6e      needs to run
24320 20 69 6e 74 65 72 6e 61 6c 6c 79 20 6f 6e 20 63   internally on c
24330 68 69 6c 64 20 74 61 62 6c 65 73 2e 20 49 66 20  hild tables. If 
24340 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65  there is an inde
24350 78 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20  x that can.  ** 
24360 20 20 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70     be used to op
24370 74 69 6d 69 7a 65 20 74 68 69 73 20 71 75 65 72  timize this quer
24380 79 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20 61  y, then it can a
24390 6c 73 6f 20 62 65 20 75 73 65 64 20 62 79 20 74  lso be used by t
243a0 68 65 20 46 4b 0a 20 20 2a 2a 20 20 20 20 69 6d  he FK.  **    im
243b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20  plementation to 
243c0 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45 54 45 20  optimize DELETE 
243d0 6f 72 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  or UPDATE statem
243e0 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 72 65  ents on the pare
243f0 6e 74 0a 20 20 2a 2a 20 20 20 20 74 61 62 6c 65  nt.  **    table
24400 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 2e 20 41  ..  **.  ** 1. A
24410 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 20 73 75   GLOB pattern su
24420 69 74 61 62 6c 65 20 66 6f 72 20 73 71 6c 69 74  itable for sqlit
24430 65 33 5f 73 74 72 67 6c 6f 62 28 29 2e 20 49 66  e3_strglob(). If
24440 20 74 68 65 20 70 6c 61 6e 20 6f 75 74 70 75 74   the plan output
24450 20 62 79 0a 20 20 2a 2a 20 20 20 20 74 68 65 20   by.  **    the 
24460 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
24470 41 4e 20 63 6f 6d 6d 61 6e 64 20 6d 61 74 63 68  AN command match
24480 65 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c  es this pattern,
24490 20 74 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   then the schema
244a0 0a 20 20 2a 2a 20 20 20 20 63 6f 6e 74 61 69 6e  .  **    contain
244b0 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
244c0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 6f  can be used to o
244d0 70 74 69 6d 69 7a 65 20 74 68 65 20 71 75 65 72  ptimize the quer
244e0 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 2e 20  y..  **.  ** 2. 
244f0 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 74  Human readable t
24500 65 78 74 20 74 68 61 74 20 64 65 73 63 72 69 62  ext that describ
24510 65 73 20 74 68 65 20 63 68 69 6c 64 20 74 61 62  es the child tab
24520 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20  le and columns. 
24530 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  e.g..  **.  **  
24540 20 20 20 20 20 22 63 68 69 6c 64 5f 74 61 62 6c       "child_tabl
24550 65 28 63 68 69 6c 64 5f 6b 65 79 31 2c 20 63 68  e(child_key1, ch
24560 69 6c 64 5f 6b 65 79 32 29 22 0a 20 20 2a 2a 0a  ild_key2)".  **.
24570 20 20 2a 2a 20 33 2e 20 48 75 6d 61 6e 20 72 65    ** 3. Human re
24580 61 64 61 62 6c 65 20 74 65 78 74 20 74 68 61 74  adable text that
24590 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 70   describes the p
245a0 61 72 65 6e 74 20 74 61 62 6c 65 20 61 6e 64 20  arent table and 
245b0 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20  columns. e.g..  
245c0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 70  **.  **       "p
245d0 61 72 65 6e 74 5f 74 61 62 6c 65 28 70 61 72 65  arent_table(pare
245e0 6e 74 5f 6b 65 79 31 2c 20 70 61 72 65 6e 74 5f  nt_key1, parent_
245f0 6b 65 79 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a  key2)".  **.  **
24600 20 34 2e 20 41 20 66 75 6c 6c 20 43 52 45 41 54   4. A full CREAT
24610 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
24620 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 74  t for an index t
24630 68 61 74 20 63 6f 75 6c 64 20 62 65 20 75 73 65  hat could be use
24640 64 20 74 6f 0a 20 20 2a 2a 20 20 20 20 6f 70 74  d to.  **    opt
24650 69 6d 69 7a 65 20 44 45 4c 45 54 45 20 6f 72 20  imize DELETE or 
24660 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
24670 73 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s on the parent 
24680 74 61 62 6c 65 2e 20 65 2e 67 2e 0a 20 20 2a 2a  table. e.g..  **
24690 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 43 52 45  .  **       "CRE
246a0 41 54 45 20 49 4e 44 45 58 20 63 68 69 6c 64 5f  ATE INDEX child_
246b0 74 61 62 6c 65 5f 63 68 69 6c 64 5f 6b 65 79 20  table_child_key 
246c0 4f 4e 20 63 68 69 6c 64 5f 74 61 62 6c 65 28 63  ON child_table(c
246d0 68 69 6c 64 5f 6b 65 79 29 22 0a 20 20 2a 2a 0a  hild_key)".  **.
246e0 20 20 2a 2a 20 35 2e 20 54 68 65 20 6e 61 6d 65    ** 5. The name
246f0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 74   of the parent t
24700 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
24710 54 68 65 73 65 20 73 69 78 20 76 61 6c 75 65 73  These six values
24720 20 61 72 65 20 75 73 65 64 20 62 79 20 74 68 65   are used by the
24730 20 43 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 74   C logic below t
24740 6f 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 72  o generate the r
24750 65 70 6f 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 6f  eport..  */.  co
24760 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
24770 0a 20 20 22 53 45 4c 45 43 54 20 22 0a 20 20 20  .  "SELECT ".   
24780 20 22 20 20 20 20 20 27 45 58 50 4c 41 49 4e 20   "     'EXPLAIN 
24790 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43  QUERY PLAN SELEC
247a0 54 20 31 20 46 52 4f 4d 20 27 20 7c 7c 20 71 75  T 1 FROM ' || qu
247b0 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27  ote(s.name) || '
247c0 20 57 48 45 52 45 20 27 22 0a 20 20 20 20 22 20   WHERE '".    " 
247d0 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74   || group_concat
247e0 28 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c  (quote(s.name) |
247f0 7c 20 27 2e 27 20 7c 7c 20 71 75 6f 74 65 28 66  | '.' || quote(f
24800 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 20 27 3d 3f 27  .[from]) || '=?'
24810 20 22 0a 20 20 20 20 22 20 20 7c 7c 20 66 6b 65   ".    "  || fke
24820 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65  y_collate_clause
24830 28 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 66  (".    "       f
24840 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41 4c 45 53  .[table], COALES
24850 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61  CE(f.[to], p.[na
24860 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e  me]), s.name, f.
24870 5b 66 72 6f 6d 5d 29 2c 27 20 41 4e 44 20 27 29  [from]),' AND ')
24880 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22  ".    ", ".    "
24890 20 20 20 20 20 27 53 45 41 52 43 48 20 54 41 42       'SEARCH TAB
248a0 4c 45 20 27 20 7c 7c 20 73 2e 6e 61 6d 65 20 7c  LE ' || s.name |
248b0 7c 20 27 20 55 53 49 4e 47 20 43 4f 56 45 52 49  | ' USING COVERI
248c0 4e 47 20 49 4e 44 45 58 2a 28 27 22 0a 20 20 20  NG INDEX*('".   
248d0 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e   "  || group_con
248e0 63 61 74 28 27 2a 3d 3f 27 2c 20 27 20 41 4e 44  cat('*=?', ' AND
248f0 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20   ') || ')'".    
24900 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 73  ", ".    "     s
24910 2e 6e 61 6d 65 20 20 7c 7c 20 27 28 27 20 7c 7c  .name  || '(' ||
24920 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66 2e   group_concat(f.
24930 5b 66 72 6f 6d 5d 2c 20 20 27 2c 20 27 29 20 7c  [from],  ', ') |
24940 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a  | ')'".    ", ".
24950 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74 61 62      "     f.[tab
24960 6c 65 5d 20 7c 7c 20 27 28 27 20 7c 7c 20 67 72  le] || '(' || gr
24970 6f 75 70 5f 63 6f 6e 63 61 74 28 43 4f 41 4c 45  oup_concat(COALE
24980 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e  SCE(f.[to], p.[n
24990 61 6d 65 5d 29 29 20 7c 7c 20 27 29 27 22 0a 20  ame])) || ')'". 
249a0 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20     ", ".    "   
249b0 20 20 27 43 52 45 41 54 45 20 49 4e 44 45 58 20    'CREATE INDEX 
249c0 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d  ' || quote(s.nam
249d0 65 20 7c 7c 27 5f 27 7c 7c 20 67 72 6f 75 70 5f  e ||'_'|| group_
249e0 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c  concat(f.[from],
249f0 20 27 5f 27 29 29 22 0a 20 20 20 20 22 20 20 7c   '_'))".    "  |
24a00 7c 20 27 20 4f 4e 20 27 20 7c 7c 20 71 75 6f 74  | ' ON ' || quot
24a10 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 28 27  e(s.name) || '('
24a20 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75  ".    "  || grou
24a30 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28 66  p_concat(quote(f
24a40 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 22 0a 20 20 20  .[from]) ||".   
24a50 20 22 20 20 20 20 20 20 20 20 66 6b 65 79 5f 63   "        fkey_c
24a60 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 22 0a  ollate_clause(".
24a70 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20 66      "          f
24a80 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41 4c 45 53  .[table], COALES
24a90 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61  CE(f.[to], p.[na
24aa0 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e  me]), s.name, f.
24ab0 5b 66 72 6f 6d 5d 29 2c 20 27 2c 20 27 29 22 0a  [from]), ', ')".
24ac0 20 20 20 20 22 20 20 7c 7c 20 27 29 3b 27 22 0a      "  || ');'".
24ad0 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20      ", ".    "  
24ae0 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20 22 0a 20     f.[table] ". 
24af0 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f     "FROM sqlite_
24b00 6d 61 73 74 65 72 20 41 53 20 73 2c 20 70 72 61  master AS s, pra
24b10 67 6d 61 5f 66 6f 72 65 69 67 6e 5f 6b 65 79 5f  gma_foreign_key_
24b20 6c 69 73 74 28 73 2e 6e 61 6d 65 29 20 41 53 20  list(s.name) AS 
24b30 66 20 22 0a 20 20 20 20 22 4c 45 46 54 20 4a 4f  f ".    "LEFT JO
24b40 49 4e 20 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f  IN pragma_table_
24b50 69 6e 66 6f 20 41 53 20 70 20 4f 4e 20 28 70 6b  info AS p ON (pk
24b60 2d 31 3d 73 65 71 20 41 4e 44 20 70 2e 61 72 67  -1=seq AND p.arg
24b70 3d 66 2e 5b 74 61 62 6c 65 5d 29 20 22 0a 20 20  =f.[table]) ".  
24b80 20 20 22 47 52 4f 55 50 20 42 59 20 73 2e 6e 61    "GROUP BY s.na
24b90 6d 65 2c 20 66 2e 69 64 20 22 0a 20 20 20 20 22  me, f.id ".    "
24ba0 4f 52 44 45 52 20 42 59 20 28 43 41 53 45 20 57  ORDER BY (CASE W
24bb0 48 45 4e 20 3f 20 54 48 45 4e 20 66 2e 5b 74 61  HEN ? THEN f.[ta
24bc0 62 6c 65 5d 20 45 4c 53 45 20 73 2e 6e 61 6d 65  ble] ELSE s.name
24bd0 20 45 4e 44 29 22 0a 20 20 3b 0a 20 20 63 6f 6e   END)".  ;.  con
24be0 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 49 50  st char *zGlobIP
24bf0 4b 20 3d 20 22 53 45 41 52 43 48 20 54 41 42 4c  K = "SEARCH TABL
24c00 45 20 2a 20 55 53 49 4e 47 20 49 4e 54 45 47 45  E * USING INTEGE
24c10 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 28 72  R PRIMARY KEY (r
24c20 6f 77 69 64 3d 3f 29 22 3b 0a 0a 20 20 66 6f 72  owid=?)";..  for
24c30 28 69 3d 32 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=2; i<nArg; i+
24c40 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  +){.    int n = 
24c50 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 69  strlen30(azArg[i
24c60 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 31 20  ]);.    if( n>1 
24c70 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  && sqlite3_strni
24c80 63 6d 70 28 22 2d 76 65 72 62 6f 73 65 22 2c 20  cmp("-verbose", 
24c90 61 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20  azArg[i], n)==0 
24ca0 29 7b 0a 20 20 20 20 20 20 62 56 65 72 62 6f 73  ){.      bVerbos
24cb0 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 1;.    }.   
24cc0 20 65 6c 73 65 20 69 66 28 20 6e 3e 31 20 26 26   else if( n>1 &&
24cd0 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
24ce0 70 28 22 2d 67 72 6f 75 70 62 79 70 61 72 65 6e  p("-groupbyparen
24cf0 74 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 6e 29  t", azArg[i], n)
24d00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 47 72  ==0 ){.      bGr
24d10 6f 75 70 42 79 50 61 72 65 6e 74 20 3d 20 31 3b  oupByParent = 1;
24d20 0a 20 20 20 20 20 20 7a 49 6e 64 65 6e 74 20 3d  .      zIndent =
24d30 20 22 20 20 20 20 22 3b 0a 20 20 20 20 7d 0a 20   "    ";.    }. 
24d40 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 72     else{.      r
24d50 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
24d60 2c 20 22 55 73 61 67 65 3a 20 25 73 20 25 73 20  , "Usage: %s %s 
24d70 3f 2d 76 65 72 62 6f 73 65 3f 20 3f 2d 67 72 6f  ?-verbose? ?-gro
24d80 75 70 62 79 70 61 72 65 6e 74 3f 5c 6e 22 2c 0a  upbyparent?\n",.
24d90 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
24da0 30 5d 2c 20 61 7a 41 72 67 5b 31 5d 0a 20 20 20  0], azArg[1].   
24db0 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75     );.      retu
24dc0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
24dd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
24de0 20 52 65 67 69 73 74 65 72 20 74 68 65 20 66 6b   Register the fk
24df0 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73  ey_collate_claus
24e00 65 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  e() SQL function
24e10 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
24e20 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
24e30 6f 6e 28 64 62 2c 20 22 66 6b 65 79 5f 63 6f 6c  on(db, "fkey_col
24e40 6c 61 74 65 5f 63 6c 61 75 73 65 22 2c 20 34 2c  late_clause", 4,
24e50 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
24e60 20 20 20 20 30 2c 20 73 68 65 6c 6c 46 6b 65 79      0, shellFkey
24e70 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65 2c 20 30  CollateClause, 0
24e80 2c 20 30 0a 20 20 29 3b 0a 0a 0a 20 20 69 66 28  , 0.  );...  if(
24e90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24ea0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
24eb0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
24ec0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 71  , zSql, -1, &pSq
24ed0 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  l, 0);.  }.  if(
24ee0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24ef0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
24f00 6e 64 5f 69 6e 74 28 70 53 71 6c 2c 20 31 2c 20  nd_int(pSql, 1, 
24f10 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 29 3b  bGroupByParent);
24f20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
24f30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24f40 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 63 68   int rc2;.    ch
24f50 61 72 20 2a 7a 50 72 65 76 20 3d 20 30 3b 0a 20  ar *zPrev = 0;. 
24f60 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45     while( SQLITE
24f70 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
24f80 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20 20 20  ep(pSql) ){.    
24f90 20 20 69 6e 74 20 72 65 73 20 3d 20 2d 31 3b 0a    int res = -1;.
24fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
24fb0 6d 74 20 2a 70 45 78 70 6c 61 69 6e 20 3d 20 30  mt *pExplain = 0
24fc0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
24fd0 61 72 20 2a 7a 45 51 50 20 3d 20 28 63 6f 6e 73  ar *zEQP = (cons
24fe0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
24ff0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
25000 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , 0);.      cons
25010 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 20 3d 20  t char *zGlob = 
25020 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
25030 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
25040 28 70 53 71 6c 2c 20 31 29 3b 0a 20 20 20 20 20  (pSql, 1);.     
25050 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 72   const char *zFr
25060 6f 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  om = (const char
25070 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
25080 5f 74 65 78 74 28 70 53 71 6c 2c 20 32 29 3b 0a  _text(pSql, 2);.
25090 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
250a0 20 2a 7a 54 61 72 67 65 74 20 3d 20 28 63 6f 6e   *zTarget = (con
250b0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
250c0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
250d0 6c 2c 20 33 29 3b 0a 20 20 20 20 20 20 63 6f 6e  l, 3);.      con
250e0 73 74 20 63 68 61 72 20 2a 7a 43 49 20 3d 20 28  st char *zCI = (
250f0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
25100 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
25110 70 53 71 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20  pSql, 4);.      
25120 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
25130 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ent = (const cha
25140 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
25150 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 35 29 3b  n_text(pSql, 5);
25160 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
25170 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
25180 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70  db, zEQP, -1, &p
25190 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20  Explain, 0);.   
251a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
251b0 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  E_OK ) break;.  
251c0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
251d0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
251e0 28 70 45 78 70 6c 61 69 6e 29 20 29 7b 0a 20 20  (pExplain) ){.  
251f0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
25200 20 2a 7a 50 6c 61 6e 20 3d 20 28 63 6f 6e 73 74   *zPlan = (const
25210 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
25220 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c  olumn_text(pExpl
25230 61 69 6e 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  ain, 3);.       
25240 20 72 65 73 20 3d 20 28 0a 20 20 20 20 20 20 20   res = (.       
25250 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65         0==sqlite
25260 33 5f 73 74 72 67 6c 6f 62 28 7a 47 6c 6f 62 2c  3_strglob(zGlob,
25270 20 7a 50 6c 61 6e 29 0a 20 20 20 20 20 20 20 20   zPlan).        
25280 20 20 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33     || 0==sqlite3
25290 5f 73 74 72 67 6c 6f 62 28 7a 47 6c 6f 62 49 50  _strglob(zGlobIP
252a0 4b 2c 20 7a 50 6c 61 6e 29 0a 20 20 20 20 20 20  K, zPlan).      
252b0 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
252c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
252d0 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69  finalize(pExplai
252e0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
252f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  !=SQLITE_OK ) br
25300 65 61 6b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  eak;..      if( 
25310 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  res<0 ){.       
25320 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
25330 72 72 2c 20 22 45 72 72 6f 72 3a 20 69 6e 74 65  rr, "Error: inte
25340 72 6e 61 6c 20 65 72 72 6f 72 22 29 3b 0a 20 20  rnal error");.  
25350 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25360 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25370 20 20 69 66 28 20 62 47 72 6f 75 70 42 79 50 61    if( bGroupByPa
25380 72 65 6e 74 0a 20 20 20 20 20 20 20 20 26 26 20  rent.        && 
25390 28 62 56 65 72 62 6f 73 65 20 7c 7c 20 72 65 73  (bVerbose || res
253a0 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 26 26 20  ==0).        && 
253b0 28 7a 50 72 65 76 3d 3d 30 20 7c 7c 20 73 71 6c  (zPrev==0 || sql
253c0 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 50 61  ite3_stricmp(zPa
253d0 72 65 6e 74 2c 20 7a 50 72 65 76 29 29 0a 20 20  rent, zPrev)).  
253e0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
253f0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
25400 74 2c 20 22 2d 2d 20 50 61 72 65 6e 74 20 74 61  t, "-- Parent ta
25410 62 6c 65 20 25 73 5c 6e 22 2c 20 7a 50 61 72 65  ble %s\n", zPare
25420 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  nt);.          s
25430 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72 65  qlite3_free(zPre
25440 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 50  v);.          zP
25450 72 65 76 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  rev = sqlite3_mp
25460 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 50 61 72  rintf("%s", zPar
25470 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ent);.        }.
25480 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73  .        if( res
25490 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
254a0 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
254b0 20 22 25 73 25 73 20 2d 2d 3e 20 25 73 5c 6e 22   "%s%s --> %s\n"
254c0 2c 20 7a 49 6e 64 65 6e 74 2c 20 7a 43 49 2c 20  , zIndent, zCI, 
254d0 7a 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20  zTarget);.      
254e0 20 20 7d 65 6c 73 65 20 69 66 28 20 62 56 65 72    }else if( bVer
254f0 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  bose ){.        
25500 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
25510 2c 20 22 25 73 2f 2a 20 6e 6f 20 65 78 74 72 61  , "%s/* no extra
25520 20 69 6e 64 65 78 65 73 20 72 65 71 75 69 72 65   indexes require
25530 64 20 66 6f 72 20 25 73 20 2d 3e 20 25 73 20 2a  d for %s -> %s *
25540 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  /\n",.          
25550 20 20 20 20 7a 49 6e 64 65 6e 74 2c 20 7a 46 72      zIndent, zFr
25560 6f 6d 2c 20 7a 54 61 72 67 65 74 0a 20 20 20 20  om, zTarget.    
25570 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
25580 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
25590 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
255a0 65 28 7a 50 72 65 76 29 3b 0a 0a 20 20 20 20 69  e(zPrev);..    i
255b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
255c0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
255d0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
255e0 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
255f0 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a  msg(db));.    }.
25600 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
25610 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 71 6c  e3_finalize(pSql
25620 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
25630 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 32 21  QLITE_OK && rc2!
25640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25650 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
25660 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
25670 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73  tderr, "%s\n", s
25680 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
25690 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ));.    }.  }els
256a0 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  e{.    raw_print
256b0 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22  f(stderr, "%s\n"
256c0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
256d0 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (db));.  }..  re
256e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
256f0 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
25700 20 6f 66 20 22 2e 6c 69 6e 74 22 20 64 6f 74 20   of ".lint" dot 
25710 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  command..*/.stat
25720 69 63 20 69 6e 74 20 6c 69 6e 74 44 6f 74 43 6f  ic int lintDotCo
25730 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74  mmand(.  ShellSt
25740 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20  ate *pState,    
25750 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
25760 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73  ent shell tool s
25770 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tate */.  char *
25780 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20  *azArg,         
25790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
257a0 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
257b0 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f  passed to dot co
257c0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  mmand */.  int n
257d0 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
257e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
257f0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
25800 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b  in azArg[] */.){
25810 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 6e 20 3d 20  .  int n;.  n = 
25820 28 6e 41 72 67 3e 3d 32 20 3f 20 73 74 72 6c 65  (nArg>=2 ? strle
25830 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29 20 3a 20  n30(azArg[1]) : 
25840 30 29 3b 0a 20 20 69 66 28 20 6e 3c 31 20 7c 7c  0);.  if( n<1 ||
25850 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
25860 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22 66 6b 65  p(azArg[1], "fke
25870 79 2d 69 6e 64 65 78 65 73 22 2c 20 6e 29 20 29  y-indexes", n) )
25880 20 67 6f 74 6f 20 75 73 61 67 65 3b 0a 20 20 72   goto usage;.  r
25890 65 74 75 72 6e 20 6c 69 6e 74 46 6b 65 79 49 6e  eturn lintFkeyIn
258a0 64 65 78 65 73 28 70 53 74 61 74 65 2c 20 61 7a  dexes(pState, az
258b0 41 72 67 2c 20 6e 41 72 67 29 3b 0a 0a 20 75 73  Arg, nArg);.. us
258c0 61 67 65 3a 0a 20 20 72 61 77 5f 70 72 69 6e 74  age:.  raw_print
258d0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
258e0 20 25 73 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 20   %s sub-command 
258f0 3f 73 77 69 74 63 68 65 73 2e 2e 2e 3f 5c 6e 22  ?switches...?\n"
25900 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 72  , azArg[0]);.  r
25910 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
25920 2c 20 22 57 68 65 72 65 20 73 75 62 2d 63 6f 6d  , "Where sub-com
25930 6d 61 6e 64 73 20 61 72 65 3a 5c 6e 22 29 3b 0a  mands are:\n");.
25940 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
25950 65 72 72 2c 20 22 20 20 20 20 66 6b 65 79 2d 69  err, "    fkey-i
25960 6e 64 65 78 65 73 5c 6e 22 29 3b 0a 20 20 72 65  ndexes\n");.  re
25970 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
25980 52 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  R;.}..#if !defin
25990 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
259a0 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
259b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
259c0 41 56 45 5f 5a 4c 49 42 29 0a 2f 2a 2a 2a 2a 2a  AVE_ZLIB)./*****
259d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
259e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
259f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
25a20 54 68 65 20 22 2e 61 72 63 68 69 76 65 22 20 6f  The ".archive" o
25a30 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e  r ".ar" command.
25a40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25a50 73 68 65 6c 6c 50 72 65 70 61 72 65 28 0a 20 20  shellPrepare(.  
25a60 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
25a70 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 63 6f 6e  int *pRc, .  con
25a80 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 0a  st char *zSql, .
25a90 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
25aa0 2a 70 70 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70  *ppStmt.){.  *pp
25ab0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Stmt = 0;.  if( 
25ac0 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
25ad0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
25ae0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
25af0 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v2(db, zSql, -1,
25b00 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   ppStmt, 0);.   
25b10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25b20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  OK ){.      raw_
25b30 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
25b40 73 71 6c 20 65 72 72 6f 72 3a 20 25 73 20 28 25  sql error: %s (%
25b50 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  d)\n", .        
25b60 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
25b70 28 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72  (db), sqlite3_er
25b80 72 63 6f 64 65 28 64 62 29 0a 20 20 20 20 20 20  rcode(db).      
25b90 29 3b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  );.      *pRc = 
25ba0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  rc;.    }.  }.}.
25bb0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
25bc0 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28  llPreparePrintf(
25bd0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
25be0 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20  .  int *pRc, .  
25bf0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
25c00 70 53 74 6d 74 2c 0a 20 20 63 6f 6e 73 74 20 63  pStmt,.  const c
25c10 68 61 72 20 2a 7a 46 6d 74 2c 20 0a 20 20 2e 2e  har *zFmt, .  ..
25c20 2e 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d  ..){.  *ppStmt =
25c30 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d   0;.  if( *pRc==
25c40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25c50 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20   va_list ap;.   
25c60 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 76 61   char *z;.    va
25c70 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
25c80 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  ;.    z = sqlite
25c90 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c  3_vmprintf(zFmt,
25ca0 20 61 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d   ap);.    if( z=
25cb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63  =0 ){.      *pRc
25cc0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
25cd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25ce0 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 64    shellPrepare(d
25cf0 62 2c 20 70 52 63 2c 20 7a 2c 20 70 70 53 74 6d  b, pRc, z, ppStm
25d00 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
25d10 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d  3_free(z);.    }
25d20 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
25d30 6f 69 64 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a  oid shellFinaliz
25d40 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a  e(.  int *pRc, .
25d50 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
25d60 70 53 74 6d 74 0a 29 7b 0a 20 20 69 66 28 20 70  pStmt.){.  if( p
25d70 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
25d80 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
25d90 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d  3_db_handle(pStm
25da0 74 29 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  t);.    int rc =
25db0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
25dc0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  e(pStmt);.    if
25dd0 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
25de0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  K ){.      if( r
25df0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
25e00 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
25e10 74 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 20  tf(stderr, "SQL 
25e20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  error: %s\n", sq
25e30 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
25e40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
25e50 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20   *pRc = rc;.    
25e60 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
25e70 76 6f 69 64 20 73 68 65 6c 6c 52 65 73 65 74 28  void shellReset(
25e80 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20  .  int *pRc, .  
25e90 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
25ea0 74 6d 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  tmt.){.  int rc 
25eb0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
25ec0 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 2a 70  pStmt);.  if( *p
25ed0 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
25ee0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
25ef0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25f00 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
25f10 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28  lite3_db_handle(
25f20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 61  pStmt);.      ra
25f30 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
25f40 20 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c   "SQL error: %s\
25f50 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
25f60 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20  sg(db));.    }. 
25f70 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20     *pRc = rc;.  
25f80 7d 0a 7d 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74  }.}./*.** Struct
25f90 75 72 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ure representing
25fa0 20 61 20 73 69 6e 67 6c 65 20 22 2e 61 72 22 20   a single ".ar" 
25fb0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 74 79 70 65  command..*/.type
25fc0 64 65 66 20 73 74 72 75 63 74 20 41 72 43 6f 6d  def struct ArCom
25fd0 6d 61 6e 64 20 41 72 43 6f 6d 6d 61 6e 64 3b 0a  mand ArCommand;.
25fe0 73 74 72 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64  struct ArCommand
25ff0 20 7b 0a 20 20 75 38 20 65 43 6d 64 3b 20 20 20   {.  u8 eCmd;   
26000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26010 20 20 20 20 20 2f 2a 20 41 6e 20 41 52 5f 43 4d       /* An AR_CM
26020 44 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 75  D_* value */.  u
26030 38 20 62 56 65 72 62 6f 73 65 3b 20 20 20 20 20  8 bVerbose;     
26040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26050 2a 20 54 72 75 65 20 69 66 20 2d 2d 76 65 72 62  * True if --verb
26060 6f 73 65 20 2a 2f 0a 20 20 75 38 20 62 5a 69 70  ose */.  u8 bZip
26070 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26080 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
26090 20 69 66 20 74 68 65 20 61 72 63 68 69 76 65 20   if the archive 
260a0 69 73 20 61 20 5a 49 50 20 2a 2f 0a 20 20 75 38  is a ZIP */.  u8
260b0 20 62 44 72 79 52 75 6e 3b 20 20 20 20 20 20 20   bDryRun;       
260c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
260d0 20 54 72 75 65 20 69 66 20 2d 2d 64 72 79 2d 72   True if --dry-r
260e0 75 6e 20 2a 2f 0a 20 20 75 38 20 62 41 70 70 65  un */.  u8 bAppe
260f0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
26100 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
26110 69 66 20 2d 2d 61 70 70 65 6e 64 20 2a 2f 0a 20  if --append */. 
26120 20 75 38 20 66 72 6f 6d 43 6d 64 4c 69 6e 65 3b   u8 fromCmdLine;
26130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26140 20 2f 2a 20 52 75 6e 20 66 72 6f 6d 20 2d 41 20   /* Run from -A 
26150 69 6e 73 74 65 61 64 20 6f 66 20 2e 61 72 63 68  instead of .arch
26160 69 76 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ive */.  int nAr
26170 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
26180 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
26190 65 72 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72  er of command ar
261a0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
261b0 72 20 2a 7a 53 72 63 54 61 62 6c 65 3b 20 20 20  r *zSrcTable;   
261c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
261d0 22 73 71 6c 61 72 22 2c 20 22 7a 69 70 66 69 6c  "sqlar", "zipfil
261e0 65 28 24 66 69 6c 65 29 22 20 6f 72 20 22 7a 69  e($file)" or "zi
261f0 70 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  p" */.  const ch
26200 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20  ar *zFile;      
26210 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 66 69 6c          /* --fil
26220 65 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e  e argument, or N
26230 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
26240 68 61 72 20 2a 7a 44 69 72 3b 20 20 20 20 20 20  har *zDir;      
26250 20 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 64 69           /* --di
26260 72 65 63 74 6f 72 79 20 61 72 67 75 6d 65 6e 74  rectory argument
26270 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
26280 68 61 72 20 2a 2a 61 7a 41 72 67 3b 20 20 20 20  har **azArg;    
26290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
262a0 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6d 6d 61  * Array of comma
262b0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
262c0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 3b    ShellState *p;
262d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262e0 20 20 2f 2a 20 53 68 65 6c 6c 20 73 74 61 74 65    /* Shell state
262f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
26300 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
26310 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
26320 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
26330 20 61 72 63 68 69 76 65 20 2a 2f 0a 7d 3b 0a 0a   archive */.};..
26340 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 75 73  /*.** Print a us
26350 61 67 65 20 6d 65 73 73 61 67 65 20 66 6f 72 20  age message for 
26360 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20  the .ar command 
26370 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65  to stderr and re
26380 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
26390 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  R..*/.static int
263a0 20 61 72 55 73 61 67 65 28 46 49 4c 45 20 2a 66   arUsage(FILE *f
263b0 29 7b 0a 20 20 73 68 6f 77 48 65 6c 70 28 66 2c  ){.  showHelp(f,
263c0 22 61 72 63 68 69 76 65 22 29 3b 0a 20 20 72 65  "archive");.  re
263d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
263e0 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  R;.}../*.** Prin
263f0 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  t an error messa
26400 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72 20 63  ge for the .ar c
26410 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65 72 72  ommand to stderr
26420 20 61 6e 64 20 72 65 74 75 72 6e 20 0a 2a 2a 20   and return .** 
26430 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
26440 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 72  .static int arEr
26450 72 6f 72 4d 73 67 28 41 72 43 6f 6d 6d 61 6e 64  rorMsg(ArCommand
26460 20 2a 70 41 72 2c 20 63 6f 6e 73 74 20 63 68 61   *pAr, const cha
26470 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20  r *zFmt, ...){. 
26480 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
26490 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 73 74 61  har *z;.  va_sta
264a0 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20  rt(ap, zFmt);.  
264b0 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  z = sqlite3_vmpr
264c0 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a  intf(zFmt, ap);.
264d0 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
264e0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
264f0 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
26500 22 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 41 72  ", z);.  if( pAr
26510 2d 3e 66 72 6f 6d 43 6d 64 4c 69 6e 65 20 29 7b  ->fromCmdLine ){
26520 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
26530 28 73 74 64 65 72 72 2c 20 22 55 73 65 20 5c 22  (stderr, "Use \"
26540 2d 41 5c 22 20 66 6f 72 20 6d 6f 72 65 20 68 65  -A\" for more he
26550 6c 70 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  lp\n");.  }else{
26560 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
26570 28 73 74 64 65 72 72 2c 20 22 55 73 65 20 5c 22  (stderr, "Use \"
26580 2e 61 72 63 68 69 76 65 20 2d 2d 68 65 6c 70 5c  .archive --help\
26590 22 20 66 6f 72 20 6d 6f 72 65 20 68 65 6c 70 5c  " for more help\
265a0 6e 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n");.  }.  sqlit
265b0 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
265c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
265d0 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75  R;.}../*.** Valu
265e0 65 73 20 66 6f 72 20 41 72 43 6f 6d 6d 61 6e 64  es for ArCommand
265f0 2e 65 43 6d 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e  .eCmd..*/.#defin
26600 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 20  e AR_CMD_CREATE 
26610 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
26620 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 20 20  AR_CMD_EXTRACT  
26630 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 41 52      2.#define AR
26640 5f 43 4d 44 5f 4c 49 53 54 20 20 20 20 20 20 20  _CMD_LIST       
26650 20 20 33 0a 23 64 65 66 69 6e 65 20 41 52 5f 43    3.#define AR_C
26660 4d 44 5f 55 50 44 41 54 45 20 20 20 20 20 20 20  MD_UPDATE       
26670 34 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44  4.#define AR_CMD
26680 5f 48 45 4c 50 20 20 20 20 20 20 20 20 20 35 0a  _HELP         5.
26690 0a 2f 2a 0a 2a 2a 20 4f 74 68 65 72 20 28 6e 6f  ./*.** Other (no
266a0 6e 2d 63 6f 6d 6d 61 6e 64 29 20 73 77 69 74 63  n-command) switc
266b0 68 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  hes..*/.#define 
266c0 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53  AR_SWITCH_VERBOS
266d0 45 20 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20  E     6.#define 
266e0 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 20 20  AR_SWITCH_FILE  
266f0 20 20 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20        7.#define 
26700 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54  AR_SWITCH_DIRECT
26710 4f 52 59 20 20 20 38 0a 23 64 65 66 69 6e 65 20  ORY   8.#define 
26720 41 52 5f 53 57 49 54 43 48 5f 41 50 50 45 4e 44  AR_SWITCH_APPEND
26730 20 20 20 20 20 20 39 0a 23 64 65 66 69 6e 65 20        9.#define 
26740 41 52 5f 53 57 49 54 43 48 5f 44 52 59 52 55 4e  AR_SWITCH_DRYRUN
26750 20 20 20 20 20 31 30 0a 0a 73 74 61 74 69 63 20       10..static 
26760 69 6e 74 20 61 72 50 72 6f 63 65 73 73 53 77 69  int arProcessSwi
26770 74 63 68 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  tch(ArCommand *p
26780 41 72 2c 20 69 6e 74 20 65 53 77 69 74 63 68 2c  Ar, int eSwitch,
26790 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
267a0 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65 53  g){.  switch( eS
267b0 77 69 74 63 68 20 29 7b 0a 20 20 20 20 63 61 73  witch ){.    cas
267c0 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 3a  e AR_CMD_CREATE:
267d0 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44  .    case AR_CMD
267e0 5f 45 58 54 52 41 43 54 3a 0a 20 20 20 20 63 61  _EXTRACT:.    ca
267f0 73 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a  se AR_CMD_LIST:.
26800 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
26810 55 50 44 41 54 45 3a 0a 20 20 20 20 63 61 73 65  UPDATE:.    case
26820 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20   AR_CMD_HELP:.  
26830 20 20 20 20 69 66 28 20 70 41 72 2d 3e 65 43 6d      if( pAr->eCm
26840 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  d ){.        ret
26850 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70  urn arErrorMsg(p
26860 41 72 2c 20 22 6d 75 6c 74 69 70 6c 65 20 63 6f  Ar, "multiple co
26870 6d 6d 61 6e 64 20 6f 70 74 69 6f 6e 73 22 29 3b  mmand options");
26880 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
26890 41 72 2d 3e 65 43 6d 64 20 3d 20 65 53 77 69 74  Ar->eCmd = eSwit
268a0 63 68 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ch;.      break;
268b0 0a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57  ..    case AR_SW
268c0 49 54 43 48 5f 44 52 59 52 55 4e 3a 0a 20 20 20  ITCH_DRYRUN:.   
268d0 20 20 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20     pAr->bDryRun 
268e0 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
268f0 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57  ;.    case AR_SW
26900 49 54 43 48 5f 56 45 52 42 4f 53 45 3a 0a 20 20  ITCH_VERBOSE:.  
26910 20 20 20 20 70 41 72 2d 3e 62 56 65 72 62 6f 73      pAr->bVerbos
26920 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  e = 1;.      bre
26930 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f  ak;.    case AR_
26940 53 57 49 54 43 48 5f 41 50 50 45 4e 44 3a 0a 20  SWITCH_APPEND:. 
26950 20 20 20 20 20 70 41 72 2d 3e 62 41 70 70 65 6e       pAr->bAppen
26960 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20  d = 1;.      /* 
26970 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 2d  Fall thru into -
26980 2d 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73  -file */.    cas
26990 65 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45  e AR_SWITCH_FILE
269a0 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a 46 69  :.      pAr->zFi
269b0 6c 65 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20  le = zArg;.     
269c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
269d0 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43   AR_SWITCH_DIREC
269e0 54 4f 52 59 3a 0a 20 20 20 20 20 20 70 41 72 2d  TORY:.      pAr-
269f0 3e 7a 44 69 72 20 3d 20 7a 41 72 67 3b 0a 20 20  >zDir = zArg;.  
26a00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
26a10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26a20 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  OK;.}../*.** Par
26a30 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  se the command l
26a40 69 6e 65 20 66 6f 72 20 61 6e 20 22 2e 61 72 22  ine for an ".ar"
26a50 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 65 20 72 65   command. The re
26a60 73 75 6c 74 73 20 61 72 65 20 77 72 69 74 74 65  sults are writte
26a70 6e 20 69 6e 74 6f 0a 2a 2a 20 73 74 72 75 63 74  n into.** struct
26a80 75 72 65 20 28 2a 70 41 72 29 2e 20 53 51 4c 49  ure (*pAr). SQLI
26a90 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
26aa0 64 20 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64  d if the command
26ab0 20 6c 69 6e 65 20 69 73 20 70 61 72 73 65 64 0a   line is parsed.
26ac0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ** successfully,
26ad0 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
26ae0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77  ror message is w
26af0 72 69 74 74 65 6e 20 74 6f 20 73 74 64 65 72 72  ritten to stderr
26b00 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f   and .** SQLITE_
26b10 45 52 52 4f 52 20 72 65 74 75 72 6e 65 64 2e 0a  ERROR returned..
26b20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
26b30 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28 0a 20 20  ParseCommand(.  
26b40 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20  char **azArg,   
26b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b60 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75  /* Array of argu
26b70 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
26b80 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  dot command */. 
26b90 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
26bc0 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d  tries in azArg[]
26bd0 20 2a 2f 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20   */.  ArCommand 
26be0 2a 70 41 72 20 20 20 20 20 20 20 20 20 20 20 20  *pAr            
26bf0 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74        /* Populat
26c00 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  e this object */
26c10 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 41 72 53  .){.  struct ArS
26c20 77 69 74 63 68 20 7b 0a 20 20 20 20 63 6f 6e 73  witch {.    cons
26c30 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 3b 0a 20  t char *zLong;. 
26c40 20 20 20 63 68 61 72 20 63 53 68 6f 72 74 3b 0a     char cShort;.
26c50 20 20 20 20 75 38 20 65 53 77 69 74 63 68 3b 0a      u8 eSwitch;.
26c60 20 20 20 20 75 38 20 62 41 72 67 3b 0a 20 20 7d      u8 bArg;.  }
26c70 20 61 53 77 69 74 63 68 5b 5d 20 3d 20 7b 0a 20   aSwitch[] = {. 
26c80 20 20 20 7b 20 22 63 72 65 61 74 65 22 2c 20 20     { "create",  
26c90 20 20 27 63 27 2c 20 41 52 5f 43 4d 44 5f 43 52    'c', AR_CMD_CR
26ca0 45 41 54 45 2c 20 20 20 20 20 20 20 30 20 7d 2c  EATE,       0 },
26cb0 0a 20 20 20 20 7b 20 22 65 78 74 72 61 63 74 22  .    { "extract"
26cc0 2c 20 20 20 27 78 27 2c 20 41 52 5f 43 4d 44 5f  ,   'x', AR_CMD_
26cd0 45 58 54 52 41 43 54 2c 20 20 20 20 20 20 30 20  EXTRACT,      0 
26ce0 7d 2c 0a 20 20 20 20 7b 20 22 6c 69 73 74 22 2c  },.    { "list",
26cf0 20 20 20 20 20 20 27 74 27 2c 20 41 52 5f 43 4d        't', AR_CM
26d00 44 5f 4c 49 53 54 2c 20 20 20 20 20 20 20 20 20  D_LIST,         
26d10 30 20 7d 2c 0a 20 20 20 20 7b 20 22 75 70 64 61  0 },.    { "upda
26d20 74 65 22 2c 20 20 20 20 27 75 27 2c 20 41 52 5f  te",    'u', AR_
26d30 43 4d 44 5f 55 50 44 41 54 45 2c 20 20 20 20 20  CMD_UPDATE,     
26d40 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 68 65    0 },.    { "he
26d50 6c 70 22 2c 20 20 20 20 20 20 27 68 27 2c 20 41  lp",      'h', A
26d60 52 5f 43 4d 44 5f 48 45 4c 50 2c 20 20 20 20 20  R_CMD_HELP,     
26d70 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22      0 },.    { "
26d80 76 65 72 62 6f 73 65 22 2c 20 20 20 27 76 27 2c  verbose",   'v',
26d90 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f   AR_SWITCH_VERBO
26da0 53 45 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b  SE,   0 },.    {
26db0 20 22 66 69 6c 65 22 2c 20 20 20 20 20 20 27 66   "file",      'f
26dc0 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c  ', AR_SWITCH_FIL
26dd0 45 2c 20 20 20 20 20 20 31 20 7d 2c 0a 20 20 20  E,      1 },.   
26de0 20 7b 20 22 61 70 70 65 6e 64 22 2c 20 20 20 20   { "append",    
26df0 27 61 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 41  'a', AR_SWITCH_A
26e00 50 50 45 4e 44 2c 20 20 20 20 31 20 7d 2c 0a 20  PPEND,    1 },. 
26e10 20 20 20 7b 20 22 64 69 72 65 63 74 6f 72 79 22     { "directory"
26e20 2c 20 27 43 27 2c 20 41 52 5f 53 57 49 54 43 48  , 'C', AR_SWITCH
26e30 5f 44 49 52 45 43 54 4f 52 59 2c 20 31 20 7d 2c  _DIRECTORY, 1 },
26e40 0a 20 20 20 20 7b 20 22 64 72 79 72 75 6e 22 2c  .    { "dryrun",
26e50 20 20 20 20 27 6e 27 2c 20 41 52 5f 53 57 49 54      'n', AR_SWIT
26e60 43 48 5f 44 52 59 52 55 4e 2c 20 20 20 20 30 20  CH_DRYRUN,    0 
26e70 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 6e 53  },.  };.  int nS
26e80 77 69 74 63 68 20 3d 20 73 69 7a 65 6f 66 28 61  witch = sizeof(a
26e90 53 77 69 74 63 68 29 20 2f 20 73 69 7a 65 6f 66  Switch) / sizeof
26ea0 28 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68  (struct ArSwitch
26eb0 29 3b 0a 20 20 73 74 72 75 63 74 20 41 72 53 77  );.  struct ArSw
26ec0 69 74 63 68 20 2a 70 45 6e 64 20 3d 20 26 61 53  itch *pEnd = &aS
26ed0 77 69 74 63 68 5b 6e 53 77 69 74 63 68 5d 3b 0a  witch[nSwitch];.
26ee0 0a 20 20 69 66 28 20 6e 41 72 67 3c 3d 31 20 29  .  if( nArg<=1 )
26ef0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
26f00 66 28 73 74 64 65 72 72 2c 20 22 57 72 6f 6e 67  f(stderr, "Wrong
26f10 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
26f20 65 6e 74 73 2e 20 20 55 73 61 67 65 3a 5c 6e 22  ents.  Usage:\n"
26f30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 72  );.    return ar
26f40 55 73 61 67 65 28 73 74 64 65 72 72 29 3b 0a 20  Usage(stderr);. 
26f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
26f60 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a   *z = azArg[1];.
26f70 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d      if( z[0]!='-
26f80 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  ' ){.      /* Tr
26f90 61 64 69 74 69 6f 6e 61 6c 20 73 74 79 6c 65 20  aditional style 
26fa0 5b 74 61 72 5d 20 69 6e 76 6f 63 61 74 69 6f 6e  [tar] invocation
26fb0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
26fc0 0a 20 20 20 20 20 20 69 6e 74 20 69 41 72 67 20  .      int iArg 
26fd0 3d 20 32 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  = 2;.      for(i
26fe0 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
26ff0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
27000 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20 20  ar *zArg = 0;.  
27010 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53        struct ArS
27020 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20  witch *pOpt;.   
27030 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26 61       for(pOpt=&a
27040 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c  Switch[0]; pOpt<
27050 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20  pEnd; pOpt++){. 
27060 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69           if( z[i
27070 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74 20  ]==pOpt->cShort 
27080 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
27090 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
270a0 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20  Opt==pEnd ){.   
270b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
270c0 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 75  ErrorMsg(pAr, "u
270d0 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69  nrecognized opti
270e0 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b 0a  on: %c", z[i]);.
270f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27100 20 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67    if( pOpt->bArg
27110 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
27120 28 20 69 41 72 67 3e 3d 6e 41 72 67 20 29 7b 0a  ( iArg>=nArg ){.
27130 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
27140 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41  rn arErrorMsg(pA
27150 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69  r, "option requi
27160 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a  res an argument:
27170 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20   %c",z[i]);.    
27180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27190 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 69    zArg = azArg[i
271a0 41 72 67 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20  Arg++];.        
271b0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 72  }.        if( ar
271c0 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70 41  ProcessSwitch(pA
271d0 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63 68  r, pOpt->eSwitch
271e0 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75 72 6e  , zArg) ) return
271f0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
27200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 72       }.      pAr
27210 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41  ->nArg = nArg-iA
27220 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  rg;.      if( pA
27230 72 2d 3e 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20  r->nArg>0 ){.   
27240 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20       pAr->azArg 
27250 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a  = &azArg[iArg];.
27260 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
27270 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d  e{.      /* Non-
27280 74 72 61 64 69 74 69 6f 6e 61 6c 20 69 6e 76 6f  traditional invo
27290 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  cation */.      
272a0 69 6e 74 20 69 41 72 67 3b 0a 20 20 20 20 20 20  int iArg;.      
272b0 66 6f 72 28 69 41 72 67 3d 31 3b 20 69 41 72 67  for(iArg=1; iArg
272c0 3c 6e 41 72 67 3b 20 69 41 72 67 2b 2b 29 7b 0a  <nArg; iArg++){.
272d0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20          int n;. 
272e0 20 20 20 20 20 20 20 7a 20 3d 20 61 7a 41 72 67         z = azArg
272f0 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iArg];.        
27300 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b  if( z[0]!='-' ){
27310 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  .          /* Al
27320 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d  l remaining comm
27330 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 20 61  and line words a
27340 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  re command argum
27350 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ents. */.       
27360 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20     pAr->azArg = 
27370 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20  &azArg[iArg];.  
27380 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72          pAr->nAr
27390 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20  g = nArg-iArg;. 
273a0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
273b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
273c0 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a    n = strlen30(z
273d0 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  );..        if( 
273e0 7a 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20  z[1]!='-' ){.   
273f0 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
27400 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
27410 72 20 6d 6f 72 65 20 73 68 6f 72 74 20 6f 70 74  r more short opt
27420 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ions */.        
27430 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b 20    for(i=1; i<n; 
27440 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
27450 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
27460 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rg = 0;.        
27470 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77 69      struct ArSwi
27480 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20 20  tch *pOpt;.     
27490 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d         for(pOpt=
274a0 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70  &aSwitch[0]; pOp
274b0 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b  t<pEnd; pOpt++){
274c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
274d0 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63  f( z[i]==pOpt->c
274e0 53 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20  Short ) break;. 
274f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27500 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
27510 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  t==pEnd ){.     
27520 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
27530 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20  arErrorMsg(pAr, 
27540 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70  "unrecognized op
27550 74 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29  tion: %c", z[i])
27560 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
27570 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
27580 70 4f 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20  pOpt->bArg ){.  
27590 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
275a0 69 3c 28 6e 2d 31 29 20 29 7b 0a 20 20 20 20 20  i<(n-1) ){.     
275b0 20 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20             zArg 
275c0 3d 20 26 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20 20  = &z[i+1];.     
275d0 20 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e             i = n
275e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
275f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
27600 20 20 20 20 20 20 20 69 66 28 20 69 41 72 67 3e         if( iArg>
27610 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20  =(nArg-1) ){.   
27620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
27630 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
27640 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65  (pAr, "option re
27650 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65  quires an argume
27660 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20  nt: %c",z[i]);. 
27670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
27680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27690 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 2b 2b   zArg = azArg[++
276a0 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 20  iArg];.         
276b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
276c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
276d0 20 69 66 28 20 61 72 50 72 6f 63 65 73 73 53 77   if( arProcessSw
276e0 69 74 63 68 28 70 41 72 2c 20 70 4f 70 74 2d 3e  itch(pAr, pOpt->
276f0 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20 29  eSwitch, zArg) )
27700 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
27710 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
27720 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
27730 69 66 28 20 7a 5b 32 5d 3d 3d 27 5c 30 27 20 29  if( z[2]=='\0' )
27740 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
27750 20 2d 2d 20 6f 70 74 69 6f 6e 2c 20 69 6e 64 69   -- option, indi
27760 63 61 74 69 6e 67 20 74 68 61 74 20 61 6c 6c 20  cating that all 
27770 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e  remaining comman
27780 64 20 6c 69 6e 65 20 77 6f 72 64 73 0a 20 20 20  d line words.   
27790 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 63 6f         ** are co
277a0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e  mmand arguments.
277b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
277c0 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41  Ar->azArg = &azA
277d0 72 67 5b 69 41 72 67 2b 31 5d 3b 0a 20 20 20 20  rg[iArg+1];.    
277e0 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67 20        pAr->nArg 
277f0 3d 20 6e 41 72 67 2d 69 41 72 67 2d 31 3b 0a 20  = nArg-iArg-1;. 
27800 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
27810 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
27820 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c 6f           /* A lo
27830 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  ng option */.   
27840 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
27850 72 20 2a 7a 41 72 67 20 3d 20 30 3b 20 20 20 20  r *zArg = 0;    
27860 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
27870 6d 65 6e 74 20 66 6f 72 20 6f 70 74 69 6f 6e 2c  ment for option,
27880 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20 20 20   if any */.     
27890 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77       struct ArSw
278a0 69 74 63 68 20 2a 70 4d 61 74 63 68 20 3d 20 30  itch *pMatch = 0
278b0 3b 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69  ;      /* Matchi
278c0 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  ng option */.   
278d0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72         struct Ar
278e0 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 20 20 20  Switch *pOpt;   
278f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
27900 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ator */.        
27910 20 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77 69    for(pOpt=&aSwi
27920 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e  tch[0]; pOpt<pEn
27930 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20  d; pOpt++){.    
27940 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
27950 61 72 20 2a 7a 4c 6f 6e 67 20 3d 20 70 4f 70 74  ar *zLong = pOpt
27960 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20 20 20 20 20 20  ->zLong;.       
27970 20 20 20 20 20 69 66 28 20 28 6e 2d 32 29 3c 3d       if( (n-2)<=
27980 73 74 72 6c 65 6e 33 30 28 7a 4c 6f 6e 67 29 20  strlen30(zLong) 
27990 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 26 7a 5b  && 0==memcmp(&z[
279a0 32 5d 2c 20 7a 4c 6f 6e 67 2c 20 6e 2d 32 29 20  2], zLong, n-2) 
279b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
279c0 20 69 66 28 20 70 4d 61 74 63 68 20 29 7b 0a 20   if( pMatch ){. 
279d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
279e0 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
279f0 28 70 41 72 2c 20 22 61 6d 62 69 67 75 6f 75 73  (pAr, "ambiguous
27a00 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 7a 29 3b   option: %s",z);
27a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
27a20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
27a30 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70        pMatch = p
27a40 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Opt;.           
27a50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
27a60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a   }.          }..
27a70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d            if( pM
27a80 61 74 63 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  atch==0 ){.     
27a90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
27aa0 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 75  ErrorMsg(pAr, "u
27ab0 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69  nrecognized opti
27ac0 6f 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20  on: %s", z);.   
27ad0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27ae0 20 20 20 69 66 28 20 70 4d 61 74 63 68 2d 3e 62     if( pMatch->b
27af0 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Arg ){.         
27b00 20 20 20 69 66 28 20 69 41 72 67 3e 3d 28 6e 41     if( iArg>=(nA
27b10 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  rg-1) ){.       
27b20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
27b30 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 6f  ErrorMsg(pAr, "o
27b40 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61  ption requires a
27b50 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 22 2c  n argument: %s",
27b60 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   z);.           
27b70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a   }.            z
27b80 41 72 67 20 3d 20 61 7a 41 72 67 5b 2b 2b 69 41  Arg = azArg[++iA
27b90 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rg];.          }
27ba0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
27bb0 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70  rProcessSwitch(p
27bc0 41 72 2c 20 70 4d 61 74 63 68 2d 3e 65 53 77 69  Ar, pMatch->eSwi
27bd0 74 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74  tch, zArg) ) ret
27be0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
27bf0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27c00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
27c10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27c20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
27c30 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
27c40 73 20 74 68 61 74 20 61 6c 6c 20 61 72 67 75 6d  s that all argum
27c50 65 6e 74 73 20 77 69 74 68 69 6e 20 74 68 65 20  ents within the 
27c60 41 72 43 6f 6d 6d 61 6e 64 2e 61 7a 41 72 67 5b  ArCommand.azArg[
27c70 5d 0a 2a 2a 20 61 72 72 61 79 20 72 65 66 65 72  ].** array refer
27c80 20 74 6f 20 61 72 63 68 69 76 65 20 6d 65 6d 62   to archive memb
27c90 65 72 73 2c 20 61 73 20 66 6f 72 20 74 68 65 20  ers, as for the 
27ca0 2d 2d 65 78 74 72 61 63 74 20 6f 72 20 2d 2d 6c  --extract or --l
27cb0 69 73 74 20 63 6f 6d 6d 61 6e 64 73 2e 20 0a 2a  ist commands. .*
27cc0 2a 20 49 74 20 63 68 65 63 6b 73 20 74 68 61 74  * It checks that
27cd0 20 65 61 63 68 20 6f 66 20 74 68 65 6d 20 61 72   each of them ar
27ce0 65 20 70 72 65 73 65 6e 74 2e 20 49 66 20 61 6e  e present. If an
27cf0 79 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  y specified file
27d00 20 69 73 20 6e 6f 74 0a 2a 2a 20 70 72 65 73 65   is not.** prese
27d10 6e 74 20 69 6e 20 74 68 65 20 61 72 63 68 69 76  nt in the archiv
27d20 65 2c 20 61 6e 20 65 72 72 6f 72 20 69 73 20 70  e, an error is p
27d30 72 69 6e 74 65 64 20 74 6f 20 73 74 64 65 72 72  rinted to stderr
27d40 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 0a 2a 2a   and an error.**
27d50 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20   code returned. 
27d60 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c  Otherwise, if al
27d70 6c 20 73 70 65 63 69 66 69 65 64 20 61 72 67 75  l specified argu
27d80 6d 65 6e 74 73 20 61 72 65 20 70 72 65 73 65 6e  ments are presen
27d90 74 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72 63 68  t in.** the arch
27da0 69 76 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ive, SQLITE_OK i
27db0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
27dc0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
27dd0 73 74 72 69 70 73 20 61 6e 79 20 74 72 61 69 6c  strips any trail
27de0 69 6e 67 20 27 2f 27 20 63 68 61 72 61 63 74 65  ing '/' characte
27df0 72 73 20 66 72 6f 6d 20 65 61 63 68 20 61 72 67  rs from each arg
27e00 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 69  ument..** This i
27e10 73 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74  s consistent wit
27e20 68 20 74 68 65 20 77 61 79 20 74 68 65 20 5b 74  h the way the [t
27e30 61 72 5d 20 63 6f 6d 6d 61 6e 64 20 73 65 65 6d  ar] command seem
27e40 73 20 74 6f 20 77 6f 72 6b 20 6f 6e 0a 2a 2a 20  s to work on.** 
27e50 4c 69 6e 75 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  Linux..*/.static
27e60 20 69 6e 74 20 61 72 43 68 65 63 6b 45 6e 74 72   int arCheckEntr
27e70 69 65 73 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  ies(ArCommand *p
27e80 41 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Ar){.  int rc = 
27e90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
27ea0 20 70 41 72 2d 3e 6e 41 72 67 20 29 7b 0a 20 20   pAr->nArg ){.  
27eb0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
27ec0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54  sqlite3_stmt *pT
27ed0 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 73 68  est = 0;..    sh
27ee0 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66  ellPreparePrintf
27ef0 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26  (pAr->db, &rc, &
27f00 70 54 65 73 74 2c 0a 20 20 20 20 20 20 20 20 22  pTest,.        "
27f10 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
27f20 20 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 24   %s WHERE name=$
27f30 6e 61 6d 65 22 2c 20 0a 20 20 20 20 20 20 20 20  name", .        
27f40 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 0a 20  pAr->zSrcTable. 
27f50 20 20 20 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71     );.    j = sq
27f60 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
27f70 65 74 65 72 5f 69 6e 64 65 78 28 70 54 65 73 74  eter_index(pTest
27f80 2c 20 22 24 6e 61 6d 65 22 29 3b 0a 20 20 20 20  , "$name");.    
27f90 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e  for(i=0; i<pAr->
27fa0 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c 49  nArg && rc==SQLI
27fb0 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
27fc0 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72     char *z = pAr
27fd0 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  ->azArg[i];.    
27fe0 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
27ff0 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 69 6e 74  30(z);.      int
28000 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20   bOk = 0;.      
28010 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b  while( n>0 && z[
28020 6e 2d 31 5d 3d 3d 27 2f 27 20 29 20 6e 2d 2d 3b  n-1]=='/' ) n--;
28030 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 27 5c  .      z[n] = '\
28040 30 27 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0';.      sqlite
28050 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 54 65 73  3_bind_text(pTes
28060 74 2c 20 6a 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c  t, j, z, -1, SQL
28070 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
28080 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
28090 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
280a0 70 54 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pTest) ){.      
280b0 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20    bOk = 1;.     
280c0 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65   }.      shellRe
280d0 73 65 74 28 26 72 63 2c 20 70 54 65 73 74 29 3b  set(&rc, pTest);
280e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
280f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d  QLITE_OK && bOk=
28100 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  =0 ){.        ut
28110 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
28120 2c 20 22 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20  , "not found in 
28130 61 72 63 68 69 76 65 3a 20 25 73 5c 6e 22 2c 20  archive: %s\n", 
28140 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  z);.        rc =
28150 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
28160 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
28170 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26   shellFinalize(&
28180 72 63 2c 20 70 54 65 73 74 29 3b 0a 20 20 7d 0a  rc, pTest);.  }.
28190 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
281a0 2f 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 61 20 57  /*.** Format a W
281b0 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
281c0 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 67 61   can be used aga
281d0 69 6e 73 74 20 74 68 65 20 22 73 71 6c 61 72 22  inst the "sqlar"
281e0 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 69 64 65   table to.** ide
281f0 6e 74 69 66 79 20 61 6c 6c 20 61 72 63 68 69 76  ntify all archiv
28200 65 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 6d  e members that m
28210 61 74 63 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64  atch the command
28220 20 61 72 67 75 6d 65 6e 74 73 20 68 65 6c 64 0a   arguments held.
28230 2a 2a 20 69 6e 20 28 2a 70 41 72 29 2e 20 4c 65  ** in (*pAr). Le
28240 61 76 65 20 74 68 69 73 20 57 48 45 52 45 20 63  ave this WHERE c
28250 6c 61 75 73 65 20 69 6e 20 28 2a 70 7a 57 68 65  lause in (*pzWhe
28260 72 65 29 20 62 65 66 6f 72 65 20 72 65 74 75 72  re) before retur
28270 6e 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 61 6c  ning..** The cal
28280 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
28290 6c 65 20 66 6f 72 20 65 76 65 6e 74 75 61 6c 6c  le for eventuall
282a0 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
282b0 33 5f 66 72 65 65 28 29 20 6f 6e 0a 2a 2a 20 61  3_free() on.** a
282c0 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c 20 28 2a 70 7a  ny non-NULL (*pz
282d0 57 68 65 72 65 29 20 76 61 6c 75 65 2e 0a 2a 2f  Where) value..*/
282e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 72 57  .static void arW
282f0 68 65 72 65 43 6c 61 75 73 65 28 0a 20 20 69 6e  hereClause(.  in
28300 74 20 2a 70 52 63 2c 20 0a 20 20 41 72 43 6f 6d  t *pRc, .  ArCom
28310 6d 61 6e 64 20 2a 70 41 72 2c 20 0a 20 20 63 68  mand *pAr, .  ch
28320 61 72 20 2a 2a 70 7a 57 68 65 72 65 20 20 20 20  ar **pzWhere    
28330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28340 20 4f 55 54 3a 20 4e 65 77 20 57 48 45 52 45 20   OUT: New WHERE 
28350 63 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 63  clause */.){.  c
28360 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b  har *zWhere = 0;
28370 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
28380 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
28390 28 20 70 41 72 2d 3e 6e 41 72 67 3d 3d 30 20 29  ( pAr->nArg==0 )
283a0 7b 0a 20 20 20 20 20 20 7a 57 68 65 72 65 20 3d  {.      zWhere =
283b0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
283c0 28 22 31 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ("1");.    }else
283d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
283e0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
283f0 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20  *zSep = "";.    
28400 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72    for(i=0; i<pAr
28410 2d 3e 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nArg; i++){.  
28420 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
28430 20 2a 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72 67   *z = pAr->azArg
28440 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a 57 68  [i];.        zWh
28450 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ere = sqlite3_mp
28460 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
28470 20 22 25 7a 25 73 20 6e 61 6d 65 20 3d 20 27 25   "%z%s name = '%
28480 71 27 20 4f 52 20 73 75 62 73 74 72 28 6e 61 6d  q' OR substr(nam
28490 65 2c 31 2c 25 64 29 20 3d 20 27 25 71 2f 27 22  e,1,%d) = '%q/'"
284a0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 7a 57 68  , .          zWh
284b0 65 72 65 2c 20 7a 53 65 70 2c 20 7a 2c 20 73 74  ere, zSep, z, st
284c0 72 6c 65 6e 33 30 28 7a 29 2b 31 2c 20 7a 0a 20  rlen30(z)+1, z. 
284d0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
284e0 20 20 69 66 28 20 7a 57 68 65 72 65 3d 3d 30 20    if( zWhere==0 
284f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52  ){.          *pR
28500 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
28510 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
28520 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
28530 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20 4f 52       zSep = " OR
28540 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   ";.      }.    
28550 7d 0a 20 20 7d 0a 20 20 2a 70 7a 57 68 65 72 65  }.  }.  *pzWhere
28560 20 3d 20 7a 57 68 65 72 65 3b 0a 7d 0a 0a 2f 2a   = zWhere;.}../*
28570 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
28580 6f 6e 20 6f 66 20 2e 61 72 20 22 6c 69 73 54 22  on of .ar "lisT"
28590 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74   command. .*/.st
285a0 61 74 69 63 20 69 6e 74 20 61 72 4c 69 73 74 43  atic int arListC
285b0 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e 64  ommand(ArCommand
285c0 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20   *pAr){.  const 
285d0 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53 45  char *zSql = "SE
285e0 4c 45 43 54 20 25 73 20 46 52 4f 4d 20 25 73 20  LECT %s FROM %s 
285f0 57 48 45 52 45 20 25 73 22 3b 20 0a 20 20 63 6f  WHERE %s"; .  co
28600 6e 73 74 20 63 68 61 72 20 2a 61 7a 43 6f 6c 73  nst char *azCols
28610 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 6e 61 6d 65  [] = {.    "name
28620 22 2c 0a 20 20 20 20 22 6c 73 6d 6f 64 65 28 6d  ",.    "lsmode(m
28630 6f 64 65 29 2c 20 73 7a 2c 20 64 61 74 65 74 69  ode), sz, dateti
28640 6d 65 28 6d 74 69 6d 65 2c 20 27 75 6e 69 78 65  me(mtime, 'unixe
28650 70 6f 63 68 27 29 2c 20 6e 61 6d 65 22 0a 20 20  poch'), name".  
28660 7d 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 57 68 65  };..  char *zWhe
28670 72 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  re = 0;.  sqlite
28680 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30  3_stmt *pSql = 0
28690 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
286a0 63 20 3d 20 61 72 43 68 65 63 6b 45 6e 74 72 69  c = arCheckEntri
286b0 65 73 28 70 41 72 29 3b 0a 20 20 61 72 57 68 65  es(pAr);.  arWhe
286c0 72 65 43 6c 61 75 73 65 28 26 72 63 2c 20 70 41  reClause(&rc, pA
286d0 72 2c 20 26 7a 57 68 65 72 65 29 3b 0a 0a 20 20  r, &zWhere);..  
286e0 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e  shellPreparePrin
286f0 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c  tf(pAr->db, &rc,
28700 20 26 70 53 71 6c 2c 20 7a 53 71 6c 2c 20 61 7a   &pSql, zSql, az
28710 43 6f 6c 73 5b 70 41 72 2d 3e 62 56 65 72 62 6f  Cols[pAr->bVerbo
28720 73 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  se],.           
28730 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 7a            pAr->z
28740 53 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72 65  SrcTable, zWhere
28750 29 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 62 44  );.  if( pAr->bD
28760 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 75 74 66  ryRun ){.    utf
28770 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d  8_printf(pAr->p-
28780 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71  >out, "%s\n", sq
28790 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 29  lite3_sql(pSql))
287a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
287b0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
287c0 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
287d0 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
287e0 70 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69  pSql) ){.      i
287f0 66 28 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65  f( pAr->bVerbose
28800 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
28810 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e  _printf(pAr->p->
28820 6f 75 74 2c 20 22 25 73 20 25 20 31 30 64 20 20  out, "%s % 10d  
28830 25 73 20 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  %s  %s\n",.     
28840 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
28850 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
28860 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
28870 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
28880 69 6e 74 28 70 53 71 6c 2c 20 31 29 2c 20 0a 20  int(pSql, 1), . 
28890 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
288a0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
288b0 53 71 6c 2c 20 32 29 2c 0a 20 20 20 20 20 20 20  Sql, 2),.       
288c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
288d0 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33  umn_text(pSql, 3
288e0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
288f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28900 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
28910 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  r->p->out, "%s\n
28920 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
28930 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29  n_text(pSql, 0))
28940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28950 20 20 7d 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c    }.  shellFinal
28960 69 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a  ize(&rc, pSql);.
28970 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28980 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e  Where);.  return
28990 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49   rc;.}.../*.** I
289a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
289b0 20 2e 61 72 20 22 65 58 74 72 61 63 74 22 20 63   .ar "eXtract" c
289c0 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74  ommand. .*/.stat
289d0 69 63 20 69 6e 74 20 61 72 45 78 74 72 61 63 74  ic int arExtract
289e0 43 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e  Command(ArComman
289f0 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74  d *pAr){.  const
28a00 20 63 68 61 72 20 2a 7a 53 71 6c 31 20 3d 20 0a   char *zSql1 = .
28a10 20 20 20 20 22 53 45 4c 45 43 54 20 22 0a 20 20      "SELECT ".  
28a20 20 20 22 20 28 24 64 69 72 20 7c 7c 20 6e 61 6d    " ($dir || nam
28a30 65 29 2c 22 0a 20 20 20 20 22 20 77 72 69 74 65  e),".    " write
28a40 66 69 6c 65 28 28 24 64 69 72 20 7c 7c 20 6e 61  file(($dir || na
28a50 6d 65 29 2c 20 25 73 2c 20 6d 6f 64 65 2c 20 6d  me), %s, mode, m
28a60 74 69 6d 65 29 20 22 0a 20 20 20 20 22 46 52 4f  time) ".    "FRO
28a70 4d 20 25 73 20 57 48 45 52 45 20 28 25 73 29 20  M %s WHERE (%s) 
28a80 41 4e 44 20 28 64 61 74 61 20 49 53 20 4e 55 4c  AND (data IS NUL
28a90 4c 20 4f 52 20 24 64 69 72 4f 6e 6c 79 20 3d 20  L OR $dirOnly = 
28aa0 30 29 22 0a 20 20 20 20 22 20 41 4e 44 20 6e 61  0)".    " AND na
28ab0 6d 65 20 4e 4f 54 20 47 4c 4f 42 20 27 2a 2e 2e  me NOT GLOB '*..
28ac0 5b 2f 5c 5c 5d 2a 27 22 3b 0a 0a 20 20 63 6f 6e  [/\\]*'";..  con
28ad0 73 74 20 63 68 61 72 20 2a 61 7a 45 78 74 72 61  st char *azExtra
28ae0 41 72 67 5b 5d 20 3d 20 7b 20 0a 20 20 20 20 22  Arg[] = { .    "
28af0 73 71 6c 61 72 5f 75 6e 63 6f 6d 70 72 65 73 73  sqlar_uncompress
28b00 28 64 61 74 61 2c 20 73 7a 29 22 2c 0a 20 20 20  (data, sz)",.   
28b10 20 22 64 61 74 61 22 0a 20 20 7d 3b 0a 0a 20 20   "data".  };..  
28b20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
28b30 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ql = 0;.  int rc
28b40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
28b50 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a  char *zDir = 0;.
28b60 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d    char *zWhere =
28b70 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   0;.  int i, j;.
28b80 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e  .  /* If argumen
28b90 74 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64  ts are specified
28ba0 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
28bb0 79 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74  y actually exist
28bc0 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65   within.  ** the
28bd0 20 61 72 63 68 69 76 65 20 62 65 66 6f 72 65 20   archive before 
28be0 70 72 6f 63 65 65 64 69 6e 67 2e 20 41 6e 64 20  proceeding. And 
28bf0 66 6f 72 6d 75 6c 61 74 65 20 61 20 57 48 45 52  formulate a WHER
28c00 45 20 63 6c 61 75 73 65 20 74 6f 0a 20 20 2a 2a  E clause to.  **
28c10 20 6d 61 74 63 68 20 74 68 65 6d 2e 20 20 2a 2f   match them.  */
28c20 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b 45  .  rc = arCheckE
28c30 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20 61  ntries(pAr);.  a
28c40 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72 63  rWhereClause(&rc
28c50 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29 3b  , pAr, &zWhere);
28c60 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
28c70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
28c80 20 70 41 72 2d 3e 7a 44 69 72 20 29 7b 0a 20 20   pAr->zDir ){.  
28c90 20 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74      zDir = sqlit
28ca0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f 22  e3_mprintf("%s/"
28cb0 2c 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20 20  , pAr->zDir);.  
28cc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
28cd0 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Dir = sqlite3_mp
28ce0 72 69 6e 74 66 28 22 22 29 3b 0a 20 20 20 20 7d  rintf("");.    }
28cf0 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  .    if( zDir==0
28d00 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
28d10 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 73 68 65  OMEM;.  }..  she
28d20 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28  llPreparePrintf(
28d30 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70  pAr->db, &rc, &p
28d40 53 71 6c 2c 20 7a 53 71 6c 31 2c 20 0a 20 20 20  Sql, zSql1, .   
28d50 20 20 20 61 7a 45 78 74 72 61 41 72 67 5b 70 41     azExtraArg[pA
28d60 72 2d 3e 62 5a 69 70 5d 2c 20 70 41 72 2d 3e 7a  r->bZip], pAr->z
28d70 53 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72 65  SrcTable, zWhere
28d80 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  .  );..  if( rc=
28d90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28da0 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69    j = sqlite3_bi
28db0 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
28dc0 65 78 28 70 53 71 6c 2c 20 22 24 64 69 72 22 29  ex(pSql, "$dir")
28dd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
28de0 6e 64 5f 74 65 78 74 28 70 53 71 6c 2c 20 6a 2c  nd_text(pSql, j,
28df0 20 7a 44 69 72 2c 20 2d 31 2c 20 53 51 4c 49 54   zDir, -1, SQLIT
28e00 45 5f 53 54 41 54 49 43 29 3b 0a 0a 20 20 20 20  E_STATIC);..    
28e10 2f 2a 20 52 75 6e 20 74 68 65 20 53 45 4c 45 43  /* Run the SELEC
28e20 54 20 73 74 61 74 65 6d 65 6e 74 20 74 77 69 63  T statement twic
28e30 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  e. The first tim
28e40 65 2c 20 77 72 69 74 65 66 69 6c 65 28 29 20 69  e, writefile() i
28e50 73 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a 20  s called.    ** 
28e60 66 6f 72 20 61 6c 6c 20 61 72 63 68 69 76 65 20  for all archive 
28e70 6d 65 6d 62 65 72 73 20 74 68 61 74 20 73 68 6f  members that sho
28e80 75 6c 64 20 62 65 20 65 78 74 72 61 63 74 65 64  uld be extracted
28e90 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 74 69 6d  . The second tim
28ea0 65 2c 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 66  e,.    ** only f
28eb0 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 69  or the directori
28ec0 65 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  es. This is beca
28ed0 75 73 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d  use the timestam
28ee0 70 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 78  ps for.    ** ex
28ef0 74 72 61 63 74 65 64 20 64 69 72 65 63 74 6f 72  tracted director
28f00 69 65 73 20 6d 75 73 74 20 62 65 20 72 65 73 65  ies must be rese
28f10 74 20 61 66 74 65 72 20 74 68 65 79 20 61 72 65  t after they are
28f20 20 70 6f 70 75 6c 61 74 65 64 20 28 61 73 0a 20   populated (as. 
28f30 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 69 6e 67     ** populating
28f40 20 74 68 65 6d 20 63 68 61 6e 67 65 73 20 74 68   them changes th
28f50 65 20 74 69 6d 65 73 74 61 6d 70 29 2e 20 20 2a  e timestamp).  *
28f60 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
28f70 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
28f80 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  j = sqlite3_bind
28f90 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
28fa0 28 70 53 71 6c 2c 20 22 24 64 69 72 4f 6e 6c 79  (pSql, "$dirOnly
28fb0 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
28fc0 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c 2c  3_bind_int(pSql,
28fd0 20 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66   j, i);.      if
28fe0 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29  ( pAr->bDryRun )
28ff0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
29000 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75  rintf(pAr->p->ou
29010 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  t, "%s\n", sqlit
29020 65 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b 0a 20  e3_sql(pSql));. 
29030 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29040 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
29050 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
29060 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
29070 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20  step(pSql) ){.  
29080 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30          if( i==0
29090 20 26 26 20 70 41 72 2d 3e 62 56 65 72 62 6f 73   && pAr->bVerbos
290a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
290b0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
290c0 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  ->p->out, "%s\n"
290d0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
290e0 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29 3b  _text(pSql, 0));
290f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
29100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
29110 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28       shellReset(
29120 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20 20 20  &rc, pSql);.    
29130 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c  }.    shellFinal
29140 69 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a  ize(&rc, pSql);.
29150 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
29160 72 65 65 28 7a 44 69 72 29 3b 0a 20 20 73 71 6c  ree(zDir);.  sql
29170 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65  ite3_free(zWhere
29180 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
29190 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
291a0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
291b0 6e 20 7a 53 71 6c 2e 20 20 4f 72 20 69 66 20 64  n zSql.  Or if d
291c0 6f 69 6e 67 20 61 20 2d 2d 64 72 79 72 75 6e 2c  oing a --dryrun,
291d0 20 6d 65 72 65 6c 79 20 70 72 69 6e 74 20 69 74   merely print it
291e0 20 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   out..*/.static 
291f0 69 6e 74 20 61 72 45 78 65 63 53 71 6c 28 41 72  int arExecSql(Ar
29200 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63 6f  Command *pAr, co
29210 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b  nst char *zSql){
29220 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
29230 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b   pAr->bDryRun ){
29240 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
29250 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25  (pAr->p->out, "%
29260 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  s\n", zSql);.   
29270 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
29280 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
29290 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
292a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
292b0 78 65 63 28 70 41 72 2d 3e 64 62 2c 20 7a 53 71  xec(pAr->db, zSq
292c0 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b  l, 0, 0, &zErr);
292d0 0a 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b  .    if( zErr ){
292e0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
292f0 74 66 28 73 74 64 6f 75 74 2c 20 22 45 52 52 4f  tf(stdout, "ERRO
29300 52 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b  R: %s\n", zErr);
29310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
29320 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 7d  ree(zErr);.    }
29330 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
29340 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ;.}.../*.** Impl
29350 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61  ementation of .a
29360 72 20 22 63 72 65 61 74 65 22 20 61 6e 64 20 22  r "create" and "
29370 75 70 64 61 74 65 22 20 63 6f 6d 6d 61 6e 64 73  update" commands
29380 2e 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ..**.** Create t
29390 68 65 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65  he "sqlar" table
293a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
293b0 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
293c0 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a 2a  already exist..*
293d0 2a 20 54 68 65 6e 20 61 64 64 20 65 61 63 68 20  * Then add each 
293e0 66 69 6c 65 20 69 6e 20 74 68 65 20 61 7a 46 69  file in the azFi
293f0 6c 65 5b 5d 20 61 72 72 61 79 20 74 6f 20 74 68  le[] array to th
29400 65 20 61 72 63 68 69 76 65 2e 20 44 69 72 65 63  e archive. Direc
29410 74 6f 72 69 65 73 0a 2a 2a 20 61 72 65 20 61 64  tories.** are ad
29420 64 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e  ded recursively.
29430 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 56 65   If argument bVe
29440 72 62 6f 73 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  rbose is non-zer
29450 6f 2c 20 61 20 6d 65 73 73 61 67 65 20 69 73 0a  o, a message is.
29460 2a 2a 20 70 72 69 6e 74 65 64 20 6f 6e 20 73 74  ** printed on st
29470 64 6f 75 74 20 66 6f 72 20 65 61 63 68 20 66 69  dout for each fi
29480 6c 65 20 61 72 63 68 69 76 65 64 2e 0a 2a 2a 0a  le archived..**.
29490 2a 2a 20 54 68 65 20 63 72 65 61 74 65 20 63 6f  ** The create co
294a0 6d 6d 61 6e 64 20 69 73 20 74 68 65 20 73 61 6d  mmand is the sam
294b0 65 20 61 73 20 75 70 64 61 74 65 2c 20 65 78 63  e as update, exc
294c0 65 70 74 20 74 68 61 74 20 69 74 20 64 72 6f 70  ept that it drop
294d0 73 0a 2a 2a 20 61 6e 79 20 65 78 69 73 74 69 6e  s.** any existin
294e0 67 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65 20  g "sqlar" table 
294f0 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67  before beginning
29500 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29510 61 72 43 72 65 61 74 65 4f 72 55 70 64 61 74 65  arCreateOrUpdate
29520 43 6f 6d 6d 61 6e 64 28 0a 20 20 41 72 43 6f 6d  Command(.  ArCom
29530 6d 61 6e 64 20 2a 70 41 72 2c 20 20 20 20 20 20  mand *pAr,      
29540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
29550 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
29560 61 6e 64 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20  and options */. 
29570 20 69 6e 74 20 62 55 70 64 61 74 65 20 20 20 20   int bUpdate    
29580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29590 20 2f 2a 20 74 72 75 65 20 66 6f 72 20 61 20 2d   /* true for a -
295a0 2d 63 72 65 61 74 65 2e 20 20 66 61 6c 73 65 20  -create.  false 
295b0 66 6f 72 20 2d 2d 75 70 64 61 74 65 20 2a 2f 0a  for --update */.
295c0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
295d0 2a 7a 43 72 65 61 74 65 20 3d 20 0a 20 20 20 20  *zCreate = .    
295e0 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
295f0 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 71  IF NOT EXISTS sq
29600 6c 61 72 28 5c 6e 22 0a 20 20 20 20 20 20 22 20  lar(\n".      " 
29610 20 6e 61 6d 65 20 54 45 58 54 20 50 52 49 4d 41   name TEXT PRIMA
29620 52 59 20 4b 45 59 2c 20 20 2d 2d 20 6e 61 6d 65  RY KEY,  -- name
29630 20 6f 66 20 74 68 65 20 66 69 6c 65 5c 6e 22 0a   of the file\n".
29640 20 20 20 20 20 20 22 20 20 6d 6f 64 65 20 49 4e        "  mode IN
29650 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T,              
29660 20 2d 2d 20 61 63 63 65 73 73 20 70 65 72 6d 69   -- access permi
29670 73 73 69 6f 6e 73 5c 6e 22 0a 20 20 20 20 20 20  ssions\n".      
29680 22 20 20 6d 74 69 6d 65 20 49 4e 54 2c 20 20 20  "  mtime INT,   
29690 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 6c 61             -- la
296a0 73 74 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  st modification 
296b0 74 69 6d 65 5c 6e 22 0a 20 20 20 20 20 20 22 20  time\n".      " 
296c0 20 73 7a 20 49 4e 54 2c 20 20 20 20 20 20 20 20   sz INT,        
296d0 20 20 20 20 20 20 20 20 20 2d 2d 20 6f 72 69 67           -- orig
296e0 69 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 5c 6e  inal file size\n
296f0 22 0a 20 20 20 20 20 20 22 20 20 64 61 74 61 20  ".      "  data 
29700 42 4c 4f 42 20 20 20 20 20 20 20 20 20 20 20 20  BLOB            
29710 20 20 20 2d 2d 20 63 6f 6d 70 72 65 73 73 65 64     -- compressed
29720 20 63 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 20 20   content\n".    
29730 20 20 22 29 22 3b 0a 20 20 63 6f 6e 73 74 20 63    ")";.  const c
29740 68 61 72 20 2a 7a 44 72 6f 70 20 3d 20 22 44 52  har *zDrop = "DR
29750 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
29760 54 53 20 73 71 6c 61 72 22 3b 0a 20 20 63 6f 6e  TS sqlar";.  con
29770 73 74 20 63 68 61 72 20 2a 7a 49 6e 73 65 72 74  st char *zInsert
29780 46 6d 74 5b 32 5d 20 3d 20 7b 0a 20 20 20 20 20  Fmt[2] = {.     
29790 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 73  "REPLACE INTO %s
297a0 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65  (name,mode,mtime
297b0 2c 73 7a 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20  ,sz,data)\n".   
297c0 20 20 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20    "  SELECT\n". 
297d0 20 20 20 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a      "    %s,\n".
297e0 20 20 20 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c       "    mode,\
297f0 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d 74 69  n".     "    mti
29800 6d 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  me,\n".     "   
29810 20 43 41 53 45 20 73 75 62 73 74 72 28 6c 73 6d   CASE substr(lsm
29820 6f 64 65 28 6d 6f 64 65 29 2c 31 2c 31 29 5c 6e  ode(mode),1,1)\n
29830 22 0a 20 20 20 20 20 22 20 20 20 20 20 20 57 48  ".     "      WH
29840 45 4e 20 27 2d 27 20 54 48 45 4e 20 6c 65 6e 67  EN '-' THEN leng
29850 74 68 28 64 61 74 61 29 5c 6e 22 0a 20 20 20 20  th(data)\n".    
29860 20 22 20 20 20 20 20 20 57 48 45 4e 20 27 64 27   "      WHEN 'd'
29870 20 54 48 45 4e 20 30 5c 6e 22 0a 20 20 20 20 20   THEN 0\n".     
29880 22 20 20 20 20 20 20 45 4c 53 45 20 2d 31 20 45  "      ELSE -1 E
29890 4e 44 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  ND,\n".     "   
298a0 20 73 71 6c 61 72 5f 63 6f 6d 70 72 65 73 73 28   sqlar_compress(
298b0 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20  data)\n".     " 
298c0 20 46 52 4f 4d 20 66 73 64 69 72 28 25 51 2c 25   FROM fsdir(%Q,%
298d0 51 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 57 48  Q)\n".     "  WH
298e0 45 52 45 20 6c 73 6d 6f 64 65 28 6d 6f 64 65 29  ERE lsmode(mode)
298f0 20 4e 4f 54 20 4c 49 4b 45 20 27 3f 25 25 27 3b   NOT LIKE '?%%';
29900 22 2c 0a 20 20 20 20 20 22 52 45 50 4c 41 43 45  ",.     "REPLACE
29910 20 49 4e 54 4f 20 25 73 28 6e 61 6d 65 2c 6d 6f   INTO %s(name,mo
29920 64 65 2c 6d 74 69 6d 65 2c 64 61 74 61 29 5c 6e  de,mtime,data)\n
29930 22 0a 20 20 20 20 20 22 20 20 53 45 4c 45 43 54  ".     "  SELECT
29940 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 25 73  \n".     "    %s
29950 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d  ,\n".     "    m
29960 6f 64 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20  ode,\n".     "  
29970 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a 20 20 20 20    mtime,\n".    
29980 20 22 20 20 20 20 64 61 74 61 5c 6e 22 0a 20 20   "    data\n".  
29990 20 20 20 22 20 20 46 52 4f 4d 20 66 73 64 69 72     "  FROM fsdir
299a0 28 25 51 2c 25 51 29 5c 6e 22 0a 20 20 20 20 20  (%Q,%Q)\n".     
299b0 22 20 20 57 48 45 52 45 20 6c 73 6d 6f 64 65 28  "  WHERE lsmode(
299c0 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20 27  mode) NOT LIKE '
299d0 3f 25 25 27 3b 22 0a 20 20 7d 3b 0a 20 20 69 6e  ?%%';".  };.  in
299e0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
299f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29a00 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   For iterating t
29a10 68 72 6f 75 67 68 20 61 7a 46 69 6c 65 5b 5d 20  hrough azFile[] 
29a20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
29a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a40 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
29a50 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ode */.  const c
29a60 68 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20  har *zTab = 0;  
29a70 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
29a80 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68  table into which
29a90 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20   to insert */.  
29aa0 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68  char *zSql;.  ch
29ab0 61 72 20 7a 54 65 6d 70 5b 35 30 5d 3b 0a 0a 20  ar zTemp[50];.. 
29ac0 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
29ad0 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a  "PRAGMA page_siz
29ae0 65 3d 35 31 32 22 29 3b 0a 20 20 72 63 20 3d 20  e=512");.  rc = 
29af0 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22  arExecSql(pAr, "
29b00 53 41 56 45 50 4f 49 4e 54 20 61 72 3b 22 29 3b  SAVEPOINT ar;");
29b10 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
29b20 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
29b30 3b 0a 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30  ;.  zTemp[0] = 0
29b40 3b 20 0a 20 20 69 66 28 20 70 41 72 2d 3e 62 5a  ; .  if( pAr->bZ
29b50 69 70 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69  ip ){.    /* Ini
29b60 74 69 61 6c 69 7a 65 20 74 68 65 20 7a 69 70 66  tialize the zipf
29b70 69 6c 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ile virtual tabl
29b80 65 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  e, if necessary 
29b90 2a 2f 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e  */.    if( pAr->
29ba0 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 73  zFile ){.      s
29bb0 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72 3b  qlite3_uint64 r;
29bc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
29bd0 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
29be0 28 72 29 2c 26 72 29 3b 0a 20 20 20 20 20 20 73  (r),&r);.      s
29bf0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
29c00 73 69 7a 65 6f 66 28 7a 54 65 6d 70 29 2c 7a 54  sizeof(zTemp),zT
29c10 65 6d 70 2c 22 7a 69 70 25 30 31 36 6c 6c 78 22  emp,"zip%016llx"
29c20 2c 72 29 3b 0a 20 20 20 20 20 20 7a 54 61 62 20  ,r);.      zTab 
29c30 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 7a  = zTemp;.      z
29c40 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
29c50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
29c60 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20  "CREATE VIRTUAL 
29c70 54 41 42 4c 45 20 74 65 6d 70 2e 25 73 20 55 53  TABLE temp.%s US
29c80 49 4e 47 20 7a 69 70 66 69 6c 65 28 25 51 29 22  ING zipfile(%Q)"
29c90 2c 0a 20 20 20 20 20 20 20 20 20 7a 54 61 62 2c  ,.         zTab,
29ca0 20 70 41 72 2d 3e 7a 46 69 6c 65 0a 20 20 20 20   pAr->zFile.    
29cb0 20 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20    );.      rc = 
29cc0 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a  arExecSql(pAr, z
29cd0 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sql);.      sqli
29ce0 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
29cf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29d00 20 7a 54 61 62 20 3d 20 22 7a 69 70 22 3b 0a 20   zTab = "zip";. 
29d10 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
29d20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
29d30 74 68 65 20 74 61 62 6c 65 20 66 6f 72 20 61 6e  the table for an
29d40 20 53 51 4c 41 52 20 2a 2f 0a 20 20 20 20 7a 54   SQLAR */.    zT
29d50 61 62 20 3d 20 22 73 71 6c 61 72 22 3b 0a 20 20  ab = "sqlar";.  
29d60 20 20 69 66 28 20 62 55 70 64 61 74 65 3d 3d 30    if( bUpdate==0
29d70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
29d80 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 44  rExecSql(pAr, zD
29d90 72 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rop);.      if( 
29da0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
29db0 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 74 72 61 6e  goto end_ar_tran
29dc0 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20  saction;.    }. 
29dd0 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71     rc = arExecSq
29de0 6c 28 70 41 72 2c 20 7a 43 72 65 61 74 65 29 3b  l(pAr, zCreate);
29df0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
29e00 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72  i<pAr->nArg && r
29e10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
29e20 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  +){.    char *zS
29e30 71 6c 32 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ql2 = sqlite3_mp
29e40 72 69 6e 74 66 28 7a 49 6e 73 65 72 74 46 6d 74  rintf(zInsertFmt
29e50 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 7a 54 61  [pAr->bZip], zTa
29e60 62 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e  b,.        pAr->
29e70 62 56 65 72 62 6f 73 65 20 3f 20 22 73 68 65 6c  bVerbose ? "shel
29e80 6c 5f 70 75 74 73 6e 6c 28 6e 61 6d 65 29 22 20  l_putsnl(name)" 
29e90 3a 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20  : "name",.      
29ea0 20 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 2c    pAr->azArg[i],
29eb0 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20 20 20   pAr->zDir);.   
29ec0 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28   rc = arExecSql(
29ed0 70 41 72 2c 20 7a 53 71 6c 32 29 3b 0a 20 20 20  pAr, zSql2);.   
29ee0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
29ef0 71 6c 32 29 3b 0a 20 20 7d 0a 65 6e 64 5f 61 72  ql2);.  }.end_ar
29f00 5f 74 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20 20  _transaction:.  
29f10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29f20 4b 20 29 7b 0a 20 20 20 20 61 72 45 78 65 63 53  K ){.    arExecS
29f30 71 6c 28 70 41 72 2c 20 22 52 4f 4c 4c 42 41 43  ql(pAr, "ROLLBAC
29f40 4b 20 54 4f 20 61 72 3b 20 52 45 4c 45 41 53 45  K TO ar; RELEASE
29f50 20 61 72 3b 22 29 3b 0a 20 20 7d 65 6c 73 65 7b   ar;");.  }else{
29f60 0a 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63  .    rc = arExec
29f70 53 71 6c 28 70 41 72 2c 20 22 52 45 4c 45 41 53  Sql(pAr, "RELEAS
29f80 45 20 61 72 3b 22 29 3b 0a 20 20 20 20 69 66 28  E ar;");.    if(
29f90 20 70 41 72 2d 3e 62 5a 69 70 20 26 26 20 70 41   pAr->bZip && pA
29fa0 72 2d 3e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20  r->zFile ){.    
29fb0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
29fc0 5f 6d 70 72 69 6e 74 66 28 22 44 52 4f 50 20 54  _mprintf("DROP T
29fd0 41 42 4c 45 20 25 73 22 2c 20 7a 54 65 6d 70 29  ABLE %s", zTemp)
29fe0 3b 0a 20 20 20 20 20 20 61 72 45 78 65 63 53 71  ;.      arExecSq
29ff0 6c 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a 20 20  l(pAr, zSql);.  
2a000 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2a010 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (zSql);.    }.  
2a020 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2a030 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
2a040 74 61 74 69 6f 6e 20 6f 66 20 22 2e 61 72 22 20  tation of ".ar" 
2a050 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  dot command..*/.
2a060 73 74 61 74 69 63 20 69 6e 74 20 61 72 44 6f 74  static int arDot
2a070 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c  Command(.  Shell
2a080 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20  State *pState,  
2a090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2a0a0 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c  rrent shell tool
2a0b0 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20   state */.  int 
2a0c0 66 72 6f 6d 43 6d 64 4c 69 6e 65 2c 20 20 20 20  fromCmdLine,    
2a0d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a0e0 72 75 65 20 69 66 20 2d 41 20 63 6f 6d 6d 61 6e  rue if -A comman
2a0f0 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2c 20 6e  d-line option, n
2a100 6f 74 20 2e 61 72 20 63 6d 64 20 2a 2f 0a 20 20  ot .ar cmd */.  
2a110 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20  char **azArg,   
2a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a130 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75  /* Array of argu
2a140 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
2a150 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  dot command */. 
2a160 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20   int nArg       
2a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a180 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
2a190 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d  tries in azArg[]
2a1a0 20 2a 2f 0a 29 7b 0a 20 20 41 72 43 6f 6d 6d 61   */.){.  ArComma
2a1b0 6e 64 20 63 6d 64 3b 0a 20 20 69 6e 74 20 72 63  nd cmd;.  int rc
2a1c0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6d 64 2c  ;.  memset(&cmd,
2a1d0 20 30 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 29   0, sizeof(cmd))
2a1e0 3b 0a 20 20 63 6d 64 2e 66 72 6f 6d 43 6d 64 4c  ;.  cmd.fromCmdL
2a1f0 69 6e 65 20 3d 20 66 72 6f 6d 43 6d 64 4c 69 6e  ine = fromCmdLin
2a200 65 3b 0a 20 20 72 63 20 3d 20 61 72 50 61 72 73  e;.  rc = arPars
2a210 65 43 6f 6d 6d 61 6e 64 28 61 7a 41 72 67 2c 20  eCommand(azArg, 
2a220 6e 41 72 67 2c 20 26 63 6d 64 29 3b 0a 20 20 69  nArg, &cmd);.  i
2a230 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a240 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 44 62 54   ){.    int eDbT
2a250 79 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e  ype = SHELL_OPEN
2a260 5f 55 4e 53 50 45 43 3b 0a 20 20 20 20 63 6d 64  _UNSPEC;.    cmd
2a270 2e 70 20 3d 20 70 53 74 61 74 65 3b 0a 20 20 20  .p = pState;.   
2a280 20 63 6d 64 2e 64 62 20 3d 20 70 53 74 61 74 65   cmd.db = pState
2a290 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 63 6d  ->db;.    if( cm
2a2a0 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  d.zFile ){.     
2a2b0 20 65 44 62 54 79 70 65 20 3d 20 64 65 64 75 63   eDbType = deduc
2a2c0 65 44 61 74 61 62 61 73 65 54 79 70 65 28 63 6d  eDatabaseType(cm
2a2d0 64 2e 7a 46 69 6c 65 2c 20 31 29 3b 0a 20 20 20  d.zFile, 1);.   
2a2e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 44   }else{.      eD
2a2f0 62 54 79 70 65 20 3d 20 70 53 74 61 74 65 2d 3e  bType = pState->
2a300 6f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 7d 0a  openMode;.    }.
2a310 20 20 20 20 69 66 28 20 65 44 62 54 79 70 65 3d      if( eDbType=
2a320 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46  =SHELL_OPEN_ZIPF
2a330 49 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ILE ){.      if(
2a340 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d   cmd.eCmd==AR_CM
2a350 44 5f 45 58 54 52 41 43 54 20 7c 7c 20 63 6d 64  D_EXTRACT || cmd
2a360 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 4c 49  .eCmd==AR_CMD_LI
2a370 53 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ST ){.        if
2a380 28 20 63 6d 64 2e 7a 46 69 6c 65 3d 3d 30 20 29  ( cmd.zFile==0 )
2a390 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e  {.          cmd.
2a3a0 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69  zSrcTable = sqli
2a3b0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70  te3_mprintf("zip
2a3c0 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ");.        }els
2a3d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64  e{.          cmd
2a3e0 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c  .zSrcTable = sql
2a3f0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69  ite3_mprintf("zi
2a400 70 66 69 6c 65 28 25 51 29 22 2c 20 63 6d 64 2e  pfile(%Q)", cmd.
2a410 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  zFile);.        
2a420 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2a430 63 6d 64 2e 62 5a 69 70 20 3d 20 31 3b 0a 20 20  cmd.bZip = 1;.  
2a440 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6d 64 2e    }else if( cmd.
2a450 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  zFile ){.      i
2a460 6e 74 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20  nt flags;.      
2a470 69 66 28 20 63 6d 64 2e 62 41 70 70 65 6e 64 20  if( cmd.bAppend 
2a480 29 20 65 44 62 54 79 70 65 20 3d 20 53 48 45 4c  ) eDbType = SHEL
2a490 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53  L_OPEN_APPENDVFS
2a4a0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e  ;.      if( cmd.
2a4b0 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43 52 45  eCmd==AR_CMD_CRE
2a4c0 41 54 45 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d  ATE || cmd.eCmd=
2a4d0 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 29  =AR_CMD_UPDATE )
2a4e0 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
2a4f0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
2a500 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
2a510 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20  PEN_CREATE;.    
2a520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a530 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
2a540 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
2a550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d 64       }.      cmd
2a560 2e 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  .db = 0;.      i
2a570 66 28 20 63 6d 64 2e 62 44 72 79 52 75 6e 20 29  f( cmd.bDryRun )
2a580 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2a590 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75  rintf(pState->ou
2a5a0 74 2c 20 22 2d 2d 20 6f 70 65 6e 20 64 61 74 61  t, "-- open data
2a5b0 62 61 73 65 20 27 25 73 27 25 73 5c 6e 22 2c 20  base '%s'%s\n", 
2a5c0 63 6d 64 2e 7a 46 69 6c 65 2c 0a 20 20 20 20 20  cmd.zFile,.     
2a5d0 20 20 20 20 20 20 20 20 65 44 62 54 79 70 65 3d          eDbType=
2a5e0 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45  =SHELL_OPEN_APPE
2a5f0 4e 44 56 46 53 20 3f 20 22 20 75 73 69 6e 67 20  NDVFS ? " using 
2a600 27 61 70 6e 64 76 66 73 27 22 20 3a 20 22 22 29  'apndvfs'" : "")
2a610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a620 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
2a630 6e 5f 76 32 28 63 6d 64 2e 7a 46 69 6c 65 2c 20  n_v2(cmd.zFile, 
2a640 26 63 6d 64 2e 64 62 2c 20 66 6c 61 67 73 2c 20  &cmd.db, flags, 
2a650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 65 44  .             eD
2a660 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45  bType==SHELL_OPE
2a670 4e 5f 41 50 50 45 4e 44 56 46 53 20 3f 20 22 61  N_APPENDVFS ? "a
2a680 70 6e 64 76 66 73 22 20 3a 20 30 29 3b 0a 20 20  pndvfs" : 0);.  
2a690 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a6a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2a6b0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2a6c0 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65  err, "cannot ope
2a6d0 6e 20 66 69 6c 65 3a 20 25 73 20 28 25 73 29 5c  n file: %s (%s)\
2a6e0 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  n", .           
2a6f0 20 63 6d 64 2e 7a 46 69 6c 65 2c 20 73 71 6c 69   cmd.zFile, sqli
2a700 74 65 33 5f 65 72 72 6d 73 67 28 63 6d 64 2e 64  te3_errmsg(cmd.d
2a710 62 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  b).        );.  
2a720 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2a730 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20 20 20 20  r_command;.     
2a740 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2a750 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28 63 6d 64  _fileio_init(cmd
2a760 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  .db, 0, 0);.    
2a770 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61 72 5f    sqlite3_sqlar_
2a780 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20 30 2c 20  init(cmd.db, 0, 
2a790 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
2a7a0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
2a7b0 6e 28 63 6d 64 2e 64 62 2c 20 22 73 68 65 6c 6c  n(cmd.db, "shell
2a7c0 5f 70 75 74 73 6e 6c 22 2c 20 31 2c 20 53 51 4c  _putsnl", 1, SQL
2a7d0 49 54 45 5f 55 54 46 38 2c 20 63 6d 64 2e 70 2c  ITE_UTF8, cmd.p,
2a7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2a800 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c 20 30 2c  hellPutsFunc, 0,
2a810 20 30 29 3b 0a 0a 20 20 20 20 7d 0a 20 20 20 20   0);..    }.    
2a820 69 66 28 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c  if( cmd.zSrcTabl
2a830 65 3d 3d 30 20 26 26 20 63 6d 64 2e 62 5a 69 70  e==0 && cmd.bZip
2a840 3d 3d 30 20 26 26 20 63 6d 64 2e 65 43 6d 64 21  ==0 && cmd.eCmd!
2a850 3d 41 52 5f 43 4d 44 5f 48 45 4c 50 20 29 7b 0a  =AR_CMD_HELP ){.
2a860 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65 43        if( cmd.eC
2a870 6d 64 21 3d 41 52 5f 43 4d 44 5f 43 52 45 41 54  md!=AR_CMD_CREAT
2a880 45 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  E.       && sqli
2a890 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
2a8a0 5f 6d 65 74 61 64 61 74 61 28 63 6d 64 2e 64 62  _metadata(cmd.db
2a8b0 2c 30 2c 22 73 71 6c 61 72 22 2c 22 6e 61 6d 65  ,0,"sqlar","name
2a8c0 22 2c 30 2c 30 2c 30 2c 30 2c 30 29 0a 20 20 20  ",0,0,0,0,0).   
2a8d0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74     ){.        ut
2a8e0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2a8f0 2c 20 22 64 61 74 61 62 61 73 65 20 64 6f 65 73  , "database does
2a900 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20   not contain an 
2a910 27 73 71 6c 61 72 27 20 74 61 62 6c 65 5c 6e 22  'sqlar' table\n"
2a920 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2a930 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2a940 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2a950 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20 20 20 20  r_command;.     
2a960 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e 7a 53 72   }.      cmd.zSr
2a970 63 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  cTable = sqlite3
2a980 5f 6d 70 72 69 6e 74 66 28 22 73 71 6c 61 72 22  _mprintf("sqlar"
2a990 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77  );.    }..    sw
2a9a0 69 74 63 68 28 20 63 6d 64 2e 65 43 6d 64 20 29  itch( cmd.eCmd )
2a9b0 7b 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f  {.      case AR_
2a9c0 43 4d 44 5f 43 52 45 41 54 45 3a 0a 20 20 20 20  CMD_CREATE:.    
2a9d0 20 20 20 20 72 63 20 3d 20 61 72 43 72 65 61 74      rc = arCreat
2a9e0 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64  eOrUpdateCommand
2a9f0 28 26 63 6d 64 2c 20 30 29 3b 0a 20 20 20 20 20  (&cmd, 0);.     
2aa00 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
2aa10 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 45 58 54   case AR_CMD_EXT
2aa20 52 41 43 54 3a 0a 20 20 20 20 20 20 20 20 72 63  RACT:.        rc
2aa30 20 3d 20 61 72 45 78 74 72 61 63 74 43 6f 6d 6d   = arExtractComm
2aa40 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20 20 20 20  and(&cmd);.     
2aa50 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
2aa60 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c 49 53   case AR_CMD_LIS
2aa70 54 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  T:.        rc = 
2aa80 61 72 4c 69 73 74 43 6f 6d 6d 61 6e 64 28 26 63  arListCommand(&c
2aa90 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  md);.        bre
2aaa0 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
2aab0 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20 20  AR_CMD_HELP:.   
2aac0 20 20 20 20 20 61 72 55 73 61 67 65 28 70 53 74       arUsage(pSt
2aad0 61 74 65 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 20  ate->out);.     
2aae0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
2aaf0 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
2ab00 20 20 61 73 73 65 72 74 28 20 63 6d 64 2e 65 43    assert( cmd.eC
2ab10 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54  md==AR_CMD_UPDAT
2ab20 45 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  E );.        rc 
2ab30 3d 20 61 72 43 72 65 61 74 65 4f 72 55 70 64 61  = arCreateOrUpda
2ab40 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c 20  teCommand(&cmd, 
2ab50 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
2ab60 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65 6e 64  k;.    }.  }.end
2ab70 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3a 0a 20 20 69  _ar_command:.  i
2ab80 66 28 20 63 6d 64 2e 64 62 21 3d 70 53 74 61 74  f( cmd.db!=pStat
2ab90 65 2d 3e 64 62 20 29 7b 0a 20 20 20 20 63 6c 6f  e->db ){.    clo
2aba0 73 65 5f 64 62 28 63 6d 64 2e 64 62 29 3b 0a 20  se_db(cmd.db);. 
2abb0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
2abc0 65 28 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 29  e(cmd.zSrcTable)
2abd0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
2abe0 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  }./* End of the 
2abf0 22 2e 61 72 63 68 69 76 65 22 20 6f 72 20 22 2e  ".archive" or ".
2ac00 61 72 22 20 63 6f 6d 6d 61 6e 64 20 6c 6f 67 69  ar" command logi
2ac10 63 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c.**************
2ac20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac60 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  ****/.#endif /* 
2ac70 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2ac80 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2ac90 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
2aca0 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 20  LITE_HAVE_ZLIB) 
2acb0 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  */.../*.** If an
2acc0 20 69 6e 70 75 74 20 6c 69 6e 65 20 62 65 67 69   input line begi
2acd0 6e 73 20 77 69 74 68 20 22 2e 22 20 74 68 65 6e  ns with "." then
2ace0 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75   invoke this rou
2acf0 74 69 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65  tine to.** proce
2ad00 73 73 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a  ss that line..**
2ad10 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20  .** Return 1 on 
2ad20 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74  error, 2 to exit
2ad30 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73  , and 0 otherwis
2ad40 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2ad50 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64   do_meta_command
2ad60 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 53 68  (char *zLine, Sh
2ad70 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
2ad80 69 6e 74 20 68 20 3d 20 31 3b 0a 20 20 69 6e 74  int h = 1;.  int
2ad90 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e 74   nArg = 0;.  int
2ada0 20 6e 2c 20 63 3b 0a 20 20 69 6e 74 20 72 63 20   n, c;.  int rc 
2adb0 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 61 7a 41  = 0;.  char *azA
2adc0 72 67 5b 35 30 5d 3b 0a 0a 23 69 66 6e 64 65 66  rg[50];..#ifndef
2add0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2ade0 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
2adf0 70 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  p->expert.pExper
2ae00 74 20 29 7b 0a 20 20 20 20 65 78 70 65 72 74 46  t ){.    expertF
2ae10 69 6e 69 73 68 28 70 2c 20 31 2c 20 30 29 3b 0a  inish(p, 1, 0);.
2ae20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2ae30 20 50 61 72 73 65 20 74 68 65 20 69 6e 70 75 74   Parse the input
2ae40 20 6c 69 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e   line into token
2ae50 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  s..  */.  while(
2ae60 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 6e 41 72   zLine[h] && nAr
2ae70 67 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 41 72  g<ArraySize(azAr
2ae80 67 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  g) ){.    while(
2ae90 20 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68   IsSpace(zLine[h
2aea0 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ h++; }.   
2aeb0 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 30   if( zLine[h]==0
2aec0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
2aed0 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 27 27  ( zLine[h]=='\''
2aee0 20 7c 7c 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 22   || zLine[h]=='"
2aef0 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  ' ){.      int d
2af00 65 6c 69 6d 20 3d 20 7a 4c 69 6e 65 5b 68 2b 2b  elim = zLine[h++
2af10 5d 3b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e  ];.      azArg[n
2af20 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b  Arg++] = &zLine[
2af30 68 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  h];.      while(
2af40 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 7a 4c 69   zLine[h] && zLi
2af50 6e 65 5b 68 5d 21 3d 64 65 6c 69 6d 20 29 7b 0a  ne[h]!=delim ){.
2af60 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e          if( zLin
2af70 65 5b 68 5d 3d 3d 27 5c 5c 27 20 26 26 20 64 65  e[h]=='\\' && de
2af80 6c 69 6d 3d 3d 27 22 27 20 26 26 20 7a 4c 69 6e  lim=='"' && zLin
2af90 65 5b 68 2b 31 5d 21 3d 30 20 29 20 68 2b 2b 3b  e[h+1]!=0 ) h++;
2afa0 0a 20 20 20 20 20 20 20 20 68 2b 2b 3b 0a 20 20  .        h++;.  
2afb0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2afc0 7a 4c 69 6e 65 5b 68 5d 3d 3d 64 65 6c 69 6d 20  zLine[h]==delim 
2afd0 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65  ){.        zLine
2afe0 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  [h++] = 0;.     
2aff0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c   }.      if( del
2b000 69 6d 3d 3d 27 22 27 20 29 20 72 65 73 6f 6c 76  im=='"' ) resolv
2b010 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a  e_backslashes(az
2b020 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20  Arg[nArg-1]);.  
2b030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2b040 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26  zArg[nArg++] = &
2b050 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20  zLine[h];.      
2b060 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20  while( zLine[h] 
2b070 26 26 20 21 49 73 53 70 61 63 65 28 7a 4c 69 6e  && !IsSpace(zLin
2b080 65 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a  e[h]) ){ h++; }.
2b090 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b        if( zLine[
2b0a0 68 5d 20 29 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20  h] ) zLine[h++] 
2b0b0 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 73 6f 6c  = 0;.      resol
2b0c0 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61  ve_backslashes(a
2b0d0 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20  zArg[nArg-1]);. 
2b0e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
2b0f0 72 6f 63 65 73 73 20 74 68 65 20 69 6e 70 75 74  rocess the input
2b100 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   line..  */.  if
2b110 28 20 6e 41 72 67 3d 3d 30 20 29 20 72 65 74 75  ( nArg==0 ) retu
2b120 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 74 6f 6b 65  rn 0; /* no toke
2b130 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a  ns, no error */.
2b140 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61    n = strlen30(a
2b150 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20  zArg[0]);.  c = 
2b160 61 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20 63  azArg[0][0];.  c
2b170 6c 65 61 72 54 65 6d 70 46 69 6c 65 28 70 29 3b  learTempFile(p);
2b180 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2b190 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
2b1a0 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 61 27  ION.  if( c=='a'
2b1b0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2b1c0 67 5b 30 5d 2c 20 22 61 75 74 68 22 2c 20 6e 29  g[0], "auth", n)
2b1d0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
2b1e0 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg!=2 ){.      
2b1f0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2b200 72 2c 20 22 55 73 61 67 65 3a 20 2e 61 75 74 68  r, "Usage: .auth
2b210 20 4f 4e 7c 4f 46 46 5c 6e 22 29 3b 0a 20 20 20   ON|OFF\n");.   
2b220 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2b230 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2b240 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
2b250 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
2b260 3b 0a 20 20 20 20 69 66 28 20 62 6f 6f 6c 65 61  ;.    if( boolea
2b270 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
2b280 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2b290 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
2b2a0 28 70 2d 3e 64 62 2c 20 73 68 65 6c 6c 41 75 74  (p->db, shellAut
2b2b0 68 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  h, p);.    }else
2b2c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2b2d0 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70  set_authorizer(p
2b2e0 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
2b2f0 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
2b300 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
2b310 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2b320 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
2b330 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45  ined(SQLITE_HAVE
2b340 5f 5a 4c 49 42 29 0a 20 20 69 66 28 20 63 3d 3d  _ZLIB).  if( c==
2b350 27 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'a' && strncmp(a
2b360 7a 41 72 67 5b 30 5d 2c 20 22 61 72 63 68 69 76  zArg[0], "archiv
2b370 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
2b380 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
2b390 20 20 20 20 72 63 20 3d 20 61 72 44 6f 74 43 6f      rc = arDotCo
2b3a0 6d 6d 61 6e 64 28 70 2c 20 30 2c 20 61 7a 41 72  mmand(p, 0, azAr
2b3b0 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73  g, nArg);.  }els
2b3c0 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  e.#endif..  if( 
2b3d0 28 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20  (c=='b' && n>=3 
2b3e0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2b3f0 5b 30 5d 2c 20 22 62 61 63 6b 75 70 22 2c 20 6e  [0], "backup", n
2b400 29 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 63 3d 3d  )==0).   || (c==
2b410 27 73 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  's' && n>=3 && s
2b420 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2b430 20 22 73 61 76 65 22 2c 20 6e 29 3d 3d 30 29 0a   "save", n)==0).
2b440 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63    ){.    const c
2b450 68 61 72 20 2a 7a 44 65 73 74 46 69 6c 65 20 3d  har *zDestFile =
2b460 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
2b470 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 20  ar *zDb = 0;.   
2b480 20 73 71 6c 69 74 65 33 20 2a 70 44 65 73 74 3b   sqlite3 *pDest;
2b490 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
2b4a0 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20  kup *pBackup;.  
2b4b0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 63 6f 6e    int j;.    con
2b4c0 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20  st char *zVfs = 
2b4d0 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20  0;.    for(j=1; 
2b4e0 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b 0a 20 20  j<nArg; j++){.  
2b4f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2b500 7a 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20  z = azArg[j];.  
2b510 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
2b520 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
2b530 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b   z[1]=='-' ) z++
2b540 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  ;.        if( st
2b550 72 63 6d 70 28 7a 2c 20 22 2d 61 70 70 65 6e 64  rcmp(z, "-append
2b560 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
2b570 20 20 20 7a 56 66 73 20 3d 20 22 61 70 6e 64 76     zVfs = "apndv
2b580 66 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  fs";.        }el
2b590 73 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  se.        {.   
2b5a0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2b5b0 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e  tf(stderr, "unkn
2b5c0 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e  own option: %s\n
2b5d0 22 2c 20 61 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20  ", azArg[j]);.  
2b5e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
2b5f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b600 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 65 73    }else if( zDes
2b610 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  tFile==0 ){.    
2b620 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20      zDestFile = 
2b630 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20  azArg[j];.      
2b640 7d 65 6c 73 65 20 69 66 28 20 7a 44 62 3d 3d 30  }else if( zDb==0
2b650 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 62 20   ){.        zDb 
2b660 3d 20 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20 20  = zDestFile;.   
2b670 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d       zDestFile =
2b680 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20   azArg[j];.     
2b690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b6a0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2b6b0 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 61 63 6b  r, "Usage: .back
2b6c0 75 70 20 3f 44 42 3f 20 3f 2d 2d 61 70 70 65 6e  up ?DB? ?--appen
2b6d0 64 3f 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b  d? FILENAME\n");
2b6e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2b6f0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
2b700 0a 20 20 20 20 69 66 28 20 7a 44 65 73 74 46 69  .    if( zDestFi
2b710 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  le==0 ){.      r
2b720 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2b730 2c 20 22 6d 69 73 73 69 6e 67 20 46 49 4c 45 4e  , "missing FILEN
2b740 41 4d 45 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20  AME argument on 
2b750 2e 62 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20 20  .backup\n");.   
2b760 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2b770 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d   }.    if( zDb==
2b780 30 20 29 20 7a 44 62 20 3d 20 22 6d 61 69 6e 22  0 ) zDb = "main"
2b790 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2b7a0 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 44 65 73 74  e3_open_v2(zDest
2b7b0 46 69 6c 65 2c 20 26 70 44 65 73 74 2c 20 0a 20  File, &pDest, . 
2b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2b7e0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
2b7f0 45 4e 5f 43 52 45 41 54 45 2c 20 7a 56 66 73 29  EN_CREATE, zVfs)
2b800 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2b810 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b820 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2b830 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
2b840 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
2b850 6e 22 2c 20 7a 44 65 73 74 46 69 6c 65 29 3b 0a  n", zDestFile);.
2b860 20 20 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70        close_db(p
2b870 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Dest);.      ret
2b880 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2b890 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
2b8a0 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71      pBackup = sq
2b8b0 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69  lite3_backup_ini
2b8c0 74 28 70 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c  t(pDest, "main",
2b8d0 20 70 2d 3e 64 62 2c 20 7a 44 62 29 3b 0a 20 20   p->db, zDb);.  
2b8e0 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30    if( pBackup==0
2b8f0 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
2b900 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2b910 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
2b920 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73  ite3_errmsg(pDes
2b930 74 29 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  t));.      close
2b940 5f 64 62 28 70 44 65 73 74 29 3b 0a 20 20 20 20  _db(pDest);.    
2b950 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2b960 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28 72  }.    while(  (r
2b970 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  c = sqlite3_back
2b980 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c  up_step(pBackup,
2b990 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  100))==SQLITE_OK
2b9a0 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33   ){}.    sqlite3
2b9b0 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70  _backup_finish(p
2b9c0 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28  Backup);.    if(
2b9d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
2b9e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30   ){.      rc = 0
2b9f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2ba00 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2ba10 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
2ba20 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
2ba30 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20  rmsg(pDest));.  
2ba40 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2ba50 7d 0a 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70  }.    close_db(p
2ba60 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  Dest);.  }else..
2ba70 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20    if( c=='b' && 
2ba80 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
2ba90 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 69 6c 22  azArg[0], "bail"
2baa0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
2bab0 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
2bac0 20 20 20 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f      bail_on_erro
2bad0 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  r = booleanValue
2bae0 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20  (azArg[1]);.    
2baf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
2bb00 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2bb10 22 55 73 61 67 65 3a 20 2e 62 61 69 6c 20 6f 6e  "Usage: .bail on
2bb20 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |off\n");.      
2bb30 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
2bb40 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2bb50 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'b' && n>=3 && s
2bb60 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2bb70 20 22 62 69 6e 61 72 79 22 2c 20 6e 29 3d 3d 30   "binary", n)==0
2bb80 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
2bb90 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
2bba0 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
2bbb0 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20  Arg[1]) ){.     
2bbc0 20 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65     setBinaryMode
2bbd0 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20  (p->out, 1);.   
2bbe0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bbf0 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 70 2d    setTextMode(p-
2bc00 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  >out, 1);.      
2bc10 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2bc20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2bc30 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62  derr, "Usage: .b
2bc40 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 5c 6e 22 29  inary on|off\n")
2bc50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2bc60 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2bc70 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 73   if( c=='c' && s
2bc80 74 72 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22  trcmp(azArg[0],"
2bc90 63 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  cd")==0 ){.    i
2bca0 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 23 69  f( nArg==2 ){.#i
2bcb0 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
2bcc0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
2bcd0 33 32 29 0a 20 20 20 20 20 20 77 63 68 61 72 5f  32).      wchar_
2bce0 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 77  t *z = sqlite3_w
2bcf0 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69  in32_utf8_to_uni
2bd00 63 6f 64 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  code(azArg[1]);.
2bd10 20 20 20 20 20 20 72 63 20 3d 20 21 53 65 74 43        rc = !SetC
2bd20 75 72 72 65 6e 74 44 69 72 65 63 74 6f 72 79 57  urrentDirectoryW
2bd30 28 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (z);.      sqlit
2bd40 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73  e3_free(z);.#els
2bd50 65 0a 20 20 20 20 20 20 72 63 20 3d 20 63 68 64  e.      rc = chd
2bd60 69 72 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 65  ir(azArg[1]);.#e
2bd70 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72  ndif.      if( r
2bd80 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  c ){.        utf
2bd90 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2bda0 20 22 43 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20   "Cannot change 
2bdb0 74 6f 20 64 69 72 65 63 74 6f 72 79 20 5c 22 25  to directory \"%
2bdc0 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d  s\"\n", azArg[1]
2bdd0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2bde0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
2bdf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
2be00 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2be10 55 73 61 67 65 3a 20 2e 63 64 20 44 49 52 45 43  Usage: .cd DIREC
2be20 54 4f 52 59 5c 6e 22 29 3b 0a 20 20 20 20 20 20  TORY\n");.      
2be30 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
2be40 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20  }else..  /* The 
2be50 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 22 2e 62  undocumented ".b
2be60 72 65 61 6b 70 6f 69 6e 74 22 20 63 6f 6d 6d 61  reakpoint" comma
2be70 6e 64 20 63 61 75 73 65 73 20 61 20 63 61 6c 6c  nd causes a call
2be80 20 74 6f 20 74 68 65 20 6e 6f 2d 6f 70 0a 20 20   to the no-op.  
2be90 2a 2a 20 72 6f 75 74 69 6e 65 20 6e 61 6d 65 64  ** routine named
2bea0 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74   test_breakpoint
2beb0 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ()..  */.  if( c
2bec0 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='b' && n>=3 &&
2bed0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2bee0 5d 2c 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c  ], "breakpoint",
2bef0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 65   n)==0 ){.    te
2bf00 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b  st_breakpoint();
2bf10 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2bf20 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20 26  c=='c' && n>=3 &
2bf30 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2bf40 30 5d 2c 20 22 63 68 61 6e 67 65 73 22 2c 20 6e  0], "changes", n
2bf50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
2bf60 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
2bf70 20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28   setOrClearFlag(
2bf80 70 2c 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68  p, SHFLG_CountCh
2bf90 61 6e 67 65 73 2c 20 61 7a 41 72 67 5b 31 5d 29  anges, azArg[1])
2bfa0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2bfb0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2bfc0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63  derr, "Usage: .c
2bfd0 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 5c 6e 22  hanges on|off\n"
2bfe0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2bff0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
2c000 20 20 2f 2a 20 43 61 6e 63 65 6c 20 6f 75 74 70    /* Cancel outp
2c010 75 74 20 72 65 64 69 72 65 63 74 69 6f 6e 2c 20  ut redirection, 
2c020 69 66 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  if it is current
2c030 6c 79 20 73 65 74 20 28 62 79 20 2e 74 65 73 74  ly set (by .test
2c040 63 61 73 65 29 0a 20 20 2a 2a 20 54 68 65 6e 20  case).  ** Then 
2c050 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  read the content
2c060 20 6f 66 20 74 68 65 20 74 65 73 74 63 61 73 65   of the testcase
2c070 2d 6f 75 74 2e 74 78 74 20 66 69 6c 65 20 61 6e  -out.txt file an
2c080 64 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  d compare agains
2c090 74 0a 20 20 2a 2a 20 61 7a 41 72 67 5b 31 5d 2e  t.  ** azArg[1].
2c0a0 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64    If there are d
2c0b0 69 66 66 65 72 65 6e 63 65 73 2c 20 72 65 70 6f  ifferences, repo
2c0c0 72 74 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 20  rt an error and 
2c0d0 65 78 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  exit..  */.  if(
2c0e0 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20   c=='c' && n>=3 
2c0f0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2c100 5b 30 5d 2c 20 22 63 68 65 63 6b 22 2c 20 6e 29  [0], "check", n)
2c110 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
2c120 2a 7a 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 6f  *zRes = 0;.    o
2c130 75 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a  utput_reset(p);.
2c140 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20      if( nArg!=2 
2c150 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2c160 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2c170 67 65 3a 20 2e 63 68 65 63 6b 20 47 4c 4f 42 2d  ge: .check GLOB-
2c180 50 41 54 54 45 52 4e 5c 6e 22 29 3b 0a 20 20 20  PATTERN\n");.   
2c190 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d     rc = 2;.    }
2c1a0 65 6c 73 65 20 69 66 28 20 28 7a 52 65 73 20 3d  else if( (zRes =
2c1b0 20 72 65 61 64 46 69 6c 65 28 22 74 65 73 74 63   readFile("testc
2c1c0 61 73 65 2d 6f 75 74 2e 74 78 74 22 2c 20 30 29  ase-out.txt", 0)
2c1d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61  )==0 ){.      ra
2c1e0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2c1f0 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
2c200 72 65 61 64 20 27 74 65 73 74 63 61 73 65 2d 6f  read 'testcase-o
2c210 75 74 2e 74 78 74 27 5c 6e 22 29 3b 0a 20 20 20  ut.txt'\n");.   
2c220 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d     rc = 2;.    }
2c230 65 6c 73 65 20 69 66 28 20 74 65 73 74 63 61 73  else if( testcas
2c240 65 5f 67 6c 6f 62 28 61 7a 41 72 67 5b 31 5d 2c  e_glob(azArg[1],
2c250 7a 52 65 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  zRes)==0 ){.    
2c260 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2c270 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20  derr,.          
2c280 20 20 20 20 20 20 20 22 74 65 73 74 63 61 73 65         "testcase
2c290 2d 25 73 20 46 41 49 4c 45 44 5c 6e 20 45 78 70  -%s FAILED\n Exp
2c2a0 65 63 74 65 64 3a 20 5b 25 73 5d 5c 6e 20 20 20  ected: [%s]\n   
2c2b0 20 20 20 47 6f 74 3a 20 5b 25 73 5d 5c 6e 22 2c     Got: [%s]\n",
2c2c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c2d0 20 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c 20    p->zTestcase, 
2c2e0 61 7a 41 72 67 5b 31 5d 2c 20 7a 52 65 73 29 3b  azArg[1], zRes);
2c2f0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2c300 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c310 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f  utf8_printf(stdo
2c320 75 74 2c 20 22 74 65 73 74 63 61 73 65 2d 25 73  ut, "testcase-%s
2c330 20 6f 6b 5c 6e 22 2c 20 70 2d 3e 7a 54 65 73 74   ok\n", p->zTest
2c340 63 61 73 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  case);.      p->
2c350 6e 43 68 65 63 6b 2b 2b 3b 0a 20 20 20 20 7d 0a  nCheck++;.    }.
2c360 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2c370 28 7a 52 65 73 29 3b 0a 20 20 7d 65 6c 73 65 0a  (zRes);.  }else.
2c380 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26  .  if( c=='c' &&
2c390 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2c3a0 5d 2c 20 22 63 6c 6f 6e 65 22 2c 20 6e 29 3d 3d  ], "clone", n)==
2c3b0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
2c3c0 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 74 72  g==2 ){.      tr
2c3d0 79 54 6f 43 6c 6f 6e 65 28 70 2c 20 61 7a 41 72  yToClone(p, azAr
2c3e0 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
2c3f0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2c400 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2c410 65 3a 20 2e 63 6c 6f 6e 65 20 46 49 4c 45 4e 41  e: .clone FILENA
2c420 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ME\n");.      rc
2c430 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
2c440 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64  lse..  if( c=='d
2c450 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74 72 6e  ' && n>1 && strn
2c460 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64  cmp(azArg[0], "d
2c470 61 74 61 62 61 73 65 73 22 2c 20 6e 29 3d 3d 30  atabases", n)==0
2c480 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61   ){.    ShellSta
2c490 74 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61  te data;.    cha
2c4a0 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
2c4b0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
2c4c0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
2c4d0 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64  ata, p, sizeof(d
2c4e0 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e  ata));.    data.
2c4f0 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a  showHeader = 0;.
2c500 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
2c510 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
2c520 45 5f 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69  E_List;.    sqli
2c530 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2c540 65 6f 66 28 64 61 74 61 2e 63 6f 6c 53 65 70 61  eof(data.colSepa
2c550 72 61 74 6f 72 29 2c 64 61 74 61 2e 63 6f 6c 53  rator),data.colS
2c560 65 70 61 72 61 74 6f 72 2c 22 3a 20 22 29 3b 0a  eparator,": ");.
2c570 20 20 20 20 64 61 74 61 2e 63 6e 74 20 3d 20 30      data.cnt = 0
2c580 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
2c590 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43  ec(p->db, "SELEC
2c5a0 54 20 6e 61 6d 65 2c 20 66 69 6c 65 20 46 52 4f  T name, file FRO
2c5b0 4d 20 70 72 61 67 6d 61 5f 64 61 74 61 62 61 73  M pragma_databas
2c5c0 65 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20 20 20  e_list",.       
2c5d0 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61            callba
2c5e0 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
2c5f0 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  Msg);.    if( zE
2c600 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 75  rrMsg ){.      u
2c610 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2c620 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  r,"Error: %s\n",
2c630 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20   zErrMsg);.     
2c640 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
2c650 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63  rrMsg);.      rc
2c660 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
2c670 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64  lse..  if( c=='d
2c680 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
2c690 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2c6a0 64 62 63 6f 6e 66 69 67 22 2c 20 6e 29 3d 3d 30  dbconfig", n)==0
2c6b0 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
2c6c0 6f 6e 73 74 20 73 74 72 75 63 74 20 44 62 43 6f  onst struct DbCo
2c6d0 6e 66 69 67 43 68 6f 69 63 65 73 20 7b 0a 20 20  nfigChoices {.  
2c6e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2c6f0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74  zName;.      int
2c700 20 6f 70 3b 0a 20 20 20 20 7d 20 61 44 62 43 6f   op;.    } aDbCo
2c710 6e 66 69 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  nfig[] = {.     
2c720 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 66 6b 65     { "enable_fke
2c730 79 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f  y",      SQLITE_
2c740 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
2c750 46 4b 45 59 20 20 20 20 20 20 20 20 20 20 20 20  FKEY            
2c760 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 65 6e  },.        { "en
2c770 61 62 6c 65 5f 74 72 69 67 67 65 72 22 2c 20 20  able_trigger",  
2c780 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
2c790 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 20  _ENABLE_TRIGGER 
2c7a0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2c7b0 20 20 20 7b 20 22 66 74 73 33 5f 74 6f 6b 65 6e     { "fts3_token
2c7c0 69 7a 65 72 22 2c 20 20 20 53 51 4c 49 54 45 5f  izer",   SQLITE_
2c7d0 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
2c7e0 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 20 20  FTS3_TOKENIZER  
2c7f0 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 6c 6f  },.        { "lo
2c800 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20  ad_extension",  
2c810 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
2c820 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54  _ENABLE_LOAD_EXT
2c830 45 4e 53 49 4f 4e 20 20 7d 2c 0a 20 20 20 20 20  ENSION  },.     
2c840 20 20 20 7b 20 22 6e 6f 5f 63 6b 70 74 5f 6f 6e     { "no_ckpt_on
2c850 5f 63 6c 6f 73 65 22 2c 20 53 51 4c 49 54 45 5f  _close", SQLITE_
2c860 44 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54  DBCONFIG_NO_CKPT
2c870 5f 4f 4e 5f 43 4c 4f 53 45 20 20 20 20 20 20 20  _ON_CLOSE       
2c880 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 65 6e  },.        { "en
2c890 61 62 6c 65 5f 71 70 73 67 22 2c 20 20 20 20 20  able_qpsg",     
2c8a0 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
2c8b0 5f 45 4e 41 42 4c 45 5f 51 50 53 47 20 20 20 20  _ENABLE_QPSG    
2c8c0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2c8d0 20 20 20 7b 20 22 74 72 69 67 67 65 72 5f 65 71     { "trigger_eq
2c8e0 70 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f  p",      SQLITE_
2c8f0 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52  DBCONFIG_TRIGGER
2c900 5f 45 51 50 20 20 20 20 20 20 20 20 20 20 20 20  _EQP            
2c910 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 72 65  },.        { "re
2c920 73 65 74 5f 64 61 74 61 62 61 73 65 22 2c 20 20  set_database",  
2c930 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
2c940 5f 52 45 53 45 54 5f 44 41 54 41 42 41 53 45 20  _RESET_DATABASE 
2c950 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7d          },.    }
2c960 3b 0a 20 20 20 20 69 6e 74 20 69 69 2c 20 76 3b  ;.    int ii, v;
2c970 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
2c980 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  0);.    for(ii=0
2c990 3b 20 69 69 3c 41 72 72 61 79 53 69 7a 65 28 61  ; ii<ArraySize(a
2c9a0 44 62 43 6f 6e 66 69 67 29 3b 20 69 69 2b 2b 29  DbConfig); ii++)
2c9b0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  {.      if( nArg
2c9c0 3e 31 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41  >1 && strcmp(azA
2c9d0 72 67 5b 31 5d 2c 20 61 44 62 43 6f 6e 66 69 67  rg[1], aDbConfig
2c9e0 5b 69 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29  [ii].zName)!=0 )
2c9f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2ca00 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a   if( nArg>=3 ){.
2ca10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2ca20 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c  db_config(p->db,
2ca30 20 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 6f   aDbConfig[ii].o
2ca40 70 2c 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28  p, booleanValue(
2ca50 61 7a 41 72 67 5b 32 5d 29 2c 20 30 29 3b 0a 20  azArg[2]), 0);. 
2ca60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2ca70 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70  ite3_db_config(p
2ca80 2d 3e 64 62 2c 20 61 44 62 43 6f 6e 66 69 67 5b  ->db, aDbConfig[
2ca90 69 69 5d 2e 6f 70 2c 20 2d 31 2c 20 26 76 29 3b  ii].op, -1, &v);
2caa0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2cab0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 38 73  tf(p->out, "%18s
2cac0 20 25 73 5c 6e 22 2c 20 61 44 62 43 6f 6e 66 69   %s\n", aDbConfi
2cad0 67 5b 69 69 5d 2e 7a 4e 61 6d 65 2c 20 76 20 3f  g[ii].zName, v ?
2cae0 20 22 6f 6e 22 20 3a 20 22 6f 66 66 22 29 3b 0a   "on" : "off");.
2caf0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31        if( nArg>1
2cb00 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
2cb10 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26      if( nArg>1 &
2cb20 26 20 69 69 3d 3d 41 72 72 61 79 53 69 7a 65 28  & ii==ArraySize(
2cb30 61 44 62 43 6f 6e 66 69 67 29 20 29 7b 0a 20 20  aDbConfig) ){.  
2cb40 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2cb50 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2cb60 75 6e 6b 6e 6f 77 6e 20 64 62 63 6f 6e 66 69 67  unknown dbconfig
2cb70 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
2cb80 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 75 74 66  g[1]);.      utf
2cb90 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2cba0 20 22 45 6e 74 65 72 20 5c 22 2e 64 62 63 6f 6e   "Enter \".dbcon
2cbb0 66 69 67 5c 22 20 77 69 74 68 20 6e 6f 20 61 72  fig\" with no ar
2cbc0 67 75 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c 69  guments for a li
2cbd0 73 74 5c 6e 22 29 3b 0a 20 20 20 20 7d 20 20 20  st\n");.    }   
2cbe0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2cbf0 63 3d 3d 27 64 27 20 26 26 20 6e 3e 3d 33 20 26  c=='d' && n>=3 &
2cc00 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2cc10 30 5d 2c 20 22 64 62 69 6e 66 6f 22 2c 20 6e 29  0], "dbinfo", n)
2cc20 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
2cc30 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d  shell_dbinfo_com
2cc40 6d 61 6e 64 28 70 2c 20 6e 41 72 67 2c 20 61 7a  mand(p, nArg, az
2cc50 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  Arg);.  }else.. 
2cc60 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73   if( c=='d' && s
2cc70 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2cc80 20 22 64 75 6d 70 22 2c 20 6e 29 3d 3d 30 20 29   "dump", n)==0 )
2cc90 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2cca0 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 0a 20 20 20   *zLike = 0;.   
2ccb0 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
2ccc0 73 61 76 65 64 53 68 6f 77 48 65 61 64 65 72 20  savedShowHeader 
2ccd0 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b  = p->showHeader;
2cce0 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64 53 68  .    int savedSh
2ccf0 65 6c 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 68  ellFlags = p->sh
2cd00 65 6c 6c 46 6c 67 73 3b 0a 20 20 20 20 53 68 65  ellFlgs;.    She
2cd10 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53  llClearFlag(p, S
2cd20 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77  HFLG_PreserveRow
2cd30 69 64 7c 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65  id|SHFLG_Newline
2cd40 73 7c 53 48 46 4c 47 5f 45 63 68 6f 29 3b 0a 20  s|SHFLG_Echo);. 
2cd50 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41     for(i=1; i<nA
2cd60 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
2cd70 69 66 28 20 61 7a 41 72 67 5b 69 5d 5b 30 5d 3d  if( azArg[i][0]=
2cd80 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
2cd90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
2cda0 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20 20 20 20  azArg[i]+1;.    
2cdb0 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
2cdc0 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) z++;.       
2cdd0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 70   if( strcmp(z,"p
2cde0 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 22 29  reserve-rowids")
2cdf0 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ==0 ){.#ifdef SQ
2ce00 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2ce10 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 20  LTABLE.         
2ce20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2ce30 72 72 2c 20 22 54 68 65 20 2d 2d 70 72 65 73 65  rr, "The --prese
2ce40 72 76 65 2d 72 6f 77 69 64 73 20 6f 70 74 69 6f  rve-rowids optio
2ce50 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69  n is not compati
2ce60 62 6c 65 22 0a 20 20 20 20 20 20 20 20 20 20 20  ble".           
2ce70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce80 20 20 22 20 77 69 74 68 20 53 51 4c 49 54 45 5f    " with SQLITE_
2ce90 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2cea0 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  E\n");.         
2ceb0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
2cec0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
2ced0 6d 61 6e 64 5f 65 78 69 74 3b 0a 23 65 6c 73 65  mand_exit;.#else
2cee0 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c  .          Shell
2cef0 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  SetFlag(p, SHFLG
2cf00 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 29 3b  _PreserveRowid);
2cf10 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
2cf20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  }else.        if
2cf30 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e 65 77 6c  ( strcmp(z,"newl
2cf40 69 6e 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ines")==0 ){.   
2cf50 20 20 20 20 20 20 20 53 68 65 6c 6c 53 65 74 46         ShellSetF
2cf60 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77  lag(p, SHFLG_New
2cf70 6c 69 6e 65 73 29 3b 0a 20 20 20 20 20 20 20 20  lines);.        
2cf80 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a  }else.        {.
2cf90 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
2cfa0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e  intf(stderr, "Un
2cfb0 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25  known option \"%
2cfc0 73 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d 70 5c 22  s\" on \".dump\"
2cfd0 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  \n", azArg[i]);.
2cfe0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
2cff0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2d000 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2d010 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  it;.        }.  
2d020 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c      }else if( zL
2d030 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ike ){.        r
2d040 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2d050 2c 20 22 55 73 61 67 65 3a 20 2e 64 75 6d 70 20  , "Usage: .dump 
2d060 3f 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f 77 69  ?--preserve-rowi
2d070 64 73 3f 20 22 0a 20 20 20 20 20 20 20 20 20 20  ds? ".          
2d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d090 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f 20 3f   "?--newlines? ?
2d0a0 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22  LIKE-PATTERN?\n"
2d0b0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2d0c0 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
2d0d0 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
2d0e0 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
2d0f0 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d 20          zLike = 
2d100 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
2d110 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  }.    }.    open
2d120 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 2f  _db(p, 0);.    /
2d130 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62  * When playing b
2d140 61 63 6b 20 61 20 22 64 75 6d 70 22 2c 20 74 68  ack a "dump", th
2d150 65 20 63 6f 6e 74 65 6e 74 20 6d 69 67 68 74 20  e content might 
2d160 61 70 70 65 61 72 20 69 6e 20 61 6e 20 6f 72 64  appear in an ord
2d170 65 72 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20  er.    ** which 
2d180 63 61 75 73 65 73 20 69 6d 6d 65 64 69 61 74 65  causes immediate
2d190 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
2d1a0 73 74 72 61 69 6e 74 73 20 74 6f 20 62 65 20 76  straints to be v
2d1b0 69 6f 6c 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  iolated..    ** 
2d1c0 53 6f 20 64 69 73 61 62 6c 65 20 66 6f 72 65 69  So disable forei
2d1d0 67 6e 2d 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn-key constrain
2d1e0 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 74 6f  t enforcement to
2d1f0 20 70 72 65 76 65 6e 74 20 70 72 6f 62 6c 65 6d   prevent problem
2d200 73 2e 20 2a 2f 0a 20 20 20 20 72 61 77 5f 70 72  s. */.    raw_pr
2d210 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52  intf(p->out, "PR
2d220 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
2d230 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20  s=OFF;\n");.    
2d240 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
2d250 74 2c 20 22 42 45 47 49 4e 20 54 52 41 4e 53 41  t, "BEGIN TRANSA
2d260 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20  CTION;\n");.    
2d270 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d  p->writableSchem
2d280 61 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 68  a = 0;.    p->sh
2d290 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  owHeader = 0;.  
2d2a0 20 20 2f 2a 20 53 65 74 20 77 72 69 74 61 62 6c    /* Set writabl
2d2b0 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 73 69 6e 63  e_schema=ON sinc
2d2c0 65 20 64 6f 69 6e 67 20 73 6f 20 66 6f 72 63 65  e doing so force
2d2d0 73 20 53 51 4c 69 74 65 20 74 6f 20 69 6e 69 74  s SQLite to init
2d2e0 69 61 6c 69 7a 65 0a 20 20 20 20 2a 2a 20 61 73  ialize.    ** as
2d2f0 20 6d 75 63 68 20 6f 66 20 74 68 65 20 73 63 68   much of the sch
2d300 65 6d 61 20 61 73 20 69 74 20 63 61 6e 20 65 76  ema as it can ev
2d310 65 6e 20 69 66 20 74 68 65 20 73 71 6c 69 74 65  en if the sqlite
2d320 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 69 73  _master table is
2d330 0a 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 2e  .    ** corrupt.
2d340 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
2d350 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56  exec(p->db, "SAV
2d360 45 50 4f 49 4e 54 20 64 75 6d 70 3b 20 50 52 41  EPOINT dump; PRA
2d370 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
2d380 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20 30  ema=ON", 0, 0, 0
2d390 29 3b 0a 20 20 20 20 70 2d 3e 6e 45 72 72 20 3d  );.    p->nErr =
2d3a0 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6b   0;.    if( zLik
2d3b0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 75  e==0 ){.      ru
2d3c0 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75  n_schema_dump_qu
2d3d0 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22  ery(p,.        "
2d3e0 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70  SELECT name, typ
2d3f0 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
2d400 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
2d410 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
2d420 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65  OT NULL AND type
2d430 3d 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61  =='table' AND na
2d440 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73 65 71 75  me!='sqlite_sequ
2d450 65 6e 63 65 27 22 0a 20 20 20 20 20 20 29 3b 0a  ence'".      );.
2d460 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61        run_schema
2d470 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20  _dump_query(p,. 
2d480 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
2d490 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46  ame, type, sql F
2d4a0 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
2d4b0 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
2d4c0 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c 69 74 65  RE name=='sqlite
2d4d0 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20  _sequence'".    
2d4e0 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74    );.      run_t
2d4f0 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28  able_dump_query(
2d500 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  p,.        "SELE
2d510 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  CT sql FROM sqli
2d520 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
2d530 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
2d540 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65  OT NULL AND type
2d550 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72   IN ('index','tr
2d560 69 67 67 65 72 27 2c 27 76 69 65 77 27 29 22 2c  igger','view')",
2d570 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
2d580 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
2d590 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20 20 7a  r *zSql;.      z
2d5a0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
2d5b0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22  rintf(.        "
2d5c0 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70  SELECT name, typ
2d5d0 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
2d5e0 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
2d5f0 20 20 20 20 22 57 48 45 52 45 20 74 62 6c 5f 6e      "WHERE tbl_n
2d600 61 6d 65 20 4c 49 4b 45 20 25 51 20 41 4e 44 20  ame LIKE %Q AND 
2d610 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 22 0a 20  type=='table'". 
2d620 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 73 71         "  AND sq
2d630 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 7a 4c 69  l NOT NULL", zLi
2d640 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73  ke);.      run_s
2d650 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79  chema_dump_query
2d660 28 70 2c 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  (p,zSql);.      
2d670 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
2d680 6c 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  l);.      zSql =
2d690 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2d6a0 28 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  (.        "SELEC
2d6b0 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  T sql FROM sqlit
2d6c0 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
2d6d0 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f     "WHERE sql NO
2d6e0 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20  T NULL".        
2d6f0 22 20 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28  "  AND type IN (
2d700 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65 72  'index','trigger
2d710 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20 20  ','view')".     
2d720 20 20 20 22 20 20 41 4e 44 20 74 62 6c 5f 6e 61     "  AND tbl_na
2d730 6d 65 20 4c 49 4b 45 20 25 51 22 2c 20 7a 4c 69  me LIKE %Q", zLi
2d740 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74  ke);.      run_t
2d750 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28  able_dump_query(
2d760 70 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 20  p, zSql, 0);.   
2d770 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2d780 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
2d790 20 69 66 28 20 70 2d 3e 77 72 69 74 61 62 6c 65   if( p->writable
2d7a0 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
2d7b0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
2d7c0 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  t, "PRAGMA writa
2d7d0 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 5c  ble_schema=OFF;\
2d7e0 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72  n");.      p->wr
2d7f0 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30  itableSchema = 0
2d800 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2d810 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
2d820 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
2d830 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30  _schema=OFF;", 0
2d840 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
2d850 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
2d860 20 22 52 45 4c 45 41 53 45 20 64 75 6d 70 3b 22   "RELEASE dump;"
2d870 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
2d880 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
2d890 74 2c 20 70 2d 3e 6e 45 72 72 20 3f 20 22 52 4f  t, p->nErr ? "RO
2d8a0 4c 4c 42 41 43 4b 3b 20 2d 2d 20 64 75 65 20 74  LLBACK; -- due t
2d8b0 6f 20 65 72 72 6f 72 73 5c 6e 22 20 3a 20 22 43  o errors\n" : "C
2d8c0 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 20 20  OMMIT;\n");.    
2d8d0 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  p->showHeader = 
2d8e0 73 61 76 65 64 53 68 6f 77 48 65 61 64 65 72 3b  savedShowHeader;
2d8f0 0a 20 20 20 20 70 2d 3e 73 68 65 6c 6c 46 6c 67  .    p->shellFlg
2d900 73 20 3d 20 73 61 76 65 64 53 68 65 6c 6c 46 6c  s = savedShellFl
2d910 61 67 73 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  ags;.  }else..  
2d920 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
2d930 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2d940 22 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b  "echo", n)==0 ){
2d950 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
2d960 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43   ){.      setOrC
2d970 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c  learFlag(p, SHFL
2d980 47 5f 45 63 68 6f 2c 20 61 7a 41 72 67 5b 31 5d  G_Echo, azArg[1]
2d990 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2d9a0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2d9b0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2d9c0 65 63 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  echo on|off\n");
2d9d0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2d9e0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
2d9f0 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
2da00 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2da10 22 65 71 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  "eqp", n)==0 ){.
2da20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
2da30 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  ){.      p->auto
2da40 45 51 50 74 65 73 74 20 3d 20 30 3b 0a 20 20 20  EQPtest = 0;.   
2da50 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
2da60 41 72 67 5b 31 5d 2c 22 66 75 6c 6c 22 29 3d 3d  Arg[1],"full")==
2da70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
2da80 61 75 74 6f 45 51 50 20 3d 20 41 55 54 4f 45 51  autoEQP = AUTOEQ
2da90 50 5f 66 75 6c 6c 3b 0a 20 20 20 20 20 20 7d 65  P_full;.      }e
2daa0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
2dab0 7a 41 72 67 5b 31 5d 2c 22 74 72 69 67 67 65 72  zArg[1],"trigger
2dac0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
2dad0 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41 55   p->autoEQP = AU
2dae0 54 4f 45 51 50 5f 74 72 69 67 67 65 72 3b 0a 20  TOEQP_trigger;. 
2daf0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
2db00 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
2db10 74 65 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  test")==0 ){.   
2db20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20       p->autoEQP 
2db30 3d 20 41 55 54 4f 45 51 50 5f 6f 6e 3b 0a 20 20  = AUTOEQP_on;.  
2db40 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50        p->autoEQP
2db50 74 65 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  test = 1;.      
2db60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2db70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 28 75 38 29  ->autoEQP = (u8)
2db80 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
2db90 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  rg[1]);.      }.
2dba0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2dbb0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2dbc0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65 71 70  rr, "Usage: .eqp
2dbd0 20 6f 66 66 7c 6f 6e 7c 74 72 69 67 67 65 72 7c   off|on|trigger|
2dbe0 66 75 6c 6c 5c 6e 22 29 3b 0a 20 20 20 20 20 20  full\n");.      
2dbf0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
2dc00 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2dc10 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'e' && strncmp(a
2dc20 7a 41 72 67 5b 30 5d 2c 20 22 65 78 69 74 22 2c  zArg[0], "exit",
2dc30 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
2dc40 28 20 6e 41 72 67 3e 31 20 26 26 20 28 72 63 20  ( nArg>1 && (rc 
2dc50 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61  = (int)integerVa
2dc60 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 29 21 3d  lue(azArg[1]))!=
2dc70 30 20 29 20 65 78 69 74 28 72 63 29 3b 0a 20 20  0 ) exit(rc);.  
2dc80 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73    rc = 2;.  }els
2dc90 65 0a 0a 20 20 2f 2a 20 54 68 65 20 22 2e 65 78  e..  /* The ".ex
2dca0 70 6c 61 69 6e 22 20 63 6f 6d 6d 61 6e 64 20 69  plain" command i
2dcb0 73 20 61 75 74 6f 6d 61 74 69 63 20 6e 6f 77 2e  s automatic now.
2dcc0 20 20 49 74 20 69 73 20 6c 61 72 67 65 6c 79 20    It is largely 
2dcd0 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 74 0a 20  pointless.  It. 
2dce0 20 2a 2a 20 72 65 74 61 69 6e 65 64 20 70 75 72   ** retained pur
2dcf0 65 6c 79 20 66 6f 72 20 62 61 63 6b 77 61 72 64  ely for backward
2dd00 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
2dd10 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20  */.  if( c=='e' 
2dd20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2dd30 5b 30 5d 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20  [0], "explain", 
2dd40 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  n)==0 ){.    int
2dd50 20 76 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66   val = 1;.    if
2dd60 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20  ( nArg>=2 ){.   
2dd70 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
2dd80 41 72 67 5b 31 5d 2c 22 61 75 74 6f 22 29 3d 3d  Arg[1],"auto")==
2dd90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 76 61 6c  0 ){.        val
2dda0 20 3d 20 39 39 3b 0a 20 20 20 20 20 20 7d 65 6c   = 99;.      }el
2ddb0 73 65 7b 0a 20 20 20 20 20 20 20 20 76 61 6c 20  se{.        val 
2ddc0 3d 20 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28  =  booleanValue(
2ddd0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
2dde0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2ddf0 20 76 61 6c 3d 3d 31 20 26 26 20 70 2d 3e 6d 6f   val==1 && p->mo
2de00 64 65 21 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  de!=MODE_Explain
2de10 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 6f 72   ){.      p->nor
2de20 6d 61 6c 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64  malMode = p->mod
2de30 65 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  e;.      p->mode
2de40 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b   = MODE_Explain;
2de50 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78  .      p->autoEx
2de60 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  plain = 0;.    }
2de70 65 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d 30 20  else if( val==0 
2de80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
2de90 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61  mode==MODE_Expla
2dea0 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d 20 70  in ) p->mode = p
2deb0 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20 20  ->normalMode;.  
2dec0 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61      p->autoExpla
2ded0 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  in = 0;.    }els
2dee0 65 20 69 66 28 20 76 61 6c 3d 3d 39 39 20 29 7b  e if( val==99 ){
2def0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f  .      if( p->mo
2df00 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  de==MODE_Explain
2df10 20 29 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e   ) p->mode = p->
2df20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20 20 20 20  normalMode;.    
2df30 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e    p->autoExplain
2df40 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
2df50 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  lse..#ifndef SQL
2df60 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2df70 54 41 42 4c 45 0a 20 20 69 66 28 20 63 3d 3d 27  TABLE.  if( c=='
2df80 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  e' && strncmp(az
2df90 41 72 67 5b 30 5d 2c 20 22 65 78 70 65 72 74 22  Arg[0], "expert"
2dfa0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  , n)==0 ){.    o
2dfb0 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
2dfc0 20 20 65 78 70 65 72 74 44 6f 74 43 6f 6d 6d 61    expertDotComma
2dfd0 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72  nd(p, azArg, nAr
2dfe0 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  g);.  }else.#end
2dff0 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 66 27  if..  if( c=='f'
2e000 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2e010 67 5b 30 5d 2c 20 22 66 75 6c 6c 73 63 68 65 6d  g[0], "fullschem
2e020 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  a", n)==0 ){.   
2e030 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61   ShellState data
2e040 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  ;.    char *zErr
2e050 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Msg = 0;.    int
2e060 20 64 6f 53 74 61 74 73 20 3d 20 30 3b 0a 20 20   doStats = 0;.  
2e070 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20    memcpy(&data, 
2e080 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29  p, sizeof(data))
2e090 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48  ;.    data.showH
2e0a0 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64  eader = 0;.    d
2e0b0 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
2e0c0 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d  .mode = MODE_Sem
2e0d0 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  i;.    if( nArg=
2e0e0 3d 32 20 26 26 20 6f 70 74 69 6f 6e 4d 61 74 63  =2 && optionMatc
2e0f0 68 28 61 7a 41 72 67 5b 31 5d 2c 20 22 69 6e 64  h(azArg[1], "ind
2e100 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 64  ent") ){.      d
2e110 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
2e120 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 50 72 65  .mode = MODE_Pre
2e130 74 74 79 3b 0a 20 20 20 20 20 20 6e 41 72 67 20  tty;.      nArg 
2e140 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
2e150 66 28 20 6e 41 72 67 21 3d 31 20 29 7b 0a 20 20  f( nArg!=1 ){.  
2e160 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2e170 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2e180 66 75 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e  fullschema ?--in
2e190 64 65 6e 74 3f 5c 6e 22 29 3b 0a 20 20 20 20 20  dent?\n");.     
2e1a0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
2e1b0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2e1c0 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
2e1d0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
2e1e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e1f0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20  _exec(p->db,.   
2e200 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20      "SELECT sql 
2e210 46 52 4f 4d 22 0a 20 20 20 20 20 20 20 22 20 20  FROM".       "  
2e220 28 53 45 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c  (SELECT sql sql,
2e230 20 74 79 70 65 20 74 79 70 65 2c 20 74 62 6c 5f   type type, tbl_
2e240 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e  name tbl_name, n
2e250 61 6d 65 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20  ame name, rowid 
2e260 78 22 0a 20 20 20 20 20 20 20 22 20 20 20 20 20  x".       "     
2e270 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
2e280 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20  er UNION ALL".  
2e290 20 20 20 20 20 22 20 20 20 53 45 4c 45 43 54 20       "   SELECT 
2e2a0 73 71 6c 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e  sql, type, tbl_n
2e2b0 61 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64  ame, name, rowid
2e2c0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d   FROM sqlite_tem
2e2d0 70 5f 6d 61 73 74 65 72 29 20 22 0a 20 20 20 20  p_master) ".    
2e2e0 20 20 20 22 57 48 45 52 45 20 74 79 70 65 21 3d     "WHERE type!=
2e2f0 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 4e  'meta' AND sql N
2e300 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20  OTNULL AND name 
2e310 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65  NOT LIKE 'sqlite
2e320 5f 25 27 20 22 0a 20 20 20 20 20 20 20 22 4f 52  _%' ".       "OR
2e330 44 45 52 20 42 59 20 72 6f 77 69 64 22 2c 0a 20  DER BY rowid",. 
2e340 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20        callback, 
2e350 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a  &data, &zErrMsg.
2e360 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72      );.    if( r
2e370 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e380 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
2e390 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 20  mt *pStmt;.     
2e3a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
2e3b0 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a  epare_v2(p->db,.
2e3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2e3d0 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
2e3e0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
2e3f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e400 22 20 57 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f  " WHERE name GLO
2e410 42 20 27 73 71 6c 69 74 65 5f 73 74 61 74 5b 31  B 'sqlite_stat[1
2e420 33 34 5d 27 22 2c 0a 20 20 20 20 20 20 20 20 20  34]'",.         
2e430 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74        -1, &pStmt
2e440 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 6f 53 74  , 0);.      doSt
2e450 61 74 73 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  ats = sqlite3_st
2e460 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
2e470 45 5f 52 4f 57 3b 0a 20 20 20 20 20 20 73 71 6c  E_ROW;.      sql
2e480 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
2e490 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tmt);.    }.    
2e4a0 69 66 28 20 64 6f 53 74 61 74 73 3d 3d 30 20 29  if( doStats==0 )
2e4b0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2e4c0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 20 4e  tf(p->out, "/* N
2e4d0 6f 20 53 54 41 54 20 74 61 62 6c 65 73 20 61 76  o STAT tables av
2e4e0 61 69 6c 61 62 6c 65 20 2a 2f 5c 6e 22 29 3b 0a  ailable */\n");.
2e4f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e500 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
2e510 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c  ut, "ANALYZE sql
2e520 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b  ite_master;\n");
2e530 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65  .      sqlite3_e
2e540 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45  xec(p->db, "SELE
2e550 43 54 20 27 41 4e 41 4c 59 5a 45 20 73 71 6c 69  CT 'ANALYZE sqli
2e560 74 65 5f 6d 61 73 74 65 72 27 22 2c 0a 20 20 20  te_master'",.   
2e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e580 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
2e590 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
2e5a0 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64    data.cMode = d
2e5b0 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f  ata.mode = MODE_
2e5c0 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 64 61  Insert;.      da
2e5d0 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  ta.zDestTable = 
2e5e0 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 3b 0a  "sqlite_stat1";.
2e5f0 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63        shell_exec
2e600 28 26 64 61 74 61 2c 20 22 53 45 4c 45 43 54 20  (&data, "SELECT 
2e610 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  * FROM sqlite_st
2e620 61 74 31 22 2c 20 26 7a 45 72 72 4d 73 67 29 3b  at1", &zErrMsg);
2e630 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44 65 73  .      data.zDes
2e640 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69 74 65  tTable = "sqlite
2e650 5f 73 74 61 74 33 22 3b 0a 20 20 20 20 20 20 73  _stat3";.      s
2e660 68 65 6c 6c 5f 65 78 65 63 28 26 64 61 74 61 2c  hell_exec(&data,
2e670 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
2e680 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 20 26  sqlite_stat3", &
2e690 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
2e6a0 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20  data.zDestTable 
2e6b0 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22  = "sqlite_stat4"
2e6c0 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78  ;.      shell_ex
2e6d0 65 63 28 26 64 61 74 61 2c 20 22 53 45 4c 45 43  ec(&data, "SELEC
2e6e0 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
2e6f0 73 74 61 74 34 22 2c 20 26 7a 45 72 72 4d 73 67  stat4", &zErrMsg
2e700 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
2e710 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41  ntf(p->out, "ANA
2e720 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74  LYZE sqlite_mast
2e730 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20  er;\n");.    }. 
2e740 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2e750 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='h' && strncmp(
2e760 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 61 64 65  azArg[0], "heade
2e770 72 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  rs", n)==0 ){.  
2e780 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
2e790 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f 77 48 65  .      p->showHe
2e7a0 61 64 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61  ader = booleanVa
2e7b0 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
2e7c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e7d0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2e7e0 72 2c 20 22 55 73 61 67 65 3a 20 2e 68 65 61 64  r, "Usage: .head
2e7f0 65 72 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a  ers on|off\n");.
2e800 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2e810 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
2e820 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72  f( c=='h' && str
2e830 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2e840 68 65 6c 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  help", n)==0 ){.
2e850 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 32 20      if( nArg>=2 
2e860 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
2e870 20 73 68 6f 77 48 65 6c 70 28 70 2d 3e 6f 75 74   showHelp(p->out
2e880 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
2e890 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
2e8a0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2e8b0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 4e 6f 74 68  tf(p->out, "Noth
2e8c0 69 6e 67 20 6d 61 74 63 68 65 73 20 27 25 73 27  ing matches '%s'
2e8d0 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  \n", azArg[1]);.
2e8e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2e8f0 65 7b 0a 20 20 20 20 20 20 73 68 6f 77 48 65 6c  e{.      showHel
2e900 70 28 70 2d 3e 6f 75 74 2c 20 30 29 3b 0a 20 20  p(p->out, 0);.  
2e910 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
2e920 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72  f( c=='i' && str
2e930 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2e940 69 6d 70 6f 72 74 22 2c 20 6e 29 3d 3d 30 20 29  import", n)==0 )
2e950 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62  {.    char *zTab
2e960 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2e970 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61    /* Insert data
2e980 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65   into this table
2e990 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46   */.    char *zF
2e9a0 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2e9b0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66      /* Name of f
2e9c0 69 6c 65 20 74 6f 20 65 78 74 72 61 20 63 6f 6e  ile to extra con
2e9d0 74 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  tent from */.   
2e9e0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2e9f0 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 2f 2a 20  Stmt = NULL; /* 
2ea00 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  A statement */. 
2ea10 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
2ea20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ea30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
2ea40 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
2ea50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
2ea60 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2ea70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2ea80 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c   bytes in an SQL
2ea90 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69   string */.    i
2eaa0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
2eab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2eac0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
2ead0 20 20 20 69 6e 74 20 6e 65 65 64 43 6f 6d 6d 69     int needCommi
2eae0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
2eaf0 2a 20 54 72 75 65 20 74 6f 20 43 4f 4d 4d 49 54  * True to COMMIT
2eb00 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 61 74 20   or ROLLBACK at 
2eb10 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  end */.    int n
2eb20 53 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sep;            
2eb30 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2eb40 20 6f 66 20 62 79 74 65 73 20 69 6e 20 70 2d 3e   of bytes in p->
2eb50 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 5d 20 2a  colSeparator[] *
2eb60 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  /.    char *zSql
2eb70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2eb80 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74    /* An SQL stat
2eb90 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 49 6d 70  ement */.    Imp
2eba0 6f 72 74 43 74 78 20 73 43 74 78 3b 20 20 20 20  ortCtx sCtx;    
2ebb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
2ebc0 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
2ebd0 20 20 63 68 61 72 20 2a 28 53 51 4c 49 54 45 5f    char *(SQLITE_
2ebe0 43 44 45 43 4c 20 2a 78 52 65 61 64 29 28 49 6d  CDECL *xRead)(Im
2ebf0 70 6f 72 74 43 74 78 2a 29 3b 20 2f 2a 20 46 75  portCtx*); /* Fu
2ec00 6e 63 20 74 6f 20 72 65 61 64 20 6f 6e 65 20 76  nc to read one v
2ec10 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  alue */.    int 
2ec20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 78  (SQLITE_CDECL *x
2ec30 43 6c 6f 73 65 72 29 28 46 49 4c 45 2a 29 3b 20  Closer)(FILE*); 
2ec40 20 20 20 20 20 2f 2a 20 46 75 6e 63 20 74 6f 20       /* Func to 
2ec50 63 6c 6f 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  close file */.. 
2ec60 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29     if( nArg!=3 )
2ec70 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2ec80 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2ec90 65 3a 20 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20  e: .import FILE 
2eca0 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20  TABLE\n");.     
2ecb0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2ecc0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
2ecd0 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67     zFile = azArg
2ece0 5b 31 5d 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20  [1];.    zTable 
2ecf0 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20  = azArg[2];.    
2ed00 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20  seenInterrupt = 
2ed10 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  0;.    memset(&s
2ed20 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Ctx, 0, sizeof(s
2ed30 43 74 78 29 29 3b 0a 20 20 20 20 6f 70 65 6e 5f  Ctx));.    open_
2ed40 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6e 53  db(p, 0);.    nS
2ed50 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d  ep = strlen30(p-
2ed60 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
2ed70 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20      if( nSep==0 
2ed80 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2ed90 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20  ntf(stderr,.    
2eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45 72               "Er
2edb0 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 63 6f  ror: non-null co
2edc0 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 72  lumn separator r
2edd0 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d 70 6f  equired for impo
2ede0 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  rt\n");.      re
2edf0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
2ee00 20 20 69 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a    if( nSep>1 ){.
2ee10 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2ee20 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
2ee30 20 6d 75 6c 74 69 2d 63 68 61 72 61 63 74 65 72   multi-character
2ee40 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
2ee50 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a  rs not allowed".
2ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee70 20 20 20 20 20 20 22 20 66 6f 72 20 69 6d 70 6f        " for impo
2ee80 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  rt\n");.      re
2ee90 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
2eea0 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33    nSep = strlen3
2eeb0 30 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  0(p->rowSeparato
2eec0 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70  r);.    if( nSep
2eed0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
2eee0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2eef0 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c  "Error: non-null
2ef00 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20 72   row separator r
2ef10 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d 70 6f  equired for impo
2ef20 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  rt\n");.      re
2ef30 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
2ef40 20 20 69 66 28 20 6e 53 65 70 3d 3d 32 20 26 26    if( nSep==2 &&
2ef50 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 43   p->mode==MODE_C
2ef60 73 76 20 26 26 20 73 74 72 63 6d 70 28 70 2d 3e  sv && strcmp(p->
2ef70 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45  rowSeparator, SE
2ef80 50 5f 43 72 4c 66 29 3d 3d 30 20 29 7b 0a 20 20  P_CrLf)==0 ){.  
2ef90 20 20 20 20 2f 2a 20 57 68 65 6e 20 69 6d 70 6f      /* When impo
2efa0 72 74 69 6e 67 20 43 53 56 20 28 6f 6e 6c 79 29  rting CSV (only)
2efb0 2c 20 69 66 20 74 68 65 20 72 6f 77 20 73 65 70  , if the row sep
2efc0 61 72 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f  arator is set to
2efd0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 65   the.      ** de
2efe0 66 61 75 6c 74 20 6f 75 74 70 75 74 20 72 6f 77  fault output row
2eff0 20 73 65 70 61 72 61 74 6f 72 2c 20 63 68 61 6e   separator, chan
2f000 67 65 20 69 74 20 74 6f 20 74 68 65 20 64 65 66  ge it to the def
2f010 61 75 6c 74 20 69 6e 70 75 74 0a 20 20 20 20 20  ault input.     
2f020 20 2a 2a 20 72 6f 77 20 73 65 70 61 72 61 74 6f   ** row separato
2f030 72 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73 20  r.  This avoids 
2f040 68 61 76 69 6e 67 20 74 6f 20 6d 61 69 6e 74 61  having to mainta
2f050 69 6e 20 64 69 66 66 65 72 65 6e 74 20 69 6e 70  in different inp
2f060 75 74 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ut.      ** and 
2f070 6f 75 74 70 75 74 20 72 6f 77 20 73 65 70 61 72  output row separ
2f080 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20  ators. */.      
2f090 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2f0a0 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65  (sizeof(p->rowSe
2f0b0 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77  parator), p->row
2f0c0 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52  Separator, SEP_R
2f0d0 6f 77 29 3b 0a 20 20 20 20 20 20 6e 53 65 70 20  ow);.      nSep 
2f0e0 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 72 6f  = strlen30(p->ro
2f0f0 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  wSeparator);.   
2f100 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3e   }.    if( nSep>
2f110 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  1 ){.      raw_p
2f120 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2f130 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63 68 61 72  rror: multi-char
2f140 61 63 74 65 72 20 72 6f 77 20 73 65 70 61 72 61  acter row separa
2f150 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  tors not allowed
2f160 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2f170 20 20 20 20 20 20 20 20 22 20 66 6f 72 20 69 6d          " for im
2f180 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20  port\n");.      
2f190 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2f1a0 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 20 3d      sCtx.zFile =
2f1b0 20 7a 46 69 6c 65 3b 0a 20 20 20 20 73 43 74 78   zFile;.    sCtx
2f1c0 2e 6e 4c 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20  .nLine = 1;.    
2f1d0 69 66 28 20 73 43 74 78 2e 7a 46 69 6c 65 5b 30  if( sCtx.zFile[0
2f1e0 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 64 65 66  ]=='|' ){.#ifdef
2f1f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50   SQLITE_OMIT_POP
2f200 45 4e 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  EN.      raw_pri
2f210 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2f220 6f 72 3a 20 70 69 70 65 73 20 61 72 65 20 6e 6f  or: pipes are no
2f230 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 74  t supported in t
2f240 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20 20 20 20  his OS\n");.    
2f250 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73    return 1;.#els
2f260 65 0a 20 20 20 20 20 20 73 43 74 78 2e 69 6e 20  e.      sCtx.in 
2f270 3d 20 70 6f 70 65 6e 28 73 43 74 78 2e 7a 46 69  = popen(sCtx.zFi
2f280 6c 65 2b 31 2c 20 22 72 22 29 3b 0a 20 20 20 20  le+1, "r");.    
2f290 20 20 73 43 74 78 2e 7a 46 69 6c 65 20 3d 20 22    sCtx.zFile = "
2f2a0 3c 70 69 70 65 3e 22 3b 0a 20 20 20 20 20 20 78  <pipe>";.      x
2f2b0 43 6c 6f 73 65 72 20 3d 20 70 63 6c 6f 73 65 3b  Closer = pclose;
2f2c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
2f2d0 65 7b 0a 20 20 20 20 20 20 73 43 74 78 2e 69 6e  e{.      sCtx.in
2f2e0 20 3d 20 66 6f 70 65 6e 28 73 43 74 78 2e 7a 46   = fopen(sCtx.zF
2f2f0 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20  ile, "rb");.    
2f300 20 20 78 43 6c 6f 73 65 72 20 3d 20 66 63 6c 6f    xCloser = fclo
2f310 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  se;.    }.    if
2f320 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f  ( p->mode==MODE_
2f330 41 73 63 69 69 20 29 7b 0a 20 20 20 20 20 20 78  Ascii ){.      x
2f340 52 65 61 64 20 3d 20 61 73 63 69 69 5f 72 65 61  Read = ascii_rea
2f350 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20  d_one_field;.   
2f360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 78 52   }else{.      xR
2f370 65 61 64 20 3d 20 63 73 76 5f 72 65 61 64 5f 6f  ead = csv_read_o
2f380 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20 20 7d 0a  ne_field;.    }.
2f390 20 20 20 20 69 66 28 20 73 43 74 78 2e 69 6e 3d      if( sCtx.in=
2f3a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =0 ){.      utf8
2f3b0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2f3c0 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
2f3d0 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a  pen \"%s\"\n", z
2f3e0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 74  File);.      ret
2f3f0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2f400 20 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 3d 20   sCtx.cColSep = 
2f410 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b  p->colSeparator[
2f420 30 5d 3b 0a 20 20 20 20 73 43 74 78 2e 63 52 6f  0];.    sCtx.cRo
2f430 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77 53 65 70  wSep = p->rowSep
2f440 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20 20 20 7a  arator[0];.    z
2f450 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
2f460 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20  rintf("SELECT * 
2f470 46 52 4f 4d 20 25 73 22 2c 20 7a 54 61 62 6c 65  FROM %s", zTable
2f480 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
2f490 3d 30 20 29 7b 0a 20 20 20 20 20 20 78 43 6c 6f  =0 ){.      xClo
2f4a0 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20  ser(sCtx.in);.  
2f4b0 20 20 20 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66      shell_out_of
2f4c0 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d  _memory();.    }
2f4d0 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72  .    nByte = str
2f4e0 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20  len30(zSql);.   
2f4f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
2f500 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
2f510 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
2f520 2c 20 30 29 3b 0a 20 20 20 20 69 6d 70 6f 72 74  , 0);.    import
2f530 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 26 73 43  _append_char(&sC
2f540 74 78 2c 20 30 29 3b 20 20 20 20 2f 2a 20 54 6f  tx, 0);    /* To
2f550 20 65 6e 73 75 72 65 20 73 43 74 78 2e 7a 20 69   ensure sCtx.z i
2f560 73 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  s allocated */. 
2f570 20 20 20 69 66 28 20 72 63 20 26 26 20 73 71 6c     if( rc && sql
2f580 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 6e 6f  ite3_strglob("no
2f590 20 73 75 63 68 20 74 61 62 6c 65 3a 20 2a 22 2c   such table: *",
2f5a0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2f5b0 70 2d 3e 64 62 29 29 3d 3d 30 20 29 7b 0a 20 20  p->db))==0 ){.  
2f5c0 20 20 20 20 63 68 61 72 20 2a 7a 43 72 65 61 74      char *zCreat
2f5d0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
2f5e0 6e 74 66 28 22 43 52 45 41 54 45 20 54 41 42 4c  ntf("CREATE TABL
2f5f0 45 20 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  E %s", zTable);.
2f600 20 20 20 20 20 20 63 68 61 72 20 63 53 65 70 20        char cSep 
2f610 3d 20 27 28 27 3b 0a 20 20 20 20 20 20 77 68 69  = '(';.      whi
2f620 6c 65 28 20 78 52 65 61 64 28 26 73 43 74 78 29  le( xRead(&sCtx)
2f630 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 72 65   ){.        zCre
2f640 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ate = sqlite3_mp
2f650 72 69 6e 74 66 28 22 25 7a 25 63 5c 6e 20 20 5c  rintf("%z%c\n  \
2f660 22 25 77 5c 22 20 54 45 58 54 22 2c 20 7a 43 72  "%w\" TEXT", zCr
2f670 65 61 74 65 2c 20 63 53 65 70 2c 20 73 43 74 78  eate, cSep, sCtx
2f680 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 63 53 65  .z);.        cSe
2f690 70 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20  p = ',';.       
2f6a0 20 69 66 28 20 73 43 74 78 2e 63 54 65 72 6d 21   if( sCtx.cTerm!
2f6b0 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 20  =sCtx.cColSep ) 
2f6c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2f6d0 20 20 20 20 20 69 66 28 20 63 53 65 70 3d 3d 27       if( cSep=='
2f6e0 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  (' ){.        sq
2f6f0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61  lite3_free(zCrea
2f700 74 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  te);.        sql
2f710 69 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a  ite3_free(sCtx.z
2f720 29 3b 0a 20 20 20 20 20 20 20 20 78 43 6c 6f 73  );.        xClos
2f730 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20  er(sCtx.in);.   
2f740 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2f750 28 73 74 64 65 72 72 2c 22 25 73 3a 20 65 6d 70  (stderr,"%s: emp
2f760 74 79 20 66 69 6c 65 5c 6e 22 2c 20 73 43 74 78  ty file\n", sCtx
2f770 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  .zFile);.       
2f780 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
2f790 20 7d 0a 20 20 20 20 20 20 7a 43 72 65 61 74 65   }.      zCreate
2f7a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2f7b0 74 66 28 22 25 7a 5c 6e 29 22 2c 20 7a 43 72 65  tf("%z\n)", zCre
2f7c0 61 74 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ate);.      rc =
2f7d0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
2f7e0 3e 64 62 2c 20 7a 43 72 65 61 74 65 2c 20 30 2c  >db, zCreate, 0,
2f7f0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
2f800 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61  lite3_free(zCrea
2f810 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  te);.      if( r
2f820 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  c ){.        utf
2f830 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2f840 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
2f850 73 28 2e 2e 2e 29 20 66 61 69 6c 65 64 3a 20 25  s(...) failed: %
2f860 73 5c 6e 22 2c 20 7a 54 61 62 6c 65 2c 0a 20 20  s\n", zTable,.  
2f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2f880 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
2f890 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  db));.        sq
2f8a0 6c 69 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e  lite3_free(sCtx.
2f8b0 7a 29 3b 0a 20 20 20 20 20 20 20 20 78 43 6c 6f  z);.        xClo
2f8c0 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20  ser(sCtx.in);.  
2f8d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2f8e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
2f8f0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
2f900 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
2f910 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
2f920 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2f930 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
2f940 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
2f950 20 20 20 20 20 69 66 20 28 70 53 74 6d 74 29 20       if (pStmt) 
2f960 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2f970 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 75  (pStmt);.      u
2f980 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2f990 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  r,"Error: %s\n",
2f9a0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2f9b0 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 78  p->db));.      x
2f9c0 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b  Closer(sCtx.in);
2f9d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2f9e0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20  .    }.    nCol 
2f9f0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2fa00 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
2fa10 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
2fa20 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
2fa30 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69  pStmt = 0;.    i
2fa40 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74  f( nCol==0 ) ret
2fa50 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 63 6f 6c  urn 0; /* no col
2fa60 75 6d 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a  umns, no error *
2fa70 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  /.    zSql = sql
2fa80 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e  ite3_malloc64( n
2fa90 42 79 74 65 2a 32 20 2b 20 32 30 20 2b 20 6e 43  Byte*2 + 20 + nC
2faa0 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ol*2 );.    if( 
2fab0 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
2fac0 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e   xCloser(sCtx.in
2fad0 29 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 6f  );.      shell_o
2fae0 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a  ut_of_memory();.
2faf0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2fb00 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65  3_snprintf(nByte
2fb10 2b 32 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45  +20, zSql, "INSE
2fb20 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c 22 20 56  RT INTO \"%w\" V
2fb30 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65  ALUES(?", zTable
2fb40 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65  );.    j = strle
2fb50 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66  n30(zSql);.    f
2fb60 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=1; i<nCol; 
2fb70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c  i++){.      zSql
2fb80 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20  [j++] = ',';.   
2fb90 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
2fba0 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53  ?';.    }.    zS
2fbb0 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20  ql[j++] = ')';. 
2fbc0 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a     zSql[j] = 0;.
2fbd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2fbe0 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
2fbf0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
2fc00 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  tmt, 0);.    sql
2fc10 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
2fc20 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
2fc30 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2fc40 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
2fc50 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
2fc60 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
2fc70 20 20 20 20 20 20 69 66 20 28 70 53 74 6d 74 29        if (pStmt)
2fc80 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
2fc90 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
2fca0 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29  xCloser(sCtx.in)
2fcb0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2fcc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 65 64  ;.    }.    need
2fcd0 43 6f 6d 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  Commit = sqlite3
2fce0 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
2fcf0 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20  p->db);.    if( 
2fd00 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c  needCommit ) sql
2fd10 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
2fd20 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20   "BEGIN", 0, 0, 
2fd30 30 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  0);.    do{.    
2fd40 20 20 69 6e 74 20 73 74 61 72 74 4c 69 6e 65 20    int startLine 
2fd50 3d 20 73 43 74 78 2e 6e 4c 69 6e 65 3b 0a 20 20  = sCtx.nLine;.  
2fd60 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2fd70 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
2fd80 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 78 52 65     char *z = xRe
2fd90 61 64 28 26 73 43 74 78 29 3b 0a 20 20 20 20 20  ad(&sCtx);.     
2fda0 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a     /*.        **
2fdb0 20 44 69 64 20 77 65 20 72 65 61 63 68 20 65 6e   Did we reach en
2fdc0 64 2d 6f 66 2d 66 69 6c 65 20 62 65 66 6f 72 65  d-of-file before
2fdd0 20 66 69 6e 64 69 6e 67 20 61 6e 79 20 63 6f 6c   finding any col
2fde0 75 6d 6e 73 3f 0a 20 20 20 20 20 20 20 20 2a 2a  umns?.        **
2fdf0 20 49 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e 73   If so, stop ins
2fe00 74 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69 6c  tead of NULL fil
2fe10 6c 69 6e 67 20 74 68 65 20 72 65 6d 61 69 6e 69  ling the remaini
2fe20 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20  ng columns..    
2fe30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2fe40 66 28 20 7a 3d 3d 30 20 26 26 20 69 3d 3d 30 20  f( z==0 && i==0 
2fe50 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2fe60 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44   /*.        ** D
2fe70 69 64 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d  id we reach end-
2fe80 6f 66 2d 66 69 6c 65 20 4f 52 20 65 6e 64 2d 6f  of-file OR end-o
2fe90 66 2d 6c 69 6e 65 20 62 65 66 6f 72 65 20 66 69  f-line before fi
2fea0 6e 64 69 6e 67 20 61 6e 79 0a 20 20 20 20 20 20  nding any.      
2feb0 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20    ** columns in 
2fec0 41 53 43 49 49 20 6d 6f 64 65 3f 20 20 49 66 20  ASCII mode?  If 
2fed0 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65 61 64  so, stop instead
2fee0 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67   of NULL filling
2fef0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2ff00 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  remaining column
2ff10 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
2ff20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64        if( p->mod
2ff30 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20 26 26  e==MODE_Ascii &&
2ff40 20 28 7a 3d 3d 30 20 7c 7c 20 7a 5b 30 5d 3d 3d   (z==0 || z[0]==
2ff50 30 29 20 26 26 20 69 3d 3d 30 20 29 20 62 72 65  0) && i==0 ) bre
2ff60 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ak;.        sqli
2ff70 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
2ff80 74 6d 74 2c 20 69 2b 31 2c 20 7a 2c 20 2d 31 2c  tmt, i+1, z, -1,
2ff90 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
2ffa0 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
2ffb0 69 3c 6e 43 6f 6c 2d 31 20 26 26 20 73 43 74 78  i<nCol-1 && sCtx
2ffc0 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e 63 43 6f  .cTerm!=sCtx.cCo
2ffd0 6c 53 65 70 20 29 7b 0a 20 20 20 20 20 20 20 20  lSep ){.        
2ffe0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2fff0 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 65 78  derr, "%s:%d: ex
30000 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e  pected %d column
30010 73 20 62 75 74 20 66 6f 75 6e 64 20 25 64 20 2d  s but found %d -
30020 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
30030 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66 69               "fi
30040 6c 6c 69 6e 67 20 74 68 65 20 72 65 73 74 20 77  lling the rest w
30050 69 74 68 20 4e 55 4c 4c 5c 6e 22 2c 0a 20 20 20  ith NULL\n",.   
30060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30070 20 20 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c         sCtx.zFil
30080 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e 43  e, startLine, nC
30090 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  ol, i+1);.      
300a0 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20      i += 2;.    
300b0 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c 3d        while( i<=
300c0 6e 43 6f 6c 20 29 7b 20 73 71 6c 69 74 65 33 5f  nCol ){ sqlite3_
300d0 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
300e0 20 69 29 3b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20   i); i++; }.    
300f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
30100 20 20 20 20 69 66 28 20 73 43 74 78 2e 63 54 65      if( sCtx.cTe
30110 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70  rm==sCtx.cColSep
30120 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
30130 20 20 20 20 20 20 20 20 20 20 78 52 65 61 64 28            xRead(
30140 26 73 43 74 78 29 3b 0a 20 20 20 20 20 20 20 20  &sCtx);.        
30150 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d    i++;.        }
30160 77 68 69 6c 65 28 20 73 43 74 78 2e 63 54 65 72  while( sCtx.cTer
30170 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20  m==sCtx.cColSep 
30180 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  );.        utf8_
30190 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
301a0 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65 64 20  %s:%d: expected 
301b0 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 66  %d columns but f
301c0 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20 20 20  ound %d - ".    
301d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301e0 20 20 20 20 22 65 78 74 72 61 73 20 69 67 6e 6f      "extras igno
301f0 72 65 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  red\n",.        
30200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30210 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61 72  sCtx.zFile, star
30220 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 29 3b  tLine, nCol, i);
30230 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
30240 66 28 20 69 3e 3d 6e 43 6f 6c 20 29 7b 0a 20 20  f( i>=nCol ){.  
30250 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
30260 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ep(pStmt);.     
30270 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
30280 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
30290 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
302a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
302b0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
302c0 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
302d0 20 49 4e 53 45 52 54 20 66 61 69 6c 65 64 3a 20   INSERT failed: 
302e0 25 73 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69 6c  %s\n", sCtx.zFil
302f0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
30300 20 20 20 20 20 20 20 20 20 73 74 61 72 74 4c 69           startLi
30310 6e 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  ne, sqlite3_errm
30320 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
30330 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
30340 20 20 7d 77 68 69 6c 65 28 20 73 43 74 78 2e 63    }while( sCtx.c
30350 54 65 72 6d 21 3d 45 4f 46 20 29 3b 0a 0a 20 20  Term!=EOF );..  
30360 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69    xCloser(sCtx.i
30370 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  n);.    sqlite3_
30380 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20  free(sCtx.z);.  
30390 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
303a0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  ze(pStmt);.    i
303b0 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20  f( needCommit ) 
303c0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
303d0 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  db, "COMMIT", 0,
303e0 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 0a   0, 0);.  }else.
303f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30400 55 4e 54 45 53 54 41 42 4c 45 0a 20 20 69 66 28  UNTESTABLE.  if(
30410 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63   c=='i' && strnc
30420 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d  mp(azArg[0], "im
30430 70 6f 73 74 65 72 22 2c 20 6e 29 3d 3d 30 20 29  poster", n)==0 )
30440 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  {.    char *zSql
30450 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c  ;.    char *zCol
30460 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 73 71  list = 0;.    sq
30470 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
30480 74 3b 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d 20  t;.    int tnum 
30490 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  = 0;.    int i;.
304a0 20 20 20 20 69 66 28 20 21 28 6e 41 72 67 3d 3d      if( !(nArg==
304b0 33 20 7c 7c 20 28 6e 41 72 67 3d 3d 32 20 26 26  3 || (nArg==2 &&
304c0 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
304d0 28 61 7a 41 72 67 5b 31 5d 2c 22 6f 66 66 22 29  (azArg[1],"off")
304e0 3d 3d 30 29 29 20 29 7b 0a 20 20 20 20 20 20 75  ==0)) ){.      u
304f0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
30500 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f  r, "Usage: .impo
30510 73 74 65 72 20 49 4e 44 45 58 20 49 4d 50 4f 53  ster INDEX IMPOS
30520 54 45 52 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  TER\n".         
30530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30540 20 22 20 20 20 20 20 20 20 2e 69 6d 70 6f 73 74   "       .impost
30550 65 72 20 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20  er off\n");.    
30560 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
30570 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
30580 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
30590 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
305a0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
305b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
305c0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
305d0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
305e0 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20  MPOSTER, p->db, 
305f0 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29 3b 0a 20  "main", 0, 1);. 
30600 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
30610 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
30620 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71   }.    zSql = sq
30630 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
30640 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46  ELECT rootpage F
30650 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
30660 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
30670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
30680 57 48 45 52 45 20 6e 61 6d 65 3d 27 25 71 27 20  WHERE name='%q' 
30690 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27  AND type='index'
306a0 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
306b0 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
306c0 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
306d0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
306e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
306f0 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
30700 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
30710 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
30720 57 20 29 7b 0a 20 20 20 20 20 20 74 6e 75 6d 20  W ){.      tnum 
30730 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
30740 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
30750 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
30760 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
30770 29 3b 0a 20 20 20 20 69 66 28 20 74 6e 75 6d 3d  );.    if( tnum=
30780 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =0 ){.      utf8
30790 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
307a0 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
307b0 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67  \"%s\"\n", azArg
307c0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  [1]);.      rc =
307d0 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
307e0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
307f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c  ;.    }.    zSql
30800 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
30810 74 66 28 22 50 52 41 47 4d 41 20 69 6e 64 65 78  tf("PRAGMA index
30820 5f 78 69 6e 66 6f 3d 27 25 71 27 22 2c 20 61 7a  _xinfo='%q'", az
30830 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 72 63 20  Arg[1]);.    rc 
30840 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
30850 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
30860 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
30870 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
30880 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 20  ee(zSql);.    i 
30890 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
308a0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
308b0 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
308c0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4c  ){.      char zL
308d0 61 62 65 6c 5b 32 30 5d 3b 0a 20 20 20 20 20 20  abel[20];.      
308e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
308f0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
30900 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
30910 65 78 74 28 70 53 74 6d 74 2c 32 29 3b 0a 20 20  ext(pStmt,2);.  
30920 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69      i++;.      i
30930 66 28 20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  f( zCol==0 ){.  
30940 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
30950 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
30960 6d 74 2c 31 29 3d 3d 2d 31 20 29 7b 0a 20 20 20  mt,1)==-1 ){.   
30970 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f         zCol = "_
30980 52 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20 20 20  ROWID_";.       
30990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
309a0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
309b0 74 66 28 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c  tf(sizeof(zLabel
309c0 29 2c 7a 4c 61 62 65 6c 2c 22 65 78 70 72 25 64  ),zLabel,"expr%d
309d0 22 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",i);.          
309e0 7a 43 6f 6c 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20  zCol = zLabel;. 
309f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
30a00 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c  .      if( zColl
30a10 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
30a20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c    zCollist = sql
30a30 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22  ite3_mprintf("\"
30a40 25 77 5c 22 22 2c 20 7a 43 6f 6c 29 3b 0a 20 20  %w\"", zCol);.  
30a50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30a60 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71     zCollist = sq
30a70 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
30a80 7a 2c 5c 22 25 77 5c 22 22 2c 20 7a 43 6f 6c 6c  z,\"%w\"", zColl
30a90 69 73 74 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  ist, zCol);.    
30aa0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
30ab0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
30ac0 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20  Stmt);.    zSql 
30ad0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
30ae0 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  f(.          "CR
30af0 45 41 54 45 20 54 41 42 4c 45 20 5c 22 25 77 5c  EATE TABLE \"%w\
30b00 22 28 25 73 2c 50 52 49 4d 41 52 59 20 4b 45 59  "(%s,PRIMARY KEY
30b10 28 25 73 29 29 57 49 54 48 4f 55 54 20 52 4f 57  (%s))WITHOUT ROW
30b20 49 44 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61  ID",.          a
30b30 7a 41 72 67 5b 32 5d 2c 20 7a 43 6f 6c 6c 69 73  zArg[2], zCollis
30b40 74 2c 20 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20  t, zCollist);.  
30b50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
30b60 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 72 63  Collist);.    rc
30b70 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f   = sqlite3_test_
30b80 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
30b90 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
30ba0 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c  , p->db, "main",
30bb0 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 69   1, tnum);.    i
30bc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30bd0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
30be0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
30bf0 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30  b, zSql, 0, 0, 0
30c00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30c10 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
30c20 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
30c30 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22  POSTER, p->db, "
30c40 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20  main", 0, 0);.  
30c50 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
30c60 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
30c70 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
30c80 20 69 6e 20 5b 25 73 5d 3a 20 25 73 5c 6e 22 2c   in [%s]: %s\n",
30c90 20 7a 53 71 6c 2c 20 73 71 6c 69 74 65 33 5f 65   zSql, sqlite3_e
30ca0 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
30cb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30cc0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
30cd0 73 74 64 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c  stdout, "%s;\n",
30ce0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20   zSql);.        
30cf0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 6f 75  raw_printf(stdou
30d00 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 57  t,.           "W
30d10 41 52 4e 49 4e 47 3a 20 77 72 69 74 69 6e 67 20  ARNING: writing 
30d20 74 6f 20 61 6e 20 69 6d 70 6f 73 74 65 72 20 74  to an imposter t
30d30 61 62 6c 65 20 77 69 6c 6c 20 63 6f 72 72 75 70  able will corrup
30d40 74 20 74 68 65 20 69 6e 64 65 78 21 5c 6e 22 0a  t the index!\n".
30d50 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
30d60 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
30d70 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
30d80 74 64 65 72 72 2c 20 22 53 51 4c 49 54 45 5f 54  tderr, "SQLITE_T
30d90 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
30da0 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20   returns %d\n", 
30db0 72 63 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rc);.      rc = 
30dc0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  1;.    }.    sql
30dd0 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
30de0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
30df0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
30e00 54 45 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e  TE_OMIT_TEST_CON
30e10 54 52 4f 4c 29 20 2a 2f 0a 0a 23 69 66 64 65 66  TROL) */..#ifdef
30e20 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
30e30 4f 54 52 41 43 45 0a 20 20 69 66 28 20 63 3d 3d  OTRACE.  if( c==
30e40 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'i' && strncmp(a
30e50 7a 41 72 67 5b 30 5d 2c 20 22 69 6f 74 72 61 63  zArg[0], "iotrac
30e60 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
30e70 20 53 51 4c 49 54 45 5f 41 50 49 20 65 78 74 65   SQLITE_API exte
30e80 72 6e 20 76 6f 69 64 20 28 53 51 4c 49 54 45 5f  rn void (SQLITE_
30e90 43 44 45 43 4c 20 2a 73 71 6c 69 74 65 33 49 6f  CDECL *sqlite3Io
30ea0 54 72 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61  Trace)(const cha
30eb0 72 2a 2c 20 2e 2e 2e 29 3b 0a 20 20 20 20 69 66  r*, ...);.    if
30ec0 28 20 69 6f 74 72 61 63 65 20 26 26 20 69 6f 74  ( iotrace && iot
30ed0 72 61 63 65 21 3d 73 74 64 6f 75 74 20 29 20 66  race!=stdout ) f
30ee0 63 6c 6f 73 65 28 69 6f 74 72 61 63 65 29 3b 0a  close(iotrace);.
30ef0 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20 30 3b      iotrace = 0;
30f00 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20  .    if( nArg<2 
30f10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
30f20 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  IoTrace = 0;.   
30f30 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
30f40 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22 2d 22 29  p(azArg[1], "-")
30f50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
30f60 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f  ite3IoTrace = io
30f70 74 72 61 63 65 50 72 69 6e 74 66 3b 0a 20 20 20  tracePrintf;.   
30f80 20 20 20 69 6f 74 72 61 63 65 20 3d 20 73 74 64     iotrace = std
30f90 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  out;.    }else{.
30fa0 20 20 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20        iotrace = 
30fb0 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20  fopen(azArg[1], 
30fc0 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  "w");.      if( 
30fd0 69 6f 74 72 61 63 65 3d 3d 30 20 29 7b 0a 20 20  iotrace==0 ){.  
30fe0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
30ff0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
31000 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
31010 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31  %s\"\n", azArg[1
31020 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ]);.        sqli
31030 74 65 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a  te3IoTrace = 0;.
31040 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
31050 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31060 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72       sqlite3IoTr
31070 61 63 65 20 3d 20 69 6f 74 72 61 63 65 50 72 69  ace = iotracePri
31080 6e 74 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ntf;.      }.   
31090 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
310a0 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20  f..  if( c=='l' 
310b0 26 26 20 6e 3e 3d 35 20 26 26 20 73 74 72 6e 63  && n>=5 && strnc
310c0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69  mp(azArg[0], "li
310d0 6d 69 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  mits", n)==0 ){.
310e0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
310f0 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20   struct {.      
31100 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69   const char *zLi
31110 6d 69 74 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61  mitName;   /* Na
31120 6d 65 20 6f 66 20 61 20 6c 69 6d 69 74 20 2a 2f  me of a limit */
31130 0a 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69  .       int limi
31140 74 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  tCode;          
31150 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 63 6f 64    /* Integer cod
31160 65 20 66 6f 72 20 74 68 61 74 20 6c 69 6d 69 74  e for that limit
31170 20 2a 2f 0a 20 20 20 20 7d 20 61 4c 69 6d 69 74   */.    } aLimit
31180 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22  [] = {.      { "
31190 6c 65 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20  length",        
311a0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
311b0 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20 20 20  IMIT_LENGTH     
311c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
311d0 2c 0a 20 20 20 20 20 20 7b 20 22 73 71 6c 5f 6c  ,.      { "sql_l
311e0 65 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20 20  ength",         
311f0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
31200 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20 20  SQL_LENGTH      
31210 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
31220 20 20 20 7b 20 22 63 6f 6c 75 6d 6e 22 2c 20 20     { "column",  
31230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
31240 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
31250 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
31260 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
31270 22 65 78 70 72 5f 64 65 70 74 68 22 2c 20 20 20  "expr_depth",   
31280 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
31290 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48  LIMIT_EXPR_DEPTH
312a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
312b0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 6f 6d 70  },.      { "comp
312c0 6f 75 6e 64 5f 73 65 6c 65 63 74 22 2c 20 20 20  ound_select",   
312d0 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
312e0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
312f0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
31300 20 20 20 20 7b 20 22 76 64 62 65 5f 6f 70 22 2c      { "vdbe_op",
31310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
31320 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45  QLITE_LIMIT_VDBE
31330 5f 4f 50 20 20 20 20 20 20 20 20 20 20 20 20 20  _OP             
31340 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
31350 20 22 66 75 6e 63 74 69 6f 6e 5f 61 72 67 22 2c   "function_arg",
31360 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
31370 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f  _LIMIT_FUNCTION_
31380 41 52 47 20 20 20 20 20 20 20 20 20 20 20 20 20  ARG             
31390 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 61 74 74   },.      { "att
313a0 61 63 68 65 64 22 2c 20 20 20 20 20 20 20 20 20  ached",         
313b0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
313c0 54 5f 41 54 54 41 43 48 45 44 20 20 20 20 20 20  T_ATTACHED      
313d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
313e0 20 20 20 20 20 7b 20 22 6c 69 6b 65 5f 70 61 74       { "like_pat
313f0 74 65 72 6e 5f 6c 65 6e 67 74 68 22 2c 20 20 20  tern_length",   
31400 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b  SQLITE_LIMIT_LIK
31410 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
31420 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
31430 7b 20 22 76 61 72 69 61 62 6c 65 5f 6e 75 6d 62  { "variable_numb
31440 65 72 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54  er",       SQLIT
31450 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
31460 5f 4e 55 4d 42 45 52 20 20 20 20 20 20 20 20 20  _NUMBER         
31470 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 74 72    },.      { "tr
31480 69 67 67 65 72 5f 64 65 70 74 68 22 2c 20 20 20  igger_depth",   
31490 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
314a0 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
314b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
314c0 20 20 20 20 20 20 7b 20 22 77 6f 72 6b 65 72 5f        { "worker_
314d0 74 68 72 65 61 64 73 22 2c 20 20 20 20 20 20 20  threads",       
314e0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f   SQLITE_LIMIT_WO
314f0 52 4b 45 52 5f 54 48 52 45 41 44 53 20 20 20 20  RKER_THREADS    
31500 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7d          },.    }
31510 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 32 3b  ;.    int i, n2;
31520 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
31530 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  0);.    if( nArg
31540 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==1 ){.      for
31550 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
31560 65 28 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29 7b  e(aLimit); i++){
31570 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  .        printf(
31580 22 25 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c 69  "%20s %d\n", aLi
31590 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d  mit[i].zLimitNam
315a0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
315b0 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28    sqlite3_limit(
315c0 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 5d  p->db, aLimit[i]
315d0 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29  .limitCode, -1))
315e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
315f0 6c 73 65 20 69 66 28 20 6e 41 72 67 3e 33 20 29  lse if( nArg>3 )
31600 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
31610 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
31620 65 3a 20 2e 6c 69 6d 69 74 20 4e 41 4d 45 20 3f  e: .limit NAME ?
31630 4e 45 57 2d 56 41 4c 55 45 3f 5c 6e 22 29 3b 0a  NEW-VALUE?\n");.
31640 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
31650 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
31660 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
31670 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
31680 20 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20   iLimit = -1;.  
31690 20 20 20 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33      n2 = strlen3
316a0 30 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  0(azArg[1]);.   
316b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
316c0 72 61 79 53 69 7a 65 28 61 4c 69 6d 69 74 29 3b  raySize(aLimit);
316d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
316e0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  f( sqlite3_strni
316f0 63 6d 70 28 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c  cmp(aLimit[i].zL
31700 69 6d 69 74 4e 61 6d 65 2c 20 61 7a 41 72 67 5b  imitName, azArg[
31710 31 5d 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  1], n2)==0 ){.  
31720 20 20 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d          if( iLim
31730 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  it<0 ){.        
31740 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 69 3b 0a      iLimit = i;.
31750 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
31760 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
31770 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
31780 20 22 61 6d 62 69 67 75 6f 75 73 20 6c 69 6d 69   "ambiguous limi
31790 74 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  t: \"%s\"\n", az
317a0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
317b0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
317c0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65           goto me
317d0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
317e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
317f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
31800 20 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c       if( iLimit<
31810 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
31820 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
31830 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 3a   "unknown limit:
31840 20 5c 22 25 73 5c 22 5c 6e 22 0a 20 20 20 20 20   \"%s\"\n".     
31850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31860 20 20 20 22 65 6e 74 65 72 20 5c 22 2e 6c 69 6d     "enter \".lim
31870 69 74 73 5c 22 20 77 69 74 68 20 6e 6f 20 61 72  its\" with no ar
31880 67 75 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c 69  guments for a li
31890 73 74 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  st.\n",.        
318a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318b0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
318c0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
318d0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
318e0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
318f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 41    }.      if( nA
31900 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  rg==3 ){.       
31910 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70   sqlite3_limit(p
31920 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69  ->db, aLimit[iLi
31930 6d 69 74 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 0a  mit].limitCode,.
31940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31950 20 20 20 20 20 20 28 69 6e 74 29 69 6e 74 65 67        (int)integ
31960 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d  erValue(azArg[2]
31970 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
31980 20 20 70 72 69 6e 74 66 28 22 25 32 30 73 20 25    printf("%20s %
31990 64 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b 69 4c 69  d\n", aLimit[iLi
319a0 6d 69 74 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c  mit].zLimitName,
319b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
319c0 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64  lite3_limit(p->d
319d0 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74  b, aLimit[iLimit
319e0 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29  ].limitCode, -1)
319f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
31a00 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26  ..  if( c=='l' &
31a10 26 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d 70  & n>2 && strncmp
31a20 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6e 74  (azArg[0], "lint
31a30 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
31a40 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
31a50 20 20 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e     lintDotComman
31a60 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67  d(p, azArg, nArg
31a70 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  );.  }else..#ifn
31a80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31a90 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
31aa0 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 73   if( c=='l' && s
31ab0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
31ac0 20 22 6c 6f 61 64 22 2c 20 6e 29 3d 3d 30 20 29   "load", n)==0 )
31ad0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
31ae0 20 2a 7a 46 69 6c 65 2c 20 2a 7a 50 72 6f 63 3b   *zFile, *zProc;
31af0 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  .    char *zErrM
31b00 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  sg = 0;.    if( 
31b10 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20  nArg<2 ){.      
31b20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
31b30 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f 61 64  r, "Usage: .load
31b40 20 46 49 4c 45 20 3f 45 4e 54 52 59 50 4f 49 4e   FILE ?ENTRYPOIN
31b50 54 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  T?\n");.      rc
31b60 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
31b70 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
31b80 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46  it;.    }.    zF
31b90 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  ile = azArg[1];.
31ba0 20 20 20 20 7a 50 72 6f 63 20 3d 20 6e 41 72 67      zProc = nArg
31bb0 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a  >=3 ? azArg[2] :
31bc0 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   0;.    open_db(
31bd0 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  p, 0);.    rc = 
31be0 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74  sqlite3_load_ext
31bf0 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 7a 46  ension(p->db, zF
31c00 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72  ile, zProc, &zEr
31c10 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72  rMsg);.    if( r
31c20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31c30 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
31c40 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
31c50 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
31c60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
31c70 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
31c80 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
31c90 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
31ca0 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27  if..  if( c=='l'
31cb0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
31cc0 67 5b 30 5d 2c 20 22 6c 6f 67 22 2c 20 6e 29 3d  g[0], "log", n)=
31cd0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
31ce0 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72  rg!=2 ){.      r
31cf0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
31d00 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f 67 20 46  , "Usage: .log F
31d10 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20  ILENAME\n");.   
31d20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
31d30 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73  else{.      cons
31d40 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20  t char *zFile = 
31d50 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20  azArg[1];.      
31d60 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73  output_file_clos
31d70 65 28 70 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20 20  e(p->pLog);.    
31d80 20 20 70 2d 3e 70 4c 6f 67 20 3d 20 6f 75 74 70    p->pLog = outp
31d90 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a 46 69  ut_file_open(zFi
31da0 6c 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  le, 0);.    }.  
31db0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
31dc0 27 6d 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'm' && strncmp(a
31dd0 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f 64 65 22 2c  zArg[0], "mode",
31de0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f   n)==0 ){.    co
31df0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20  nst char *zMode 
31e00 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72  = nArg>=2 ? azAr
31e10 67 5b 31 5d 20 3a 20 22 22 3b 0a 20 20 20 20 69  g[1] : "";.    i
31e20 6e 74 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30  nt n2 = strlen30
31e30 28 7a 4d 6f 64 65 29 3b 0a 20 20 20 20 69 6e 74  (zMode);.    int
31e40 20 63 32 20 3d 20 7a 4d 6f 64 65 5b 30 5d 3b 0a   c2 = zMode[0];.
31e50 20 20 20 20 69 66 28 20 63 32 3d 3d 27 6c 27 20      if( c2=='l' 
31e60 26 26 20 6e 32 3e 32 20 26 26 20 73 74 72 6e 63  && n2>2 && strnc
31e70 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e  mp(azArg[1],"lin
31e80 65 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  es",n2)==0 ){.  
31e90 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
31ea0 44 45 5f 4c 69 6e 65 3b 0a 20 20 20 20 20 20 73  DE_Line;.      s
31eb0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
31ec0 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
31ed0 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
31ee0 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f  eparator, SEP_Ro
31ef0 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  w);.    }else if
31f00 28 20 63 32 3d 3d 27 63 27 20 26 26 20 73 74 72  ( c2=='c' && str
31f10 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63  ncmp(azArg[1],"c
31f20 6f 6c 75 6d 6e 73 22 2c 6e 32 29 3d 3d 30 20 29  olumns",n2)==0 )
31f30 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
31f40 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20  = MODE_Column;. 
31f50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
31f60 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
31f70 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70  rowSeparator), p
31f80 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
31f90 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65  SEP_Row);.    }e
31fa0 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 6c 27 20  lse if( c2=='l' 
31fb0 26 26 20 6e 32 3e 32 20 26 26 20 73 74 72 6e 63  && n2>2 && strnc
31fc0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 73  mp(azArg[1],"lis
31fd0 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  t",n2)==0 ){.   
31fe0 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
31ff0 45 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71  E_List;.      sq
32000 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
32010 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61  izeof(p->colSepa
32020 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65  rator), p->colSe
32030 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6c  parator, SEP_Col
32040 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  umn);.      sqli
32050 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
32060 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
32070 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61  tor), p->rowSepa
32080 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b  rator, SEP_Row);
32090 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
320a0 32 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d  2=='h' && strncm
320b0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 68 74 6d 6c  p(azArg[1],"html
320c0 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
320d0 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
320e0 5f 48 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  _Html;.    }else
320f0 20 69 66 28 20 63 32 3d 3d 27 74 27 20 26 26 20   if( c2=='t' && 
32100 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
32110 2c 22 74 63 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b  ,"tcl",n2)==0 ){
32120 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
32130 20 4d 4f 44 45 5f 54 63 6c 3b 0a 20 20 20 20 20   MODE_Tcl;.     
32140 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
32150 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53  f(sizeof(p->colS
32160 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f  eparator), p->co
32170 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  lSeparator, SEP_
32180 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 73 71  Space);.      sq
32190 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
321a0 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
321b0 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65  rator), p->rowSe
321c0 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77  parator, SEP_Row
321d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
321e0 20 63 32 3d 3d 27 63 27 20 26 26 20 73 74 72 6e   c2=='c' && strn
321f0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 73  cmp(azArg[1],"cs
32200 76 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  v",n2)==0 ){.   
32210 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
32220 45 5f 43 73 76 3b 0a 20 20 20 20 20 20 73 71 6c  E_Csv;.      sql
32230 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
32240 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72  zeof(p->colSepar
32250 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70  ator), p->colSep
32260 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6d 6d  arator, SEP_Comm
32270 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
32280 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
32290 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
322a0 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
322b0 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29 3b 0a  tor, SEP_CrLf);.
322c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
322d0 3d 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d 70  =='t' && strncmp
322e0 28 61 7a 41 72 67 5b 31 5d 2c 22 74 61 62 73 22  (azArg[1],"tabs"
322f0 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
32300 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
32310 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  List;.      sqli
32320 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
32330 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  eof(p->colSepara
32340 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  tor), p->colSepa
32350 72 61 74 6f 72 2c 20 53 45 50 5f 54 61 62 29 3b  rator, SEP_Tab);
32360 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
32370 32 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d  2=='i' && strncm
32380 70 28 61 7a 41 72 67 5b 31 5d 2c 22 69 6e 73 65  p(azArg[1],"inse
32390 72 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  rt",n2)==0 ){.  
323a0 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
323b0 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 20  DE_Insert;.     
323c0 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28   set_table_name(
323d0 70 2c 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41  p, nArg>=3 ? azA
323e0 72 67 5b 32 5d 20 3a 20 22 74 61 62 6c 65 22 29  rg[2] : "table")
323f0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
32400 63 32 3d 3d 27 71 27 20 26 26 20 73 74 72 6e 63  c2=='q' && strnc
32410 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 71 75 6f  mp(azArg[1],"quo
32420 74 65 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  te",n2)==0 ){.  
32430 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
32440 44 45 5f 51 75 6f 74 65 3b 0a 20 20 20 20 7d 65  DE_Quote;.    }e
32450 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 61 27 20  lse if( c2=='a' 
32460 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
32470 5b 31 5d 2c 22 61 73 63 69 69 22 2c 6e 32 29 3d  [1],"ascii",n2)=
32480 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
32490 6f 64 65 20 3d 20 4d 4f 44 45 5f 41 73 63 69 69  ode = MODE_Ascii
324a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
324b0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
324c0 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
324d0 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
324e0 72 2c 20 53 45 50 5f 55 6e 69 74 29 3b 0a 20 20  r, SEP_Unit);.  
324f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
32500 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
32510 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
32520 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
32530 45 50 5f 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  EP_Record);.    
32540 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d 3d  }else if( nArg==
32550 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  1 ){.      raw_p
32560 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 63  rintf(p->out, "c
32570 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 6d 6f  urrent output mo
32580 64 65 3a 20 25 73 5c 6e 22 2c 20 6d 6f 64 65 44  de: %s\n", modeD
32590 65 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b 0a  escr[p->mode]);.
325a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
325b0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
325c0 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 6f 64 65  rr, "Error: mode
325d0 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f   should be one o
325e0 66 3a 20 22 0a 20 20 20 20 20 20 20 20 20 22 61  f: ".         "a
325f0 73 63 69 69 20 63 6f 6c 75 6d 6e 20 63 73 76 20  scii column csv 
32600 68 74 6d 6c 20 69 6e 73 65 72 74 20 6c 69 6e 65  html insert line
32610 20 6c 69 73 74 20 71 75 6f 74 65 20 74 61 62 73   list quote tabs
32620 20 74 63 6c 5c 6e 22 29 3b 0a 20 20 20 20 20 20   tcl\n");.      
32630 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
32640 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e    p->cMode = p->
32650 6d 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  mode;.  }else.. 
32660 20 69 66 28 20 63 3d 3d 27 6e 27 20 26 26 20 73   if( c=='n' && s
32670 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
32680 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 6e 29   "nullvalue", n)
32690 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
326a0 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
326b0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
326c0 28 73 69 7a 65 6f 66 28 70 2d 3e 6e 75 6c 6c 56  (sizeof(p->nullV
326d0 61 6c 75 65 29 2c 20 70 2d 3e 6e 75 6c 6c 56 61  alue), p->nullVa
326e0 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  lue,.           
326f0 20 20 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a              "%.*
32700 73 22 2c 20 28 69 6e 74 29 41 72 72 61 79 53 69  s", (int)ArraySi
32710 7a 65 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29  ze(p->nullValue)
32720 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  -1, azArg[1]);. 
32730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32740 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
32750 72 2c 20 22 55 73 61 67 65 3a 20 2e 6e 75 6c 6c  r, "Usage: .null
32760 76 61 6c 75 65 20 53 54 52 49 4e 47 5c 6e 22 29  value STRING\n")
32770 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
32780 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
32790 20 69 66 28 20 63 3d 3d 27 6f 27 20 26 26 20 73   if( c=='o' && s
327a0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
327b0 20 22 6f 70 65 6e 22 2c 20 6e 29 3d 3d 30 20 26   "open", n)==0 &
327c0 26 20 6e 3e 3d 32 20 29 7b 0a 20 20 20 20 63 68  & n>=2 ){.    ch
327d0 61 72 20 2a 7a 4e 65 77 46 69 6c 65 6e 61 6d 65  ar *zNewFilename
327e0 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
327f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
32800 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69  to open */.    i
32810 6e 74 20 69 4e 61 6d 65 20 3d 20 31 3b 20 20 20  nt iName = 1;   
32820 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
32830 61 7a 41 72 67 5b 5d 20 6f 66 20 74 68 65 20 66  azArg[] of the f
32840 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69  ilename */.    i
32850 6e 74 20 6e 65 77 46 6c 61 67 20 3d 20 30 3b 20  nt newFlag = 0; 
32860 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64      /* True to d
32870 65 6c 65 74 65 20 66 69 6c 65 20 62 65 66 6f 72  elete file befor
32880 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 20  e opening */.   
32890 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 65 78   /* Close the ex
328a0 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
328b0 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 63  */.    session_c
328c0 6c 6f 73 65 5f 61 6c 6c 28 70 29 3b 0a 20 20 20  lose_all(p);.   
328d0 20 63 6c 6f 73 65 5f 64 62 28 70 2d 3e 64 62 29   close_db(p->db)
328e0 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b  ;.    p->db = 0;
328f0 0a 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e  .    p->zDbFilen
32900 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ame = 0;.    sql
32910 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 46 72  ite3_free(p->zFr
32920 65 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 20 20  eeOnClose);.    
32930 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 20  p->zFreeOnClose 
32940 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e  = 0;.    p->open
32950 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45  Mode = SHELL_OPE
32960 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 20 20 2f 2a  N_UNSPEC;.    /*
32970 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 6d 61   Check for comma
32980 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74  nd-line argument
32990 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 4e 61  s */.    for(iNa
329a0 6d 65 3d 31 3b 20 69 4e 61 6d 65 3c 6e 41 72 67  me=1; iName<nArg
329b0 20 26 26 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d   && azArg[iName]
329c0 5b 30 5d 3d 3d 27 2d 27 3b 20 69 4e 61 6d 65 2b  [0]=='-'; iName+
329d0 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  +){.      const 
329e0 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
329f0 69 4e 61 6d 65 5d 3b 0a 20 20 20 20 20 20 69 66  iName];.      if
32a00 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c  ( optionMatch(z,
32a10 22 6e 65 77 22 29 20 29 7b 0a 20 20 20 20 20 20  "new") ){.      
32a20 20 20 6e 65 77 46 6c 61 67 20 3d 20 31 3b 0a 23    newFlag = 1;.#
32a30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56  ifdef SQLITE_HAV
32a40 45 5f 5a 4c 49 42 0a 20 20 20 20 20 20 7d 65 6c  E_ZLIB.      }el
32a50 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74  se if( optionMat
32a60 63 68 28 7a 2c 20 22 7a 69 70 22 29 20 29 7b 0a  ch(z, "zip") ){.
32a70 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d          p->openM
32a80 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e  ode = SHELL_OPEN
32a90 5f 5a 49 50 46 49 4c 45 3b 0a 23 65 6e 64 69 66  _ZIPFILE;.#endif
32aa0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
32ab0 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20   optionMatch(z, 
32ac0 22 61 70 70 65 6e 64 22 29 20 29 7b 0a 20 20 20  "append") ){.   
32ad0 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65       p->openMode
32ae0 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50   = SHELL_OPEN_AP
32af0 50 45 4e 44 56 46 53 3b 0a 20 20 20 20 20 20 7d  PENDVFS;.      }
32b00 65 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d  else if( optionM
32b10 61 74 63 68 28 7a 2c 20 22 72 65 61 64 6f 6e 6c  atch(z, "readonl
32b20 79 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  y") ){.        p
32b30 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45  ->openMode = SHE
32b40 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  LL_OPEN_READONLY
32b50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
32b60 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  ( z[0]=='-' ){. 
32b70 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
32b80 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e  tf(stderr, "unkn
32b90 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e  own option: %s\n
32ba0 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72  ", z);.        r
32bb0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
32bc0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
32bd0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
32be0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61     }.    /* If a
32bf0 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 73 70 65   filename is spe
32c00 63 69 66 69 65 64 2c 20 74 72 79 20 74 6f 20 6f  cified, try to o
32c10 70 65 6e 20 69 74 20 66 69 72 73 74 20 2a 2f 0a  pen it first */.
32c20 20 20 20 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65      zNewFilename
32c30 20 3d 20 6e 41 72 67 3e 69 4e 61 6d 65 20 3f 20   = nArg>iName ? 
32c40 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
32c50 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 4e 61 6d  "%s", azArg[iNam
32c60 65 5d 29 20 3a 20 30 3b 0a 20 20 20 20 69 66 28  e]) : 0;.    if(
32c70 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 20 29 7b   zNewFilename ){
32c80 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 46 6c  .      if( newFl
32c90 61 67 20 29 20 73 68 65 6c 6c 44 65 6c 65 74 65  ag ) shellDelete
32ca0 46 69 6c 65 28 7a 4e 65 77 46 69 6c 65 6e 61 6d  File(zNewFilenam
32cb0 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62  e);.      p->zDb
32cc0 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 4e 65 77 46  Filename = zNewF
32cd0 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 6f  ilename;.      o
32ce0 70 65 6e 5f 64 62 28 70 2c 20 4f 50 45 4e 5f 44  pen_db(p, OPEN_D
32cf0 42 5f 4b 45 45 50 41 4c 49 56 45 29 3b 0a 20 20  B_KEEPALIVE);.  
32d00 20 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30      if( p->db==0
32d10 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
32d20 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
32d30 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
32d40 70 65 6e 20 27 25 73 27 5c 6e 22 2c 20 7a 4e 65  pen '%s'\n", zNe
32d50 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  wFilename);.    
32d60 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
32d70 28 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a  (zNewFilename);.
32d80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32d90 20 20 20 20 20 70 2d 3e 7a 46 72 65 65 4f 6e 43       p->zFreeOnC
32da0 6c 6f 73 65 20 3d 20 7a 4e 65 77 46 69 6c 65 6e  lose = zNewFilen
32db0 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
32dc0 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62   }.    if( p->db
32dd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
32de0 41 73 20 61 20 66 61 6c 6c 2d 62 61 63 6b 20 6f  As a fall-back o
32df0 70 65 6e 20 61 20 54 45 4d 50 20 64 61 74 61 62  pen a TEMP datab
32e00 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e  ase */.      p->
32e10 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b  zDbFilename = 0;
32e20 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  .      open_db(p
32e30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
32e40 6c 73 65 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27  lse..  if( (c=='
32e50 6f 27 0a 20 20 20 20 20 20 20 20 26 26 20 28 73  o'.        && (s
32e60 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
32e70 20 22 6f 75 74 70 75 74 22 2c 20 6e 29 3d 3d 30   "output", n)==0
32e80 7c 7c 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  ||strncmp(azArg[
32e90 30 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d  0], "once", n)==
32ea0 30 29 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 65  0)).   || (c=='e
32eb0 27 20 26 26 20 6e 3d 3d 35 20 26 26 20 73 74 72  ' && n==5 && str
32ec0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 65 78  cmp(azArg[0],"ex
32ed0 63 65 6c 22 29 3d 3d 30 29 0a 20 20 29 7b 0a 20  cel")==0).  ){. 
32ee0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
32ef0 46 69 6c 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f  File = nArg>=2 ?
32f00 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 73 74 64   azArg[1] : "std
32f10 6f 75 74 22 3b 0a 20 20 20 20 69 6e 74 20 62 54  out";.    int bT
32f20 78 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  xtMode = 0;.    
32f30 69 66 28 20 61 7a 41 72 67 5b 30 5d 5b 30 5d 3d  if( azArg[0][0]=
32f40 3d 27 65 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ='e' ){.      /*
32f50 20 54 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 22   Transform the "
32f60 2e 65 78 63 65 6c 22 20 63 6f 6d 6d 61 6e 64 20  .excel" command 
32f70 69 6e 74 6f 20 22 2e 6f 6e 63 65 20 2d 78 22 20  into ".once -x" 
32f80 2a 2f 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  */.      nArg = 
32f90 32 3b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 30  2;.      azArg[0
32fa0 5d 20 3d 20 22 6f 6e 63 65 22 3b 0a 20 20 20 20  ] = "once";.    
32fb0 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b    zFile = azArg[
32fc0 31 5d 20 3d 20 22 2d 78 22 3b 0a 20 20 20 20 20  1] = "-x";.     
32fd0 20 6e 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20   n = 4;.    }.  
32fe0 20 20 69 66 28 20 6e 41 72 67 3e 32 20 29 7b 0a    if( nArg>2 ){.
32ff0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
33000 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
33010 3a 20 2e 25 73 20 5b 2d 65 7c 2d 78 7c 46 49 4c  : .%s [-e|-x|FIL
33020 45 5d 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29  E]\n", azArg[0])
33030 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
33040 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
33050 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
33060 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 31 20    }.    if( n>1 
33070 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
33080 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d  [0], "once", n)=
33090 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
330a0 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20  nArg<2 ){.      
330b0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
330c0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6f 6e  err, "Usage: .on
330d0 63 65 20 28 2d 65 7c 2d 78 7c 46 49 4c 45 29 5c  ce (-e|-x|FILE)\
330e0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  n");.        rc 
330f0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
33100 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
33110 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xit;.      }.   
33120 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d     p->outCount =
33130 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   2;.    }else{. 
33140 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74       p->outCount
33150 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
33160 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b  output_reset(p);
33170 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 30  .    if( zFile[0
33180 5d 3d 3d 27 2d 27 20 26 26 20 7a 46 69 6c 65 5b  ]=='-' && zFile[
33190 31 5d 3d 3d 27 2d 27 20 29 20 7a 46 69 6c 65 2b  1]=='-' ) zFile+
331a0 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
331b0 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a  E_NOHAVE_SYSTEM.
331c0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
331d0 46 69 6c 65 2c 20 22 2d 65 22 29 3d 3d 30 20 7c  File, "-e")==0 |
331e0 7c 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20  | strcmp(zFile, 
331f0 22 2d 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  "-x")==0 ){.    
33200 20 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 3d    p->doXdgOpen =
33210 20 31 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74   1;.      output
33220 4d 6f 64 65 50 75 73 68 28 70 29 3b 0a 20 20 20  ModePush(p);.   
33230 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 31 5d 3d     if( zFile[1]=
33240 3d 27 78 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='x' ){.        
33250 6e 65 77 54 65 6d 70 46 69 6c 65 28 70 2c 20 22  newTempFile(p, "
33260 63 73 76 22 29 3b 0a 20 20 20 20 20 20 20 20 70  csv");.        p
33270 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 73  ->mode = MODE_Cs
33280 76 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  v;.        sqlit
33290 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
332a0 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  of(p->colSeparat
332b0 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  or), p->colSepar
332c0 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6d 6d 61 29  ator, SEP_Comma)
332d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
332e0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
332f0 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
33300 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
33310 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29 3b 0a  tor, SEP_CrLf);.
33320 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33330 20 20 20 20 20 6e 65 77 54 65 6d 70 46 69 6c 65       newTempFile
33340 28 70 2c 20 22 74 78 74 22 29 3b 0a 20 20 20 20  (p, "txt");.    
33350 20 20 20 20 62 54 78 74 4d 6f 64 65 20 3d 20 31      bTxtMode = 1
33360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33370 7a 46 69 6c 65 20 3d 20 70 2d 3e 7a 54 65 6d 70  zFile = p->zTemp
33380 46 69 6c 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  File;.    }.#end
33390 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 48  if /* SQLITE_NOH
333a0 41 56 45 5f 53 59 53 54 45 4d 20 2a 2f 0a 20 20  AVE_SYSTEM */.  
333b0 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d    if( zFile[0]==
333c0 27 7c 27 20 29 7b 0a 23 69 66 64 65 66 20 53 51  '|' ){.#ifdef SQ
333d0 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a  LITE_OMIT_POPEN.
333e0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
333f0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
33400 20 70 69 70 65 73 20 61 72 65 20 6e 6f 74 20 73   pipes are not s
33410 75 70 70 6f 72 74 65 64 20 69 6e 20 74 68 69 73  upported in this
33420 20 4f 53 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72   OS\n");.      r
33430 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e  c = 1;.      p->
33440 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 23 65  out = stdout;.#e
33450 6c 73 65 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74  lse.      p->out
33460 20 3d 20 70 6f 70 65 6e 28 7a 46 69 6c 65 20 2b   = popen(zFile +
33470 20 31 2c 20 22 77 22 29 3b 0a 20 20 20 20 20 20   1, "w");.      
33480 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b  if( p->out==0 ){
33490 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
334a0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
334b0 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
334c0 70 69 70 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  pipe \"%s\"\n", 
334d0 7a 46 69 6c 65 20 2b 20 31 29 3b 0a 20 20 20 20  zFile + 1);.    
334e0 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64      p->out = std
334f0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  out;.        rc 
33500 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
33510 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
33520 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
33530 66 28 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70  f(p->outfile), p
33540 2d 3e 6f 75 74 66 69 6c 65 2c 20 22 25 73 22 2c  ->outfile, "%s",
33550 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d   zFile);.      }
33560 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
33570 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20  e{.      p->out 
33580 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70  = output_file_op
33590 65 6e 28 7a 46 69 6c 65 2c 20 62 54 78 74 4d 6f  en(zFile, bTxtMo
335a0 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  de);.      if( p
335b0 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->out==0 ){.    
335c0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
335d0 46 69 6c 65 2c 22 6f 66 66 22 29 21 3d 30 20 29  File,"off")!=0 )
335e0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
335f0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  _printf(stderr,"
33600 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 77 72  Error: cannot wr
33610 69 74 65 20 74 6f 20 5c 22 25 73 5c 22 5c 6e 22  ite to \"%s\"\n"
33620 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  , zFile);.      
33630 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f    }.        p->o
33640 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20  ut = stdout;.   
33650 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
33660 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
33670 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
33680 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f  intf(sizeof(p->o
33690 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66  utfile), p->outf
336a0 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65  ile, "%s", zFile
336b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
336c0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
336d0 63 3d 3d 27 70 27 20 26 26 20 6e 3e 3d 33 20 26  c=='p' && n>=3 &
336e0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
336f0 30 5d 2c 20 22 70 72 69 6e 74 22 2c 20 6e 29 3d  0], "print", n)=
33700 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
33710 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
33720 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
33730 20 20 69 66 28 20 69 3e 31 20 29 20 72 61 77 5f    if( i>1 ) raw_
33740 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
33750 20 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f   ");.      utf8_
33760 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
33770 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  %s", azArg[i]);.
33780 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72      }.    raw_pr
33790 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
337a0 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  ");.  }else..  i
337b0 66 28 20 63 3d 3d 27 70 27 20 26 26 20 73 74 72  f( c=='p' && str
337c0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
337d0 70 72 6f 6d 70 74 22 2c 20 6e 29 3d 3d 30 20 29  prompt", n)==0 )
337e0 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 20 3e  {.    if( nArg >
337f0 3d 20 32 29 20 7b 0a 20 20 20 20 20 20 73 74 72  = 2) {.      str
33800 6e 63 70 79 28 6d 61 69 6e 50 72 6f 6d 70 74 2c  ncpy(mainPrompt,
33810 61 7a 41 72 67 5b 31 5d 2c 28 69 6e 74 29 41 72  azArg[1],(int)Ar
33820 72 61 79 53 69 7a 65 28 6d 61 69 6e 50 72 6f 6d  raySize(mainProm
33830 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  pt)-1);.    }.  
33840 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 33 29    if( nArg >= 3)
33850 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79   {.      strncpy
33860 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 2c  (continuePrompt,
33870 61 7a 41 72 67 5b 32 5d 2c 28 69 6e 74 29 41 72  azArg[2],(int)Ar
33880 72 61 79 53 69 7a 65 28 63 6f 6e 74 69 6e 75 65  raySize(continue
33890 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20  Prompt)-1);.    
338a0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
338b0 20 63 3d 3d 27 71 27 20 26 26 20 73 74 72 6e 63   c=='q' && strnc
338c0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 71 75  mp(azArg[0], "qu
338d0 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  it", n)==0 ){.  
338e0 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73    rc = 2;.  }els
338f0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72 27 20  e..  if( c=='r' 
33900 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
33910 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65  mp(azArg[0], "re
33920 61 64 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ad", n)==0 ){.  
33930 20 20 46 49 4c 45 20 2a 61 6c 74 3b 0a 20 20 20    FILE *alt;.   
33940 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a   if( nArg!=2 ){.
33950 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
33960 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
33970 20 2e 72 65 61 64 20 46 49 4c 45 5c 6e 22 29 3b   .read FILE\n");
33980 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
33990 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
339a0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
339b0 20 7d 0a 20 20 20 20 61 6c 74 20 3d 20 66 6f 70   }.    alt = fop
339c0 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 72 62  en(azArg[1], "rb
339d0 22 29 3b 0a 20 20 20 20 69 66 28 20 61 6c 74 3d  ");.    if( alt=
339e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =0 ){.      utf8
339f0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  _printf(stderr,"
33a00 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
33a10 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  en \"%s\"\n", az
33a20 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72  Arg[1]);.      r
33a30 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
33a40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f  {.      rc = pro
33a50 63 65 73 73 5f 69 6e 70 75 74 28 70 2c 20 61 6c  cess_input(p, al
33a60 74 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65  t);.      fclose
33a70 28 61 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (alt);.    }.  }
33a80 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
33a90 72 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  r' && n>=3 && st
33aa0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
33ab0 22 72 65 73 74 6f 72 65 22 2c 20 6e 29 3d 3d 30  "restore", n)==0
33ac0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
33ad0 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20  ar *zSrcFile;.  
33ae0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
33af0 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  b;.    sqlite3 *
33b00 70 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65  pSrc;.    sqlite
33b10 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
33b20 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d 65  p;.    int nTime
33b30 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  out = 0;..    if
33b40 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
33b50 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 61 7a     zSrcFile = az
33b60 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 7a 44  Arg[1];.      zD
33b70 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20  b = "main";.    
33b80 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d 3d  }else if( nArg==
33b90 33 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 46  3 ){.      zSrcF
33ba0 69 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a  ile = azArg[2];.
33bb0 20 20 20 20 20 20 7a 44 62 20 3d 20 61 7a 41 72        zDb = azAr
33bc0 67 5b 31 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  g[1];.    }else{
33bd0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
33be0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
33bf0 3a 20 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f 20  : .restore ?DB? 
33c00 46 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20  FILE\n");.      
33c10 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
33c20 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
33c30 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
33c40 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
33c50 6e 28 7a 53 72 63 46 69 6c 65 2c 20 26 70 53 72  n(zSrcFile, &pSr
33c60 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  c);.    if( rc!=
33c70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33c80 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
33c90 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63  tderr, "Error: c
33ca0 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
33cb0 22 5c 6e 22 2c 20 7a 53 72 63 46 69 6c 65 29 3b  "\n", zSrcFile);
33cc0 0a 20 20 20 20 20 20 63 6c 6f 73 65 5f 64 62 28  .      close_db(
33cd0 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  pSrc);.      ret
33ce0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
33cf0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
33d00 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71      pBackup = sq
33d10 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69  lite3_backup_ini
33d20 74 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 70 53  t(p->db, zDb, pS
33d30 72 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20  rc, "main");.   
33d40 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20   if( pBackup==0 
33d50 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
33d60 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
33d70 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
33d80 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
33d90 29 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 5f  ));.      close_
33da0 64 62 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20  db(pSrc);.      
33db0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
33dc0 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d      while( (rc =
33dd0 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
33de0 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30  step(pBackup,100
33df0 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ))==SQLITE_OK.  
33e00 20 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53          || rc==S
33e10 51 4c 49 54 45 5f 42 55 53 59 20 20 29 7b 0a 20  QLITE_BUSY  ){. 
33e20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
33e30 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
33e40 20 20 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74      if( nTimeout
33e50 2b 2b 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b  ++ >= 3 ) break;
33e60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
33e70 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20  _sleep(100);.   
33e80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
33e90 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69  qlite3_backup_fi
33ea0 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20  nish(pBackup);. 
33eb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
33ec0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
33ed0 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  rc = 0;.    }els
33ee0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
33ef0 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c  _BUSY || rc==SQL
33f00 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  ITE_LOCKED ){.  
33f10 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
33f20 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 73  tderr, "Error: s
33f30 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20 69  ource database i
33f40 73 20 62 75 73 79 5c 6e 22 29 3b 0a 20 20 20 20  s busy\n");.    
33f50 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65    rc = 1;.    }e
33f60 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  lse{.      utf8_
33f70 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
33f80 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
33f90 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
33fa0 64 62 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  db));.      rc =
33fb0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c   1;.    }.    cl
33fc0 6f 73 65 5f 64 62 28 70 53 72 63 29 3b 0a 20 20  ose_db(pSrc);.  
33fd0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
33fe0 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
33ff0 7a 41 72 67 5b 30 5d 2c 20 22 73 63 61 6e 73 74  zArg[0], "scanst
34000 61 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ats", n)==0 ){. 
34010 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
34020 7b 0a 20 20 20 20 20 20 70 2d 3e 73 63 61 6e 73  {.      p->scans
34030 74 61 74 73 4f 6e 20 3d 20 28 75 38 29 62 6f 6f  tatsOn = (u8)boo
34040 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
34050 31 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  1]);.#ifndef SQL
34060 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
34070 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 20  SCANSTATUS.     
34080 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
34090 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20 2e 73  rr, "Warning: .s
340a0 63 61 6e 73 74 61 74 73 20 6e 6f 74 20 61 76 61  canstats not ava
340b0 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
340c0 75 69 6c 64 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69  uild.\n");.#endi
340d0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
340e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
340f0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73  derr, "Usage: .s
34100 63 61 6e 73 74 61 74 73 20 6f 6e 7c 6f 66 66 5c  canstats on|off\
34110 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
34120 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
34130 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ..  if( c=='s' &
34140 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
34150 30 5d 2c 20 22 73 63 68 65 6d 61 22 2c 20 6e 29  0], "schema", n)
34160 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  ==0 ){.    Shell
34170 54 65 78 74 20 73 53 65 6c 65 63 74 3b 0a 20 20  Text sSelect;.  
34180 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74    ShellState dat
34190 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  a;.    char *zEr
341a0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 63 6f  rMsg = 0;.    co
341b0 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 76 20 3d  nst char *zDiv =
341c0 20 22 28 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20   "(";.    const 
341d0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
341e0 0a 20 20 20 20 69 6e 74 20 69 53 63 68 65 6d 61  .    int iSchema
341f0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 62 44   = 0;.    int bD
34200 65 62 75 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ebug = 0;.    in
34210 74 20 69 69 3b 0a 0a 20 20 20 20 6f 70 65 6e 5f  t ii;..    open_
34220 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65  db(p, 0);.    me
34230 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73  mcpy(&data, p, s
34240 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20  izeof(data));.  
34250 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65    data.showHeade
34260 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e  r = 0;.    data.
34270 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64  cMode = data.mod
34280 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20  e = MODE_Semi;. 
34290 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 53 65     initText(&sSe
342a0 6c 65 63 74 29 3b 0a 20 20 20 20 66 6f 72 28 69  lect);.    for(i
342b0 69 3d 31 3b 20 69 69 3c 6e 41 72 67 3b 20 69 69  i=1; ii<nArg; ii
342c0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  ++){.      if( o
342d0 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72 67  ptionMatch(azArg
342e0 5b 69 69 5d 2c 22 69 6e 64 65 6e 74 22 29 20 29  [ii],"indent") )
342f0 7b 0a 20 20 20 20 20 20 20 20 64 61 74 61 2e 63  {.        data.c
34300 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65  Mode = data.mode
34310 20 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79 3b 0a   = MODE_Pretty;.
34320 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
34330 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72  optionMatch(azAr
34340 67 5b 69 69 5d 2c 22 64 65 62 75 67 22 29 20 29  g[ii],"debug") )
34350 7b 0a 20 20 20 20 20 20 20 20 62 44 65 62 75 67  {.        bDebug
34360 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
34370 65 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29  e if( zName==0 )
34380 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  {.        zName 
34390 3d 20 61 7a 41 72 67 5b 69 69 5d 3b 0a 20 20 20  = azArg[ii];.   
343a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
343b0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
343c0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 63  err, "Usage: .sc
343d0 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20  hema ?--indent? 
343e0 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e  ?LIKE-PATTERN?\n
343f0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
34400 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
34410 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
34420 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
34430 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 21  }.    if( zName!
34440 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
34450 69 73 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74  isMaster = sqlit
34460 65 33 5f 73 74 72 6c 69 6b 65 28 7a 4e 61 6d 65  e3_strlike(zName
34470 2c 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  , "sqlite_master
34480 22 2c 20 27 5c 5c 27 29 3d 3d 30 3b 0a 20 20 20  ", '\\')==0;.   
34490 20 20 20 69 66 28 20 69 73 4d 61 73 74 65 72 20     if( isMaster 
344a0 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  || sqlite3_strli
344b0 6b 65 28 7a 4e 61 6d 65 2c 22 73 71 6c 69 74 65  ke(zName,"sqlite
344c0 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 2c 20 27  _temp_master", '
344d0 5c 5c 27 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  \\')==0 ){.     
344e0 20 20 20 63 68 61 72 20 2a 6e 65 77 5f 61 72 67     char *new_arg
344f0 76 5b 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b  v[2], *new_colv[
34500 32 5d 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f  2];.        new_
34510 61 72 67 76 5b 30 5d 20 3d 20 73 71 6c 69 74 65  argv[0] = sqlite
34520 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
34530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34540 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
34550 73 20 28 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  s (\n".         
34560 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
34570 74 79 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  type text,\n".  
34580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34590 20 20 20 20 22 20 20 6e 61 6d 65 20 74 65 78 74      "  name text
345a0 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ,\n".           
345b0 20 20 20 20 20 20 20 20 20 20 20 22 20 20 74 62             "  tb
345c0 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a  l_name text,\n".
345d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345e0 20 20 20 20 20 20 22 20 20 72 6f 6f 74 70 61 67        "  rootpag
345f0 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20  e integer,\n".  
34600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34610 20 20 20 20 22 20 20 73 71 6c 20 74 65 78 74 5c      "  sql text\
34620 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
34630 20 20 20 20 20 20 20 20 20 22 29 22 2c 20 69 73           ")", is
34640 4d 61 73 74 65 72 20 3f 20 22 73 71 6c 69 74 65  Master ? "sqlite
34650 5f 6d 61 73 74 65 72 22 20 3a 20 22 73 71 6c 69  _master" : "sqli
34660 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 29  te_temp_master")
34670 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72  ;.        new_ar
34680 67 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  gv[1] = 0;.     
34690 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d     new_colv[0] =
346a0 20 22 73 71 6c 22 3b 0a 20 20 20 20 20 20 20 20   "sql";.        
346b0 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b  new_colv[1] = 0;
346c0 0a 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63  .        callbac
346d0 6b 28 26 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f  k(&data, 1, new_
346e0 61 72 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b  argv, new_colv);
346f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34700 5f 66 72 65 65 28 6e 65 77 5f 61 72 67 76 5b 30  _free(new_argv[0
34710 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
34720 7d 0a 20 20 20 20 69 66 28 20 7a 44 69 76 20 29  }.    if( zDiv )
34730 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
34740 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
34750 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
34760 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
34770 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 6e 61  ->db, "SELECT na
34780 6d 65 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64  me FROM pragma_d
34790 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20  atabase_list",. 
347a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
347b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
347c0 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
347d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
347e0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
347f0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
34800 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
34810 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
34820 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
34830 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
34840 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
34850 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
34860 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
34870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
34880 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
34890 63 74 2c 20 22 53 45 4c 45 43 54 20 73 71 6c 20  ct, "SELECT sql 
348a0 46 52 4f 4d 22 2c 20 30 29 3b 0a 20 20 20 20 20  FROM", 0);.     
348b0 20 69 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20   iSchema = 0;.  
348c0 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
348d0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
348e0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
348f0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
34900 20 2a 7a 44 62 20 3d 20 28 63 6f 6e 73 74 20 63   *zDb = (const c
34910 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
34920 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
34930 30 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  0);.        char
34940 20 7a 53 63 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20   zScNum[30];.   
34950 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
34960 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53 63  rintf(sizeof(zSc
34970 4e 75 6d 29 2c 20 7a 53 63 4e 75 6d 2c 20 22 25  Num), zScNum, "%
34980 64 22 2c 20 2b 2b 69 53 63 68 65 6d 61 29 3b 0a  d", ++iSchema);.
34990 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
349a0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44 69  xt(&sSelect, zDi
349b0 76 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a  v, 0);.        z
349c0 44 69 76 20 3d 20 22 20 55 4e 49 4f 4e 20 41 4c  Div = " UNION AL
349d0 4c 20 22 3b 0a 20 20 20 20 20 20 20 20 61 70 70  L ";.        app
349e0 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
349f0 2c 20 22 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f  , "SELECT shell_
34a00 61 64 64 5f 73 63 68 65 6d 61 28 73 71 6c 2c 22  add_schema(sql,"
34a10 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
34a20 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
34a30 70 28 7a 44 62 2c 20 22 6d 61 69 6e 22 29 21 3d  p(zDb, "main")!=
34a40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
34a50 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
34a60 63 74 2c 20 7a 44 62 2c 20 27 22 27 29 3b 0a 20  ct, zDb, '"');. 
34a70 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
34a80 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
34a90 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 4e 55  xt(&sSelect, "NU
34aa0 4c 4c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  LL", 0);.       
34ab0 20 7d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e   }.        appen
34ac0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
34ad0 22 2c 6e 61 6d 65 29 20 41 53 20 73 71 6c 2c 20  ",name) AS sql, 
34ae0 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20  type, tbl_name, 
34af0 6e 61 6d 65 2c 20 72 6f 77 69 64 2c 22 2c 20 30  name, rowid,", 0
34b00 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  );.        appen
34b10 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
34b20 7a 53 63 4e 75 6d 2c 20 30 29 3b 0a 20 20 20 20  zScNum, 0);.    
34b30 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
34b40 73 53 65 6c 65 63 74 2c 20 22 20 41 53 20 73 6e  sSelect, " AS sn
34b50 75 6d 2c 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  um, ", 0);.     
34b60 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
34b70 53 65 6c 65 63 74 2c 20 7a 44 62 2c 20 27 5c 27  Select, zDb, '\'
34b80 27 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  ');.        appe
34b90 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
34ba0 20 22 20 41 53 20 73 6e 61 6d 65 20 46 52 4f 4d   " AS sname FROM
34bb0 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   ", 0);.        
34bc0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
34bd0 65 63 74 2c 20 7a 44 62 2c 20 27 22 27 29 3b 0a  ect, zDb, '"');.
34be0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
34bf0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2e 73  xt(&sSelect, ".s
34c00 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 30  qlite_master", 0
34c10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
34c20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
34c30 65 28 70 53 74 6d 74 29 3b 0a 23 69 66 64 65 66  e(pStmt);.#ifdef
34c40 20 53 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45   SQLITE_INTROSPE
34c50 43 54 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20  CTION_PRAGMAS.  
34c60 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b      if( zName ){
34c70 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
34c80 65 78 74 28 26 73 53 65 6c 65 63 74 2c 0a 20 20  ext(&sSelect,.  
34c90 20 20 20 20 20 20 20 20 20 22 20 55 4e 49 4f 4e           " UNION
34ca0 20 41 4c 4c 20 53 45 4c 45 43 54 20 73 68 65 6c   ALL SELECT shel
34cb0 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61 28  l_module_schema(
34cc0 6e 61 6d 65 29 2c 22 0a 20 20 20 20 20 20 20 20  name),".        
34cd0 20 20 20 22 20 27 74 61 62 6c 65 27 2c 20 6e 61     " 'table', na
34ce0 6d 65 2c 20 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20  me, name, name, 
34cf0 39 65 2b 39 39 2c 20 27 6d 61 69 6e 27 20 46 52  9e+99, 'main' FR
34d00 4f 4d 20 70 72 61 67 6d 61 5f 6d 6f 64 75 6c 65  OM pragma_module
34d10 5f 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20  _list", 0);.    
34d20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
34d30 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
34d40 6c 65 63 74 2c 20 22 29 20 57 48 45 52 45 20 22  lect, ") WHERE "
34d50 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
34d60 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
34d70 20 63 68 61 72 20 2a 7a 51 61 72 67 20 3d 20 73   char *zQarg = s
34d80 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
34d90 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %Q", zName);.   
34da0 20 20 20 20 20 69 6e 74 20 62 47 6c 6f 62 20 3d       int bGlob =
34db0 20 73 74 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27   strchr(zName, '
34dc0 2a 27 29 20 21 3d 20 30 20 7c 7c 20 73 74 72 63  *') != 0 || strc
34dd0 68 72 28 7a 4e 61 6d 65 2c 20 27 3f 27 29 20 21  hr(zName, '?') !
34de0 3d 20 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  = 0 ||.         
34df0 20 20 20 20 20 20 20 20 20 20 20 73 74 72 63 68             strch
34e00 72 28 7a 4e 61 6d 65 2c 20 27 5b 27 29 20 21 3d  r(zName, '[') !=
34e10 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
34e20 73 74 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27 2e  strchr(zName, '.
34e30 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ') ){.          
34e40 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
34e50 65 63 74 2c 20 22 6c 6f 77 65 72 28 70 72 69 6e  ect, "lower(prin
34e60 74 66 28 27 25 73 2e 25 73 27 2c 73 6e 61 6d 65  tf('%s.%s',sname
34e70 2c 74 62 6c 5f 6e 61 6d 65 29 29 22 2c 20 30 29  ,tbl_name))", 0)
34e80 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
34e90 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e  .          appen
34ea0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
34eb0 22 6c 6f 77 65 72 28 74 62 6c 5f 6e 61 6d 65 29  "lower(tbl_name)
34ec0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  ", 0);.        }
34ed0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
34ee0 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 62 47  ext(&sSelect, bG
34ef0 6c 6f 62 20 3f 20 22 20 47 4c 4f 42 20 22 20 3a  lob ? " GLOB " :
34f00 20 22 20 4c 49 4b 45 20 22 2c 20 30 29 3b 0a 20   " LIKE ", 0);. 
34f10 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
34f20 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 51 61 72  t(&sSelect, zQar
34f30 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  g, 0);.        i
34f40 66 28 20 21 62 47 6c 6f 62 20 29 7b 0a 20 20 20  f( !bGlob ){.   
34f50 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
34f60 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 45 53  t(&sSelect, " ES
34f70 43 41 50 45 20 27 5c 5c 27 20 22 2c 20 30 29 3b  CAPE '\\' ", 0);
34f80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34f90 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
34fa0 53 65 6c 65 63 74 2c 20 22 20 41 4e 44 20 22 2c  Select, " AND ",
34fb0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
34fc0 69 74 65 33 5f 66 72 65 65 28 7a 51 61 72 67 29  ite3_free(zQarg)
34fd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34fe0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
34ff0 65 63 74 2c 20 22 74 79 70 65 21 3d 27 6d 65 74  ect, "type!='met
35000 61 27 20 41 4e 44 20 73 71 6c 20 49 53 20 4e 4f  a' AND sql IS NO
35010 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20  T NULL".        
35020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35030 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 73 6e     " ORDER BY sn
35040 75 6d 2c 20 72 6f 77 69 64 22 2c 20 30 29 3b 0a  um, rowid", 0);.
35050 20 20 20 20 20 20 69 66 28 20 62 44 65 62 75 67        if( bDebug
35060 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
35070 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
35080 22 53 51 4c 3a 20 25 73 3b 5c 6e 22 2c 20 73 53  "SQL: %s;\n", sS
35090 65 6c 65 63 74 2e 7a 29 3b 0a 20 20 20 20 20 20  elect.z);.      
350a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
350b0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
350c0 28 70 2d 3e 64 62 2c 20 73 53 65 6c 65 63 74 2e  (p->db, sSelect.
350d0 7a 2c 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61  z, callback, &da
350e0 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ta, &zErrMsg);. 
350f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65       }.      fre
35100 65 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b  eText(&sSelect);
35110 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
35120 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
35130 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
35140 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  rr,"Error: %s\n"
35150 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
35160 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
35170 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72  ErrMsg);.      r
35180 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
35190 20 69 66 28 20 72 63 20 21 3d 20 53 51 4c 49 54   if( rc != SQLIT
351a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61  E_OK ){.      ra
351b0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
351c0 22 45 72 72 6f 72 3a 20 71 75 65 72 79 69 6e 67  "Error: querying
351d0 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74   schema informat
351e0 69 6f 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ion\n");.      r
351f0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
35200 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
35210 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23      }.  }else..#
35220 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
35230 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
35240 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
35250 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20  E_SELECTTRACE). 
35260 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 6e   if( c=='s' && n
35270 3d 3d 31 31 20 26 26 20 73 74 72 6e 63 6d 70 28  ==11 && strncmp(
35280 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65 6c 65 63  azArg[0], "selec
35290 74 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29  ttrace", n)==0 )
352a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
352b0 65 63 74 54 72 61 63 65 20 3d 20 28 69 6e 74 29  ectTrace = (int)
352c0 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41  integerValue(azA
352d0 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a  rg[1]);.  }else.
352e0 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
352f0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
35300 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 69 66 28  E_SESSION).  if(
35310 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63   c=='s' && strnc
35320 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 65 73  mp(azArg[0],"ses
35330 73 69 6f 6e 22 2c 6e 29 3d 3d 30 20 26 26 20 6e  sion",n)==0 && n
35340 3e 3d 33 20 29 7b 0a 20 20 20 20 4f 70 65 6e 53  >=3 ){.    OpenS
35350 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e  ession *pSession
35360 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b   = &p->aSession[
35370 30 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61  0];.    char **a
35380 7a 43 6d 64 20 3d 20 26 61 7a 41 72 67 5b 31 5d  zCmd = &azArg[1]
35390 3b 0a 20 20 20 20 69 6e 74 20 69 53 65 73 20 3d  ;.    int iSes =
353a0 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 64   0;.    int nCmd
353b0 20 3d 20 6e 41 72 67 20 2d 20 31 3b 0a 20 20 20   = nArg - 1;.   
353c0 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20   int i;.    if( 
353d0 6e 41 72 67 3c 3d 31 20 29 20 67 6f 74 6f 20 73  nArg<=1 ) goto s
353e0 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72  ession_syntax_er
353f0 72 6f 72 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  ror;.    open_db
35400 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  (p, 0);.    if( 
35410 6e 41 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20  nArg>=3 ){.     
35420 20 66 6f 72 28 69 53 65 73 3d 30 3b 20 69 53 65   for(iSes=0; iSe
35430 73 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69  s<p->nSession; i
35440 53 65 73 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Ses++){.        
35450 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 61 53  if( strcmp(p->aS
35460 65 73 73 69 6f 6e 5b 69 53 65 73 5d 2e 7a 4e 61  ession[iSes].zNa
35470 6d 65 2c 20 61 7a 41 72 67 5b 31 5d 29 3d 3d 30  me, azArg[1])==0
35480 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
35490 7d 0a 20 20 20 20 20 20 69 66 28 20 69 53 65 73  }.      if( iSes
354a0 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a  <p->nSession ){.
354b0 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
354c0 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b   = &p->aSession[
354d0 69 53 65 73 5d 3b 0a 20 20 20 20 20 20 20 20 61  iSes];.        a
354e0 7a 43 6d 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20  zCmd++;.        
354f0 6e 43 6d 64 2d 2d 3b 0a 20 20 20 20 20 20 7d 65  nCmd--;.      }e
35500 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53 65  lse{.        pSe
35510 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73  ssion = &p->aSes
35520 73 69 6f 6e 5b 30 5d 3b 0a 20 20 20 20 20 20 20  sion[0];.       
35530 20 69 53 65 73 20 3d 20 30 3b 0a 20 20 20 20 20   iSes = 0;.     
35540 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
35550 20 2e 73 65 73 73 69 6f 6e 20 61 74 74 61 63 68   .session attach
35560 20 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 49 6e   TABLE.    ** In
35570 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33  voke the sqlite3
35580 73 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 29  session_attach()
35590 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 61 74   interface to at
355a0 74 61 63 68 20 61 20 70 61 72 74 69 63 75 6c 61  tach a particula
355b0 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 73  r.    ** table s
355c0 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76  o that it is nev
355d0 65 72 20 66 69 6c 74 65 72 65 64 2e 0a 20 20 20  er filtered..   
355e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
355f0 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 61 74 74  mp(azCmd[0],"att
35600 61 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ach")==0 ){.    
35610 20 20 69 66 28 20 6e 43 6d 64 21 3d 32 20 29 20    if( nCmd!=2 ) 
35620 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e  goto session_syn
35630 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
35640 20 69 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 70   if( pSession->p
35650 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
35660 65 73 73 69 6f 6e 5f 6e 6f 74 5f 6f 70 65 6e 3a  ession_not_open:
35670 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
35680 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 52 52  ntf(stderr, "ERR
35690 4f 52 3a 20 4e 6f 20 73 65 73 73 69 6f 6e 73 20  OR: No sessions 
356a0 61 72 65 20 6f 70 65 6e 5c 6e 22 29 3b 0a 20 20  are open\n");.  
356b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
356c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73     rc = sqlite3s
356d0 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 70 53  ession_attach(pS
356e0 65 73 73 69 6f 6e 2d 3e 70 2c 20 61 7a 43 6d 64  ession->p, azCmd
356f0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  [1]);.        if
35700 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
35710 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
35720 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 73 71 6c  err, "ERROR: sql
35730 69 74 65 33 73 65 73 73 69 6f 6e 5f 61 74 74 61  ite3session_atta
35740 63 68 28 29 20 72 65 74 75 72 6e 73 20 25 64 5c  ch() returns %d\
35750 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  n", rc);.       
35760 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20     rc = 0;.     
35770 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35780 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e   }else..    /* .
35790 73 65 73 73 69 6f 6e 20 63 68 61 6e 67 65 73 65  session changese
357a0 74 20 46 49 4c 45 0a 20 20 20 20 2a 2a 20 2e 73  t FILE.    ** .s
357b0 65 73 73 69 6f 6e 20 70 61 74 63 68 73 65 74 20  ession patchset 
357c0 46 49 4c 45 0a 20 20 20 20 2a 2a 20 57 72 69 74  FILE.    ** Writ
357d0 65 20 61 20 63 68 61 6e 67 65 73 65 74 20 6f 72  e a changeset or
357e0 20 70 61 74 63 68 73 65 74 20 69 6e 74 6f 20 61   patchset into a
357f0 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 6c 65   file.  The file
35800 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 2e   is overwritten.
35810 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
35820 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c  strcmp(azCmd[0],
35830 22 63 68 61 6e 67 65 73 65 74 22 29 3d 3d 30 20  "changeset")==0 
35840 7c 7c 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b  || strcmp(azCmd[
35850 30 5d 2c 22 70 61 74 63 68 73 65 74 22 29 3d 3d  0],"patchset")==
35860 30 20 29 7b 0a 20 20 20 20 20 20 46 49 4c 45 20  0 ){.      FILE 
35870 2a 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  *out = 0;.      
35880 69 66 28 20 6e 43 6d 64 21 3d 32 20 29 20 67 6f  if( nCmd!=2 ) go
35890 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61  to session_synta
358a0 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69  x_error;.      i
358b0 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 70 3d 3d  f( pSession->p==
358c0 30 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e  0 ) goto session
358d0 5f 6e 6f 74 5f 6f 70 65 6e 3b 0a 20 20 20 20 20  _not_open;.     
358e0 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28 61 7a 43   out = fopen(azC
358f0 6d 64 5b 31 5d 2c 20 22 77 62 22 29 3b 0a 20 20  md[1], "wb");.  
35900 20 20 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29      if( out==0 )
35910 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
35920 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
35930 52 52 4f 52 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  RROR: cannot ope
35940 6e 20 5c 22 25 73 5c 22 20 66 6f 72 20 77 72 69  n \"%s\" for wri
35950 74 69 6e 67 5c 6e 22 2c 20 61 7a 43 6d 64 5b 31  ting\n", azCmd[1
35960 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
35970 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 43  .        int szC
35980 68 6e 67 3b 0a 20 20 20 20 20 20 20 20 76 6f 69  hng;.        voi
35990 64 20 2a 70 43 68 6e 67 3b 0a 20 20 20 20 20 20  d *pChng;.      
359a0 20 20 69 66 28 20 61 7a 43 6d 64 5b 30 5d 5b 30    if( azCmd[0][0
359b0 5d 3d 3d 27 63 27 20 29 7b 0a 20 20 20 20 20 20  ]=='c' ){.      
359c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
359d0 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65  session_changese
359e0 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 26  t(pSession->p, &
359f0 73 7a 43 68 6e 67 2c 20 26 70 43 68 6e 67 29 3b  szChng, &pChng);
35a00 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
35a10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
35a20 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 70 61  qlite3session_pa
35a30 74 63 68 73 65 74 28 70 53 65 73 73 69 6f 6e 2d  tchset(pSession-
35a40 3e 70 2c 20 26 73 7a 43 68 6e 67 2c 20 26 70 43  >p, &szChng, &pC
35a50 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  hng);.        }.
35a60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
35a70 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6e  {.          prin
35a80 74 66 28 22 45 72 72 6f 72 3a 20 65 72 72 6f 72  tf("Error: error
35a90 20 63 6f 64 65 20 25 64 5c 6e 22 2c 20 72 63 29   code %d\n", rc)
35aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
35ab0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
35ac0 20 20 20 20 20 20 69 66 28 20 70 43 68 6e 67 0a        if( pChng.
35ad0 20 20 20 20 20 20 20 20 20 20 26 26 20 66 77 72            && fwr
35ae0 69 74 65 28 70 43 68 6e 67 2c 20 73 7a 43 68 6e  ite(pChng, szChn
35af0 67 2c 20 31 2c 20 6f 75 74 29 21 3d 31 20 29 7b  g, 1, out)!=1 ){
35b00 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
35b10 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
35b20 52 52 4f 52 3a 20 46 61 69 6c 65 64 20 74 6f 20  RROR: Failed to 
35b30 77 72 69 74 65 20 65 6e 74 69 72 65 20 25 64 2d  write entire %d-
35b40 62 79 74 65 20 6f 75 74 70 75 74 5c 6e 22 2c 0a  byte output\n",.
35b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b60 20 20 73 7a 43 68 6e 67 29 3b 0a 20 20 20 20 20    szChng);.     
35b70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
35b80 69 74 65 33 5f 66 72 65 65 28 70 43 68 6e 67 29  ite3_free(pChng)
35b90 3b 0a 20 20 20 20 20 20 20 20 66 63 6c 6f 73 65  ;.        fclose
35ba0 28 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (out);.      }. 
35bb0 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a     }else..    /*
35bc0 20 2e 73 65 73 73 69 6f 6e 20 63 6c 6f 73 65 0a   .session close.
35bd0 20 20 20 20 2a 2a 20 43 6c 6f 73 65 20 74 68 65      ** Close the
35be0 20 69 64 65 6e 74 69 66 69 65 64 20 73 65 73 73   identified sess
35bf0 69 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ion.    */.    i
35c00 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b  f( strcmp(azCmd[
35c10 30 5d 2c 20 22 63 6c 6f 73 65 22 29 3d 3d 30 20  0], "close")==0 
35c20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d  ){.      if( nCm
35c30 64 21 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73  d!=1 ) goto sess
35c40 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  ion_syntax_error
35c50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
35c60 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  Session ){.     
35c70 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65     session_close
35c80 28 70 53 65 73 73 69 6f 6e 29 3b 0a 20 20 20 20  (pSession);.    
35c90 20 20 20 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b      p->aSession[
35ca0 69 53 65 73 5d 20 3d 20 70 2d 3e 61 53 65 73 73  iSes] = p->aSess
35cb0 69 6f 6e 5b 2d 2d 70 2d 3e 6e 53 65 73 73 69 6f  ion[--p->nSessio
35cc0 6e 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n];.      }.    
35cd0 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73  }else..    /* .s
35ce0 65 73 73 69 6f 6e 20 65 6e 61 62 6c 65 20 3f 42  ession enable ?B
35cf0 4f 4f 4c 45 41 4e 3f 0a 20 20 20 20 2a 2a 20 51  OOLEAN?.    ** Q
35d00 75 65 72 79 20 6f 72 20 73 65 74 20 74 68 65 20  uery or set the 
35d10 65 6e 61 62 6c 65 20 66 6c 61 67 0a 20 20 20 20  enable flag.    
35d20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
35d30 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 65 6e 61  p(azCmd[0], "ena
35d40 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ble")==0 ){.    
35d50 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
35d60 69 66 28 20 6e 43 6d 64 3e 32 20 29 20 67 6f 74  if( nCmd>2 ) got
35d70 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
35d80 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 69  _error;.      ii
35d90 20 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20 2d 31 20   = nCmd==1 ? -1 
35da0 3a 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  : booleanValue(a
35db0 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zCmd[1]);.      
35dc0 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20  if( p->nSession 
35dd0 29 7b 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20  ){.        ii = 
35de0 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 65  sqlite3session_e
35df0 6e 61 62 6c 65 28 70 53 65 73 73 69 6f 6e 2d 3e  nable(pSession->
35e00 70 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20  p, ii);.        
35e10 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
35e20 75 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20  ut, "session %s 
35e30 65 6e 61 62 6c 65 20 66 6c 61 67 20 3d 20 25 64  enable flag = %d
35e40 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
35e50 20 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f           pSessio
35e60 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a 20  n->zName, ii);. 
35e70 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35e80 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f  ..    /* .sessio
35e90 6e 20 66 69 6c 74 65 72 20 47 4c 4f 42 20 2e 2e  n filter GLOB ..
35ea0 2e 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 61 20  ...    ** Set a 
35eb0 6c 69 73 74 20 6f 66 20 47 4c 4f 42 20 70 61 74  list of GLOB pat
35ec0 74 65 72 6e 73 20 6f 66 20 74 61 62 6c 65 20 6e  terns of table n
35ed0 61 6d 65 73 20 74 6f 20 62 65 20 65 78 63 6c 75  ames to be exclu
35ee0 64 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ded..    */.    
35ef0 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64  if( strcmp(azCmd
35f00 5b 30 5d 2c 20 22 66 69 6c 74 65 72 22 29 3d 3d  [0], "filter")==
35f10 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
35f20 69 2c 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  i, nByte;.      
35f30 69 66 28 20 6e 43 6d 64 3c 32 20 29 20 67 6f 74  if( nCmd<2 ) got
35f40 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
35f50 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66  _error;.      if
35f60 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b  ( p->nSession ){
35f70 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
35f80 30 3b 20 69 69 3c 70 53 65 73 73 69 6f 6e 2d 3e  0; ii<pSession->
35f90 6e 46 69 6c 74 65 72 3b 20 69 69 2b 2b 29 7b 0a  nFilter; ii++){.
35fa0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
35fb0 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d  3_free(pSession-
35fc0 3e 61 7a 46 69 6c 74 65 72 5b 69 69 5d 29 3b 0a  >azFilter[ii]);.
35fd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35fe0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
35ff0 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
36000 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 42 79 74  r);.        nByt
36010 65 20 3d 20 73 69 7a 65 6f 66 28 70 53 65 73 73  e = sizeof(pSess
36020 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 30 5d  ion->azFilter[0]
36030 29 2a 28 6e 43 6d 64 2d 31 29 3b 0a 20 20 20 20  )*(nCmd-1);.    
36040 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a      pSession->az
36050 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Filter = sqlite3
36060 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29  _malloc( nByte )
36070 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
36080 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72  ession->azFilter
36090 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
360a0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
360b0 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20  rr, "Error: out 
360c0 6f 72 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  or memory\n");. 
360d0 20 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29           exit(1)
360e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
360f0 20 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69      for(ii=1; ii
36100 3c 6e 43 6d 64 3b 20 69 69 2b 2b 29 7b 0a 20 20  <nCmd; ii++){.  
36110 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
36120 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 69 2d 31 5d  ->azFilter[ii-1]
36130 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
36140 74 66 28 22 25 73 22 2c 20 61 7a 43 6d 64 5b 69  tf("%s", azCmd[i
36150 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
36160 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d         pSession-
36170 3e 6e 46 69 6c 74 65 72 20 3d 20 69 69 2d 31 3b  >nFilter = ii-1;
36180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
36190 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73  se..    /* .sess
361a0 69 6f 6e 20 69 6e 64 69 72 65 63 74 20 3f 42 4f  ion indirect ?BO
361b0 4f 4c 45 41 4e 3f 0a 20 20 20 20 2a 2a 20 51 75  OLEAN?.    ** Qu
361c0 65 72 79 20 6f 72 20 73 65 74 20 74 68 65 20 69  ery or set the i
361d0 6e 64 69 72 65 63 74 20 66 6c 61 67 0a 20 20 20  ndirect flag.   
361e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
361f0 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 69 6e  mp(azCmd[0], "in
36200 64 69 72 65 63 74 22 29 3d 3d 30 20 29 7b 0a 20  direct")==0 ){. 
36210 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
36220 20 20 20 69 66 28 20 6e 43 6d 64 3e 32 20 29 20     if( nCmd>2 ) 
36230 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e  goto session_syn
36240 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
36250 20 69 69 20 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20   ii = nCmd==1 ? 
36260 2d 31 20 3a 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  -1 : booleanValu
36270 65 28 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20  e(azCmd[1]);.   
36280 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69     if( p->nSessi
36290 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 69  on ){.        ii
362a0 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   = sqlite3sessio
362b0 6e 5f 69 6e 64 69 72 65 63 74 28 70 53 65 73 73  n_indirect(pSess
362c0 69 6f 6e 2d 3e 70 2c 20 69 69 29 3b 0a 20 20 20  ion->p, ii);.   
362d0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
362e0 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f  (p->out, "sessio
362f0 6e 20 25 73 20 69 6e 64 69 72 65 63 74 20 66 6c  n %s indirect fl
36300 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20  ag = %d\n",.    
36310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36320 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c  pSession->zName,
36330 20 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   ii);.      }.  
36340 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
36350 2e 73 65 73 73 69 6f 6e 20 69 73 65 6d 70 74 79  .session isempty
36360 0a 20 20 20 20 2a 2a 20 44 65 74 65 72 6d 69 6e  .    ** Determin
36370 65 20 69 66 20 74 68 65 20 73 65 73 73 69 6f 6e  e if the session
36380 20 69 73 20 65 6d 70 74 79 0a 20 20 20 20 2a 2f   is empty.    */
36390 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
363a0 61 7a 43 6d 64 5b 30 5d 2c 20 22 69 73 65 6d 70  azCmd[0], "isemp
363b0 74 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ty")==0 ){.     
363c0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 69   int ii;.      i
363d0 66 28 20 6e 43 6d 64 21 3d 31 20 29 20 67 6f 74  f( nCmd!=1 ) got
363e0 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
363f0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66  _error;.      if
36400 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b  ( p->nSession ){
36410 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20 73 71  .        ii = sq
36420 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 69 73 65  lite3session_ise
36430 6d 70 74 79 28 70 53 65 73 73 69 6f 6e 2d 3e 70  mpty(pSession->p
36440 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  );.        utf8_
36450 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
36460 73 65 73 73 69 6f 6e 20 25 73 20 69 73 65 6d 70  session %s isemp
36470 74 79 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c  ty flag = %d\n",
36480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36490 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a       pSession->z
364a0 4e 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20  Name, ii);.     
364b0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20   }.    }else..  
364c0 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 6c 69    /* .session li
364d0 73 74 0a 20 20 20 20 2a 2a 20 4c 69 73 74 20 61  st.    ** List a
364e0 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  ll currently ope
364f0 6e 20 73 65 73 73 69 6f 6e 73 0a 20 20 20 20 2a  n sessions.    *
36500 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  /.    if( strcmp
36510 28 61 7a 43 6d 64 5b 30 5d 2c 22 6c 69 73 74 22  (azCmd[0],"list"
36520 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  )==0 ){.      fo
36530 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73  r(i=0; i<p->nSes
36540 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sion; i++){.    
36550 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
36560 70 2d 3e 6f 75 74 2c 20 22 25 64 20 25 73 5c 6e  p->out, "%d %s\n
36570 22 2c 20 69 2c 20 70 2d 3e 61 53 65 73 73 69 6f  ", i, p->aSessio
36580 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  n[i].zName);.   
36590 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a     }.    }else..
365a0 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20      /* .session 
365b0 6f 70 65 6e 20 44 42 20 4e 41 4d 45 0a 20 20 20  open DB NAME.   
365c0 20 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 73   ** Open a new s
365d0 65 73 73 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  ession called NA
365e0 4d 45 20 6f 6e 20 74 68 65 20 61 74 74 61 63 68  ME on the attach
365f0 65 64 20 64 61 74 61 62 61 73 65 20 44 42 2e 0a  ed database DB..
36600 20 20 20 20 2a 2a 20 44 42 20 69 73 20 6e 6f 72      ** DB is nor
36610 6d 61 6c 6c 79 20 22 6d 61 69 6e 22 2e 0a 20 20  mally "main"..  
36620 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
36630 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 6f 70  cmp(azCmd[0],"op
36640 65 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  en")==0 ){.     
36650 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
36660 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 33 20      if( nCmd!=3 
36670 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
36680 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
36690 20 20 20 7a 4e 61 6d 65 20 3d 20 61 7a 43 6d 64     zName = azCmd
366a0 5b 32 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [2];.      if( z
366b0 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 67 6f 74  Name[0]==0 ) got
366c0 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
366d0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 66 6f  _error;.      fo
366e0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73  r(i=0; i<p->nSes
366f0 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sion; i++){.    
36700 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70      if( strcmp(p
36710 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 2e 7a 4e  ->aSession[i].zN
36720 61 6d 65 2c 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ame,zName)==0 ){
36730 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
36740 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
36750 53 65 73 73 69 6f 6e 20 5c 22 25 73 5c 22 20 61  Session \"%s\" a
36760 6c 72 65 61 64 79 20 65 78 69 73 74 73 5c 6e 22  lready exists\n"
36770 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
36780 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
36790 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
367a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
367b0 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73      if( p->nSess
367c0 69 6f 6e 3e 3d 41 72 72 61 79 53 69 7a 65 28 70  ion>=ArraySize(p
367d0 2d 3e 61 53 65 73 73 69 6f 6e 29 20 29 7b 0a 20  ->aSession) ){. 
367e0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
367f0 66 28 73 74 64 65 72 72 2c 20 22 4d 61 78 69 6d  f(stderr, "Maxim
36800 75 6d 20 6f 66 20 25 64 20 73 65 73 73 69 6f 6e  um of %d session
36810 73 5c 6e 22 2c 20 41 72 72 61 79 53 69 7a 65 28  s\n", ArraySize(
36820 70 2d 3e 61 53 65 73 73 69 6f 6e 29 29 3b 0a 20  p->aSession));. 
36830 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
36840 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
36850 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 65       }.      pSe
36860 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73  ssion = &p->aSes
36870 73 69 6f 6e 5b 70 2d 3e 6e 53 65 73 73 69 6f 6e  sion[p->nSession
36880 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ];.      rc = sq
36890 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 72 65  lite3session_cre
368a0 61 74 65 28 70 2d 3e 64 62 2c 20 61 7a 43 6d 64  ate(p->db, azCmd
368b0 5b 31 5d 2c 20 26 70 53 65 73 73 69 6f 6e 2d 3e  [1], &pSession->
368c0 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  p);.      if( rc
368d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
368e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
368f0 43 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 65 73 73  Cannot open sess
36900 69 6f 6e 3a 20 65 72 72 6f 72 20 63 6f 64 65 3d  ion: error code=
36910 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d\n", rc);.    
36920 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
36930 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
36940 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
36950 20 20 7d 0a 20 20 20 20 20 20 70 53 65 73 73 69    }.      pSessi
36960 6f 6e 2d 3e 6e 46 69 6c 74 65 72 20 3d 20 30 3b  on->nFilter = 0;
36970 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 73 65  .      sqlite3se
36980 73 73 69 6f 6e 5f 74 61 62 6c 65 5f 66 69 6c 74  ssion_table_filt
36990 65 72 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20  er(pSession->p, 
369a0 73 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72 2c 20  session_filter, 
369b0 70 53 65 73 73 69 6f 6e 29 3b 0a 20 20 20 20 20  pSession);.     
369c0 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 2b 2b 3b 0a   p->nSession++;.
369d0 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e        pSession->
369e0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  zName = sqlite3_
369f0 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e  mprintf("%s", zN
36a00 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  ame);.    }else.
36a10 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 6f 6d      /* If no com
36a20 6d 61 6e 64 20 6e 61 6d 65 20 6d 61 74 63 68 65  mand name matche
36a30 73 2c 20 73 68 6f 77 20 61 20 73 79 6e 74 61 78  s, show a syntax
36a40 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 73 65   error */.    se
36a50 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
36a60 6f 72 3a 0a 20 20 20 20 73 68 6f 77 48 65 6c 70  or:.    showHelp
36a70 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f  (p->out, "sessio
36a80 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  n");.  }else.#en
36a90 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
36aa0 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 55 6e  TE_DEBUG.  /* Un
36ab0 64 6f 63 75 6d 65 6e 74 65 64 20 63 6f 6d 6d 61  documented comma
36ac0 6e 64 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  nds for internal
36ad0 20 74 65 73 74 69 6e 67 2e 20 20 53 75 62 6a 65   testing.  Subje
36ae0 63 74 20 74 6f 20 63 68 61 6e 67 65 0a 20 20 2a  ct to change.  *
36af0 2a 20 77 69 74 68 6f 75 74 20 6e 6f 74 69 63 65  * without notice
36b00 2e 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 73  . */.  if( c=='s
36b10 27 20 26 26 20 6e 3e 3d 31 30 20 26 26 20 73 74  ' && n>=10 && st
36b20 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
36b30 22 73 65 6c 66 74 65 73 74 2d 22 2c 20 39 29 3d  "selftest-", 9)=
36b40 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  =0 ){.    if( st
36b50 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39  rncmp(azArg[0]+9
36b60 2c 20 22 62 6f 6f 6c 65 61 6e 22 2c 20 6e 2d 39  , "boolean", n-9
36b70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
36b80 74 20 69 2c 20 76 3b 0a 20 20 20 20 20 20 66 6f  t i, v;.      fo
36b90 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=1; i<nArg; i
36ba0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 76 20 3d  ++){.        v =
36bb0 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
36bc0 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
36bd0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
36be0 6f 75 74 2c 20 22 25 73 3a 20 25 64 20 30 78 25  out, "%s: %d 0x%
36bf0 78 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20  x\n", azArg[i], 
36c00 76 2c 20 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  v, v);.      }. 
36c10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
36c20 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c  ncmp(azArg[0]+9,
36c30 20 22 69 6e 74 65 67 65 72 22 2c 20 6e 2d 39 29   "integer", n-9)
36c40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
36c50 20 69 3b 20 73 71 6c 69 74 65 33 5f 69 6e 74 36   i; sqlite3_int6
36c60 34 20 76 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  4 v;.      for(i
36c70 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =1; i<nArg; i++)
36c80 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a  {.        char z
36c90 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 20 20  Buf[200];.      
36ca0 20 20 76 20 3d 20 69 6e 74 65 67 65 72 56 61 6c    v = integerVal
36cb0 75 65 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ue(azArg[i]);.  
36cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
36cd0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
36ce0 75 66 29 2c 7a 42 75 66 2c 22 25 73 3a 20 25 6c  uf),zBuf,"%s: %l
36cf0 6c 64 20 30 78 25 6c 6c 78 5c 6e 22 2c 20 61 7a  ld 0x%llx\n", az
36d00 41 72 67 5b 69 5d 2c 76 2c 76 29 3b 0a 20 20 20  Arg[i],v,v);.   
36d10 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
36d20 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
36d30 42 75 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Buf);.      }.  
36d40 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
36d50 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  if..  if( c=='s'
36d60 20 26 26 20 6e 3e 3d 34 20 26 26 20 73 74 72 6e   && n>=4 && strn
36d70 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 65  cmp(azArg[0],"se
36d80 6c 66 74 65 73 74 22 2c 6e 29 3d 3d 30 20 29 7b  lftest",n)==0 ){
36d90 0a 20 20 20 20 69 6e 74 20 62 49 73 49 6e 69 74  .    int bIsInit
36da0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
36db0 20 54 72 75 65 20 74 6f 20 69 6e 69 74 69 61 6c   True to initial
36dc0 69 7a 65 20 74 68 65 20 53 45 4c 46 54 45 53 54  ize the SELFTEST
36dd0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
36de0 74 20 62 56 65 72 62 6f 73 65 20 3d 20 30 3b 20  t bVerbose = 0; 
36df0 20 20 20 20 20 20 20 2f 2a 20 56 65 72 62 6f 73         /* Verbos
36e00 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  e output */.    
36e10 69 6e 74 20 62 53 65 6c 66 74 65 73 74 45 78 69  int bSelftestExi
36e20 73 74 73 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  sts;     /* True
36e30 20 69 66 20 53 45 4c 46 54 45 53 54 20 61 6c 72   if SELFTEST alr
36e40 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20  eady exists */. 
36e50 20 20 20 69 6e 74 20 69 2c 20 6b 3b 20 20 20 20     int i, k;    
36e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
36e70 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
36e80 20 20 20 20 69 6e 74 20 6e 54 65 73 74 20 3d 20      int nTest = 
36e90 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
36ea0 4e 75 6d 62 65 72 20 6f 66 20 74 65 73 74 73 20  Number of tests 
36eb0 72 75 6e 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  runs */.    int 
36ec0 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20 20 20  nErr = 0;       
36ed0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
36ee0 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f  f errors seen */
36ef0 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73  .    ShellText s
36f00 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  tr;           /*
36f10 20 41 6e 73 77 65 72 20 66 6f 72 20 61 20 71 75   Answer for a qu
36f20 65 72 79 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ery */.    sqlit
36f30 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
36f40 20 30 3b 20 2f 2a 20 51 75 65 72 79 20 61 67 61   0; /* Query aga
36f50 69 6e 73 74 20 74 68 65 20 53 45 4c 46 54 45 53  inst the SELFTES
36f60 54 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20  T table */..    
36f70 6f 70 65 6e 5f 64 62 28 70 2c 30 29 3b 0a 20 20  open_db(p,0);.  
36f80 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72    for(i=1; i<nAr
36f90 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  g; i++){.      c
36fa0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
36fb0 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69  zArg[i];.      i
36fc0 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20  f( z[0]=='-' && 
36fd0 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[1]=='-' ) z++;
36fe0 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
36ff0 70 28 7a 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20  p(z,"-init")==0 
37000 29 7b 0a 20 20 20 20 20 20 20 20 62 49 73 49 6e  ){.        bIsIn
37010 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  it = 1;.      }e
37020 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74  lse.      if( st
37030 72 63 6d 70 28 7a 2c 22 2d 76 22 29 3d 3d 30 20  rcmp(z,"-v")==0 
37040 29 7b 0a 20 20 20 20 20 20 20 20 62 56 65 72 62  ){.        bVerb
37050 6f 73 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  ose++;.      }el
37060 73 65 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  se.      {.     
37070 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
37080 74 64 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20  tderr, "Unknown 
37090 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e  option \"%s\" on
370a0 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20   \"%s\"\n",.    
370b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
370c0 61 7a 41 72 67 5b 69 5d 2c 20 61 7a 41 72 67 5b  azArg[i], azArg[
370d0 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77  0]);.        raw
370e0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
370f0 22 53 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f  "Should be one o
37100 66 3a 20 2d 2d 69 6e 69 74 20 2d 76 5c 6e 22 29  f: --init -v\n")
37110 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
37120 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
37130 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
37140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
37150 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
37160 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
37170 61 64 61 74 61 28 70 2d 3e 64 62 2c 22 6d 61 69  adata(p->db,"mai
37180 6e 22 2c 22 73 65 6c 66 74 65 73 74 22 2c 30 2c  n","selftest",0,
37190 30 2c 30 2c 30 2c 30 2c 30 29 0a 20 20 20 20 20  0,0,0,0,0).     
371a0 20 20 20 20 20 20 21 3d 20 53 51 4c 49 54 45 5f        != SQLITE_
371b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 62 53 65 6c  OK ){.      bSel
371c0 66 74 65 73 74 45 78 69 73 74 73 20 3d 20 30 3b  ftestExists = 0;
371d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
371e0 20 20 62 53 65 6c 66 74 65 73 74 45 78 69 73 74    bSelftestExist
371f0 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  s = 1;.    }.   
37200 20 69 66 28 20 62 49 73 49 6e 69 74 20 29 7b 0a   if( bIsInit ){.
37210 20 20 20 20 20 20 63 72 65 61 74 65 53 65 6c 66        createSelf
37220 74 65 73 74 54 61 62 6c 65 28 70 29 3b 0a 20 20  testTable(p);.  
37230 20 20 20 20 62 53 65 6c 66 74 65 73 74 45 78 69      bSelftestExi
37240 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  sts = 1;.    }. 
37250 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 74 72     initText(&str
37260 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
37270 74 28 26 73 74 72 2c 20 22 78 22 2c 20 30 29 3b  t(&str, "x", 0);
37280 0a 20 20 20 20 66 6f 72 28 6b 3d 62 53 65 6c 66  .    for(k=bSelf
37290 74 65 73 74 45 78 69 73 74 73 3b 20 6b 3e 3d 30  testExists; k>=0
372a0 3b 20 6b 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  ; k--){.      if
372b0 28 20 6b 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ( k==1 ){.      
372c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
372d0 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
372e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45  .            "SE
372f0 4c 45 43 54 20 74 6e 6f 2c 6f 70 2c 63 6d 64 2c  LECT tno,op,cmd,
37300 61 6e 73 20 46 52 4f 4d 20 73 65 6c 66 74 65 73  ans FROM selftes
37310 74 20 4f 52 44 45 52 20 42 59 20 74 6e 6f 22 2c  t ORDER BY tno",
37320 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c  .            -1,
37330 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
37340 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
37360 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
37370 0a 20 20 20 20 20 20 20 20 20 20 22 56 41 4c 55  .          "VALU
37380 45 53 28 30 2c 27 6d 65 6d 6f 27 2c 27 4d 69 73  ES(0,'memo','Mis
37390 73 69 6e 67 20 53 45 4c 46 54 45 53 54 20 74 61  sing SELFTEST ta
373a0 62 6c 65 20 2d 20 64 65 66 61 75 6c 74 20 63 68  ble - default ch
373b0 65 63 6b 73 20 6f 6e 6c 79 27 2c 27 27 29 2c 22  ecks only',''),"
373c0 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20  .          "    
373d0 20 20 28 31 2c 27 72 75 6e 27 2c 27 50 52 41 47    (1,'run','PRAG
373e0 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
373f0 63 6b 27 2c 27 6f 6b 27 29 22 2c 0a 20 20 20 20  ck','ok')",.    
37400 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74        -1, &pStmt
37410 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
37420 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
37430 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
37440 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20  (stderr, "Error 
37450 71 75 65 72 79 69 6e 67 20 74 68 65 20 73 65 6c  querying the sel
37460 66 74 65 73 74 20 74 61 62 6c 65 5c 6e 22 29 3b  ftest table\n");
37470 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
37480 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37490 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
374a0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
374b0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
374c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
374d0 66 6f 72 28 69 3d 31 3b 20 73 71 6c 69 74 65 33  for(i=1; sqlite3
374e0 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
374f0 4c 49 54 45 5f 52 4f 57 3b 20 69 2b 2b 29 7b 0a  LITE_ROW; i++){.
37500 20 20 20 20 20 20 20 20 69 6e 74 20 74 6e 6f 20          int tno 
37510 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
37520 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
37530 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
37540 61 72 20 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73 74  ar *zOp = (const
37550 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
37560 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
37570 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  , 1);.        co
37580 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
37590 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
375a0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
375b0 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20  t(pStmt, 2);.   
375c0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
375d0 2a 7a 41 6e 73 20 3d 20 28 63 6f 6e 73 74 20 63  *zAns = (const c
375e0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
375f0 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
37600 33 29 3b 0a 0a 20 20 20 20 20 20 20 20 6b 20 3d  3);..        k =
37610 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
37620 62 56 65 72 62 6f 73 65 3e 30 20 29 7b 0a 20 20  bVerbose>0 ){.  
37630 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51          char *zQ
37640 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  uote = sqlite3_m
37650 70 72 69 6e 74 66 28 22 25 71 22 2c 20 7a 53 71  printf("%q", zSq
37660 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72  l);.          pr
37670 69 6e 74 66 28 22 25 64 3a 20 25 73 20 25 73 5c  intf("%d: %s %s\
37680 6e 22 2c 20 74 6e 6f 2c 20 7a 4f 70 2c 20 7a 53  n", tno, zOp, zS
37690 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ql);.          s
376a0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 6f  qlite3_free(zQuo
376b0 74 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  te);.        }. 
376c0 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
376d0 70 28 7a 4f 70 2c 22 6d 65 6d 6f 22 29 3d 3d 30  p(zOp,"memo")==0
376e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
376f0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
37700 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b  , "%s\n", zSql);
37710 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  .        }else. 
37720 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
37730 70 28 7a 4f 70 2c 22 72 75 6e 22 29 3d 3d 30 20  p(zOp,"run")==0 
37740 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
37750 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
37760 20 20 20 20 20 20 20 20 20 20 73 74 72 2e 6e 20            str.n 
37770 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 0;.          s
37780 74 72 2e 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  tr.z[0] = 0;.   
37790 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
377a0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
377b0 7a 53 71 6c 2c 20 63 61 70 74 75 72 65 4f 75 74  zSql, captureOut
377c0 70 75 74 43 61 6c 6c 62 61 63 6b 2c 20 26 73 74  putCallback, &st
377d0 72 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  r, &zErrMsg);.  
377e0 20 20 20 20 20 20 20 20 6e 54 65 73 74 2b 2b 3b          nTest++;
377f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62  .          if( b
37800 56 65 72 62 6f 73 65 20 29 7b 0a