/ Hex Artifact Content
Login

Artifact 248af8c0d785c98268353e58c96715313f3b091bf220d35366affc9a9c0d4e1d:


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 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
9030: 2c 20 6a 3b 0a 20 20 20 20 69 66 28 20 68 61 73  , j;.    if( has
9040: 43 52 4e 4c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  CRNL ){.      /*
9050: 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
9060: 20 63 6f 6e 74 61 69 6e 73 20 5c 72 5c 6e 20 74   contains \r\n t
9070: 68 65 6e 20 64 6f 20 6e 6f 20 63 6f 6e 76 65 72  hen do no conver
9080: 73 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 5c 6e  sions back to \n
9090: 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20 73 7a   */.      j = sz
90a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
90b0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
90c0: 65 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e  e did not origin
90d0: 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 20 5c 72 5c  ally contain \r\
90e0: 6e 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 61  n then convert a
90f0: 6e 79 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20  ny new.      ** 
9100: 5c 72 5c 6e 20 62 61 63 6b 20 69 6e 74 6f 20 5c  \r\n back into \
9110: 6e 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69  n */.      for(i
9120: 3d 6a 3d 30 3b 20 69 3c 73 7a 3b 20 69 2b 2b 29  =j=0; i<sz; i++)
9130: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 5b  {.        if( p[
9140: 69 5d 3d 3d 27 5c 72 27 20 26 26 20 70 5b 69 2b  i]=='\r' && p[i+
9150: 31 5d 3d 3d 27 5c 6e 27 20 29 20 69 2b 2b 3b 0a  1]=='\n' ) i++;.
9160: 20 20 20 20 20 20 20 20 70 5b 6a 2b 2b 5d 20 3d          p[j++] =
9170: 20 70 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   p[i];.      }. 
9180: 20 20 20 20 20 73 7a 20 3d 20 6a 3b 0a 20 20 20       sz = j;.   
9190: 20 20 20 70 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20     p[sz] = 0;.  
91a0: 20 20 7d 20 0a 20 20 20 20 73 71 6c 69 74 65 33    } .    sqlite3
91b0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 36 34 28 63  _result_text64(c
91c0: 6f 6e 74 65 78 74 2c 20 28 63 6f 6e 73 74 20 63  ontext, (const c
91d0: 68 61 72 2a 29 70 2c 20 73 7a 2c 0a 20 20 20 20  har*)p, sz,.    
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
9200: 65 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  ee, SQLITE_UTF8)
9210: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 30 3b 0a 0a  ;.  }.  p = 0;..
9220: 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3a 0a 20  edit_func_end:. 
9230: 20 69 66 28 20 66 20 29 20 66 63 6c 6f 73 65 28   if( f ) fclose(
9240: 66 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 54 65  f);.  unlink(zTe
9250: 6d 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74  mpFile);.  sqlit
9260: 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 46 69 6c  e3_free(zTempFil
9270: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
9280: 65 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ee(p);.}.#endif 
9290: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  /* SQLITE_NOHAVE
92a0: 5f 53 59 53 54 45 4d 20 2a 2f 0a 0a 2f 2a 0a 2a  _SYSTEM */../*.*
92b0: 2a 20 53 61 76 65 20 6f 72 20 72 65 73 74 6f 72  * Save or restor
92c0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 75  e the current ou
92d0: 74 70 75 74 20 6d 6f 64 65 0a 2a 2f 0a 73 74 61  tput mode.*/.sta
92e0: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 4d  tic void outputM
92f0: 6f 64 65 50 75 73 68 28 53 68 65 6c 6c 53 74 61  odePush(ShellSta
9300: 74 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64  te *p){.  p->mod
9310: 65 50 72 69 6f 72 20 3d 20 70 2d 3e 6d 6f 64 65  ePrior = p->mode
9320: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f  ;.  memcpy(p->co
9330: 6c 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e 63 6f  lSepPrior, p->co
9340: 6c 53 65 70 61 72 61 74 6f 72 2c 20 73 69 7a 65  lSeparator, size
9350: 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  of(p->colSeparat
9360: 6f 72 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  or));.  memcpy(p
9370: 2d 3e 72 6f 77 53 65 70 50 72 69 6f 72 2c 20 70  ->rowSepPrior, p
9380: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
9390: 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
93a0: 61 72 61 74 6f 72 29 29 3b 0a 7d 0a 73 74 61 74  arator));.}.stat
93b0: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f  ic void outputMo
93c0: 64 65 50 6f 70 28 53 68 65 6c 6c 53 74 61 74 65  dePop(ShellState
93d0: 20 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 20   *p){.  p->mode 
93e0: 3d 20 70 2d 3e 6d 6f 64 65 50 72 69 6f 72 3b 0a  = p->modePrior;.
93f0: 20 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53    memcpy(p->colS
9400: 65 70 61 72 61 74 6f 72 2c 20 70 2d 3e 63 6f 6c  eparator, p->col
9410: 53 65 70 50 72 69 6f 72 2c 20 73 69 7a 65 6f 66  SepPrior, sizeof
9420: 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
9430: 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e  ));.  memcpy(p->
9440: 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 70 2d  rowSeparator, p-
9450: 3e 72 6f 77 53 65 70 50 72 69 6f 72 2c 20 73 69  >rowSepPrior, si
9460: 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
9470: 61 74 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ator));.}../*.**
9480: 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   Output the give
9490: 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 68 65  n string as a he
94a0: 78 2d 65 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28  x-encoded blob (
94b0: 65 67 2e 20 58 27 31 32 33 34 27 20 29 0a 2a 2f  eg. X'1234' ).*/
94c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
94d0: 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c  put_hex_blob(FIL
94e0: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f  E *out, const vo
94f0: 69 64 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e  id *pBlob, int n
9500: 42 6c 6f 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Blob){.  int i;.
9510: 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20    char *zBlob = 
9520: 28 63 68 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20  (char *)pBlob;. 
9530: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
9540: 22 58 27 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  "X'");.  for(i=0
9550: 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b  ; i<nBlob; i++){
9560: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
9570: 22 25 30 32 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26  "%02x",zBlob[i]&
9580: 30 78 66 66 29 3b 20 7d 0a 20 20 72 61 77 5f 70  0xff); }.  raw_p
9590: 72 69 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a  rintf(out,"'");.
95a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
95b0: 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 6e  string that is n
95c0: 6f 74 20 66 6f 75 6e 64 20 61 6e 79 77 68 65 72  ot found anywher
95d0: 65 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72  e in z[].  Retur
95e0: 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
95f0: 6f 20 74 68 61 74 20 73 74 72 69 6e 67 2e 0a 2a  o that string..*
9600: 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 75 73 65 20  *.** Try to use 
9610: 7a 41 20 61 6e 64 20 7a 42 20 66 69 72 73 74 2e  zA and zB first.
9620: 20 20 49 66 20 62 6f 74 68 20 6f 66 20 74 68 6f    If both of tho
9630: 73 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 66  se are already f
9640: 6f 75 6e 64 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74  ound in z[].** t
9650: 68 65 6e 20 6d 61 6b 65 20 75 70 20 73 6f 6d 65  hen make up some
9660: 20 73 74 72 69 6e 67 20 61 6e 64 20 73 74 6f 72   string and stor
9670: 65 20 69 74 20 69 6e 20 74 68 65 20 62 75 66 66  e it in the buff
9680: 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er zBuf..*/.stat
9690: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
96a0: 6e 75 73 65 64 5f 73 74 72 69 6e 67 28 0a 20 20  nused_string(.  
96b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 20  const char *z,  
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96d0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6d 75 73 74    /* Result must
96e0: 20 6e 6f 74 20 61 70 70 65 61 72 20 61 6e 79 77   not appear anyw
96f0: 68 65 72 65 20 69 6e 20 7a 20 2a 2f 0a 20 20 63  here in z */.  c
9700: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 63  onst char *zA, c
9710: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 2c 20 20  onst char *zB,  
9720: 20 2f 2a 20 54 72 79 20 74 68 65 73 65 20 66 69   /* Try these fi
9730: 72 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  rst */.  char *z
9740: 42 75 66 20 20 20 20 20 20 20 20 20 20 20 20 20  Buf             
9750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
9760: 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 67  ace to store a g
9770: 65 6e 65 72 61 74 65 64 20 73 74 72 69 6e 67 20  enerated string 
9780: 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
9790: 20 69 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 74   i = 0;.  if( st
97a0: 72 73 74 72 28 7a 2c 20 7a 41 29 3d 3d 30 20 29  rstr(z, zA)==0 )
97b0: 20 72 65 74 75 72 6e 20 7a 41 3b 0a 20 20 69 66   return zA;.  if
97c0: 28 20 73 74 72 73 74 72 28 7a 2c 20 7a 42 29 3d  ( strstr(z, zB)=
97d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 42 3b 0a  =0 ) return zB;.
97e0: 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65    do{.    sqlite
97f0: 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 2c 7a 42  3_snprintf(20,zB
9800: 75 66 2c 22 28 25 73 25 75 29 22 2c 20 7a 41 2c  uf,"(%s%u)", zA,
9810: 20 69 2b 2b 29 3b 0a 20 20 7d 77 68 69 6c 65 28   i++);.  }while(
9820: 20 73 74 72 73 74 72 28 7a 2c 7a 42 75 66 29 21   strstr(z,zBuf)!
9830: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  =0 );.  return z
9840: 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75  Buf;.}../*.** Ou
9850: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73  tput the given s
9860: 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65  tring as a quote
9870: 64 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20 53  d string using S
9880: 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65  QL quoting conve
9890: 6e 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65  ntions..**.** Se
98a0: 65 20 61 6c 73 6f 3a 20 6f 75 74 70 75 74 5f 71  e also: output_q
98b0: 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74  uoted_escaped_st
98c0: 72 69 6e 67 28 29 0a 2a 2f 0a 73 74 61 74 69 63  ring().*/.static
98d0: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f   void output_quo
98e0: 74 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45 20  ted_string(FILE 
98f0: 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  *out, const char
9900: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
9910: 20 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42 69   char c;.  setBi
9920: 6e 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29  naryMode(out, 1)
9930: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20  ;.  for(i=0; (c 
9940: 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21  = z[i])!=0 && c!
9950: 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\''; i++){}.  
9960: 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
9970: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
9980: 22 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c  "'%s'",z);.  }el
9990: 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  se{.    raw_prin
99a0: 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20  tf(out, "'");.  
99b0: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
99c0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63       for(i=0; (c
99d0: 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63   = z[i])!=0 && c
99e0: 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20  !='\''; i++){}. 
99f0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27       if( c=='\''
9a00: 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66   ) i++;.      if
9a10: 28 20 69 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ( i ){.        u
9a20: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
9a30: 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20  "%.*s", i, z);. 
9a40: 20 20 20 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20         z += i;. 
9a50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9a60: 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20   c=='\'' ){.    
9a70: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
9a80: 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 20 20  ut, "'");.      
9a90: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
9aa0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
9ab0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  =0 ){.        br
9ac0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9ad0: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     z++;.    }.  
9ae0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
9af0: 2c 20 22 27 22 29 3b 0a 20 20 7d 0a 20 20 73 65  , "'");.  }.  se
9b00: 74 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31  tTextMode(out, 1
9b10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70  );.}../*.** Outp
9b20: 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  ut the given str
9b30: 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20  ing as a quoted 
9b40: 73 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c  string using SQL
9b50: 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74   quoting convent
9b60: 69 6f 6e 73 2e 0a 2a 2a 20 41 64 64 69 74 69 6f  ions..** Additio
9b70: 6e 61 6c 6c 6c 79 20 2c 20 65 73 63 61 70 65 20  nallly , escape 
9b80: 74 68 65 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72  the "\n" and "\r
9b90: 22 20 63 68 61 72 61 63 74 65 72 73 20 73 6f 20  " characters so 
9ba0: 74 68 61 74 20 74 68 65 79 20 64 6f 20 6e 6f 74  that they do not
9bb0: 0a 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74 65  .** get corrupte
9bc0: 64 20 62 79 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65  d by end-of-line
9bd0: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 66 61 63   translation fac
9be0: 69 6c 69 74 69 65 73 20 69 6e 20 73 6f 6d 65 20  ilities in some 
9bf0: 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73  operating.** sys
9c00: 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tems..**.** This
9c10: 20 69 73 20 6c 69 6b 65 20 6f 75 74 70 75 74 5f   is like output_
9c20: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 29 20  quoted_string() 
9c30: 62 75 74 20 77 69 74 68 20 74 68 65 20 61 64 64  but with the add
9c40: 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 5c 72 5c  ition of the \r\
9c50: 6e 0a 2a 2a 20 65 73 63 61 70 65 20 6d 65 63 68  n.** escape mech
9c60: 61 6e 69 73 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  anism..*/.static
9c70: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f   void output_quo
9c80: 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69  ted_escaped_stri
9c90: 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f  ng(FILE *out, co
9ca0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
9cb0: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b  int i;.  char c;
9cc0: 0a 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65  .  setBinaryMode
9cd0: 28 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28  (out, 1);.  for(
9ce0: 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  i=0; (c = z[i])!
9cf0: 3d 30 20 26 26 20 63 21 3d 27 5c 27 27 20 26 26  =0 && c!='\'' &&
9d00: 20 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27   c!='\n' && c!='
9d10: 5c 72 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66  \r'; i++){}.  if
9d20: 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74  ( c==0 ){.    ut
9d30: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27  f8_printf(out,"'
9d40: 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65  %s'",z);.  }else
9d50: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
9d60: 20 2a 7a 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 63   *zNL = 0;.    c
9d70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 52 20 3d  onst char *zCR =
9d80: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 4c 20   0;.    int nNL 
9d90: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 52  = 0;.    int nCR
9da0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 7a   = 0;.    char z
9db0: 42 75 66 31 5b 32 30 5d 2c 20 7a 42 75 66 32 5b  Buf1[20], zBuf2[
9dc0: 32 30 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  20];.    for(i=0
9dd0: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
9de0: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c      if( z[i]=='\
9df0: 6e 27 20 29 20 6e 4e 4c 2b 2b 3b 0a 20 20 20 20  n' ) nNL++;.    
9e00: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 72 27    if( z[i]=='\r'
9e10: 20 29 20 6e 43 52 2b 2b 3b 0a 20 20 20 20 7d 0a   ) nCR++;.    }.
9e20: 20 20 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20      if( nNL ){. 
9e30: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
9e40: 6f 75 74 2c 20 22 72 65 70 6c 61 63 65 28 22 29  out, "replace(")
9e50: 3b 0a 20 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e  ;.      zNL = un
9e60: 75 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22  used_string(z, "
9e70: 5c 5c 6e 22 2c 20 22 5c 5c 30 31 32 22 2c 20 7a  \\n", "\\012", z
9e80: 42 75 66 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Buf1);.    }.   
9e90: 20 69 66 28 20 6e 43 52 20 29 7b 0a 20 20 20 20   if( nCR ){.    
9ea0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
9eb0: 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20  , "replace(");. 
9ec0: 20 20 20 20 20 7a 43 52 20 3d 20 75 6e 75 73 65       zCR = unuse
9ed0: 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 72  d_string(z, "\\r
9ee0: 22 2c 20 22 5c 5c 30 31 35 22 2c 20 7a 42 75 66  ", "\\015", zBuf
9ef0: 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61  2);.    }.    ra
9f00: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27  w_printf(out, "'
9f10: 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  ");.    while( *
9f20: 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  z ){.      for(i
9f30: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
9f40: 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 26 26 20  0 && c!='\n' && 
9f50: 63 21 3d 27 5c 72 27 20 26 26 20 63 21 3d 27 5c  c!='\r' && c!='\
9f60: 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20  ''; i++){}.     
9f70: 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20 69   if( c=='\'' ) i
9f80: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 20  ++;.      if( i 
9f90: 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
9fa0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a  printf(out, "%.*
9fb0: 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20  s", i, z);.     
9fc0: 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20     z += i;.     
9fd0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
9fe0: 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\'' ){.        
9ff0: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
a000: 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  "'");.        co
a010: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
a020: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
a030: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
a040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
a050: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ++;.      if( c=
a060: 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\n' ){.       
a070: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a080: 20 22 25 73 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20   "%s", zNL);.   
a090: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
a0a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77       }.      raw
a0b0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
a0c0: 22 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20  ", zCR);.    }. 
a0d0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
a0e0: 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 69 66 28  t, "'");.    if(
a0f0: 20 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72 61   nCR ){.      ra
a100: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c  w_printf(out, ",
a110: 27 25 73 27 2c 63 68 61 72 28 31 33 29 29 22 2c  '%s',char(13))",
a120: 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20   zCR);.    }.   
a130: 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20   if( nNL ){.    
a140: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a150: 2c 20 22 2c 27 25 73 27 2c 63 68 61 72 28 31 30  , ",'%s',char(10
a160: 29 29 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d  ))", zNL);.    }
a170: 0a 20 20 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f  .  }.  setTextMo
a180: 64 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f  de(out, 1);.}../
a190: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
a1a0: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20  given string as 
a1b0: 61 20 71 75 6f 74 65 64 20 61 63 63 6f 72 64 69  a quoted accordi
a1c0: 6e 67 20 74 6f 20 43 20 6f 72 20 54 43 4c 20 71  ng to C or TCL q
a1d0: 75 6f 74 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f  uoting rules..*/
a1e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
a1f0: 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 46 49 4c  put_c_string(FIL
a200: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68  E *out, const ch
a210: 61 72 20 2a 7a 29 7b 0a 20 20 75 6e 73 69 67 6e  ar *z){.  unsign
a220: 65 64 20 69 6e 74 20 63 3b 0a 20 20 66 70 75 74  ed int c;.  fput
a230: 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 77  c('"', out);.  w
a240: 68 69 6c 65 28 20 28 63 20 3d 20 2a 28 7a 2b 2b  hile( (c = *(z++
a250: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ))!=0 ){.    if(
a260: 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20   c=='\\' ){.    
a270: 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b    fputc(c, out);
a280: 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20  .      fputc(c, 
a290: 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  out);.    }else 
a2a0: 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20  if( c=='"' ){.  
a2b0: 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20      fputc('\\', 
a2c0: 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74  out);.      fput
a2d0: 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20  c('"', out);.   
a2e0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c   }else if( c=='\
a2f0: 74 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74  t' ){.      fput
a300: 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20  c('\\', out);.  
a310: 20 20 20 20 66 70 75 74 63 28 27 74 27 2c 20 6f      fputc('t', o
a320: 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ut);.    }else i
a330: 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20  f( c=='\n' ){.  
a340: 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20      fputc('\\', 
a350: 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74  out);.      fput
a360: 63 28 27 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20  c('n', out);.   
a370: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c   }else if( c=='\
a380: 72 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74  r' ){.      fput
a390: 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20  c('\\', out);.  
a3a0: 20 20 20 20 66 70 75 74 63 28 27 72 27 2c 20 6f      fputc('r', o
a3b0: 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ut);.    }else i
a3c0: 66 28 20 21 69 73 70 72 69 6e 74 28 63 26 30 78  f( !isprint(c&0x
a3d0: 66 66 29 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ff) ){.      raw
a3e0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 5c  _printf(out, "\\
a3f0: 25 30 33 6f 22 2c 20 63 26 30 78 66 66 29 3b 0a  %03o", c&0xff);.
a400: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a410: 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a   fputc(c, out);.
a420: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 75 74      }.  }.  fput
a430: 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a  c('"', out);.}..
a440: 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65  /*.** Output the
a450: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 77 69   given string wi
a460: 74 68 20 63 68 61 72 61 63 74 65 72 73 20 74 68  th characters th
a470: 61 74 20 61 72 65 20 73 70 65 63 69 61 6c 20 74  at are special t
a480: 6f 0a 2a 2a 20 48 54 4d 4c 20 65 73 63 61 70 65  o.** HTML escape
a490: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
a4a0: 64 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74  d output_html_st
a4b0: 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20  ring(FILE *out, 
a4c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
a4d0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a    int i;.  if( z
a4e0: 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20  ==0 ) z = "";.  
a4f0: 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20  while( *z ){.   
a500: 20 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b 69 5d   for(i=0;   z[i]
a510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
a520: 7a 5b 69 5d 21 3d 27 3c 27 0a 20 20 20 20 20 20  z[i]!='<'.      
a530: 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27        && z[i]!='
a540: 26 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  &'.            &
a550: 26 20 7a 5b 69 5d 21 3d 27 3e 27 0a 20 20 20 20  & z[i]!='>'.    
a560: 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21          && z[i]!
a570: 3d 27 5c 22 27 0a 20 20 20 20 20 20 20 20 20 20  ='\"'.          
a580: 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b    && z[i]!='\'';
a590: 0a 20 20 20 20 20 20 20 20 69 2b 2b 29 7b 7d 0a  .        i++){}.
a5a0: 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20      if( i>0 ){. 
a5b0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
a5c0: 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29  (out,"%.*s",i,z)
a5d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a5e0: 7a 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20  z[i]=='<' ){.   
a5f0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
a600: 74 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d  t,"&lt;");.    }
a610: 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  else if( z[i]=='
a620: 26 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  &' ){.      raw_
a630: 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70  printf(out,"&amp
a640: 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ;");.    }else i
a650: 66 28 20 7a 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a  f( z[i]=='>' ){.
a660: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
a670: 28 6f 75 74 2c 22 26 67 74 3b 22 29 3b 0a 20 20  (out,"&gt;");.  
a680: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d    }else if( z[i]
a690: 3d 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20  =='\"' ){.      
a6a0: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
a6b0: 26 71 75 6f 74 3b 22 29 3b 0a 20 20 20 20 7d 65  &quot;");.    }e
a6c0: 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c  lse if( z[i]=='\
a6d0: 27 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  '' ){.      raw_
a6e0: 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 23 33 39  printf(out,"&#39
a6f0: 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ;");.    }else{.
a700: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a710: 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20   }.    z += i + 
a720: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
a730: 49 66 20 61 20 66 69 65 6c 64 20 63 6f 6e 74 61  If a field conta
a740: 69 6e 73 20 61 6e 79 20 63 68 61 72 61 63 74 65  ins any characte
a750: 72 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  r identified by 
a760: 61 20 31 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  a 1 in the follo
a770: 77 69 6e 67 0a 2a 2a 20 61 72 72 61 79 2c 20 74  wing.** array, t
a780: 68 65 6e 20 74 68 65 20 73 74 72 69 6e 67 20 6d  hen the string m
a790: 75 73 74 20 62 65 20 71 75 6f 74 65 64 20 66 6f  ust be quoted fo
a7a0: 72 20 43 53 56 2e 0a 2a 2f 0a 73 74 61 74 69 63  r CSV..*/.static
a7b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 65 65 64   const char need
a7c0: 43 73 76 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20  CsvQuote[] = {. 
a7d0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a7e0: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
a7f0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a800: 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,.  1, 1, 1, 1,
a810: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
a820: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a830: 20 31 2c 20 31 2c 0a 20 20 31 2c 20 30 2c 20 31   1, 1,.  1, 0, 1
a840: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c  , 0, 0, 0, 0, 1,
a850: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
a860: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
a870: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a880: 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,   0, 0, 0, 
a890: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
a8a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a8b0: 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c  0, 0, 0,   0, 0,
a8c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a8d0: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
a8e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30   0, 0, 0, 0,   0
a8f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a900: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
a910: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a920: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
a930: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
a940: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a950: 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,   0, 0, 0, 
a960: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 0a 20  0, 0, 0, 0, 1,. 
a970: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a980: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
a990: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a9a0: 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,.  1, 1, 1, 1,
a9b0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
a9c0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a9d0: 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31   1, 1,.  1, 1, 1
a9e0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a9f0: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
aa00: 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20  , 1, 1, 1,.  1, 
aa10: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
aa20: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
aa30: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20  1, 1, 1, 1, 1,. 
aa40: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
aa50: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
aa60: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
aa70: 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,.  1, 1, 1, 1,
aa80: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
aa90: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
aaa0: 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31   1, 1,.  1, 1, 1
aab0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
aac0: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
aad0: 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20  , 1, 1, 1,.  1, 
aae0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
aaf0: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
ab00: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 7d  1, 1, 1, 1, 1,.}
ab10: 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  ;../*.** Output 
ab20: 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  a single term of
ab30: 20 43 53 56 2e 20 20 41 63 74 75 61 6c 6c 79 2c   CSV.  Actually,
ab40: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
ab50: 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
ab60: 74 68 65 20 73 65 70 61 72 61 74 6f 72 2c 20 77  the separator, w
ab70: 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20  hich may or may 
ab80: 6e 6f 74 20 62 65 20 61 20 63 6f 6d 6d 61 2e 20  not be a comma. 
ab90: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 20 69 73   p->nullValue is
aba0: 0a 2a 2a 20 74 68 65 20 6e 75 6c 6c 20 76 61 6c  .** the null val
abb0: 75 65 2e 20 20 53 74 72 69 6e 67 73 20 61 72 65  ue.  Strings are
abc0: 20 71 75 6f 74 65 64 20 69 66 20 6e 65 63 65 73   quoted if neces
abd0: 73 61 72 79 2e 20 20 54 68 65 20 73 65 70 61 72  sary.  The separ
abe0: 61 74 6f 72 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  ator.** is only 
abf0: 69 73 73 75 65 64 20 69 66 20 62 53 65 70 20 69  issued if bSep i
ac00: 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69  s true..*/.stati
ac10: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 73  c void output_cs
ac20: 76 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  v(ShellState *p,
ac30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
ac40: 69 6e 74 20 62 53 65 70 29 7b 0a 20 20 46 49 4c  int bSep){.  FIL
ac50: 45 20 2a 6f 75 74 20 3d 20 70 2d 3e 6f 75 74 3b  E *out = p->out;
ac60: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20  .  if( z==0 ){. 
ac70: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
ac80: 75 74 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 56  ut,"%s",p->nullV
ac90: 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  alue);.  }else{.
aca0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
acb0: 6e 74 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e  nt nSep = strlen
acc0: 33 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  30(p->colSeparat
acd0: 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  or);.    for(i=0
ace0: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
acf0: 20 20 20 20 69 66 28 20 6e 65 65 64 43 73 76 51      if( needCsvQ
ad00: 75 6f 74 65 5b 28 28 75 6e 73 69 67 6e 65 64 20  uote[((unsigned 
ad10: 63 68 61 72 2a 29 7a 29 5b 69 5d 5d 0a 20 20 20  char*)z)[i]].   
ad20: 20 20 20 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d        || (z[i]==
ad30: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b  p->colSeparator[
ad40: 30 5d 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  0] &&.          
ad50: 20 20 20 28 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d     (nSep==1 || m
ad60: 65 6d 63 6d 70 28 7a 2c 20 70 2d 3e 63 6f 6c 53  emcmp(z, p->colS
ad70: 65 70 61 72 61 74 6f 72 2c 20 6e 53 65 70 29 3d  eparator, nSep)=
ad80: 3d 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  =0)) ){.        
ad90: 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62  i = 0;.        b
ada0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
adb0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 30    }.    if( i==0
adc0: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
add0: 7a 51 75 6f 74 65 64 20 3d 20 73 71 6c 69 74 65  zQuoted = sqlite
ade0: 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c  3_mprintf("\"%w\
adf0: 22 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 75 74  "", z);.      ut
ae00: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
ae10: 25 73 22 2c 20 7a 51 75 6f 74 65 64 29 3b 0a 20  %s", zQuoted);. 
ae20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
ae30: 65 28 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20  e(zQuoted);.    
ae40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66  }else{.      utf
ae50: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
ae60: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  s", z);.    }.  
ae70: 7d 0a 20 20 69 66 28 20 62 53 65 70 20 29 7b 0a  }.  if( bSep ){.
ae80: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
ae90: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
aea0: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
aeb0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
aec0: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 77  s routine runs w
aed0: 68 65 6e 20 74 68 65 20 75 73 65 72 20 70 72 65  hen the user pre
aee0: 73 73 65 73 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73  sses Ctrl-C.*/.s
aef0: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 74 65 72  tatic void inter
af00: 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 69 6e 74  rupt_handler(int
af10: 20 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55   NotUsed){.  UNU
af20: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
af30: 74 55 73 65 64 29 3b 0a 20 20 73 65 65 6e 49 6e  tUsed);.  seenIn
af40: 74 65 72 72 75 70 74 2b 2b 3b 0a 20 20 69 66 28  terrupt++;.  if(
af50: 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 3e 32   seenInterrupt>2
af60: 20 29 20 65 78 69 74 28 31 29 3b 0a 20 20 69 66   ) exit(1);.  if
af70: 28 20 67 6c 6f 62 61 6c 44 62 20 29 20 73 71 6c  ( globalDb ) sql
af80: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 67  ite3_interrupt(g
af90: 6c 6f 62 61 6c 44 62 29 3b 0a 7d 0a 0a 23 69 66  lobalDb);.}..#if
afa0: 20 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   (defined(_WIN32
afb0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
afc0: 33 32 29 29 20 26 26 20 21 64 65 66 69 6e 65 64  32)) && !defined
afd0: 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 0a  (_WIN32_WCE)./*.
afe0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
aff0: 72 75 6e 73 20 66 6f 72 20 63 6f 6e 73 6f 6c 65  runs for console
b000: 20 65 76 65 6e 74 73 20 28 65 2e 67 2e 20 43 74   events (e.g. Ct
b010: 72 6c 2d 43 29 20 6f 6e 20 57 69 6e 33 32 0a 2a  rl-C) on Win32.*
b020: 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 57 49  /.static BOOL WI
b030: 4e 41 50 49 20 43 6f 6e 73 6f 6c 65 43 74 72 6c  NAPI ConsoleCtrl
b040: 48 61 6e 64 6c 65 72 28 0a 20 20 44 57 4f 52 44  Handler(.  DWORD
b050: 20 64 77 43 74 72 6c 54 79 70 65 20 2f 2a 20 4f   dwCtrlType /* O
b060: 6e 65 20 6f 66 20 74 68 65 20 43 54 52 4c 5f 2a  ne of the CTRL_*
b070: 5f 45 56 45 4e 54 20 63 6f 6e 73 74 61 6e 74 73  _EVENT constants
b080: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 64 77 43   */.){.  if( dwC
b090: 74 72 6c 54 79 70 65 3d 3d 43 54 52 4c 5f 43 5f  trlType==CTRL_C_
b0a0: 45 56 45 4e 54 20 29 7b 0a 20 20 20 20 69 6e 74  EVENT ){.    int
b0b0: 65 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 30  errupt_handler(0
b0c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52  );.    return TR
b0d0: 55 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  UE;.  }.  return
b0e0: 20 46 41 4c 53 45 3b 0a 7d 0a 23 65 6e 64 69 66   FALSE;.}.#endif
b0f0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b100: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
b110: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  ION./*.** When t
b120: 68 65 20 22 2e 61 75 74 68 20 4f 4e 22 20 69 73  he ".auth ON" is
b130: 20 73 65 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77   set, the follow
b140: 69 6e 67 20 61 75 74 68 6f 72 69 7a 65 72 20 63  ing authorizer c
b150: 61 6c 6c 62 61 63 6b 20 69 73 0a 2a 2a 20 69 6e  allback is.** in
b160: 76 6f 6b 65 64 2e 20 20 49 74 20 61 6c 77 61 79  voked.  It alway
b170: 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  s returns SQLITE
b180: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
b190: 6e 74 20 73 68 65 6c 6c 41 75 74 68 28 0a 20 20  nt shellAuth(.  
b1a0: 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74  void *pClientDat
b1b0: 61 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63  a,.  int op,.  c
b1c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 31 2c 0a  onst char *zA1,.
b1d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
b1e0: 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2,.  const char 
b1f0: 2a 7a 41 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68  *zA3,.  const ch
b200: 61 72 20 2a 7a 41 34 0a 29 7b 0a 20 20 53 68 65  ar *zA4.){.  She
b210: 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68  llState *p = (Sh
b220: 65 6c 6c 53 74 61 74 65 2a 29 70 43 6c 69 65 6e  ellState*)pClien
b230: 74 44 61 74 61 3b 0a 20 20 73 74 61 74 69 63 20  tData;.  static 
b240: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 63  const char *azAc
b250: 74 69 6f 6e 5b 5d 20 3d 20 7b 20 30 2c 0a 20 20  tion[] = { 0,.  
b260: 20 20 20 22 43 52 45 41 54 45 5f 49 4e 44 45 58     "CREATE_INDEX
b270: 22 2c 20 20 20 20 20 20 20 20 20 22 43 52 45 41  ",         "CREA
b280: 54 45 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20  TE_TABLE",      
b290: 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f     "CREATE_TEMP_
b2a0: 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 43 52  INDEX",.     "CR
b2b0: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22  EATE_TEMP_TABLE"
b2c0: 2c 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d  ,    "CREATE_TEM
b2d0: 50 5f 54 52 49 47 47 45 52 22 2c 20 20 22 43 52  P_TRIGGER",  "CR
b2e0: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 2c  EATE_TEMP_VIEW",
b2f0: 0a 20 20 20 20 20 22 43 52 45 41 54 45 5f 54 52  .     "CREATE_TR
b300: 49 47 47 45 52 22 2c 20 20 20 20 20 20 20 22 43  IGGER",       "C
b310: 52 45 41 54 45 5f 56 49 45 57 22 2c 20 20 20 20  REATE_VIEW",    
b320: 20 20 20 20 20 20 22 44 45 4c 45 54 45 22 2c 0a        "DELETE",.
b330: 20 20 20 20 20 22 44 52 4f 50 5f 49 4e 44 45 58       "DROP_INDEX
b340: 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 44 52  ",           "DR
b350: 4f 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20  OP_TABLE",      
b360: 20 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f       "DROP_TEMP_
b370: 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 44 52  INDEX",.     "DR
b380: 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20  OP_TEMP_TABLE", 
b390: 20 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f       "DROP_TEMP_
b3a0: 54 52 49 47 47 45 52 22 2c 20 20 20 20 22 44 52  TRIGGER",    "DR
b3b0: 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20  OP_TEMP_VIEW",. 
b3c0: 20 20 20 20 22 44 52 4f 50 5f 54 52 49 47 47 45      "DROP_TRIGGE
b3d0: 52 22 2c 20 20 20 20 20 20 20 20 20 22 44 52 4f  R",         "DRO
b3e0: 50 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20 20  P_VIEW",        
b3f0: 20 20 20 20 22 49 4e 53 45 52 54 22 2c 0a 20 20      "INSERT",.  
b400: 20 20 20 22 50 52 41 47 4d 41 22 2c 20 20 20 20     "PRAGMA",    
b410: 20 20 20 20 20 20 20 20 20 20 20 22 52 45 41 44             "READ
b420: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
b430: 20 20 20 22 53 45 4c 45 43 54 22 2c 0a 20 20 20     "SELECT",.   
b440: 20 20 22 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c    "TRANSACTION",
b450: 20 20 20 20 20 20 20 20 20 20 22 55 50 44 41 54            "UPDAT
b460: 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  E",             
b470: 20 20 22 41 54 54 41 43 48 22 2c 0a 20 20 20 20    "ATTACH",.    
b480: 20 22 44 45 54 41 43 48 22 2c 20 20 20 20 20 20   "DETACH",      
b490: 20 20 20 20 20 20 20 20 20 22 41 4c 54 45 52 5f           "ALTER_
b4a0: 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20  TABLE",         
b4b0: 20 22 52 45 49 4e 44 45 58 22 2c 0a 20 20 20 20   "REINDEX",.    
b4c0: 20 22 41 4e 41 4c 59 5a 45 22 2c 20 20 20 20 20   "ANALYZE",     
b4d0: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
b4e0: 5f 56 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20  _VTABLE",       
b4f0: 20 22 44 52 4f 50 5f 56 54 41 42 4c 45 22 2c 0a   "DROP_VTABLE",.
b500: 20 20 20 20 20 22 46 55 4e 43 54 49 4f 4e 22 2c       "FUNCTION",
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 41               "SA
b520: 56 45 50 4f 49 4e 54 22 2c 20 20 20 20 20 20 20  VEPOINT",       
b530: 20 20 20 20 20 22 52 45 43 55 52 53 49 56 45 22       "RECURSIVE"
b540: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
b550: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b   const char *az[
b560: 34 5d 3b 0a 20 20 61 7a 5b 30 5d 20 3d 20 7a 41  4];.  az[0] = zA
b570: 31 3b 0a 20 20 61 7a 5b 31 5d 20 3d 20 7a 41 32  1;.  az[1] = zA2
b580: 3b 0a 20 20 61 7a 5b 32 5d 20 3d 20 7a 41 33 3b  ;.  az[2] = zA3;
b590: 0a 20 20 61 7a 5b 33 5d 20 3d 20 7a 41 34 3b 0a  .  az[3] = zA4;.
b5a0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
b5b0: 3e 6f 75 74 2c 20 22 61 75 74 68 6f 72 69 7a 65  >out, "authorize
b5c0: 72 3a 20 25 73 22 2c 20 61 7a 41 63 74 69 6f 6e  r: %s", azAction
b5d0: 5b 6f 70 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  [op]);.  for(i=0
b5e0: 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<4; i++){.   
b5f0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
b600: 75 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 69 66  ut, " ");.    if
b610: 28 20 61 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 20  ( az[i] ){.     
b620: 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
b630: 28 70 2d 3e 6f 75 74 2c 20 61 7a 5b 69 5d 29 3b  (p->out, az[i]);
b640: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b650: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
b660: 6f 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  out, "NULL");.  
b670: 20 20 7d 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72    }.  }.  raw_pr
b680: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
b690: 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ");.  return SQL
b6a0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
b6b0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  ../*.** Print a 
b6c0: 73 63 68 65 6d 61 20 73 74 61 74 65 6d 65 6e 74  schema statement
b6d0: 2e 20 20 50 61 72 74 20 6f 66 20 4d 4f 44 45 5f  .  Part of MODE_
b6e0: 53 65 6d 69 20 61 6e 64 20 4d 4f 44 45 5f 50 72  Semi and MODE_Pr
b6f0: 65 74 74 79 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a  etty output..**.
b700: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b710: 63 6f 6e 76 65 72 74 73 20 73 6f 6d 65 20 43 52  converts some CR
b720: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
b730: 6d 65 6e 74 73 20 66 6f 72 20 73 68 61 64 6f 77  ments for shadow
b740: 20 74 61 62 6c 65 73 0a 2a 2a 20 69 6e 20 46 54   tables.** in FT
b750: 53 33 2f 34 2f 35 20 69 6e 74 6f 20 43 52 45 41  S3/4/5 into CREA
b760: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
b770: 45 58 49 53 54 53 20 73 74 61 74 65 6d 65 6e 74  EXISTS statement
b780: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
b790: 64 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e  d printSchemaLin
b7a0: 65 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  e(FILE *out, con
b7b0: 73 74 20 63 68 61 72 20 2a 7a 2c 20 63 6f 6e 73  st char *z, cons
b7c0: 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a  t char *zTail){.
b7d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
b7e0: 72 67 6c 6f 62 28 22 43 52 45 41 54 45 20 54 41  rglob("CREATE TA
b7f0: 42 4c 45 20 5b 27 5c 22 5d 2a 22 2c 20 7a 29 3d  BLE ['\"]*", z)=
b800: 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
b810: 72 69 6e 74 66 28 6f 75 74 2c 20 22 43 52 45 41  rintf(out, "CREA
b820: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
b830: 45 58 49 53 54 53 20 25 73 25 73 22 2c 20 7a 2b  EXISTS %s%s", z+
b840: 31 33 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 65  13, zTail);.  }e
b850: 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  lse{.    utf8_pr
b860: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73 22  intf(out, "%s%s"
b870: 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d  , z, zTail);.  }
b880: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
b890: 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28  rintSchemaLineN(
b8a0: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 68 61 72 20  FILE *out, char 
b8b0: 2a 7a 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74  *z, int n, const
b8c0: 20 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20   char *zTail){. 
b8d0: 20 63 68 61 72 20 63 20 3d 20 7a 5b 6e 5d 3b 0a   char c = z[n];.
b8e0: 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 70 72    z[n] = 0;.  pr
b8f0: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 6f 75  intSchemaLine(ou
b900: 74 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20  t, z, zTail);.  
b910: 7a 5b 6e 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a  z[n] = c;.}../*.
b920: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
b930: 66 20 73 74 72 69 6e 67 20 7a 5b 5d 20 68 61 73  f string z[] has
b940: 20 6e 6f 74 68 69 6e 67 20 62 75 74 20 77 68 69   nothing but whi
b950: 74 65 73 70 61 63 65 20 61 6e 64 20 63 6f 6d 6d  tespace and comm
b960: 65 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65  ents to the.** e
b970: 6e 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  nd of the first 
b980: 6c 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  line..*/.static 
b990: 69 6e 74 20 77 73 54 6f 45 6f 6c 28 63 6f 6e 73  int wsToEol(cons
b9a0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
b9b0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
b9c0: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
b9d0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29  if( z[i]=='\n' )
b9e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
b9f0: 66 28 20 49 73 53 70 61 63 65 28 7a 5b 69 5d 29  f( IsSpace(z[i])
ba00: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
ba10: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2d 27 20 26   if( z[i]=='-' &
ba20: 26 20 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 20  & z[i+1]=='-' ) 
ba30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65  return 1;.    re
ba40: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
ba50: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
ba60: 20 41 64 64 20 61 20 6e 65 77 20 65 6e 74 72 79   Add a new entry
ba70: 20 74 6f 20 74 68 65 20 45 58 50 4c 41 49 4e 20   to the EXPLAIN 
ba80: 51 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61 0a  QUERY PLAN data.
ba90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
baa0: 71 70 5f 61 70 70 65 6e 64 28 53 68 65 6c 6c 53  qp_append(ShellS
bab0: 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 69 45 71  tate *p, int iEq
bac0: 70 49 64 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e  pId, int p2, con
bad0: 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29 7b  st char *zText){
bae0: 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a  .  EQPGraphRow *
baf0: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 54 65 78  pNew;.  int nTex
bb00: 74 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54 65  t = strlen30(zTe
bb10: 78 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 75  xt);.  if( p->au
bb20: 74 6f 45 51 50 74 65 73 74 20 29 7b 0a 20 20 20  toEQPtest ){.   
bb30: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
bb40: 6f 75 74 2c 20 22 25 64 2c 25 64 2c 25 73 5c 6e  out, "%d,%d,%s\n
bb50: 22 2c 20 69 45 71 70 49 64 2c 20 70 32 2c 20 7a  ", iEqpId, p2, z
bb60: 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20 70 4e 65  Text);.  }.  pNe
bb70: 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  w = sqlite3_mall
bb80: 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 4e  oc64( sizeof(*pN
bb90: 65 77 29 20 2b 20 6e 54 65 78 74 20 29 3b 0a 20  ew) + nText );. 
bba0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 73   if( pNew==0 ) s
bbb0: 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
bbc0: 72 79 28 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 45  ry();.  pNew->iE
bbd0: 71 70 49 64 20 3d 20 69 45 71 70 49 64 3b 0a 20  qpId = iEqpId;. 
bbe0: 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 49 64   pNew->iParentId
bbf0: 20 3d 20 70 32 3b 0a 20 20 6d 65 6d 63 70 79 28   = p2;.  memcpy(
bc00: 70 4e 65 77 2d 3e 7a 54 65 78 74 2c 20 7a 54 65  pNew->zText, zTe
bc10: 78 74 2c 20 6e 54 65 78 74 2b 31 29 3b 0a 20 20  xt, nText+1);.  
bc20: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  pNew->pNext = 0;
bc30: 0a 20 20 69 66 28 20 70 2d 3e 73 47 72 61 70 68  .  if( p->sGraph
bc40: 2e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d  .pLast ){.    p-
bc50: 3e 73 47 72 61 70 68 2e 70 4c 61 73 74 2d 3e 70  >sGraph.pLast->p
bc60: 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  Next = pNew;.  }
bc70: 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 73 47 72  else{.    p->sGr
bc80: 61 70 68 2e 70 52 6f 77 20 3d 20 70 4e 65 77 3b  aph.pRow = pNew;
bc90: 0a 20 20 7d 0a 20 20 70 2d 3e 73 47 72 61 70 68  .  }.  p->sGraph
bca0: 2e 70 4c 61 73 74 20 3d 20 70 4e 65 77 3b 0a 7d  .pLast = pNew;.}
bcb0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 64  ../*.** Free and
bcc0: 20 72 65 73 65 74 20 74 68 65 20 45 58 50 4c 41   reset the EXPLA
bcd0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 64 61  IN QUERY PLAN da
bce0: 74 61 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  ta that has been
bcf0: 20 63 6f 6c 6c 65 63 74 65 64 0a 2a 2a 20 69 6e   collected.** in
bd00: 20 70 2d 3e 73 47 72 61 70 68 2e 0a 2a 2f 0a 73   p->sGraph..*/.s
bd10: 74 61 74 69 63 20 76 6f 69 64 20 65 71 70 5f 72  tatic void eqp_r
bd20: 65 73 65 74 28 53 68 65 6c 6c 53 74 61 74 65 20  eset(ShellState 
bd30: 2a 70 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52  *p){.  EQPGraphR
bd40: 6f 77 20 2a 70 52 6f 77 2c 20 2a 70 4e 65 78 74  ow *pRow, *pNext
bd50: 3b 0a 20 20 66 6f 72 28 70 52 6f 77 20 3d 20 70  ;.  for(pRow = p
bd60: 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 3b 20 70  ->sGraph.pRow; p
bd70: 52 6f 77 3b 20 70 52 6f 77 20 3d 20 70 4e 65 78  Row; pRow = pNex
bd80: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
bd90: 70 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pRow->pNext;.   
bda0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52   sqlite3_free(pR
bdb0: 6f 77 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  ow);.  }.  memse
bdc0: 74 28 26 70 2d 3e 73 47 72 61 70 68 2c 20 30 2c  t(&p->sGraph, 0,
bdd0: 20 73 69 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70   sizeof(p->sGrap
bde0: 68 29 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  h));.}../* Retur
bdf0: 6e 20 74 68 65 20 6e 65 78 74 20 45 58 50 4c 41  n the next EXPLA
be00: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 6c 69  IN QUERY PLAN li
be10: 6e 65 20 77 69 74 68 20 69 45 71 70 49 64 20 74  ne with iEqpId t
be20: 68 61 74 20 6f 63 63 75 72 73 20 61 66 74 65 72  hat occurs after
be30: 0a 2a 2a 20 70 4f 6c 64 2c 20 6f 72 20 72 65 74  .** pOld, or ret
be40: 75 72 6e 20 74 68 65 20 66 69 72 73 74 20 73 75  urn the first su
be50: 63 68 20 6c 69 6e 65 20 69 66 20 70 4f 6c 64 20  ch line if pOld 
be60: 69 73 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69  is NULL.*/.stati
be70: 63 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 65  c EQPGraphRow *e
be80: 71 70 5f 6e 65 78 74 5f 72 6f 77 28 53 68 65 6c  qp_next_row(Shel
be90: 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 69  lState *p, int i
bea0: 45 71 70 49 64 2c 20 45 51 50 47 72 61 70 68 52  EqpId, EQPGraphR
beb0: 6f 77 20 2a 70 4f 6c 64 29 7b 0a 20 20 45 51 50  ow *pOld){.  EQP
bec0: 47 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d  GraphRow *pRow =
bed0: 20 70 4f 6c 64 20 3f 20 70 4f 6c 64 2d 3e 70 4e   pOld ? pOld->pN
bee0: 65 78 74 20 3a 20 70 2d 3e 73 47 72 61 70 68 2e  ext : p->sGraph.
bef0: 70 52 6f 77 3b 0a 20 20 77 68 69 6c 65 28 20 70  pRow;.  while( p
bf00: 52 6f 77 20 26 26 20 70 52 6f 77 2d 3e 69 50 61  Row && pRow->iPa
bf10: 72 65 6e 74 49 64 21 3d 69 45 71 70 49 64 20 29  rentId!=iEqpId )
bf20: 20 70 52 6f 77 20 3d 20 70 52 6f 77 2d 3e 70 4e   pRow = pRow->pN
bf30: 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ext;.  return pR
bf40: 6f 77 3b 0a 7d 0a 0a 2f 2a 20 52 65 6e 64 65 72  ow;.}../* Render
bf50: 20 61 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   a single level 
bf60: 6f 66 20 74 68 65 20 67 72 61 70 68 20 74 68 61  of the graph tha
bf70: 74 20 68 61 73 20 69 45 71 70 49 64 20 61 73 20  t has iEqpId as 
bf80: 69 74 73 20 70 61 72 65 6e 74 2e 20 20 43 61 6c  its parent.  Cal
bf90: 6c 65 64 0a 2a 2a 20 72 65 63 75 72 73 69 76 65  led.** recursive
bfa0: 6c 79 20 74 6f 20 72 65 6e 64 65 72 20 73 75 62  ly to render sub
bfb0: 6c 65 76 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69  levels..*/.stati
bfc0: 63 20 76 6f 69 64 20 65 71 70 5f 72 65 6e 64 65  c void eqp_rende
bfd0: 72 5f 6c 65 76 65 6c 28 53 68 65 6c 6c 53 74 61  r_level(ShellSta
bfe0: 74 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70 49  te *p, int iEqpI
bff0: 64 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f  d){.  EQPGraphRo
c000: 77 20 2a 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b  w *pRow, *pNext;
c010: 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65  .  int n = strle
c020: 6e 33 30 28 70 2d 3e 73 47 72 61 70 68 2e 7a 50  n30(p->sGraph.zP
c030: 72 65 66 69 78 29 3b 0a 20 20 63 68 61 72 20 2a  refix);.  char *
c040: 7a 3b 0a 20 20 66 6f 72 28 70 52 6f 77 20 3d 20  z;.  for(pRow = 
c050: 65 71 70 5f 6e 65 78 74 5f 72 6f 77 28 70 2c 20  eqp_next_row(p, 
c060: 69 45 71 70 49 64 2c 20 30 29 3b 20 70 52 6f 77  iEqpId, 0); pRow
c070: 3b 20 70 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b  ; pRow = pNext){
c080: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 65 71 70  .    pNext = eqp
c090: 5f 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69 45 71  _next_row(p, iEq
c0a0: 70 49 64 2c 20 70 52 6f 77 29 3b 0a 20 20 20 20  pId, pRow);.    
c0b0: 7a 20 3d 20 70 52 6f 77 2d 3e 7a 54 65 78 74 3b  z = pRow->zText;
c0c0: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
c0d0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 25 73 25 73  (p->out, "%s%s%s
c0e0: 5c 6e 22 2c 20 70 2d 3e 73 47 72 61 70 68 2e 7a  \n", p->sGraph.z
c0f0: 50 72 65 66 69 78 2c 20 70 4e 65 78 74 20 3f 20  Prefix, pNext ? 
c100: 22 7c 2d 2d 22 20 3a 20 22 60 2d 2d 22 2c 20 7a  "|--" : "`--", z
c110: 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 28 69 6e  );.    if( n<(in
c120: 74 29 73 69 7a 65 6f 66 28 70 2d 3e 73 47 72 61  t)sizeof(p->sGra
c130: 70 68 2e 7a 50 72 65 66 69 78 29 2d 37 20 29 7b  ph.zPrefix)-7 ){
c140: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
c150: 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78  ->sGraph.zPrefix
c160: 5b 6e 5d 2c 20 70 4e 65 78 74 20 3f 20 22 7c 20  [n], pNext ? "| 
c170: 20 22 20 3a 20 22 20 20 20 22 2c 20 34 29 3b 0a   " : "   ", 4);.
c180: 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72        eqp_render
c190: 5f 6c 65 76 65 6c 28 70 2c 20 70 52 6f 77 2d 3e  _level(p, pRow->
c1a0: 69 45 71 70 49 64 29 3b 0a 20 20 20 20 20 20 70  iEqpId);.      p
c1b0: 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78  ->sGraph.zPrefix
c1c0: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [n] = 0;.    }. 
c1d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70   }.}../*.** Disp
c1e0: 6c 61 79 20 61 6e 64 20 72 65 73 65 74 20 74 68  lay and reset th
c1f0: 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  e EXPLAIN QUERY 
c200: 50 4c 41 4e 20 64 61 74 61 0a 2a 2f 0a 73 74 61  PLAN data.*/.sta
c210: 74 69 63 20 76 6f 69 64 20 65 71 70 5f 72 65 6e  tic void eqp_ren
c220: 64 65 72 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  der(ShellState *
c230: 70 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f  p){.  EQPGraphRo
c240: 77 20 2a 70 52 6f 77 20 3d 20 70 2d 3e 73 47 72  w *pRow = p->sGr
c250: 61 70 68 2e 70 52 6f 77 3b 0a 20 20 69 66 28 20  aph.pRow;.  if( 
c260: 70 52 6f 77 20 29 7b 0a 20 20 20 20 69 66 28 20  pRow ){.    if( 
c270: 70 52 6f 77 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d  pRow->zText[0]==
c280: 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '-' ){.      if(
c290: 20 70 52 6f 77 2d 3e 70 4e 65 78 74 3d 3d 30 20   pRow->pNext==0 
c2a0: 29 7b 0a 20 20 20 20 20 20 20 20 65 71 70 5f 72  ){.        eqp_r
c2b0: 65 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20 20  eset(p);.       
c2c0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
c2d0: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
c2e0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  tf(p->out, "%s\n
c2f0: 22 2c 20 70 52 6f 77 2d 3e 7a 54 65 78 74 2b 33  ", pRow->zText+3
c300: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73 47 72 61  );.      p->sGra
c310: 70 68 2e 70 52 6f 77 20 3d 20 70 52 6f 77 2d 3e  ph.pRow = pRow->
c320: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
c330: 69 74 65 33 5f 66 72 65 65 28 70 52 6f 77 29 3b  ite3_free(pRow);
c340: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c350: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
c360: 3e 6f 75 74 2c 20 22 51 55 45 52 59 20 50 4c 41  >out, "QUERY PLA
c370: 4e 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  N\n");.    }.   
c380: 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66   p->sGraph.zPref
c390: 69 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 65  ix[0] = 0;.    e
c3a0: 71 70 5f 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28  qp_render_level(
c3b0: 70 2c 20 30 29 3b 0a 20 20 20 20 65 71 70 5f 72  p, 0);.    eqp_r
c3c0: 65 73 65 74 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  eset(p);.  }.}..
c3d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
c3e0: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
c3f0: 6e 65 20 74 68 61 74 20 74 68 65 20 73 68 65 6c  ne that the shel
c400: 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72  l.** invokes for
c410: 20 65 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71   each row of a q
c420: 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a  uery result..*/.
c430: 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c  static int shell
c440: 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69  _callback(.  voi
c450: 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 6e  d *pArg,.  int n
c460: 41 72 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Arg,        /* N
c470: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
c480: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63 68 61  columns */.  cha
c490: 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 2f 2a  r **azArg,    /*
c4a0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 72 65   Text of each re
c4b0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  sult column */. 
c4c0: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c 20 20   char **azCol,  
c4d0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
c4e0: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 54 79  s */.  int *aiTy
c4f0: 70 65 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  pe      /* Colum
c500: 6e 20 74 79 70 65 73 20 2a 2f 0a 29 7b 0a 20 20  n types */.){.  
c510: 69 6e 74 20 69 3b 0a 20 20 53 68 65 6c 6c 53 74  int i;.  ShellSt
c520: 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53  ate *p = (ShellS
c530: 74 61 74 65 2a 29 70 41 72 67 3b 0a 0a 20 20 69  tate*)pArg;..  i
c540: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65  f( azArg==0 ) re
c550: 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68  turn 0;.  switch
c560: 28 20 70 2d 3e 63 4d 6f 64 65 20 29 7b 0a 20 20  ( p->cMode ){.  
c570: 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69 6e 65    case MODE_Line
c580: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 20  : {.      int w 
c590: 3d 20 35 3b 0a 20 20 20 20 20 20 69 66 28 20 61  = 5;.      if( a
c5a0: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
c5b0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
c5c0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
c5d0: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
c5e0: 73 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69  strlen30(azCol[i
c5f0: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
c600: 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
c610: 6c 65 6e 3e 77 20 29 20 77 20 3d 20 6c 65 6e 3b  len>w ) w = len;
c620: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
c630: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20  f( p->cnt++>0 ) 
c640: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
c650: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
c660: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
c670: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
c680: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
c690: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
c6a0: 6f 75 74 2c 22 25 2a 73 20 3d 20 25 73 25 73 22  out,"%*s = %s%s"
c6b0: 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 0a 20  , w, azCol[i],. 
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
c6d0: 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b  zArg[i] ? azArg[
c6e0: 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75  i] : p->nullValu
c6f0: 65 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  e, p->rowSeparat
c700: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
c710: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c720: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 45 78      case MODE_Ex
c730: 70 6c 61 69 6e 3a 0a 20 20 20 20 63 61 73 65 20  plain:.    case 
c740: 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20  MODE_Column: {. 
c750: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
c760: 74 20 69 6e 74 20 61 45 78 70 6c 61 69 6e 57 69  t int aExplainWi
c770: 64 74 68 73 5b 5d 20 3d 20 7b 34 2c 20 31 33 2c  dths[] = {4, 13,
c780: 20 34 2c 20 34 2c 20 34 2c 20 31 33 2c 20 32 2c   4, 4, 4, 13, 2,
c790: 20 31 33 7d 3b 0a 20 20 20 20 20 20 63 6f 6e 73   13};.      cons
c7a0: 74 20 69 6e 74 20 2a 63 6f 6c 57 69 64 74 68 3b  t int *colWidth;
c7b0: 0a 20 20 20 20 20 20 69 6e 74 20 73 68 6f 77 48  .      int showH
c7c0: 64 72 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  dr;.      char *
c7d0: 72 6f 77 53 65 70 3b 0a 20 20 20 20 20 20 69 66  rowSep;.      if
c7e0: 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45  ( p->cMode==MODE
c7f0: 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
c800: 20 20 20 63 6f 6c 57 69 64 74 68 20 3d 20 70 2d     colWidth = p-
c810: 3e 63 6f 6c 57 69 64 74 68 3b 0a 20 20 20 20 20  >colWidth;.     
c820: 20 20 20 73 68 6f 77 48 64 72 20 3d 20 70 2d 3e     showHdr = p->
c830: 73 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20  showHeader;.    
c840: 20 20 20 20 72 6f 77 53 65 70 20 3d 20 70 2d 3e      rowSep = p->
c850: 72 6f 77 53 65 70 61 72 61 74 6f 72 3b 0a 20 20  rowSeparator;.  
c860: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c870: 20 20 20 63 6f 6c 57 69 64 74 68 20 3d 20 61 45     colWidth = aE
c880: 78 70 6c 61 69 6e 57 69 64 74 68 73 3b 0a 20 20  xplainWidths;.  
c890: 20 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d 20        showHdr = 
c8a0: 31 3b 0a 20 20 20 20 20 20 20 20 72 6f 77 53 65  1;.        rowSe
c8b0: 70 20 3d 20 53 45 50 5f 52 6f 77 3b 0a 20 20 20  p = SEP_Row;.   
c8c0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
c8d0: 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20  ->cnt++==0 ){.  
c8e0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
c8f0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
c900: 20 20 20 20 20 20 20 69 6e 74 20 77 2c 20 6e 3b         int w, n;
c910: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
c920: 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f  <ArraySize(p->co
c930: 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20  lWidth) ){.     
c940: 20 20 20 20 20 20 20 77 20 3d 20 63 6f 6c 57 69         w = colWi
c950: 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  dth[i];.        
c960: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c970: 20 20 20 20 20 77 20 3d 20 30 3b 0a 20 20 20 20       w = 0;.    
c980: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c990: 20 20 69 66 28 20 77 3d 3d 30 20 29 7b 0a 20 20    if( w==0 ){.  
c9a0: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 73 74            w = st
c9b0: 72 6c 65 6e 43 68 61 72 28 61 7a 43 6f 6c 5b 69  rlenChar(azCol[i
c9c0: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
c9d0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
c9e0: 69 66 28 20 77 3c 31 30 20 29 20 77 20 3d 20 31  if( w<10 ) w = 1
c9f0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  0;.            n
ca00: 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a   = strlenChar(az
ca10: 41 72 67 20 26 26 20 61 7a 41 72 67 5b 69 5d 20  Arg && azArg[i] 
ca20: 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e  ? azArg[i] : p->
ca30: 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20  nullValue);.    
ca40: 20 20 20 20 20 20 20 20 69 66 28 20 77 3c 6e 20          if( w<n 
ca50: 29 20 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  ) w = n;.       
ca60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
ca70: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
ca80: 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29  ->actualWidth) )
ca90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
caa0: 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 20  >actualWidth[i] 
cab0: 3d 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = w;.          }
cac0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
cad0: 68 6f 77 48 64 72 20 29 7b 0a 20 20 20 20 20 20  howHdr ){.      
cae0: 20 20 20 20 20 20 75 74 66 38 5f 77 69 64 74 68        utf8_width
caf0: 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20 77  _print(p->out, w
cb00: 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  , azCol[i]);.   
cb10: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
cb20: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
cb30: 22 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72  ", i==nArg-1 ? r
cb40: 6f 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20  owSep : "  ");. 
cb50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
cb60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
cb70: 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20 20 20   showHdr ){.    
cb80: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
cb90: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
cba0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a           int w;.
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
cbc0: 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61  i<ArraySize(p->a
cbd0: 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20  ctualWidth) ){. 
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 20                w 
cbf0: 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  = p->actualWidth
cc00: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
cc10: 20 20 20 20 69 66 28 20 77 3c 30 20 29 20 77 20      if( w<0 ) w 
cc20: 3d 20 2d 77 3b 0a 20 20 20 20 20 20 20 20 20 20  = -w;.          
cc30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cc40: 20 20 20 20 20 20 20 20 77 20 3d 20 31 30 3b 0a          w = 10;.
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
cc60: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
cc70: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2d  rintf(p->out,"%-
cc80: 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 0a 20 20 20  *.*s%s",w,w,.   
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cca0: 22 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20 20 20  -----------".   
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccf0: 22 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20  -----------",.  
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd40: 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f    i==nArg-1 ? ro
cd50: 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20  wSep : "  ");.  
cd60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cd70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
cd80: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
cd90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f   break;.      fo
cda0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
cdb0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
cdc0: 20 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   w;.        if( 
cdd0: 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61  i<ArraySize(p->a
cde0: 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20  ctualWidth) ){. 
cdf0: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d            w = p-
ce00: 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b  >actualWidth[i];
ce10: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
ce20: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 31             w = 1
ce30: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
ce40: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64       if( p->cMod
ce50: 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  e==MODE_Explain 
ce60: 26 26 20 61 7a 41 72 67 5b 69 5d 20 26 26 20 73  && azArg[i] && s
ce70: 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 5b  trlenChar(azArg[
ce80: 69 5d 29 3e 77 20 29 7b 0a 20 20 20 20 20 20 20  i])>w ){.       
ce90: 20 20 20 77 20 3d 20 73 74 72 6c 65 6e 43 68 61     w = strlenCha
cea0: 72 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  r(azArg[i]);.   
ceb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
cec0: 66 28 20 69 3d 3d 31 20 26 26 20 70 2d 3e 61 69  f( i==1 && p->ai
ced0: 49 6e 64 65 6e 74 20 26 26 20 70 2d 3e 70 53 74  Indent && p->pSt
cee0: 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
cef0: 69 66 28 20 70 2d 3e 69 49 6e 64 65 6e 74 3c 70  if( p->iIndent<p
cf00: 2d 3e 6e 49 6e 64 65 6e 74 20 29 7b 0a 20 20 20  ->nIndent ){.   
cf10: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
cf20: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2a  intf(p->out, "%*
cf30: 2e 73 22 2c 20 70 2d 3e 61 69 49 6e 64 65 6e 74  .s", p->aiIndent
cf40: 5b 70 2d 3e 69 49 6e 64 65 6e 74 5d 2c 20 22 22  [p->iIndent], ""
cf50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
cf60: 20 20 20 20 20 20 20 20 20 70 2d 3e 69 49 6e 64           p->iInd
cf70: 65 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  ent++;.        }
cf80: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 77 69  .        utf8_wi
cf90: 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74  dth_print(p->out
cfa0: 2c 20 77 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20  , w, azArg[i] ? 
cfb0: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
cfc0: 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
cfd0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
cfe0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e  >out, "%s", i==n
cff0: 41 72 67 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a  Arg-1 ? rowSep :
d000: 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a   "  ");.      }.
d010: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d020: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
d030: 5f 53 65 6d 69 3a 20 7b 20 20 20 2f 2a 20 2e 73  _Semi: {   /* .s
d040: 63 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73  chema and .fulls
d050: 63 68 65 6d 61 20 6f 75 74 70 75 74 20 2a 2f 0a  chema output */.
d060: 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d        printSchem
d070: 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 61 7a  aLine(p->out, az
d080: 41 72 67 5b 30 5d 2c 20 22 3b 5c 6e 22 29 3b 0a  Arg[0], ";\n");.
d090: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d0a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
d0b0: 5f 50 72 65 74 74 79 3a 20 7b 20 20 2f 2a 20 2e  _Pretty: {  /* .
d0c0: 73 63 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c  schema and .full
d0d0: 73 63 68 65 6d 61 20 77 69 74 68 20 2d 2d 69 6e  schema with --in
d0e0: 64 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 63 68  dent */.      ch
d0f0: 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69 6e 74  ar *z;.      int
d100: 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   j;.      int nP
d110: 61 72 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  aren = 0;.      
d120: 63 68 61 72 20 63 45 6e 64 20 3d 20 30 3b 0a 20  char cEnd = 0;. 
d130: 20 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20       char c;.   
d140: 20 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 30     int nLine = 0
d150: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d160: 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20  nArg==1 );.     
d170: 20 69 66 28 20 61 7a 41 72 67 5b 30 5d 3d 3d 30   if( azArg[0]==0
d180: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
d190: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c  if( sqlite3_strl
d1a0: 69 6b 65 28 22 43 52 45 41 54 45 20 56 49 45 57  ike("CREATE VIEW
d1b0: 25 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29  %", azArg[0], 0)
d1c0: 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71  ==0.       || sq
d1d0: 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 43  lite3_strlike("C
d1e0: 52 45 41 54 45 20 54 52 49 47 25 22 2c 20 61 7a  REATE TRIG%", az
d1f0: 41 72 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a 20 20  Arg[0], 0)==0.  
d200: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 75      ){.        u
d210: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
d220: 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 61 7a 41 72  t, "%s;\n", azAr
d230: 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 62  g[0]);.        b
d240: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
d250: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
d260: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a  mprintf("%s", az
d270: 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 6a  Arg[0]);.      j
d280: 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
d290: 69 3d 30 3b 20 49 73 53 70 61 63 65 28 7a 5b 69  i=0; IsSpace(z[i
d2a0: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20  ]); i++){}.     
d2b0: 20 66 6f 72 28 3b 20 28 63 20 3d 20 7a 5b 69 5d   for(; (c = z[i]
d2c0: 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
d2d0: 20 20 20 20 69 66 28 20 49 73 53 70 61 63 65 28      if( IsSpace(
d2e0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
d2f0: 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 5c 72 27  if( z[j-1]=='\r'
d300: 20 29 20 7a 5b 6a 2d 31 5d 20 3d 20 27 5c 6e 27   ) z[j-1] = '\n'
d310: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d320: 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20  IsSpace(z[j-1]) 
d330: 7c 7c 20 7a 5b 6a 2d 31 5d 3d 3d 27 28 27 20 29  || z[j-1]=='(' )
d340: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
d350: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d     }else if( (c=
d360: 3d 27 28 27 20 7c 7c 20 63 3d 3d 27 29 27 29 20  ='(' || c==')') 
d370: 26 26 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63  && j>0 && IsSpac
d380: 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 0a 20 20 20  e(z[j-1]) ){.   
d390: 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20         j--;.    
d3a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b      }.        z[
d3b0: 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20  j++] = c;.      
d3c0: 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a  }.      while( j
d3d0: 3e 30 20 26 26 20 49 73 53 70 61 63 65 28 7a 5b  >0 && IsSpace(z[
d3e0: 6a 2d 31 5d 29 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  j-1]) ){ j--; }.
d3f0: 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a        z[j] = 0;.
d400: 20 20 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e        if( strlen
d410: 33 30 28 7a 29 3e 3d 37 39 20 29 7b 0a 20 20 20  30(z)>=79 ){.   
d420: 20 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20       for(i=j=0; 
d430: 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69  (c = z[i])!=0; i
d440: 2b 2b 29 7b 20 20 2f 2a 20 43 6f 70 79 20 63 68  ++){  /* Copy ch
d450: 61 6e 67 65 73 20 66 72 6f 6d 20 7a 5b 69 5d 20  anges from z[i] 
d460: 62 61 63 6b 20 74 6f 20 7a 5b 6a 5d 20 2a 2f 0a  back to z[j] */.
d470: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
d480: 3d 63 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  =cEnd ){.       
d490: 20 20 20 20 20 63 45 6e 64 20 3d 20 30 3b 0a 20       cEnd = 0;. 
d4a0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
d4b0: 66 28 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d  f( c=='"' || c==
d4c0: 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 60 27 20 29  '\'' || c=='`' )
d4d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 45  {.            cE
d4e0: 6e 64 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  nd = c;.        
d4f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
d500: 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  [' ){.          
d510: 20 20 63 45 6e 64 20 3d 20 27 5d 27 3b 0a 20 20    cEnd = ']';.  
d520: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
d530: 28 20 63 3d 3d 27 2d 27 20 26 26 20 7a 5b 69 2b  ( c=='-' && z[i+
d540: 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  1]=='-' ){.     
d550: 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5c         cEnd = '\
d560: 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  n';.          }e
d570: 6c 73 65 20 69 66 28 20 63 3d 3d 27 28 27 20 29  lse if( c=='(' )
d580: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 50  {.            nP
d590: 61 72 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  aren++;.        
d5a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
d5b0: 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )' ){.          
d5c0: 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a 20 20 20 20    nParen--;.    
d5d0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 4c 69 6e          if( nLin
d5e0: 65 3e 30 20 26 26 20 6e 50 61 72 65 6e 3d 3d 30  e>0 && nParen==0
d5f0: 20 26 26 20 6a 3e 30 20 29 7b 0a 20 20 20 20 20   && j>0 ){.     
d600: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 53 63           printSc
d610: 68 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74  hemaLineN(p->out
d620: 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 22 29 3b 0a 20  , z, j, "\n");. 
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 20 3d               j =
d640: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
d650: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
d660: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
d670: 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   c;.          if
d680: 28 20 6e 50 61 72 65 6e 3d 3d 31 20 26 26 20 63  ( nParen==1 && c
d690: 45 6e 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  End==0.         
d6a0: 20 20 26 26 20 28 63 3d 3d 27 28 27 20 7c 7c 20    && (c=='(' || 
d6b0: 63 3d 3d 27 5c 6e 27 20 7c 7c 20 28 63 3d 3d 27  c=='\n' || (c=='
d6c0: 2c 27 20 26 26 20 21 77 73 54 6f 45 6f 6c 28 7a  ,' && !wsToEol(z
d6d0: 2b 69 2b 31 29 29 29 0a 20 20 20 20 20 20 20 20  +i+1))).        
d6e0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
d6f0: 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6a   if( c=='\n' ) j
d700: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  --;.            
d710: 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e  printSchemaLineN
d720: 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22  (p->out, z, j, "
d730: 5c 6e 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20  \n  ");.        
d740: 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20      j = 0;.     
d750: 20 20 20 20 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a         nLine++;.
d760: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c              whil
d770: 65 28 20 49 73 53 70 61 63 65 28 7a 5b 69 2b 31  e( IsSpace(z[i+1
d780: 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ i++; }.   
d790: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d7a0: 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 5d 20   }.        z[j] 
d7b0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
d7c0: 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69     printSchemaLi
d7d0: 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 22 3b  ne(p->out, z, ";
d7e0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  \n");.      sqli
d7f0: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20  te3_free(z);.   
d800: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d810: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69      case MODE_Li
d820: 73 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  st: {.      if( 
d830: 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70  p->cnt++==0 && p
d840: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
d850: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
d860: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
d870: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
d880: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25  intf(p->out,"%s%
d890: 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20  s",azCol[i],.   
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
d8b0: 3d 3d 6e 41 72 67 2d 31 20 3f 20 70 2d 3e 72 6f  ==nArg-1 ? p->ro
d8c0: 77 53 65 70 61 72 61 74 6f 72 20 3a 20 70 2d 3e  wSeparator : p->
d8d0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
d8e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d8f0: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
d900: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
d910: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
d920: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
d930: 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72    char *z = azAr
d940: 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  g[i];.        if
d950: 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 2d 3e  ( z==0 ) z = p->
d960: 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20 20 20 20 20  nullValue;.     
d970: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
d980: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  ->out, "%s", z);
d990: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e  .        if( i<n
d9a0: 41 72 67 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  Arg-1 ){.       
d9b0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
d9c0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
d9d0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
d9e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
d9f0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
da00: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
da10: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
da20: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
da30: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
da40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
da50: 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a 20 7b 0a 20  e MODE_Html: {. 
da60: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
da70: 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48  +==0 && p->showH
da80: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
da90: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
daa0: 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20  ut,"<TR>");.    
dab0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
dac0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
dad0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
dae0: 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22 29 3b 0a  p->out,"<TH>");.
daf0: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
db00: 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e  _html_string(p->
db10: 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  out, azCol[i]);.
db20: 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
db30: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54  intf(p->out,"</T
db40: 48 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  H>\n");.        
db50: 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  }.        raw_pr
db60: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54  intf(p->out,"</T
db70: 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  R>\n");.      }.
db80: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
db90: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
dba0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
dbb0: 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20  out,"<TR>");.   
dbc0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
dbd0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
dbe0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
dbf0: 6f 75 74 2c 22 3c 54 44 3e 22 29 3b 0a 20 20 20  out,"<TD>");.   
dc00: 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c       output_html
dc10: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
dc20: 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67  azArg[i] ? azArg
dc30: 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c  [i] : p->nullVal
dc40: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77  ue);.        raw
dc50: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
dc60: 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TD>\n");.     
dc70: 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69   }.      raw_pri
dc80: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52  ntf(p->out,"</TR
dc90: 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  >\n");.      bre
dca0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
dcb0: 73 65 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20  se MODE_Tcl: {. 
dcc0: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
dcd0: 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48  +==0 && p->showH
dce0: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
dcf0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
dd00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
dd10: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
dd20: 67 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69  g(p->out,azCol[i
dd30: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
dd40: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ");.          if
dd50: 28 69 3c 6e 41 72 67 2d 31 29 20 75 74 66 38 5f  (i<nArg-1) utf8_
dd60: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
dd70: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
dd80: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ator);.        }
dd90: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
dda0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
ddb0: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
ddc0: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
ddd0: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
dde0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
ddf0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
de00: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6f 75  i++){.        ou
de10: 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d  tput_c_string(p-
de20: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f  >out, azArg[i] ?
de30: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
de40: 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullValue);.     
de50: 20 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20     if(i<nArg-1) 
de60: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
de70: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c  ut, "%s", p->col
de80: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
de90: 20 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70    }.      utf8_p
dea0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
deb0: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
dec0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tor);.      brea
ded0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
dee0: 65 20 4d 4f 44 45 5f 43 73 76 3a 20 7b 0a 20 20  e MODE_Csv: {.  
def0: 20 20 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64      setBinaryMod
df00: 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20  e(p->out, 1);.  
df10: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
df20: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
df30: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
df40: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
df50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
df60: 20 6f 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61   output_csv(p, a
df70: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
df80: 69 5d 20 3a 20 22 22 2c 20 69 3c 6e 41 72 67 2d  i] : "", i<nArg-
df90: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
dfa0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
dfb0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
dfc0: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
dfd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
dfe0: 69 66 28 20 6e 41 72 67 3e 30 20 29 7b 0a 20 20  if( nArg>0 ){.  
dff0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e000: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
e010: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73         output_cs
e020: 76 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 69  v(p, azArg[i], i
e030: 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20  <nArg-1);.      
e040: 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38    }.        utf8
e050: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e060: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
e070: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
e080: 20 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64        setTextMod
e090: 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20  e(p->out, 1);.  
e0a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e0b0: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 49  .    case MODE_I
e0c0: 6e 73 65 72 74 3a 20 7b 0a 20 20 20 20 20 20 69  nsert: {.      i
e0d0: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
e0e0: 65 61 6b 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  eak;.      utf8_
e0f0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 49  printf(p->out,"I
e100: 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 22 2c 70  NSERT INTO %s",p
e110: 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20  ->zDestTable);. 
e120: 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 6f 77       if( p->show
e130: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
e140: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
e150: 6f 75 74 2c 22 28 22 29 3b 0a 20 20 20 20 20 20  out,"(");.      
e160: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
e170: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
e180: 20 20 20 69 66 28 20 69 3e 30 20 29 20 72 61 77     if( i>0 ) raw
e190: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e1a0: 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",");.          
e1b0: 69 66 28 20 71 75 6f 74 65 43 68 61 72 28 61 7a  if( quoteChar(az
e1c0: 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  Col[i]) ){.     
e1d0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d         char *z =
e1e0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
e1f0: 28 22 5c 22 25 77 5c 22 22 2c 20 61 7a 43 6f 6c  ("\"%w\"", azCol
e200: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
e210: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
e220: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  >out, "%s", z);.
e230: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e240: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20  te3_free(z);.   
e250: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e260: 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
e270: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
e280: 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  ", azCol[i]);.  
e290: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e2a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f    }.        raw_
e2b0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29  printf(p->out,")
e2c0: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
e2d0: 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20    p->cnt++;.    
e2e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
e2f0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
e300: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e310: 75 74 2c 20 69 3e 30 20 3f 20 22 2c 22 20 3a 20  ut, i>0 ? "," : 
e320: 22 20 56 41 4c 55 45 53 28 22 29 3b 0a 20 20 20  " VALUES(");.   
e330: 20 20 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b       if( (azArg[
e340: 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70  i]==0) || (aiTyp
e350: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
e360: 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a  SQLITE_NULL) ){.
e370: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
e380: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55  rintf(p->out,"NU
e390: 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  LL");.        }e
e3a0: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
e3b0: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
e3c0: 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
e3d0: 20 20 20 20 20 20 69 66 28 20 53 68 65 6c 6c 48        if( ShellH
e3e0: 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  asFlag(p, SHFLG_
e3f0: 4e 65 77 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20  Newlines) ){.   
e400: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
e410: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d  quoted_string(p-
e420: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  >out, azArg[i]);
e430: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
e440: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 75  {.            ou
e450: 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61  tput_quoted_esca
e460: 70 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  ped_string(p->ou
e470: 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  t, azArg[i]);.  
e480: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e490: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
e4a0: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
e4b0: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
e4c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
e4d0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e4e0: 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  "%s", azArg[i]);
e4f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
e500: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
e510: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46  ype[i]==SQLITE_F
e520: 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
e530: 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20    char z[50];.  
e540: 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72          double r
e550: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
e560: 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d  n_double(p->pStm
e570: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
e580: 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20   sqlite3_uint64 
e590: 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  ur;.          me
e5a0: 6d 63 70 79 28 26 75 72 2c 26 72 2c 73 69 7a 65  mcpy(&ur,&r,size
e5b0: 6f 66 28 72 29 29 3b 0a 20 20 20 20 20 20 20 20  of(r));.        
e5c0: 20 20 69 66 28 20 75 72 3d 3d 30 78 37 66 66 30    if( ur==0x7ff0
e5d0: 30 30 30 30 30 30 30 30 30 30 30 30 4c 4c 20 29  000000000000LL )
e5e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61  {.            ra
e5f0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e600: 20 22 31 65 39 39 39 22 29 3b 0a 20 20 20 20 20   "1e999");.     
e610: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75       }else if( u
e620: 72 3d 3d 30 78 66 66 66 30 30 30 30 30 30 30 30  r==0xfff00000000
e630: 30 30 30 30 30 4c 4c 20 29 7b 0a 20 20 20 20 20  00000LL ){.     
e640: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
e650: 66 28 70 2d 3e 6f 75 74 2c 20 22 2d 31 65 39 39  f(p->out, "-1e99
e660: 39 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  9");.          }
e670: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
e680: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
e690: 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22  tf(50,z,"%!.20g"
e6a0: 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , r);.          
e6b0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
e6c0: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
e6d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e6e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54     }else if( aiT
e6f0: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
e700: 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26  ==SQLITE_BLOB &&
e710: 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20   p->pStmt ){.   
e720: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69         const voi
e730: 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74  d *pBlob = sqlit
e740: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
e750: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
e760: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62         int nBlob
e770: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
e780: 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74  n_bytes(p->pStmt
e790: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
e7a0: 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28  output_hex_blob(
e7b0: 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e  p->out, pBlob, n
e7c0: 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  Blob);.        }
e7d0: 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d 62 65  else if( isNumbe
e7e0: 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29  r(azArg[i], 0) )
e7f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
e800: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e810: 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  %s", azArg[i]);.
e820: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
e830: 28 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70  ( ShellHasFlag(p
e840: 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73  , SHFLG_Newlines
e850: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  ) ){.          o
e860: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
e870: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
e880: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
e890: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
e8a0: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73  output_quoted_es
e8b0: 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  caped_string(p->
e8c0: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
e8d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e8e0: 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  }.      raw_prin
e8f0: 74 66 28 70 2d 3e 6f 75 74 2c 22 29 3b 5c 6e 22  tf(p->out,");\n"
e900: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e910: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
e920: 4f 44 45 5f 51 75 6f 74 65 3a 20 7b 0a 20 20 20  ODE_Quote: {.   
e930: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
e940: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
e950: 66 28 20 70 2d 3e 63 6e 74 3d 3d 30 20 26 26 20  f( p->cnt==0 && 
e960: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
e970: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
e980: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
e990: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
e9a0: 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  0 ) raw_printf(p
e9b0: 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20  ->out, ",");.   
e9c0: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75         output_qu
e9d0: 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  oted_string(p->o
e9e0: 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20  ut, azCol[i]);. 
e9f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ea00: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
ea10: 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ut,"\n");.      
ea20: 7d 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b  }.      p->cnt++
ea30: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
ea40: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
ea50: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
ea60: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
ea70: 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
ea80: 20 20 69 66 28 20 28 61 7a 41 72 67 5b 69 5d 3d    if( (azArg[i]=
ea90: 3d 30 29 20 7c 7c 20 28 61 69 54 79 70 65 20 26  =0) || (aiType &
eaa0: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
eab0: 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  ITE_NULL) ){.   
eac0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
ead0: 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22  tf(p->out,"NULL"
eae0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
eaf0: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61   if( aiType && a
eb00: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
eb10: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  _TEXT ){.       
eb20: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
eb30: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
eb40: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
eb50: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54     }else if( aiT
eb60: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
eb70: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
eb80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
eb90: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
eba0: 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29  ,"%s", azArg[i])
ebb0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
ebc0: 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69  if( aiType && ai
ebd0: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
ebe0: 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
ebf0: 20 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20     char z[50];. 
ec00: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
ec10: 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r = sqlite3_colu
ec20: 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74  mn_double(p->pSt
ec30: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
ec40: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
ec50: 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22  tf(50,z,"%!.20g"
ec60: 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , r);.          
ec70: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
ec80: 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  t, "%s", z);.   
ec90: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
eca0: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
ecb0: 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  i]==SQLITE_BLOB 
ecc0: 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  && p->pStmt ){. 
ecd0: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76           const v
ece0: 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c  oid *pBlob = sql
ecf0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
ed00: 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20  (p->pStmt, i);. 
ed10: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c           int nBl
ed20: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ob = sqlite3_col
ed30: 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74  umn_bytes(p->pSt
ed40: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
ed50: 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f    output_hex_blo
ed60: 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c  b(p->out, pBlob,
ed70: 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20   nBlob);.       
ed80: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d   }else if( isNum
ed90: 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29  ber(azArg[i], 0)
eda0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
edb0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
edc0: 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29  ,"%s", azArg[i])
edd0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
ede0: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
edf0: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
ee00: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
ee10: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
ee20: 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70     }.      raw_p
ee30: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e  rintf(p->out,"\n
ee40: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
ee50: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ee60: 4d 4f 44 45 5f 41 73 63 69 69 3a 20 7b 0a 20 20  MODE_Ascii: {.  
ee70: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
ee80: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
ee90: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
eea0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
eeb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
eec0: 20 69 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f   if( i>0 ) utf8_
eed0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
eee0: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
eef0: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ator);.         
ef00: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
ef10: 6f 75 74 2c 22 25 73 22 2c 61 7a 43 6f 6c 5b 69  out,"%s",azCol[i
ef20: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
ef30: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
ef40: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
ef50: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
ef60: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
ef70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ef80: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
ef90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
efa0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
efb0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
efc0: 3e 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66  >0 ) utf8_printf
efd0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
efe0: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
eff0: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
f000: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22  intf(p->out,"%s"
f010: 2c 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72  ,azArg[i] ? azAr
f020: 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61  g[i] : p->nullVa
f030: 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lue);.      }.  
f040: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
f050: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
f060: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
f070: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f080: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
f090: 5f 45 51 50 3a 20 7b 0a 20 20 20 20 20 20 65 71  _EQP: {.      eq
f0a0: 70 5f 61 70 70 65 6e 64 28 70 2c 20 61 74 6f 69  p_append(p, atoi
f0b0: 28 61 7a 41 72 67 5b 30 5d 29 2c 20 61 74 6f 69  (azArg[0]), atoi
f0c0: 28 61 7a 41 72 67 5b 31 5d 29 2c 20 61 7a 41 72  (azArg[1]), azAr
f0d0: 67 5b 33 5d 29 3b 0a 20 20 20 20 20 20 62 72 65  g[3]);.      bre
f0e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
f0f0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
f100: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63  ** This is the c
f110: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
f120: 74 68 61 74 20 74 68 65 20 53 51 4c 69 74 65 20  that the SQLite 
f130: 6c 69 62 72 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b  library.** invok
f140: 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  es for each row 
f150: 6f 66 20 61 20 71 75 65 72 79 20 72 65 73 75 6c  of a query resul
f160: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
f170: 20 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a   callback(void *
f180: 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20  pArg, int nArg, 
f190: 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68  char **azArg, ch
f1a0: 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 2f  ar **azCol){.  /
f1b0: 2a 20 73 69 6e 63 65 20 77 65 20 64 6f 6e 27 74  * since we don't
f1c0: 20 68 61 76 65 20 74 79 70 65 20 69 6e 66 6f 2c   have type info,
f1d0: 20 63 61 6c 6c 20 74 68 65 20 73 68 65 6c 6c 5f   call the shell_
f1e0: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 61 20  callback with a 
f1f0: 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20  NULL value */.  
f200: 72 65 74 75 72 6e 20 73 68 65 6c 6c 5f 63 61 6c  return shell_cal
f210: 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 41 72 67  lback(pArg, nArg
f220: 2c 20 61 7a 41 72 67 2c 20 61 7a 43 6f 6c 2c 20  , azArg, azCol, 
f230: 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  NULL);.}../*.** 
f240: 54 68 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c  This is the call
f250: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 66 72 6f  back routine fro
f260: 6d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  m sqlite3_exec()
f270: 20 74 68 61 74 20 61 70 70 65 6e 64 73 20 61 6c   that appends al
f280: 6c 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 6e 74 6f  l.** output onto
f290: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 53 68   the end of a Sh
f2a0: 65 6c 6c 54 65 78 74 20 6f 62 6a 65 63 74 2e 0a  ellText object..
f2b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
f2c0: 70 74 75 72 65 4f 75 74 70 75 74 43 61 6c 6c 62  ptureOutputCallb
f2d0: 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ack(void *pArg, 
f2e0: 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a  int nArg, char *
f2f0: 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  *azArg, char **a
f300: 7a 29 7b 0a 20 20 53 68 65 6c 6c 54 65 78 74 20  z){.  ShellText 
f310: 2a 70 20 3d 20 28 53 68 65 6c 6c 54 65 78 74 2a  *p = (ShellText*
f320: 29 70 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a  )pArg;.  int i;.
f330: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
f340: 45 52 28 61 7a 29 3b 0a 20 20 69 66 28 20 61 7a  ER(az);.  if( az
f350: 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Arg==0 ) return 
f360: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 20 29 20  0;.  if( p->n ) 
f370: 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20 22 7c  appendText(p, "|
f380: 22 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ", 0);.  for(i=0
f390: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
f3a0: 20 20 20 20 69 66 28 20 69 20 29 20 61 70 70 65      if( i ) appe
f3b0: 6e 64 54 65 78 74 28 70 2c 20 22 2c 22 2c 20 30  ndText(p, ",", 0
f3c0: 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 41 72 67  );.    if( azArg
f3d0: 5b 69 5d 20 29 20 61 70 70 65 6e 64 54 65 78 74  [i] ) appendText
f3e0: 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 30 29  (p, azArg[i], 0)
f3f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
f400: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
f410: 61 74 65 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ate an appropria
f420: 74 65 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c  te SELFTEST tabl
f430: 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  e in the main da
f440: 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
f450: 63 20 76 6f 69 64 20 63 72 65 61 74 65 53 65 6c  c void createSel
f460: 66 74 65 73 74 54 61 62 6c 65 28 53 68 65 6c 6c  ftestTable(Shell
f470: 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 63 68 61  State *p){.  cha
f480: 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
f490: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
f4a0: 2d 3e 64 62 2c 0a 20 20 20 20 22 53 41 56 45 50  ->db,.    "SAVEP
f4b0: 4f 49 4e 54 20 73 65 6c 66 74 65 73 74 5f 69 6e  OINT selftest_in
f4c0: 69 74 3b 5c 6e 22 0a 20 20 20 20 22 43 52 45 41  it;\n".    "CREA
f4d0: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
f4e0: 45 58 49 53 54 53 20 73 65 6c 66 74 65 73 74 28  EXISTS selftest(
f4f0: 5c 6e 22 0a 20 20 20 20 22 20 20 74 6e 6f 20 49  \n".    "  tno I
f500: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
f510: 45 59 2c 5c 6e 22 20 20 20 2f 2a 20 54 65 73 74  EY,\n"   /* Test
f520: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 22   number */.    "
f530: 20 20 6f 70 20 54 45 58 54 2c 5c 6e 22 20 20 20    op TEXT,\n"   
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f550: 2f 2a 20 4f 70 65 72 61 74 6f 72 3a 20 20 6d 65  /* Operator:  me
f560: 6d 6f 20 72 75 6e 20 2a 2f 0a 20 20 20 20 22 20  mo run */.    " 
f570: 20 63 6d 64 20 54 45 58 54 2c 5c 6e 22 20 20 20   cmd TEXT,\n"   
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f590: 2a 20 43 6f 6d 6d 61 6e 64 20 74 65 78 74 20 2a  * Command text *
f5a0: 2f 0a 20 20 20 20 22 20 20 61 6e 73 20 54 45 58  /.    "  ans TEX
f5b0: 54 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  T\n"            
f5c0: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65         /* Desire
f5d0: 64 20 61 6e 73 77 65 72 20 2a 2f 0a 20 20 20 20  d answer */.    
f5e0: 22 29 3b 22 0a 20 20 20 20 22 43 52 45 41 54 45  ");".    "CREATE
f5f0: 20 54 45 4d 50 20 54 41 42 4c 45 20 5b 5f 73 68   TEMP TABLE [_sh
f600: 65 6c 6c 24 73 65 6c 66 5d 28 6f 70 2c 63 6d 64  ell$self](op,cmd
f610: 2c 61 6e 73 29 3b 5c 6e 22 0a 20 20 20 20 22 49  ,ans);\n".    "I
f620: 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65  NSERT INTO [_she
f630: 6c 6c 24 73 65 6c 66 5d 28 72 6f 77 69 64 2c 6f  ll$self](rowid,o
f640: 70 2c 63 6d 64 29 5c 6e 22 0a 20 20 20 20 22 20  p,cmd)\n".    " 
f650: 20 56 41 4c 55 45 53 28 63 6f 61 6c 65 73 63 65   VALUES(coalesce
f660: 28 28 53 45 4c 45 43 54 20 28 6d 61 78 28 74 6e  ((SELECT (max(tn
f670: 6f 29 2b 31 30 30 29 2f 31 30 20 46 52 4f 4d 20  o)+100)/10 FROM 
f680: 73 65 6c 66 74 65 73 74 29 2c 31 30 29 2c 5c 6e  selftest),10),\n
f690: 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20  ".    "         
f6a0: 27 6d 65 6d 6f 27 2c 27 54 65 73 74 73 20 67 65  'memo','Tests ge
f6b0: 6e 65 72 61 74 65 64 20 62 79 20 2d 2d 69 6e 69  nerated by --ini
f6c0: 74 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53  t');\n".    "INS
f6d0: 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c  ERT INTO [_shell
f6e0: 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20  $self]\n".    " 
f6f0: 20 53 45 4c 45 43 54 20 27 72 75 6e 27 2c 5c 6e   SELECT 'run',\n
f700: 22 0a 20 20 20 20 22 20 20 20 20 27 53 45 4c 45  ".    "    'SELE
f710: 43 54 20 68 65 78 28 73 68 61 33 5f 71 75 65 72  CT hex(sha3_quer
f720: 79 28 27 27 53 45 4c 45 43 54 20 74 79 70 65 2c  y(''SELECT type,
f730: 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71  name,tbl_name,sq
f740: 6c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  l ".            
f750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f760: 20 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74       "FROM sqlit
f770: 65 5f 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42  e_master ORDER B
f780: 59 20 32 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22  Y 2'',224))',\n"
f790: 0a 20 20 20 20 22 20 20 20 20 68 65 78 28 73 68  .    "    hex(sh
f7a0: 61 33 5f 71 75 65 72 79 28 27 53 45 4c 45 43 54  a3_query('SELECT
f7b0: 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e   type,name,tbl_n
f7c0: 61 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20  ame,sql ".      
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7e0: 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65      "FROM sqlite
f7f0: 5f 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42 59  _master ORDER BY
f800: 20 32 27 2c 32 32 34 29 29 3b 5c 6e 22 0a 20 20   2',224));\n".  
f810: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b    "INSERT INTO [
f820: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a  _shell$self]\n".
f830: 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 27 72      "  SELECT 'r
f840: 75 6e 27 2c 22 0a 20 20 20 20 22 20 20 20 20 27  un',".    "    '
f850: 53 45 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f  SELECT hex(sha3_
f860: 71 75 65 72 79 28 27 27 53 45 4c 45 43 54 20 2a  query(''SELECT *
f870: 20 46 52 4f 4d 20 5c 22 27 20 7c 7c 22 0a 20 20   FROM \"' ||".  
f880: 20 20 22 20 20 20 20 20 20 20 20 70 72 69 6e 74    "        print
f890: 66 28 27 25 77 27 2c 6e 61 6d 65 29 20 7c 7c 20  f('%w',name) || 
f8a0: 27 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 27  '\" NOT INDEXED'
f8b0: 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20 20 20  ',224))',\n".   
f8c0: 20 22 20 20 20 20 68 65 78 28 73 68 61 33 5f 71   "    hex(sha3_q
f8d0: 75 65 72 79 28 70 72 69 6e 74 66 28 27 53 45 4c  uery(printf('SEL
f8e0: 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c  ECT * FROM \"%w\
f8f0: 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 27 2c 6e  " NOT INDEXED',n
f900: 61 6d 65 29 2c 32 32 34 29 29 5c 6e 22 0a 20 20  ame),224))\n".  
f910: 20 20 22 20 20 46 52 4f 4d 20 28 5c 6e 22 0a 20    "  FROM (\n". 
f920: 20 20 20 22 20 20 20 20 53 45 4c 45 43 54 20 6e     "    SELECT n
f930: 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
f940: 6d 61 73 74 65 72 5c 6e 22 0a 20 20 20 20 22 20  master\n".    " 
f950: 20 20 20 20 57 48 45 52 45 20 74 79 70 65 3d 27      WHERE type='
f960: 74 61 62 6c 65 27 5c 6e 22 0a 20 20 20 20 22 20  table'\n".    " 
f970: 20 20 20 20 20 20 41 4e 44 20 6e 61 6d 65 3c 3e        AND name<>
f980: 27 73 65 6c 66 74 65 73 74 27 5c 6e 22 0a 20 20  'selftest'\n".  
f990: 20 20 22 20 20 20 20 20 20 20 41 4e 44 20 63 6f    "       AND co
f9a0: 61 6c 65 73 63 65 28 72 6f 6f 74 70 61 67 65 2c  alesce(rootpage,
f9b0: 30 29 3e 30 5c 6e 22 0a 20 20 20 20 22 20 20 29  0)>0\n".    "  )
f9c0: 5c 6e 22 0a 20 20 20 20 22 20 4f 52 44 45 52 20  \n".    " ORDER 
f9d0: 42 59 20 6e 61 6d 65 3b 5c 6e 22 0a 20 20 20 20  BY name;\n".    
f9e0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73  "INSERT INTO [_s
f9f0: 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20  hell$self]\n".  
fa00: 20 20 22 20 20 56 41 4c 55 45 53 28 27 72 75 6e    "  VALUES('run
fa10: 27 2c 27 50 52 41 47 4d 41 20 69 6e 74 65 67 72  ','PRAGMA integr
fa20: 69 74 79 5f 63 68 65 63 6b 27 2c 27 6f 6b 27 29  ity_check','ok')
fa30: 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54  ;\n".    "INSERT
fa40: 20 49 4e 54 4f 20 73 65 6c 66 74 65 73 74 28 74   INTO selftest(t
fa50: 6e 6f 2c 6f 70 2c 63 6d 64 2c 61 6e 73 29 22 0a  no,op,cmd,ans)".
fa60: 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 72 6f      "  SELECT ro
fa70: 77 69 64 2a 31 30 2c 6f 70 2c 63 6d 64 2c 61 6e  wid*10,op,cmd,an
fa80: 73 20 46 52 4f 4d 20 5b 5f 73 68 65 6c 6c 24 73  s FROM [_shell$s
fa90: 65 6c 66 5d 3b 5c 6e 22 0a 20 20 20 20 22 44 52  elf];\n".    "DR
faa0: 4f 50 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c  OP TABLE [_shell
fab0: 24 73 65 6c 66 5d 3b 22 0a 20 20 20 20 2c 30 2c  $self];".    ,0,
fac0: 30 2c 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  0,&zErrMsg);.  i
fad0: 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
fae0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
faf0: 64 65 72 72 2c 20 22 53 45 4c 46 54 45 53 54 20  derr, "SELFTEST 
fb00: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66  initialization f
fb10: 61 69 6c 75 72 65 3a 20 25 73 5c 6e 22 2c 20 7a  ailure: %s\n", z
fb20: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  ErrMsg);.    sql
fb30: 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
fb40: 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
fb50: 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52  3_exec(p->db, "R
fb60: 45 4c 45 41 53 45 20 73 65 6c 66 74 65 73 74 5f  ELEASE selftest_
fb70: 69 6e 69 74 22 2c 30 2c 30 2c 30 29 3b 0a 7d 0a  init",0,0,0);.}.
fb80: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
fb90: 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c  destination tabl
fba0: 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 53  e field of the S
fbb0: 68 65 6c 6c 53 74 61 74 65 20 73 74 72 75 63 74  hellState struct
fbc0: 75 72 65 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  ure to.** the na
fbd0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
fbe0: 67 69 76 65 6e 2e 20 20 45 73 63 61 70 65 20 61  given.  Escape a
fbf0: 6e 79 20 71 75 6f 74 65 20 63 68 61 72 61 63 74  ny quote charact
fc00: 65 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61  ers in the.** ta
fc10: 62 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ble name..*/.sta
fc20: 74 69 63 20 76 6f 69 64 20 73 65 74 5f 74 61 62  tic void set_tab
fc30: 6c 65 5f 6e 61 6d 65 28 53 68 65 6c 6c 53 74 61  le_name(ShellSta
fc40: 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  te *p, const cha
fc50: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
fc60: 20 69 2c 20 6e 3b 0a 20 20 63 68 61 72 20 63 51   i, n;.  char cQ
fc70: 75 6f 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  uote;.  char *z;
fc80: 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 44 65 73 74  ..  if( p->zDest
fc90: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 72 65  Table ){.    fre
fca0: 65 28 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29  e(p->zDestTable)
fcb0: 3b 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61  ;.    p->zDestTa
fcc0: 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ble = 0;.  }.  i
fcd0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
fce0: 74 75 72 6e 3b 0a 20 20 63 51 75 6f 74 65 20 3d  turn;.  cQuote =
fcf0: 20 71 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65   quoteChar(zName
fd00: 29 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33  );.  n = strlen3
fd10: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  0(zName);.  if( 
fd20: 63 51 75 6f 74 65 20 29 20 6e 20 2b 3d 20 6e 2b  cQuote ) n += n+
fd30: 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e 7a 44 65 73  2;.  z = p->zDes
fd40: 74 54 61 62 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28  tTable = malloc(
fd50: 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a 3d   n+1 );.  if( z=
fd60: 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f  =0 ) shell_out_o
fd70: 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 6e 20  f_memory();.  n 
fd80: 3d 20 30 3b 0a 20 20 69 66 28 20 63 51 75 6f 74  = 0;.  if( cQuot
fd90: 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75  e ) z[n++] = cQu
fda0: 6f 74 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ote;.  for(i=0; 
fdb0: 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  zName[i]; i++){.
fdc0: 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61      z[n++] = zNa
fdd0: 6d 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a  me[i];.    if( z
fde0: 4e 61 6d 65 5b 69 5d 3d 3d 63 51 75 6f 74 65 20  Name[i]==cQuote 
fdf0: 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74  ) z[n++] = cQuot
fe00: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 51 75  e;.  }.  if( cQu
fe10: 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63  ote ) z[n++] = c
fe20: 51 75 6f 74 65 3b 0a 20 20 7a 5b 6e 5d 20 3d 20  Quote;.  z[n] = 
fe30: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65  0;.}.../*.** Exe
fe40: 63 75 74 65 20 61 20 71 75 65 72 79 20 73 74 61  cute a query sta
fe50: 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c  tement that will
fe60: 20 67 65 6e 65 72 61 74 65 20 53 51 4c 20 6f 75   generate SQL ou
fe70: 74 70 75 74 2e 20 20 50 72 69 6e 74 0a 2a 2a 20  tput.  Print.** 
fe80: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  the result colum
fe90: 6e 73 2c 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61  ns, comma-separa
fea0: 74 65 64 2c 20 6f 6e 20 61 20 6c 69 6e 65 20 61  ted, on a line a
feb0: 6e 64 20 74 68 65 6e 20 61 64 64 20 61 0a 2a 2a  nd then add a.**
fec0: 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69   semicolon termi
fed0: 6e 61 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  nator to the end
fee0: 20 6f 66 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a   of that line..*
fef0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
ff00: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 73  er of columns is
ff10: 20 31 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75   1 and that colu
ff20: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74 65 78 74  mn contains text
ff30: 20 22 2d 2d 22 0a 2a 2a 20 74 68 65 6e 20 77 72   "--".** then wr
ff40: 69 74 65 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f  ite the semicolo
ff50: 6e 20 6f 6e 20 61 20 73 65 70 61 72 61 74 65 20  n on a separate 
ff60: 6c 69 6e 65 2e 20 20 54 68 61 74 20 77 61 79 2c  line.  That way,
ff70: 20 69 66 20 61 0a 2a 2a 20 22 2d 2d 22 20 63 6f   if a.** "--" co
ff80: 6d 6d 65 6e 74 20 6f 63 63 75 72 73 20 61 74 20  mment occurs at 
ff90: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73  the end of the s
ffa0: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 63 6f  tatement, the co
ffb0: 6d 6d 65 6e 74 0a 2a 2a 20 77 6f 6e 27 74 20 63  mment.** won't c
ffc0: 6f 6e 73 75 6d 65 20 74 68 65 20 73 65 6d 69 63  onsume the semic
ffd0: 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72 2e  olon terminator.
ffe0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
fff0: 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75  un_table_dump_qu
10000 65 72 79 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  ery(.  ShellStat
10010 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
10020 2f 2a 20 51 75 65 72 79 20 63 6f 6e 74 65 78 74  /* Query context
10030 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
10040 20 2a 7a 53 65 6c 65 63 74 2c 20 20 20 20 20 2f   *zSelect,     /
10050 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
10060 6e 74 20 74 6f 20 65 78 74 72 61 63 74 20 63 6f  nt to extract co
10070 6e 74 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ntent */.  const
10080 20 63 68 61 72 20 2a 7a 46 69 72 73 74 52 6f 77   char *zFirstRow
10090 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 62 65 66      /* Print bef
100a0 6f 72 65 20 66 69 72 73 74 20 72 6f 77 2c 20 69  ore first row, i
100b0 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
100c0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
100d0 2a 70 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74 20  *pSelect;.  int 
100e0 72 63 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c  rc;.  int nResul
100f0 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  t;.  int i;.  co
10100 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 72  nst char *z;.  r
10110 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
10120 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
10130 65 6c 65 63 74 2c 20 2d 31 2c 20 26 70 53 65 6c  elect, -1, &pSel
10140 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ect, 0);.  if( r
10150 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
10160 21 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  !pSelect ){.    
10170 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
10180 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52  ut, "/**** ERROR
10190 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f  : (%d) %s *****/
101a0 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20 20 20  \n", rc,.       
101b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
101c0 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
101d0 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66  .    if( (rc&0xf
101e0 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  f)!=SQLITE_CORRU
101f0 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a  PT ) p->nErr++;.
10200 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10210 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
10220 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b  3_step(pSelect);
10230 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c  .  nResult = sql
10240 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
10250 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 77 68  t(pSelect);.  wh
10260 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
10270 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  ROW ){.    if( z
10280 46 69 72 73 74 52 6f 77 20 29 7b 0a 20 20 20 20  FirstRow ){.    
10290 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
102a0 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 46 69 72  >out, "%s", zFir
102b0 73 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 7a 46  stRow);.      zF
102c0 69 72 73 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20  irstRow = 0;.   
102d0 20 7d 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73   }.    z = (cons
102e0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
102f0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c  column_text(pSel
10300 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 75 74 66  ect, 0);.    utf
10310 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
10320 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 66   "%s", z);.    f
10330 6f 72 28 69 3d 31 3b 20 69 3c 6e 52 65 73 75 6c  or(i=1; i<nResul
10340 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  t; i++){.      u
10350 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
10360 74 2c 20 22 2c 25 73 22 2c 20 73 71 6c 69 74 65  t, ",%s", sqlite
10370 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
10380 65 6c 65 63 74 2c 20 69 29 29 3b 0a 20 20 20 20  elect, i));.    
10390 7d 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  }.    if( z==0 )
103a0 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 77 68 69   z = "";.    whi
103b0 6c 65 28 20 7a 5b 30 5d 20 26 26 20 28 7a 5b 30  le( z[0] && (z[0
103c0 5d 21 3d 27 2d 27 20 7c 7c 20 7a 5b 31 5d 21 3d  ]!='-' || z[1]!=
103d0 27 2d 27 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  '-') ) z++;.    
103e0 69 66 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  if( z[0] ){.    
103f0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
10400 6f 75 74 2c 20 22 5c 6e 3b 5c 6e 22 29 3b 0a 20  out, "\n;\n");. 
10410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10420 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
10430 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d  t, ";\n");.    }
10440 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10450 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b  3_step(pSelect);
10460 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
10470 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 65  te3_finalize(pSe
10480 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 72 63 21  lect);.  if( rc!
10490 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
104a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
104b0 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52  >out, "/**** ERR
104c0 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a  OR: (%d) %s ****
104d0 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20  */\n", rc,.     
104e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
104f0 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
10500 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30  );.    if( (rc&0
10510 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52  xff)!=SQLITE_COR
10520 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b  RUPT ) p->nErr++
10530 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10540 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
10550 63 61 74 65 20 73 70 61 63 65 20 61 6e 64 20 73  cate space and s
10560 61 76 65 20 6f 66 66 20 63 75 72 72 65 6e 74 20  ave off current 
10570 65 72 72 6f 72 20 73 74 72 69 6e 67 2e 0a 2a 2f  error string..*/
10580 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 61  .static char *sa
10590 76 65 5f 65 72 72 5f 6d 73 67 28 0a 20 20 73 71  ve_err_msg(.  sq
105a0 6c 69 74 65 33 20 2a 64 62 20 20 20 20 20 20 20  lite3 *db       
105b0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
105c0 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 29 7b 0a   to query */.){.
105d0 20 20 69 6e 74 20 6e 45 72 72 4d 73 67 20 3d 20    int nErrMsg = 
105e0 31 2b 73 74 72 6c 65 6e 33 30 28 73 71 6c 69 74  1+strlen30(sqlit
105f0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
10600 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
10610 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
10620 36 34 28 6e 45 72 72 4d 73 67 29 3b 0a 20 20 69  64(nErrMsg);.  i
10630 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
10640 20 20 6d 65 6d 63 70 79 28 7a 45 72 72 4d 73 67    memcpy(zErrMsg
10650 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
10660 28 64 62 29 2c 20 6e 45 72 72 4d 73 67 29 3b 0a  (db), nErrMsg);.
10670 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72    }.  return zEr
10680 72 4d 73 67 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rMsg;.}..#ifdef 
10690 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20  __linux__./*.** 
106a0 41 74 74 65 6d 70 74 20 74 6f 20 64 69 73 70 6c  Attempt to displ
106b0 61 79 20 49 2f 4f 20 73 74 61 74 73 20 6f 6e 20  ay I/O stats on 
106c0 4c 69 6e 75 78 20 75 73 69 6e 67 20 2f 70 72 6f  Linux using /pro
106d0 63 2f 50 49 44 2f 69 6f 0a 2a 2f 0a 73 74 61 74  c/PID/io.*/.stat
106e0 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 4c  ic void displayL
106f0 69 6e 75 78 49 6f 53 74 61 74 73 28 46 49 4c 45  inuxIoStats(FILE
10700 20 2a 6f 75 74 29 7b 0a 20 20 46 49 4c 45 20 2a   *out){.  FILE *
10710 69 6e 3b 0a 20 20 63 68 61 72 20 7a 5b 32 30 30  in;.  char z[200
10720 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ];.  sqlite3_snp
10730 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
10740 20 7a 2c 20 22 2f 70 72 6f 63 2f 25 64 2f 69 6f   z, "/proc/%d/io
10750 22 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20  ", getpid());.  
10760 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 2c 20 22 72  in = fopen(z, "r
10770 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30  b");.  if( in==0
10780 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69   ) return;.  whi
10790 6c 65 28 20 66 67 65 74 73 28 7a 2c 20 73 69 7a  le( fgets(z, siz
107a0 65 6f 66 28 7a 29 2c 20 69 6e 29 21 3d 30 20 29  eof(z), in)!=0 )
107b0 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
107c0 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
107d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
107e0 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 63 6f  attern;.      co
107f0 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 63 3b  nst char *zDesc;
10800 0a 20 20 20 20 7d 20 61 54 72 61 6e 73 5b 5d 20  .    } aTrans[] 
10810 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 72 63 68  = {.      { "rch
10820 61 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20  ar: ",          
10830 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20 72          "Bytes r
10840 65 63 65 69 76 65 64 20 62 79 20 72 65 61 64 28  eceived by read(
10850 29 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ):" },.      { "
10860 77 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20 20  wchar: ",       
10870 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65             "Byte
10880 73 20 73 65 6e 74 20 74 6f 20 77 72 69 74 65 28  s sent to write(
10890 29 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  ):"    },.      
108a0 7b 20 22 73 79 73 63 72 3a 20 22 2c 20 20 20 20  { "syscr: ",    
108b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
108c0 65 61 64 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ead() system cal
108d0 6c 73 3a 22 20 20 20 20 20 20 7d 2c 0a 20 20 20  ls:"      },.   
108e0 20 20 20 7b 20 22 73 79 73 63 77 3a 20 22 2c 20     { "syscw: ", 
108f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10900 20 22 57 72 69 74 65 28 29 20 73 79 73 74 65 6d   "Write() system
10910 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 7d 2c 0a   calls:"     },.
10920 20 20 20 20 20 20 7b 20 22 72 65 61 64 5f 62 79        { "read_by
10930 74 65 73 3a 20 22 2c 20 20 20 20 20 20 20 20 20  tes: ",         
10940 20 20 20 20 22 42 79 74 65 73 20 72 65 61 64 20      "Bytes read 
10950 66 72 6f 6d 20 73 74 6f 72 61 67 65 3a 22 20 20  from storage:"  
10960 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 72 69 74  },.      { "writ
10970 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20  e_bytes: ",     
10980 20 20 20 20 20 20 20 22 42 79 74 65 73 20 77 72         "Bytes wr
10990 69 74 74 65 6e 20 74 6f 20 73 74 6f 72 61 67 65  itten to storage
109a0 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63  :" },.      { "c
109b0 61 6e 63 65 6c 6c 65 64 5f 77 72 69 74 65 5f 62  ancelled_write_b
109c0 79 74 65 73 3a 20 22 2c 20 20 22 43 61 6e 63 65  ytes: ",  "Cance
109d0 6c 6c 65 64 20 77 72 69 74 65 20 62 79 74 65 73  lled write bytes
109e0 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a  :"    },.    };.
109f0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
10a00 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
10a10 69 7a 65 28 61 54 72 61 6e 73 29 3b 20 69 2b 2b  ize(aTrans); i++
10a20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
10a30 20 73 74 72 6c 65 6e 33 30 28 61 54 72 61 6e 73   strlen30(aTrans
10a40 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 29 3b 0a 20  [i].zPattern);. 
10a50 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
10a60 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74  (aTrans[i].zPatt
10a70 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d 30 20 29 7b  ern, z, n)==0 ){
10a80 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
10a90 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
10aa0 20 25 73 22 2c 20 61 54 72 61 6e 73 5b 69 5d 2e   %s", aTrans[i].
10ab0 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d 29 3b 0a 20  zDesc, &z[n]);. 
10ac0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10ad0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10ae0 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 7d 0a    fclose(in);.}.
10af0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69  #endif../*.** Di
10b00 73 70 6c 61 79 20 61 20 73 69 6e 67 6c 65 20 6c  splay a single l
10b10 69 6e 65 20 6f 66 20 73 74 61 74 75 73 20 75 73  ine of status us
10b20 69 6e 67 20 36 34 2d 62 69 74 20 76 61 6c 75 65  ing 64-bit value
10b30 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
10b40 64 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e  d displayStatLin
10b50 65 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  e(.  ShellState 
10b60 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
10b70 2a 20 54 68 65 20 73 68 65 6c 6c 20 63 6f 6e 74  * The shell cont
10b80 65 78 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ext */.  char *z
10b90 4c 61 62 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Label,          
10ba0 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
10bb0 74 68 69 73 20 6f 6e 65 20 6c 69 6e 65 20 2a 2f  this one line */
10bc0 0a 20 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  .  char *zFormat
10bd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
10be0 46 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 72  Format for the r
10bf0 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69  esult */.  int i
10c00 53 74 61 74 75 73 43 74 72 6c 2c 20 20 20 20 20  StatusCtrl,     
10c10 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 73 74       /* Which st
10c20 61 74 75 73 20 74 6f 20 64 69 73 70 6c 61 79 20  atus to display 
10c30 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73 65 74 20  */.  int bReset 
10c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10c50 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20  * True to reset 
10c60 74 68 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a  the stats */.){.
10c70 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
10c80 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73 71 6c  iCur = -1;.  sql
10c90 69 74 65 33 5f 69 6e 74 36 34 20 69 48 69 77 74  ite3_int64 iHiwt
10ca0 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 2c  r = -1;.  int i,
10cb0 20 6e 50 65 72 63 65 6e 74 3b 0a 20 20 63 68 61   nPercent;.  cha
10cc0 72 20 7a 4c 69 6e 65 5b 32 30 30 5d 3b 0a 20 20  r zLine[200];.  
10cd0 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 36 34  sqlite3_status64
10ce0 28 69 53 74 61 74 75 73 43 74 72 6c 2c 20 26 69  (iStatusCtrl, &i
10cf0 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
10d00 65 73 65 74 29 3b 0a 20 20 66 6f 72 28 69 3d 30  eset);.  for(i=0
10d10 2c 20 6e 50 65 72 63 65 6e 74 3d 30 3b 20 7a 46  , nPercent=0; zF
10d20 6f 72 6d 61 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  ormat[i]; i++){.
10d30 20 20 20 20 69 66 28 20 7a 46 6f 72 6d 61 74 5b      if( zFormat[
10d40 69 5d 3d 3d 27 25 27 20 29 20 6e 50 65 72 63 65  i]=='%' ) nPerce
10d50 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nt++;.  }.  if( 
10d60 6e 50 65 72 63 65 6e 74 3e 31 20 29 7b 0a 20 20  nPercent>1 ){.  
10d70 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
10d80 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  tf(sizeof(zLine)
10d90 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74  , zLine, zFormat
10da0 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b  , iCur, iHiwtr);
10db0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
10dc0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
10dd0 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c  izeof(zLine), zL
10de0 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 69 48  ine, zFormat, iH
10df0 69 77 74 72 29 3b 0a 20 20 7d 0a 20 20 72 61 77  iwtr);.  }.  raw
10e00 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
10e10 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 4c  "%-36s %s\n", zL
10e20 61 62 65 6c 2c 20 7a 4c 69 6e 65 29 3b 0a 7d 0a  abel, zLine);.}.
10e30 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 6d  ./*.** Display m
10e40 65 6d 6f 72 79 20 73 74 61 74 73 2e 0a 2a 2f 0a  emory stats..*/.
10e50 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c  static int displ
10e60 61 79 5f 73 74 61 74 73 28 0a 20 20 73 71 6c 69  ay_stats(.  sqli
10e70 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
10e80 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
10e90 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  ase to query */.
10ea0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41    ShellState *pA
10eb0 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rg,           /*
10ec0 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c   Pointer to Shel
10ed0 6c 53 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  lState */.  int 
10ee0 62 52 65 73 65 74 20 20 20 20 20 20 20 20 20 20  bReset          
10ef0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
10f00 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74 61  to reset the sta
10f10 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
10f20 43 75 72 3b 0a 20 20 69 6e 74 20 69 48 69 77 74  Cur;.  int iHiwt
10f30 72 3b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 0a  r;.  FILE *out;.
10f40 20 20 69 66 28 20 70 41 72 67 3d 3d 30 20 7c 7c    if( pArg==0 ||
10f50 20 70 41 72 67 2d 3e 6f 75 74 3d 3d 30 20 29 20   pArg->out==0 ) 
10f60 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 75 74 20  return 0;.  out 
10f70 3d 20 70 41 72 67 2d 3e 6f 75 74 3b 0a 0a 20 20  = pArg->out;..  
10f80 69 66 28 20 70 41 72 67 2d 3e 70 53 74 6d 74 20  if( pArg->pStmt 
10f90 26 26 20 28 70 41 72 67 2d 3e 73 74 61 74 73 4f  && (pArg->statsO
10fa0 6e 20 26 20 32 29 20 29 7b 0a 20 20 20 20 69 6e  n & 2) ){.    in
10fb0 74 20 6e 43 6f 6c 2c 20 69 2c 20 78 3b 0a 20 20  t nCol, i, x;.  
10fc0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
10fd0 70 53 74 6d 74 20 3d 20 70 41 72 67 2d 3e 70 53  pStmt = pArg->pS
10fe0 74 6d 74 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b  tmt;.    char z[
10ff0 31 30 30 5d 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d  100];.    nCol =
11000 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
11010 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
11020 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
11030 2c 20 22 25 2d 33 36 73 20 25 64 5c 6e 22 2c 20  , "%-36s %d\n", 
11040 22 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75  "Number of outpu
11050 74 20 63 6f 6c 75 6d 6e 73 3a 22 2c 20 6e 43 6f  t columns:", nCo
11060 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l);.    for(i=0;
11070 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
11080 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
11090 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
110a0 7a 2c 22 43 6f 6c 75 6d 6e 20 25 64 20 25 6e 6e  z,"Column %d %nn
110b0 61 6d 65 3a 22 2c 20 69 2c 20 26 78 29 3b 0a 20  ame:", i, &x);. 
110c0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
110d0 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c  (out, "%-36s %s\
110e0 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63  n", z, sqlite3_c
110f0 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
11100 2c 69 29 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ,i));.#ifndef SQ
11110 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
11120 50 45 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  PE.      sqlite3
11130 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b  _snprintf(30, z+
11140 78 2c 20 22 64 65 63 6c 61 72 65 64 20 74 79 70  x, "declared typ
11150 65 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38  e:");.      utf8
11160 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d  _printf(out, "%-
11170 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71  36s %s\n", z, sq
11180 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
11190 6c 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29 29  ltype(pStmt, i))
111a0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
111b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
111c0 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
111d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
111e0 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22 64  intf(30, z+x, "d
111f0 61 74 61 62 61 73 65 20 6e 61 6d 65 3a 22 29 3b  atabase name:");
11200 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
11210 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  tf(out, "%-36s %
11220 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33  s\n", z, sqlite3
11230 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65  _column_database
11240 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b  _name(pStmt,i));
11250 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
11260 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c  nprintf(30, z+x,
11270 20 22 74 61 62 6c 65 20 6e 61 6d 65 3a 22 29 3b   "table name:");
11280 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
11290 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  tf(out, "%-36s %
112a0 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33  s\n", z, sqlite3
112b0 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61  _column_table_na
112c0 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20  me(pStmt,i));.  
112d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
112e0 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22 6f  intf(30, z+x, "o
112f0 72 69 67 69 6e 20 6e 61 6d 65 3a 22 29 3b 0a 20  rigin name:");. 
11300 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
11310 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c  (out, "%-36s %s\
11320 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63  n", z, sqlite3_c
11330 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d  olumn_origin_nam
11340 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 23 65 6e  e(pStmt,i));.#en
11350 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  dif.    }.  }.. 
11360 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
11370 28 70 41 72 67 2c 20 22 4d 65 6d 6f 72 79 20 55  (pArg, "Memory U
11380 73 65 64 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c  sed:",.     "%ll
11390 64 20 28 6d 61 78 20 25 6c 6c 64 29 20 62 79 74  d (max %lld) byt
113a0 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  es", SQLITE_STAT
113b0 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20  US_MEMORY_USED, 
113c0 62 52 65 73 65 74 29 3b 0a 20 20 64 69 73 70 6c  bReset);.  displ
113d0 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c  ayStatLine(pArg,
113e0 20 22 4e 75 6d 62 65 72 20 6f 66 20 4f 75 74 73   "Number of Outs
113f0 74 61 6e 64 69 6e 67 20 41 6c 6c 6f 63 61 74 69  tanding Allocati
11400 6f 6e 73 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c  ons:",.     "%ll
11410 64 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c 20 53  d (max %lld)", S
11420 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c  QLITE_STATUS_MAL
11430 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62 52 65 73 65  LOC_COUNT, bRese
11440 74 29 3b 0a 20 20 69 66 28 20 70 41 72 67 2d 3e  t);.  if( pArg->
11450 73 68 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c  shellFlgs & SHFL
11460 47 5f 50 61 67 65 63 61 63 68 65 20 29 7b 0a 20  G_Pagecache ){. 
11470 20 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69     displayStatLi
11480 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72  ne(pArg, "Number
11490 20 6f 66 20 50 63 61 63 68 65 20 50 61 67 65 73   of Pcache Pages
114a0 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20 20 20   Used:",.       
114b0 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29  "%lld (max %lld)
114c0 20 70 61 67 65 73 22 2c 20 53 51 4c 49 54 45 5f   pages", SQLITE_
114d0 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45  STATUS_PAGECACHE
114e0 5f 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a  _USED, bReset);.
114f0 20 20 7d 0a 20 20 64 69 73 70 6c 61 79 53 74 61    }.  displaySta
11500 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d  tLine(pArg, "Num
11510 62 65 72 20 6f 66 20 50 63 61 63 68 65 20 4f 76  ber of Pcache Ov
11520 65 72 66 6c 6f 77 20 42 79 74 65 73 3a 22 2c 0a  erflow Bytes:",.
11530 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20       "%lld (max 
11540 25 6c 6c 64 29 20 62 79 74 65 73 22 2c 20 53 51  %lld) bytes", SQ
11550 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45  LITE_STATUS_PAGE
11560 43 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57 2c 20  CACHE_OVERFLOW, 
11570 62 52 65 73 65 74 29 3b 0a 20 20 64 69 73 70 6c  bReset);.  displ
11580 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c  ayStatLine(pArg,
11590 20 22 4c 61 72 67 65 73 74 20 41 6c 6c 6f 63 61   "Largest Alloca
115a0 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22 25 6c  tion:",.     "%l
115b0 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54  ld bytes", SQLIT
115c0 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f  E_STATUS_MALLOC_
115d0 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a 20  SIZE, bReset);. 
115e0 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
115f0 28 70 41 72 67 2c 20 22 4c 61 72 67 65 73 74 20  (pArg, "Largest 
11600 50 63 61 63 68 65 20 41 6c 6c 6f 63 61 74 69 6f  Pcache Allocatio
11610 6e 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20  n:",.     "%lld 
11620 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53  bytes", SQLITE_S
11630 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f  TATUS_PAGECACHE_
11640 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a 23  SIZE, bReset);.#
11650 69 66 64 65 66 20 59 59 54 52 41 43 4b 4d 41 58  ifdef YYTRACKMAX
11660 53 54 41 43 4b 44 45 50 54 48 0a 20 20 64 69 73  STACKDEPTH.  dis
11670 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72  playStatLine(pAr
11680 67 2c 20 22 44 65 65 70 65 73 74 20 50 61 72 73  g, "Deepest Pars
11690 65 72 20 53 74 61 63 6b 3a 22 2c 0a 20 20 20 20  er Stack:",.    
116a0 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64   "%lld (max %lld
116b0 29 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55  )", SQLITE_STATU
116c0 53 5f 50 41 52 53 45 52 5f 53 54 41 43 4b 2c 20  S_PARSER_STACK, 
116d0 62 52 65 73 65 74 29 3b 0a 23 65 6e 64 69 66 0a  bReset);.#endif.
116e0 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20  .  if( db ){.   
116f0 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65 6c 6c   if( pArg->shell
11700 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 4c 6f 6f  Flgs & SHFLG_Loo
11710 6b 61 73 69 64 65 20 29 7b 0a 20 20 20 20 20 20  kaside ){.      
11720 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
11730 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  -1;.      sqlite
11740 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
11750 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
11760 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45 44 2c 0a  LOOKASIDE_USED,.
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26          &iCur, &
11790 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
117a0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
117b0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20  f(pArg->out,.   
117c0 20 20 20 20 20 20 20 20 20 20 20 22 4c 6f 6f 6b             "Look
117d0 61 73 69 64 65 20 53 6c 6f 74 73 20 55 73 65 64  aside Slots Used
117e0 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
117f0 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c   %d (max %d)\n",
11800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
11810 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20  Cur, iHiwtr);.  
11820 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
11830 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
11840 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53  _DBSTATUS_LOOKAS
11850 49 44 45 5f 48 49 54 2c 0a 20 20 20 20 20 20 20  IDE_HIT,.       
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11870 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
11880 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20   bReset);.      
11890 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
118a0 3e 6f 75 74 2c 20 22 53 75 63 63 65 73 73 66 75  >out, "Successfu
118b0 6c 20 6c 6f 6f 6b 61 73 69 64 65 20 61 74 74 65  l lookaside atte
118c0 6d 70 74 73 3a 20 20 20 20 20 20 20 25 64 5c 6e  mpts:       %d\n
118d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
118e0 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20   iHiwtr);.      
118f0 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
11900 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
11910 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f  TATUS_LOOKASIDE_
11920 4d 49 53 53 5f 53 49 5a 45 2c 0a 20 20 20 20 20  MISS_SIZE,.     
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11940 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74     &iCur, &iHiwt
11950 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
11960 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
11970 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69  g->out, "Lookasi
11980 64 65 20 66 61 69 6c 75 72 65 73 20 64 75 65 20  de failures due 
11990 74 6f 20 73 69 7a 65 3a 20 20 20 20 20 20 25 64  to size:      %d
119a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
119b0 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20     iHiwtr);.    
119c0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
119d0 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
119e0 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44  BSTATUS_LOOKASID
119f0 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c 0a 20 20 20  E_MISS_FULL,.   
11a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a10 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69       &iCur, &iHi
11a20 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
11a30 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
11a40 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61  Arg->out, "Looka
11a50 73 69 64 65 20 66 61 69 6c 75 72 65 73 20 64 75  side failures du
11a60 65 20 74 6f 20 4f 4f 4d 3a 20 20 20 20 20 20 20  e to OOM:       
11a70 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
11a80 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20       iHiwtr);.  
11a90 20 20 7d 0a 20 20 20 20 69 48 69 77 74 72 20 3d    }.    iHiwtr =
11aa0 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
11ab0 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
11ac0 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
11ad0 54 41 54 55 53 5f 43 41 43 48 45 5f 55 53 45 44  TATUS_CACHE_USED
11ae0 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
11af0 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72  , bReset);.    r
11b00 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
11b10 6f 75 74 2c 20 22 50 61 67 65 72 20 48 65 61 70  out, "Pager Heap
11b20 20 55 73 61 67 65 3a 20 20 20 20 20 20 20 20 20   Usage:         
11b30 20 20 20 20 20 20 20 20 20 20 20 25 64 20 62 79             %d by
11b40 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  tes\n",.        
11b50 20 20 20 20 69 43 75 72 29 3b 0a 20 20 20 20 69      iCur);.    i
11b60 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
11b70 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  1;.    sqlite3_d
11b80 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
11b90 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
11ba0 48 45 5f 48 49 54 2c 20 26 69 43 75 72 2c 20 26  HE_HIT, &iCur, &
11bb0 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20  iHiwtr, 1);.    
11bc0 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
11bd0 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68  >out, "Page cach
11be0 65 20 68 69 74 73 3a 20 20 20 20 20 20 20 20 20  e hits:         
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
11c00 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48  ", iCur);.    iH
11c10 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
11c20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
11c30 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
11c40 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
11c50 45 5f 4d 49 53 53 2c 20 26 69 43 75 72 2c 20 26  E_MISS, &iCur, &
11c60 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20  iHiwtr, 1);.    
11c70 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
11c80 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68  >out, "Page cach
11c90 65 20 6d 69 73 73 65 73 3a 20 20 20 20 20 20 20  e misses:       
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
11cb0 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48  ", iCur);.    iH
11cc0 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
11cd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
11ce0 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
11cf0 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
11d00 45 5f 57 52 49 54 45 2c 20 26 69 43 75 72 2c 20  E_WRITE, &iCur, 
11d10 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20  &iHiwtr, 1);.   
11d20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
11d30 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63  ->out, "Page cac
11d40 68 65 20 77 72 69 74 65 73 3a 20 20 20 20 20 20  he writes:      
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
11d60 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
11d70 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
11d80 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  1;.    sqlite3_d
11d90 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
11da0 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
11db0 48 45 5f 53 50 49 4c 4c 2c 20 26 69 43 75 72 2c  HE_SPILL, &iCur,
11dc0 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20   &iHiwtr, 1);.  
11dd0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
11de0 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61  g->out, "Page ca
11df0 63 68 65 20 73 70 69 6c 6c 73 3a 20 20 20 20 20  che spills:     
11e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
11e10 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
11e20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
11e30 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
11e40 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
11e50 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53 43  LITE_DBSTATUS_SC
11e60 48 45 4d 41 5f 55 53 45 44 2c 20 26 69 43 75 72  HEMA_USED, &iCur
11e70 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
11e80 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  t);.    raw_prin
11e90 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53  tf(pArg->out, "S
11ea0 63 68 65 6d 61 20 48 65 61 70 20 55 73 61 67 65  chema Heap Usage
11eb0 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
11ec0 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c      %d bytes\n",
11ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75  .            iCu
11ee0 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d  r);.    iHiwtr =
11ef0 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
11f00 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
11f10 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
11f20 54 41 54 55 53 5f 53 54 4d 54 5f 55 53 45 44 2c  TATUS_STMT_USED,
11f30 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
11f40 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61   bReset);.    ra
11f50 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
11f60 75 74 2c 20 22 53 74 61 74 65 6d 65 6e 74 20 48  ut, "Statement H
11f70 65 61 70 2f 4c 6f 6f 6b 61 73 69 64 65 20 55 73  eap/Lookaside Us
11f80 61 67 65 3a 20 20 20 20 20 20 25 64 20 62 79 74  age:      %d byt
11f90 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
11fa0 20 20 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 20     iCur);.  }.. 
11fb0 20 69 66 28 20 70 41 72 67 2d 3e 70 53 74 6d 74   if( pArg->pStmt
11fc0 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 73   ){.    iCur = s
11fd0 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
11fe0 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20  us(pArg->pStmt, 
11ff0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
12000 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c  S_FULLSCAN_STEP,
12010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12030 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
12040 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12050 74 2c 20 22 46 75 6c 6c 73 63 61 6e 20 53 74 65  t, "Fullscan Ste
12060 70 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ps:             
12070 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
12080 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20  iCur);.    iCur 
12090 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
120a0 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d  tatus(pArg->pStm
120b0 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  t, SQLITE_STMTST
120c0 41 54 55 53 5f 53 4f 52 54 2c 20 62 52 65 73 65  ATUS_SORT, bRese
120d0 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  t);.    raw_prin
120e0 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53  tf(pArg->out, "S
120f0 6f 72 74 20 4f 70 65 72 61 74 69 6f 6e 73 3a 20  ort Operations: 
12100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12110 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
12120 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c  ;.    iCur = sql
12130 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
12140 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51  (pArg->pStmt, SQ
12150 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
12160 41 55 54 4f 49 4e 44 45 58 2c 62 52 65 73 65 74  AUTOINDEX,bReset
12170 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
12180 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 41 75  f(pArg->out, "Au
12190 74 6f 69 6e 64 65 78 20 49 6e 73 65 72 74 73 3a  toindex Inserts:
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121b0 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
121c0 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
121d0 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
121e0 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
121f0 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 56  ITE_STMTSTATUS_V
12200 4d 5f 53 54 45 50 2c 20 62 52 65 73 65 74 29 3b  M_STEP, bReset);
12210 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
12220 70 41 72 67 2d 3e 6f 75 74 2c 20 22 56 69 72 74  pArg->out, "Virt
12230 75 61 6c 20 4d 61 63 68 69 6e 65 20 53 74 65 70  ual Machine Step
12240 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s:              
12250 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12260 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65     iCur = sqlite
12270 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41  3_stmt_status(pA
12280 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54  rg->pStmt, SQLIT
12290 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52 45 50  E_STMTSTATUS_REP
122a0 52 45 50 41 52 45 2c 20 62 52 65 73 65 74 29 3b  REPARE, bReset);
122b0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
122c0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 52 65 70 72  pArg->out, "Repr
122d0 65 70 61 72 65 20 6f 70 65 72 61 74 69 6f 6e 73  epare operations
122e0 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
122f0 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12300 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65     iCur = sqlite
12310 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41  3_stmt_status(pA
12320 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54  rg->pStmt, SQLIT
12330 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52 55 4e  E_STMTSTATUS_RUN
12340 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72  , bReset);.    r
12350 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
12360 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20  out, "Number of 
12370 74 69 6d 65 73 20 72 75 6e 3a 20 20 20 20 20 20  times run:      
12380 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
12390 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75  , iCur);.    iCu
123a0 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  r = sqlite3_stmt
123b0 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53  _status(pArg->pS
123c0 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54  tmt, SQLITE_STMT
123d0 53 54 41 54 55 53 5f 4d 45 4d 55 53 45 44 2c 20  STATUS_MEMUSED, 
123e0 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
123f0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12400 74 2c 20 22 4d 65 6d 6f 72 79 20 75 73 65 64 20  t, "Memory used 
12410 62 79 20 70 72 65 70 61 72 65 64 20 73 74 6d 74  by prepared stmt
12420 3a 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20  :        %d\n", 
12430 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 23 69 66 64  iCur);.  }..#ifd
12440 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 20 20 64  ef __linux__.  d
12450 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61  isplayLinuxIoSta
12460 74 73 28 70 41 72 67 2d 3e 6f 75 74 29 3b 0a 23  ts(pArg->out);.#
12470 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 6e  endif..  /* Do n
12480 6f 74 20 72 65 6d 6f 76 65 20 74 68 69 73 20 6d  ot remove this m
12490 61 63 68 69 6e 65 20 72 65 61 64 61 62 6c 65 20  achine readable 
124a0 63 6f 6d 6d 65 6e 74 3a 20 65 78 74 72 61 2d 73  comment: extra-s
124b0 74 61 74 73 2d 6f 75 74 70 75 74 2d 68 65 72 65  tats-output-here
124c0 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b   */..  return 0;
124d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61  .}../*.** Displa
124e0 79 20 73 63 61 6e 20 73 74 61 74 73 2e 0a 2a 2f  y scan stats..*/
124f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
12500 70 6c 61 79 5f 73 63 61 6e 73 74 61 74 73 28 0a  play_scanstats(.
12510 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12530 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f    /* Database to
12540 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 68 65 6c   query */.  Shel
12550 6c 53 74 61 74 65 20 2a 70 41 72 67 20 20 20 20  lState *pArg    
12560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
12570 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53  ointer to ShellS
12580 74 61 74 65 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  tate */.){.#ifnd
12590 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
125a0 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
125b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
125c0 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45  TER(db);.  UNUSE
125d0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 41 72 67  D_PARAMETER(pArg
125e0 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 69  );.#else.  int i
125f0 2c 20 6b 2c 20 6e 2c 20 6d 78 3b 0a 20 20 72 61  , k, n, mx;.  ra
12600 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
12610 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 63  ut, "-------- sc
12620 61 6e 73 74 61 74 73 20 2d 2d 2d 2d 2d 2d 2d 2d  anstats --------
12630 5c 6e 22 29 3b 0a 20 20 6d 78 20 3d 20 30 3b 0a  \n");.  mx = 0;.
12640 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 3d 6d 78    for(k=0; k<=mx
12650 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 64 6f 75 62  ; k++){.    doub
12660 6c 65 20 72 45 73 74 4c 6f 6f 70 20 3d 20 31 2e  le rEstLoop = 1.
12670 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30  0;.    for(i=n=0
12680 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ; 1; i++){.     
12690 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
126a0 20 3d 20 70 41 72 67 2d 3e 70 53 74 6d 74 3b 0a   = pArg->pStmt;.
126b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
126c0 74 36 34 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73 69  t64 nLoop, nVisi
126d0 74 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20  t;.      double 
126e0 72 45 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  rEst;.      int 
126f0 69 53 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73  iSid;.      cons
12700 74 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e  t char *zExplain
12710 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
12720 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
12730 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45  tus(p, i, SQLITE
12740 5f 53 43 41 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c  _SCANSTAT_NLOOP,
12750 20 28 76 6f 69 64 2a 29 26 6e 4c 6f 6f 70 29 20   (void*)&nLoop) 
12760 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
12770 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12780 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
12790 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
127a0 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 53 45  LITE_SCANSTAT_SE
127b0 4c 45 43 54 49 44 2c 20 28 76 6f 69 64 2a 29 26  LECTID, (void*)&
127c0 69 53 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28  iSid);.      if(
127d0 20 69 53 69 64 3e 6d 78 20 29 20 6d 78 20 3d 20   iSid>mx ) mx = 
127e0 69 53 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20  iSid;.      if( 
127f0 69 53 69 64 21 3d 6b 20 29 20 63 6f 6e 74 69 6e  iSid!=k ) contin
12800 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d  ue;.      if( n=
12810 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 45  =0 ){.        rE
12820 73 74 4c 6f 6f 70 20 3d 20 28 64 6f 75 62 6c 65  stLoop = (double
12830 29 6e 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  )nLoop;.        
12840 69 66 28 20 6b 3e 30 20 29 20 72 61 77 5f 70 72  if( k>0 ) raw_pr
12850 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
12860 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75 62 71 75 65  "-------- subque
12870 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 5c 6e 22  ry %d -------\n"
12880 2c 20 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , k);.      }.  
12890 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 73      n++;.      s
128a0 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
128b0 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c  status(p, i, SQL
128c0 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56 49  ITE_SCANSTAT_NVI
128d0 53 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56 69  SIT, (void*)&nVi
128e0 73 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  sit);.      sqli
128f0 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
12900 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45  tus(p, i, SQLITE
12910 5f 53 43 41 4e 53 54 41 54 5f 45 53 54 2c 20 28  _SCANSTAT_EST, (
12920 76 6f 69 64 2a 29 26 72 45 73 74 29 3b 0a 20 20  void*)&rEst);.  
12930 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
12940 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69  _scanstatus(p, i
12950 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
12960 54 5f 45 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64  T_EXPLAIN, (void
12970 2a 29 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20  *)&zExplain);.  
12980 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
12990 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 70  pArg->out, "Loop
129a0 20 25 32 64 3a 20 25 73 5c 6e 22 2c 20 6e 2c 20   %2d: %s\n", n, 
129b0 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20  zExplain);.     
129c0 20 72 45 73 74 4c 6f 6f 70 20 2a 3d 20 72 45 73   rEstLoop *= rEs
129d0 74 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  t;.      raw_pri
129e0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20  ntf(pArg->out,. 
129f0 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20 20           "      
12a00 20 20 20 6e 4c 6f 6f 70 3d 25 2d 38 6c 6c 64 20     nLoop=%-8lld 
12a10 6e 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52  nRow=%-8lld estR
12a20 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77  ow=%-8lld estRow
12a30 2f 4c 6f 6f 70 3d 25 2d 38 67 5c 6e 22 2c 0a 20  /Loop=%-8g\n",. 
12a40 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70 2c 20           nLoop, 
12a50 6e 56 69 73 69 74 2c 20 28 73 71 6c 69 74 65 33  nVisit, (sqlite3
12a60 5f 69 6e 74 36 34 29 28 72 45 73 74 4c 6f 6f 70  _int64)(rEstLoop
12a70 2b 30 2e 35 29 2c 20 72 45 73 74 0a 20 20 20 20  +0.5), rEst.    
12a80 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20    );.    }.  }. 
12a90 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12aa0 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d  ->out, "--------
12ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ac0 2d 2d 2d 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a  ---\n");.#endif.
12ad0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
12ae0 65 72 20 61 7a 41 72 72 61 79 20 70 6f 69 6e 74  er azArray point
12af0 73 20 74 6f 20 61 20 7a 65 72 6f 2d 74 65 72 6d  s to a zero-term
12b00 69 6e 61 74 65 64 20 61 72 72 61 79 20 6f 66 20  inated array of 
12b10 73 74 72 69 6e 67 73 2e 20 7a 53 74 72 0a 2a 2a  strings. zStr.**
12b20 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 69 6e   points to a sin
12b30 67 6c 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  gle nul-terminat
12b40 65 64 20 73 74 72 69 6e 67 2e 20 52 65 74 75 72  ed string. Retur
12b50 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 7a 53  n non-zero if zS
12b60 74 72 0a 2a 2a 20 69 73 20 65 71 75 61 6c 2c 20  tr.** is equal, 
12b70 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 74 72  according to str
12b80 63 6d 70 28 29 2c 20 74 6f 20 61 6e 79 20 6f 66  cmp(), to any of
12b90 20 74 68 65 20 73 74 72 69 6e 67 73 20 69 6e 20   the strings in 
12ba0 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 20 4f 74  the array..** Ot
12bb0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
12bc0 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
12bd0 69 6e 74 20 73 74 72 5f 69 6e 5f 61 72 72 61 79  int str_in_array
12be0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74  (const char *zSt
12bf0 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  r, const char **
12c00 61 7a 41 72 72 61 79 29 7b 0a 20 20 69 6e 74 20  azArray){.  int 
12c10 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 61 7a  i;.  for(i=0; az
12c20 41 72 72 61 79 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  Array[i]; i++){.
12c30 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
12c40 70 28 7a 53 74 72 2c 20 61 7a 41 72 72 61 79 5b  p(zStr, azArray[
12c50 69 5d 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  i]) ) return 1;.
12c60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
12c70 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70  }../*.** If comp
12c80 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 20 70  iled statement p
12c90 53 71 6c 20 61 70 70 65 61 72 73 20 74 6f 20 62  Sql appears to b
12ca0 65 20 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61  e an EXPLAIN sta
12cb0 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f 63 61 74 65  tement, allocate
12cc0 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
12cd0 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74 65 2e   the ShellState.
12ce0 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79  aiIndent[] array
12cf0 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62 65 72   with the number
12d00 20 6f 66 0a 2a 2a 20 73 70 61 63 65 73 20 65 61   of.** spaces ea
12d10 63 68 20 6f 70 63 6f 64 65 20 73 68 6f 75 6c 64  ch opcode should
12d20 20 62 65 20 69 6e 64 65 6e 74 65 64 20 62 65 66   be indented bef
12d30 6f 72 65 20 69 74 20 69 73 20 6f 75 74 70 75 74  ore it is output
12d40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
12d50 6e 74 69 6e 67 20 72 75 6c 65 73 20 61 72 65 3a  nting rules are:
12d60 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72  .**.**     * For
12d70 20 65 61 63 68 20 22 4e 65 78 74 22 2c 20 22 50   each "Next", "P
12d80 72 65 76 22 2c 20 22 56 4e 65 78 74 22 20 6f 72  rev", "VNext" or
12d90 20 22 56 50 72 65 76 22 20 69 6e 73 74 72 75 63   "VPrev" instruc
12da0 74 69 6f 6e 2c 20 69 6e 64 65 6e 74 0a 2a 2a 20  tion, indent.** 
12db0 20 20 20 20 20 20 61 6c 6c 20 6f 70 63 6f 64 65        all opcode
12dc0 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 74  s that occur bet
12dd0 77 65 65 6e 20 74 68 65 20 70 32 20 6a 75 6d 70  ween the p2 jump
12de0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 6e 64   destination and
12df0 20 74 68 65 20 6f 70 63 6f 64 65 0a 2a 2a 20 20   the opcode.**  
12e00 20 20 20 20 20 69 74 73 65 6c 66 20 62 79 20 32       itself by 2
12e10 20 73 70 61 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20   spaces..**.**  
12e20 20 20 20 2a 20 46 6f 72 20 65 61 63 68 20 22 47     * For each "G
12e30 6f 74 6f 22 2c 20 69 66 20 74 68 65 20 6a 75 6d  oto", if the jum
12e40 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  p destination is
12e50 20 65 61 72 6c 69 65 72 20 69 6e 20 74 68 65 20   earlier in the 
12e60 70 72 6f 67 72 61 6d 0a 2a 2a 20 20 20 20 20 20  program.**      
12e70 20 61 6e 64 20 65 6e 64 73 20 6f 6e 20 6f 6e 65   and ends on one
12e80 20 6f 66 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20   of:.**         
12e90 20 59 69 65 6c 64 20 20 53 65 65 6b 47 74 20 20   Yield  SeekGt  
12ea0 53 65 65 6b 4c 74 20 20 52 6f 77 53 65 74 52 65  SeekLt  RowSetRe
12eb0 61 64 20 20 52 65 77 69 6e 64 0a 2a 2a 20 20 20  ad  Rewind.**   
12ec0 20 20 20 20 6f 72 20 69 66 20 74 68 65 20 50 31      or if the P1
12ed0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 6e   parameter is on
12ee0 65 20 69 6e 73 74 65 61 64 20 6f 66 20 7a 65 72  e instead of zer
12ef0 6f 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 6e  o,.**       then
12f00 20 69 6e 64 65 6e 74 20 61 6c 6c 20 6f 70 63 6f   indent all opco
12f10 64 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  des between the 
12f20 65 61 72 6c 69 65 72 20 69 6e 73 74 72 75 63 74  earlier instruct
12f30 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ion.**       and
12f40 20 22 47 6f 74 6f 22 20 62 79 20 32 20 73 70 61   "Goto" by 2 spa
12f50 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ces..*/.static v
12f60 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64 61 74 61  oid explain_data
12f70 5f 70 72 65 70 61 72 65 28 53 68 65 6c 6c 53 74  _prepare(ShellSt
12f80 61 74 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ate *p, sqlite3_
12f90 73 74 6d 74 20 2a 70 53 71 6c 29 7b 0a 20 20 63  stmt *pSql){.  c
12fa0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12fc0 2a 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68  * The text of th
12fd0 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
12fe0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
12ff0 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
13000 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
13010 63 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  check if this is
13020 20 61 6e 20 45 58 50 4c 41 49 4e 20 2a 2f 0a 20   an EXPLAIN */. 
13030 20 69 6e 74 20 2a 61 62 59 69 65 6c 64 20 3d 20   int *abYield = 
13040 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13050 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 20 69   /* True if op i
13060 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64 20 2a 2f  s an OP_Yield */
13070 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20  .  int nAlloc = 
13080 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13090 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
130a0 73 69 7a 65 20 6f 66 20 70 2d 3e 61 69 49 6e 64  size of p->aiInd
130b0 65 6e 74 5b 5d 2c 20 61 62 59 69 65 6c 64 20 2a  ent[], abYield *
130c0 2f 0a 20 20 69 6e 74 20 69 4f 70 3b 20 20 20 20  /.  int iOp;    
130d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130e0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
130f0 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20 70 2d 3e  operation in p->
13100 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 0a 20  aiIndent[] */.. 
13110 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4e   const char *azN
13120 65 78 74 5b 5d 20 3d 20 7b 20 22 4e 65 78 74 22  ext[] = { "Next"
13130 2c 20 22 50 72 65 76 22 2c 20 22 56 50 72 65 76  , "Prev", "VPrev
13140 22 2c 20 22 56 4e 65 78 74 22 2c 20 22 53 6f 72  ", "VNext", "Sor
13150 74 65 72 4e 65 78 74 22 2c 20 30 20 7d 3b 0a 20  terNext", 0 };. 
13160 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 59   const char *azY
13170 69 65 6c 64 5b 5d 20 3d 20 7b 20 22 59 69 65 6c  ield[] = { "Yiel
13180 64 22 2c 20 22 53 65 65 6b 4c 54 22 2c 20 22 53  d", "SeekLT", "S
13190 65 65 6b 47 54 22 2c 20 22 52 6f 77 53 65 74 52  eekGT", "RowSetR
131a0 65 61 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ead",.          
131b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131c0 20 20 22 52 65 77 69 6e 64 22 2c 20 30 20 7d 3b    "Rewind", 0 };
131d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
131e0 7a 47 6f 74 6f 5b 5d 20 3d 20 7b 20 22 47 6f 74  zGoto[] = { "Got
131f0 6f 22 2c 20 30 20 7d 3b 0a 0a 20 20 2f 2a 20 54  o", 0 };..  /* T
13200 72 79 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  ry to figure out
13210 20 69 66 20 74 68 69 73 20 69 73 20 72 65 61 6c   if this is real
13220 6c 79 20 61 6e 20 45 58 50 4c 41 49 4e 20 73 74  ly an EXPLAIN st
13230 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 69 73  atement. If this
13240 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  .  ** cannot be 
13250 76 65 72 69 66 69 65 64 2c 20 72 65 74 75 72 6e  verified, return
13260 20 65 61 72 6c 79 2e 20 20 2a 2f 0a 20 20 69 66   early.  */.  if
13270 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
13280 5f 63 6f 75 6e 74 28 70 53 71 6c 29 21 3d 38 20  _count(pSql)!=8 
13290 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20  ){.    p->cMode 
132a0 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72  = p->mode;.    r
132b0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 53 71  eturn;.  }.  zSq
132c0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28  l = sqlite3_sql(
132d0 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a 53 71  pSql);.  if( zSq
132e0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  l==0 ) return;. 
132f0 20 66 6f 72 28 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d   for(z=zSql; *z=
13300 3d 27 20 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27  =' ' || *z=='\t'
13310 20 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27 20 7c 7c 20   || *z=='\n' || 
13320 2a 7a 3d 3d 27 5c 66 27 20 7c 7c 20 2a 7a 3d 3d  *z=='\f' || *z==
13330 27 5c 72 27 3b 20 7a 2b 2b 29 3b 0a 20 20 69 66  '\r'; z++);.  if
13340 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ( sqlite3_strnic
13350 6d 70 28 7a 2c 20 22 65 78 70 6c 61 69 6e 22 2c  mp(z, "explain",
13360 20 37 29 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d   7) ){.    p->cM
13370 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ode = p->mode;. 
13380 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
13390 20 20 66 6f 72 28 69 4f 70 3d 30 3b 20 53 51 4c    for(iOp=0; SQL
133a0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
133b0 5f 73 74 65 70 28 70 53 71 6c 29 3b 20 69 4f 70  _step(pSql); iOp
133c0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ++){.    int i;.
133d0 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20      int iAddr = 
133e0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
133f0 6e 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20  nt(pSql, 0);.   
13400 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
13410 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
13420 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
13430 65 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a 0a 20  ext(pSql, 1);.. 
13440 20 20 20 2f 2a 20 53 65 74 20 70 32 20 74 6f 20     /* Set p2 to 
13450 74 68 65 20 50 32 20 66 69 65 6c 64 20 6f 66 20  the P2 field of 
13460 74 68 65 20 63 75 72 72 65 6e 74 20 6f 70 63 6f  the current opco
13470 64 65 2e 20 54 68 65 6e 2c 20 61 73 73 75 6d 69  de. Then, assumi
13480 6e 67 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 70  ng that.    ** p
13490 32 20 69 73 20 61 6e 20 69 6e 73 74 72 75 63 74  2 is an instruct
134a0 69 6f 6e 20 61 64 64 72 65 73 73 2c 20 73 65 74  ion address, set
134b0 20 76 61 72 69 61 62 6c 65 20 70 32 6f 70 20 74   variable p2op t
134c0 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
134d0 68 61 74 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72  hat.    ** instr
134e0 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 69  uction in the ai
134f0 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79 2e 20  Indent[] array. 
13500 70 32 20 61 6e 64 20 70 32 6f 70 20 6d 61 79 20  p2 and p2op may 
13510 62 65 20 64 69 66 66 65 72 65 6e 74 20 69 66 0a  be different if.
13520 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
13530 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  nt instruction i
13540 73 20 70 61 72 74 20 6f 66 20 61 20 73 75 62 2d  s part of a sub-
13550 70 72 6f 67 72 61 6d 20 67 65 6e 65 72 61 74 65  program generate
13560 64 20 62 79 20 61 6e 0a 20 20 20 20 2a 2a 20 53  d by an.    ** S
13570 51 4c 20 74 72 69 67 67 65 72 20 6f 72 20 66 6f  QL trigger or fo
13580 72 65 69 67 6e 20 6b 65 79 2e 20 20 2a 2f 0a 20  reign key.  */. 
13590 20 20 20 69 6e 74 20 70 32 20 3d 20 73 71 6c 69     int p2 = sqli
135a0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
135b0 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20 69 6e 74  Sql, 3);.    int
135c0 20 70 32 6f 70 20 3d 20 28 70 32 20 2b 20 28 69   p2op = (p2 + (i
135d0 4f 70 2d 69 41 64 64 72 29 29 3b 0a 0a 20 20 20  Op-iAddr));..   
135e0 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 70 2d 3e   /* Grow the p->
135f0 61 69 49 6e 64 65 6e 74 20 61 72 72 61 79 20 61  aiIndent array a
13600 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
13610 20 20 69 66 28 20 69 4f 70 3e 3d 6e 41 6c 6c 6f    if( iOp>=nAllo
13620 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  c ){.      if( i
13630 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Op==0 ){.       
13640 20 2f 2a 20 44 6f 20 66 75 72 74 68 65 72 20 76   /* Do further v
13650 65 72 66 69 63 61 74 69 6f 6e 20 74 68 61 74 20  erfication that 
13660 74 68 69 73 20 69 73 20 65 78 70 6c 61 69 6e 20  this is explain 
13670 6f 75 74 70 75 74 2e 20 20 41 62 6f 72 74 20 69  output.  Abort i
13680 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  f.        ** it 
13690 69 73 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20  is not */.      
136a0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
136b0 68 61 72 20 2a 65 78 70 6c 61 69 6e 43 6f 6c 73  har *explainCols
136c0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
136d0 20 20 22 61 64 64 72 22 2c 20 22 6f 70 63 6f 64    "addr", "opcod
136e0 65 22 2c 20 22 70 31 22 2c 20 22 70 32 22 2c 20  e", "p1", "p2", 
136f0 22 70 33 22 2c 20 22 70 34 22 2c 20 22 70 35 22  "p3", "p4", "p5"
13700 2c 20 22 63 6f 6d 6d 65 6e 74 22 20 7d 3b 0a 20  , "comment" };. 
13710 20 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20         int jj;. 
13720 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b         for(jj=0;
13730 20 6a 6a 3c 41 72 72 61 79 53 69 7a 65 28 65 78   jj<ArraySize(ex
13740 70 6c 61 69 6e 43 6f 6c 73 29 3b 20 6a 6a 2b 2b  plainCols); jj++
13750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
13760 20 73 74 72 63 6d 70 28 73 71 6c 69 74 65 33 5f   strcmp(sqlite3_
13770 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 71 6c  column_name(pSql
13780 2c 6a 6a 29 2c 65 78 70 6c 61 69 6e 43 6f 6c 73  ,jj),explainCols
13790 5b 6a 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20  [jj])!=0 ){.    
137a0 20 20 20 20 20 20 20 20 70 2d 3e 63 4d 6f 64 65          p->cMode
137b0 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20   = p->mode;.    
137c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
137d0 72 65 73 65 74 28 70 53 71 6c 29 3b 0a 20 20 20  reset(pSql);.   
137e0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
137f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
13800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13810 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31       nAlloc += 1
13820 30 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 69 49  00;.      p->aiI
13830 6e 64 65 6e 74 20 3d 20 28 69 6e 74 2a 29 73 71  ndent = (int*)sq
13840 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
13850 70 2d 3e 61 69 49 6e 64 65 6e 74 2c 20 6e 41 6c  p->aiIndent, nAl
13860 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29  loc*sizeof(int))
13870 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  ;.      if( p->a
13880 69 49 6e 64 65 6e 74 3d 3d 30 20 29 20 73 68 65  iIndent==0 ) she
13890 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79  ll_out_of_memory
138a0 28 29 3b 0a 20 20 20 20 20 20 61 62 59 69 65 6c  ();.      abYiel
138b0 64 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65  d = (int*)sqlite
138c0 33 5f 72 65 61 6c 6c 6f 63 36 34 28 61 62 59 69  3_realloc64(abYi
138d0 65 6c 64 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65  eld, nAlloc*size
138e0 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20  of(int));.      
138f0 69 66 28 20 61 62 59 69 65 6c 64 3d 3d 30 20 29  if( abYield==0 )
13900 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65   shell_out_of_me
13910 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20  mory();.    }.  
13920 20 20 61 62 59 69 65 6c 64 5b 69 4f 70 5d 20 3d    abYield[iOp] =
13930 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f   str_in_array(zO
13940 70 2c 20 61 7a 59 69 65 6c 64 29 3b 0a 20 20 20  p, azYield);.   
13950 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 4f 70   p->aiIndent[iOp
13960 5d 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 49  ] = 0;.    p->nI
13970 6e 64 65 6e 74 20 3d 20 69 4f 70 2b 31 3b 0a 0a  ndent = iOp+1;..
13980 20 20 20 20 69 66 28 20 73 74 72 5f 69 6e 5f 61      if( str_in_a
13990 72 72 61 79 28 7a 4f 70 2c 20 61 7a 4e 65 78 74  rray(zOp, azNext
139a0 29 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ) ){.      for(i
139b0 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b  =p2op; i<iOp; i+
139c0 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69  +) p->aiIndent[i
139d0 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  ] += 2;.    }.  
139e0 20 20 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72    if( str_in_arr
139f0 61 79 28 7a 4f 70 2c 20 61 7a 47 6f 74 6f 29 20  ay(zOp, azGoto) 
13a00 26 26 20 70 32 6f 70 3c 70 2d 3e 6e 49 6e 64 65  && p2op<p->nInde
13a10 6e 74 0a 20 20 20 20 20 26 26 20 28 61 62 59 69  nt.     && (abYi
13a20 65 6c 64 5b 70 32 6f 70 5d 20 7c 7c 20 73 71 6c  eld[p2op] || sql
13a30 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
13a40 70 53 71 6c 2c 20 32 29 29 0a 20 20 20 20 29 7b  pSql, 2)).    ){
13a50 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 32 6f  .      for(i=p2o
13a60 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70  p; i<iOp; i++) p
13a70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d  ->aiIndent[i] +=
13a80 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   2;.    }.  }.. 
13a90 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b   p->iIndent = 0;
13aa0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
13ab0 61 62 59 69 65 6c 64 29 3b 0a 20 20 73 71 6c 69  abYield);.  sqli
13ac0 74 65 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b  te3_reset(pSql);
13ad0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
13ae0 68 65 20 61 72 72 61 79 20 61 6c 6c 6f 63 61 74  he array allocat
13af0 65 64 20 62 79 20 65 78 70 6c 61 69 6e 5f 64 61  ed by explain_da
13b00 74 61 5f 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f  ta_prepare()..*/
13b10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
13b20 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65  lain_data_delete
13b30 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
13b40 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
13b50 70 2d 3e 61 69 49 6e 64 65 6e 74 29 3b 0a 20 20  p->aiIndent);.  
13b60 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d 20 30 3b  p->aiIndent = 0;
13b70 0a 20 20 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20  .  p->nIndent = 
13b80 30 3b 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20  0;.  p->iIndent 
13b90 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  = 0;.}../*.** Di
13ba0 73 61 62 6c 65 20 61 6e 64 20 72 65 73 74 6f 72  sable and restor
13bb0 65 20 2e 77 68 65 72 65 74 72 61 63 65 20 61 6e  e .wheretrace an
13bc0 64 20 2e 73 65 6c 65 63 74 74 72 61 63 65 20 73  d .selecttrace s
13bd0 65 74 74 69 6e 67 73 2e 0a 2a 2f 0a 23 69 66 20  ettings..*/.#if 
13be0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
13bf0 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64  EBUG) && defined
13c00 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
13c10 45 4c 45 43 54 54 52 41 43 45 29 0a 65 78 74 65  ELECTTRACE).exte
13c20 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 53 65  rn int sqlite3Se
13c30 6c 65 63 74 54 72 61 63 65 3b 0a 73 74 61 74 69  lectTrace;.stati
13c40 63 20 69 6e 74 20 73 61 76 65 64 53 65 6c 65 63  c int savedSelec
13c50 74 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23  tTrace;.#endif.#
13c60 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
13c70 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
13c80 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
13c90 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a 65 78  E_WHERETRACE).ex
13ca0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
13cb0 57 68 65 72 65 54 72 61 63 65 3b 0a 73 74 61 74  WhereTrace;.stat
13cc0 69 63 20 69 6e 74 20 73 61 76 65 64 57 68 65 72  ic int savedWher
13cd0 65 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 73  eTrace;.#endif.s
13ce0 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62  tatic void disab
13cf0 6c 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d  le_debug_trace_m
13d00 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23 69 66 20  odes(void){.#if 
13d10 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
13d20 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64  EBUG) && defined
13d30 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
13d40 45 4c 45 43 54 54 52 41 43 45 29 0a 20 20 73 61  ELECTTRACE).  sa
13d50 76 65 64 53 65 6c 65 63 74 54 72 61 63 65 20 3d  vedSelectTrace =
13d60 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
13d70 61 63 65 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ace;.  sqlite3Se
13d80 6c 65 63 74 54 72 61 63 65 20 3d 20 30 3b 0a 23  lectTrace = 0;.#
13d90 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
13da0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
13db0 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
13dc0 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52  E_ENABLE_WHERETR
13dd0 41 43 45 29 0a 20 20 73 61 76 65 64 57 68 65 72  ACE).  savedWher
13de0 65 54 72 61 63 65 20 3d 20 73 71 6c 69 74 65 33  eTrace = sqlite3
13df0 57 68 65 72 65 54 72 61 63 65 3b 0a 20 20 73 71  WhereTrace;.  sq
13e00 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
13e10 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 73 74  = 0;.#endif.}.st
13e20 61 74 69 63 20 76 6f 69 64 20 72 65 73 74 6f 72  atic void restor
13e30 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f  e_debug_trace_mo
13e40 64 65 73 28 76 6f 69 64 29 7b 0a 23 69 66 20 64  des(void){.#if d
13e50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
13e60 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
13e70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
13e80 4c 45 43 54 54 52 41 43 45 29 0a 20 20 73 71 6c  LECTTRACE).  sql
13e90 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
13ea0 3d 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61  = savedSelectTra
13eb0 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ce;.#endif.#if d
13ec0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
13ed0 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
13ee0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48  SQLITE_ENABLE_WH
13ef0 45 52 45 54 52 41 43 45 29 0a 20 20 73 71 6c 69  ERETRACE).  sqli
13f00 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
13f10 73 61 76 65 64 57 68 65 72 65 54 72 61 63 65 3b  savedWhereTrace;
13f20 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
13f30 20 52 75 6e 20 61 20 70 72 65 70 61 72 65 64 20   Run a prepared 
13f40 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 73 74 61  statement.*/.sta
13f50 74 69 63 20 76 6f 69 64 20 65 78 65 63 5f 70 72  tic void exec_pr
13f60 65 70 61 72 65 64 5f 73 74 6d 74 28 0a 20 20 53  epared_stmt(.  S
13f70 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c  hellState *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 20 20 20 20 20 20 20 20 20 20                  
13fa0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68  /* Pointer to Sh
13fb0 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 73 71  ellState */.  sq
13fc0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
13fd0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
13fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13ff0 2a 20 53 74 61 74 6d 65 6e 74 20 74 6f 20 72 75  * Statment to ru
14000 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  n */.){.  int rc
14010 3b 0a 0a 20 20 2f 2a 20 70 65 72 66 6f 72 6d 20  ;..  /* perform 
14020 74 68 65 20 66 69 72 73 74 20 73 74 65 70 2e 20  the first step. 
14030 20 74 68 69 73 20 77 69 6c 6c 20 74 65 6c 6c 20   this will tell 
14040 75 73 20 69 66 20 77 65 0a 20 20 2a 2a 20 68 61  us if we.  ** ha
14050 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 20  ve a result set 
14060 6f 72 20 6e 6f 74 20 61 6e 64 20 68 6f 77 20 77  or not and how w
14070 69 64 65 20 69 74 20 69 73 2e 0a 20 20 2a 2f 0a  ide it is..  */.
14080 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
14090 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a  tep(pStmt);.  /*
140a0 20 69 66 20 77 65 20 68 61 76 65 20 61 20 72 65   if we have a re
140b0 73 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f 0a 20  sult set... */. 
140c0 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20   if( SQLITE_ROW 
140d0 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 2f 2a 20  == rc ){.    /* 
140e0 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
140f0 6f 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74 72 2c  or col name ptr,
14100 20 76 61 6c 75 65 20 70 74 72 2c 20 61 6e 64 20   value ptr, and 
14110 74 79 70 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  type */.    int 
14120 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
14130 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
14140 74 29 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44  t);.    void *pD
14150 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ata = sqlite3_ma
14160 6c 6c 6f 63 36 34 28 33 2a 6e 43 6f 6c 2a 73 69  lloc64(3*nCol*si
14170 7a 65 6f 66 28 63 6f 6e 73 74 20 63 68 61 72 2a  zeof(const char*
14180 29 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ) + 1);.    if( 
14190 21 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  !pData ){.      
141a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
141b0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
141c0 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c      char **azCol
141d0 73 20 3d 20 28 63 68 61 72 20 2a 2a 29 70 44 61  s = (char **)pDa
141e0 74 61 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ta;      /* Name
141f0 73 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  s of result colu
14200 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  mns */.      cha
14210 72 20 2a 2a 61 7a 56 61 6c 73 20 3d 20 26 61 7a  r **azVals = &az
14220 43 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20 20 20  Cols[nCol];     
14230 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a 2f 0a    /* Results */.
14240 20 20 20 20 20 20 69 6e 74 20 2a 61 69 54 79 70        int *aiTyp
14250 65 73 20 3d 20 28 69 6e 74 20 2a 29 26 61 7a 56  es = (int *)&azV
14260 61 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20 52 65  als[nCol]; /* Re
14270 73 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a 20 20  sult types */.  
14280 20 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20      int i, x;.  
14290 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f      assert(sizeo
142a0 66 28 69 6e 74 29 20 3c 3d 20 73 69 7a 65 6f 66  f(int) <= sizeof
142b0 28 63 68 61 72 20 2a 29 29 3b 0a 20 20 20 20 20  (char *));.     
142c0 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 70 74 72   /* save off ptr
142d0 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s to column name
142e0 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69  s */.      for(i
142f0 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
14300 7b 0a 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 73  {.        azCols
14310 5b 69 5d 20 3d 20 28 63 68 61 72 20 2a 29 73 71  [i] = (char *)sq
14320 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
14330 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  e(pStmt, i);.   
14340 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 7b 0a 20     }.      do{. 
14350 20 20 20 20 20 20 20 2f 2a 20 65 78 74 72 61 63         /* extrac
14360 74 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 64  t the data and d
14370 61 74 61 20 74 79 70 65 73 20 2a 2f 0a 20 20 20  ata types */.   
14380 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
14390 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
143a0 20 20 20 20 20 20 61 69 54 79 70 65 73 5b 69 5d        aiTypes[i]
143b0 20 3d 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 63   = x = sqlite3_c
143c0 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74  olumn_type(pStmt
143d0 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
143e0 69 66 28 20 78 3d 3d 53 51 4c 49 54 45 5f 42 4c  if( x==SQLITE_BL
143f0 4f 42 20 26 26 20 70 41 72 67 20 26 26 20 70 41  OB && pArg && pA
14400 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f  rg->cMode==MODE_
14410 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 20 20  Insert ){.      
14420 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20        azVals[i] 
14430 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20  = "";.          
14440 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
14450 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 28     azVals[i] = (
14460 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
14470 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
14480 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   i);.          }
14490 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
144a0 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28 61 69  azVals[i] && (ai
144b0 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49 54 45  Types[i]!=SQLITE
144c0 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  _NULL) ){.      
144d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
144e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
144f0 20 20 20 20 20 62 72 65 61 6b 3b 20 2f 2a 20 66       break; /* f
14500 72 6f 6d 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20  rom for */.     
14510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
14520 20 2f 2a 20 65 6e 64 20 66 6f 72 20 2a 2f 0a 0a   /* end for */..
14530 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 64 61          /* if da
14540 74 61 20 61 6e 64 20 74 79 70 65 73 20 65 78 74  ta and types ext
14550 72 61 63 74 65 64 20 73 75 63 63 65 73 73 66 75  racted successfu
14560 6c 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  lly... */.      
14570 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
14580 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 20 20   == rc ){.      
14590 20 20 20 20 2f 2a 20 63 61 6c 6c 20 74 68 65 20      /* call the 
145a0 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63  supplied callbac
145b0 6b 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c  k with the resul
145c0 74 20 72 6f 77 20 64 61 74 61 20 2a 2f 0a 20 20  t row data */.  
145d0 20 20 20 20 20 20 20 20 69 66 28 20 73 68 65 6c          if( shel
145e0 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c  l_callback(pArg,
145f0 20 6e 43 6f 6c 2c 20 61 7a 56 61 6c 73 2c 20 61   nCol, azVals, a
14600 7a 43 6f 6c 73 2c 20 61 69 54 79 70 65 73 29 20  zCols, aiTypes) 
14610 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
14620 63 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  c = SQLITE_ABORT
14630 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
14640 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
14650 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
14660 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
14670 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
14680 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 53 51       } while( SQ
14690 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29  LITE_ROW == rc )
146a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
146b0 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20 20  free(pData);.   
146c0 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
146d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
146e0 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
146f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
14700 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
14710 65 73 73 20 53 51 4c 20 69 66 20 74 68 65 20 70  ess SQL if the p
14720 72 65 76 69 6f 75 73 20 73 68 65 6c 6c 20 63 6f  revious shell co
14730 6d 6d 61 6e 64 0a 2a 2a 20 77 61 73 20 22 2e 65  mmand.** was ".e
14740 78 70 65 72 74 22 2e 20 49 74 20 70 61 73 73 65  xpert". It passe
14750 73 20 74 68 65 20 53 51 4c 20 69 6e 20 74 68 65  s the SQL in the
14760 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
14770 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20   directly to.** 
14780 74 68 65 20 73 71 6c 69 74 65 33 65 78 70 65 72  the sqlite3exper
14790 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  t object..**.** 
147a0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
147b0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
147c0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
147d0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
147e0 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74 68 69  .** code. In thi
147f0 73 20 63 61 73 65 2c 20 28 2a 70 7a 45 72 72 29  s case, (*pzErr)
14800 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70   may be set to p
14810 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
14820 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61   containing.** a
14830 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  n English langua
14840 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ge error message
14850 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
14860 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
14870 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65  e.** caller to e
14880 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74  ventually free t
14890 68 69 73 20 62 75 66 66 65 72 20 75 73 69 6e 67  his buffer using
148a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
148b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
148c0 78 70 65 72 74 48 61 6e 64 6c 65 53 51 4c 28 0a  xpertHandleSQL(.
148d0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
148e0 74 61 74 65 2c 20 0a 20 20 63 6f 6e 73 74 20 63  tate, .  const c
148f0 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 63 68  har *zSql, .  ch
14900 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
14910 61 73 73 65 72 74 28 20 70 53 74 61 74 65 2d 3e  assert( pState->
14920 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 29  expert.pExpert )
14930 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a 45 72  ;.  assert( pzEr
14940 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d  r==0 || *pzErr==
14950 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
14960 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 73 71 6c  lite3_expert_sql
14970 28 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e  (pState->expert.
14980 70 45 78 70 65 72 74 2c 20 7a 53 71 6c 2c 20 70  pExpert, zSql, p
14990 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zErr);.}../*.** 
149a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
149b0 20 63 61 6c 6c 65 64 20 65 69 74 68 65 72 20 74   called either t
149c0 6f 20 73 69 6c 65 6e 74 6c 79 20 63 6c 65 61 6e  o silently clean
149d0 20 75 70 20 74 68 65 20 6f 62 6a 65 63 74 0a 2a   up the object.*
149e0 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  * created by the
149f0 20 22 2e 65 78 70 65 72 74 22 20 63 6f 6d 6d 61   ".expert" comma
14a00 6e 64 20 28 69 66 20 62 43 61 6e 63 65 6c 3d 3d  nd (if bCancel==
14a10 31 29 2c 20 6f 72 20 74 6f 20 67 65 6e 65 72 61  1), or to genera
14a20 74 65 20 61 20 0a 2a 2a 20 72 65 70 6f 72 74 20  te a .** report 
14a30 66 72 6f 6d 20 69 74 20 61 6e 64 20 74 68 65 6e  from it and then
14a40 20 63 6c 65 61 6e 20 69 74 20 75 70 20 28 69 66   clean it up (if
14a50 20 62 43 61 6e 63 65 6c 3d 3d 30 29 2e 0a 2a 2a   bCancel==0)..**
14a60 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
14a70 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
14a80 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
14a90 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
14aa0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e  rror.** code. In
14ab0 20 74 68 69 73 20 63 61 73 65 2c 20 28 2a 70 7a   this case, (*pz
14ac0 45 72 72 29 20 6d 61 79 20 62 65 20 73 65 74 20  Err) may be set 
14ad0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
14ae0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ffer containing.
14af0 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61  ** an English la
14b00 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d 65 73  nguage error mes
14b10 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20  sage. It is the 
14b20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
14b30 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
14b40 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
14b50 65 65 20 74 68 69 73 20 62 75 66 66 65 72 20 75  ee this buffer u
14b60 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  sing sqlite3_fre
14b70 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
14b80 6e 74 20 65 78 70 65 72 74 46 69 6e 69 73 68 28  nt expertFinish(
14b90 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
14ba0 53 74 61 74 65 2c 0a 20 20 69 6e 74 20 62 43 61  State,.  int bCa
14bb0 6e 63 65 6c 2c 0a 20 20 63 68 61 72 20 2a 2a 70  ncel,.  char **p
14bc0 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63  zErr.){.  int rc
14bd0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14be0 73 71 6c 69 74 65 33 65 78 70 65 72 74 20 2a 70  sqlite3expert *p
14bf0 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72   = pState->exper
14c00 74 2e 70 45 78 70 65 72 74 3b 0a 20 20 61 73 73  t.pExpert;.  ass
14c10 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65  ert( p );.  asse
14c20 72 74 28 20 62 43 61 6e 63 65 6c 20 7c 7c 20 70  rt( bCancel || p
14c30 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72  zErr==0 || *pzEr
14c40 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 62 43  r==0 );.  if( bC
14c50 61 6e 63 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ancel==0 ){.    
14c60 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53 74 61  FILE *out = pSta
14c70 74 65 2d 3e 6f 75 74 3b 0a 20 20 20 20 69 6e 74  te->out;.    int
14c80 20 62 56 65 72 62 6f 73 65 20 3d 20 70 53 74 61   bVerbose = pSta
14c90 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62  te->expert.bVerb
14ca0 6f 73 65 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  ose;..    rc = s
14cb0 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 61 6e  qlite3_expert_an
14cc0 61 6c 79 7a 65 28 70 2c 20 70 7a 45 72 72 29 3b  alyze(p, pzErr);
14cd0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14ce0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14cf0 69 6e 74 20 6e 51 75 65 72 79 20 3d 20 73 71 6c  int nQuery = sql
14d00 69 74 65 33 5f 65 78 70 65 72 74 5f 63 6f 75 6e  ite3_expert_coun
14d10 74 28 70 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  t(p);.      int 
14d20 69 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 62 56  i;..      if( bV
14d30 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
14d40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
14d50 61 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  and = sqlite3_ex
14d60 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 30 2c  pert_report(p,0,
14d70 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 43 41  EXPERT_REPORT_CA
14d80 4e 44 49 44 41 54 45 53 29 3b 0a 20 20 20 20 20  NDIDATES);.     
14d90 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
14da0 74 2c 20 22 2d 2d 20 43 61 6e 64 69 64 61 74 65  t, "-- Candidate
14db0 73 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s --------------
14dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c  ---------------\
14dd0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77  n");.        raw
14de0 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
14df0 5c 6e 22 2c 20 7a 43 61 6e 64 29 3b 0a 20 20 20  \n", zCand);.   
14e00 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
14e10 3d 30 3b 20 69 3c 6e 51 75 65 72 79 3b 20 69 2b  =0; i<nQuery; i+
14e20 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
14e30 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73  t char *zSql = s
14e40 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65  qlite3_expert_re
14e50 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45 52  port(p, i, EXPER
14e60 54 5f 52 45 50 4f 52 54 5f 53 51 4c 29 3b 0a 20  T_REPORT_SQL);. 
14e70 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
14e80 72 20 2a 7a 49 64 78 20 3d 20 73 71 6c 69 74 65  r *zIdx = sqlite
14e90 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28  3_expert_report(
14ea0 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50  p, i, EXPERT_REP
14eb0 4f 52 54 5f 49 4e 44 45 58 45 53 29 3b 0a 20 20  ORT_INDEXES);.  
14ec0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
14ed0 20 2a 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33   *zEQP = sqlite3
14ee0 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70  _expert_report(p
14ef0 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f  , i, EXPERT_REPO
14f00 52 54 5f 50 4c 41 4e 29 3b 0a 20 20 20 20 20 20  RT_PLAN);.      
14f10 20 20 69 66 28 20 7a 49 64 78 3d 3d 30 20 29 20    if( zIdx==0 ) 
14f20 7a 49 64 78 20 3d 20 22 28 6e 6f 20 6e 65 77 20  zIdx = "(no new 
14f30 69 6e 64 65 78 65 73 29 5c 6e 22 3b 0a 20 20 20  indexes)\n";.   
14f40 20 20 20 20 20 69 66 28 20 62 56 65 72 62 6f 73       if( bVerbos
14f50 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
14f60 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
14f70 2d 2d 20 51 75 65 72 79 20 25 64 20 2d 2d 2d 2d  -- Query %d ----
14f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c  ------------\n",
14fa0 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  i+1);.          
14fb0 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
14fc0 22 25 73 5c 6e 5c 6e 22 2c 20 7a 53 71 6c 29 3b  "%s\n\n", zSql);
14fd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14fe0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
14ff0 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 64 78 29  t, "%s\n", zIdx)
15000 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  ;.        raw_pr
15010 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22  intf(out, "%s\n"
15020 2c 20 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 7d  , zEQP);.      }
15030 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
15040 69 74 65 33 5f 65 78 70 65 72 74 5f 64 65 73 74  ite3_expert_dest
15050 72 6f 79 28 70 29 3b 0a 20 20 70 53 74 61 74 65  roy(p);.  pState
15060 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
15070 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
15080 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
15090 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e  ementation of ".
150a0 65 78 70 65 72 74 22 20 64 6f 74 20 63 6f 6d 6d  expert" dot comm
150b0 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  and..*/.static i
150c0 6e 74 20 65 78 70 65 72 74 44 6f 74 43 6f 6d 6d  nt expertDotComm
150d0 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  and(.  ShellStat
150e0 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20  e *pState,      
150f0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
15100 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61  t shell tool sta
15110 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  te */.  char **a
15120 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  zArg,           
15130 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
15140 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61   of arguments pa
15150 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d  ssed to dot comm
15160 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  and */.  int nAr
15170 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
15180 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
15190 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
151a0 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20   azArg[] */.){. 
151b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
151c0 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  _OK;.  char *zEr
151d0 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  r = 0;.  int i;.
151e0 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 20 3d 20    int iSample = 
151f0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  0;..  assert( pS
15200 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
15210 70 65 72 74 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d  pert==0 );.  mem
15220 73 65 74 28 26 70 53 74 61 74 65 2d 3e 65 78 70  set(&pState->exp
15230 65 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  ert, 0, sizeof(E
15240 78 70 65 72 74 49 6e 66 6f 29 29 3b 0a 0a 20 20  xpertInfo));..  
15250 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c  for(i=1; rc==SQL
15260 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41 72 67  ITE_OK && i<nArg
15270 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
15280 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a   *z = azArg[i];.
15290 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69      int n;.    i
152a0 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20  f( z[0]=='-' && 
152b0 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[1]=='-' ) z++;
152c0 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33  .    n = strlen3
152d0 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e  0(z);.    if( n>
152e0 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70  =2 && 0==strncmp
152f0 28 7a 2c 20 22 2d 76 65 72 62 6f 73 65 22 2c 20  (z, "-verbose", 
15300 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 53 74 61  n) ){.      pSta
15310 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62  te->expert.bVerb
15320 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ose = 1;.    }. 
15330 20 20 20 65 6c 73 65 20 69 66 28 20 6e 3e 3d 32     else if( n>=2
15340 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28 7a   && 0==strncmp(z
15350 2c 20 22 2d 73 61 6d 70 6c 65 22 2c 20 6e 29 20  , "-sample", n) 
15360 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  ){.      if( i==
15370 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20  (nArg-1) ){.    
15380 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
15390 74 64 65 72 72 2c 20 22 6f 70 74 69 6f 6e 20 72  tderr, "option r
153a0 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d  equires an argum
153b0 65 6e 74 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  ent: %s\n", z);.
153c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
153d0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
153e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
153f0 69 53 61 6d 70 6c 65 20 3d 20 28 69 6e 74 29 69  iSample = (int)i
15400 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72  ntegerValue(azAr
15410 67 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20 20  g[++i]);.       
15420 20 69 66 28 20 69 53 61 6d 70 6c 65 3c 30 20 7c   if( iSample<0 |
15430 7c 20 69 53 61 6d 70 6c 65 3e 31 30 30 20 29 7b  | iSample>100 ){
15440 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
15450 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 76  rintf(stderr, "v
15460 61 6c 75 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  alue out of rang
15470 65 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b  e: %s\n", azArg[
15480 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  i]);.          r
15490 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
154a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
154b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c    }.    }.    el
154c0 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
154d0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e  intf(stderr, "un
154e0 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73  known option: %s
154f0 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72  \n", z);.      r
15500 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
15510 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
15520 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15530 20 29 7b 0a 20 20 20 20 70 53 74 61 74 65 2d 3e   ){.    pState->
15540 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 3d  expert.pExpert =
15550 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
15560 6e 65 77 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  new(pState->db, 
15570 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  &zErr);.    if( 
15580 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
15590 45 78 70 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20  Expert==0 ){.   
155a0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
155b0 64 65 72 72 2c 20 22 73 71 6c 69 74 65 33 5f 65  derr, "sqlite3_e
155c0 78 70 65 72 74 5f 6e 65 77 3a 20 25 73 5c 6e 22  xpert_new: %s\n"
155d0 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 72  , zErr);.      r
155e0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
155f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15600 20 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72     sqlite3_exper
15610 74 5f 63 6f 6e 66 69 67 28 0a 20 20 20 20 20 20  t_config(.      
15620 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65      pState->expe
15630 72 74 2e 70 45 78 70 65 72 74 2c 20 45 58 50 45  rt.pExpert, EXPE
15640 52 54 5f 43 4f 4e 46 49 47 5f 53 41 4d 50 4c 45  RT_CONFIG_SAMPLE
15650 2c 20 69 53 61 6d 70 6c 65 0a 20 20 20 20 20 20  , iSample.      
15660 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
15670 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
15680 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  dif /* ifndef SQ
15690 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
156a0 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LTABLE */../*.**
156b0 20 45 78 65 63 75 74 65 20 61 20 73 74 61 74 65   Execute a state
156c0 6d 65 6e 74 20 6f 72 20 73 65 74 20 6f 66 20 73  ment or set of s
156d0 74 61 74 65 6d 65 6e 74 73 2e 20 20 50 72 69 6e  tatements.  Prin
156e0 74 0a 2a 2a 20 61 6e 79 20 72 65 73 75 6c 74 20  t.** any result 
156f0 72 6f 77 73 2f 63 6f 6c 75 6d 6e 73 20 64 65 70  rows/columns dep
15700 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 63 75  ending on the cu
15710 72 72 65 6e 74 20 6d 6f 64 65 0a 2a 2a 20 73 65  rrent mode.** se
15720 74 20 76 69 61 20 74 68 65 20 73 75 70 70 6c 69  t via the suppli
15730 65 64 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  ed callback..**.
15740 2a 2a 20 54 68 69 73 20 69 73 20 76 65 72 79 20  ** This is very 
15750 73 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c 69 74  similar to SQLit
15760 65 27 73 20 62 75 69 6c 74 2d 69 6e 20 73 71 6c  e's built-in sql
15770 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66  ite3_exec().** f
15780 75 6e 63 74 69 6f 6e 20 65 78 63 65 70 74 20 69  unction except i
15790 74 20 74 61 6b 65 73 20 61 20 73 6c 69 67 68 74  t takes a slight
157a0 6c 79 20 64 69 66 66 65 72 65 6e 74 20 63 61 6c  ly different cal
157b0 6c 62 61 63 6b 0a 2a 2a 20 61 6e 64 20 63 61 6c  lback.** and cal
157c0 6c 62 61 63 6b 20 64 61 74 61 20 61 72 67 75 6d  lback data argum
157d0 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
157e0 6e 74 20 73 68 65 6c 6c 5f 65 78 65 63 28 0a 20  nt shell_exec(. 
157f0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72   ShellState *pAr
15800 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
15810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
15820 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74  inter to ShellSt
15830 61 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ate */.  const c
15840 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20  har *zSql,      
15850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15860 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20     /* SQL to be 
15870 65 76 61 6c 75 61 74 65 64 20 2a 2f 0a 20 20 63  evaluated */.  c
15880 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20  har **pzErrMsg  
15890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158a0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
158b0 72 20 6d 73 67 20 77 72 69 74 74 65 6e 20 68 65  r msg written he
158c0 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  re */.){.  sqlit
158d0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
158e0 20 4e 55 4c 4c 3b 20 20 20 20 20 2f 2a 20 53 74   NULL;     /* St
158f0 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75  atement to execu
15900 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  te. */.  int rc 
15910 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
15920 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
15930 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
15940 20 72 63 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68   rc2;.  const ch
15950 61 72 20 2a 7a 4c 65 66 74 6f 76 65 72 3b 20 20  ar *zLeftover;  
15960 20 20 20 20 20 20 20 20 2f 2a 20 54 61 69 6c 20          /* Tail 
15970 6f 66 20 75 6e 70 72 6f 63 65 73 73 65 64 20 53  of unprocessed S
15980 51 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  QL */.  sqlite3 
15990 2a 64 62 20 3d 20 70 41 72 67 2d 3e 64 62 3b 0a  *db = pArg->db;.
159a0 0a 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20  .  if( pzErrMsg 
159b0 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67  ){.    *pzErrMsg
159c0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 23 69   = NULL;.  }..#i
159d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
159e0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
159f0 20 69 66 28 20 70 41 72 67 2d 3e 65 78 70 65 72   if( pArg->exper
15a00 74 2e 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20  t.pExpert ){.   
15a10 20 72 63 20 3d 20 65 78 70 65 72 74 48 61 6e 64   rc = expertHand
15a20 6c 65 53 51 4c 28 70 41 72 67 2c 20 7a 53 71 6c  leSQL(pArg, zSql
15a30 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , pzErrMsg);.   
15a40 20 72 65 74 75 72 6e 20 65 78 70 65 72 74 46 69   return expertFi
15a50 6e 69 73 68 28 70 41 72 67 2c 20 28 72 63 21 3d  nish(pArg, (rc!=
15a60 53 51 4c 49 54 45 5f 4f 4b 29 2c 20 70 7a 45 72  SQLITE_OK), pzEr
15a70 72 4d 73 67 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rMsg);.  }.#endi
15a80 66 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c  f..  while( zSql
15a90 5b 30 5d 20 26 26 20 28 53 51 4c 49 54 45 5f 4f  [0] && (SQLITE_O
15aa0 4b 20 3d 3d 20 72 63 29 20 29 7b 0a 20 20 20 20  K == rc) ){.    
15ab0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
15ac0 72 20 2a 7a 53 74 6d 74 53 71 6c 3b 0a 20 20 20  r *zStmtSql;.   
15ad0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
15ae0 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
15af0 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26  l, -1, &pStmt, &
15b00 7a 4c 65 66 74 6f 76 65 72 29 3b 0a 20 20 20 20  zLeftover);.    
15b10 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 20 21 3d  if( SQLITE_OK !=
15b20 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28   rc ){.      if(
15b30 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20   pzErrMsg ){.   
15b40 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
15b50 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62   save_err_msg(db
15b60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
15b70 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
15b80 21 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  !pStmt ){.      
15b90 20 20 2f 2a 20 74 68 69 73 20 68 61 70 70 65 6e    /* this happen
15ba0 73 20 66 6f 72 20 61 20 63 6f 6d 6d 65 6e 74 20  s for a comment 
15bb0 6f 72 20 77 68 69 74 65 2d 73 70 61 63 65 20 2a  or white-space *
15bc0 2f 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d  /.        zSql =
15bd0 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20   zLeftover;.    
15be0 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
15bf0 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53  ce(zSql[0]) ) zS
15c00 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f  ql++;.        co
15c10 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
15c20 20 20 20 20 20 20 7a 53 74 6d 74 53 71 6c 20 3d        zStmtSql =
15c30 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74   sqlite3_sql(pSt
15c40 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  mt);.      if( z
15c50 53 74 6d 74 53 71 6c 3d 3d 30 20 29 20 7a 53 74  StmtSql==0 ) zSt
15c60 6d 74 53 71 6c 20 3d 20 22 22 3b 0a 20 20 20 20  mtSql = "";.    
15c70 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
15c80 28 7a 53 74 6d 74 53 71 6c 5b 30 5d 29 20 29 20  (zStmtSql[0]) ) 
15c90 7a 53 74 6d 74 53 71 6c 2b 2b 3b 0a 0a 20 20 20  zStmtSql++;..   
15ca0 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 74     /* save off t
15cb0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
15cc0 6d 65 6e 74 20 68 61 6e 64 6c 65 20 61 6e 64 20  ment handle and 
15cd0 72 65 73 65 74 20 72 6f 77 20 63 6f 75 6e 74 20  reset row count 
15ce0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
15cf0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72  g ){.        pAr
15d00 67 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74  g->pStmt = pStmt
15d10 3b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e  ;.        pArg->
15d20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  cnt = 0;.      }
15d30 0a 0a 20 20 20 20 20 20 2f 2a 20 65 63 68 6f 20  ..      /* echo 
15d40 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e  the sql statemen
15d50 74 20 69 66 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a  t if echo on */.
15d60 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26        if( pArg &
15d70 26 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70  & ShellHasFlag(p
15d80 41 72 67 2c 20 53 48 46 4c 47 5f 45 63 68 6f 29  Arg, SHFLG_Echo)
15d90 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
15da0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
15db0 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 74 6d 74  t, "%s\n", zStmt
15dc0 53 71 6c 20 3f 20 7a 53 74 6d 74 53 71 6c 20 3a  Sql ? zStmtSql :
15dd0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   zSql);.      }.
15de0 0a 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 74  .      /* Show t
15df0 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  he EXPLAIN QUERY
15e00 20 50 4c 41 4e 20 69 66 20 2e 65 71 70 20 69 73   PLAN if .eqp is
15e10 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28   on */.      if(
15e20 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 61   pArg && pArg->a
15e30 75 74 6f 45 51 50 20 26 26 20 73 71 6c 69 74 65  utoEQP && sqlite
15e40 33 5f 73 74 72 6c 69 6b 65 28 22 45 58 50 4c 41  3_strlike("EXPLA
15e50 49 4e 25 22 2c 7a 53 74 6d 74 53 71 6c 2c 30 29  IN%",zStmtSql,0)
15e60 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
15e70 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78  qlite3_stmt *pEx
15e80 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 63  plain;.        c
15e90 68 61 72 20 2a 7a 45 51 50 3b 0a 20 20 20 20 20  har *zEQP;.     
15ea0 20 20 20 69 6e 74 20 74 72 69 67 67 65 72 45 51     int triggerEQ
15eb0 50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 64  P = 0;.        d
15ec0 69 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61  isable_debug_tra
15ed0 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20  ce_modes();.    
15ee0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63      sqlite3_db_c
15ef0 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45  onfig(db, SQLITE
15f00 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45  _DBCONFIG_TRIGGE
15f10 52 5f 45 51 50 2c 20 2d 31 2c 20 26 74 72 69 67  R_EQP, -1, &trig
15f20 67 65 72 45 51 50 29 3b 0a 20 20 20 20 20 20 20  gerEQP);.       
15f30 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45   if( pArg->autoE
15f40 51 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67  QP>=AUTOEQP_trig
15f50 67 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ger ){.         
15f60 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
15f70 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  ig(db, SQLITE_DB
15f80 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45  CONFIG_TRIGGER_E
15f90 51 50 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  QP, 1, 0);.     
15fa0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 45 51     }.        zEQ
15fb0 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  P = sqlite3_mpri
15fc0 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 51 55 45  ntf("EXPLAIN QUE
15fd0 52 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53 74  RY PLAN %s", zSt
15fe0 6d 74 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20  mtSql);.        
15ff0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
16000 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50  pare_v2(db, zEQP
16010 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c  , -1, &pExplain,
16020 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
16030 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16040 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
16050 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
16060 70 45 78 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54  pExplain)==SQLIT
16070 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20  E_ROW ){.       
16080 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
16090 2a 7a 45 51 50 4c 69 6e 65 20 3d 20 28 63 6f 6e  *zEQPLine = (con
160a0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
160b0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78  _column_text(pEx
160c0 70 6c 61 69 6e 2c 33 29 3b 0a 20 20 20 20 20 20  plain,3);.      
160d0 20 20 20 20 20 20 69 6e 74 20 69 45 71 70 49 64        int iEqpId
160e0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
160f0 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20  n_int(pExplain, 
16100 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
16110 69 6e 74 20 69 50 61 72 65 6e 74 49 64 20 3d 20  int iParentId = 
16120 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
16130 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b  nt(pExplain, 1);
16140 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
16150 20 7a 45 51 50 4c 69 6e 65 5b 30 5d 3d 3d 27 2d   zEQPLine[0]=='-
16160 27 20 29 20 65 71 70 5f 72 65 6e 64 65 72 28 70  ' ) eqp_render(p
16170 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Arg);.          
16180 20 20 65 71 70 5f 61 70 70 65 6e 64 28 70 41 72    eqp_append(pAr
16190 67 2c 20 69 45 71 70 49 64 2c 20 69 50 61 72 65  g, iEqpId, iPare
161a0 6e 74 49 64 2c 20 7a 45 51 50 4c 69 6e 65 29 3b  ntId, zEQPLine);
161b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
161c0 20 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65         eqp_rende
161d0 72 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20  r(pArg);.       
161e0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
161f0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70  e3_finalize(pExp
16200 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lain);.        s
16210 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 51 50  qlite3_free(zEQP
16220 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
16230 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55  Arg->autoEQP>=AU
16240 54 4f 45 51 50 5f 66 75 6c 6c 20 29 7b 0a 20 20  TOEQP_full ){.  
16250 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20          /* Also 
16260 64 6f 20 61 6e 20 45 58 50 4c 41 49 4e 20 66 6f  do an EXPLAIN fo
16270 72 20 22 2e 65 71 70 20 66 75 6c 6c 22 20 6d 6f  r ".eqp full" mo
16280 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  de */.          
16290 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zEQP = sqlite3_m
162a0 70 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20  printf("EXPLAIN 
162b0 25 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a  %s", zStmtSql);.
162c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
162d0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
162e0 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20  2(db, zEQP, -1, 
162f0 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20  &pExplain, 0);. 
16300 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
16310 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16320 20 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e            pArg->
16330 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70  cMode = MODE_Exp
16340 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lain;.          
16350 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70    explain_data_p
16360 72 65 70 61 72 65 28 70 41 72 67 2c 20 70 45 78  repare(pArg, pEx
16370 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  plain);.        
16380 20 20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65      exec_prepare
16390 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 45 78  d_stmt(pArg, pEx
163a0 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  plain);.        
163b0 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61      explain_data
163c0 5f 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a 20  _delete(pArg);. 
163d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
163e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
163f0 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b  alize(pExplain);
16400 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16410 65 33 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20  e3_free(zEQP);. 
16420 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16430 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45   if( pArg->autoE
16440 51 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67  QP>=AUTOEQP_trig
16450 67 65 72 20 26 26 20 74 72 69 67 67 65 72 45 51  ger && triggerEQ
16460 50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  P==0 ){.        
16470 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
16480 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  fig(db, SQLITE_D
16490 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f  BCONFIG_TRIGGER_
164a0 45 51 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  EQP, 0, 0);.    
164b0 20 20 20 20 20 20 2f 2a 20 52 65 70 72 65 70 61        /* Reprepa
164c0 72 65 20 70 53 74 6d 74 20 62 65 66 6f 72 65 20  re pStmt before 
164d0 72 65 61 63 74 69 76 69 6e 67 20 74 72 61 63 65  reactiving trace
164e0 20 6d 6f 64 65 73 20 2a 2f 0a 20 20 20 20 20 20   modes */.      
164f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
16500 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
16510 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
16520 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
16530 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
16540 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
16550 28 20 70 41 72 67 20 29 20 70 41 72 67 2d 3e 70  ( pArg ) pArg->p
16560 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
16570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16580 72 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72  restore_debug_tr
16590 61 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20  ace_modes();.   
165a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
165b0 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  pArg ){.        
165c0 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 70 41  pArg->cMode = pA
165d0 72 67 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20  rg->mode;.      
165e0 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f    if( pArg->auto
165f0 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20  Explain ){.     
16600 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
16610 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
16620 74 6d 74 29 3d 3d 38 0a 20 20 20 20 20 20 20 20  tmt)==8.        
16630 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74     && sqlite3_st
16640 72 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e 25 22  rlike("EXPLAIN%"
16650 2c 20 7a 53 74 6d 74 53 71 6c 2c 30 29 3d 3d 30  , zStmtSql,0)==0
16660 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
16670 20 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e            pArg->
16680 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70  cMode = MODE_Exp
16690 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lain;.          
166a0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
166b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
166c0 6f 75 6e 74 28 70 53 74 6d 74 29 3d 3d 34 0a 20  ount(pStmt)==4. 
166d0 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
166e0 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 45 58  ite3_strlike("EX
166f0 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
16700 25 22 2c 20 7a 53 74 6d 74 53 71 6c 2c 30 29 3d  %", zStmtSql,0)=
16710 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
16720 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20    pArg->cMode = 
16730 4d 4f 44 45 5f 45 51 50 3b 0a 20 20 20 20 20 20  MODE_EQP;.      
16740 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
16750 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
16760 68 65 20 73 68 65 6c 6c 20 69 73 20 63 75 72 72  he shell is curr
16770 65 6e 74 6c 79 20 69 6e 20 22 2e 65 78 70 6c 61  ently in ".expla
16780 69 6e 22 20 6d 6f 64 65 2c 20 67 61 74 68 65 72  in" mode, gather
16790 20 74 68 65 20 65 78 74 72 61 0a 20 20 20 20 20   the extra.     
167a0 20 20 20 2a 2a 20 64 61 74 61 20 72 65 71 75 69     ** data requi
167b0 72 65 64 20 74 6f 20 61 64 64 20 69 6e 64 65 6e  red to add inden
167c0 74 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ts to the output
167d0 2e 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20  .*/.        if( 
167e0 70 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44  pArg->cMode==MOD
167f0 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  E_Explain ){.   
16800 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64         explain_d
16810 61 74 61 5f 70 72 65 70 61 72 65 28 70 41 72 67  ata_prepare(pArg
16820 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  , pStmt);.      
16830 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
16840 20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64     exec_prepared
16850 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 53 74 6d  _stmt(pArg, pStm
16860 74 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  t);.      explai
16870 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70 41  n_data_delete(pA
16880 72 67 29 3b 0a 20 20 20 20 20 20 65 71 70 5f 72  rg);.      eqp_r
16890 65 6e 64 65 72 28 70 41 72 67 29 3b 0a 0a 20 20  ender(pArg);..  
168a0 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 75 73 61      /* print usa
168b0 67 65 20 73 74 61 74 73 20 69 66 20 73 74 61 74  ge stats if stat
168c0 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66  s on */.      if
168d0 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
168e0 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20  statsOn ){.     
168f0 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73     display_stats
16900 28 64 62 2c 20 70 41 72 67 2c 20 30 29 3b 0a 20  (db, pArg, 0);. 
16910 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
16920 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f 75 6e   print loop-coun
16930 74 65 72 73 20 69 66 20 72 65 71 75 69 72 65 64  ters if required
16940 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41   */.      if( pA
16950 72 67 20 26 26 20 70 41 72 67 2d 3e 73 63 61 6e  rg && pArg->scan
16960 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20  statsOn ){.     
16970 20 20 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73     display_scans
16980 74 61 74 73 28 64 62 2c 20 70 41 72 67 29 3b 0a  tats(db, pArg);.
16990 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
169a0 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 73  * Finalize the s
169b0 74 61 74 65 6d 65 6e 74 20 6a 75 73 74 20 65 78  tatement just ex
169c0 65 63 75 74 65 64 2e 20 49 66 20 74 68 69 73 20  ecuted. If this 
169d0 66 61 69 6c 73 2c 20 73 61 76 65 20 61 0a 20 20  fails, save a.  
169e0 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
169f0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
16a00 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  . Otherwise, set
16a10 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74 20 74   zSql to point t
16a20 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e  o the.      ** n
16a30 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ext statement to
16a40 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20 20   execute. */.   
16a50 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
16a60 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
16a70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16a80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 72  SQLITE_NOMEM ) r
16a90 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 69  c = rc2;.      i
16aa0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c   ){.        zSql
16ac0 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20   = zLeftover;.  
16ad0 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53        while( IsS
16ae0 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20  pace(zSql[0]) ) 
16af0 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  zSql++;.      }e
16b00 6c 73 65 20 69 66 28 20 70 7a 45 72 72 4d 73 67  lse if( pzErrMsg
16b10 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
16b20 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72  rrMsg = save_err
16b30 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20  _msg(db);.      
16b40 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c 65 61  }..      /* clea
16b50 72 20 73 61 76 65 64 20 73 74 6d 74 20 68 61 6e  r saved stmt han
16b60 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dle */.      if(
16b70 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20   pArg ){.       
16b80 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 4e   pArg->pStmt = N
16b90 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ULL;.      }.   
16ba0 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20 77 68   }.  } /* end wh
16bb0 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e  ile */..  return
16bc0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
16bd0 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 70 72 65  lease memory pre
16be0 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
16bf0 64 20 62 79 20 74 61 62 6c 65 43 6f 6c 75 6d 6e  d by tableColumn
16c00 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  List()..*/.stati
16c10 63 20 76 6f 69 64 20 66 72 65 65 43 6f 6c 75 6d  c void freeColum
16c20 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a 61 7a 43  nList(char **azC
16c30 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ol){.  int i;.  
16c40 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69  for(i=1; azCol[i
16c50 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ]; i++){.    sql
16c60 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c 5b  ite3_free(azCol[
16c70 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 61 7a  i]);.  }.  /* az
16c80 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73 74 61 74  Col[0] is a stat
16c90 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 73  ic string */.  s
16ca0 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f  qlite3_free(azCo
16cb0 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  l);.}../*.** Ret
16cc0 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 6f  urn a list of po
16cd0 69 6e 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67  inters to string
16ce0 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20  s which are the 
16cf0 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a 2a 20  names of all.** 
16d00 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65  columns in table
16d10 20 7a 54 61 62 2e 20 20 20 54 68 65 20 6d 65 6d   zTab.   The mem
16d20 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ory to hold the 
16d30 6e 61 6d 65 73 20 69 73 20 64 79 6e 61 6d 69 63  names is dynamic
16d40 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ally.** allocate
16d50 64 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 65  d and must be re
16d60 6c 65 61 73 65 64 20 62 79 20 74 68 65 20 63 61  leased by the ca
16d70 6c 6c 65 72 20 75 73 69 6e 67 20 61 20 73 75 62  ller using a sub
16d80 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20  sequent call.** 
16d90 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73  to freeColumnLis
16da0 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t()..**.** The a
16db0 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79 20 69 73  zCol[0] entry is
16dc0 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20   usually NULL.  
16dd0 48 6f 77 65 76 65 72 2c 20 69 66 20 7a 54 61 62  However, if zTab
16de0 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77 69   contains a rowi
16df0 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68 61 74 20  d.** value that 
16e00 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72 65 73  needs to be pres
16e10 65 72 76 65 64 2c 20 74 68 65 6e 20 61 7a 43 6f  erved, then azCo
16e20 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65 64 20 69  l[0] is filled i
16e30 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6e 61  n with the.** na
16e40 6d 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  me of the rowid 
16e50 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  column..**.** Th
16e60 65 20 66 69 72 73 74 20 72 65 67 75 6c 61 72 20  e first regular 
16e70 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
16e80 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b 31 5d 2e  ble is azCol[1].
16e90 20 20 54 68 65 20 6c 69 73 74 20 69 73 20 74 65    The list is te
16ea0 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62 79 20 61  rminated.** by a
16eb0 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 7a 43  n entry with azC
16ec0 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73 74 61  ol[i]==0..*/.sta
16ed0 74 69 63 20 63 68 61 72 20 2a 2a 74 61 62 6c 65  tic char **table
16ee0 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68 65 6c 6c  ColumnList(Shell
16ef0 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20  State *p, const 
16f00 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20 63  char *zTab){.  c
16f10 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20 30 3b  har **azCol = 0;
16f20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
16f30 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *pStmt;.  char *
16f40 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  zSql;.  int nCol
16f50 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41 6c 6c   = 0;.  int nAll
16f60 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50  oc = 0;.  int nP
16f70 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  K = 0;       /* 
16f80 4e 75 6d 62 65 72 20 6f 66 20 50 52 49 4d 41 52  Number of PRIMAR
16f90 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 73 65  Y KEY columns se
16fa0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 50  en */.  int isIP
16fb0 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72  K = 0;     /* Tr
16fc0 75 65 20 69 66 20 6f 6e 65 20 50 52 49 4d 41 52  ue if one PRIMAR
16fd0 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 66 20  Y KEY column of 
16fe0 74 79 70 65 20 49 4e 54 45 47 45 52 20 2a 2f 0a  type INTEGER */.
16ff0 20 20 69 6e 74 20 70 72 65 73 65 72 76 65 52 6f    int preserveRo
17000 77 69 64 20 3d 20 53 68 65 6c 6c 48 61 73 46 6c  wid = ShellHasFl
17010 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73  ag(p, SHFLG_Pres
17020 65 72 76 65 52 6f 77 69 64 29 3b 0a 20 20 69 6e  erveRowid);.  in
17030 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20  t rc;..  zSql = 
17040 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
17050 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e  "PRAGMA table_in
17060 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b 0a 20  fo=%Q", zTab);. 
17070 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
17080 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
17090 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
170a0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
170b0 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66  free(zSql);.  if
170c0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b  ( rc ) return 0;
170d0 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65  .  while( sqlite
170e0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
170f0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
17100 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c 6c 6f   if( nCol>=nAllo
17110 63 2d 32 20 29 7b 0a 20 20 20 20 20 20 6e 41 6c  c-2 ){.      nAl
17120 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32 20 2b  loc = nAlloc*2 +
17130 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20 20 20 20   nCol + 10;.    
17140 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65    azCol = sqlite
17150 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f 6c 2c  3_realloc(azCol,
17160 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 61   nAlloc*sizeof(a
17170 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 20  zCol[0]));.     
17180 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20   if( azCol==0 ) 
17190 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d  shell_out_of_mem
171a0 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ory();.    }.   
171b0 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d 20 3d   azCol[++nCol] =
171c0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
171d0 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63  ("%s", sqlite3_c
171e0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
171f0 2c 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 73  , 1));.    if( s
17200 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
17210 74 28 70 53 74 6d 74 2c 20 35 29 20 29 7b 0a 20  t(pStmt, 5) ){. 
17220 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20 20 20       nPK++;.    
17230 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20 20 20    if( nPK==1.   
17240 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73      && sqlite3_s
17250 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20 63 68  tricmp((const ch
17260 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
17270 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29  mn_text(pStmt,2)
17280 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17290 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 54              "INT
172a0 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20  EGER")==0.      
172b0 29 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50 4b  ){.        isIPK
172c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
172d0 65 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50 4b  e{.        isIPK
172e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
172f0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
17300 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
17310 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d  );.  if( azCol==
17320 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
17330 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20  azCol[0] = 0;.  
17340 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20 3d 20  azCol[nCol+1] = 
17350 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 63  0;..  /* The dec
17360 69 73 69 6f 6e 20 6f 66 20 77 68 65 74 68 65 72  ision of whether
17370 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69 64 20   or not a rowid 
17380 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 74 6f 20  really needs to 
17390 62 65 20 70 72 65 73 65 72 76 65 64 0a 20 20 2a  be preserved.  *
173a0 2a 20 69 73 20 74 72 69 63 6b 79 2e 20 20 57 65  * is tricky.  We
173b0 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 70   never need to p
173c0 72 65 73 65 72 76 65 20 61 20 72 6f 77 69 64 20  reserve a rowid 
173d0 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f  for a WITHOUT RO
173e0 57 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  WID table.  ** o
173f0 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 61  r a table with a
17400 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
17410 59 20 4b 45 59 2e 20 20 57 65 20 61 72 65 20 75  Y KEY.  We are u
17420 6e 61 62 6c 65 20 74 6f 20 70 72 65 73 65 72 76  nable to preserv
17430 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20 6f 6e  e.  ** rowids on
17440 20 74 61 62 6c 65 73 20 77 68 65 72 65 20 74 68   tables where th
17450 65 20 72 6f 77 69 64 20 69 73 20 69 6e 61 63 63  e rowid is inacc
17460 65 73 73 69 62 6c 65 20 62 65 63 61 75 73 65 20  essible because 
17470 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 0a  there are other.
17480 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20    ** columns in 
17490 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  the table named 
174a0 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69 64  "rowid", "_rowid
174b0 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e 0a 20  _", and "oid".. 
174c0 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 73 65 72   */.  if( preser
174d0 76 65 52 6f 77 69 64 20 26 26 20 69 73 49 50 4b  veRowid && isIPK
174e0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
174f0 73 69 6e 67 6c 65 20 50 52 49 4d 41 52 59 20 4b  single PRIMARY K
17500 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 74  EY column with t
17510 79 70 65 20 49 4e 54 45 47 45 52 20 77 61 73 20  ype INTEGER was 
17520 73 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a 20 20  seen, then it.  
17530 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 61 6e    ** might be an
17540 20 61 6c 69 73 65 20 66 6f 72 20 74 68 65 20 52   alise for the R
17550 4f 57 49 44 2e 20 20 42 75 74 20 69 74 20 6d 69  OWID.  But it mi
17560 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20 57 49  ght also be a WI
17570 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 20 20  THOUT ROWID.    
17580 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61 20 49 4e  ** table or a IN
17590 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
175a0 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c 20 6e  Y DESC column, n
175b0 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
175c0 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57 49 44  are.    ** ROWID
175d0 20 61 6c 69 61 73 65 73 2e 20 20 54 6f 20 64 69   aliases.  To di
175e0 73 74 69 6e 67 75 69 73 68 20 74 68 65 73 65 20  stinguish these 
175f0 63 61 73 65 73 2c 20 63 68 65 63 6b 20 74 6f 20  cases, check to 
17600 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  see if.    ** th
17610 65 72 65 20 69 73 20 61 20 22 70 6b 22 20 65 6e  ere is a "pk" en
17620 74 72 79 20 69 6e 20 22 50 52 41 47 4d 41 20 69  try in "PRAGMA i
17630 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20 54 68 65  ndex_list".  The
17640 72 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a  re will be.    *
17650 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65 78 20  * no "pk" index 
17660 69 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  if the PRIMARY K
17670 45 59 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20  EY really is an 
17680 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52 4f  alias for the RO
17690 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  WID..    */.    
176a0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
176b0 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 31  printf("SELECT 1
176c0 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69 6e 64   FROM pragma_ind
176d0 65 78 5f 6c 69 73 74 28 25 51 29 22 0a 20 20 20  ex_list(%Q)".   
176e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176f0 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
17700 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20 7a 54  origin='pk'", zT
17710 61 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ab);.    rc = sq
17720 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
17730 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
17740 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
17750 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
17760 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
17770 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 43 6f   ){.      freeCo
17780 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b  lumnList(azCol);
17790 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
177a0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
177b0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
177c0 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
177d0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
177e0 3b 0a 20 20 20 20 70 72 65 73 65 72 76 65 52 6f  ;.    preserveRo
177f0 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45  wid = rc==SQLITE
17800 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _ROW;.  }.  if( 
17810 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 29 7b  preserveRowid ){
17820 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70 72 65  .    /* Only pre
17830 73 65 72 76 65 20 74 68 65 20 72 6f 77 69 64 20  serve the rowid 
17840 69 66 20 77 65 20 63 61 6e 20 66 69 6e 64 20 61  if we can find a
17850 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 66 6f 72   name to use for
17860 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 77 69   the.    ** rowi
17870 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20  d */.    static 
17880 63 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b 5d 20  char *azRowid[] 
17890 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22 5f 72  = { "rowid", "_r
178a0 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22 20 7d 3b  owid_", "oid" };
178b0 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
178c0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b     for(j=0; j<3;
178d0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   j++){.      for
178e0 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b 20 69  (i=1; i<=nCol; i
178f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
17900 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
17910 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a 43 6f  (azRowid[j],azCo
17920 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65 61 6b  l[i])==0 ) break
17930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17940 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a 20 20  if( i>nCol ){.  
17950 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
17960 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20   point, we know 
17970 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a 5d 20  that azRowid[j] 
17980 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20  is not the name 
17990 6f 66 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a  of any.        *
179a0 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c 75 6d  * ordinary colum
179b0 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  n in the table. 
179c0 20 56 65 72 69 66 79 20 74 68 61 74 20 61 7a 52   Verify that azR
179d0 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20 76 61 6c  owid[j] is a val
179e0 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 61  id.        ** na
179f0 6d 65 20 66 6f 72 20 74 68 65 20 72 6f 77 69 64  me for the rowid
17a00 20 62 65 66 6f 72 65 20 61 64 64 69 6e 67 20 69   before adding i
17a10 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e 20 20  t to azCol[0].  
17a20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20  WITHOUT ROWID.  
17a30 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20        ** tables 
17a40 77 69 6c 6c 20 66 61 69 6c 20 74 68 69 73 20 6c  will fail this l
17a50 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20 20 20  ast check */.   
17a60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17a70 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
17a80 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c 30 2c  etadata(p->db,0,
17a90 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a 5d 2c  zTab,azRowid[j],
17aa0 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20  0,0,0,0,0);.    
17ab0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17ac0 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b 30 5d  TE_OK ) azCol[0]
17ad0 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b 0a 20   = azRowid[j];. 
17ae0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17af0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17b00 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c 3b 0a    return azCol;.
17b10 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c 65 20  }../*.** Toggle 
17b20 74 68 65 20 72 65 76 65 72 73 65 5f 75 6e 6f 72  the reverse_unor
17b30 64 65 72 65 64 5f 73 65 6c 65 63 74 73 20 73 65  dered_selects se
17b40 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tting..*/.static
17b50 20 76 6f 69 64 20 74 6f 67 67 6c 65 53 65 6c 65   void toggleSele
17b60 63 74 4f 72 64 65 72 28 73 71 6c 69 74 65 33 20  ctOrder(sqlite3 
17b70 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  *db){.  sqlite3_
17b80 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
17b90 0a 20 20 69 6e 74 20 69 53 65 74 74 69 6e 67 20  .  int iSetting 
17ba0 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 53 74 6d  = 0;.  char zStm
17bb0 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65  t[100];.  sqlite
17bc0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
17bd0 20 22 50 52 41 47 4d 41 20 72 65 76 65 72 73 65   "PRAGMA reverse
17be0 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63  _unordered_selec
17bf0 74 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  ts", -1, &pStmt,
17c00 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74   0);.  if( sqlit
17c10 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
17c20 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
17c30 20 20 69 53 65 74 74 69 6e 67 20 3d 20 73 71 6c    iSetting = sql
17c40 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
17c50 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20  pStmt, 0);.  }. 
17c60 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
17c70 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69  e(pStmt);.  sqli
17c80 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
17c90 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53 74 6d  eof(zStmt), zStm
17ca0 74 2c 0a 20 20 20 20 20 20 20 22 50 52 41 47 4d  t,.       "PRAGM
17cb0 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64 65  A reverse_unorde
17cc0 72 65 64 5f 73 65 6c 65 63 74 73 28 25 64 29 22  red_selects(%d)"
17cd0 2c 20 21 69 53 65 74 74 69 6e 67 29 3b 0a 20 20  , !iSetting);.  
17ce0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
17cf0 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20 30 29   zStmt, 0, 0, 0)
17d00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
17d10 69 73 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  is a different c
17d20 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
17d30 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69 6e 67  used for dumping
17d40 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
17d50 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63 65 69  * Each row recei
17d60 76 65 64 20 62 79 20 74 68 69 73 20 63 61 6c 6c  ved by this call
17d70 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
17d80 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a   a table name,.*
17d90 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79 70 65  * the table type
17da0 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22 74 61   ("index" or "ta
17db0 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20 74 6f  ble") and SQL to
17dc0 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c   create the tabl
17dd0 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  e..** This routi
17de0 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e 74 20  ne should print 
17df0 74 65 78 74 20 73 75 66 66 69 63 69 65 6e 74 20  text sufficient 
17e00 74 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20  to recreate the 
17e10 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
17e20 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c 62 61   int dump_callba
17e30 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  ck(void *pArg, i
17e40 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a  nt nArg, char **
17e50 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a  azArg, char **az
17e60 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e 74 20  NotUsed){.  int 
17e70 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rc;.  const char
17e80 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f 6e 73   *zTable;.  cons
17e90 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20  t char *zType;. 
17ea0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
17eb0 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  l;.  ShellState 
17ec0 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65  *p = (ShellState
17ed0 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e 55 53   *)pArg;..  UNUS
17ee0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 7a 4e  ED_PARAMETER(azN
17ef0 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 6e  otUsed);.  if( n
17f00 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72 67 3d  Arg!=3 || azArg=
17f10 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
17f20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b   zTable = azArg[
17f30 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20 61 7a  0];.  zType = az
17f40 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20 3d  Arg[1];.  zSql =
17f50 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20 69 66   azArg[2];..  if
17f60 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c 65 2c  ( strcmp(zTable,
17f70 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
17f80 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61  e")==0 ){.    ra
17f90 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
17fa0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 71   "DELETE FROM sq
17fb0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c 6e  lite_sequence;\n
17fc0 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
17fd0 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
17fe0 22 73 71 6c 69 74 65 5f 73 74 61 74 3f 22 2c 20  "sqlite_stat?", 
17ff0 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a 20 20  zTable)==0 ){.  
18000 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
18010 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71  out, "ANALYZE sq
18020 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29  lite_master;\n")
18030 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
18040 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73  rncmp(zTable, "s
18050 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29  qlite_", 7)==0 )
18060 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
18070 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
18080 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45 41 54  cmp(zSql, "CREAT
18090 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22  E VIRTUAL TABLE"
180a0 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 20)==0 ){.    
180b0 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20 20 20  char *zIns;.    
180c0 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62 6c 65  if( !p->writable
180d0 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
180e0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
180f0 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  t, "PRAGMA writa
18100 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c 6e  ble_schema=ON;\n
18110 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69  ");.      p->wri
18120 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 31 3b  tableSchema = 1;
18130 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e 73 20  .    }.    zIns 
18140 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
18150 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53 45 52  f(.       "INSER
18160 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61  T INTO sqlite_ma
18170 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65 2c 74  ster(type,name,t
18180 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61 67 65  bl_name,rootpage
18190 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20 22 56  ,sql)".       "V
181a0 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c 27 25  ALUES('table','%
181b0 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27 29 3b  q','%q',0,'%q');
181c0 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62 6c 65  ",.       zTable
181d0 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c 29 3b  , zTable, zSql);
181e0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
181f0 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  (p->out, "%s\n",
18200 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69   zIns);.    sqli
18210 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29 3b 0a  te3_free(zIns);.
18220 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18230 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e 74  }else{.    print
18240 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75  SchemaLine(p->ou
18250 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22 29 3b  t, zSql, ";\n");
18260 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74 72 63  .  }..  if( strc
18270 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62 6c 65  mp(zType, "table
18280 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65  ")==0 ){.    She
18290 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74 3b 0a  llText sSelect;.
182a0 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 54      ShellText sT
182b0 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  able;.    char *
182c0 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20  *azCol;.    int 
182d0 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 61 76  i;.    char *sav
182e0 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20  edDestTable;.   
182f0 20 69 6e 74 20 73 61 76 65 64 4d 6f 64 65 3b 0a   int savedMode;.
18300 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74 61 62  .    azCol = tab
18310 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 2c 20  leColumnList(p, 
18320 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28  zTable);.    if(
18330 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20   azCol==0 ){.   
18340 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20     p->nErr++;.  
18350 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18360 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61    }..    /* Alwa
18370 79 73 20 71 75 6f 74 65 20 74 68 65 20 74 61 62  ys quote the tab
18380 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20 69 66  le name, even if
18390 20 69 74 20 61 70 70 65 61 72 73 20 74 6f 20 62   it appears to b
183a0 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a 20 20  e pure ascii,.  
183b0 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69 74 20    ** in case it 
183c0 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20 45 78  is a keyword. Ex
183d0 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 22  :  INSERT INTO "
183e0 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a 20 20  table" ... */.  
183f0 20 20 69 6e 69 74 54 65 78 74 28 26 73 54 61 62    initText(&sTab
18400 6c 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  le);.    appendT
18410 65 78 74 28 26 73 54 61 62 6c 65 2c 20 7a 54 61  ext(&sTable, zTa
18420 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28 7a  ble, quoteChar(z
18430 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f 2a 20  Table));.    /* 
18440 49 66 20 70 72 65 73 65 72 76 69 6e 67 20 74 68  If preserving th
18450 65 20 72 6f 77 69 64 2c 20 61 64 64 20 61 20 63  e rowid, add a c
18460 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74 65 72  olumn list after
18470 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
18480 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72  .    ** In other
18490 20 77 6f 72 64 73 3a 20 20 22 49 4e 53 45 52 54   words:  "INSERT
184a0 20 49 4e 54 4f 20 74 61 62 28 72 6f 77 69 64 2c   INTO tab(rowid,
184b0 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c 55 45  a,b,c,...) VALUE
184c0 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 69  S(...)".    ** i
184d0 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
184e0 75 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  ual "INSERT INTO
184f0 20 74 61 62 20 56 41 4c 55 45 53 28 2e 2e 2e 29   tab VALUES(...)
18500 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  "..    */.    if
18510 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20  ( azCol[0] ){.  
18520 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
18530 73 54 61 62 6c 65 2c 20 22 28 22 2c 20 30 29 3b  sTable, "(", 0);
18540 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
18550 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c  t(&sTable, azCol
18560 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  [0], 0);.      f
18570 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d  or(i=1; azCol[i]
18580 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
18590 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62  appendText(&sTab
185a0 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20  le, ",", 0);.   
185b0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
185c0 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b 69  &sTable, azCol[i
185d0 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43  ], quoteChar(azC
185e0 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20 7d  ol[i]));.      }
185f0 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
18600 74 28 26 73 54 61 62 6c 65 2c 20 22 29 22 2c 20  t(&sTable, ")", 
18610 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  0);.    }..    /
18620 2a 20 42 75 69 6c 64 20 61 6e 20 61 70 70 72 6f  * Build an appro
18630 70 72 69 61 74 65 20 53 45 4c 45 43 54 20 73 74  priate SELECT st
18640 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
18650 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65 63 74  nitText(&sSelect
18660 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
18670 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45 4c  t(&sSelect, "SEL
18680 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20 20 69  ECT ", 0);.    i
18690 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20  f( azCol[0] ){. 
186a0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
186b0 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b  &sSelect, azCol[
186c0 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 70  0], 0);.      ap
186d0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
186e0 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20  t, ",", 0);.    
186f0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61  }.    for(i=1; a
18700 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  zCol[i]; i++){. 
18710 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
18720 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b  &sSelect, azCol[
18730 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a  i], quoteChar(az
18740 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20  Col[i]));.      
18750 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d 20 29  if( azCol[i+1] )
18760 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
18770 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
18780 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ,", 0);.      }.
18790 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 43 6f      }.    freeCo
187a0 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b  lumnList(azCol);
187b0 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28  .    appendText(
187c0 26 73 53 65 6c 65 63 74 2c 20 22 20 46 52 4f 4d  &sSelect, " FROM
187d0 20 22 2c 20 30 29 3b 0a 20 20 20 20 61 70 70 65   ", 0);.    appe
187e0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
187f0 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68   zTable, quoteCh
18800 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a 20 20  ar(zTable));..  
18810 20 20 73 61 76 65 64 44 65 73 74 54 61 62 6c 65    savedDestTable
18820 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65   = p->zDestTable
18830 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f 64 65 20  ;.    savedMode 
18840 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 70  = p->mode;.    p
18850 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 73  ->zDestTable = s
18860 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70 2d 3e  Table.z;.    p->
18870 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64 65 20  mode = p->cMode 
18880 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20  = MODE_Insert;. 
18890 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65 78     rc = shell_ex
188a0 65 63 28 70 2c 20 73 53 65 6c 65 63 74 2e 7a 2c  ec(p, sSelect.z,
188b0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63   0);.    if( (rc
188c0 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
188d0 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20  ORRUPT ){.      
188e0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
188f0 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52  t, "/****** CORR
18900 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a  UPTION ERROR ***
18910 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 20  ****/\n");.     
18920 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64   toggleSelectOrd
18930 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  er(p->db);.     
18940 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c 20 73   shell_exec(p, s
18950 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a 20 20  Select.z, 0);.  
18960 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74      toggleSelect
18970 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20  Order(p->db);.  
18980 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74    }.    p->zDest
18990 54 61 62 6c 65 20 3d 20 73 61 76 65 64 44 65 73  Table = savedDes
189a0 74 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d 3e 6d  tTable;.    p->m
189b0 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f 64 65 3b  ode = savedMode;
189c0 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73  .    freeText(&s
189d0 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 65 65  Table);.    free
189e0 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a  Text(&sSelect);.
189f0 20 20 20 20 69 66 28 20 72 63 20 29 20 70 2d 3e      if( rc ) p->
18a00 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nErr++;.  }.  re
18a10 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
18a20 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55 73   Run zQuery.  Us
18a30 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28  e dump_callback(
18a40 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61 63  ) as the callbac
18a50 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61  k routine so tha
18a60 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
18a70 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 61  s of the query a
18a80 72 65 20 6f 75 74 70 75 74 20 61 73 20 53 51 4c  re output as SQL
18a90 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
18aa0 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61 20 53  ** If we get a S
18ab0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
18ac0 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20 71  ror, rerun the q
18ad0 75 65 72 79 20 61 66 74 65 72 20 61 70 70 65 6e  uery after appen
18ae0 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20 42  ding.** "ORDER B
18af0 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 74 6f  Y rowid DESC" to
18b00 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61   the end..*/.sta
18b10 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68 65  tic int run_sche
18b20 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20  ma_dump_query(. 
18b30 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a   ShellState *p,.
18b40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51    const char *zQ
18b50 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72 63  uery.){.  int rc
18b60 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
18b70 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
18b80 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
18b90 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61 6c 6c  Query, dump_call
18ba0 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b  back, p, &zErr);
18bb0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18bc0 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20  E_CORRUPT ){.   
18bd0 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20 20   char *zQ2;.    
18be0 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  int len = strlen
18bf0 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20  30(zQuery);.    
18c00 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
18c10 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52  t, "/****** CORR
18c20 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a  UPTION ERROR ***
18c30 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 69  ****/\n");.    i
18c40 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
18c50 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
18c60 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 25 73  out, "/****** %s
18c70 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72   ******/\n", zEr
18c80 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
18c90 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
18ca0 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a 20 20      zErr = 0;.  
18cb0 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20 6d 61    }.    zQ2 = ma
18cc0 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20 29 3b  lloc( len+100 );
18cd0 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d 30 20  .    if( zQ2==0 
18ce0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
18cf0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
18d00 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32 2c 20  f(len+100, zQ2, 
18d10 22 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77  "%s ORDER BY row
18d20 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72 79  id DESC", zQuery
18d30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
18d40 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
18d50 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61  zQ2, dump_callba
18d60 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20  ck, p, &zErr);. 
18d70 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
18d80 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
18d90 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20  ->out, "/****** 
18da0 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a 2a 2a  ERROR: %s ******
18db0 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20  /\n", zErr);.   
18dc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
18dd0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
18de0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  T;.    }.    sql
18df0 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b  ite3_free(zErr);
18e00 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29 3b 0a  .    free(zQ2);.
18e10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18e20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f  .}../*.** Text o
18e30 66 20 68 65 6c 70 20 6d 65 73 73 61 67 65 73 2e  f help messages.
18e40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 65 6c 70 20  .**.** The help 
18e50 74 65 78 74 20 66 6f 72 20 65 61 63 68 20 69 6e  text for each in
18e60 64 69 76 69 64 75 61 6c 20 63 6f 6d 6d 61 6e 64  dividual command
18e70 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 6c   begins with a l
18e80 69 6e 65 20 74 68 61 74 20 73 74 61 72 74 73 0a  ine that starts.
18e90 2a 2a 20 77 69 74 68 20 22 2e 22 2e 20 20 53 75  ** with ".".  Su
18ea0 62 73 65 71 75 65 6e 74 20 6c 69 6e 65 73 20 61  bsequent lines a
18eb0 72 65 20 73 75 70 70 6c 69 6d 65 6e 74 61 6c 20  re supplimental 
18ec0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
18ed0 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
18ee0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 70 61   two or more spa
18ef0 63 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ces between the 
18f00 65 6e 64 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61  end of the comma
18f10 6e 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 73 74  nd and the.** st
18f20 61 72 74 20 6f 66 20 74 68 65 20 64 65 73 63 72  art of the descr
18f30 69 70 74 69 6f 6e 20 6f 66 20 77 68 61 74 20 74  iption of what t
18f40 68 61 74 20 63 6f 6d 6d 61 6e 64 20 64 6f 65 73  hat command does
18f50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
18f60 74 20 63 68 61 72 20 2a 28 61 7a 48 65 6c 70 5b  t char *(azHelp[
18f70 5d 29 20 3d 20 7b 0a 23 69 66 20 64 65 66 69 6e  ]) = {.#if defin
18f80 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a  ed(SQLITE_HAVE_Z
18f90 4c 49 42 29 20 26 26 20 21 64 65 66 69 6e 65 64  LIB) && !defined
18fa0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
18fb0 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 22 2e 61  TUALTABLE).  ".a
18fc0 72 63 68 69 76 65 20 2e 2e 2e 20 20 20 20 20 20  rchive ...      
18fd0 20 20 20 20 20 20 20 4d 61 6e 61 67 65 20 53 51         Manage SQ
18fe0 4c 20 61 72 63 68 69 76 65 73 22 2c 0a 20 20 22  L archives",.  "
18ff0 20 20 20 45 61 63 68 20 63 6f 6d 6d 61 6e 64 20     Each command 
19000 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c  must have exactl
19010 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  y one of the fol
19020 6c 6f 77 69 6e 67 20 6f 70 74 69 6f 6e 73 3a 22  lowing options:"
19030 2c 0a 20 20 22 20 20 20 20 20 2d 63 2c 20 2d 2d  ,.  "     -c, --
19040 63 72 65 61 74 65 20 20 20 20 20 20 20 20 20 20  create          
19050 20 20 20 20 20 43 72 65 61 74 65 20 61 20 6e 65       Create a ne
19060 77 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20  w archive",.  " 
19070 20 20 20 20 2d 75 2c 20 2d 2d 75 70 64 61 74 65      -u, --update
19080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55                 U
19090 70 64 61 74 65 20 6f 72 20 61 64 64 20 66 69 6c  pdate or add fil
190a0 65 73 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e  es to an existin
190b0 67 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20  g archive",.  " 
190c0 20 20 20 20 2d 74 2c 20 2d 2d 6c 69 73 74 20 20      -t, --list  
190d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
190e0 69 73 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ist contents of 
190f0 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20 20 20  archive",.  "   
19100 20 20 2d 78 2c 20 2d 2d 65 78 74 72 61 63 74 20    -x, --extract 
19110 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 74               Ext
19120 72 61 63 74 20 66 69 6c 65 73 20 66 72 6f 6d 20  ract files from 
19130 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20 20 20  archive",.  "   
19140 4f 70 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e  Optional argumen
19150 74 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d 76  ts:",.  "     -v
19160 2c 20 2d 2d 76 65 72 62 6f 73 65 20 20 20 20 20  , --verbose     
19170 20 20 20 20 20 20 20 20 20 50 72 69 6e 74 20 65           Print e
19180 61 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 73 20  ach filename as 
19190 69 74 20 69 73 20 70 72 6f 63 65 73 73 65 64 22  it is processed"
191a0 2c 0a 20 20 22 20 20 20 20 20 2d 66 20 46 49 4c  ,.  "     -f FIL
191b0 45 2c 20 2d 2d 66 69 6c 65 20 46 49 4c 45 20 20  E, --file FILE  
191c0 20 20 20 20 20 4f 70 65 72 61 74 65 20 6f 6e 20       Operate on 
191d0 61 72 63 68 69 76 65 20 46 49 4c 45 20 28 64 65  archive FILE (de
191e0 66 61 75 6c 74 20 69 73 20 63 75 72 72 65 6e 74  fault is current
191f0 20 64 62 29 22 2c 0a 20 20 22 20 20 20 20 20 2d   db)",.  "     -
19200 61 20 46 49 4c 45 2c 20 2d 2d 61 70 70 65 6e 64  a FILE, --append
19210 20 46 49 4c 45 20 20 20 20 20 4f 70 65 72 61 74   FILE     Operat
19220 65 20 6f 6e 20 46 49 4c 45 20 6f 70 65 6e 65 64  e on FILE opened
19230 20 75 73 69 6e 67 20 74 68 65 20 61 70 6e 64 76   using the apndv
19240 66 73 20 56 46 53 22 2c 0a 20 20 22 20 20 20 20  fs VFS",.  "    
19250 20 2d 43 20 44 49 52 2c 20 2d 2d 64 69 72 65 63   -C DIR, --direc
19260 74 6f 72 79 20 44 49 52 20 20 20 20 43 68 61 6e  tory DIR    Chan
19270 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20  ge to directory 
19280 44 49 52 20 74 6f 20 72 65 61 64 2f 65 78 74 72  DIR to read/extr
19290 61 63 74 20 66 69 6c 65 73 22 2c 0a 20 20 22 20  act files",.  " 
192a0 20 20 20 20 2d 6e 2c 20 2d 2d 64 72 79 72 75 6e      -n, --dryrun
192b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
192c0 68 6f 77 20 74 68 65 20 53 51 4c 20 74 68 61 74  how the SQL that
192d0 20 77 6f 75 6c 64 20 68 61 76 65 20 6f 63 63 75   would have occu
192e0 72 72 65 64 22 2c 0a 20 20 22 20 20 20 45 78 61  rred",.  "   Exa
192f0 6d 70 6c 65 73 3a 22 2c 0a 20 20 22 20 20 20 20  mples:",.  "    
19300 20 2e 61 72 20 2d 63 66 20 61 72 63 68 69 76 65   .ar -cf archive
19310 2e 73 61 72 20 66 6f 6f 20 62 61 72 20 20 23 20  .sar foo bar  # 
19320 43 72 65 61 74 65 20 61 72 63 68 69 76 65 2e 73  Create archive.s
19330 61 72 20 66 72 6f 6d 20 66 69 6c 65 73 20 66 6f  ar from files fo
19340 6f 20 61 6e 64 20 62 61 72 22 2c 0a 20 20 22 20  o and bar",.  " 
19350 20 20 20 20 2e 61 72 20 2d 74 66 20 61 72 63 68      .ar -tf arch
19360 69 76 65 2e 73 61 72 20 20 20 20 20 20 20 20 20  ive.sar         
19370 20 23 20 4c 69 73 74 20 6d 65 6d 62 65 72 73 20   # List members 
19380 6f 66 20 61 72 63 68 69 76 65 2e 73 61 72 22 2c  of archive.sar",
19390 0a 20 20 22 20 20 20 20 20 2e 61 72 20 2d 78 76  .  "     .ar -xv
193a0 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 20 20  f archive.sar   
193b0 20 20 20 20 20 20 23 20 56 65 72 62 6f 73 65 6c        # Verbosel
193c0 79 20 65 78 74 72 61 63 74 20 66 69 6c 65 73 20  y extract files 
193d0 66 72 6f 6d 20 61 72 63 68 69 76 65 2e 73 61 72  from archive.sar
193e0 22 2c 0a 20 20 22 20 20 20 53 65 65 20 61 6c 73  ",.  "   See als
193f0 6f 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 68 74  o:",.  "      ht
19400 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f  tp://sqlite.org/
19410 63 6c 69 2e 68 74 6d 6c 23 73 71 6c 61 72 5f 61  cli.html#sqlar_a
19420 72 63 68 69 76 65 5f 73 75 70 70 6f 72 74 22 2c  rchive_support",
19430 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
19440 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
19450 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e 61 75  ORIZATION.  ".au
19460 74 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20 20  th ON|OFF       
19470 20 20 20 20 20 20 53 68 6f 77 20 61 75 74 68 6f        Show autho
19480 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 73 22  rizer callbacks"
19490 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 62 61 63  ,.#endif.  ".bac
194a0 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45 20 20 20  kup ?DB? FILE   
194b0 20 20 20 20 20 42 61 63 6b 75 70 20 44 42 20 28       Backup DB (
194c0 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22  default \"main\"
194d0 29 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20  ) to FILE",.  " 
194e0 20 20 20 20 20 20 2d 2d 61 70 70 65 6e 64 20 20        --append  
194f0 20 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68            Use th
19500 65 20 61 70 70 65 6e 64 76 66 73 22 2c 0a 20 20  e appendvfs",.  
19510 22 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66 20 20 20  ".bail on|off   
19520 20 20 20 20 20 20 20 20 20 20 53 74 6f 70 20 61            Stop a
19530 66 74 65 72 20 68 69 74 74 69 6e 67 20 61 6e 20  fter hitting an 
19540 65 72 72 6f 72 2e 20 20 44 65 66 61 75 6c 74 20  error.  Default 
19550 4f 46 46 22 2c 0a 20 20 22 2e 62 69 6e 61 72 79  OFF",.  ".binary
19560 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20   on|off         
19570 20 20 54 75 72 6e 20 62 69 6e 61 72 79 20 6f 75    Turn binary ou
19580 74 70 75 74 20 6f 6e 20 6f 72 20 6f 66 66 2e 20  tput on or off. 
19590 20 44 65 66 61 75 6c 74 20 4f 46 46 22 2c 0a 20   Default OFF",. 
195a0 20 22 2e 63 64 20 44 49 52 45 43 54 4f 52 59 20   ".cd DIRECTORY 
195b0 20 20 20 20 20 20 20 20 20 20 20 43 68 61 6e 67             Chang
195c0 65 20 74 68 65 20 77 6f 72 6b 69 6e 67 20 64 69  e the working di
195d0 72 65 63 74 6f 72 79 20 74 6f 20 44 49 52 45 43  rectory to DIREC
195e0 54 4f 52 59 22 2c 0a 20 20 22 2e 63 68 61 6e 67  TORY",.  ".chang
195f0 65 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  es on|off       
19600 20 20 20 53 68 6f 77 20 6e 75 6d 62 65 72 20 6f     Show number o
19610 66 20 72 6f 77 73 20 63 68 61 6e 67 65 64 20 62  f rows changed b
19620 79 20 53 51 4c 22 2c 0a 20 20 22 2e 63 68 65 63  y SQL",.  ".chec
19630 6b 20 47 4c 4f 42 20 20 20 20 20 20 20 20 20 20  k GLOB          
19640 20 20 20 20 46 61 69 6c 20 69 66 20 6f 75 74 70      Fail if outp
19650 75 74 20 73 69 6e 63 65 20 2e 74 65 73 74 63 61  ut since .testca
19660 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  se does not matc
19670 68 22 2c 0a 20 20 22 2e 63 6c 6f 6e 65 20 4e 45  h",.  ".clone NE
19680 57 44 42 20 20 20 20 20 20 20 20 20 20 20 20 20  WDB             
19690 43 6c 6f 6e 65 20 64 61 74 61 20 69 6e 74 6f 20  Clone data into 
196a0 4e 45 57 44 42 20 66 72 6f 6d 20 74 68 65 20 65  NEWDB from the e
196b0 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65  xisting database
196c0 22 2c 0a 20 20 22 2e 64 61 74 61 62 61 73 65 73  ",.  ".databases
196d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
196e0 69 73 74 20 6e 61 6d 65 73 20 61 6e 64 20 66 69  ist names and fi
196f0 6c 65 73 20 6f 66 20 61 74 74 61 63 68 65 64 20  les of attached 
19700 64 61 74 61 62 61 73 65 73 22 2c 0a 20 20 22 2e  databases",.  ".
19710 64 62 63 6f 6e 66 69 67 20 3f 6f 70 3f 20 3f 76  dbconfig ?op? ?v
19720 61 6c 3f 20 20 20 20 20 4c 69 73 74 20 6f 72 20  al?     List or 
19730 63 68 61 6e 67 65 20 73 71 6c 69 74 65 33 5f 64  change sqlite3_d
19740 62 5f 63 6f 6e 66 69 67 28 29 20 6f 70 74 69 6f  b_config() optio
19750 6e 73 22 2c 0a 20 20 22 2e 64 62 69 6e 66 6f 20  ns",.  ".dbinfo 
19760 3f 44 42 3f 20 20 20 20 20 20 20 20 20 20 20 20  ?DB?            
19770 20 53 68 6f 77 20 73 74 61 74 75 73 20 69 6e 66   Show status inf
19780 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
19790 68 65 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20  he database",.  
197a0 22 2e 64 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e  ".dump ?TABLE? .
197b0 2e 2e 20 20 20 20 20 20 20 20 52 65 6e 64 65 72  ..        Render
197c0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f   all database co
197d0 6e 74 65 6e 74 20 61 73 20 53 51 4c 22 2c 0a 20  ntent as SQL",. 
197e0 20 22 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a   "   Options:",.
197f0 20 20 22 20 20 20 20 20 2d 2d 70 72 65 73 65 72    "     --preser
19800 76 65 2d 72 6f 77 69 64 73 20 20 20 20 20 20 49  ve-rowids      I
19810 6e 63 6c 75 64 65 20 52 4f 57 49 44 20 76 61 6c  nclude ROWID val
19820 75 65 73 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ues in the outpu
19830 74 22 2c 0a 20 20 22 20 20 20 20 20 2d 2d 6e 65  t",.  "     --ne
19840 77 6c 69 6e 65 73 20 20 20 20 20 20 20 20 20 20  wlines          
19850 20 20 20 41 6c 6c 6f 77 20 75 6e 65 73 63 61 70     Allow unescap
19860 65 64 20 6e 65 77 6c 69 6e 65 20 63 68 61 72 61  ed newline chara
19870 63 74 65 72 73 20 69 6e 20 6f 75 74 70 75 74 22  cters in output"
19880 2c 0a 20 20 22 20 20 20 54 41 42 4c 45 20 69 73  ,.  "   TABLE is
19890 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 66 6f   LIKE pattern fo
198a0 72 20 74 68 65 20 74 61 62 6c 65 73 20 74 6f 20  r the tables to 
198b0 64 75 6d 70 22 2c 0a 20 20 22 2e 65 63 68 6f 20  dump",.  ".echo 
198c0 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20  on|off          
198d0 20 20 20 54 75 72 6e 20 63 6f 6d 6d 61 6e 64 20     Turn command 
198e0 65 63 68 6f 20 6f 6e 20 6f 72 20 6f 66 66 22 2c  echo on or off",
198f0 0a 20 20 22 2e 65 71 70 20 6f 6e 7c 6f 66 66 7c  .  ".eqp on|off|
19900 66 75 6c 6c 20 20 20 20 20 20 20 20 20 45 6e 61  full         Ena
19910 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 61  ble or disable a
19920 75 74 6f 6d 61 74 69 63 20 45 58 50 4c 41 49 4e  utomatic EXPLAIN
19930 20 51 55 45 52 59 20 50 4c 41 4e 22 2c 0a 20 20   QUERY PLAN",.  
19940 22 2e 65 78 63 65 6c 20 20 20 20 20 20 20 20 20  ".excel         
19950 20 20 20 20 20 20 20 20 20 20 44 69 73 70 6c 61            Displa
19960 79 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  y the output of 
19970 6e 65 78 74 20 63 6f 6d 6d 61 6e 64 20 69 6e 20  next command in 
19980 61 20 73 70 72 65 61 64 73 68 65 65 74 22 2c 0a  a spreadsheet",.
19990 20 20 22 2e 65 78 69 74 20 3f 43 4f 44 45 3f 20    ".exit ?CODE? 
199a0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 69 74              Exit
199b0 20 74 68 69 73 20 70 72 6f 67 72 61 6d 20 77 69   this program wi
199c0 74 68 20 72 65 74 75 72 6e 2d 63 6f 64 65 20 43  th return-code C
199d0 4f 44 45 22 2c 0a 20 20 22 2e 65 78 70 65 72 74  ODE",.  ".expert
199e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199f0 20 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 2e 20    EXPERIMENTAL. 
19a00 53 75 67 67 65 73 74 20 69 6e 64 65 78 65 73 20  Suggest indexes 
19a10 66 6f 72 20 73 70 65 63 69 66 69 65 64 20 71 75  for specified qu
19a20 65 72 69 65 73 22 2c 0a 2f 2a 20 42 65 63 61 75  eries",./* Becau
19a30 73 65 20 65 78 70 6c 61 69 6e 20 6d 6f 64 65 20  se explain mode 
19a40 63 6f 6d 65 73 20 6f 6e 20 61 75 74 6f 6d 61 74  comes on automat
19a50 69 63 61 6c 6c 79 20 6e 6f 77 2c 20 74 68 65 20  ically now, the 
19a60 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f 64 65 0a  ".explain" mode.
19a70 2a 2a 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ** is removed fr
19a80 6f 6d 20 74 68 65 20 68 65 6c 70 20 73 63 72 65  om the help scre
19a90 65 6e 2e 20 20 49 74 20 69 73 20 73 74 69 6c 6c  en.  It is still
19aa0 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 6c   supported for l
19ab0 65 67 61 63 79 2c 20 68 6f 77 65 76 65 72 20 2a  egacy, however *
19ac0 2f 0a 2f 2a 22 2e 65 78 70 6c 61 69 6e 20 3f 6f  /./*".explain ?o
19ad0 6e 7c 6f 66 66 7c 61 75 74 6f 3f 20 20 20 54 75  n|off|auto?   Tu
19ae0 72 6e 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75  rn EXPLAIN outpu
19af0 74 20 6d 6f 64 65 20 6f 6e 20 6f 72 20 6f 66 66  t mode on or off
19b00 20 6f 72 20 74 6f 20 61 75 74 6f 6d 61 74 69 63   or to automatic
19b10 22 2c 2a 2f 0a 20 20 22 2e 66 75 6c 6c 73 63 68  ",*/.  ".fullsch
19b20 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20 20  ema ?--indent?  
19b30 20 53 68 6f 77 20 73 63 68 65 6d 61 20 61 6e 64   Show schema and
19b40 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
19b50 73 71 6c 69 74 65 5f 73 74 61 74 20 74 61 62 6c  sqlite_stat tabl
19b60 65 73 22 2c 0a 20 20 22 2e 68 65 61 64 65 72 73  es",.  ".headers
19b70 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20   on|off         
19b80 20 54 75 72 6e 20 64 69 73 70 6c 61 79 20 6f 66   Turn display of
19b90 20 68 65 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f   headers on or o
19ba0 66 66 22 2c 0a 20 20 22 2e 68 65 6c 70 20 3f 2d  ff",.  ".help ?-
19bb0 61 6c 6c 3f 20 3f 50 41 54 54 45 52 4e 3f 20 20  all? ?PATTERN?  
19bc0 20 53 68 6f 77 20 68 65 6c 70 20 74 65 78 74 20   Show help text 
19bd0 66 6f 72 20 50 41 54 54 45 52 4e 22 2c 0a 20 20  for PATTERN",.  
19be0 22 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41  ".import FILE TA
19bf0 42 4c 45 20 20 20 20 20 20 20 49 6d 70 6f 72 74  BLE       Import
19c00 20 64 61 74 61 20 66 72 6f 6d 20 46 49 4c 45 20   data from FILE 
19c10 69 6e 74 6f 20 54 41 42 4c 45 22 2c 0a 23 69 66  into TABLE",.#if
19c20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19c30 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 0a 20 20  _TEST_CONTROL.  
19c40 22 2e 69 6d 70 6f 73 74 65 72 20 49 4e 44 45 58  ".imposter INDEX
19c50 20 54 41 42 4c 45 20 20 20 20 43 72 65 61 74 65   TABLE    Create
19c60 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
19c70 54 41 42 4c 45 20 6f 6e 20 69 6e 64 65 78 20 49  TABLE on index I
19c80 4e 44 45 58 22 2c 0a 23 65 6e 64 69 66 0a 20 20  NDEX",.#endif.  
19c90 22 2e 69 6e 64 65 78 65 73 20 3f 54 41 42 4c 45  ".indexes ?TABLE
19ca0 3f 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 6e  ?         Show n
19cb0 61 6d 65 73 20 6f 66 20 69 6e 64 65 78 65 73 22  ames of indexes"
19cc0 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ,.  "           
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ce0 49 66 20 54 41 42 4c 45 20 69 73 20 73 70 65 63  If TABLE is spec
19cf0 69 66 69 65 64 2c 20 6f 6e 6c 79 20 73 68 6f 77  ified, only show
19d00 20 69 6e 64 65 78 65 73 20 66 6f 72 22 2c 0a 20   indexes for",. 
19d10 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62               tab
19d30 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 54 41 42  les matching TAB
19d40 4c 45 20 75 73 69 6e 67 20 74 68 65 20 4c 49 4b  LE using the LIK
19d50 45 20 6f 70 65 72 61 74 6f 72 2e 22 2c 0a 23 69  E operator.",.#i
19d60 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
19d70 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 22 2e 69  LE_IOTRACE.  ".i
19d80 6f 74 72 61 63 65 20 46 49 4c 45 20 20 20 20 20  otrace FILE     
19d90 20 20 20 20 20 20 20 45 6e 61 62 6c 65 20 49 2f         Enable I/
19da0 4f 20 64 69 61 67 6e 6f 73 74 69 63 20 6c 6f 67  O diagnostic log
19db0 67 69 6e 67 20 74 6f 20 46 49 4c 45 22 2c 0a 23  ging to FILE",.#
19dc0 65 6e 64 69 66 0a 20 20 22 2e 6c 69 6d 69 74 20  endif.  ".limit 
19dd0 3f 4c 49 4d 49 54 3f 20 3f 56 41 4c 3f 20 20 20  ?LIMIT? ?VAL?   
19de0 20 20 44 69 73 70 6c 61 79 20 6f 72 20 63 68 61    Display or cha
19df0 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
19e00 20 61 6e 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54   an SQLITE_LIMIT
19e10 22 2c 0a 20 20 22 2e 6c 69 6e 74 20 4f 50 54 49  ",.  ".lint OPTI
19e20 4f 4e 53 20 20 20 20 20 20 20 20 20 20 20 20 52  ONS            R
19e30 65 70 6f 72 74 20 70 6f 74 65 6e 74 69 61 6c 20  eport potential 
19e40 73 63 68 65 6d 61 20 69 73 73 75 65 73 2e 22 2c  schema issues.",
19e50 0a 20 20 22 20 20 20 20 20 4f 70 74 69 6f 6e 73  .  "     Options
19e60 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 66  :",.  "        f
19e70 6b 65 79 2d 69 6e 64 65 78 65 73 20 20 20 20 20  key-indexes     
19e80 46 69 6e 64 20 6d 69 73 73 69 6e 67 20 66 6f 72  Find missing for
19e90 65 69 67 6e 20 6b 65 79 20 69 6e 64 65 78 65 73  eign key indexes
19ea0 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ",.#ifndef SQLIT
19eb0 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
19ec0 4e 53 49 4f 4e 0a 20 20 22 2e 6c 6f 61 64 20 46  NSION.  ".load F
19ed0 49 4c 45 20 3f 45 4e 54 52 59 3f 20 20 20 20 20  ILE ?ENTRY?     
19ee0 20 20 4c 6f 61 64 20 61 6e 20 65 78 74 65 6e 73    Load an extens
19ef0 69 6f 6e 20 6c 69 62 72 61 72 79 22 2c 0a 23 65  ion library",.#e
19f00 6e 64 69 66 0a 20 20 22 2e 6c 6f 67 20 46 49 4c  ndif.  ".log FIL
19f10 45 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 20  E|off           
19f20 20 54 75 72 6e 20 6c 6f 67 67 69 6e 67 20 6f 6e   Turn logging on
19f30 20 6f 72 20 6f 66 66 2e 20 20 46 49 4c 45 20 63   or off.  FILE c
19f40 61 6e 20 62 65 20 73 74 64 65 72 72 2f 73 74 64  an be stderr/std
19f50 6f 75 74 22 2c 0a 20 20 22 2e 6d 6f 64 65 20 4d  out",.  ".mode M
19f60 4f 44 45 20 3f 54 41 42 4c 45 3f 20 20 20 20 20  ODE ?TABLE?     
19f70 20 20 53 65 74 20 6f 75 74 70 75 74 20 6d 6f 64    Set output mod
19f80 65 22 2c 0a 20 20 22 20 20 20 4d 4f 44 45 20 69  e",.  "   MODE i
19f90 73 20 6f 6e 65 20 6f 66 3a 22 2c 0a 20 20 22 20  s one of:",.  " 
19fa0 20 20 20 20 61 73 63 69 69 20 20 20 20 43 6f 6c      ascii    Col
19fb0 75 6d 6e 73 2f 72 6f 77 73 20 64 65 6c 69 6d 69  umns/rows delimi
19fc0 74 65 64 20 62 79 20 30 78 31 46 20 61 6e 64 20  ted by 0x1F and 
19fd0 30 78 31 45 22 2c 0a 20 20 22 20 20 20 20 20 63  0x1E",.  "     c
19fe0 73 76 20 20 20 20 20 20 43 6f 6d 6d 61 2d 73 65  sv      Comma-se
19ff0 70 61 72 61 74 65 64 20 76 61 6c 75 65 73 22 2c  parated values",
1a000 0a 20 20 22 20 20 20 20 20 63 6f 6c 75 6d 6e 20  .  "     column 
1a010 20 20 4c 65 66 74 2d 61 6c 69 67 6e 65 64 20 63    Left-aligned c
1a020 6f 6c 75 6d 6e 73 2e 20 20 28 53 65 65 20 2e 77  olumns.  (See .w
1a030 69 64 74 68 29 22 2c 0a 20 20 22 20 20 20 20 20  idth)",.  "     
1a040 68 74 6d 6c 20 20 20 20 20 48 54 4d 4c 20 3c 74  html     HTML <t
1a050 61 62 6c 65 3e 20 63 6f 64 65 22 2c 0a 20 20 22  able> code",.  "
1a060 20 20 20 20 20 69 6e 73 65 72 74 20 20 20 53 51       insert   SQ
1a070 4c 20 69 6e 73 65 72 74 20 73 74 61 74 65 6d 65  L insert stateme
1a080 6e 74 73 20 66 6f 72 20 54 41 42 4c 45 22 2c 0a  nts for TABLE",.
1a090 20 20 22 20 20 20 20 20 6c 69 6e 65 20 20 20 20    "     line    
1a0a0 20 4f 6e 65 20 76 61 6c 75 65 20 70 65 72 20 6c   One value per l
1a0b0 69 6e 65 22 2c 0a 20 20 22 20 20 20 20 20 6c 69  ine",.  "     li
1a0c0 73 74 20 20 20 20 20 56 61 6c 75 65 73 20 64 65  st     Values de
1a0d0 6c 69 6d 69 74 65 64 20 62 79 20 5c 22 7c 5c 22  limited by \"|\"
1a0e0 22 2c 0a 20 20 22 20 20 20 20 20 71 75 6f 74 65  ",.  "     quote
1a0f0 20 20 20 20 45 73 63 61 70 65 20 61 6e 73 77 65      Escape answe
1a100 72 73 20 61 73 20 66 6f 72 20 53 51 4c 22 2c 0a  rs as for SQL",.
1a110 20 20 22 20 20 20 20 20 74 61 62 73 20 20 20 20    "     tabs    
1a120 20 54 61 62 2d 73 65 70 61 72 61 74 65 64 20 76   Tab-separated v
1a130 61 6c 75 65 73 22 2c 0a 20 20 22 20 20 20 20 20  alues",.  "     
1a140 74 63 6c 20 20 20 20 20 20 54 43 4c 20 6c 69 73  tcl      TCL lis
1a150 74 20 65 6c 65 6d 65 6e 74 73 22 2c 0a 20 20 22  t elements",.  "
1a160 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52 49 4e  .nullvalue STRIN
1a170 47 20 20 20 20 20 20 20 20 55 73 65 20 53 54 52  G        Use STR
1a180 49 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  ING in place of 
1a190 4e 55 4c 4c 20 76 61 6c 75 65 73 22 2c 0a 20 20  NULL values",.  
1a1a0 22 2e 6f 6e 63 65 20 28 2d 65 7c 2d 78 7c 46 49  ".once (-e|-x|FI
1a1b0 4c 45 29 20 20 20 20 20 20 20 4f 75 74 70 75 74  LE)       Output
1a1c0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 53 51   for the next SQ
1a1d0 4c 20 63 6f 6d 6d 61 6e 64 20 6f 6e 6c 79 20 74  L command only t
1a1e0 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 20  o FILE",.  "    
1a1f0 20 49 66 20 46 49 4c 45 20 62 65 67 69 6e 73 20   If FILE begins 
1a200 77 69 74 68 20 27 7c 27 20 74 68 65 6e 20 6f 70  with '|' then op
1a210 65 6e 20 61 73 20 61 20 70 69 70 65 22 2c 0a 20  en as a pipe",. 
1a220 20 22 20 20 20 20 20 4f 74 68 65 72 20 6f 70 74   "     Other opt
1a230 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20  ions:",.  "     
1a240 20 20 2d 65 20 20 20 20 49 6e 76 6f 6b 65 20 73    -e    Invoke s
1a250 79 73 74 65 6d 20 74 65 78 74 20 65 64 69 74 6f  ystem text edito
1a260 72 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 78  r",.  "       -x
1a270 20 20 20 20 4f 70 65 6e 20 69 6e 20 61 20 73 70      Open in a sp
1a280 72 65 61 64 73 68 65 65 74 22 2c 0a 20 20 22 2e  readsheet",.  ".
1a290 6f 70 65 6e 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f  open ?OPTIONS? ?
1a2a0 46 49 4c 45 3f 20 20 20 43 6c 6f 73 65 20 65 78  FILE?   Close ex
1a2b0 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
1a2c0 61 6e 64 20 72 65 6f 70 65 6e 20 46 49 4c 45 22  and reopen FILE"
1a2d0 2c 0a 20 20 22 20 20 20 20 20 4f 70 74 69 6f 6e  ,.  "     Option
1a2e0 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20  s:",.  "        
1a2f0 2d 2d 61 70 70 65 6e 64 20 20 20 20 20 20 55 73  --append      Us
1a300 65 20 61 70 70 65 6e 64 76 66 73 20 74 6f 20 61  e appendvfs to a
1a310 70 70 65 6e 64 20 64 61 74 61 62 61 73 65 20 74  ppend database t
1a320 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 46 49 4c  o the end of FIL
1a330 45 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d  E",.  "        -
1a340 2d 6e 65 77 20 20 20 20 20 20 20 20 20 49 6e 69  -new         Ini
1a350 74 69 61 6c 69 7a 65 20 46 49 4c 45 20 74 6f 20  tialize FILE to 
1a360 61 6e 20 65 6d 70 74 79 20 64 61 74 61 62 61 73  an empty databas
1a370 65 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d  e",.  "        -
1a380 2d 72 65 61 64 6f 6e 6c 79 20 20 20 20 4f 70 65  -readonly    Ope
1a390 6e 20 46 49 4c 45 20 72 65 61 64 6f 6e 6c 79 22  n FILE readonly"
1a3a0 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d 7a  ,.  "        --z
1a3b0 69 70 20 20 20 20 20 20 20 20 20 46 49 4c 45 20  ip         FILE 
1a3c0 69 73 20 61 20 5a 49 50 20 61 72 63 68 69 76 65  is a ZIP archive
1a3d0 22 2c 0a 20 20 22 2e 6f 75 74 70 75 74 20 3f 46  ",.  ".output ?F
1a3e0 49 4c 45 3f 20 20 20 20 20 20 20 20 20 20 20 53  ILE?           S
1a3f0 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 46 49  end output to FI
1a400 4c 45 20 6f 72 20 73 74 64 6f 75 74 20 69 66 20  LE or stdout if 
1a410 46 49 4c 45 20 69 73 20 6f 6d 69 74 74 65 64 22  FILE is omitted"
1a420 2c 0a 20 20 22 20 20 20 20 20 49 66 20 46 49 4c  ,.  "     If FIL
1a430 45 20 62 65 67 69 6e 73 20 77 69 74 68 20 27 7c  E begins with '|
1a440 27 20 74 68 65 6e 20 6f 70 65 6e 20 69 74 20 61  ' then open it a
1a450 73 20 61 20 70 69 70 65 2e 22 2c 0a 20 20 22 2e  s a pipe.",.  ".
1a460 70 72 69 6e 74 20 53 54 52 49 4e 47 2e 2e 2e 20  print STRING... 
1a470 20 20 20 20 20 20 20 20 50 72 69 6e 74 20 6c 69          Print li
1a480 74 65 72 61 6c 20 53 54 52 49 4e 47 22 2c 0a 20  teral STRING",. 
1a490 20 22 2e 70 72 6f 6d 70 74 20 4d 41 49 4e 20 43   ".prompt MAIN C
1a4a0 4f 4e 54 49 4e 55 45 20 20 20 20 52 65 70 6c 61  ONTINUE    Repla
1a4b0 63 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  ce the standard 
1a4c0 70 72 6f 6d 70 74 73 22 2c 0a 20 20 22 2e 71 75  prompts",.  ".qu
1a4d0 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
1a4e0 20 20 20 20 20 20 45 78 69 74 20 74 68 69 73 20        Exit this 
1a4f0 70 72 6f 67 72 61 6d 22 2c 0a 20 20 22 2e 72 65  program",.  ".re
1a500 61 64 20 46 49 4c 45 20 20 20 20 20 20 20 20 20  ad FILE         
1a510 20 20 20 20 20 20 52 65 61 64 20 69 6e 70 75 74        Read input
1a520 20 66 72 6f 6d 20 46 49 4c 45 22 2c 0a 20 20 22   from FILE",.  "
1a530 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f 20 46 49  .restore ?DB? FI
1a540 4c 45 20 20 20 20 20 20 20 52 65 73 74 6f 72 65  LE       Restore
1a550 20 63 6f 6e 74 65 6e 74 20 6f 66 20 44 42 20 28   content of DB (
1a560 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22  default \"main\"
1a570 29 20 66 72 6f 6d 20 46 49 4c 45 22 2c 0a 20 20  ) from FILE",.  
1a580 22 2e 73 61 76 65 20 46 49 4c 45 20 20 20 20 20  ".save FILE     
1a590 20 20 20 20 20 20 20 20 20 20 57 72 69 74 65 20            Write 
1a5a0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1a5b0 73 65 20 69 6e 74 6f 20 46 49 4c 45 22 2c 0a 20  se into FILE",. 
1a5c0 20 22 2e 73 63 61 6e 73 74 61 74 73 20 6f 6e 7c   ".scanstats on|
1a5d0 6f 66 66 20 20 20 20 20 20 20 20 54 75 72 6e 20  off        Turn 
1a5e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
1a5f0 6e 73 74 61 74 75 73 28 29 20 6d 65 74 72 69 63  nstatus() metric
1a600 73 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 20 20  s on or off",.  
1a610 22 2e 73 63 68 65 6d 61 20 3f 50 41 54 54 45 52  ".schema ?PATTER
1a620 4e 3f 20 20 20 20 20 20 20 20 53 68 6f 77 20 74  N?        Show t
1a630 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
1a640 65 6e 74 73 20 6d 61 74 63 68 69 6e 67 20 50 41  ents matching PA
1a650 54 54 45 52 4e 22 2c 0a 20 20 22 20 20 20 20 20  TTERN",.  "     
1a660 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20  Options:",.  "  
1a670 20 20 20 20 20 20 20 2d 2d 69 6e 64 65 6e 74 20         --indent 
1a680 20 20 20 20 20 20 20 20 20 20 20 54 72 79 20 74             Try t
1a690 6f 20 70 72 65 74 74 79 2d 70 72 69 6e 74 20 74  o pretty-print t
1a6a0 68 65 20 73 63 68 65 6d 61 22 2c 0a 20 20 22 2e  he schema",.  ".
1a6b0 73 65 6c 66 74 65 73 74 20 3f 4f 50 54 49 4f 4e  selftest ?OPTION
1a6c0 53 3f 20 20 20 20 20 20 52 75 6e 20 74 65 73 74  S?      Run test
1a6d0 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  s defined in the
1a6e0 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 22   SELFTEST table"
1a6f0 2c 0a 20 20 22 20 20 20 20 4f 70 74 69 6f 6e 73  ,.  "    Options
1a700 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 2d  :",.  "       --
1a710 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
1a720 20 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20     Create a new 
1a730 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 22 2c  SELFTEST table",
1a740 0a 20 20 22 20 20 20 20 20 20 20 2d 76 20 20 20  .  "       -v   
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a760 56 65 72 62 6f 73 65 20 6f 75 74 70 75 74 22 2c  Verbose output",
1a770 0a 20 20 22 2e 73 65 70 61 72 61 74 6f 72 20 43  .  ".separator C
1a780 4f 4c 20 3f 52 4f 57 3f 20 20 20 20 20 43 68 61  OL ?ROW?     Cha
1a790 6e 67 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  nge the column a
1a7a0 6e 64 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  nd row separator
1a7b0 73 22 2c 0a 23 69 66 20 64 65 66 69 6e 65 64 28  s",.#if defined(
1a7c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
1a7d0 53 53 49 4f 4e 29 0a 20 20 22 2e 73 65 73 73 69  SSION).  ".sessi
1a7e0 6f 6e 20 3f 4e 41 4d 45 3f 20 43 4d 44 20 2e 2e  on ?NAME? CMD ..
1a7f0 2e 20 20 43 72 65 61 74 65 20 6f 72 20 63 6f 6e  .  Create or con
1a800 74 72 6f 6c 20 73 65 73 73 69 6f 6e 73 22 2c 0a  trol sessions",.
1a810 20 20 22 20 20 20 53 75 62 63 6f 6d 6d 61 6e 64    "   Subcommand
1a820 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 61 74 74  s:",.  "     att
1a830 61 63 68 20 54 41 42 4c 45 20 20 20 20 20 20 20  ach TABLE       
1a840 20 20 20 20 20 20 41 74 74 61 63 68 20 54 41 42        Attach TAB
1a850 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 63 68 61  LE",.  "     cha
1a860 6e 67 65 73 65 74 20 46 49 4c 45 20 20 20 20 20  ngeset FILE     
1a870 20 20 20 20 20 20 57 72 69 74 65 20 61 20 63 68        Write a ch
1a880 61 6e 67 65 73 65 74 20 69 6e 74 6f 20 46 49 4c  angeset into FIL
1a890 45 22 2c 0a 20 20 22 20 20 20 20 20 63 6c 6f 73  E",.  "     clos
1a8a0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1a8b0 20 20 20 20 20 43 6c 6f 73 65 20 6f 6e 65 20 73       Close one s
1a8c0 65 73 73 69 6f 6e 22 2c 0a 20 20 22 20 20 20 20  ession",.  "    
1a8d0 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e   enable ?BOOLEAN
1a8e0 3f 20 20 20 20 20 20 20 20 20 53 65 74 20 6f 72  ?         Set or
1a8f0 20 71 75 65 72 79 20 74 68 65 20 65 6e 61 62 6c   query the enabl
1a900 65 20 62 69 74 22 2c 0a 20 20 22 20 20 20 20 20  e bit",.  "     
1a910 66 69 6c 74 65 72 20 47 4c 4f 42 2e 2e 2e 20 20  filter GLOB...  
1a920 20 20 20 20 20 20 20 20 20 52 65 6a 65 63 74 20           Reject 
1a930 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20  tables matching 
1a940 47 4c 4f 42 73 22 2c 0a 20 20 22 20 20 20 20 20  GLOBs",.  "     
1a950 69 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41  indirect ?BOOLEA
1a960 4e 3f 20 20 20 20 20 20 20 4d 61 72 6b 20 6f 72  N?       Mark or
1a970 20 71 75 65 72 79 20 74 68 65 20 69 6e 64 69 72   query the indir
1a980 65 63 74 20 73 74 61 74 75 73 22 2c 0a 20 20 22  ect status",.  "
1a990 20 20 20 20 20 69 73 65 6d 70 74 79 20 20 20 20       isempty    
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 51 75                Qu
1a9b0 65 72 79 20 77 68 65 74 68 65 72 20 74 68 65 20  ery whether the 
1a9c0 73 65 73 73 69 6f 6e 20 69 73 20 65 6d 70 74 79  session is empty
1a9d0 22 2c 0a 20 20 22 20 20 20 20 20 6c 69 73 74 20  ",.  "     list 
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9f0 20 20 20 20 4c 69 73 74 20 63 75 72 72 65 6e 74      List current
1aa00 6c 79 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 20  ly open session 
1aa10 6e 61 6d 65 73 22 2c 0a 20 20 22 20 20 20 20 20  names",.  "     
1aa20 6f 70 65 6e 20 44 42 20 4e 41 4d 45 20 20 20 20  open DB NAME    
1aa30 20 20 20 20 20 20 20 20 20 4f 70 65 6e 20 61 20           Open a 
1aa40 6e 65 77 20 73 65 73 73 69 6f 6e 20 6f 6e 20 44  new session on D
1aa50 42 22 2c 0a 20 20 22 20 20 20 20 20 70 61 74 63  B",.  "     patc
1aa60 68 73 65 74 20 46 49 4c 45 20 20 20 20 20 20 20  hset FILE       
1aa70 20 20 20 20 20 57 72 69 74 65 20 61 20 70 61 74       Write a pat
1aa80 63 68 73 65 74 20 69 6e 74 6f 20 46 49 4c 45 22  chset into FILE"
1aa90 2c 0a 20 20 22 20 20 20 49 66 20 3f 4e 41 4d 45  ,.  "   If ?NAME
1aaa0 3f 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 74 68  ? is omitted, th
1aab0 65 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20  e first defined 
1aac0 73 65 73 73 69 6f 6e 20 69 73 20 75 73 65 64 2e  session is used.
1aad0 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73 68  ",.#endif.  ".sh
1aae0 61 33 73 75 6d 20 2e 2e 2e 20 20 20 20 20 20 20  a3sum ...       
1aaf0 20 20 20 20 20 20 43 6f 6d 70 75 74 65 20 61 20        Compute a 
1ab00 53 48 41 33 20 68 61 73 68 20 6f 66 20 64 61 74  SHA3 hash of dat
1ab10 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 22 2c 0a  abase content",.
1ab20 20 20 22 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22    "    Options:"
1ab30 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73 63 68  ,.  "      --sch
1ab40 65 6d 61 20 20 20 20 20 20 20 20 20 20 20 20 20  ema             
1ab50 20 41 6c 73 6f 20 68 61 73 68 20 74 68 65 20 73   Also hash the s
1ab60 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
1ab70 6c 65 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d  le",.  "      --
1ab80 73 68 61 33 2d 32 32 34 20 20 20 20 20 20 20 20  sha3-224        
1ab90 20 20 20 20 55 73 65 20 74 68 65 20 73 68 61 33      Use the sha3
1aba0 2d 32 32 34 20 61 6c 67 6f 72 69 74 68 6d 22 2c  -224 algorithm",
1abb0 0a 20 20 22 20 20 20 20 20 20 2d 2d 73 68 61 33  .  "      --sha3
1abc0 2d 32 35 36 20 20 20 20 20 20 20 20 20 20 20 20  -256            
1abd0 55 73 65 20 74 68 65 20 73 68 61 33 2d 32 35 36  Use the sha3-256
1abe0 20 61 6c 67 6f 72 69 74 68 6d 2e 20 20 54 68 69   algorithm.  Thi
1abf0 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
1ac00 2e 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73  .",.  "      --s
1ac10 68 61 33 2d 33 38 34 20 20 20 20 20 20 20 20 20  ha3-384         
1ac20 20 20 20 55 73 65 20 74 68 65 20 73 68 61 33 2d     Use the sha3-
1ac30 33 38 34 20 61 6c 67 6f 72 69 74 68 6d 22 2c 0a  384 algorithm",.
1ac40 20 20 22 20 20 20 20 20 20 2d 2d 73 68 61 33 2d    "      --sha3-
1ac50 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 55  512            U
1ac60 73 65 20 74 68 65 20 73 68 61 33 2d 35 31 32 20  se the sha3-512 
1ac70 61 6c 67 6f 72 69 74 68 6d 22 2c 0a 20 20 22 20  algorithm",.  " 
1ac80 20 20 20 41 6e 79 20 6f 74 68 65 72 20 61 72 67     Any other arg
1ac90 75 6d 65 6e 74 20 69 73 20 61 20 4c 49 4b 45 20  ument is a LIKE 
1aca0 70 61 74 74 65 72 6e 20 66 6f 72 20 74 61 62 6c  pattern for tabl
1acb0 65 73 20 74 6f 20 68 61 73 68 22 2c 0a 23 69 66  es to hash",.#if
1acc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41  ndef SQLITE_NOHA
1acd0 56 45 5f 53 59 53 54 45 4d 0a 20 20 22 2e 73 68  VE_SYSTEM.  ".sh
1ace0 65 6c 6c 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20  ell CMD ARGS... 
1acf0 20 20 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52        Run CMD AR
1ad00 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65  GS... in a syste
1ad10 6d 20 73 68 65 6c 6c 22 2c 0a 23 65 6e 64 69 66  m shell",.#endif
1ad20 0a 20 20 22 2e 73 68 6f 77 20 20 20 20 20 20 20  .  ".show       
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f               Sho
1ad40 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  w the current va
1ad50 6c 75 65 73 20 66 6f 72 20 76 61 72 69 6f 75 73  lues for various
1ad60 20 73 65 74 74 69 6e 67 73 22 2c 0a 20 20 22 2e   settings",.  ".
1ad70 73 74 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f 20 20  stats ?on|off?  
1ad80 20 20 20 20 20 20 20 20 53 68 6f 77 20 73 74 61          Show sta
1ad90 74 73 20 6f 72 20 74 75 72 6e 20 73 74 61 74 73  ts or turn stats
1ada0 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 23 69 66   on or off",.#if
1adb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41  ndef SQLITE_NOHA
1adc0 56 45 5f 53 59 53 54 45 4d 0a 20 20 22 2e 73 79  VE_SYSTEM.  ".sy
1add0 73 74 65 6d 20 43 4d 44 20 41 52 47 53 2e 2e 2e  stem CMD ARGS...
1ade0 20 20 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52        Run CMD AR
1adf0 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65  GS... in a syste
1ae00 6d 20 73 68 65 6c 6c 22 2c 0a 23 65 6e 64 69 66  m shell",.#endif
1ae10 0a 20 20 22 2e 74 61 62 6c 65 73 20 3f 54 41 42  .  ".tables ?TAB
1ae20 4c 45 3f 20 20 20 20 20 20 20 20 20 20 4c 69 73  LE?          Lis
1ae30 74 20 6e 61 6d 65 73 20 6f 66 20 74 61 62 6c 65  t names of table
1ae40 73 20 6d 61 74 63 68 69 6e 67 20 4c 49 4b 45 20  s matching LIKE 
1ae50 70 61 74 74 65 72 6e 20 54 41 42 4c 45 22 2c 0a  pattern TABLE",.
1ae60 20 20 22 2e 74 65 73 74 63 61 73 65 20 4e 41 4d    ".testcase NAM
1ae70 45 20 20 20 20 20 20 20 20 20 20 20 42 65 67 69  E           Begi
1ae80 6e 20 72 65 64 69 72 65 63 74 69 6e 67 20 6f 75  n redirecting ou
1ae90 74 70 75 74 20 74 6f 20 27 74 65 73 74 63 61 73  tput to 'testcas
1aea0 65 2d 6f 75 74 2e 74 78 74 27 22 2c 0a 20 20 22  e-out.txt'",.  "
1aeb0 2e 74 69 6d 65 6f 75 74 20 4d 53 20 20 20 20 20  .timeout MS     
1aec0 20 20 20 20 20 20 20 20 20 54 72 79 20 6f 70 65           Try ope
1aed0 6e 69 6e 67 20 6c 6f 63 6b 65 64 20 74 61 62 6c  ning locked tabl
1aee0 65 73 20 66 6f 72 20 4d 53 20 6d 69 6c 6c 69 73  es for MS millis
1aef0 65 63 6f 6e 64 73 22 2c 0a 20 20 22 2e 74 69 6d  econds",.  ".tim
1af00 65 72 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  er on|off       
1af10 20 20 20 20 20 54 75 72 6e 20 53 51 4c 20 74 69       Turn SQL ti
1af20 6d 65 72 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a  mer on or off",.
1af30 20 20 22 2e 74 72 61 63 65 20 46 49 4c 45 7c 6f    ".trace FILE|o
1af40 66 66 20 20 20 20 20 20 20 20 20 20 4f 75 74 70  ff          Outp
1af50 75 74 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  ut each SQL stat
1af60 65 6d 65 6e 74 20 61 73 20 69 74 20 69 73 20 72  ement as it is r
1af70 75 6e 22 2c 0a 20 20 22 2e 76 66 73 69 6e 66 6f  un",.  ".vfsinfo
1af80 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20 20 20   ?AUX?          
1af90 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
1afa0 75 74 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  ut the top-level
1afb0 20 56 46 53 22 2c 0a 20 20 22 2e 76 66 73 6c 69   VFS",.  ".vfsli
1afc0 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
1afd0 20 20 20 4c 69 73 74 20 61 6c 6c 20 61 76 61 69     List all avai
1afe0 6c 61 62 6c 65 20 56 46 53 65 73 22 2c 0a 20 20  lable VFSes",.  
1aff0 22 2e 76 66 73 6e 61 6d 65 20 3f 41 55 58 3f 20  ".vfsname ?AUX? 
1b000 20 20 20 20 20 20 20 20 20 20 50 72 69 6e 74 20            Print 
1b010 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1b020 56 46 53 20 73 74 61 63 6b 22 2c 0a 20 20 22 2e  VFS stack",.  ".
1b030 77 69 64 74 68 20 4e 55 4d 31 20 4e 55 4d 32 20  width NUM1 NUM2 
1b040 2e 2e 2e 20 20 20 20 20 53 65 74 20 63 6f 6c 75  ...     Set colu
1b050 6d 6e 20 77 69 64 74 68 73 20 66 6f 72 20 5c 22  mn widths for \"
1b060 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65 22 2c 0a  column\" mode",.
1b070 20 20 22 20 20 20 20 20 4e 65 67 61 74 69 76 65    "     Negative
1b080 20 76 61 6c 75 65 73 20 72 69 67 68 74 2d 6a 75   values right-ju
1b090 73 74 69 66 79 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  stify",.};../*.*
1b0a0 2a 20 4f 75 74 70 75 74 20 68 65 6c 70 20 74 65  * Output help te
1b0b0 78 74 2e 0a 2a 2a 0a 2a 2a 20 7a 50 61 74 74 65  xt..**.** zPatte
1b0c0 72 6e 20 64 65 73 63 72 69 62 65 73 20 74 68 65  rn describes the
1b0d0 20 73 65 74 20 6f 66 20 63 6f 6d 6d 61 6e 64 73   set of commands
1b0e0 20 66 6f 72 20 77 68 69 63 68 20 68 65 6c 70 20   for which help 
1b0f0 74 65 78 74 20 69 73 20 70 72 6f 76 69 64 65 64  text is provided
1b100 2e 0a 2a 2a 20 49 66 20 7a 50 61 74 74 65 72 6e  ..** If zPattern
1b110 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 73   is NULL, then s
1b120 68 6f 77 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73  how all commands
1b130 2c 20 62 75 74 20 6f 6e 6c 79 20 67 69 76 65 20  , but only give 
1b140 61 20 6f 6e 65 2d 6c 69 6e 65 0a 2a 2a 20 64 65  a one-line.** de
1b150 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 65 61 63  scription of eac
1b160 68 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  h..**.** Return 
1b170 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  the number of ma
1b180 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tches..*/.static
1b190 20 69 6e 74 20 73 68 6f 77 48 65 6c 70 28 46 49   int showHelp(FI
1b1a0 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
1b1b0 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 29 7b 0a  har *zPattern){.
1b1c0 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
1b1d0 6e 74 20 6a 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt j = 0;.  int 
1b1e0 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  n = 0;.  char *z
1b1f0 50 61 74 3b 0a 20 20 69 66 28 20 7a 50 61 74 74  Pat;.  if( zPatt
1b200 65 72 6e 3d 3d 30 0a 20 20 20 7c 7c 20 7a 50 61  ern==0.   || zPa
1b210 74 74 65 72 6e 5b 30 5d 3d 3d 27 30 27 0a 20 20  ttern[0]=='0'.  
1b220 20 7c 7c 20 73 74 72 63 6d 70 28 7a 50 61 74 74   || strcmp(zPatt
1b230 65 72 6e 2c 22 2d 61 22 29 3d 3d 30 0a 20 20 20  ern,"-a")==0.   
1b240 7c 7c 20 73 74 72 63 6d 70 28 7a 50 61 74 74 65  || strcmp(zPatte
1b250 72 6e 2c 22 2d 61 6c 6c 22 29 3d 3d 30 0a 20 20  rn,"-all")==0.  
1b260 29 7b 0a 20 20 20 20 2f 2a 20 53 68 6f 77 20 61  ){.    /* Show a
1b270 6c 6c 20 63 6f 6d 6d 61 6e 64 73 2c 20 62 75 74  ll commands, but
1b280 20 6f 6e 6c 79 20 6f 6e 65 20 6c 69 6e 65 20 70   only one line p
1b290 65 72 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  er command */.  
1b2a0 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d    if( zPattern==
1b2b0 30 20 29 20 7a 50 61 74 74 65 72 6e 20 3d 20 22  0 ) zPattern = "
1b2c0 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ";.    for(i=0; 
1b2d0 69 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65  i<ArraySize(azHe
1b2e0 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  lp); i++){.     
1b2f0 20 69 66 28 20 61 7a 48 65 6c 70 5b 69 5d 5b 30   if( azHelp[i][0
1b300 5d 3d 3d 27 2e 27 20 7c 7c 20 7a 50 61 74 74 65  ]=='.' || zPatte
1b310 72 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  rn[0] ){.       
1b320 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
1b330 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70  , "%s\n", azHelp
1b340 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 2b  [i]);.        n+
1b350 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1b360 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1b370 20 4c 6f 6f 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e   Look for comman
1b380 64 73 20 74 68 61 74 20 66 6f 72 20 77 68 69 63  ds that for whic
1b390 68 20 7a 50 61 74 74 65 72 6e 20 69 73 20 61 6e  h zPattern is an
1b3a0 20 65 78 61 63 74 20 70 72 65 66 69 78 20 2a 2f   exact prefix */
1b3b0 0a 20 20 20 20 7a 50 61 74 20 3d 20 73 71 6c 69  .    zPat = sqli
1b3c0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 2e 25 73  te3_mprintf(".%s
1b3d0 2a 22 2c 20 7a 50 61 74 74 65 72 6e 29 3b 0a 20  *", zPattern);. 
1b3e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
1b3f0 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 3b  raySize(azHelp);
1b400 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
1b410 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
1b420 28 7a 50 61 74 2c 20 61 7a 48 65 6c 70 5b 69 5d  (zPat, azHelp[i]
1b430 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1b440 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
1b450 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b   "%s\n", azHelp[
1b460 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  i]);.        j =
1b470 20 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 6e 2b   i+1;.        n+
1b480 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1b490 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1b4a0 65 28 7a 50 61 74 29 3b 0a 20 20 20 20 69 66 28  e(zPat);.    if(
1b4b0 20 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20   n ){.      if( 
1b4c0 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  n==1 ){.        
1b4d0 2f 2a 20 77 68 65 6e 20 7a 50 61 74 74 65 72 6e  /* when zPattern
1b4e0 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
1b4f0 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 6f 6d 6d  exactly one comm
1b500 61 6e 64 2c 20 74 68 65 6e 20 69 6e 63 6c 75 64  and, then includ
1b510 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  e the.        **
1b520 20 64 65 74 61 69 6c 73 20 6f 66 20 74 68 61 74   details of that
1b530 20 63 6f 6d 6d 61 6e 64 2c 20 77 68 69 63 68 20   command, which 
1b540 73 68 6f 75 6c 64 20 62 65 67 69 6e 20 61 74 20  should begin at 
1b550 6f 66 66 73 65 74 20 6a 20 2a 2f 0a 20 20 20 20  offset j */.    
1b560 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 41 72 72      while( j<Arr
1b570 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 2d 31  aySize(azHelp)-1
1b580 20 26 26 20 61 7a 48 65 6c 70 5b 6a 5d 5b 30 5d   && azHelp[j][0]
1b590 21 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20  !='.' ){.       
1b5a0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
1b5b0 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65  ut, "%s\n", azHe
1b5c0 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20  lp[j]);.        
1b5d0 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d    j++;.        }
1b5e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1b5f0 65 74 75 72 6e 20 6e 3b 0a 20 20 20 20 7d 0a 20  eturn n;.    }. 
1b600 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 63     /* Look for c
1b610 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 63 6f 6e  ommands that con
1b620 74 61 69 6e 20 7a 50 61 74 74 65 72 6e 20 61 6e  tain zPattern an
1b630 79 77 68 65 72 65 2e 20 20 53 68 6f 77 20 74 68  ywhere.  Show th
1b640 65 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a  e complete.    *
1b650 2a 20 74 65 78 74 20 6f 66 20 61 6c 6c 20 63 6f  * text of all co
1b660 6d 6d 61 6e 64 73 20 74 68 61 74 20 6d 61 74 63  mmands that matc
1b670 68 2e 20 2a 2f 0a 20 20 20 20 7a 50 61 74 20 3d  h. */.    zPat =
1b680 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1b690 28 22 25 25 25 73 25 25 22 2c 20 7a 50 61 74 74  ("%%%s%%", zPatt
1b6a0 65 72 6e 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ern);.    for(i=
1b6b0 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
1b6c0 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20 20  zHelp); i++){.  
1b6d0 20 20 20 20 69 66 28 20 61 7a 48 65 6c 70 5b 69      if( azHelp[i
1b6e0 5d 5b 30 5d 3d 3d 27 2e 27 20 29 20 6a 20 3d 20  ][0]=='.' ) j = 
1b6f0 69 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  i;.      if( sql
1b700 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a 50 61  ite3_strlike(zPa
1b710 74 2c 20 61 7a 48 65 6c 70 5b 69 5d 2c 20 30 29  t, azHelp[i], 0)
1b720 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==0 ){.        u
1b730 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
1b740 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a  "%s\n", azHelp[j
1b750 5d 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  ]);.        whil
1b760 65 28 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 61  e( j<ArraySize(a
1b770 7a 48 65 6c 70 29 2d 31 20 26 26 20 61 7a 48 65  zHelp)-1 && azHe
1b780 6c 70 5b 6a 2b 31 5d 5b 30 5d 21 3d 27 2e 27 20  lp[j+1][0]!='.' 
1b790 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  ){.          j++
1b7a0 3b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  ;.          utf8
1b7b0 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
1b7c0 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b  \n", azHelp[j]);
1b7d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b7e0 20 20 20 69 20 3d 20 6a 3b 0a 20 20 20 20 20 20     i = j;.      
1b7f0 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    n++;.      }. 
1b800 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1b810 5f 66 72 65 65 28 7a 50 61 74 29 3b 0a 20 20 7d  _free(zPat);.  }
1b820 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
1b830 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1b840 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
1b850 6e 74 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74  nt process_input
1b860 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
1b870 46 49 4c 45 20 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a  FILE *in);../*.*
1b880 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
1b890 6e 74 20 6f 66 20 66 69 6c 65 20 7a 4e 61 6d 65  nt of file zName
1b8a0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
1b8b0 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1b8c0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 0a 2a 2a  e3_malloc64().**
1b8d0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
1b8e0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 75 66  inter to the buf
1b8f0 66 65 72 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  fer. The caller 
1b900 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
1b910 6f 72 20 66 72 65 65 69 6e 67 0a 2a 2a 20 74 68  or freeing.** th
1b920 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  e memory..**.** 
1b930 49 66 20 70 61 72 61 6d 65 74 65 72 20 70 6e 42  If parameter pnB
1b940 79 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  yte is not NULL,
1b950 20 28 2a 70 6e 42 79 74 65 29 20 69 73 20 73 65   (*pnByte) is se
1b960 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
1b970 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64  of bytes.** read
1b980 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 76  ..**.** For conv
1b990 65 6e 69 65 6e 63 65 2c 20 61 20 6e 75 6c 2d 74  enience, a nul-t
1b9a0 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69  erminator byte i
1b9b0 73 20 61 6c 77 61 79 73 20 61 70 70 65 6e 64 65  s always appende
1b9c0 64 20 74 6f 20 74 68 65 20 64 61 74 61 20 72 65  d to the data re
1b9d0 61 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ad.** from the f
1b9e0 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 62  ile before the b
1b9f0 75 66 66 65 72 20 69 73 20 72 65 74 75 72 6e 65  uffer is returne
1ba00 64 2e 20 54 68 69 73 20 62 79 74 65 20 69 73 20  d. This byte is 
1ba10 6e 6f 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a  not included in.
1ba20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 76 61 6c  ** the final val
1ba30 75 65 20 6f 66 20 28 2a 70 6e 42 79 74 65 29 2c  ue of (*pnByte),
1ba40 20 69 66 20 61 70 70 6c 69 63 61 62 6c 65 2e 0a   if applicable..
1ba50 2a 2a 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65  **.** NULL is re
1ba60 74 75 72 6e 65 64 20 69 66 20 61 6e 79 20 65 72  turned if any er
1ba70 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1ba80 65 64 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61  ed. The final va
1ba90 6c 75 65 20 6f 66 20 2a 70 6e 42 79 74 65 0a 2a  lue of *pnByte.*
1baa0 2a 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69  * is undefined i
1bab0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
1bac0 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 61  static char *rea
1bad0 64 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  dFile(const char
1bae0 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e   *zName, int *pn
1baf0 42 79 74 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69  Byte){.  FILE *i
1bb00 6e 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c  n = fopen(zName,
1bb10 20 22 72 62 22 29 3b 0a 20 20 6c 6f 6e 67 20 6e   "rb");.  long n
1bb20 49 6e 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52 65  In;.  size_t nRe
1bb30 61 64 3b 0a 20 20 63 68 61 72 20 2a 70 42 75 66  ad;.  char *pBuf
1bb40 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20  ;.  if( in==0 ) 
1bb50 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 73 65 65  return 0;.  fsee
1bb60 6b 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e  k(in, 0, SEEK_EN
1bb70 44 29 3b 0a 20 20 6e 49 6e 20 3d 20 66 74 65 6c  D);.  nIn = ftel
1bb80 6c 28 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28  l(in);.  rewind(
1bb90 69 6e 29 3b 0a 20 20 70 42 75 66 20 3d 20 73 71  in);.  pBuf = sq
1bba0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
1bbb0 6e 49 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 70  nIn+1 );.  if( p
1bbc0 42 75 66 3d 3d 30 20 29 7b 20 66 63 6c 6f 73 65  Buf==0 ){ fclose
1bbd0 28 69 6e 29 3b 20 72 65 74 75 72 6e 20 30 3b 20  (in); return 0; 
1bbe0 7d 0a 20 20 6e 52 65 61 64 20 3d 20 66 72 65 61  }.  nRead = frea
1bbf0 64 28 70 42 75 66 2c 20 6e 49 6e 2c 20 31 2c 20  d(pBuf, nIn, 1, 
1bc00 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e  in);.  fclose(in
1bc10 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 21 3d  );.  if( nRead!=
1bc20 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
1bc30 5f 66 72 65 65 28 70 42 75 66 29 3b 0a 20 20 20  _free(pBuf);.   
1bc40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1bc50 20 70 42 75 66 5b 6e 49 6e 5d 20 3d 20 30 3b 0a   pBuf[nIn] = 0;.
1bc60 20 20 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a    if( pnByte ) *
1bc70 70 6e 42 79 74 65 20 3d 20 6e 49 6e 3b 0a 20 20  pnByte = nIn;.  
1bc80 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a  return pBuf;.}..
1bc90 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1bca0 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
1bcb0 4e 29 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  N)./*.** Close a
1bcc0 20 73 69 6e 67 6c 65 20 4f 70 65 6e 53 65 73 73   single OpenSess
1bcd0 69 6f 6e 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  ion object and r
1bce0 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 69 74  elease all of it
1bcf0 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  s associated.** 
1bd00 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 73 74  resources..*/.st
1bd10 61 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f  atic void sessio
1bd20 6e 5f 63 6c 6f 73 65 28 4f 70 65 6e 53 65 73 73  n_close(OpenSess
1bd30 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 29 7b 0a  ion *pSession){.
1bd40 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
1bd50 65 33 73 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65  e3session_delete
1bd60 28 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20  (pSession->p);. 
1bd70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
1bd80 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a  ession->zName);.
1bd90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65    for(i=0; i<pSe
1bda0 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20  ssion->nFilter; 
1bdb0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1bdc0 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d  3_free(pSession-
1bdd0 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 29 3b 0a 20  >azFilter[i]);. 
1bde0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
1bdf0 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69  e(pSession->azFi
1be00 6c 74 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28  lter);.  memset(
1be10 70 53 65 73 73 69 6f 6e 2c 20 30 2c 20 73 69 7a  pSession, 0, siz
1be20 65 6f 66 28 4f 70 65 6e 53 65 73 73 69 6f 6e 29  eof(OpenSession)
1be30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
1be40 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 4f 70 65  ** Close all Ope
1be50 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73  nSession objects
1be60 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
1be70 20 61 73 73 6f 63 69 61 74 65 64 20 72 65 73 6f   associated reso
1be80 75 72 63 65 73 2e 0a 2a 2f 0a 23 69 66 20 64 65  urces..*/.#if de
1be90 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1bea0 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61  BLE_SESSION).sta
1beb0 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e  tic void session
1bec0 5f 63 6c 6f 73 65 5f 61 6c 6c 28 53 68 65 6c 6c  _close_all(Shell
1bed0 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74  State *p){.  int
1bee0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
1bef0 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b  <p->nSession; i+
1bf00 2b 29 7b 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f  +){.    session_
1bf10 63 6c 6f 73 65 28 26 70 2d 3e 61 53 65 73 73 69  close(&p->aSessi
1bf20 6f 6e 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 2d  on[i]);.  }.  p-
1bf30 3e 6e 53 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 7d  >nSession = 0;.}
1bf40 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1bf50 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c  session_close_al
1bf60 6c 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  l(X).#endif../*.
1bf70 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
1bf80 6e 20 6f 66 20 74 68 65 20 78 46 69 6c 74 65 72  n of the xFilter
1bf90 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e   function for an
1bfa0 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 2e 20 20   open session.  
1bfb0 4f 6d 69 74 0a 2a 2a 20 61 6e 79 20 74 61 62 6c  Omit.** any tabl
1bfc0 65 73 20 6e 61 6d 65 64 20 62 79 20 22 2e 73 65  es named by ".se
1bfd0 73 73 69 6f 6e 20 66 69 6c 74 65 72 22 20 62 75  ssion filter" bu
1bfe0 74 20 6c 65 74 20 61 6c 6c 20 6f 74 68 65 72 20  t let all other 
1bff0 74 61 62 6c 65 20 74 68 72 6f 75 67 68 2e 0a 2a  table through..*
1c000 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
1c010 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
1c020 49 4f 4e 29 0a 73 74 61 74 69 63 20 69 6e 74 20  ION).static int 
1c030 73 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72 28 76  session_filter(v
1c040 6f 69 64 20 2a 70 43 74 78 2c 20 63 6f 6e 73 74  oid *pCtx, const
1c050 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20   char *zTab){.  
1c060 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65  OpenSession *pSe
1c070 73 73 69 6f 6e 20 3d 20 28 4f 70 65 6e 53 65 73  ssion = (OpenSes
1c080 73 69 6f 6e 2a 29 70 43 74 78 3b 0a 20 20 69 6e  sion*)pCtx;.  in
1c090 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1c0a0 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c  i<pSession->nFil
1c0b0 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ter; i++){.    i
1c0c0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
1c0d0 6f 62 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46  ob(pSession->azF
1c0e0 69 6c 74 65 72 5b 69 5d 2c 20 7a 54 61 62 29 3d  ilter[i], zTab)=
1c0f0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1c100 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
1c110 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1c120 72 79 20 74 6f 20 64 65 64 75 63 65 20 74 68 65  ry to deduce the
1c130 20 74 79 70 65 20 6f 66 20 66 69 6c 65 20 66 6f   type of file fo
1c140 72 20 7a 4e 61 6d 65 20 62 61 73 65 64 20 6f 6e  r zName based on
1c150 20 69 74 73 20 63 6f 6e 74 65 6e 74 2e 20 20 52   its content.  R
1c160 65 74 75 72 6e 0a 2a 2a 20 6f 6e 65 20 6f 66 20  eturn.** one of 
1c170 74 68 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 2a  the SHELL_OPEN_*
1c180 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 2a 2a 0a 2a   constants..**.*
1c190 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f  * If the file do
1c1a0 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
1c1b0 69 73 20 65 6d 70 74 79 20 62 75 74 20 69 74 73  is empty but its
1c1c0 20 6e 61 6d 65 20 6c 6f 6f 6b 73 20 6c 69 6b 65   name looks like
1c1d0 20 61 20 5a 49 50 0a 2a 2a 20 61 72 63 68 69 76   a ZIP.** archiv
1c1e0 65 20 61 6e 64 20 74 68 65 20 64 66 6c 74 5a 69  e and the dfltZi
1c1f0 70 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  p flag is true, 
1c200 74 68 65 6e 20 61 73 73 75 6d 65 20 69 74 20 69  then assume it i
1c210 73 20 61 20 5a 49 50 20 61 72 63 68 69 76 65 2e  s a ZIP archive.
1c220 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
1c230 73 73 75 6d 65 20 61 6e 20 6f 72 64 69 6e 61 72  ssume an ordinar
1c240 79 20 64 61 74 61 62 61 73 65 20 72 65 67 61 72  y database regar
1c250 64 6c 65 73 73 20 6f 66 20 74 68 65 20 66 69 6c  dless of the fil
1c260 65 6e 61 6d 65 20 69 66 0a 2a 2a 20 74 68 65 20  ename if.** the 
1c270 74 79 70 65 20 63 61 6e 6e 6f 74 20 62 65 20 64  type cannot be d
1c280 65 74 65 72 6d 69 6e 65 64 20 66 72 6f 6d 20 63  etermined from c
1c290 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 64  ontent..*/.int d
1c2a0 65 64 75 63 65 44 61 74 61 62 61 73 65 54 79 70  educeDatabaseTyp
1c2b0 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  e(const char *zN
1c2c0 61 6d 65 2c 20 69 6e 74 20 64 66 6c 74 5a 69 70  ame, int dfltZip
1c2d0 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20 66  ){.  FILE *f = f
1c2e0 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22  open(zName, "rb"
1c2f0 29 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 3b 0a 20  );.  size_t n;. 
1c300 20 69 6e 74 20 72 63 20 3d 20 53 48 45 4c 4c 5f   int rc = SHELL_
1c310 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 63  OPEN_UNSPEC;.  c
1c320 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20  har zBuf[100];. 
1c330 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20   if( f==0 ){.   
1c340 20 69 66 28 20 64 66 6c 74 5a 69 70 20 26 26 20   if( dfltZip && 
1c350 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
1c360 22 25 2e 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29  "%.zip",zName,0)
1c370 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 72 65  ==0 ){.       re
1c380 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  turn SHELL_OPEN_
1c390 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d 65 6c  ZIPFILE;.    }el
1c3a0 73 65 7b 0a 20 20 20 20 20 20 20 72 65 74 75 72  se{.       retur
1c3b0 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52  n SHELL_OPEN_NOR
1c3c0 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MAL;.    }.  }. 
1c3d0 20 66 73 65 65 6b 28 66 2c 20 2d 32 35 2c 20 53   fseek(f, -25, S
1c3e0 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 20 3d 20  EEK_END);.  n = 
1c3f0 66 72 65 61 64 28 7a 42 75 66 2c 20 32 35 2c 20  fread(zBuf, 25, 
1c400 31 2c 20 66 29 3b 0a 20 20 69 66 28 20 6e 3d 3d  1, f);.  if( n==
1c410 31 20 26 26 20 6d 65 6d 63 6d 70 28 7a 42 75 66  1 && memcmp(zBuf
1c420 2c 20 22 53 74 61 72 74 2d 4f 66 2d 53 51 4c 69  , "Start-Of-SQLi
1c430 74 65 33 2d 22 2c 20 31 37 29 3d 3d 30 20 29 7b  te3-", 17)==0 ){
1c440 0a 20 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f  .    rc = SHELL_
1c450 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a  OPEN_APPENDVFS;.
1c460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 73 65    }else{.    fse
1c470 65 6b 28 66 2c 20 2d 32 32 2c 20 53 45 45 4b 5f  ek(f, -22, SEEK_
1c480 45 4e 44 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72  END);.    n = fr
1c490 65 61 64 28 7a 42 75 66 2c 20 32 32 2c 20 31 2c  ead(zBuf, 22, 1,
1c4a0 20 66 29 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d   f);.    if( n==
1c4b0 31 20 26 26 20 7a 42 75 66 5b 30 5d 3d 3d 30 78  1 && zBuf[0]==0x
1c4c0 35 30 20 26 26 20 7a 42 75 66 5b 31 5d 3d 3d 30  50 && zBuf[1]==0
1c4d0 78 34 62 20 26 26 20 7a 42 75 66 5b 32 5d 3d 3d  x4b && zBuf[2]==
1c4e0 30 78 30 35 0a 20 20 20 20 20 20 20 26 26 20 7a  0x05.       && z
1c4f0 42 75 66 5b 33 5d 3d 3d 30 78 30 36 20 29 7b 0a  Buf[3]==0x06 ){.
1c500 20 20 20 20 20 20 72 63 20 3d 20 53 48 45 4c 4c        rc = SHELL
1c510 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20  _OPEN_ZIPFILE;. 
1c520 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d     }else if( n==
1c530 30 20 26 26 20 64 66 6c 74 5a 69 70 20 26 26 20  0 && dfltZip && 
1c540 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
1c550 22 25 2e 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29  "%.zip",zName,0)
1c560 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1c570 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50  = SHELL_OPEN_ZIP
1c580 46 49 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FILE;.    }.  }.
1c590 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 72    fclose(f);.  r
1c5a0 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 2f  eturn rc;  .}../
1c5b0 2a 20 46 6c 61 67 73 20 66 6f 72 20 6f 70 65 6e  * Flags for open
1c5c0 5f 64 62 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  _db()..**.** The
1c5d0 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f   default behavio
1c5e0 72 20 6f 66 20 6f 70 65 6e 5f 64 62 28 29 20 69  r of open_db() i
1c5f0 73 20 74 6f 20 65 78 69 74 28 31 29 20 69 66 20  s to exit(1) if 
1c600 74 68 65 20 64 61 74 61 62 61 73 65 20 66 61 69  the database fai
1c610 6c 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 2e 20 20  ls to.** open.  
1c620 54 68 65 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50  The OPEN_DB_KEEP
1c630 41 4c 49 56 45 20 66 6c 61 67 20 63 68 61 6e 67  ALIVE flag chang
1c640 65 73 20 74 68 61 74 20 73 6f 20 74 68 61 74 20  es that so that 
1c650 69 74 20 70 72 69 6e 74 73 20 61 6e 20 65 72 72  it prints an err
1c660 6f 72 0a 2a 2a 20 62 75 74 20 73 74 69 6c 6c 20  or.** but still 
1c670 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20  returns without 
1c680 63 61 6c 6c 69 6e 67 20 65 78 69 74 2e 0a 2a 2a  calling exit..**
1c690 0a 2a 2a 20 54 68 65 20 4f 50 45 4e 5f 44 42 5f  .** The OPEN_DB_
1c6a0 5a 49 50 46 49 4c 45 20 66 6c 61 67 20 63 61 75  ZIPFILE flag cau
1c6b0 73 65 73 20 6f 70 65 6e 5f 64 62 28 29 20 74 6f  ses open_db() to
1c6c0 20 70 72 65 66 65 72 20 74 6f 20 6f 70 65 6e 20   prefer to open 
1c6d0 66 69 6c 65 73 20 61 73 20 61 0a 2a 2a 20 5a 49  files as a.** ZI
1c6e0 50 20 61 72 63 68 69 76 65 20 69 66 20 74 68 65  P archive if the
1c6f0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
1c700 78 69 73 74 20 6f 72 20 69 73 20 65 6d 70 74 79  xist or is empty
1c710 20 61 6e 64 20 69 74 73 20 6e 61 6d 65 20 6d 61   and its name ma
1c720 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 2a 2e 7a  tches.** the *.z
1c730 69 70 20 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a 23  ip pattern..*/.#
1c740 64 65 66 69 6e 65 20 4f 50 45 4e 5f 44 42 5f 4b  define OPEN_DB_K
1c750 45 45 50 41 4c 49 56 45 20 20 20 30 78 30 30 31  EEPALIVE   0x001
1c760 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 66 74     /* Return aft
1c770 65 72 20 65 72 72 6f 72 20 69 66 20 74 72 75 65  er error if true
1c780 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e   */.#define OPEN
1c790 5f 44 42 5f 5a 49 50 46 49 4c 45 20 20 20 20 20  _DB_ZIPFILE     
1c7a0 30 78 30 30 32 20 20 20 2f 2a 20 4f 70 65 6e 20  0x002   /* Open 
1c7b0 61 73 20 5a 49 50 20 69 66 20 6e 61 6d 65 20 6d  as ZIP if name m
1c7c0 61 74 63 68 65 73 20 2a 2e 7a 69 70 20 2a 2f 0a  atches *.zip */.
1c7d0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1c7e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1c7f0 20 6f 70 65 6e 2e 20 20 49 66 20 69 74 20 69 73   open.  If it is
1c800 20 6e 6f 74 2c 20 74 68 65 6e 20 6f 70 65 6e 20   not, then open 
1c810 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 64  it.  If.** the d
1c820 61 74 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f  atabase fails to
1c830 20 6f 70 65 6e 2c 20 70 72 69 6e 74 20 61 6e 20   open, print an 
1c840 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e  error message an
1c850 64 20 65 78 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  d exit..*/.stati
1c860 63 20 76 6f 69 64 20 6f 70 65 6e 5f 64 62 28 53  c void open_db(S
1c870 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e  hellState *p, in
1c880 74 20 6f 70 65 6e 46 6c 61 67 73 29 7b 0a 20 20  t openFlags){.  
1c890 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a  if( p->db==0 ){.
1c8a0 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d      if( p->openM
1c8b0 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f  ode==SHELL_OPEN_
1c8c0 55 4e 53 50 45 43 20 29 7b 0a 20 20 20 20 20 20  UNSPEC ){.      
1c8d0 69 66 28 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61  if( p->zDbFilena
1c8e0 6d 65 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 62 46  me==0 || p->zDbF
1c8f0 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b  ilename[0]==0 ){
1c900 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e  .        p->open
1c910 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45  Mode = SHELL_OPE
1c920 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20  N_NORMAL;.      
1c930 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1c940 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 28 75 38  ->openMode = (u8
1c950 29 64 65 64 75 63 65 44 61 74 61 62 61 73 65 54  )deduceDatabaseT
1c960 79 70 65 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61  ype(p->zDbFilena
1c970 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  me, .           
1c980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c990 20 20 28 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f    (openFlags & O
1c9a0 50 45 4e 5f 44 42 5f 5a 49 50 46 49 4c 45 29 21  PEN_DB_ZIPFILE)!
1c9b0 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  =0);.      }.   
1c9c0 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 70   }.    switch( p
1c9d0 2d 3e 6f 70 65 6e 4d 6f 64 65 20 29 7b 0a 20 20  ->openMode ){.  
1c9e0 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f      case SHELL_O
1c9f0 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3a 20 7b  PEN_APPENDVFS: {
1ca00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ca10 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a 44 62 46  _open_v2(p->zDbF
1ca20 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 2c  ilename, &p->db,
1ca30 20 0a 20 20 20 20 20 20 20 20 20 20 20 53 51 4c   .           SQL
1ca40 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1ca50 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
1ca60 52 45 41 54 45 2c 20 22 61 70 6e 64 76 66 73 22  REATE, "apndvfs"
1ca70 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1ca80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ca90 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  case SHELL_OPEN_
1caa0 5a 49 50 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  ZIPFILE: {.     
1cab0 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28     sqlite3_open(
1cac0 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 26 70 2d 3e  ":memory:", &p->
1cad0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  db);.        bre
1cae0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1caf0 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45    case SHELL_OPE
1cb00 4e 5f 52 45 41 44 4f 4e 4c 59 3a 20 7b 0a 20 20  N_READONLY: {.  
1cb10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70        sqlite3_op
1cb20 65 6e 5f 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65  en_v2(p->zDbFile
1cb30 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 2c 20 53 51  name, &p->db, SQ
1cb40 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1cb50 4c 59 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  LY, 0);.        
1cb60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1cb70 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f       case SHELL_
1cb80 4f 50 45 4e 5f 55 4e 53 50 45 43 3a 0a 20 20 20  OPEN_UNSPEC:.   
1cb90 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50     case SHELL_OP
1cba0 45 4e 5f 4e 4f 52 4d 41 4c 3a 20 7b 0a 20 20 20  EN_NORMAL: {.   
1cbb0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65       sqlite3_ope
1cbc0 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  n(p->zDbFilename
1cbd0 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  , &p->db);.     
1cbe0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1cbf0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 67 6c 6f 62  }.    }.    glob
1cc00 61 6c 44 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  alDb = p->db;.  
1cc10 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 7c    if( p->db==0 |
1cc20 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  | SQLITE_OK!=sql
1cc30 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e  ite3_errcode(p->
1cc40 64 62 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66  db) ){.      utf
1cc50 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1cc60 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c 65 20 74  "Error: unable t
1cc70 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
1cc80 5c 22 25 73 5c 22 3a 20 25 73 5c 6e 22 2c 0a 20  \"%s\": %s\n",. 
1cc90 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 46           p->zDbF
1cca0 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  ilename, sqlite3
1ccb0 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
1ccc0 0a 20 20 20 20 20 20 69 66 28 20 6f 70 65 6e 46  .      if( openF
1ccd0 6c 61 67 73 20 26 20 4f 50 45 4e 5f 44 42 5f 4b  lags & OPEN_DB_K
1cce0 45 45 50 41 4c 49 56 45 20 29 20 72 65 74 75 72  EEPALIVE ) retur
1ccf0 6e 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29  n;.      exit(1)
1cd00 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1cd10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
1cd20 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 73  _EXTENSION.    s
1cd30 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f  qlite3_enable_lo
1cd40 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e  ad_extension(p->
1cd50 64 62 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20  db, 1);.#endif. 
1cd60 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69     sqlite3_filei
1cd70 6f 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c  o_init(p->db, 0,
1cd80 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1cd90 5f 73 68 61 74 68 72 65 65 5f 69 6e 69 74 28 70  _shathree_init(p
1cda0 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
1cdb0 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
1cdc0 69 6f 6e 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  ion_init(p->db, 
1cdd0 30 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51  0, 0);.#ifdef SQ
1cde0 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 20  LITE_HAVE_ZLIB. 
1cdf0 20 20 20 73 71 6c 69 74 65 33 5f 7a 69 70 66 69     sqlite3_zipfi
1ce00 6c 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30  le_init(p->db, 0
1ce10 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1ce20 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 70 2d 3e  3_sqlar_init(p->
1ce30 64 62 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69  db, 0, 0);.#endi
1ce40 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  f.    sqlite3_cr
1ce50 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d  eate_function(p-
1ce60 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 61 64 64 5f  >db, "shell_add_
1ce70 73 63 68 65 6d 61 22 2c 20 33 2c 20 53 51 4c 49  schema", 3, SQLI
1ce80 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
1ce90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cea0 20 20 20 20 20 20 20 20 73 68 65 6c 6c 41 64 64          shellAdd
1ceb0 53 63 68 65 6d 61 4e 61 6d 65 2c 20 30 2c 20 30  SchemaName, 0, 0
1cec0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1ced0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
1cee0 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 6d 6f 64  ->db, "shell_mod
1cef0 75 6c 65 5f 73 63 68 65 6d 61 22 2c 20 31 2c 20  ule_schema", 1, 
1cf00 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_UTF8, 0,.
1cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c              shel
1cf30 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 2c 20 30  lModuleSchema, 0
1cf40 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1cf50 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1cf60 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f  n(p->db, "shell_
1cf70 70 75 74 73 6e 6c 22 2c 20 31 2c 20 53 51 4c 49  putsnl", 1, SQLI
1cf80 54 45 5f 55 54 46 38 2c 20 70 2c 0a 20 20 20 20  TE_UTF8, p,.    
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfa0 20 20 20 20 20 20 20 20 73 68 65 6c 6c 50 75 74          shellPut
1cfb0 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 23 69  sFunc, 0, 0);.#i
1cfc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48  fndef SQLITE_NOH
1cfd0 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20 73  AVE_SYSTEM.    s
1cfe0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1cff0 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 65  nction(p->db, "e
1d000 64 69 74 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  dit", 1, SQLITE_
1d010 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
1d020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d030 20 20 20 20 20 65 64 69 74 46 75 6e 63 2c 20 30       editFunc, 0
1d040 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1d050 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1d060 6e 28 70 2d 3e 64 62 2c 20 22 65 64 69 74 22 2c  n(p->db, "edit",
1d070 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   2, SQLITE_UTF8,
1d080 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1d090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0a0 65 64 69 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b  editFunc, 0, 0);
1d0b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1d0c0 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45  p->openMode==SHE
1d0d0 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 20  LL_OPEN_ZIPFILE 
1d0e0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
1d0f0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
1d100 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
1d110 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20  "CREATE VIRTUAL 
1d120 54 41 42 4c 45 20 7a 69 70 20 55 53 49 4e 47 20  TABLE zip USING 
1d130 7a 69 70 66 69 6c 65 28 25 51 29 3b 22 2c 20 70  zipfile(%Q);", p
1d140 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a  ->zDbFilename);.
1d150 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
1d160 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  ec(p->db, zSql, 
1d170 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
1d180 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
1d190 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
1d1a0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
1d1b0 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 61 74 61  o close the data
1d1c0 62 61 65 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  baes connection.
1d1d0 20 20 52 65 70 6f 72 74 20 65 72 72 6f 72 73 2e    Report errors.
1d1e0 0a 2a 2f 0a 76 6f 69 64 20 63 6c 6f 73 65 5f 64  .*/.void close_d
1d1f0 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  b(sqlite3 *db){.
1d200 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1d210 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
1d220 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74  if( rc ){.    ut
1d230 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1d240 2c 20 22 45 72 72 6f 72 3a 20 73 71 6c 69 74 65  , "Error: sqlite
1d250 33 5f 63 6c 6f 73 65 28 29 20 72 65 74 75 72 6e  3_close() return
1d260 73 20 25 64 3a 20 25 73 5c 6e 22 2c 0a 20 20 20  s %d: %s\n",.   
1d270 20 20 20 20 20 72 63 2c 20 73 71 6c 69 74 65 33       rc, sqlite3
1d280 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
1d290 7d 20 0a 7d 0a 0a 23 69 66 20 48 41 56 45 5f 52  } .}..#if HAVE_R
1d2a0 45 41 44 4c 49 4e 45 20 7c 7c 20 48 41 56 45 5f  EADLINE || HAVE_
1d2b0 45 44 49 54 4c 49 4e 45 0a 2f 2a 0a 2a 2a 20 52  EDITLINE./*.** R
1d2c0 65 61 64 6c 69 6e 65 20 63 6f 6d 70 6c 65 74 69  eadline completi
1d2d0 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2f 0a  on callbacks.*/.
1d2e0 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 61  static char *rea
1d2f0 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e  dline_completion
1d300 5f 67 65 6e 65 72 61 74 6f 72 28 63 6f 6e 73 74  _generator(const
1d310 20 63 68 61 72 20 2a 74 65 78 74 2c 20 69 6e 74   char *text, int
1d320 20 73 74 61 74 65 29 7b 0a 20 20 73 74 61 74 69   state){.  stati
1d330 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  c sqlite3_stmt *
1d340 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
1d350 72 20 2a 7a 52 65 74 3b 0a 20 20 69 66 28 20 73  r *zRet;.  if( s
1d360 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 63  tate==0 ){.    c
1d370 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 73  har *zSql;.    s
1d380 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1d390 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c  pStmt);.    zSql
1d3a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1d3b0 74 66 28 22 53 45 4c 45 43 54 20 44 49 53 54 49  tf("SELECT DISTI
1d3c0 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20 43 4f  NCT candidate CO
1d3d0 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20 20  LLATE nocase".  
1d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3f0 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d           "  FROM
1d400 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 29 20   completion(%Q) 
1d410 4f 52 44 45 52 20 42 59 20 31 22 2c 20 74 65 78  ORDER BY 1", tex
1d420 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
1d430 70 72 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61  prepare_v2(globa
1d440 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  lDb, zSql, -1, &
1d450 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73  pStmt, 0);.    s
1d460 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
1d470 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  );.  }.  if( sql
1d480 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
1d490 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
1d4a0 20 20 20 20 7a 52 65 74 20 3d 20 73 74 72 64 75      zRet = strdu
1d4b0 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  p((const char*)s
1d4c0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1d4d0 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20  xt(pStmt, 0));. 
1d4e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
1d4f0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
1d500 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d  mt);.    pStmt =
1d510 20 30 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20 30   0;.    zRet = 0
1d520 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
1d530 52 65 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63 68  Ret;.}.static ch
1d540 61 72 20 2a 2a 72 65 61 64 6c 69 6e 65 5f 63 6f  ar **readline_co
1d550 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20 63  mpletion(const c
1d560 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20  har *zText, int 
1d570 69 53 74 61 72 74 2c 20 69 6e 74 20 69 45 6e 64  iStart, int iEnd
1d580 29 7b 0a 20 20 72 6c 5f 61 74 74 65 6d 70 74 65  ){.  rl_attempte
1d590 64 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6f 76 65  d_completion_ove
1d5a0 72 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  r = 1;.  return 
1d5b0 72 6c 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6d 61  rl_completion_ma
1d5c0 74 63 68 65 73 28 7a 54 65 78 74 2c 20 72 65 61  tches(zText, rea
1d5d0 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e  dline_completion
1d5e0 5f 67 65 6e 65 72 61 74 6f 72 29 3b 0a 7d 0a 0a  _generator);.}..
1d5f0 23 65 6c 69 66 20 48 41 56 45 5f 4c 49 4e 45 4e  #elif HAVE_LINEN
1d600 4f 49 53 45 0a 2f 2a 0a 2a 2a 20 4c 69 6e 65 6e  OISE./*.** Linen
1d610 6f 69 73 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20  oise completion 
1d620 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74 61 74  callback.*/.stat
1d630 69 63 20 76 6f 69 64 20 6c 69 6e 65 6e 6f 69 73  ic void linenois
1d640 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e  e_completion(con
1d650 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20  st char *zLine, 
1d660 6c 69 6e 65 6e 6f 69 73 65 43 6f 6d 70 6c 65 74  linenoiseComplet
1d670 69 6f 6e 73 20 2a 6c 63 29 7b 0a 20 20 69 6e 74  ions *lc){.  int
1d680 20 6e 4c 69 6e 65 20 3d 20 73 74 72 6c 65 6e 33   nLine = strlen3
1d690 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 69 6e 74 20  0(zLine);.  int 
1d6a0 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 73 71 6c  i, iStart;.  sql
1d6b0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1d6c0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53   = 0;.  char *zS
1d6d0 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  ql;.  char zBuf[
1d6e0 31 30 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6e 4c  1000];..  if( nL
1d6f0 69 6e 65 3e 73 69 7a 65 6f 66 28 7a 42 75 66 29  ine>sizeof(zBuf)
1d700 2d 33 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  -30 ) return;.  
1d710 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e  if( zLine[0]=='.
1d720 27 20 7c 7c 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27  ' || zLine[0]=='
1d730 23 27 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  #') return;.  fo
1d740 72 28 69 3d 6e 4c 69 6e 65 2d 31 3b 20 69 3e 3d  r(i=nLine-1; i>=
1d750 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 7a 4c  0 && (isalnum(zL
1d760 69 6e 65 5b 69 5d 29 20 7c 7c 20 7a 4c 69 6e 65  ine[i]) || zLine
1d770 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69 2d 2d 29 7b  [i]=='_'); i--){
1d780 7d 0a 20 20 69 66 28 20 69 3d 3d 6e 4c 69 6e 65  }.  if( i==nLine
1d790 2d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  -1 ) return;.  i
1d7a0 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20 6d  Start = i+1;.  m
1d7b0 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69 6e  emcpy(zBuf, zLin
1d7c0 65 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 7a 53  e, iStart);.  zS
1d7d0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
1d7e0 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49 53  intf("SELECT DIS
1d7f0 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20  TINCT candidate 
1d800 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a  COLLATE nocase".
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d820 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d           "  FROM
1d830 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 2c 25   completion(%Q,%
1d840 51 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c 0a  Q) ORDER BY 1",.
1d850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d860 20 20 20 20 20 20 20 20 20 26 7a 4c 69 6e 65 5b           &zLine[
1d870 69 53 74 61 72 74 5d 2c 20 7a 4c 69 6e 65 29 3b  iStart], zLine);
1d880 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  .  sqlite3_prepa
1d890 72 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20  re_v2(globalDb, 
1d8a0 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
1d8b0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
1d8c0 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 71  free(zSql);.  sq
1d8d0 6c 69 74 65 33 5f 65 78 65 63 28 67 6c 6f 62 61  lite3_exec(globa
1d8e0 6c 44 62 2c 20 22 50 52 41 47 4d 41 20 70 61 67  lDb, "PRAGMA pag
1d8f0 65 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 30 2c 20  e_count", 0, 0, 
1d900 30 29 3b 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20  0); /* Load the 
1d910 73 63 68 65 6d 61 20 2a 2f 0a 20 20 77 68 69 6c  schema */.  whil
1d920 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
1d930 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
1d940 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OW ){.    const 
1d950 63 68 61 72 20 2a 7a 43 6f 6d 70 6c 65 74 69 6f  char *zCompletio
1d960 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  n = (const char*
1d970 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
1d980 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  text(pStmt, 0);.
1d990 20 20 20 20 69 6e 74 20 6e 43 6f 6d 70 6c 65 74      int nComplet
1d9a0 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ion = sqlite3_co
1d9b0 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
1d9c0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 53  , 0);.    if( iS
1d9d0 74 61 72 74 2b 6e 43 6f 6d 70 6c 65 74 69 6f 6e  tart+nCompletion
1d9e0 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d   < sizeof(zBuf)-
1d9f0 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
1da00 79 28 7a 42 75 66 2b 69 53 74 61 72 74 2c 20 7a  y(zBuf+iStart, z
1da10 43 6f 6d 70 6c 65 74 69 6f 6e 2c 20 6e 43 6f 6d  Completion, nCom
1da20 70 6c 65 74 69 6f 6e 2b 31 29 3b 0a 20 20 20 20  pletion+1);.    
1da30 20 20 6c 69 6e 65 6e 6f 69 73 65 41 64 64 43 6f    linenoiseAddCo
1da40 6d 70 6c 65 74 69 6f 6e 28 6c 63 2c 20 7a 42 75  mpletion(lc, zBu
1da50 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  f);.    }.  }.  
1da60 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1da70 28 70 53 74 6d 74 29 3b 0a 7d 0a 23 65 6e 64 69  (pStmt);.}.#endi
1da80 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d 6c 61  f../*.** Do C-la
1da90 6e 67 75 61 67 65 20 73 74 79 6c 65 20 64 65 71  nguage style deq
1daa0 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  uoting..**.**   
1dab0 20 5c 61 20 20 20 20 2d 3e 20 61 6c 61 72 6d 0a   \a    -> alarm.
1dac0 2a 2a 20 20 20 20 5c 62 20 20 20 20 2d 3e 20 62  **    \b    -> b
1dad0 61 63 6b 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c  ackspace.**    \
1dae0 74 20 20 20 20 2d 3e 20 74 61 62 0a 2a 2a 20 20  t    -> tab.**  
1daf0 20 20 5c 6e 20 20 20 20 2d 3e 20 6e 65 77 6c 69    \n    -> newli
1db00 6e 65 0a 2a 2a 20 20 20 20 5c 76 20 20 20 20 2d  ne.**    \v    -
1db10 3e 20 76 65 72 74 69 63 61 6c 20 74 61 62 0a 2a  > vertical tab.*
1db20 2a 20 20 20 20 5c 66 20 20 20 20 2d 3e 20 66 6f  *    \f    -> fo
1db30 72 6d 20 66 65 65 64 0a 2a 2a 20 20 20 20 5c 72  rm feed.**    \r
1db40 20 20 20 20 2d 3e 20 63 61 72 72 69 61 67 65 20      -> carriage 
1db50 72 65 74 75 72 6e 0a 2a 2a 20 20 20 20 5c 73 20  return.**    \s 
1db60 20 20 20 2d 3e 20 73 70 61 63 65 0a 2a 2a 20 20     -> space.**  
1db70 20 20 5c 22 20 20 20 20 2d 3e 20 22 0a 2a 2a 20    \"    -> ".** 
1db80 20 20 20 5c 27 20 20 20 20 2d 3e 20 27 0a 2a 2a     \'    -> '.**
1db90 20 20 20 20 5c 5c 20 20 20 20 2d 3e 20 62 61 63      \\    -> bac
1dba0 6b 73 6c 61 73 68 0a 2a 2a 20 20 20 20 5c 4e 4e  kslash.**    \NN
1dbb0 4e 20 20 2d 3e 20 61 73 63 69 69 20 63 68 61 72  N  -> ascii char
1dbc0 61 63 74 65 72 20 4e 4e 4e 20 69 6e 20 6f 63 74  acter NNN in oct
1dbd0 61 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  al.*/.static voi
1dbe0 64 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c  d resolve_backsl
1dbf0 61 73 68 65 73 28 63 68 61 72 20 2a 7a 29 7b 0a  ashes(char *z){.
1dc00 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68    int i, j;.  ch
1dc10 61 72 20 63 3b 0a 20 20 77 68 69 6c 65 28 20 2a  ar c;.  while( *
1dc20 7a 20 26 26 20 2a 7a 21 3d 27 5c 5c 27 20 29 20  z && *z!='\\' ) 
1dc30 7a 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  z++;.  for(i=j=0
1dc40 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b  ; (c = z[i])!=0;
1dc50 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
1dc60 69 66 28 20 63 3d 3d 27 5c 5c 27 20 26 26 20 7a  if( c=='\\' && z
1dc70 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20  [i+1]!=0 ){.    
1dc80 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20    c = z[++i];.  
1dc90 20 20 20 20 69 66 28 20 63 3d 3d 27 61 27 20 29      if( c=='a' )
1dca0 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
1dcb0 61 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  a';.      }else 
1dcc0 69 66 28 20 63 3d 3d 27 62 27 20 29 7b 0a 20 20  if( c=='b' ){.  
1dcd0 20 20 20 20 20 20 63 20 3d 20 27 5c 62 27 3b 0a        c = '\b';.
1dce0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1dcf0 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20  c=='t' ){.      
1dd00 20 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20 20 20    c = '\t';.    
1dd10 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
1dd20 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  n' ){.        c 
1dd30 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 7d 65  = '\n';.      }e
1dd40 6c 73 65 20 69 66 28 20 63 3d 3d 27 76 27 20 29  lse if( c=='v' )
1dd50 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
1dd60 76 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  v';.      }else 
1dd70 69 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20 20  if( c=='f' ){.  
1dd80 20 20 20 20 20 20 63 20 3d 20 27 5c 66 27 3b 0a        c = '\f';.
1dd90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1dda0 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20 20  c=='r' ){.      
1ddb0 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20 20    c = '\r';.    
1ddc0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
1ddd0 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  "' ){.        c 
1dde0 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 7d 65 6c  = '"';.      }el
1ddf0 73 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29  se if( c=='\'' )
1de00 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
1de10 27 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  '';.      }else 
1de20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20  if( c=='\\' ){. 
1de30 20 20 20 20 20 20 20 63 20 3d 20 27 5c 5c 27 3b         c = '\\';
1de40 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1de50 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 37   c>='0' && c<='7
1de60 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 2d  ' ){.        c -
1de70 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69  = '0';.        i
1de80 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26  f( z[i+1]>='0' &
1de90 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b  & z[i+1]<='7' ){
1dea0 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  .          i++;.
1deb0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 28 63            c = (c
1dec0 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30  <<3) + z[i] - '0
1ded0 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ';.          if(
1dee0 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20   z[i+1]>='0' && 
1def0 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20  z[i+1]<='7' ){. 
1df00 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a             i++;.
1df10 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20              c = 
1df20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20  (c<<3) + z[i] - 
1df30 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  '0';.          }
1df40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1df50 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
1df60 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28  ] = c;.  }.  if(
1df70 20 6a 3c 69 20 29 20 7a 5b 6a 5d 20 3d 20 30 3b   j<i ) z[j] = 0;
1df80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70  .}../*.** Interp
1df90 72 65 74 20 7a 41 72 67 20 61 73 20 65 69 74 68  ret zArg as eith
1dfa0 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72  er an integer or
1dfb0 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
1dfc0 2e 20 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30  .  Return 1 or 0
1dfd0 0a 2a 2a 20 66 6f 72 20 54 52 55 45 20 61 6e 64  .** for TRUE and
1dfe0 20 46 41 4c 53 45 2e 20 20 52 65 74 75 72 6e 20   FALSE.  Return 
1dff0 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
1e000 65 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65  e if appropriate
1e010 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e020 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 63 6f 6e  booleanValue(con
1e030 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a  st char *zArg){.
1e040 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a    int i;.  if( z
1e050 41 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a  Arg[0]=='0' && z
1e060 41 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20  Arg[1]=='x' ){. 
1e070 20 20 20 66 6f 72 28 69 3d 32 3b 20 68 65 78 44     for(i=2; hexD
1e080 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67 5b 69  igitValue(zArg[i
1e090 5d 29 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ])>=0; i++){}.  
1e0a0 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
1e0b0 3d 30 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27 30 27  =0; zArg[i]>='0'
1e0c0 20 26 26 20 7a 41 72 67 5b 69 5d 3c 3d 27 39 27   && zArg[i]<='9'
1e0d0 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 0a 20 20 69  ; i++){}.  }.  i
1e0e0 66 28 20 69 3e 30 20 26 26 20 7a 41 72 67 5b 69  f( i>0 && zArg[i
1e0f0 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28 69  ]==0 ) return (i
1e100 6e 74 29 28 69 6e 74 65 67 65 72 56 61 6c 75 65  nt)(integerValue
1e110 28 7a 41 72 67 29 20 26 20 30 78 66 66 66 66 66  (zArg) & 0xfffff
1e120 66 66 66 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  fff);.  if( sqli
1e130 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67  te3_stricmp(zArg
1e140 2c 20 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20 73 71  , "on")==0 || sq
1e150 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41  lite3_stricmp(zA
1e160 72 67 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a  rg,"yes")==0 ){.
1e170 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e180 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  }.  if( sqlite3_
1e190 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f  stricmp(zArg, "o
1e1a0 66 66 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ff")==0 || sqlit
1e1b0 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c  e3_stricmp(zArg,
1e1c0 22 6e 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  "no")==0 ){.    
1e1d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1e1e0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1e1f0 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 74 20  rr, "ERROR: Not 
1e200 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a  a boolean value:
1e210 20 5c 22 25 73 5c 22 2e 20 41 73 73 75 6d 69 6e   \"%s\". Assumin
1e220 67 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20 20  g \"no\".\n",.  
1e230 20 20 20 20 20 20 20 20 7a 41 72 67 29 3b 0a 20          zArg);. 
1e240 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1e250 0a 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72  .** Set or clear
1e260 20 61 20 73 68 65 6c 6c 20 66 6c 61 67 20 61 63   a shell flag ac
1e270 63 6f 72 64 69 6e 67 20 74 6f 20 61 20 62 6f 6f  cording to a boo
1e280 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  lean value..*/.s
1e290 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4f 72  tatic void setOr
1e2a0 43 6c 65 61 72 46 6c 61 67 28 53 68 65 6c 6c 53  ClearFlag(ShellS
1e2b0 74 61 74 65 20 2a 70 2c 20 75 6e 73 69 67 6e 65  tate *p, unsigne
1e2c0 64 20 6d 46 6c 61 67 2c 20 63 6f 6e 73 74 20 63  d mFlag, const c
1e2d0 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 66  har *zArg){.  if
1e2e0 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 7a  ( booleanValue(z
1e2f0 41 72 67 29 20 29 7b 0a 20 20 20 20 53 68 65 6c  Arg) ){.    Shel
1e300 6c 53 65 74 46 6c 61 67 28 70 2c 20 6d 46 6c 61  lSetFlag(p, mFla
1e310 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  g);.  }else{.   
1e320 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28   ShellClearFlag(
1e330 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 0a 7d  p, mFlag);.  }.}
1e340 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
1e350 20 6f 75 74 70 75 74 20 66 69 6c 65 2c 20 61 73   output file, as
1e360 73 75 6d 69 6e 67 20 69 74 20 69 73 20 6e 6f 74  suming it is not
1e370 20 73 74 64 65 72 72 20 6f 72 20 73 74 64 6f 75   stderr or stdou
1e380 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
1e390 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f   output_file_clo
1e3a0 73 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 69  se(FILE *f){.  i
1e3b0 66 28 20 66 20 26 26 20 66 21 3d 73 74 64 6f 75  f( f && f!=stdou
1e3c0 74 20 26 26 20 66 21 3d 73 74 64 65 72 72 20 29  t && f!=stderr )
1e3d0 20 66 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a 2f   fclose(f);.}../
1e3e0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 70 65 6e  *.** Try to open
1e3f0 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2e   an output file.
1e400 20 20 20 54 68 65 20 6e 61 6d 65 73 20 22 73 74     The names "st
1e410 64 6f 75 74 22 20 61 6e 64 20 22 73 74 64 65 72  dout" and "stder
1e420 72 22 20 61 72 65 0a 2a 2a 20 72 65 63 6f 67 6e  r" are.** recogn
1e430 69 7a 65 64 20 61 6e 64 20 64 6f 20 74 68 65 20  ized and do the 
1e440 72 69 67 68 74 20 74 68 69 6e 67 2e 20 20 4e 55  right thing.  NU
1e450 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  LL is returned i
1e460 66 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  f the output.** 
1e470 66 69 6c 65 6e 61 6d 65 20 69 73 20 22 6f 66 66  filename is "off
1e480 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 49 4c  "..*/.static FIL
1e490 45 20 2a 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f  E *output_file_o
1e4a0 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
1e4b0 7a 46 69 6c 65 2c 20 69 6e 74 20 62 54 65 78 74  zFile, int bText
1e4c0 4d 6f 64 65 29 7b 0a 20 20 46 49 4c 45 20 2a 66  Mode){.  FILE *f
1e4d0 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a  ;.  if( strcmp(z
1e4e0 46 69 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d 3d  File,"stdout")==
1e4f0 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64  0 ){.    f = std
1e500 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  out;.  }else if(
1e510 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22   strcmp(zFile, "
1e520 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20  stderr")==0 ){. 
1e530 20 20 20 66 20 3d 20 73 74 64 65 72 72 3b 0a 20     f = stderr;. 
1e540 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1e550 70 28 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29 3d  p(zFile, "off")=
1e560 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 30 3b  =0 ){.    f = 0;
1e570 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 20  .  }else{.    f 
1e580 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 62  = fopen(zFile, b
1e590 54 65 78 74 4d 6f 64 65 20 3f 20 22 77 22 20 3a  TextMode ? "w" :
1e5a0 20 22 77 62 22 29 3b 0a 20 20 20 20 69 66 28 20   "wb");.    if( 
1e5b0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74  f==0 ){.      ut
1e5c0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1e5d0 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  , "Error: cannot
1e5e0 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c   open \"%s\"\n",
1e5f0 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20   zFile);.    }. 
1e600 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 3b 0a 7d   }.  return f;.}
1e610 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
1e620 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
1e630 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
1e640 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1e650 4e 47 5f 50 4f 49 4e 54 29 0a 2f 2a 0a 2a 2a 20  NG_POINT)./*.** 
1e660 41 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 68 61  A routine for ha
1e670 6e 64 6c 69 6e 67 20 6f 75 74 70 75 74 20 66 72  ndling output fr
1e680 6f 6d 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65  om sqlite3_trace
1e690 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1e6a0 74 20 73 71 6c 5f 74 72 61 63 65 5f 63 61 6c 6c  t sql_trace_call
1e6b0 62 61 63 6b 28 0a 20 20 75 6e 73 69 67 6e 65 64  back(.  unsigned
1e6c0 20 6d 54 79 70 65 2c 0a 20 20 76 6f 69 64 20 2a   mType,.  void *
1e6d0 70 41 72 67 2c 0a 20 20 76 6f 69 64 20 2a 70 50  pArg,.  void *pP
1e6e0 2c 0a 20 20 76 6f 69 64 20 2a 70 58 0a 29 7b 0a  ,.  void *pX.){.
1e6f0 20 20 46 49 4c 45 20 2a 66 20 3d 20 28 46 49 4c    FILE *f = (FIL
1e700 45 2a 29 70 41 72 67 3b 0a 20 20 55 4e 55 53 45  E*)pArg;.  UNUSE
1e710 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 54 79 70  D_PARAMETER(mTyp
1e720 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
1e730 41 4d 45 54 45 52 28 70 50 29 3b 0a 20 20 69 66  AMETER(pP);.  if
1e740 28 20 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ( f ){.    const
1e750 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
1e760 74 20 63 68 61 72 2a 29 70 58 3b 0a 20 20 20 20  t char*)pX;.    
1e770 69 6e 74 20 69 20 3d 20 73 74 72 6c 65 6e 33 30  int i = strlen30
1e780 28 7a 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  (z);.    while( 
1e790 69 3e 30 20 26 26 20 7a 5b 69 2d 31 5d 3d 3d 27  i>0 && z[i-1]=='
1e7a0 3b 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ;' ){ i--; }.   
1e7b0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 66 2c 20   utf8_printf(f, 
1e7c0 22 25 2e 2a 73 3b 5c 6e 22 2c 20 69 2c 20 7a 29  "%.*s;\n", i, z)
1e7d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1e7e0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1e7f0 2a 20 41 20 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e  * A no-op routin
1e800 65 20 74 68 61 74 20 72 75 6e 73 20 77 69 74 68  e that runs with
1e810 20 74 68 65 20 22 2e 62 72 65 61 6b 70 6f 69 6e   the ".breakpoin
1e820 74 22 20 64 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20  t" doc-command. 
1e830 20 54 68 69 73 20 69 73 0a 2a 2a 20 61 20 75 73   This is.** a us
1e840 65 66 75 6c 20 73 70 6f 74 20 74 6f 20 73 65 74  eful spot to set
1e850 20 61 20 64 65 62 75 67 67 65 72 20 62 72 65 61   a debugger brea
1e860 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  kpoint..*/.stati
1e870 63 20 76 6f 69 64 20 74 65 73 74 5f 62 72 65 61  c void test_brea
1e880 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20  kpoint(void){.  
1e890 73 74 61 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c  static int nCall
1e8a0 20 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b   = 0;.  nCall++;
1e8b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a  .}../*.** An obj
1e8c0 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 61 64  ect used to read
1e8d0 20 61 20 43 53 56 20 61 6e 64 20 6f 74 68 65 72   a CSV and other
1e8e0 20 66 69 6c 65 73 20 66 6f 72 20 69 6d 70 6f 72   files for impor
1e8f0 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
1e900 72 75 63 74 20 49 6d 70 6f 72 74 43 74 78 20 49  ruct ImportCtx I
1e910 6d 70 6f 72 74 43 74 78 3b 0a 73 74 72 75 63 74  mportCtx;.struct
1e920 20 49 6d 70 6f 72 74 43 74 78 20 7b 0a 20 20 63   ImportCtx {.  c
1e930 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1e940 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
1e950 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
1e960 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20    FILE *in;     
1e970 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
1e980 65 20 43 53 56 20 74 65 78 74 20 66 72 6f 6d 20  e CSV text from 
1e990 74 68 69 73 20 69 6e 70 75 74 20 73 74 72 65 61  this input strea
1e9a0 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  m */.  char *z; 
1e9b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63             /* Ac
1e9c0 63 75 6d 75 6c 61 74 65 64 20 74 65 78 74 20 66  cumulated text f
1e9d0 6f 72 20 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20  or a field */.  
1e9e0 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
1e9f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ea00 20 62 79 74 65 73 20 69 6e 20 7a 20 2a 2f 0a 20   bytes in z */. 
1ea10 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20   int nAlloc;    
1ea20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c       /* Space al
1ea30 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20  located for z[] 
1ea40 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20  */.  int nLine; 
1ea50 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1ea60 65 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ent line number 
1ea70 2a 2f 0a 20 20 69 6e 74 20 62 4e 6f 74 46 69 72  */.  int bNotFir
1ea80 73 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  st;      /* True
1ea90 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
1eaa0 62 79 74 65 73 20 61 6c 72 65 61 64 79 20 72 65  bytes already re
1eab0 61 64 20 2a 2f 0a 20 20 69 6e 74 20 63 54 65 72  ad */.  int cTer
1eac0 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  m;          /* C
1ead0 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65  haracter that te
1eae0 72 6d 69 6e 61 74 65 64 20 74 68 65 20 6d 6f 73  rminated the mos
1eaf0 74 20 72 65 63 65 6e 74 20 66 69 65 6c 64 20 2a  t recent field *
1eb00 2f 0a 20 20 69 6e 74 20 63 43 6f 6c 53 65 70 3b  /.  int cColSep;
1eb10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1eb20 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20  olumn separator 
1eb30 63 68 61 72 61 63 74 65 72 2e 20 20 28 55 73 75  character.  (Usu
1eb40 61 6c 6c 79 20 22 2c 22 29 20 2a 2f 0a 20 20 69  ally ",") */.  i
1eb50 6e 74 20 63 52 6f 77 53 65 70 3b 20 20 20 20 20  nt cRowSep;     
1eb60 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 20 73 65     /* The row se
1eb70 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
1eb80 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 5c 6e  r.  (Usually "\n
1eb90 22 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70  ") */.};../* App
1eba0 65 6e 64 20 61 20 73 69 6e 67 6c 65 20 62 79 74  end a single byt
1ebb0 65 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74  e to z[] */.stat
1ebc0 69 63 20 76 6f 69 64 20 69 6d 70 6f 72 74 5f 61  ic void import_a
1ebd0 70 70 65 6e 64 5f 63 68 61 72 28 49 6d 70 6f 72  ppend_char(Impor
1ebe0 74 43 74 78 20 2a 70 2c 20 69 6e 74 20 63 29 7b  tCtx *p, int c){
1ebf0 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70  .  if( p->n+1>=p
1ec00 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
1ec10 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e  p->nAlloc += p->
1ec20 6e 41 6c 6c 6f 63 20 2b 20 31 30 30 3b 0a 20 20  nAlloc + 100;.  
1ec30 20 20 70 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33    p->z = sqlite3
1ec40 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c  _realloc64(p->z,
1ec50 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
1ec60 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73   if( p->z==0 ) s
1ec70 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
1ec80 72 79 28 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a  ry();.  }.  p->z
1ec90 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61 72  [p->n++] = (char
1eca0 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61  )c;.}../* Read a
1ecb0 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66   single field of
1ecc0 20 43 53 56 20 74 65 78 74 2e 20 20 43 6f 6d 70   CSV text.  Comp
1ecd0 61 74 69 62 6c 65 20 77 69 74 68 20 72 66 63 34  atible with rfc4
1ece0 31 38 30 20 61 6e 64 20 65 78 74 65 6e 64 65 64  180 and extended
1ecf0 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 70 74  .** with the opt
1ed00 69 6f 6e 20 6f 66 20 68 61 76 69 6e 67 20 61 20  ion of having a 
1ed10 73 65 70 61 72 61 74 6f 72 20 6f 74 68 65 72 20  separator other 
1ed20 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20  than ","..**.** 
1ed30 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65 73    +  Input comes
1ed40 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20   from p->in..** 
1ed50 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75 6c    +  Store resul
1ed60 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65  ts in p->z of le
1ed70 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63  ngth p->n.  Spac
1ed80 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63  e to hold p->z c
1ed90 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f  omes.**      fro
1eda0 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
1edb0 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73  64()..**   +  Us
1edc0 65 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68 65  e p->cSep as the
1edd0 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
1ede0 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  r.  The default 
1edf0 69 73 20 22 2c 22 2e 0a 2a 2a 20 20 20 2b 20 20  is ","..**   +  
1ee00 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74  Use p->rSep as t
1ee10 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  he row separator
1ee20 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
1ee30 73 20 22 5c 6e 22 2e 0a 2a 2a 20 20 20 2b 20 20  s "\n"..**   +  
1ee40 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
1ee50 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e  e line number in
1ee60 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20   p->nLine..**   
1ee70 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61  +  Store the cha
1ee80 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d  racter that term
1ee90 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64  inates the field
1eea0 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53   in p->cTerm.  S
1eeb0 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46  tore.**      EOF
1eec0 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e   on end-of-file.
1eed0 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20  .**   +  Report 
1eee0 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e  syntax errors on
1eef0 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69   stderr.*/.stati
1ef00 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43  c char *SQLITE_C
1ef10 44 45 43 4c 20 63 73 76 5f 72 65 61 64 5f 6f 6e  DECL csv_read_on
1ef20 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43 74  e_field(ImportCt
1ef30 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a  x *p){.  int c;.
1ef40 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e    int cSep = p->
1ef50 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72  cColSep;.  int r
1ef60 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70  Sep = p->cRowSep
1ef70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20  ;.  p->n = 0;.  
1ef80 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
1ef90 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c  ;.  if( c==EOF |
1efa0 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20  | seenInterrupt 
1efb0 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20  ){.    p->cTerm 
1efc0 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 72  = EOF;.    retur
1efd0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  n 0;.  }.  if( c
1efe0 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 69 6e 74  =='"' ){.    int
1eff0 20 70 63 2c 20 70 70 63 3b 0a 20 20 20 20 69 6e   pc, ppc;.    in
1f000 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 70 2d  t startLine = p-
1f010 3e 6e 4c 69 6e 65 3b 0a 20 20 20 20 69 6e 74 20  >nLine;.    int 
1f020 63 51 75 6f 74 65 20 3d 20 63 3b 0a 20 20 20 20  cQuote = c;.    
1f030 70 63 20 3d 20 70 70 63 20 3d 20 30 3b 0a 20 20  pc = ppc = 0;.  
1f040 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
1f050 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d      c = fgetc(p-
1f060 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >in);.      if( 
1f070 63 3d 3d 72 53 65 70 20 29 20 70 2d 3e 6e 4c 69  c==rSep ) p->nLi
1f080 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ne++;.      if( 
1f090 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20 20  c==cQuote ){.   
1f0a0 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51 75       if( pc==cQu
1f0b0 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ote ){.         
1f0c0 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   pc = 0;.       
1f0d0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1f0e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1f0f0 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63 53 65       if( (c==cSe
1f100 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29  p && pc==cQuote)
1f110 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72  .       || (c==r
1f120 53 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74  Sep && pc==cQuot
1f130 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d  e).       || (c=
1f140 3d 72 53 65 70 20 26 26 20 70 63 3d 3d 27 5c 72  =rSep && pc=='\r
1f150 27 20 26 26 20 70 70 63 3d 3d 63 51 75 6f 74 65  ' && ppc==cQuote
1f160 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d  ).       || (c==
1f170 45 4f 46 20 26 26 20 70 63 3d 3d 63 51 75 6f 74  EOF && pc==cQuot
1f180 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  e).      ){.    
1f190 20 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20      do{ p->n--; 
1f1a0 7d 77 68 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e  }while( p->z[p->
1f1b0 6e 5d 21 3d 63 51 75 6f 74 65 20 29 3b 0a 20 20  n]!=cQuote );.  
1f1c0 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d        p->cTerm =
1f1d0 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   c;.        brea
1f1e0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1f1f0 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20   if( pc==cQuote 
1f200 26 26 20 63 21 3d 27 5c 72 27 20 29 7b 0a 20 20  && c!='\r' ){.  
1f210 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
1f220 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64  f(stderr, "%s:%d
1f230 3a 20 75 6e 65 73 63 61 70 65 64 20 25 63 20 63  : unescaped %c c
1f240 68 61 72 61 63 74 65 72 5c 6e 22 2c 0a 20 20 20  haracter\n",.   
1f250 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
1f260 7a 46 69 6c 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c  zFile, p->nLine,
1f270 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20   cQuote);.      
1f280 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 45  }.      if( c==E
1f290 4f 46 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  OF ){.        ut
1f2a0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1f2b0 2c 20 22 25 73 3a 25 64 3a 20 75 6e 74 65 72 6d  , "%s:%d: unterm
1f2c0 69 6e 61 74 65 64 20 25 63 2d 71 75 6f 74 65 64  inated %c-quoted
1f2d0 20 66 69 65 6c 64 5c 6e 22 2c 0a 20 20 20 20 20   field\n",.     
1f2e0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46             p->zF
1f2f0 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20  ile, startLine, 
1f300 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 20  cQuote);.       
1f310 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20   p->cTerm = c;. 
1f320 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1f330 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6d 70 6f      }.      impo
1f340 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70  rt_append_char(p
1f350 2c 20 63 29 3b 0a 20 20 20 20 20 20 70 70 63 20  , c);.      ppc 
1f360 3d 20 70 63 3b 0a 20 20 20 20 20 20 70 63 20 3d  = pc;.      pc =
1f370 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   c;.    }.  }els
1f380 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  e{.    /* If thi
1f390 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66  s is the first f
1f3a0 69 65 6c 64 20 62 65 69 6e 67 20 70 61 72 73 65  ield being parse
1f3b0 64 20 61 6e 64 20 69 74 20 62 65 67 69 6e 73 20  d and it begins 
1f3c0 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20  with the.    ** 
1f3d0 55 54 46 2d 38 20 42 4f 4d 20 20 28 30 78 45 46  UTF-8 BOM  (0xEF
1f3e0 20 42 42 20 42 46 29 20 74 68 65 6e 20 73 6b 69   BB BF) then ski
1f3f0 70 20 74 68 65 20 42 4f 4d 20 2a 2f 0a 20 20 20  p the BOM */.   
1f400 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30   if( (c&0xff)==0
1f410 78 65 66 20 26 26 20 70 2d 3e 62 4e 6f 74 46 69  xef && p->bNotFi
1f420 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rst==0 ){.      
1f430 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68  import_append_ch
1f440 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20  ar(p, c);.      
1f450 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
1f460 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63 26 30  ;.      if( (c&0
1f470 78 66 66 29 3d 3d 30 78 62 62 20 29 7b 0a 20 20  xff)==0xbb ){.  
1f480 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70        import_app
1f490 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a  end_char(p, c);.
1f4a0 20 20 20 20 20 20 20 20 63 20 3d 20 66 67 65 74          c = fget
1f4b0 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20  c(p->in);.      
1f4c0 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d    if( (c&0xff)==
1f4d0 30 78 62 66 20 29 7b 0a 20 20 20 20 20 20 20 20  0xbf ){.        
1f4e0 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d    p->bNotFirst =
1f4f0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   1;.          p-
1f500 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  >n = 0;.        
1f510 20 20 72 65 74 75 72 6e 20 63 73 76 5f 72 65 61    return csv_rea
1f520 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 70 29 3b 0a  d_one_field(p);.
1f530 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f540 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  }.    }.    whil
1f550 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d  e( c!=EOF && c!=
1f560 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70 20  cSep && c!=rSep 
1f570 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f  ){.      import_
1f580 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
1f590 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65  );.      c = fge
1f5a0 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d  tc(p->in);.    }
1f5b0 0a 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65 70  .    if( c==rSep
1f5c0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69   ){.      p->nLi
1f5d0 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ne++;.      if( 
1f5e0 70 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b 70  p->n>0 && p->z[p
1f5f0 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 70  ->n-1]=='\r' ) p
1f600 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  ->n--;.    }.   
1f610 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20   p->cTerm = c;. 
1f620 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20   }.  if( p->z ) 
1f630 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a  p->z[p->n] = 0;.
1f640 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d    p->bNotFirst =
1f650 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   1;.  return p->
1f660 7a 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20  z;.}../* Read a 
1f670 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66 20  single field of 
1f680 41 53 43 49 49 20 64 65 6c 69 6d 69 74 65 64 20  ASCII delimited 
1f690 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20  text..**.**   + 
1f6a0 20 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f   Input comes fro
1f6b0 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20  m p->in..**   + 
1f6c0 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
1f6d0 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68  n p->z of length
1f6e0 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f   p->n.  Space to
1f6f0 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73   hold p->z comes
1f700 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71  .**      from sq
1f710 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29  lite3_malloc64()
1f720 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d  ..**   +  Use p-
1f730 3e 63 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c  >cSep as the col
1f740 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20  umn separator.  
1f750 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22  The default is "
1f760 5c 78 31 46 22 2e 0a 2a 2a 20 20 20 2b 20 20 55  \x1F"..**   +  U
1f770 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74 68  se p->rSep as th
1f780 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e  e row separator.
1f790 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
1f7a0 20 22 5c 78 31 45 22 2e 0a 2a 2a 20 20 20 2b 20   "\x1E"..**   + 
1f7b0 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
1f7c0 68 65 20 72 6f 77 20 6e 75 6d 62 65 72 20 69 6e  he row number in
1f7d0 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20   p->nLine..**   
1f7e0 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61  +  Store the cha
1f7f0 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d  racter that term
1f800 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64  inates the field
1f810 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53   in p->cTerm.  S
1f820 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46  tore.**      EOF
1f830 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e   on end-of-file.
1f840 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20  .**   +  Report 
1f850 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e  syntax errors on
1f860 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69   stderr.*/.stati
1f870 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43  c char *SQLITE_C
1f880 44 45 43 4c 20 61 73 63 69 69 5f 72 65 61 64 5f  DECL ascii_read_
1f890 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74  one_field(Import
1f8a0 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63  Ctx *p){.  int c
1f8b0 3b 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70  ;.  int cSep = p
1f8c0 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74  ->cColSep;.  int
1f8d0 20 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53   rSep = p->cRowS
1f8e0 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a  ep;.  p->n = 0;.
1f8f0 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
1f900 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46  n);.  if( c==EOF
1f910 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70   || seenInterrup
1f920 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72  t ){.    p->cTer
1f930 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74  m = EOF;.    ret
1f940 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69  urn 0;.  }.  whi
1f950 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21  le( c!=EOF && c!
1f960 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70  =cSep && c!=rSep
1f970 20 29 7b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61   ){.    import_a
1f980 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29  ppend_char(p, c)
1f990 3b 0a 20 20 20 20 63 20 3d 20 66 67 65 74 63 28  ;.    c = fgetc(
1f9a0 70 2d 3e 69 6e 29 3b 0a 20 20 7d 0a 20 20 69 66  p->in);.  }.  if
1f9b0 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20  ( c==rSep ){.   
1f9c0 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 7d   p->nLine++;.  }
1f9d0 0a 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b  .  p->cTerm = c;
1f9e0 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d  .  if( p->z ) p-
1f9f0 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  >z[p->n] = 0;.  
1fa00 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a  return p->z;.}..
1fa10 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72 61  /*.** Try to tra
1fa20 6e 73 66 65 72 20 64 61 74 61 20 66 6f 72 20 74  nsfer data for t
1fa30 61 62 6c 65 20 7a 54 61 62 6c 65 2e 20 20 49 66  able zTable.  If
1fa40 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
1fa50 6e 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e  n while.** movin
1fa60 67 20 66 6f 72 77 61 72 64 2c 20 74 72 79 20 74  g forward, try t
1fa70 6f 20 67 6f 20 62 61 63 6b 77 61 72 64 73 2e 20  o go backwards. 
1fa80 20 54 68 65 20 62 61 63 6b 77 61 72 64 73 20 6d   The backwards m
1fa90 6f 76 65 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a  ovement won't.**
1faa0 20 77 6f 72 6b 20 66 6f 72 20 57 49 54 48 4f 55   work for WITHOU
1fab0 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e 0a  T ROWID tables..
1fac0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
1fad0 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61 28 0a 20  ryToCloneData(. 
1fae0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a   ShellState *p,.
1faf0 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62    sqlite3 *newDb
1fb00 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
1fb10 7a 54 61 62 6c 65 0a 29 7b 0a 20 20 73 71 6c 69  zTable.){.  sqli
1fb20 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79  te3_stmt *pQuery
1fb30 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1fb40 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20  stmt *pInsert = 
1fb50 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72  0;.  char *zQuer
1fb60 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  y = 0;.  char *z
1fb70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 69 6e  Insert = 0;.  in
1fb80 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  t rc;.  int i, j
1fb90 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 54 61 62 6c  , n;.  int nTabl
1fba0 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54 61  e = strlen30(zTa
1fbb0 62 6c 65 29 3b 0a 20 20 69 6e 74 20 6b 20 3d 20  ble);.  int k = 
1fbc0 30 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  0;.  int cnt = 0
1fbd0 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 70  ;.  const int sp
1fbe0 69 6e 52 61 74 65 20 3d 20 31 30 30 30 30 3b 0a  inRate = 10000;.
1fbf0 0a 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69  .  zQuery = sqli
1fc00 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
1fc10 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c  ECT * FROM \"%w\
1fc20 22 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 72  "", zTable);.  r
1fc30 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1fc40 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
1fc50 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
1fc60 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  y, 0);.  if( rc 
1fc70 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
1fc80 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
1fc90 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d  r %d: %s on [%s]
1fca0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1fcb0 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
1fcc0 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  d_errcode(p->db)
1fcd0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
1fce0 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20  (p->db),.       
1fcf0 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
1fd00 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f    goto end_data_
1fd10 78 66 65 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20  xfer;.  }.  n = 
1fd20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
1fd30 6f 75 6e 74 28 70 51 75 65 72 79 29 3b 0a 20 20  ount(pQuery);.  
1fd40 7a 49 6e 73 65 72 74 20 3d 20 73 71 6c 69 74 65  zInsert = sqlite
1fd50 33 5f 6d 61 6c 6c 6f 63 36 34 28 32 30 30 20 2b  3_malloc64(200 +
1fd60 20 6e 54 61 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a   nTable + n*3);.
1fd70 20 20 69 66 28 20 7a 49 6e 73 65 72 74 3d 3d 30    if( zInsert==0
1fd80 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
1fd90 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 73 71 6c 69  memory();.  sqli
1fda0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 30  te3_snprintf(200
1fdb0 2b 6e 54 61 62 6c 65 2c 7a 49 6e 73 65 72 74 2c  +nTable,zInsert,
1fdc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fdd0 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49      "INSERT OR I
1fde0 47 4e 4f 52 45 20 49 4e 54 4f 20 5c 22 25 73 5c  GNORE INTO \"%s\
1fdf0 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61  " VALUES(?", zTa
1fe00 62 6c 65 29 3b 0a 20 20 69 20 3d 20 73 74 72 6c  ble);.  i = strl
1fe10 65 6e 33 30 28 7a 49 6e 73 65 72 74 29 3b 0a 20  en30(zInsert);. 
1fe20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a   for(j=1; j<n; j
1fe30 2b 2b 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ++){.    memcpy(
1fe40 7a 49 6e 73 65 72 74 2b 69 2c 20 22 2c 3f 22 2c  zInsert+i, ",?",
1fe50 20 32 29 3b 0a 20 20 20 20 69 20 2b 3d 20 32 3b   2);.    i += 2;
1fe60 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 49  .  }.  memcpy(zI
1fe70 6e 73 65 72 74 2b 69 2c 20 22 29 3b 22 2c 20 33  nsert+i, ");", 3
1fe80 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1fe90 33 5f 70 72 65 70 61 72 65 5f 76 32 28 6e 65 77  3_prepare_v2(new
1fea0 44 62 2c 20 7a 49 6e 73 65 72 74 2c 20 2d 31 2c  Db, zInsert, -1,
1feb0 20 26 70 49 6e 73 65 72 74 2c 20 30 29 3b 0a 20   &pInsert, 0);. 
1fec0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75   if( rc ){.    u
1fed0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1fee0 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73  r, "Error %d: %s
1fef0 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20   on [%s]\n",.   
1ff00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ff10 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
1ff20 65 28 6e 65 77 44 62 29 2c 20 73 71 6c 69 74 65  e(newDb), sqlite
1ff30 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29 2c  3_errmsg(newDb),
1ff40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75  .            zQu
1ff50 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ery);.    goto e
1ff60 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20  nd_data_xfer;.  
1ff70 7d 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 32  }.  for(k=0; k<2
1ff80 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 77 68 69 6c  ; k++){.    whil
1ff90 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  e( (rc = sqlite3
1ffa0 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d  _step(pQuery))==
1ffb0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1ffc0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1ffd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1ffe0 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
1fff0 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 51 75 65  column_type(pQue
20000 72 79 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20  ry, i) ){.      
20010 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
20020 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  NULL: {.        
20030 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
20040 5f 6e 75 6c 6c 28 70 49 6e 73 65 72 74 2c 20 69  _null(pInsert, i
20050 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +1);.           
20060 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
20070 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61    }.          ca
20080 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
20090 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  R: {.           
200a0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
200b0 74 36 34 28 70 49 6e 73 65 72 74 2c 20 69 2b 31  t64(pInsert, i+1
200c0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
200d0 5f 69 6e 74 36 34 28 70 51 75 65 72 79 2c 69 29  _int64(pQuery,i)
200e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
200f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
20100 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  }.          case
20110 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
20120 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
20130 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
20140 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73  (pInsert, i+1, s
20150 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
20160 75 62 6c 65 28 70 51 75 65 72 79 2c 69 29 29 3b  uble(pQuery,i));
20170 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
20180 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
20190 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
201a0 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20  QLITE_TEXT: {.  
201b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
201c0 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 49 6e 73  3_bind_text(pIns
201d0 65 72 74 2c 20 69 2b 31 2c 0a 20 20 20 20 20 20  ert, i+1,.      
201e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201f0 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68         (const ch
20200 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
20210 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 69  mn_text(pQuery,i
20220 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
20230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20240 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
20250 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
20260 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
20270 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   }.          cas
20280 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
20290 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
202a0 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
202b0 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c  Insert, i+1, sql
202c0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
202d0 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20  (pQuery,i),.    
202e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20300 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
20310 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 51 75  column_bytes(pQu
20320 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20  ery,i),.        
20330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20350 20 20 20 20 53 51 4c 49 54 45 5f 53 54 41 54 49      SQLITE_STATI
20360 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
20370 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
20380 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
20390 20 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 20     } /* End for 
203a0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
203b0 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73 65  lite3_step(pInse
203c0 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rt);.      if( r
203d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
203e0 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26  rc!=SQLITE_ROW &
203f0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  & rc!=SQLITE_DON
20400 45 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  E ){.        utf
20410 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
20420 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 5c 6e   "Error %d: %s\n
20430 22 2c 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  ", sqlite3_exten
20440 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44  ded_errcode(newD
20450 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b),.            
20460 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
20470 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62  te3_errmsg(newDb
20480 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
20490 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
204a0 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20  pInsert);.      
204b0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
204c0 20 28 63 6e 74 25 73 70 69 6e 52 61 74 65 29 3d   (cnt%spinRate)=
204d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  =0 ){.        pr
204e0 69 6e 74 66 28 22 25 63 5c 62 22 2c 20 22 7c 2f  intf("%c\b", "|/
204f0 2d 5c 5c 22 5b 28 63 6e 74 2f 73 70 69 6e 52 61  -\\"[(cnt/spinRa
20500 74 65 29 25 34 5d 29 3b 0a 20 20 20 20 20 20 20  te)%4]);.       
20510 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
20520 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f  .      }.    } /
20530 2a 20 45 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 20  * End while */. 
20540 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20550 45 5f 44 4f 4e 45 20 29 20 62 72 65 61 6b 3b 0a  E_DONE ) break;.
20560 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
20570 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20  lize(pQuery);.  
20580 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
20590 51 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65  Query);.    zQue
205a0 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
205b0 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46  intf("SELECT * F
205c0 52 4f 4d 20 5c 22 25 77 5c 22 20 4f 52 44 45 52  ROM \"%w\" ORDER
205d0 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 3b 22   BY rowid DESC;"
205e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
20600 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  Table);.    rc =
20610 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
20620 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  _v2(p->db, zQuer
20630 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20  y, -1, &pQuery, 
20640 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
20650 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
20660 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 61 72  ntf(stderr, "War
20670 6e 69 6e 67 3a 20 63 61 6e 6e 6f 74 20 73 74 65  ning: cannot ste
20680 70 20 5c 22 25 73 5c 22 20 62 61 63 6b 77 61 72  p \"%s\" backwar
20690 64 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  ds", zTable);.  
206a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
206b0 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 28  .  } /* End for(
206c0 6b 3d 30 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e 64 5f  k=0...) */..end_
206d0 64 61 74 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c  data_xfer:.  sql
206e0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
206f0 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  uery);.  sqlite3
20700 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72  _finalize(pInser
20710 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
20720 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 73 71  ee(zQuery);.  sq
20730 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 65  lite3_free(zInse
20740 72 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  rt);.}.../*.** T
20750 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20 61  ry to transfer a
20760 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 73  ll rows of the s
20770 63 68 65 6d 61 20 74 68 61 74 20 6d 61 74 63 68  chema that match
20780 20 7a 57 68 65 72 65 2e 20 20 46 6f 72 0a 2a 2a   zWhere.  For.**
20790 20 65 61 63 68 20 72 6f 77 2c 20 69 6e 76 6f 6b   each row, invok
207a0 65 20 78 46 6f 72 45 61 63 68 28 29 20 6f 6e 20  e xForEach() on 
207b0 74 68 65 20 6f 62 6a 65 63 74 20 64 65 66 69 6e  the object defin
207c0 65 64 20 62 79 20 74 68 61 74 20 72 6f 77 2e 0a  ed by that row..
207d0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
207e0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68  s encountered wh
207f0 69 6c 65 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61  ile moving forwa
20800 72 64 20 74 68 72 6f 75 67 68 20 74 68 65 0a 2a  rd through the.*
20810 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
20820 74 61 62 6c 65 2c 20 74 72 79 20 61 67 61 69 6e  table, try again
20830 20 6d 6f 76 69 6e 67 20 62 61 63 6b 77 61 72 64   moving backward
20840 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
20850 64 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65  d tryToCloneSche
20860 6d 61 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ma(.  ShellState
20870 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p,.  sqlite3 *
20880 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63  newDb,.  const c
20890 68 61 72 20 2a 7a 57 68 65 72 65 2c 0a 20 20 76  har *zWhere,.  v
208a0 6f 69 64 20 28 2a 78 46 6f 72 45 61 63 68 29 28  oid (*xForEach)(
208b0 53 68 65 6c 6c 53 74 61 74 65 2a 2c 73 71 6c 69  ShellState*,sqli
208c0 74 65 33 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  te3*,const char*
208d0 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ).){.  sqlite3_s
208e0 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b  tmt *pQuery = 0;
208f0 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20  .  char *zQuery 
20900 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
20910 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
20920 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63  char *zName;.  c
20930 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
20940 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
20950 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a   *zErrMsg = 0;..
20960 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74    zQuery = sqlit
20970 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
20980 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f  CT name, sql FRO
20990 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
209a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
209b0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
209c0 45 52 45 20 25 73 22 2c 20 7a 57 68 65 72 65 29  ERE %s", zWhere)
209d0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
209e0 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
209f0 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26  b, zQuery, -1, &
20a00 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69 66  pQuery, 0);.  if
20a10 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38  ( rc ){.    utf8
20a20 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
20a30 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20  "Error: (%d) %s 
20a40 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20  on [%s]\n",.    
20a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a60 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
20a70 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c  _errcode(p->db),
20a80 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
20a90 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20  p->db),.        
20aa0 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
20ab0 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  ry);.    goto en
20ac0 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20  d_schema_xfer;. 
20ad0 20 7d 0a 20 20 77 68 69 6c 65 28 20 28 72 63 20   }.  while( (rc 
20ae0 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
20af0 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f  Query))==SQLITE_
20b00 52 4f 57 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ROW ){.    zName
20b10 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
20b20 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 30  n_text(pQuery, 0
20b30 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  );.    zSql = sq
20b40 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
20b50 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20  t(pQuery, 1);.  
20b60 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20    printf("%s... 
20b70 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73  ", zName); fflus
20b80 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 73  h(stdout);.    s
20b90 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44  qlite3_exec(newD
20ba0 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  b, (const char*)
20bb0 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72  zSql, 0, 0, &zEr
20bc0 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a  rMsg);.    if( z
20bd0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
20be0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
20bf0 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
20c00 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45  SQL: [%s]\n", zE
20c10 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20  rrMsg, zSql);.  
20c20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
20c30 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
20c40 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20   zErrMsg = 0;.  
20c50 20 20 7d 0a 20 20 20 20 69 66 28 20 78 46 6f 72    }.    if( xFor
20c60 45 61 63 68 20 29 7b 0a 20 20 20 20 20 20 78 46  Each ){.      xF
20c70 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c  orEach(p, newDb,
20c80 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e   (const char*)zN
20c90 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
20ca0 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29  printf("done\n")
20cb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
20cc0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
20cd0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
20ce0 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 20  ize(pQuery);.   
20cf0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
20d00 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65 72  uery);.    zQuer
20d10 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
20d20 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d 65  ntf("SELECT name
20d30 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
20d40 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20  e_master".      
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d60 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 25         " WHERE %
20d70 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64  s ORDER BY rowid
20d80 20 44 45 53 43 22 2c 20 7a 57 68 65 72 65 29 3b   DESC", zWhere);
20d90 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
20da0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
20db0 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
20dc0 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  &pQuery, 0);.   
20dd0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
20de0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
20df0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 28 25 64  err, "Error: (%d
20e00 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c  ) %s on [%s]\n",
20e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20e20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
20e30 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
20e40 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f  p->db), sqlite3_
20e50 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20  errmsg(p->db),. 
20e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e70 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
20e80 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68      goto end_sch
20e90 65 6d 61 5f 78 66 65 72 3b 0a 20 20 20 20 7d 0a  ema_xfer;.    }.
20ea0 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d      while( (rc =
20eb0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51   sqlite3_step(pQ
20ec0 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52  uery))==SQLITE_R
20ed0 4f 57 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  OW ){.      zNam
20ee0 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
20ef0 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20  mn_text(pQuery, 
20f00 30 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  0);.      zSql =
20f10 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
20f20 74 65 78 74 28 70 51 75 65 72 79 2c 20 31 29 3b  text(pQuery, 1);
20f30 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25  .      printf("%
20f40 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20  s... ", zName); 
20f50 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
20f60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
20f70 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74  ec(newDb, (const
20f80 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20   char*)zSql, 0, 
20f90 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0, &zErrMsg);.  
20fa0 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
20fb0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
20fc0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
20fd0 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20  Error: %s\nSQL: 
20fe0 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  [%s]\n", zErrMsg
20ff0 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
21000 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
21010 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
21020 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
21030 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 78     }.      if( x
21040 46 6f 72 45 61 63 68 20 29 7b 0a 20 20 20 20 20  ForEach ){.     
21050 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c 20 6e     xForEach(p, n
21060 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61  ewDb, (const cha
21070 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  r*)zName);.     
21080 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28   }.      printf(
21090 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 20 20 7d  "done\n");.    }
210a0 0a 20 20 7d 0a 65 6e 64 5f 73 63 68 65 6d 61 5f  .  }.end_schema_
210b0 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f  xfer:.  sqlite3_
210c0 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29  finalize(pQuery)
210d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
210e0 28 7a 51 75 65 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a  (zQuery);.}../*.
210f0 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
21100 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
21110 64 20 22 7a 4e 65 77 44 62 22 2e 20 20 54 72 79  d "zNewDb".  Try
21120 20 74 6f 20 72 65 63 6f 76 65 72 20 61 73 20 6d   to recover as m
21130 75 63 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  uch information.
21140 2a 2a 20 61 73 20 70 6f 73 73 69 62 6c 65 20 6f  ** as possible o
21150 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64  ut of the main d
21160 61 74 61 62 61 73 65 20 28 77 68 69 63 68 20 6d  atabase (which m
21170 69 67 68 74 20 62 65 20 63 6f 72 72 75 70 74 29  ight be corrupt)
21180 20 61 6e 64 20 77 72 69 74 65 20 69 74 0a 2a 2a   and write it.**
21190 20 69 6e 74 6f 20 7a 4e 65 77 44 62 2e 0a 2a 2f   into zNewDb..*/
211a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79  .static void try
211b0 54 6f 43 6c 6f 6e 65 28 53 68 65 6c 6c 53 74 61  ToClone(ShellSta
211c0 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  te *p, const cha
211d0 72 20 2a 7a 4e 65 77 44 62 29 7b 0a 20 20 69 6e  r *zNewDb){.  in
211e0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  t rc;.  sqlite3 
211f0 2a 6e 65 77 44 62 20 3d 20 30 3b 0a 20 20 69 66  *newDb = 0;.  if
21200 28 20 61 63 63 65 73 73 28 7a 4e 65 77 44 62 2c  ( access(zNewDb,
21210 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66  0)==0 ){.    utf
21220 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
21230 20 22 46 69 6c 65 20 5c 22 25 73 5c 22 20 61 6c   "File \"%s\" al
21240 72 65 61 64 79 20 65 78 69 73 74 73 2e 5c 6e 22  ready exists.\n"
21250 2c 20 7a 4e 65 77 44 62 29 3b 0a 20 20 20 20 72  , zNewDb);.    r
21260 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
21270 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a  = sqlite3_open(z
21280 4e 65 77 44 62 2c 20 26 6e 65 77 44 62 29 3b 0a  NewDb, &newDb);.
21290 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
212a0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
212b0 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 72 65 61  rr, "Cannot crea
212c0 74 65 20 6f 75 74 70 75 74 20 64 61 74 61 62 61  te output databa
212d0 73 65 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  se: %s\n",.     
212e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
212f0 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20  rrmsg(newDb));. 
21300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
21310 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
21320 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
21330 5f 73 63 68 65 6d 61 3d 4f 4e 3b 22 2c 20 30 2c  _schema=ON;", 0,
21340 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
21350 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20  te3_exec(newDb, 
21360 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45  "BEGIN EXCLUSIVE
21370 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
21380 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65    tryToCloneSche
21390 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79  ma(p, newDb, "ty
213a0 70 65 3d 27 74 61 62 6c 65 27 22 2c 20 74 72 79  pe='table'", try
213b0 54 6f 43 6c 6f 6e 65 44 61 74 61 29 3b 0a 20 20  ToCloneData);.  
213c0 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65    tryToCloneSche
213d0 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79  ma(p, newDb, "ty
213e0 70 65 21 3d 27 74 61 62 6c 65 27 22 2c 20 30 29  pe!='table'", 0)
213f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
21400 65 63 28 6e 65 77 44 62 2c 20 22 43 4f 4d 4d 49  ec(newDb, "COMMI
21410 54 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  T;", 0, 0, 0);. 
21420 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
21430 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77  p->db, "PRAGMA w
21440 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
21450 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  FF;", 0, 0, 0);.
21460 20 20 7d 0a 20 20 63 6c 6f 73 65 5f 64 62 28 6e    }.  close_db(n
21470 65 77 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ewDb);.}../*.** 
21480 43 68 61 6e 67 65 20 74 68 65 20 6f 75 74 70 75  Change the outpu
21490 74 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 73  t file back to s
214a0 74 64 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tdout..**.** If 
214b0 74 68 65 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e  the p->doXdgOpen
214c0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
214d0 61 74 20 6d 65 61 6e 73 20 74 68 65 20 6f 75 74  at means the out
214e0 70 75 74 20 77 61 73 20 62 65 69 6e 67 0a 2a 2a  put was being.**
214f0 20 72 65 64 69 72 65 63 74 65 64 20 74 6f 20 61   redirected to a
21500 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
21510 6e 61 6d 65 64 20 62 79 20 70 2d 3e 7a 54 65 6d  named by p->zTem
21520 70 46 69 6c 65 2e 20 20 49 6e 20 74 68 61 74 20  pFile.  In that 
21530 63 61 73 65 2c 0a 2a 2a 20 6c 61 75 6e 63 68 20  case,.** launch 
21540 73 74 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f  start/open/xdg-o
21550 70 65 6e 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  pen on that temp
21560 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73  orary file..*/.s
21570 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
21580 74 5f 72 65 73 65 74 28 53 68 65 6c 6c 53 74 61  t_reset(ShellSta
21590 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  te *p){.  if( p-
215a0 3e 6f 75 74 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27  >outfile[0]=='|'
215b0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
215c0 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20  TE_OMIT_POPEN.  
215d0 20 20 70 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29    pclose(p->out)
215e0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
215f0 7b 0a 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c  {.    output_fil
21600 65 5f 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b  e_close(p->out);
21610 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21620 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20  NOHAVE_SYSTEM.  
21630 20 20 69 66 28 20 70 2d 3e 64 6f 58 64 67 4f 70    if( p->doXdgOp
21640 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  en ){.      cons
21650 74 20 63 68 61 72 20 2a 7a 58 64 67 4f 70 65 6e  t char *zXdgOpen
21660 43 6d 64 20 3d 0a 23 69 66 20 64 65 66 69 6e 65  Cmd =.#if define
21670 64 28 5f 57 49 4e 33 32 29 0a 20 20 20 20 20 20  d(_WIN32).      
21680 22 73 74 61 72 74 22 3b 0a 23 65 6c 69 66 20 64  "start";.#elif d
21690 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
216a0 29 0a 20 20 20 20 20 20 22 6f 70 65 6e 22 3b 0a  ).      "open";.
216b0 23 65 6c 73 65 0a 20 20 20 20 20 20 22 78 64 67  #else.      "xdg
216c0 2d 6f 70 65 6e 22 3b 0a 23 65 6e 64 69 66 0a 20  -open";.#endif. 
216d0 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b       char *zCmd;
216e0 0a 20 20 20 20 20 20 7a 43 6d 64 20 3d 20 73 71  .      zCmd = sq
216f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
21700 73 20 25 73 22 2c 20 7a 58 64 67 4f 70 65 6e 43  s %s", zXdgOpenC
21710 6d 64 2c 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  md, p->zTempFile
21720 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 79 73  );.      if( sys
21730 74 65 6d 28 7a 43 6d 64 29 20 29 7b 0a 20 20 20  tem(zCmd) ){.   
21740 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
21750 28 73 74 64 65 72 72 2c 20 22 46 61 69 6c 65 64  (stderr, "Failed
21760 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 43 6d 64 29  : [%s]\n", zCmd)
21770 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21780 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d  sqlite3_free(zCm
21790 64 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  d);.      output
217a0 4d 6f 64 65 50 6f 70 28 70 29 3b 0a 20 20 20 20  ModePop(p);.    
217b0 20 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 3d    p->doXdgOpen =
217c0 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   0;.    }.#endif
217d0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
217e0 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45  ITE_NOHAVE_SYSTE
217f0 4d 29 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 6f  M) */.  }.  p->o
21800 75 74 66 69 6c 65 5b 30 5d 20 3d 20 30 3b 0a 20  utfile[0] = 0;. 
21810 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74   p->out = stdout
21820 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61  ;.}../*.** Run a
21830 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 61 6e  n SQL command an
21840 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 69 6e  d return the sin
21850 67 6c 65 20 69 6e 74 65 67 65 72 20 72 65 73 75  gle integer resu
21860 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  lt..*/.static in
21870 74 20 64 62 5f 69 6e 74 28 53 68 65 6c 6c 53 74  t db_int(ShellSt
21880 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ate *p, const ch
21890 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 73 71 6c  ar *zSql){.  sql
218a0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
218b0 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b  ;.  int res = 0;
218c0 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  .  sqlite3_prepa
218d0 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
218e0 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
218f0 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 26  );.  if( pStmt &
21900 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  & sqlite3_step(p
21910 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
21920 57 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 73  W ){.    res = s
21930 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
21940 74 28 70 53 74 6d 74 2c 30 29 3b 0a 20 20 7d 0a  t(pStmt,0);.  }.
21950 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
21960 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 72 65 74  ze(pStmt);.  ret
21970 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
21980 2a 20 43 6f 6e 76 65 72 74 20 61 20 32 2d 62 79  * Convert a 2-by
21990 74 65 20 6f 72 20 34 2d 62 79 74 65 20 62 69 67  te or 4-byte big
219a0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
219b0 69 6e 74 6f 20 61 20 6e 61 74 69 76 65 20 69 6e  into a native in
219c0 74 65 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20  teger.*/.static 
219d0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67 65 74  unsigned int get
219e0 32 62 79 74 65 49 6e 74 28 75 6e 73 69 67 6e 65  2byteInt(unsigne
219f0 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20 72 65  d char *a){.  re
21a00 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 38 29 20 2b  turn (a[0]<<8) +
21a10 20 61 5b 31 5d 3b 0a 7d 0a 73 74 61 74 69 63 20   a[1];.}.static 
21a20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67 65 74  unsigned int get
21a30 34 62 79 74 65 49 6e 74 28 75 6e 73 69 67 6e 65  4byteInt(unsigne
21a40 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20 72 65  d char *a){.  re
21a50 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 32 34 29 20  turn (a[0]<<24) 
21a60 2b 20 28 61 5b 31 5d 3c 3c 31 36 29 20 2b 20 28  + (a[1]<<16) + (
21a70 61 5b 32 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b  a[2]<<8) + a[3];
21a80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
21a90 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
21aa0 22 2e 69 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64 2e  ".info" command.
21ab0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  .**.** Return 1 
21ac0 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f 20 65  on error, 2 to e
21ad0 78 69 74 2c 20 61 6e 64 20 30 20 6f 74 68 65 72  xit, and 0 other
21ae0 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
21af0 69 6e 74 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f  int shell_dbinfo
21b00 5f 63 6f 6d 6d 61 6e 64 28 53 68 65 6c 6c 53 74  _command(ShellSt
21b10 61 74 65 20 2a 70 2c 20 69 6e 74 20 6e 41 72 67  ate *p, int nArg
21b20 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 29 7b  , char **azArg){
21b30 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
21b40 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74 20 63  struct { const c
21b50 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 69 6e 74 20  har *zName; int 
21b60 6f 66 73 74 3b 20 7d 20 61 46 69 65 6c 64 5b 5d  ofst; } aField[]
21b70 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 66 69 6c   = {.     { "fil
21b80 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
21b90 3a 22 2c 20 20 32 34 20 20 7d 2c 0a 20 20 20 20  :",  24  },.    
21ba0 20 7b 20 22 64 61 74 61 62 61 73 65 20 70 61 67   { "database pag
21bb0 65 20 63 6f 75 6e 74 3a 22 2c 20 20 32 38 20 20  e count:",  28  
21bc0 7d 2c 0a 20 20 20 20 20 7b 20 22 66 72 65 65 6c  },.     { "freel
21bd0 69 73 74 20 70 61 67 65 20 63 6f 75 6e 74 3a 22  ist page count:"
21be0 2c 20 20 33 36 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  36  },.     {
21bf0 20 22 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 3a   "schema cookie:
21c00 22 2c 20 20 20 20 20 20 20 20 34 30 20 20 7d 2c  ",        40  },
21c10 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d 61 20  .     { "schema 
21c20 66 6f 72 6d 61 74 3a 22 2c 20 20 20 20 20 20 20  format:",       
21c30 20 34 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   44  },.     { "
21c40 64 65 66 61 75 6c 74 20 63 61 63 68 65 20 73 69  default cache si
21c50 7a 65 3a 22 2c 20 20 20 34 38 20 20 7d 2c 0a 20  ze:",   48  },. 
21c60 20 20 20 20 7b 20 22 61 75 74 6f 76 61 63 75 75      { "autovacuu
21c70 6d 20 74 6f 70 20 72 6f 6f 74 3a 22 2c 20 20 35  m top root:",  5
21c80 32 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 69 6e  2  },.     { "in
21c90 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
21ca0 3a 22 2c 20 20 20 36 34 20 20 7d 2c 0a 20 20 20  :",   64  },.   
21cb0 20 20 7b 20 22 74 65 78 74 20 65 6e 63 6f 64 69    { "text encodi
21cc0 6e 67 3a 22 2c 20 20 20 20 20 20 20 20 35 36 20  ng:",        56 
21cd0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73 65 72   },.     { "user
21ce0 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20   version:",     
21cf0 20 20 20 20 36 30 20 20 7d 2c 0a 20 20 20 20 20      60  },.     
21d00 7b 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 20 69  { "application i
21d10 64 3a 22 2c 20 20 20 20 20 20 20 36 38 20 20 7d  d:",       68  }
21d20 2c 0a 20 20 20 20 20 7b 20 22 73 6f 66 74 77 61  ,.     { "softwa
21d30 72 65 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20  re version:",   
21d40 20 20 39 36 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20    96  },.  };.  
21d50 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
21d60 75 63 74 20 7b 20 63 6f 6e 73 74 20 63 68 61 72  uct { const char
21d70 20 2a 7a 4e 61 6d 65 3b 20 63 6f 6e 73 74 20 63   *zName; const c
21d80 68 61 72 20 2a 7a 53 71 6c 3b 20 7d 20 61 51 75  har *zSql; } aQu
21d90 65 72 79 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b  ery[] = {.     {
21da0 20 22 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c   "number of tabl
21db0 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45  es:",.       "SE
21dc0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
21dd0 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70 65  OM %s WHERE type
21de0 3d 27 74 61 62 6c 65 27 22 20 7d 2c 0a 20 20 20  ='table'" },.   
21df0 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 69    { "number of i
21e00 6e 64 65 78 65 73 3a 22 2c 0a 20 20 20 20 20 20  ndexes:",.      
21e10 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
21e20 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20  ) FROM %s WHERE 
21e30 74 79 70 65 3d 27 69 6e 64 65 78 27 22 20 7d 2c  type='index'" },
21e40 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20  .     { "number 
21e50 6f 66 20 74 72 69 67 67 65 72 73 3a 22 2c 0a 20  of triggers:",. 
21e60 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f        "SELECT co
21e70 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57  unt(*) FROM %s W
21e80 48 45 52 45 20 74 79 70 65 3d 27 74 72 69 67 67  HERE type='trigg
21e90 65 72 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22  er'" },.     { "
21ea0 6e 75 6d 62 65 72 20 6f 66 20 76 69 65 77 73 3a  number of views:
21eb0 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  ",.       "SELEC
21ec0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
21ed0 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 76  %s WHERE type='v
21ee0 69 65 77 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20  iew'" },.     { 
21ef0 22 73 63 68 65 6d 61 20 73 69 7a 65 3a 22 2c 0a  "schema size:",.
21f00 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 74         "SELECT t
21f10 6f 74 61 6c 28 6c 65 6e 67 74 68 28 73 71 6c 29  otal(length(sql)
21f20 29 20 46 52 4f 4d 20 25 73 22 20 7d 2c 0a 20 20  ) FROM %s" },.  
21f30 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e  };.  int i;.  un
21f40 73 69 67 6e 65 64 20 69 44 61 74 61 56 65 72 73  signed iDataVers
21f50 69 6f 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 63  ion;.  char *zSc
21f60 68 65 6d 61 54 61 62 3b 0a 20 20 63 68 61 72 20  hemaTab;.  char 
21f70 2a 7a 44 62 20 3d 20 6e 41 72 67 3e 3d 32 20 3f  *zDb = nArg>=2 ?
21f80 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 6d 61 69   azArg[1] : "mai
21f90 6e 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  n";.  sqlite3_st
21fa0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
21fb0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
21fc0 48 64 72 5b 31 30 30 5d 3b 0a 20 20 6f 70 65 6e  Hdr[100];.  open
21fd0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  _db(p, 0);.  if(
21fe0 20 70 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75   p->db==0 ) retu
21ff0 72 6e 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f  rn 1;.  sqlite3_
22000 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
22010 2c 22 53 45 4c 45 43 54 20 64 61 74 61 20 46 52  ,"SELECT data FR
22020 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70 61 67 65  OM sqlite_dbpage
22030 28 3f 31 29 20 57 48 45 52 45 20 70 67 6e 6f 3d  (?1) WHERE pgno=
22040 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  1",.            
22050 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53           -1, &pS
22060 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  tmt, 0);.  sqlit
22070 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
22080 6d 74 2c 20 31 2c 20 7a 44 62 2c 20 2d 31 2c 20  mt, 1, zDb, -1, 
22090 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
220a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
220b0 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
220c0 45 5f 52 4f 57 0a 20 20 20 26 26 20 73 71 6c 69  E_ROW.   && sqli
220d0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
220e0 28 70 53 74 6d 74 2c 30 29 3e 31 30 30 0a 20 20  (pStmt,0)>100.  
220f0 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 61 48  ){.    memcpy(aH
22100 64 72 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  dr, sqlite3_colu
22110 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 30 29  mn_blob(pStmt,0)
22120 2c 20 31 30 30 29 3b 0a 20 20 20 20 73 71 6c 69  , 100);.    sqli
22130 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
22140 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mt);.  }else{.  
22150 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
22160 65 72 72 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  err, "unable to 
22170 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65  read database he
22180 61 64 65 72 5c 6e 22 29 3b 0a 20 20 20 20 73 71  ader\n");.    sq
22190 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
221a0 53 74 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 72  Stmt);.    retur
221b0 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 67  n 1;.  }.  i = g
221c0 65 74 32 62 79 74 65 49 6e 74 28 61 48 64 72 2b  et2byteInt(aHdr+
221d0 31 36 29 3b 0a 20 20 69 66 28 20 69 3d 3d 31 20  16);.  if( i==1 
221e0 29 20 69 20 3d 20 36 35 35 33 36 3b 0a 20 20 75  ) i = 65536;.  u
221f0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
22200 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c  t, "%-20s %d\n",
22210 20 22 64 61 74 61 62 61 73 65 20 70 61 67 65 20   "database page 
22220 73 69 7a 65 3a 22 2c 20 69 29 3b 0a 20 20 75 74  size:", i);.  ut
22230 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
22240 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20  , "%-20s %d\n", 
22250 22 77 72 69 74 65 20 66 6f 72 6d 61 74 3a 22 2c  "write format:",
22260 20 61 48 64 72 5b 31 38 5d 29 3b 0a 20 20 75 74   aHdr[18]);.  ut
22270 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
22280 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20  , "%-20s %d\n", 
22290 22 72 65 61 64 20 66 6f 72 6d 61 74 3a 22 2c 20  "read format:", 
222a0 61 48 64 72 5b 31 39 5d 29 3b 0a 20 20 75 74 66  aHdr[19]);.  utf
222b0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
222c0 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22   "%-20s %d\n", "
222d0 72 65 73 65 72 76 65 64 20 62 79 74 65 73 3a 22  reserved bytes:"
222e0 2c 20 61 48 64 72 5b 32 30 5d 29 3b 0a 20 20 66  , aHdr[20]);.  f
222f0 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
22300 69 7a 65 28 61 46 69 65 6c 64 29 3b 20 69 2b 2b  ize(aField); i++
22310 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 20  ){.    int ofst 
22320 3d 20 61 46 69 65 6c 64 5b 69 5d 2e 6f 66 73 74  = aField[i].ofst
22330 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
22340 6e 74 20 76 61 6c 20 3d 20 67 65 74 34 62 79 74  nt val = get4byt
22350 65 49 6e 74 28 61 48 64 72 20 2b 20 6f 66 73 74  eInt(aHdr + ofst
22360 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
22370 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
22380 73 20 25 75 22 2c 20 61 46 69 65 6c 64 5b 69 5d  s %u", aField[i]
22390 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20  .zName, val);.  
223a0 20 20 73 77 69 74 63 68 28 20 6f 66 73 74 20 29    switch( ofst )
223b0 7b 0a 20 20 20 20 20 20 63 61 73 65 20 35 36 3a  {.      case 56:
223c0 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76   {.        if( v
223d0 61 6c 3d 3d 31 20 29 20 72 61 77 5f 70 72 69 6e  al==1 ) raw_prin
223e0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74  tf(p->out, " (ut
223f0 66 38 29 22 29 3b 0a 20 20 20 20 20 20 20 20 69  f8)");.        i
22400 66 28 20 76 61 6c 3d 3d 32 20 29 20 72 61 77 5f  f( val==2 ) raw_
22410 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
22420 20 28 75 74 66 31 36 6c 65 29 22 29 3b 0a 20 20   (utf16le)");.  
22430 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 33        if( val==3
22440 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d   ) raw_printf(p-
22450 3e 6f 75 74 2c 20 22 20 28 75 74 66 31 36 62 65  >out, " (utf16be
22460 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )");.      }.   
22470 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74   }.    raw_print
22480 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b  f(p->out, "\n");
22490 0a 20 20 7d 0a 20 20 69 66 28 20 7a 44 62 3d 3d  .  }.  if( zDb==
224a0 30 20 29 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61  0 ){.    zSchema
224b0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Tab = sqlite3_mp
224c0 72 69 6e 74 66 28 22 6d 61 69 6e 2e 73 71 6c 69  rintf("main.sqli
224d0 74 65 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d  te_master");.  }
224e0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
224f0 7a 44 62 2c 22 74 65 6d 70 22 29 3d 3d 30 20 29  zDb,"temp")==0 )
22500 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62  {.    zSchemaTab
22510 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
22520 74 66 28 22 25 73 22 2c 20 22 73 71 6c 69 74 65  tf("%s", "sqlite
22530 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 29 3b 0a  _temp_master");.
22540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 63    }else{.    zSc
22550 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65  hemaTab = sqlite
22560 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c  3_mprintf("\"%w\
22570 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  ".sqlite_master"
22580 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 66 6f  , zDb);.  }.  fo
22590 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
225a0 7a 65 28 61 51 75 65 72 79 29 3b 20 69 2b 2b 29  ze(aQuery); i++)
225b0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  {.    char *zSql
225c0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
225d0 74 66 28 61 51 75 65 72 79 5b 69 5d 2e 7a 53 71  tf(aQuery[i].zSq
225e0 6c 2c 20 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a  l, zSchemaTab);.
225f0 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 64 62      int val = db
22600 5f 69 6e 74 28 70 2c 20 7a 53 71 6c 29 3b 0a 20  _int(p, zSql);. 
22610 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22620 7a 53 71 6c 29 3b 0a 20 20 20 20 75 74 66 38 5f  zSql);.    utf8_
22630 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
22640 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 61 51 75  %-20s %d\n", aQu
22650 65 72 79 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61  ery[i].zName, va
22660 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  l);.  }.  sqlite
22670 33 5f 66 72 65 65 28 7a 53 63 68 65 6d 61 54 61  3_free(zSchemaTa
22680 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  b);.  sqlite3_fi
22690 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
226a0 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43  , zDb, SQLITE_FC
226b0 4e 54 4c 5f 44 41 54 41 5f 56 45 52 53 49 4f 4e  NTL_DATA_VERSION
226c0 2c 20 26 69 44 61 74 61 56 65 72 73 69 6f 6e 29  , &iDataVersion)
226d0 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
226e0 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
226f0 75 5c 6e 22 2c 20 22 64 61 74 61 20 76 65 72 73  u\n", "data vers
22700 69 6f 6e 22 2c 20 69 44 61 74 61 56 65 72 73 69  ion", iDataVersi
22710 6f 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  on);.  return 0;
22720 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  .}../*.** Print 
22730 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69  the current sqli
22740 74 65 33 5f 65 72 72 6d 73 67 28 29 20 76 61 6c  te3_errmsg() val
22750 75 65 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64  ue to stderr and
22760 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 73 74   return 1..*/.st
22770 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 44 61  atic int shellDa
22780 74 61 62 61 73 65 45 72 72 6f 72 28 73 71 6c 69  tabaseError(sqli
22790 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73  te3 *db){.  cons
227a0 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 73  t char *zErr = s
227b0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
227c0 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  );.  utf8_printf
227d0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
227e0 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20   %s\n", zErr);. 
227f0 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
22800 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
22810 70 61 74 74 65 72 6e 20 69 6e 20 7a 47 6c 6f 62  pattern in zGlob
22820 5b 5d 20 61 67 61 69 6e 73 74 20 74 68 65 20 74  [] against the t
22830 65 78 74 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74  ext in z[].  Ret
22840 75 72 6e 20 54 52 55 45 0a 2a 2a 20 69 66 20 74  urn TRUE.** if t
22850 68 65 79 20 6d 61 74 63 68 20 61 6e 64 20 46 41  hey match and FA
22860 4c 53 45 20 28 30 29 20 69 66 20 74 68 65 79 20  LSE (0) if they 
22870 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
22880 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20 72 75 6c  .** Globbing rul
22890 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  es:.**.**      '
228a0 2a 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  *'       Matches
228b0 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66   any sequence of
228c0 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68   zero or more ch
228d0 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  aracters..**.** 
228e0 20 20 20 20 20 27 3f 27 20 20 20 20 20 20 20 4d       '?'       M
228f0 61 74 63 68 65 73 20 65 78 61 63 74 6c 79 20 6f  atches exactly o
22900 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a  ne character..**
22910 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20 20 20  .**     [...]   
22920 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63     Matches one c
22930 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20 74 68  haracter from th
22940 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 20  e enclosed list 
22950 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  of.**           
22960 20 20 20 20 20 63 68 61 72 61 63 74 65 72 73 2e       characters.
22970 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e  .**.**     [^...
22980 5d 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e  ]     Matches on
22990 65 20 63 68 61 72 61 63 74 65 72 20 6e 6f 74 20  e character not 
229a0 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20  in the enclosed 
229b0 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  list..**.**     
229c0 20 27 23 27 20 20 20 20 20 20 20 4d 61 74 63 68   '#'       Match
229d0 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20  es any sequence 
229e0 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 64  of one or more d
229f0 69 67 69 74 73 20 77 69 74 68 20 61 6e 0a 2a 2a  igits with an.**
22a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a10 6f 70 74 69 6f 6e 61 6c 20 2b 20 6f 72 20 2d 20  optional + or - 
22a20 73 69 67 6e 20 69 6e 20 66 72 6f 6e 74 0a 2a 2a  sign in front.**
22a30 0a 2a 2a 20 20 20 20 20 20 27 20 27 20 20 20 20  .**      ' '    
22a40 20 20 20 41 6e 79 20 73 70 61 6e 20 6f 66 20 77     Any span of w
22a50 68 69 74 65 73 70 61 63 65 20 6d 61 74 63 68 65  hitespace matche
22a60 73 20 61 6e 79 20 6f 74 68 65 72 20 73 70 61 6e  s any other span
22a70 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
22a80 20 20 20 20 20 20 77 68 69 74 65 73 70 61 63 65        whitespace
22a90 2e 0a 2a 2a 0a 2a 2a 20 45 78 74 72 61 20 77 68  ..**.** Extra wh
22aa0 69 74 65 73 70 61 63 65 20 61 74 20 74 68 65 20  itespace at the 
22ab0 65 6e 64 20 6f 66 20 7a 5b 5d 20 69 73 20 69 67  end of z[] is ig
22ac0 6e 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  nored..*/.static
22ad0 20 69 6e 74 20 74 65 73 74 63 61 73 65 5f 67 6c   int testcase_gl
22ae0 6f 62 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ob(const char *z
22af0 47 6c 6f 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  Glob, const char
22b00 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 63 2c 20 63   *z){.  int c, c
22b10 32 3b 0a 20 20 69 6e 74 20 69 6e 76 65 72 74 3b  2;.  int invert;
22b20 0a 20 20 69 6e 74 20 73 65 65 6e 3b 0a 0a 20 20  .  int seen;..  
22b30 77 68 69 6c 65 28 20 28 63 20 3d 20 28 2a 28 7a  while( (c = (*(z
22b40 47 6c 6f 62 2b 2b 29 29 29 21 3d 30 20 29 7b 0a  Glob++)))!=0 ){.
22b50 20 20 20 20 69 66 28 20 49 73 53 70 61 63 65 28      if( IsSpace(
22b60 63 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  c) ){.      if( 
22b70 21 49 73 53 70 61 63 65 28 2a 7a 29 20 29 20 72  !IsSpace(*z) ) r
22b80 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 77  eturn 0;.      w
22b90 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a  hile( IsSpace(*z
22ba0 47 6c 6f 62 29 20 29 20 7a 47 6c 6f 62 2b 2b 3b  Glob) ) zGlob++;
22bb0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73  .      while( Is
22bc0 53 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b  Space(*z) ) z++;
22bd0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
22be0 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 77  =='*' ){.      w
22bf0 68 69 6c 65 28 20 28 63 3d 28 2a 28 7a 47 6c 6f  hile( (c=(*(zGlo
22c00 62 2b 2b 29 29 29 20 3d 3d 20 27 2a 27 20 7c 7c  b++))) == '*' ||
22c10 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20   c=='?' ){.     
22c20 20 20 20 69 66 28 20 63 3d 3d 27 3f 27 20 26 26     if( c=='?' &&
22c30 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29 20 72   (*(z++))==0 ) r
22c40 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
22c50 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
22c60 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
22c70 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 1;.      }else
22c80 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20   if( c=='[' ){. 
22c90 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a         while( *z
22ca0 20 26 26 20 74 65 73 74 63 61 73 65 5f 67 6c 6f   && testcase_glo
22cb0 62 28 7a 47 6c 6f 62 2d 31 2c 7a 29 3d 3d 30 20  b(zGlob-1,z)==0 
22cc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 2b 2b  ){.          z++
22cd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22ce0 20 20 20 20 72 65 74 75 72 6e 20 28 2a 7a 29 21      return (*z)!
22cf0 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  =0;.      }.    
22d00 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 28    while( (c2 = (
22d10 2a 28 7a 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20  *(z++)))!=0 ){. 
22d20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 32         while( c2
22d30 21 3d 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=c ){.         
22d40 20 63 32 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20   c2 = *(z++);.  
22d50 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d          if( c2==
22d60 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
22d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22d80 69 66 28 20 74 65 73 74 63 61 73 65 5f 67 6c 6f  if( testcase_glo
22d90 62 28 7a 47 6c 6f 62 2c 7a 29 20 29 20 72 65 74  b(zGlob,z) ) ret
22da0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
22db0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
22dc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
22dd0 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '?' ){.      if(
22de0 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29 20 72   (*(z++))==0 ) r
22df0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
22e00 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b  se if( c=='[' ){
22e10 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72  .      int prior
22e20 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 65  _c = 0;.      se
22e30 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  en = 0;.      in
22e40 76 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  vert = 0;.      
22e50 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20  c = *(z++);.    
22e60 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74    if( c==0 ) ret
22e70 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 63 32 20  urn 0;.      c2 
22e80 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20  = *(zGlob++);.  
22e90 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5e 27 20      if( c2=='^' 
22ea0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 65 72  ){.        inver
22eb0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63  t = 1;.        c
22ec0 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a  2 = *(zGlob++);.
22ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
22ee0 28 20 63 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20  ( c2==']' ){.   
22ef0 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20       if( c==']' 
22f00 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  ) seen = 1;.    
22f10 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62      c2 = *(zGlob
22f20 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ++);.      }.   
22f30 20 20 20 77 68 69 6c 65 28 20 63 32 20 26 26 20     while( c2 && 
22f40 63 32 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20  c2!=']' ){.     
22f50 20 20 20 69 66 28 20 63 32 3d 3d 27 2d 27 20 26     if( c2=='-' &
22f60 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d 27 5d 27 20  & zGlob[0]!=']' 
22f70 26 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d 30 20 26  && zGlob[0]!=0 &
22f80 26 20 70 72 69 6f 72 5f 63 3e 30 20 29 7b 0a 20  & prior_c>0 ){. 
22f90 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28           c2 = *(
22fa0 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
22fb0 20 20 20 20 69 66 28 20 63 3e 3d 70 72 69 6f 72      if( c>=prior
22fc0 5f 63 20 26 26 20 63 3c 3d 63 32 20 29 20 73 65  _c && c<=c2 ) se
22fd0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
22fe0 20 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20    prior_c = 0;. 
22ff0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23000 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63          if( c==c
23010 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
23020 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20   seen = 1;.     
23030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23040 20 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20   prior_c = c2;. 
23050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23060 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29   c2 = *(zGlob++)
23070 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23080 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65  if( c2==0 || (se
23090 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20  en ^ invert)==0 
230a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
230b0 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 23 27  }else if( c=='#'
230c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 7a   ){.      if( (z
230d0 5b 30 5d 3d 3d 27 2d 27 20 7c 7c 20 7a 5b 30 5d  [0]=='-' || z[0]
230e0 3d 3d 27 2b 27 29 20 26 26 20 49 73 44 69 67 69  =='+') && IsDigi
230f0 74 28 7a 5b 31 5d 29 20 29 20 7a 2b 2b 3b 0a 20  t(z[1]) ) z++;. 
23100 20 20 20 20 20 69 66 28 20 21 49 73 44 69 67 69       if( !IsDigi
23110 74 28 7a 5b 30 5d 29 20 29 20 72 65 74 75 72 6e  t(z[0]) ) return
23120 20 30 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20   0;.      z++;. 
23130 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 44 69       while( IsDi
23140 67 69 74 28 7a 5b 30 5d 29 20 29 7b 20 7a 2b 2b  git(z[0]) ){ z++
23150 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ; }.    }else{. 
23160 20 20 20 20 20 69 66 28 20 63 21 3d 28 2a 28 7a       if( c!=(*(z
23170 2b 2b 29 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ++)) ) return 0;
23180 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69  .    }.  }.  whi
23190 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a 29 20  le( IsSpace(*z) 
231a0 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 72 65 74 75  ){ z++; }.  retu
231b0 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a  rn *z==0;.}.../*
231c0 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
231d0 73 74 72 69 6e 67 20 61 73 20 61 20 63 6f 6d 6d  string as a comm
231e0 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20  and-line option 
231f0 77 69 74 68 20 65 69 74 68 65 72 20 6f 6e 65 20  with either one 
23200 6f 72 20 74 77 6f 0a 2a 2a 20 69 6e 69 74 69 61  or two.** initia
23210 6c 20 22 2d 22 20 63 68 61 72 61 63 74 65 72 73  l "-" characters
23220 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23230 6f 70 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73  optionMatch(cons
23240 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 63 6f  t char *zStr, co
23250 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 29 7b  nst char *zOpt){
23260 0a 20 20 69 66 28 20 7a 53 74 72 5b 30 5d 21 3d  .  if( zStr[0]!=
23270 27 2d 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  '-' ) return 0;.
23280 20 20 7a 53 74 72 2b 2b 3b 0a 20 20 69 66 28 20    zStr++;.  if( 
23290 7a 53 74 72 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a  zStr[0]=='-' ) z
232a0 53 74 72 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  Str++;.  return 
232b0 73 74 72 63 6d 70 28 7a 53 74 72 2c 20 7a 4f 70  strcmp(zStr, zOp
232c0 74 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t)==0;.}../*.** 
232d0 44 65 6c 65 74 65 20 61 20 66 69 6c 65 2e 0a 2a  Delete a file..*
232e0 2f 0a 69 6e 74 20 73 68 65 6c 6c 44 65 6c 65 74  /.int shellDelet
232f0 65 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  eFile(const char
23300 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
23310 69 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20 5f  int rc;.#ifdef _
23320 57 49 4e 33 32 0a 20 20 77 63 68 61 72 5f 74 20  WIN32.  wchar_t 
23330 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  *z = sqlite3_win
23340 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f  32_utf8_to_unico
23350 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
23360 20 72 63 20 3d 20 5f 77 75 6e 6c 69 6e 6b 28 7a   rc = _wunlink(z
23370 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
23380 65 28 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63  e(z);.#else.  rc
23390 20 3d 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e   = unlink(zFilen
233a0 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  ame);.#endif.  r
233b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
233c0 2a 2a 20 54 72 79 20 74 6f 20 64 65 6c 65 74 65  ** Try to delete
233d0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
233e0 69 6c 65 20 28 69 66 20 74 68 65 72 65 20 69 73  ile (if there is
233f0 20 6f 6e 65 29 20 61 6e 64 20 66 72 65 65 20 74   one) and free t
23400 68 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 75 73 65  he.** memory use
23410 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  d to hold the na
23420 6d 65 20 6f 66 20 74 68 65 20 74 65 6d 70 20 66  me of the temp f
23430 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ile..*/.static v
23440 6f 69 64 20 63 6c 65 61 72 54 65 6d 70 46 69 6c  oid clearTempFil
23450 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  e(ShellState *p)
23460 7b 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70  {.  if( p->zTemp
23470 46 69 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  File==0 ) return
23480 3b 0a 20 20 69 66 28 20 70 2d 3e 64 6f 58 64 67  ;.  if( p->doXdg
23490 4f 70 65 6e 20 29 20 72 65 74 75 72 6e 3b 0a 20  Open ) return;. 
234a0 20 69 66 28 20 73 68 65 6c 6c 44 65 6c 65 74 65   if( shellDelete
234b0 46 69 6c 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c  File(p->zTempFil
234c0 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  e) ) return;.  s
234d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
234e0 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70 2d 3e  TempFile);.  p->
234f0 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 7d  zTempFile = 0;.}
23500 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
23510 20 6e 65 77 20 74 65 6d 70 20 66 69 6c 65 20 6e   new temp file n
23520 61 6d 65 20 77 69 74 68 20 74 68 65 20 67 69 76  ame with the giv
23530 65 6e 20 73 75 66 66 69 78 2e 0a 2a 2f 0a 73 74  en suffix..*/.st
23540 61 74 69 63 20 76 6f 69 64 20 6e 65 77 54 65 6d  atic void newTem
23550 70 46 69 6c 65 28 53 68 65 6c 6c 53 74 61 74 65  pFile(ShellState
23560 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
23570 2a 7a 53 75 66 66 69 78 29 7b 0a 20 20 63 6c 65  *zSuffix){.  cle
23580 61 72 54 65 6d 70 46 69 6c 65 28 70 29 3b 0a 20  arTempFile(p);. 
23590 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
235a0 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70  >zTempFile);.  p
235b0 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b  ->zTempFile = 0;
235c0 0a 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a  .  if( p->db ){.
235d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
235e0 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20  _control(p->db, 
235f0 30 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  0, SQLITE_FCNTL_
23600 54 45 4d 50 46 49 4c 45 4e 41 4d 45 2c 20 26 70  TEMPFILENAME, &p
23610 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20  ->zTempFile);.  
23620 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70  }.  if( p->zTemp
23630 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  File==0 ){.    s
23640 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72 3b  qlite3_uint64 r;
23650 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
23660 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72  domness(sizeof(r
23670 29 2c 20 26 72 29 3b 0a 20 20 20 20 70 2d 3e 7a  ), &r);.    p->z
23680 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  TempFile = sqlit
23690 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d 70  e3_mprintf("temp
236a0 25 6c 6c 78 2e 25 73 22 2c 20 72 2c 20 7a 53 75  %llx.%s", r, zSu
236b0 66 66 69 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ffix);.  }else{.
236c0 20 20 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65      p->zTempFile
236d0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
236e0 74 66 28 22 25 7a 2e 25 73 22 2c 20 70 2d 3e 7a  tf("%z.%s", p->z
236f0 54 65 6d 70 46 69 6c 65 2c 20 7a 53 75 66 66 69  TempFile, zSuffi
23700 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  x);.  }.  if( p-
23710 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b  >zTempFile==0 ){
23720 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
23730 73 74 64 65 72 72 2c 20 22 6f 75 74 20 6f 66 20  stderr, "out of 
23740 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20  memory\n");.    
23750 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  exit(1);.  }.}..
23760 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  ./*.** The imple
23770 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 53 51 4c  mentation of SQL
23780 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
23790 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c   fkey_collate_cl
237a0 61 75 73 65 28 29 2c 20 75 73 65 64 0a 2a 2a 20  ause(), used.** 
237b0 62 79 20 74 68 65 20 22 2e 6c 69 6e 74 20 66 6b  by the ".lint fk
237c0 65 79 2d 69 6e 64 65 78 65 73 22 20 63 6f 6d 6d  ey-indexes" comm
237d0 61 6e 64 2e 20 54 68 69 73 20 73 63 61 6c 61 72  and. This scalar
237e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 77   function is alw
237f0 61 79 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69  ays.** called wi
23800 74 68 20 66 6f 75 72 20 61 72 67 75 6d 65 6e 74  th four argument
23810 73 20 2d 20 74 68 65 20 70 61 72 65 6e 74 20 74  s - the parent t
23820 61 62 6c 65 20 6e 61 6d 65 2c 20 74 68 65 20 70  able name, the p
23830 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  arent column nam
23840 65 2c 0a 2a 2a 20 74 68 65 20 63 68 69 6c 64 20  e,.** the child 
23850 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
23860 68 65 20 63 68 69 6c 64 20 63 6f 6c 75 6d 6e 20  he child column 
23870 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 6b  name..**.**   fk
23880 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73  ey_collate_claus
23890 65 28 27 70 61 72 65 6e 74 2d 74 61 62 27 2c 20  e('parent-tab', 
238a0 27 70 61 72 65 6e 74 2d 63 6f 6c 27 2c 20 27 63  'parent-col', 'c
238b0 68 69 6c 64 2d 74 61 62 27 2c 20 27 63 68 69 6c  hild-tab', 'chil
238c0 64 2d 63 6f 6c 27 29 0a 2a 2a 0a 2a 2a 20 49 66  d-col').**.** If
238d0 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 6e   either of the n
238e0 61 6d 65 64 20 74 61 62 6c 65 73 20 6f 72 20 63  amed tables or c
238f0 6f 6c 75 6d 6e 73 20 64 6f 20 6e 6f 74 20 65 78  olumns do not ex
23900 69 73 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ist, this functi
23910 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e  on.** returns an
23920 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 41   empty string. A
23930 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69  n empty string i
23940 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
23950 69 66 20 62 6f 74 68 20 74 61 62 6c 65 73 0a 2a  if both tables.*
23960 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 20 65 78  * and columns ex
23970 69 73 74 20 62 75 74 20 68 61 76 65 20 74 68 65  ist but have the
23980 20 73 61 6d 65 20 64 65 66 61 75 6c 74 20 63 6f   same default co
23990 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
239a0 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 62 6f 74 68  . Or,.** if both
239b0 20 65 78 69 73 74 20 62 75 74 20 74 68 65 20 64   exist but the d
239c0 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
239d0 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 64   sequences are d
239e0 69 66 66 65 72 65 6e 74 2c 20 74 68 69 73 0a 2a  ifferent, this.*
239f0 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
23a00 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 22 20  ns the string " 
23a10 43 4f 4c 4c 41 54 45 20 3c 70 61 72 65 6e 74 2d  COLLATE <parent-
23a20 63 6f 6c 6c 61 74 69 6f 6e 3e 22 2c 20 77 68 65  collation>", whe
23a30 72 65 0a 2a 2a 20 3c 70 61 72 65 6e 74 2d 63 6f  re.** <parent-co
23a40 6c 6c 61 74 69 6f 6e 3e 20 69 73 20 74 68 65 20  llation> is the 
23a50 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f  default collatio
23a60 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68  n sequence of th
23a70 65 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 2e  e parent column.
23a80 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
23a90 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74 65  shellFkeyCollate
23aa0 43 6c 61 75 73 65 28 0a 20 20 73 71 6c 69 74 65  Clause(.  sqlite
23ab0 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
23ac0 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73  .  int nVal,.  s
23ad0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
23ae0 70 56 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65  pVal.){.  sqlite
23af0 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
23b00 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
23b10 65 28 70 43 74 78 29 3b 0a 20 20 63 6f 6e 73 74  e(pCtx);.  const
23b20 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 3b 0a   char *zParent;.
23b30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
23b40 61 72 65 6e 74 43 6f 6c 3b 0a 20 20 63 6f 6e 73  arentCol;.  cons
23b50 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 53  t char *zParentS
23b60 65 71 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  eq;.  const char
23b70 20 2a 7a 43 68 69 6c 64 3b 0a 20 20 63 6f 6e 73   *zChild;.  cons
23b80 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 43 6f  t char *zChildCo
23b90 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
23ba0 2a 7a 43 68 69 6c 64 53 65 71 20 3d 20 30 3b 20  *zChildSeq = 0; 
23bb0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
23bc0 6f 20 61 76 6f 69 64 20 66 61 6c 73 65 2d 70 6f  o avoid false-po
23bd0 73 69 74 69 76 65 20 77 61 72 6e 69 6e 67 20 2a  sitive warning *
23be0 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
23bf0 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d 34 20 29  ssert( nVal==4 )
23c00 3b 0a 20 20 7a 50 61 72 65 6e 74 20 3d 20 28 63  ;.  zParent = (c
23c10 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
23c20 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
23c30 56 61 6c 5b 30 5d 29 3b 0a 20 20 7a 50 61 72 65  Val[0]);.  zPare
23c40 6e 74 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63  ntCol = (const c
23c50 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
23c60 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d  ue_text(apVal[1]
23c70 29 3b 0a 20 20 7a 43 68 69 6c 64 20 3d 20 28 63  );.  zChild = (c
23c80 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
23c90 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
23ca0 56 61 6c 5b 32 5d 29 3b 0a 20 20 7a 43 68 69 6c  Val[2]);.  zChil
23cb0 64 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  dCol = (const ch
23cc0 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
23cd0 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 33 5d 29  e_text(apVal[3])
23ce0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ;..  sqlite3_res
23cf0 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 22  ult_text(pCtx, "
23d00 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  ", -1, SQLITE_ST
23d10 41 54 49 43 29 3b 0a 20 20 72 63 20 3d 20 73 71  ATIC);.  rc = sq
23d20 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
23d30 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20  mn_metadata(.   
23d40 20 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a     db, "main", z
23d50 50 61 72 65 6e 74 2c 20 7a 50 61 72 65 6e 74 43  Parent, zParentC
23d60 6f 6c 2c 20 30 2c 20 26 7a 50 61 72 65 6e 74 53  ol, 0, &zParentS
23d70 65 71 2c 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b  eq, 0, 0, 0.  );
23d80 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
23d90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
23da0 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
23db0 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
23dc0 20 20 20 20 20 20 20 20 64 62 2c 20 22 6d 61 69          db, "mai
23dd0 6e 22 2c 20 7a 43 68 69 6c 64 2c 20 7a 43 68 69  n", zChild, zChi
23de0 6c 64 43 6f 6c 2c 20 30 2c 20 26 7a 43 68 69 6c  ldCol, 0, &zChil
23df0 64 53 65 71 2c 20 30 2c 20 30 2c 20 30 0a 20 20  dSeq, 0, 0, 0.  
23e00 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20    );.  }..  if( 
23e10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
23e20 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
23e30 28 7a 50 61 72 65 6e 74 53 65 71 2c 20 7a 43 68  (zParentSeq, zCh
23e40 69 6c 64 53 65 71 29 20 29 7b 0a 20 20 20 20 63  ildSeq) ){.    c
23e50 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
23e60 5f 6d 70 72 69 6e 74 66 28 22 20 43 4f 4c 4c 41  _mprintf(" COLLA
23e70 54 45 20 25 73 22 2c 20 7a 50 61 72 65 6e 74 53  TE %s", zParentS
23e80 65 71 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eq);.    sqlite3
23e90 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
23ea0 78 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  x, z, -1, SQLITE
23eb0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
23ec0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
23ed0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
23ee0 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
23ef0 6f 6e 20 6f 66 20 64 6f 74 2d 63 6f 6d 6d 61 6e  on of dot-comman
23f00 64 20 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e  d ".lint fkey-in
23f10 64 65 78 65 73 22 2e 0a 2a 2f 0a 73 74 61 74 69  dexes"..*/.stati
23f20 63 20 69 6e 74 20 6c 69 6e 74 46 6b 65 79 49 6e  c int lintFkeyIn
23f30 64 65 78 65 73 28 0a 20 20 53 68 65 6c 6c 53 74  dexes(.  ShellSt
23f40 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20  ate *pState,    
23f50 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
23f60 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73  ent shell tool s
23f70 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tate */.  char *
23f80 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20  *azArg,         
23f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
23fa0 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
23fb0 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f  passed to dot co
23fc0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  mmand */.  int n
23fd0 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
23fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
23ff0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
24000 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b  in azArg[] */.){
24010 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
24020 20 70 53 74 61 74 65 2d 3e 64 62 3b 20 20 20 20   pState->db;    
24030 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
24040 61 6e 64 6c 65 20 74 6f 20 71 75 65 72 79 20 22  andle to query "
24050 6d 61 69 6e 22 20 64 62 20 6f 66 20 2a 2f 0a 20  main" db of */. 
24060 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53 74   FILE *out = pSt
24070 61 74 65 2d 3e 6f 75 74 3b 20 20 20 20 20 20 20  ate->out;       
24080 20 2f 2a 20 53 74 72 65 61 6d 20 74 6f 20 77 72   /* Stream to wr
24090 69 74 65 20 6e 6f 6e 2d 65 72 72 6f 72 20 6f 75  ite non-error ou
240a0 74 70 75 74 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  tput to */.  int
240b0 20 62 56 65 72 62 6f 73 65 20 3d 20 30 3b 20 20   bVerbose = 0;  
240c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
240d0 49 66 20 2d 76 65 72 62 6f 73 65 20 69 73 20 70  If -verbose is p
240e0 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
240f0 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 20 3d  bGroupByParent =
24100 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
24110 66 20 2d 67 72 6f 75 70 62 79 70 61 72 65 6e 74  f -groupbyparent
24120 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
24130 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
24140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24150 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74   /* To iterate t
24160 68 72 6f 75 67 68 20 61 7a 41 72 67 5b 5d 20 2a  hrough azArg[] *
24170 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
24180 7a 49 6e 64 65 6e 74 20 3d 20 22 22 3b 20 20 20  zIndent = "";   
24190 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20      /* How much 
241a0 74 6f 20 69 6e 64 65 6e 74 20 43 52 45 41 54 45  to indent CREATE
241b0 20 49 4e 44 45 58 20 62 79 20 2a 2f 0a 20 20 69   INDEX by */.  i
241c0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
241e0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
241f0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
24200 2a 70 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20  *pSql = 0;      
24210 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 76     /* Compiled v
24220 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c 20 73 74  ersion of SQL st
24230 61 74 65 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  atement below */
24240 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  /*.  ** This
24250 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
24260 74 20 72 65 74 75 72 6e 73 20 6f 6e 65 20 72 6f  t returns one ro
24270 77 20 66 6f 72 20 65 61 63 68 20 66 6f 72 65 69  w for each forei
24280 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
24290 74 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 73 63  t.  ** in the sc
242a0 68 65 6d 61 20 6f 66 20 74 68 65 20 6d 61 69 6e  hema of the main
242b0 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 63   database. The c
242c0 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65  olumn values are
242d0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 30 2e 20 54  :.  **.  ** 0. T
242e0 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 53 51  he text of an SQ
242f0 4c 20 73 74 61 74 65 6d 65 6e 74 20 73 69 6d 69  L statement simi
24300 6c 61 72 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  lar to:.  **.  *
24310 2a 20 20 20 20 20 20 22 45 58 50 4c 41 49 4e 20  *      "EXPLAIN 
24320 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43  QUERY PLAN SELEC
24330 54 20 31 20 46 52 4f 4d 20 63 68 69 6c 64 5f 74  T 1 FROM child_t
24340 61 62 6c 65 20 57 48 45 52 45 20 63 68 69 6c 64  able WHERE child
24350 5f 6b 65 79 3d 3f 22 0a 20 20 2a 2a 0a 20 20 2a  _key=?".  **.  *
24360 2a 20 20 20 20 54 68 69 73 20 53 45 4c 45 43 54  *    This SELECT
24370 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74   is similar to t
24380 68 65 20 6f 6e 65 20 74 68 61 74 20 74 68 65 20  he one that the 
24390 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 69 6d 70  foreign keys imp
243a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 2a 2a  lementation.  **
243b0 20 20 20 20 6e 65 65 64 73 20 74 6f 20 72 75 6e      needs to run
243c0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 6f 6e 20 63   internally on c
243d0 68 69 6c 64 20 74 61 62 6c 65 73 2e 20 49 66 20  hild tables. If 
243e0 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65  there is an inde
243f0 78 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20  x that can.  ** 
24400 20 20 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70     be used to op
24410 74 69 6d 69 7a 65 20 74 68 69 73 20 71 75 65 72  timize this quer
24420 79 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20 61  y, then it can a
24430 6c 73 6f 20 62 65 20 75 73 65 64 20 62 79 20 74  lso be used by t
24440 68 65 20 46 4b 0a 20 20 2a 2a 20 20 20 20 69 6d  he FK.  **    im
24450 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20  plementation to 
24460 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45 54 45 20  optimize DELETE 
24470 6f 72 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  or UPDATE statem
24480 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 72 65  ents on the pare
24490 6e 74 0a 20 20 2a 2a 20 20 20 20 74 61 62 6c 65  nt.  **    table
244a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 2e 20 41  ..  **.  ** 1. A
244b0 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 20 73 75   GLOB pattern su
244c0 69 74 61 62 6c 65 20 66 6f 72 20 73 71 6c 69 74  itable for sqlit
244d0 65 33 5f 73 74 72 67 6c 6f 62 28 29 2e 20 49 66  e3_strglob(). If
244e0 20 74 68 65 20 70 6c 61 6e 20 6f 75 74 70 75 74   the plan output
244f0 20 62 79 0a 20 20 2a 2a 20 20 20 20 74 68 65 20   by.  **    the 
24500 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
24510 41 4e 20 63 6f 6d 6d 61 6e 64 20 6d 61 74 63 68  AN command match
24520 65 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c  es this pattern,
24530 20 74 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   then the schema
24540 0a 20 20 2a 2a 20 20 20 20 63 6f 6e 74 61 69 6e  .  **    contain
24550 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
24560 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 6f  can be used to o
24570 70 74 69 6d 69 7a 65 20 74 68 65 20 71 75 65 72  ptimize the quer
24580 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 2e 20  y..  **.  ** 2. 
24590 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 74  Human readable t
245a0 65 78 74 20 74 68 61 74 20 64 65 73 63 72 69 62  ext that describ
245b0 65 73 20 74 68 65 20 63 68 69 6c 64 20 74 61 62  es the child tab
245c0 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20  le and columns. 
245d0 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  e.g..  **.  **  
245e0 20 20 20 20 20 22 63 68 69 6c 64 5f 74 61 62 6c       "child_tabl
245f0 65 28 63 68 69 6c 64 5f 6b 65 79 31 2c 20 63 68  e(child_key1, ch
24600 69 6c 64 5f 6b 65 79 32 29 22 0a 20 20 2a 2a 0a  ild_key2)".  **.
24610 20 20 2a 2a 20 33 2e 20 48 75 6d 61 6e 20 72 65    ** 3. Human re
24620 61 64 61 62 6c 65 20 74 65 78 74 20 74 68 61 74  adable text that
24630 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 70   describes the p
24640 61 72 65 6e 74 20 74 61 62 6c 65 20 61 6e 64 20  arent table and 
24650 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20  columns. e.g..  
24660 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 70  **.  **       "p
24670 61 72 65 6e 74 5f 74 61 62 6c 65 28 70 61 72 65  arent_table(pare
24680 6e 74 5f 6b 65 79 31 2c 20 70 61 72 65 6e 74 5f  nt_key1, parent_
24690 6b 65 79 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a  key2)".  **.  **
246a0 20 34 2e 20 41 20 66 75 6c 6c 20 43 52 45 41 54   4. A full CREAT
246b0 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
246c0 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 74  t for an index t
246d0 68 61 74 20 63 6f 75 6c 64 20 62 65 20 75 73 65  hat could be use
246e0 64 20 74 6f 0a 20 20 2a 2a 20 20 20 20 6f 70 74  d to.  **    opt
246f0 69 6d 69 7a 65 20 44 45 4c 45 54 45 20 6f 72 20  imize DELETE or 
24700 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
24710 73 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s on the parent 
24720 74 61 62 6c 65 2e 20 65 2e 67 2e 0a 20 20 2a 2a  table. e.g..  **
24730 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 43 52 45  .  **       "CRE
24740 41 54 45 20 49 4e 44 45 58 20 63 68 69 6c 64 5f  ATE INDEX child_
24750 74 61 62 6c 65 5f 63 68 69 6c 64 5f 6b 65 79 20  table_child_key 
24760 4f 4e 20 63 68 69 6c 64 5f 74 61 62 6c 65 28 63  ON child_table(c
24770 68 69 6c 64 5f 6b 65 79 29 22 0a 20 20 2a 2a 0a  hild_key)".  **.
24780 20 20 2a 2a 20 35 2e 20 54 68 65 20 6e 61 6d 65    ** 5. The name
24790 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 74   of the parent t
247a0 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
247b0 54 68 65 73 65 20 73 69 78 20 76 61 6c 75 65 73  These six values
247c0 20 61 72 65 20 75 73 65 64 20 62 79 20 74 68 65   are used by the
247d0 20 43 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 74   C logic below t
247e0 6f 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 72  o generate the r
247f0 65 70 6f 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 6f  eport..  */.  co
24800 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
24810 0a 20 20 22 53 45 4c 45 43 54 20 22 0a 20 20 20  .  "SELECT ".   
24820 20 22 20 20 20 20 20 27 45 58 50 4c 41 49 4e 20   "     'EXPLAIN 
24830 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43  QUERY PLAN SELEC
24840 54 20 31 20 46 52 4f 4d 20 27 20 7c 7c 20 71 75  T 1 FROM ' || qu
24850 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27  ote(s.name) || '
24860 20 57 48 45 52 45 20 27 22 0a 20 20 20 20 22 20   WHERE '".    " 
24870 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74   || group_concat
24880 28 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c  (quote(s.name) |
24890 7c 20 27 2e 27 20 7c 7c 20 71 75 6f 74 65 28 66  | '.' || quote(f
248a0 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 20 27 3d 3f 27  .[from]) || '=?'
248b0 20 22 0a 20 20 20 20 22 20 20 7c 7c 20 66 6b 65   ".    "  || fke
248c0 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65  y_collate_clause
248d0 28 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 66  (".    "       f
248e0 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41 4c 45 53  .[table], COALES
248f0 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61  CE(f.[to], p.[na
24900 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e  me]), s.name, f.
24910 5b 66 72 6f 6d 5d 29 2c 27 20 41 4e 44 20 27 29  [from]),' AND ')
24920 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22  ".    ", ".    "
24930 20 20 20 20 20 27 53 45 41 52 43 48 20 54 41 42       'SEARCH TAB
24940 4c 45 20 27 20 7c 7c 20 73 2e 6e 61 6d 65 20 7c  LE ' || s.name |
24950 7c 20 27 20 55 53 49 4e 47 20 43 4f 56 45 52 49  | ' USING COVERI
24960 4e 47 20 49 4e 44 45 58 2a 28 27 22 0a 20 20 20  NG INDEX*('".   
24970 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e   "  || group_con
24980 63 61 74 28 27 2a 3d 3f 27 2c 20 27 20 41 4e 44  cat('*=?', ' AND
24990 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20   ') || ')'".    
249a0 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 73  ", ".    "     s
249b0 2e 6e 61 6d 65 20 20 7c 7c 20 27 28 27 20 7c 7c  .name  || '(' ||
249c0 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66 2e   group_concat(f.
249d0 5b 66 72 6f 6d 5d 2c 20 20 27 2c 20 27 29 20 7c  [from],  ', ') |
249e0 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a  | ')'".    ", ".
249f0 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74 61 62      "     f.[tab
24a00 6c 65 5d 20 7c 7c 20 27 28 27 20 7c 7c 20 67 72  le] || '(' || gr
24a10 6f 75 70 5f 63 6f 6e 63 61 74 28 43 4f 41 4c 45  oup_concat(COALE
24a20 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e  SCE(f.[to], p.[n
24a30 61 6d 65 5d 29 29 20 7c 7c 20 27 29 27 22 0a 20  ame])) || ')'". 
24a40 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20     ", ".    "   
24a50 20 20 27 43 52 45 41 54 45 20 49 4e 44 45 58 20    'CREATE INDEX 
24a60 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d  ' || quote(s.nam
24a70 65 20 7c 7c 27 5f 27 7c 7c 20 67 72 6f 75 70 5f  e ||'_'|| group_
24a80 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c  concat(f.[from],
24a90 20 27 5f 27 29 29 22 0a 20 20 20 20 22 20 20 7c   '_'))".    "  |
24aa0 7c 20 27 20 4f 4e 20 27 20 7c 7c 20 71 75 6f 74  | ' ON ' || quot
24ab0 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 28 27  e(s.name) || '('
24ac0 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75  ".    "  || grou
24ad0 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28 66  p_concat(quote(f
24ae0 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 22 0a 20 20 20  .[from]) ||".   
24af0 20 22 20 20 20 20 20 20 20 20 66 6b 65 79 5f 63   "        fkey_c
24b00 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 22 0a  ollate_clause(".
24b10 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20 66      "          f
24b20 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41 4c 45 53  .[table], COALES
24b30 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61  CE(f.[to], p.[na
24b40 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e  me]), s.name, f.
24b50 5b 66 72 6f 6d 5d 29 2c 20 27 2c 20 27 29 22 0a  [from]), ', ')".
24b60 20 20 20 20 22 20 20 7c 7c 20 27 29 3b 27 22 0a      "  || ');'".
24b70 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20      ", ".    "  
24b80 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20 22 0a 20     f.[table] ". 
24b90 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f     "FROM sqlite_
24ba0 6d 61 73 74 65 72 20 41 53 20 73 2c 20 70 72 61  master AS s, pra
24bb0 67 6d 61 5f 66 6f 72 65 69 67 6e 5f 6b 65 79 5f  gma_foreign_key_
24bc0 6c 69 73 74 28 73 2e 6e 61 6d 65 29 20 41 53 20  list(s.name) AS 
24bd0 66 20 22 0a 20 20 20 20 22 4c 45 46 54 20 4a 4f  f ".    "LEFT JO
24be0 49 4e 20 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f  IN pragma_table_
24bf0 69 6e 66 6f 20 41 53 20 70 20 4f 4e 20 28 70 6b  info AS p ON (pk
24c00 2d 31 3d 73 65 71 20 41 4e 44 20 70 2e 61 72 67  -1=seq AND p.arg
24c10 3d 66 2e 5b 74 61 62 6c 65 5d 29 20 22 0a 20 20  =f.[table]) ".  
24c20 20 20 22 47 52 4f 55 50 20 42 59 20 73 2e 6e 61    "GROUP BY s.na
24c30 6d 65 2c 20 66 2e 69 64 20 22 0a 20 20 20 20 22  me, f.id ".    "
24c40 4f 52 44 45 52 20 42 59 20 28 43 41 53 45 20 57  ORDER BY (CASE W
24c50 48 45 4e 20 3f 20 54 48 45 4e 20 66 2e 5b 74 61  HEN ? THEN f.[ta
24c60 62 6c 65 5d 20 45 4c 53 45 20 73 2e 6e 61 6d 65  ble] ELSE s.name
24c70 20 45 4e 44 29 22 0a 20 20 3b 0a 20 20 63 6f 6e   END)".  ;.  con
24c80 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 49 50  st char *zGlobIP
24c90 4b 20 3d 20 22 53 45 41 52 43 48 20 54 41 42 4c  K = "SEARCH TABL
24ca0 45 20 2a 20 55 53 49 4e 47 20 49 4e 54 45 47 45  E * USING INTEGE
24cb0 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 28 72  R PRIMARY KEY (r
24cc0 6f 77 69 64 3d 3f 29 22 3b 0a 0a 20 20 66 6f 72  owid=?)";..  for
24cd0 28 69 3d 32 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=2; i<nArg; i+
24ce0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  +){.    int n = 
24cf0 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 69  strlen30(azArg[i
24d00 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 31 20  ]);.    if( n>1 
24d10 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  && sqlite3_strni
24d20 63 6d 70 28 22 2d 76 65 72 62 6f 73 65 22 2c 20  cmp("-verbose", 
24d30 61 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20  azArg[i], n)==0 
24d40 29 7b 0a 20 20 20 20 20 20 62 56 65 72 62 6f 73  ){.      bVerbos
24d50 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 1;.    }.   
24d60 20 65 6c 73 65 20 69 66 28 20 6e 3e 31 20 26 26   else if( n>1 &&
24d70 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
24d80 70 28 22 2d 67 72 6f 75 70 62 79 70 61 72 65 6e  p("-groupbyparen
24d90 74 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 6e 29  t", azArg[i], n)
24da0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 47 72  ==0 ){.      bGr
24db0 6f 75 70 42 79 50 61 72 65 6e 74 20 3d 20 31 3b  oupByParent = 1;
24dc0 0a 20 20 20 20 20 20 7a 49 6e 64 65 6e 74 20 3d  .      zIndent =
24dd0 20 22 20 20 20 20 22 3b 0a 20 20 20 20 7d 0a 20   "    ";.    }. 
24de0 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 72     else{.      r
24df0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
24e00 2c 20 22 55 73 61 67 65 3a 20 25 73 20 25 73 20  , "Usage: %s %s 
24e10 3f 2d 76 65 72 62 6f 73 65 3f 20 3f 2d 67 72 6f  ?-verbose? ?-gro
24e20 75 70 62 79 70 61 72 65 6e 74 3f 5c 6e 22 2c 0a  upbyparent?\n",.
24e30 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
24e40 30 5d 2c 20 61 7a 41 72 67 5b 31 5d 0a 20 20 20  0], azArg[1].   
24e50 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75     );.      retu
24e60 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
24e70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
24e80 20 52 65 67 69 73 74 65 72 20 74 68 65 20 66 6b   Register the fk
24e90 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73  ey_collate_claus
24ea0 65 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  e() SQL function
24eb0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
24ec0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
24ed0 6f 6e 28 64 62 2c 20 22 66 6b 65 79 5f 63 6f 6c  on(db, "fkey_col
24ee0 6c 61 74 65 5f 63 6c 61 75 73 65 22 2c 20 34 2c  late_clause", 4,
24ef0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
24f00 20 20 20 20 30 2c 20 73 68 65 6c 6c 46 6b 65 79      0, shellFkey
24f10 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65 2c 20 30  CollateClause, 0
24f20 2c 20 30 0a 20 20 29 3b 0a 0a 0a 20 20 69 66 28  , 0.  );...  if(
24f30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24f40 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
24f50 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
24f60 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 71  , zSql, -1, &pSq
24f70 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  l, 0);.  }.  if(
24f80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24f90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
24fa0 6e 64 5f 69 6e 74 28 70 53 71 6c 2c 20 31 2c 20  nd_int(pSql, 1, 
24fb0 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 29 3b  bGroupByParent);
24fc0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
24fd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24fe0 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 63 68   int rc2;.    ch
24ff0 61 72 20 2a 7a 50 72 65 76 20 3d 20 30 3b 0a 20  ar *zPrev = 0;. 
25000 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45     while( SQLITE
25010 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
25020 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20 20 20  ep(pSql) ){.    
25030 20 20 69 6e 74 20 72 65 73 20 3d 20 2d 31 3b 0a    int res = -1;.
25040 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
25050 6d 74 20 2a 70 45 78 70 6c 61 69 6e 20 3d 20 30  mt *pExplain = 0
25060 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
25070 61 72 20 2a 7a 45 51 50 20 3d 20 28 63 6f 6e 73  ar *zEQP = (cons
25080 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
25090 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
250a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , 0);.      cons
250b0 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 20 3d 20  t char *zGlob = 
250c0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
250d0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
250e0 28 70 53 71 6c 2c 20 31 29 3b 0a 20 20 20 20 20  (pSql, 1);.     
250f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 72   const char *zFr
25100 6f 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  om = (const char
25110 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
25120 5f 74 65 78 74 28 70 53 71 6c 2c 20 32 29 3b 0a  _text(pSql, 2);.
25130 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
25140 20 2a 7a 54 61 72 67 65 74 20 3d 20 28 63 6f 6e   *zTarget = (con
25150 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
25160 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
25170 6c 2c 20 33 29 3b 0a 20 20 20 20 20 20 63 6f 6e  l, 3);.      con
25180 73 74 20 63 68 61 72 20 2a 7a 43 49 20 3d 20 28  st char *zCI = (
25190 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
251a0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
251b0 70 53 71 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20  pSql, 4);.      
251c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
251d0 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ent = (const cha
251e0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
251f0 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 35 29 3b  n_text(pSql, 5);
25200 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
25210 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
25220 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70  db, zEQP, -1, &p
25230 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20  Explain, 0);.   
25240 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25250 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  E_OK ) break;.  
25260 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
25270 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
25280 28 70 45 78 70 6c 61 69 6e 29 20 29 7b 0a 20 20  (pExplain) ){.  
25290 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
252a0 20 2a 7a 50 6c 61 6e 20 3d 20 28 63 6f 6e 73 74   *zPlan = (const
252b0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
252c0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c  olumn_text(pExpl
252d0 61 69 6e 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  ain, 3);.       
252e0 20 72 65 73 20 3d 20 28 0a 20 20 20 20 20 20 20   res = (.       
252f0 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65         0==sqlite
25300 33 5f 73 74 72 67 6c 6f 62 28 7a 47 6c 6f 62 2c  3_strglob(zGlob,
25310 20 7a 50 6c 61 6e 29 0a 20 20 20 20 20 20 20 20   zPlan).        
25320 20 20 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33     || 0==sqlite3
25330 5f 73 74 72 67 6c 6f 62 28 7a 47 6c 6f 62 49 50  _strglob(zGlobIP
25340 4b 2c 20 7a 50 6c 61 6e 29 0a 20 20 20 20 20 20  K, zPlan).      
25350 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
25360 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
25370 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69  finalize(pExplai
25380 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
25390 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  !=SQLITE_OK ) br
253a0 65 61 6b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  eak;..      if( 
253b0 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  res<0 ){.       
253c0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
253d0 72 72 2c 20 22 45 72 72 6f 72 3a 20 69 6e 74 65  rr, "Error: inte
253e0 72 6e 61 6c 20 65 72 72 6f 72 22 29 3b 0a 20 20  rnal error");.  
253f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25400 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25410 20 20 69 66 28 20 62 47 72 6f 75 70 42 79 50 61    if( bGroupByPa
25420 72 65 6e 74 0a 20 20 20 20 20 20 20 20 26 26 20  rent.        && 
25430 28 62 56 65 72 62 6f 73 65 20 7c 7c 20 72 65 73  (bVerbose || res
25440 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 26 26 20  ==0).        && 
25450 28 7a 50 72 65 76 3d 3d 30 20 7c 7c 20 73 71 6c  (zPrev==0 || sql
25460 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 50 61  ite3_stricmp(zPa
25470 72 65 6e 74 2c 20 7a 50 72 65 76 29 29 0a 20 20  rent, zPrev)).  
25480 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
25490 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
254a0 74 2c 20 22 2d 2d 20 50 61 72 65 6e 74 20 74 61  t, "-- Parent ta
254b0 62 6c 65 20 25 73 5c 6e 22 2c 20 7a 50 61 72 65  ble %s\n", zPare
254c0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  nt);.          s
254d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72 65  qlite3_free(zPre
254e0 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 50  v);.          zP
254f0 72 65 76 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  rev = sqlite3_mp
25500 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 50 61 72  rintf("%s", zPar
25510 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ent);.        }.
25520 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73  .        if( res
25530 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
25540 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
25550 20 22 25 73 25 73 20 2d 2d 3e 20 25 73 5c 6e 22   "%s%s --> %s\n"
25560 2c 20 7a 49 6e 64 65 6e 74 2c 20 7a 43 49 2c 20  , zIndent, zCI, 
25570 7a 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20  zTarget);.      
25580 20 20 7d 65 6c 73 65 20 69 66 28 20 62 56 65 72    }else if( bVer
25590 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  bose ){.        
255a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
255b0 2c 20 22 25 73 2f 2a 20 6e 6f 20 65 78 74 72 61  , "%s/* no extra
255c0 20 69 6e 64 65 78 65 73 20 72 65 71 75 69 72 65   indexes require
255d0 64 20 66 6f 72 20 25 73 20 2d 3e 20 25 73 20 2a  d for %s -> %s *
255e0 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  /\n",.          
255f0 20 20 20 20 7a 49 6e 64 65 6e 74 2c 20 7a 46 72      zIndent, zFr
25600 6f 6d 2c 20 7a 54 61 72 67 65 74 0a 20 20 20 20  om, zTarget.    
25610 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
25620 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
25630 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
25640 65 28 7a 50 72 65 76 29 3b 0a 0a 20 20 20 20 69  e(zPrev);..    i
25650 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25660 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
25670 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
25680 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
25690 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a  msg(db));.    }.
256a0 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
256b0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 71 6c  e3_finalize(pSql
256c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
256d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 32 21  QLITE_OK && rc2!
256e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
256f0 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
25700 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
25710 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73  tderr, "%s\n", s
25720 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
25730 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ));.    }.  }els
25740 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  e{.    raw_print
25750 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22  f(stderr, "%s\n"
25760 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
25770 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (db));.  }..  re
25780 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25790 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
257a0 20 6f 66 20 22 2e 6c 69 6e 74 22 20 64 6f 74 20   of ".lint" dot 
257b0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  command..*/.stat
257c0 69 63 20 69 6e 74 20 6c 69 6e 74 44 6f 74 43 6f  ic int lintDotCo
257d0 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74  mmand(.  ShellSt
257e0 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20  ate *pState,    
257f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
25800 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73  ent shell tool s
25810 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tate */.  char *
25820 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20  *azArg,         
25830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
25840 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
25850 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f  passed to dot co
25860 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  mmand */.  int n
25870 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
25880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25890 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
258a0 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b  in azArg[] */.){
258b0 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 6e 20 3d 20  .  int n;.  n = 
258c0 28 6e 41 72 67 3e 3d 32 20 3f 20 73 74 72 6c 65  (nArg>=2 ? strle
258d0 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29 20 3a 20  n30(azArg[1]) : 
258e0 30 29 3b 0a 20 20 69 66 28 20 6e 3c 31 20 7c 7c  0);.  if( n<1 ||
258f0 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
25900 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22 66 6b 65  p(azArg[1], "fke
25910 79 2d 69 6e 64 65 78 65 73 22 2c 20 6e 29 20 29  y-indexes", n) )
25920 20 67 6f 74 6f 20 75 73 61 67 65 3b 0a 20 20 72   goto usage;.  r
25930 65 74 75 72 6e 20 6c 69 6e 74 46 6b 65 79 49 6e  eturn lintFkeyIn
25940 64 65 78 65 73 28 70 53 74 61 74 65 2c 20 61 7a  dexes(pState, az
25950 41 72 67 2c 20 6e 41 72 67 29 3b 0a 0a 20 75 73  Arg, nArg);.. us
25960 61 67 65 3a 0a 20 20 72 61 77 5f 70 72 69 6e 74  age:.  raw_print
25970 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
25980 20 25 73 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 20   %s sub-command 
25990 3f 73 77 69 74 63 68 65 73 2e 2e 2e 3f 5c 6e 22  ?switches...?\n"
259a0 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 72  , azArg[0]);.  r
259b0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
259c0 2c 20 22 57 68 65 72 65 20 73 75 62 2d 63 6f 6d  , "Where sub-com
259d0 6d 61 6e 64 73 20 61 72 65 3a 5c 6e 22 29 3b 0a  mands are:\n");.
259e0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
259f0 65 72 72 2c 20 22 20 20 20 20 66 6b 65 79 2d 69  err, "    fkey-i
25a00 6e 64 65 78 65 73 5c 6e 22 29 3b 0a 20 20 72 65  ndexes\n");.  re
25a10 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
25a20 52 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  R;.}..#if !defin
25a30 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
25a40 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
25a50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
25a60 41 56 45 5f 5a 4c 49 42 29 0a 2f 2a 2a 2a 2a 2a  AVE_ZLIB)./*****
25a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
25ac0 54 68 65 20 22 2e 61 72 63 68 69 76 65 22 20 6f  The ".archive" o
25ad0 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e  r ".ar" command.
25ae0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25af0 73 68 65 6c 6c 50 72 65 70 61 72 65 28 0a 20 20  shellPrepare(.  
25b00 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
25b10 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 63 6f 6e  int *pRc, .  con
25b20 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 0a  st char *zSql, .
25b30 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
25b40 2a 70 70 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70  *ppStmt.){.  *pp
25b50 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Stmt = 0;.  if( 
25b60 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
25b70 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
25b80 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
25b90 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v2(db, zSql, -1,
25ba0 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   ppStmt, 0);.   
25bb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25bc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  OK ){.      raw_
25bd0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
25be0 73 71 6c 20 65 72 72 6f 72 3a 20 25 73 20 28 25  sql error: %s (%
25bf0 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  d)\n", .        
25c00 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
25c10 28 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72  (db), sqlite3_er
25c20 72 63 6f 64 65 28 64 62 29 0a 20 20 20 20 20 20  rcode(db).      
25c30 29 3b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  );.      *pRc = 
25c40 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  rc;.    }.  }.}.
25c50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
25c60 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28  llPreparePrintf(
25c70 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
25c80 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20  .  int *pRc, .  
25c90 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
25ca0 70 53 74 6d 74 2c 0a 20 20 63 6f 6e 73 74 20 63  pStmt,.  const c
25cb0 68 61 72 20 2a 7a 46 6d 74 2c 20 0a 20 20 2e 2e  har *zFmt, .  ..
25cc0 2e 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d  ..){.  *ppStmt =
25cd0 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d   0;.  if( *pRc==
25ce0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25cf0 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20   va_list ap;.   
25d00 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 76 61   char *z;.    va
25d10 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
25d20 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  ;.    z = sqlite
25d30 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c  3_vmprintf(zFmt,
25d40 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
25d50 28 61 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  (ap);.    if( z=
25d60 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63  =0 ){.      *pRc
25d70 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
25d80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25d90 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 64    shellPrepare(d
25da0 62 2c 20 70 52 63 2c 20 7a 2c 20 70 70 53 74 6d  b, pRc, z, ppStm
25db0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
25dc0 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d  3_free(z);.    }
25dd0 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
25de0 6f 69 64 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a  oid shellFinaliz
25df0 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a  e(.  int *pRc, .
25e00 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
25e10 70 53 74 6d 74 0a 29 7b 0a 20 20 69 66 28 20 70  pStmt.){.  if( p
25e20 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
25e30 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
25e40 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d  3_db_handle(pStm
25e50 74 29 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  t);.    int rc =
25e60 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
25e70 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  e(pStmt);.    if
25e80 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
25e90 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  K ){.      if( r
25ea0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
25eb0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
25ec0 74 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 20  tf(stderr, "SQL 
25ed0 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  error: %s\n", sq
25ee0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
25ef0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
25f00 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20   *pRc = rc;.    
25f10 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
25f20 76 6f 69 64 20 73 68 65 6c 6c 52 65 73 65 74 28  void shellReset(
25f30 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20  .  int *pRc, .  
25f40 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
25f50 74 6d 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  tmt.){.  int rc 
25f60 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
25f70 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 2a 70  pStmt);.  if( *p
25f80 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
25f90 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
25fa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25fb0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
25fc0 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28  lite3_db_handle(
25fd0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 61  pStmt);.      ra
25fe0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
25ff0 20 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c   "SQL error: %s\
26000 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
26010 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20  sg(db));.    }. 
26020 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20     *pRc = rc;.  
26030 7d 0a 7d 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74  }.}./*.** Struct
26040 75 72 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ure representing
26050 20 61 20 73 69 6e 67 6c 65 20 22 2e 61 72 22 20   a single ".ar" 
26060 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 74 79 70 65  command..*/.type
26070 64 65 66 20 73 74 72 75 63 74 20 41 72 43 6f 6d  def struct ArCom
26080 6d 61 6e 64 20 41 72 43 6f 6d 6d 61 6e 64 3b 0a  mand ArCommand;.
26090 73 74 72 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64  struct ArCommand
260a0 20 7b 0a 20 20 75 38 20 65 43 6d 64 3b 20 20 20   {.  u8 eCmd;   
260b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260c0 20 20 20 20 20 2f 2a 20 41 6e 20 41 52 5f 43 4d       /* An AR_CM
260d0 44 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 75  D_* value */.  u
260e0 38 20 62 56 65 72 62 6f 73 65 3b 20 20 20 20 20  8 bVerbose;     
260f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26100 2a 20 54 72 75 65 20 69 66 20 2d 2d 76 65 72 62  * True if --verb
26110 6f 73 65 20 2a 2f 0a 20 20 75 38 20 62 5a 69 70  ose */.  u8 bZip
26120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26130 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
26140 20 69 66 20 74 68 65 20 61 72 63 68 69 76 65 20   if the archive 
26150 69 73 20 61 20 5a 49 50 20 2a 2f 0a 20 20 75 38  is a ZIP */.  u8
26160 20 62 44 72 79 52 75 6e 3b 20 20 20 20 20 20 20   bDryRun;       
26170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26180 20 54 72 75 65 20 69 66 20 2d 2d 64 72 79 2d 72   True if --dry-r
26190 75 6e 20 2a 2f 0a 20 20 75 38 20 62 41 70 70 65  un */.  u8 bAppe
261a0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
261b0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
261c0 69 66 20 2d 2d 61 70 70 65 6e 64 20 2a 2f 0a 20  if --append */. 
261d0 20 75 38 20 66 72 6f 6d 43 6d 64 4c 69 6e 65 3b   u8 fromCmdLine;
261e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261f0 20 2f 2a 20 52 75 6e 20 66 72 6f 6d 20 2d 41 20   /* Run from -A 
26200 69 6e 73 74 65 61 64 20 6f 66 20 2e 61 72 63 68  instead of .arch
26210 69 76 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ive */.  int nAr
26220 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
26230 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
26240 65 72 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72  er of command ar
26250 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
26260 72 20 2a 7a 53 72 63 54 61 62 6c 65 3b 20 20 20  r *zSrcTable;   
26270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26280 22 73 71 6c 61 72 22 2c 20 22 7a 69 70 66 69 6c  "sqlar", "zipfil
26290 65 28 24 66 69 6c 65 29 22 20 6f 72 20 22 7a 69  e($file)" or "zi
262a0 70 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  p" */.  const ch
262b0 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20  ar *zFile;      
262c0 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 66 69 6c          /* --fil
262d0 65 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e  e argument, or N
262e0 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
262f0 68 61 72 20 2a 7a 44 69 72 3b 20 20 20 20 20 20  har *zDir;      
26300 20 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 64 69           /* --di
26310 72 65 63 74 6f 72 79 20 61 72 67 75 6d 65 6e 74  rectory argument
26320 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
26330 68 61 72 20 2a 2a 61 7a 41 72 67 3b 20 20 20 20  har **azArg;    
26340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26350 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6d 6d 61  * Array of comma
26360 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
26370 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 3b    ShellState *p;
26380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26390 20 20 2f 2a 20 53 68 65 6c 6c 20 73 74 61 74 65    /* Shell state
263a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
263b0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
263c0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
263d0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
263e0 20 61 72 63 68 69 76 65 20 2a 2f 0a 7d 3b 0a 0a   archive */.};..
263f0 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 75 73  /*.** Print a us
26400 61 67 65 20 6d 65 73 73 61 67 65 20 66 6f 72 20  age message for 
26410 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20  the .ar command 
26420 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65  to stderr and re
26430 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
26440 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  R..*/.static int
26450 20 61 72 55 73 61 67 65 28 46 49 4c 45 20 2a 66   arUsage(FILE *f
26460 29 7b 0a 20 20 73 68 6f 77 48 65 6c 70 28 66 2c  ){.  showHelp(f,
26470 22 61 72 63 68 69 76 65 22 29 3b 0a 20 20 72 65  "archive");.  re
26480 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
26490 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  R;.}../*.** Prin
264a0 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  t an error messa
264b0 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72 20 63  ge for the .ar c
264c0 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65 72 72  ommand to stderr
264d0 20 61 6e 64 20 72 65 74 75 72 6e 20 0a 2a 2a 20   and return .** 
264e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
264f0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 72  .static int arEr
26500 72 6f 72 4d 73 67 28 41 72 43 6f 6d 6d 61 6e 64  rorMsg(ArCommand
26510 20 2a 70 41 72 2c 20 63 6f 6e 73 74 20 63 68 61   *pAr, const cha
26520 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20  r *zFmt, ...){. 
26530 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
26540 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 73 74 61  har *z;.  va_sta
26550 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20  rt(ap, zFmt);.  
26560 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  z = sqlite3_vmpr
26570 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a  intf(zFmt, ap);.
26580 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
26590 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
265a0 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
265b0 22 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 41 72  ", z);.  if( pAr
265c0 2d 3e 66 72 6f 6d 43 6d 64 4c 69 6e 65 20 29 7b  ->fromCmdLine ){
265d0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
265e0 28 73 74 64 65 72 72 2c 20 22 55 73 65 20 5c 22  (stderr, "Use \"
265f0 2d 41 5c 22 20 66 6f 72 20 6d 6f 72 65 20 68 65  -A\" for more he
26600 6c 70 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  lp\n");.  }else{
26610 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
26620 28 73 74 64 65 72 72 2c 20 22 55 73 65 20 5c 22  (stderr, "Use \"
26630 2e 61 72 63 68 69 76 65 20 2d 2d 68 65 6c 70 5c  .archive --help\
26640 22 20 66 6f 72 20 6d 6f 72 65 20 68 65 6c 70 5c  " for more help\
26650 6e 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n");.  }.  sqlit
26660 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
26670 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
26680 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75  R;.}../*.** Valu
26690 65 73 20 66 6f 72 20 41 72 43 6f 6d 6d 61 6e 64  es for ArCommand
266a0 2e 65 43 6d 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e  .eCmd..*/.#defin
266b0 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 20  e AR_CMD_CREATE 
266c0 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
266d0 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 20 20  AR_CMD_EXTRACT  
266e0 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 41 52      2.#define AR
266f0 5f 43 4d 44 5f 4c 49 53 54 20 20 20 20 20 20 20  _CMD_LIST       
26700 20 20 33 0a 23 64 65 66 69 6e 65 20 41 52 5f 43    3.#define AR_C
26710 4d 44 5f 55 50 44 41 54 45 20 20 20 20 20 20 20  MD_UPDATE       
26720 34 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44  4.#define AR_CMD
26730 5f 48 45 4c 50 20 20 20 20 20 20 20 20 20 35 0a  _HELP         5.
26740 0a 2f 2a 0a 2a 2a 20 4f 74 68 65 72 20 28 6e 6f  ./*.** Other (no
26750 6e 2d 63 6f 6d 6d 61 6e 64 29 20 73 77 69 74 63  n-command) switc
26760 68 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  hes..*/.#define 
26770 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53  AR_SWITCH_VERBOS
26780 45 20 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20  E     6.#define 
26790 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 20 20  AR_SWITCH_FILE  
267a0 20 20 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20        7.#define 
267b0 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54  AR_SWITCH_DIRECT
267c0 4f 52 59 20 20 20 38 0a 23 64 65 66 69 6e 65 20  ORY   8.#define 
267d0 41 52 5f 53 57 49 54 43 48 5f 41 50 50 45 4e 44  AR_SWITCH_APPEND
267e0 20 20 20 20 20 20 39 0a 23 64 65 66 69 6e 65 20        9.#define 
267f0 41 52 5f 53 57 49 54 43 48 5f 44 52 59 52 55 4e  AR_SWITCH_DRYRUN
26800 20 20 20 20 20 31 30 0a 0a 73 74 61 74 69 63 20       10..static 
26810 69 6e 74 20 61 72 50 72 6f 63 65 73 73 53 77 69  int arProcessSwi
26820 74 63 68 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  tch(ArCommand *p
26830 41 72 2c 20 69 6e 74 20 65 53 77 69 74 63 68 2c  Ar, int eSwitch,
26840 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
26850 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65 53  g){.  switch( eS
26860 77 69 74 63 68 20 29 7b 0a 20 20 20 20 63 61 73  witch ){.    cas
26870 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 3a  e AR_CMD_CREATE:
26880 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44  .    case AR_CMD
26890 5f 45 58 54 52 41 43 54 3a 0a 20 20 20 20 63 61  _EXTRACT:.    ca
268a0 73 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a  se AR_CMD_LIST:.
268b0 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
268c0 55 50 44 41 54 45 3a 0a 20 20 20 20 63 61 73 65  UPDATE:.    case
268d0 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20   AR_CMD_HELP:.  
268e0 20 20 20 20 69 66 28 20 70 41 72 2d 3e 65 43 6d      if( pAr->eCm
268f0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  d ){.        ret
26900 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70  urn arErrorMsg(p
26910 41 72 2c 20 22 6d 75 6c 74 69 70 6c 65 20 63 6f  Ar, "multiple co
26920 6d 6d 61 6e 64 20 6f 70 74 69 6f 6e 73 22 29 3b  mmand options");
26930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
26940 41 72 2d 3e 65 43 6d 64 20 3d 20 65 53 77 69 74  Ar->eCmd = eSwit
26950 63 68 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ch;.      break;
26960 0a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57  ..    case AR_SW
26970 49 54 43 48 5f 44 52 59 52 55 4e 3a 0a 20 20 20  ITCH_DRYRUN:.   
26980 20 20 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20     pAr->bDryRun 
26990 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
269a0 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57  ;.    case AR_SW
269b0 49 54 43 48 5f 56 45 52 42 4f 53 45 3a 0a 20 20  ITCH_VERBOSE:.  
269c0 20 20 20 20 70 41 72 2d 3e 62 56 65 72 62 6f 73      pAr->bVerbos
269d0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  e = 1;.      bre
269e0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f  ak;.    case AR_
269f0 53 57 49 54 43 48 5f 41 50 50 45 4e 44 3a 0a 20  SWITCH_APPEND:. 
26a00 20 20 20 20 20 70 41 72 2d 3e 62 41 70 70 65 6e       pAr->bAppen
26a10 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20  d = 1;.      /* 
26a20 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 2d  Fall thru into -
26a30 2d 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73  -file */.    cas
26a40 65 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45  e AR_SWITCH_FILE
26a50 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a 46 69  :.      pAr->zFi
26a60 6c 65 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20  le = zArg;.     
26a70 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
26a80 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43   AR_SWITCH_DIREC
26a90 54 4f 52 59 3a 0a 20 20 20 20 20 20 70 41 72 2d  TORY:.      pAr-
26aa0 3e 7a 44 69 72 20 3d 20 7a 41 72 67 3b 0a 20 20  >zDir = zArg;.  
26ab0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
26ac0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26ad0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  OK;.}../*.** Par
26ae0 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  se the command l
26af0 69 6e 65 20 66 6f 72 20 61 6e 20 22 2e 61 72 22  ine for an ".ar"
26b00 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 65 20 72 65   command. The re
26b10 73 75 6c 74 73 20 61 72 65 20 77 72 69 74 74 65  sults are writte
26b20 6e 20 69 6e 74 6f 0a 2a 2a 20 73 74 72 75 63 74  n into.** struct
26b30 75 72 65 20 28 2a 70 41 72 29 2e 20 53 51 4c 49  ure (*pAr). SQLI
26b40 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
26b50 64 20 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64  d if the command
26b60 20 6c 69 6e 65 20 69 73 20 70 61 72 73 65 64 0a   line is parsed.
26b70 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ** successfully,
26b80 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
26b90 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77  ror message is w
26ba0 72 69 74 74 65 6e 20 74 6f 20 73 74 64 65 72 72  ritten to stderr
26bb0 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f   and .** SQLITE_
26bc0 45 52 52 4f 52 20 72 65 74 75 72 6e 65 64 2e 0a  ERROR returned..
26bd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
26be0 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28 0a 20 20  ParseCommand(.  
26bf0 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20  char **azArg,   
26c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c10 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75  /* Array of argu
26c20 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
26c30 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  dot command */. 
26c40 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
26c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
26c70 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d  tries in azArg[]
26c80 20 2a 2f 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20   */.  ArCommand 
26c90 2a 70 41 72 20 20 20 20 20 20 20 20 20 20 20 20  *pAr            
26ca0 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74        /* Populat
26cb0 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  e this object */
26cc0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 41 72 53  .){.  struct ArS
26cd0 77 69 74 63 68 20 7b 0a 20 20 20 20 63 6f 6e 73  witch {.    cons
26ce0 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 3b 0a 20  t char *zLong;. 
26cf0 20 20 20 63 68 61 72 20 63 53 68 6f 72 74 3b 0a     char cShort;.
26d00 20 20 20 20 75 38 20 65 53 77 69 74 63 68 3b 0a      u8 eSwitch;.
26d10 20 20 20 20 75 38 20 62 41 72 67 3b 0a 20 20 7d      u8 bArg;.  }
26d20 20 61 53 77 69 74 63 68 5b 5d 20 3d 20 7b 0a 20   aSwitch[] = {. 
26d30 20 20 20 7b 20 22 63 72 65 61 74 65 22 2c 20 20     { "create",  
26d40 20 20 27 63 27 2c 20 41 52 5f 43 4d 44 5f 43 52    'c', AR_CMD_CR
26d50 45 41 54 45 2c 20 20 20 20 20 20 20 30 20 7d 2c  EATE,       0 },
26d60 0a 20 20 20 20 7b 20 22 65 78 74 72 61 63 74 22  .    { "extract"
26d70 2c 20 20 20 27 78 27 2c 20 41 52 5f 43 4d 44 5f  ,   'x', AR_CMD_
26d80 45 58 54 52 41 43 54 2c 20 20 20 20 20 20 30 20  EXTRACT,      0 
26d90 7d 2c 0a 20 20 20 20 7b 20 22 6c 69 73 74 22 2c  },.    { "list",
26da0 20 20 20 20 20 20 27 74 27 2c 20 41 52 5f 43 4d        't', AR_CM
26db0 44 5f 4c 49 53 54 2c 20 20 20 20 20 20 20 20 20  D_LIST,         
26dc0 30 20 7d 2c 0a 20 20 20 20 7b 20 22 75 70 64 61  0 },.    { "upda
26dd0 74 65 22 2c 20 20 20 20 27 75 27 2c 20 41 52 5f  te",    'u', AR_
26de0 43 4d 44 5f 55 50 44 41 54 45 2c 20 20 20 20 20  CMD_UPDATE,     
26df0 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 68 65    0 },.    { "he
26e00 6c 70 22 2c 20 20 20 20 20 20 27 68 27 2c 20 41  lp",      'h', A
26e10 52 5f 43 4d 44 5f 48 45 4c 50 2c 20 20 20 20 20  R_CMD_HELP,     
26e20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22      0 },.    { "
26e30 76 65 72 62 6f 73 65 22 2c 20 20 20 27 76 27 2c  verbose",   'v',
26e40 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f   AR_SWITCH_VERBO
26e50 53 45 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b  SE,   0 },.    {
26e60 20 22 66 69 6c 65 22 2c 20 20 20 20 20 20 27 66   "file",      'f
26e70 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c  ', AR_SWITCH_FIL
26e80 45 2c 20 20 20 20 20 20 31 20 7d 2c 0a 20 20 20  E,      1 },.   
26e90 20 7b 20 22 61 70 70 65 6e 64 22 2c 20 20 20 20   { "append",    
26ea0 27 61 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 41  'a', AR_SWITCH_A
26eb0 50 50 45 4e 44 2c 20 20 20 20 31 20 7d 2c 0a 20  PPEND,    1 },. 
26ec0 20 20 20 7b 20 22 64 69 72 65 63 74 6f 72 79 22     { "directory"
26ed0 2c 20 27 43 27 2c 20 41 52 5f 53 57 49 54 43 48  , 'C', AR_SWITCH
26ee0 5f 44 49 52 45 43 54 4f 52 59 2c 20 31 20 7d 2c  _DIRECTORY, 1 },
26ef0 0a 20 20 20 20 7b 20 22 64 72 79 72 75 6e 22 2c  .    { "dryrun",
26f00 20 20 20 20 27 6e 27 2c 20 41 52 5f 53 57 49 54      'n', AR_SWIT
26f10 43 48 5f 44 52 59 52 55 4e 2c 20 20 20 20 30 20  CH_DRYRUN,    0 
26f20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 6e 53  },.  };.  int nS
26f30 77 69 74 63 68 20 3d 20 73 69 7a 65 6f 66 28 61  witch = sizeof(a
26f40 53 77 69 74 63 68 29 20 2f 20 73 69 7a 65 6f 66  Switch) / sizeof
26f50 28 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68  (struct ArSwitch
26f60 29 3b 0a 20 20 73 74 72 75 63 74 20 41 72 53 77  );.  struct ArSw
26f70 69 74 63 68 20 2a 70 45 6e 64 20 3d 20 26 61 53  itch *pEnd = &aS
26f80 77 69 74 63 68 5b 6e 53 77 69 74 63 68 5d 3b 0a  witch[nSwitch];.
26f90 0a 20 20 69 66 28 20 6e 41 72 67 3c 3d 31 20 29  .  if( nArg<=1 )
26fa0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
26fb0 66 28 73 74 64 65 72 72 2c 20 22 57 72 6f 6e 67  f(stderr, "Wrong
26fc0 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
26fd0 65 6e 74 73 2e 20 20 55 73 61 67 65 3a 5c 6e 22  ents.  Usage:\n"
26fe0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 72  );.    return ar
26ff0 55 73 61 67 65 28 73 74 64 65 72 72 29 3b 0a 20  Usage(stderr);. 
27000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
27010 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a   *z = azArg[1];.
27020 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d      if( z[0]!='-
27030 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  ' ){.      /* Tr
27040 61 64 69 74 69 6f 6e 61 6c 20 73 74 79 6c 65 20  aditional style 
27050 5b 74 61 72 5d 20 69 6e 76 6f 63 61 74 69 6f 6e  [tar] invocation
27060 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
27070 0a 20 20 20 20 20 20 69 6e 74 20 69 41 72 67 20  .      int iArg 
27080 3d 20 32 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  = 2;.      for(i
27090 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
270a0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
270b0 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20 20  ar *zArg = 0;.  
270c0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53        struct ArS
270d0 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20  witch *pOpt;.   
270e0 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26 61       for(pOpt=&a
270f0 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c  Switch[0]; pOpt<
27100 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20  pEnd; pOpt++){. 
27110 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69           if( z[i
27120 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74 20  ]==pOpt->cShort 
27130 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
27140 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
27150 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20  Opt==pEnd ){.   
27160 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
27170 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 75  ErrorMsg(pAr, "u
27180 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69  nrecognized opti
27190 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b 0a  on: %c", z[i]);.
271a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
271b0 20 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67    if( pOpt->bArg
271c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
271d0 28 20 69 41 72 67 3e 3d 6e 41 72 67 20 29 7b 0a  ( iArg>=nArg ){.
271e0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
271f0 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41  rn arErrorMsg(pA
27200 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69  r, "option requi
27210 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a  res an argument:
27220 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20   %c",z[i]);.    
27230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27240 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 69    zArg = azArg[i
27250 41 72 67 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20  Arg++];.        
27260 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 72  }.        if( ar
27270 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70 41  ProcessSwitch(pA
27280 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63 68  r, pOpt->eSwitch
27290 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75 72 6e  , zArg) ) return
272a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
272b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 72       }.      pAr
272c0 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41  ->nArg = nArg-iA
272d0 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  rg;.      if( pA
272e0 72 2d 3e 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20  r->nArg>0 ){.   
272f0 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20       pAr->azArg 
27300 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a  = &azArg[iArg];.
27310 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
27320 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d  e{.      /* Non-
27330 74 72 61 64 69 74 69 6f 6e 61 6c 20 69 6e 76 6f  traditional invo
27340 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  cation */.      
27350 69 6e 74 20 69 41 72 67 3b 0a 20 20 20 20 20 20  int iArg;.      
27360 66 6f 72 28 69 41 72 67 3d 31 3b 20 69 41 72 67  for(iArg=1; iArg
27370 3c 6e 41 72 67 3b 20 69 41 72 67 2b 2b 29 7b 0a  <nArg; iArg++){.
27380 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20          int n;. 
27390 20 20 20 20 20 20 20 7a 20 3d 20 61 7a 41 72 67         z = azArg
273a0 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iArg];.        
273b0 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b  if( z[0]!='-' ){
273c0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  .          /* Al
273d0 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d  l remaining comm
273e0 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 20 61  and line words a
273f0 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  re command argum
27400 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ents. */.       
27410 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20     pAr->azArg = 
27420 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20  &azArg[iArg];.  
27430 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72          pAr->nAr
27440 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20  g = nArg-iArg;. 
27450 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
27460 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27470 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a    n = strlen30(z
27480 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  );..        if( 
27490 7a 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20  z[1]!='-' ){.   
274a0 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
274b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
274c0 72 20 6d 6f 72 65 20 73 68 6f 72 74 20 6f 70 74  r more short opt
274d0 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ions */.        
274e0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b 20    for(i=1; i<n; 
274f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
27500 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
27510 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rg = 0;.        
27520 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77 69      struct ArSwi
27530 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20 20  tch *pOpt;.     
27540 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d         for(pOpt=
27550 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70  &aSwitch[0]; pOp
27560 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b  t<pEnd; pOpt++){
27570 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
27580 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63  f( z[i]==pOpt->c
27590 53 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20  Short ) break;. 
275a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
275b0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
275c0 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  t==pEnd ){.     
275d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
275e0 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20  arErrorMsg(pAr, 
275f0 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70  "unrecognized op
27600 74 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29  tion: %c", z[i])
27610 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
27620 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
27630 70 4f 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20  pOpt->bArg ){.  
27640 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
27650 69 3c 28 6e 2d 31 29 20 29 7b 0a 20 20 20 20 20  i<(n-1) ){.     
27660 20 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20             zArg 
27670 3d 20 26 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20 20  = &z[i+1];.     
27680 20 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e             i = n
27690 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
276a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
276b0 20 20 20 20 20 20 20 69 66 28 20 69 41 72 67 3e         if( iArg>
276c0 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20  =(nArg-1) ){.   
276d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
276e0 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
276f0 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65  (pAr, "option re
27700 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65  quires an argume
27710 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20  nt: %c",z[i]);. 
27720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
27730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27740 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 2b 2b   zArg = azArg[++
27750 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 20  iArg];.         
27760 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27770 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
27780 20 69 66 28 20 61 72 50 72 6f 63 65 73 73 53 77   if( arProcessSw
27790 69 74 63 68 28 70 41 72 2c 20 70 4f 70 74 2d 3e  itch(pAr, pOpt->
277a0 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20 29  eSwitch, zArg) )
277b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
277c0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
277d0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
277e0 69 66 28 20 7a 5b 32 5d 3d 3d 27 5c 30 27 20 29  if( z[2]=='\0' )
277f0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
27800 20 2d 2d 20 6f 70 74 69 6f 6e 2c 20 69 6e 64 69   -- option, indi
27810 63 61 74 69 6e 67 20 74 68 61 74 20 61 6c 6c 20  cating that all 
27820 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e  remaining comman
27830 64 20 6c 69 6e 65 20 77 6f 72 64 73 0a 20 20 20  d line words.   
27840 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 63 6f         ** are co
27850 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e  mmand arguments.
27860 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
27870 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41  Ar->azArg = &azA
27880 72 67 5b 69 41 72 67 2b 31 5d 3b 0a 20 20 20 20  rg[iArg+1];.    
27890 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67 20        pAr->nArg 
278a0 3d 20 6e 41 72 67 2d 69 41 72 67 2d 31 3b 0a 20  = nArg-iArg-1;. 
278b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
278c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
278d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c 6f           /* A lo
278e0 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  ng option */.   
278f0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
27900 72 20 2a 7a 41 72 67 20 3d 20 30 3b 20 20 20 20  r *zArg = 0;    
27910 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
27920 6d 65 6e 74 20 66 6f 72 20 6f 70 74 69 6f 6e 2c  ment for option,
27930 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20 20 20   if any */.     
27940 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77       struct ArSw
27950 69 74 63 68 20 2a 70 4d 61 74 63 68 20 3d 20 30  itch *pMatch = 0
27960 3b 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69  ;      /* Matchi
27970 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  ng option */.   
27980 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72         struct Ar
27990 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 20 20 20  Switch *pOpt;   
279a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
279b0 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ator */.        
279c0 20 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77 69    for(pOpt=&aSwi
279d0 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e  tch[0]; pOpt<pEn
279e0 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20  d; pOpt++){.    
279f0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
27a00 61 72 20 2a 7a 4c 6f 6e 67 20 3d 20 70 4f 70 74  ar *zLong = pOpt
27a10 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20 20 20 20 20 20  ->zLong;.       
27a20 20 20 20 20 20 69 66 28 20 28 6e 2d 32 29 3c 3d       if( (n-2)<=
27a30 73 74 72 6c 65 6e 33 30 28 7a 4c 6f 6e 67 29 20  strlen30(zLong) 
27a40 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 26 7a 5b  && 0==memcmp(&z[
27a50 32 5d 2c 20 7a 4c 6f 6e 67 2c 20 6e 2d 32 29 20  2], zLong, n-2) 
27a60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
27a70 20 69 66 28 20 70 4d 61 74 63 68 20 29 7b 0a 20   if( pMatch ){. 
27a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
27a90 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
27aa0 28 70 41 72 2c 20 22 61 6d 62 69 67 75 6f 75 73  (pAr, "ambiguous
27ab0 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 7a 29 3b   option: %s",z);
27ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
27ad0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
27ae0 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70        pMatch = p
27af0 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Opt;.           
27b00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
27b10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a   }.          }..
27b20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d            if( pM
27b30 61 74 63 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  atch==0 ){.     
27b40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
27b50 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 75  ErrorMsg(pAr, "u
27b60 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69  nrecognized opti
27b70 6f 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20  on: %s", z);.   
27b80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27b90 20 20 20 69 66 28 20 70 4d 61 74 63 68 2d 3e 62     if( pMatch->b
27ba0 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Arg ){.         
27bb0 20 20 20 69 66 28 20 69 41 72 67 3e 3d 28 6e 41     if( iArg>=(nA
27bc0 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  rg-1) ){.       
27bd0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
27be0 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 6f  ErrorMsg(pAr, "o
27bf0 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61  ption requires a
27c00 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 22 2c  n argument: %s",
27c10 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   z);.           
27c20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a   }.            z
27c30 41 72 67 20 3d 20 61 7a 41 72 67 5b 2b 2b 69 41  Arg = azArg[++iA
27c40 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rg];.          }
27c50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
27c60 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70  rProcessSwitch(p
27c70 41 72 2c 20 70 4d 61 74 63 68 2d 3e 65 53 77 69  Ar, pMatch->eSwi
27c80 74 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74  tch, zArg) ) ret
27c90 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
27ca0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27cb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
27cc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27cd0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
27ce0 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
27cf0 73 20 74 68 61 74 20 61 6c 6c 20 61 72 67 75 6d  s that all argum
27d00 65 6e 74 73 20 77 69 74 68 69 6e 20 74 68 65 20  ents within the 
27d10 41 72 43 6f 6d 6d 61 6e 64 2e 61 7a 41 72 67 5b  ArCommand.azArg[
27d20 5d 0a 2a 2a 20 61 72 72 61 79 20 72 65 66 65 72  ].** array refer
27d30 20 74 6f 20 61 72 63 68 69 76 65 20 6d 65 6d 62   to archive memb
27d40 65 72 73 2c 20 61 73 20 66 6f 72 20 74 68 65 20  ers, as for the 
27d50 2d 2d 65 78 74 72 61 63 74 20 6f 72 20 2d 2d 6c  --extract or --l
27d60 69 73 74 20 63 6f 6d 6d 61 6e 64 73 2e 20 0a 2a  ist commands. .*
27d70 2a 20 49 74 20 63 68 65 63 6b 73 20 74 68 61 74  * It checks that
27d80 20 65 61 63 68 20 6f 66 20 74 68 65 6d 20 61 72   each of them ar
27d90 65 20 70 72 65 73 65 6e 74 2e 20 49 66 20 61 6e  e present. If an
27da0 79 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  y specified file
27db0 20 69 73 20 6e 6f 74 0a 2a 2a 20 70 72 65 73 65   is not.** prese
27dc0 6e 74 20 69 6e 20 74 68 65 20 61 72 63 68 69 76  nt in the archiv
27dd0 65 2c 20 61 6e 20 65 72 72 6f 72 20 69 73 20 70  e, an error is p
27de0 72 69 6e 74 65 64 20 74 6f 20 73 74 64 65 72 72  rinted to stderr
27df0 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 0a 2a 2a   and an error.**
27e00 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20   code returned. 
27e10 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c  Otherwise, if al
27e20 6c 20 73 70 65 63 69 66 69 65 64 20 61 72 67 75  l specified argu
27e30 6d 65 6e 74 73 20 61 72 65 20 70 72 65 73 65 6e  ments are presen
27e40 74 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72 63 68  t in.** the arch
27e50 69 76 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ive, SQLITE_OK i
27e60 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
27e70 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
27e80 73 74 72 69 70 73 20 61 6e 79 20 74 72 61 69 6c  strips any trail
27e90 69 6e 67 20 27 2f 27 20 63 68 61 72 61 63 74 65  ing '/' characte
27ea0 72 73 20 66 72 6f 6d 20 65 61 63 68 20 61 72 67  rs from each arg
27eb0 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 69  ument..** This i
27ec0 73 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74  s consistent wit
27ed0 68 20 74 68 65 20 77 61 79 20 74 68 65 20 5b 74  h the way the [t
27ee0 61 72 5d 20 63 6f 6d 6d 61 6e 64 20 73 65 65 6d  ar] command seem
27ef0 73 20 74 6f 20 77 6f 72 6b 20 6f 6e 0a 2a 2a 20  s to work on.** 
27f00 4c 69 6e 75 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  Linux..*/.static
27f10 20 69 6e 74 20 61 72 43 68 65 63 6b 45 6e 74 72   int arCheckEntr
27f20 69 65 73 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  ies(ArCommand *p
27f30 41 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Ar){.  int rc = 
27f40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
27f50 20 70 41 72 2d 3e 6e 41 72 67 20 29 7b 0a 20 20   pAr->nArg ){.  
27f60 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
27f70 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54  sqlite3_stmt *pT
27f80 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 73 68  est = 0;..    sh
27f90 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66  ellPreparePrintf
27fa0 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26  (pAr->db, &rc, &
27fb0 70 54 65 73 74 2c 0a 20 20 20 20 20 20 20 20 22  pTest,.        "
27fc0 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
27fd0 20 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 24   %s WHERE name=$
27fe0 6e 61 6d 65 22 2c 20 0a 20 20 20 20 20 20 20 20  name", .        
27ff0 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 0a 20  pAr->zSrcTable. 
28000 20 20 20 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71     );.    j = sq
28010 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
28020 65 74 65 72 5f 69 6e 64 65 78 28 70 54 65 73 74  eter_index(pTest
28030 2c 20 22 24 6e 61 6d 65 22 29 3b 0a 20 20 20 20  , "$name");.    
28040 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e  for(i=0; i<pAr->
28050 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c 49  nArg && rc==SQLI
28060 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
28070 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72     char *z = pAr
28080 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  ->azArg[i];.    
28090 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
280a0 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 69 6e 74  30(z);.      int
280b0 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20   bOk = 0;.      
280c0 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b  while( n>0 && z[
280d0 6e 2d 31 5d 3d 3d 27 2f 27 20 29 20 6e 2d 2d 3b  n-1]=='/' ) n--;
280e0 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 27 5c  .      z[n] = '\
280f0 30 27 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0';.      sqlite
28100 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 54 65 73  3_bind_text(pTes
28110 74 2c 20 6a 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c  t, j, z, -1, SQL
28120 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
28130 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
28140 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
28150 70 54 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pTest) ){.      
28160 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20    bOk = 1;.     
28170 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65   }.      shellRe
28180 73 65 74 28 26 72 63 2c 20 70 54 65 73 74 29 3b  set(&rc, pTest);
28190 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
281a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d  QLITE_OK && bOk=
281b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  =0 ){.        ut
281c0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
281d0 2c 20 22 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20  , "not found in 
281e0 61 72 63 68 69 76 65 3a 20 25 73 5c 6e 22 2c 20  archive: %s\n", 
281f0 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  z);.        rc =
28200 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
28210 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
28220 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26   shellFinalize(&
28230 72 63 2c 20 70 54 65 73 74 29 3b 0a 20 20 7d 0a  rc, pTest);.  }.
28240 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28250 2f 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 61 20 57  /*.** Format a W
28260 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
28270 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 67 61   can be used aga
28280 69 6e 73 74 20 74 68 65 20 22 73 71 6c 61 72 22  inst the "sqlar"
28290 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 69 64 65   table to.** ide
282a0 6e 74 69 66 79 20 61 6c 6c 20 61 72 63 68 69 76  ntify all archiv
282b0 65 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 6d  e members that m
282c0 61 74 63 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64  atch the command
282d0 20 61 72 67 75 6d 65 6e 74 73 20 68 65 6c 64 0a   arguments held.
282e0 2a 2a 20 69 6e 20 28 2a 70 41 72 29 2e 20 4c 65  ** in (*pAr). Le
282f0 61 76 65 20 74 68 69 73 20 57 48 45 52 45 20 63  ave this WHERE c
28300 6c 61 75 73 65 20 69 6e 20 28 2a 70 7a 57 68 65  lause in (*pzWhe
28310 72 65 29 20 62 65 66 6f 72 65 20 72 65 74 75 72  re) before retur
28320 6e 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 61 6c  ning..** The cal
28330 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
28340 6c 65 20 66 6f 72 20 65 76 65 6e 74 75 61 6c 6c  le for eventuall
28350 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
28360 33 5f 66 72 65 65 28 29 20 6f 6e 0a 2a 2a 20 61  3_free() on.** a
28370 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c 20 28 2a 70 7a  ny non-NULL (*pz
28380 57 68 65 72 65 29 20 76 61 6c 75 65 2e 0a 2a 2f  Where) value..*/
28390 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 72 57  .static void arW
283a0 68 65 72 65 43 6c 61 75 73 65 28 0a 20 20 69 6e  hereClause(.  in
283b0 74 20 2a 70 52 63 2c 20 0a 20 20 41 72 43 6f 6d  t *pRc, .  ArCom
283c0 6d 61 6e 64 20 2a 70 41 72 2c 20 0a 20 20 63 68  mand *pAr, .  ch
283d0 61 72 20 2a 2a 70 7a 57 68 65 72 65 20 20 20 20  ar **pzWhere    
283e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
283f0 20 4f 55 54 3a 20 4e 65 77 20 57 48 45 52 45 20   OUT: New WHERE 
28400 63 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 63  clause */.){.  c
28410 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b  har *zWhere = 0;
28420 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
28430 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
28440 28 20 70 41 72 2d 3e 6e 41 72 67 3d 3d 30 20 29  ( pAr->nArg==0 )
28450 7b 0a 20 20 20 20 20 20 7a 57 68 65 72 65 20 3d  {.      zWhere =
28460 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
28470 28 22 31 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ("1");.    }else
28480 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
28490 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
284a0 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20  *zSep = "";.    
284b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72    for(i=0; i<pAr
284c0 2d 3e 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nArg; i++){.  
284d0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
284e0 20 2a 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72 67   *z = pAr->azArg
284f0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a 57 68  [i];.        zWh
28500 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ere = sqlite3_mp
28510 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
28520 20 22 25 7a 25 73 20 6e 61 6d 65 20 3d 20 27 25   "%z%s name = '%
28530 71 27 20 4f 52 20 73 75 62 73 74 72 28 6e 61 6d  q' OR substr(nam
28540 65 2c 31 2c 25 64 29 20 3d 20 27 25 71 2f 27 22  e,1,%d) = '%q/'"
28550 2c 20 0a 20 20 20 20 20 20 20 20 20 20 7a 57 68  , .          zWh
28560 65 72 65 2c 20 7a 53 65 70 2c 20 7a 2c 20 73 74  ere, zSep, z, st
28570 72 6c 65 6e 33 30 28 7a 29 2b 31 2c 20 7a 0a 20  rlen30(z)+1, z. 
28580 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
28590 20 20 69 66 28 20 7a 57 68 65 72 65 3d 3d 30 20    if( zWhere==0 
285a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52  ){.          *pR
285b0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
285c0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
285d0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
285e0 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20 4f 52       zSep = " OR
285f0 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   ";.      }.    
28600 7d 0a 20 20 7d 0a 20 20 2a 70 7a 57 68 65 72 65  }.  }.  *pzWhere
28610 20 3d 20 7a 57 68 65 72 65 3b 0a 7d 0a 0a 2f 2a   = zWhere;.}../*
28620 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
28630 6f 6e 20 6f 66 20 2e 61 72 20 22 6c 69 73 54 22  on of .ar "lisT"
28640 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74   command. .*/.st
28650 61 74 69 63 20 69 6e 74 20 61 72 4c 69 73 74 43  atic int arListC
28660 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e 64  ommand(ArCommand
28670 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20   *pAr){.  const 
28680 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53 45  char *zSql = "SE
28690 4c 45 43 54 20 25 73 20 46 52 4f 4d 20 25 73 20  LECT %s FROM %s 
286a0 57 48 45 52 45 20 25 73 22 3b 20 0a 20 20 63 6f  WHERE %s"; .  co
286b0 6e 73 74 20 63 68 61 72 20 2a 61 7a 43 6f 6c 73  nst char *azCols
286c0 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 6e 61 6d 65  [] = {.    "name
286d0 22 2c 0a 20 20 20 20 22 6c 73 6d 6f 64 65 28 6d  ",.    "lsmode(m
286e0 6f 64 65 29 2c 20 73 7a 2c 20 64 61 74 65 74 69  ode), sz, dateti
286f0 6d 65 28 6d 74 69 6d 65 2c 20 27 75 6e 69 78 65  me(mtime, 'unixe
28700 70 6f 63 68 27 29 2c 20 6e 61 6d 65 22 0a 20 20  poch'), name".  
28710 7d 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 57 68 65  };..  char *zWhe
28720 72 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  re = 0;.  sqlite
28730 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30  3_stmt *pSql = 0
28740 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
28750 63 20 3d 20 61 72 43 68 65 63 6b 45 6e 74 72 69  c = arCheckEntri
28760 65 73 28 70 41 72 29 3b 0a 20 20 61 72 57 68 65  es(pAr);.  arWhe
28770 72 65 43 6c 61 75 73 65 28 26 72 63 2c 20 70 41  reClause(&rc, pA
28780 72 2c 20 26 7a 57 68 65 72 65 29 3b 0a 0a 20 20  r, &zWhere);..  
28790 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e  shellPreparePrin
287a0 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c  tf(pAr->db, &rc,
287b0 20 26 70 53 71 6c 2c 20 7a 53 71 6c 2c 20 61 7a   &pSql, zSql, az
287c0 43 6f 6c 73 5b 70 41 72 2d 3e 62 56 65 72 62 6f  Cols[pAr->bVerbo
287d0 73 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  se],.           
287e0 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 7a            pAr->z
287f0 53 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72 65  SrcTable, zWhere
28800 29 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 62 44  );.  if( pAr->bD
28810 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 75 74 66  ryRun ){.    utf
28820 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d  8_printf(pAr->p-
28830 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71  >out, "%s\n", sq
28840 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 29  lite3_sql(pSql))
28850 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
28860 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
28870 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
28880 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
28890 70 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69  pSql) ){.      i
288a0 66 28 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65  f( pAr->bVerbose
288b0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
288c0 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e  _printf(pAr->p->
288d0 6f 75 74 2c 20 22 25 73 20 25 20 31 30 64 20 20  out, "%s % 10d  
288e0 25 73 20 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  %s  %s\n",.     
288f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
28900 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
28910 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
28920 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
28930 69 6e 74 28 70 53 71 6c 2c 20 31 29 2c 20 0a 20  int(pSql, 1), . 
28940 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28950 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
28960 53 71 6c 2c 20 32 29 2c 0a 20 20 20 20 20 20 20  Sql, 2),.       
28970 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
28980 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33  umn_text(pSql, 3
28990 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
289a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
289b0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
289c0 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  r->p->out, "%s\n
289d0 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
289e0 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29  n_text(pSql, 0))
289f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28a00 20 20 7d 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c    }.  shellFinal
28a10 69 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a  ize(&rc, pSql);.
28a20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28a30 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e  Where);.  return
28a40 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49   rc;.}.../*.** I
28a50 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
28a60 20 2e 61 72 20 22 65 58 74 72 61 63 74 22 20 63   .ar "eXtract" c
28a70 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74  ommand. .*/.stat
28a80 69 63 20 69 6e 74 20 61 72 45 78 74 72 61 63 74  ic int arExtract
28a90 43 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e  Command(ArComman
28aa0 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74  d *pAr){.  const
28ab0 20 63 68 61 72 20 2a 7a 53 71 6c 31 20 3d 20 0a   char *zSql1 = .
28ac0 20 20 20 20 22 53 45 4c 45 43 54 20 22 0a 20 20      "SELECT ".  
28ad0 20 20 22 20 28 24 64 69 72 20 7c 7c 20 6e 61 6d    " ($dir || nam
28ae0 65 29 2c 22 0a 20 20 20 20 22 20 77 72 69 74 65  e),".    " write
28af0 66 69 6c 65 28 28 24 64 69 72 20 7c 7c 20 6e 61  file(($dir || na
28b00 6d 65 29 2c 20 25 73 2c 20 6d 6f 64 65 2c 20 6d  me), %s, mode, m
28b10 74 69 6d 65 29 20 22 0a 20 20 20 20 22 46 52 4f  time) ".    "FRO
28b20 4d 20 25 73 20 57 48 45 52 45 20 28 25 73 29 20  M %s WHERE (%s) 
28b30 41 4e 44 20 28 64 61 74 61 20 49 53 20 4e 55 4c  AND (data IS NUL
28b40 4c 20 4f 52 20 24 64 69 72 4f 6e 6c 79 20 3d 20  L OR $dirOnly = 
28b50 30 29 22 0a 20 20 20 20 22 20 41 4e 44 20 6e 61  0)".    " AND na
28b60 6d 65 20 4e 4f 54 20 47 4c 4f 42 20 27 2a 2e 2e  me NOT GLOB '*..
28b70 5b 2f 5c 5c 5d 2a 27 22 3b 0a 0a 20 20 63 6f 6e  [/\\]*'";..  con
28b80 73 74 20 63 68 61 72 20 2a 61 7a 45 78 74 72 61  st char *azExtra
28b90 41 72 67 5b 5d 20 3d 20 7b 20 0a 20 20 20 20 22  Arg[] = { .    "
28ba0 73 71 6c 61 72 5f 75 6e 63 6f 6d 70 72 65 73 73  sqlar_uncompress
28bb0 28 64 61 74 61 2c 20 73 7a 29 22 2c 0a 20 20 20  (data, sz)",.   
28bc0 20 22 64 61 74 61 22 0a 20 20 7d 3b 0a 0a 20 20   "data".  };..  
28bd0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
28be0 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ql = 0;.  int rc
28bf0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
28c00 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a  char *zDir = 0;.
28c10 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d    char *zWhere =
28c20 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   0;.  int i, j;.
28c30 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e  .  /* If argumen
28c40 74 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64  ts are specified
28c50 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
28c60 79 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74  y actually exist
28c70 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65   within.  ** the
28c80 20 61 72 63 68 69 76 65 20 62 65 66 6f 72 65 20   archive before 
28c90 70 72 6f 63 65 65 64 69 6e 67 2e 20 41 6e 64 20  proceeding. And 
28ca0 66 6f 72 6d 75 6c 61 74 65 20 61 20 57 48 45 52  formulate a WHER
28cb0 45 20 63 6c 61 75 73 65 20 74 6f 0a 20 20 2a 2a  E clause to.  **
28cc0 20 6d 61 74 63 68 20 74 68 65 6d 2e 20 20 2a 2f   match them.  */
28cd0 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b 45  .  rc = arCheckE
28ce0 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20 61  ntries(pAr);.  a
28cf0 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72 63  rWhereClause(&rc
28d00 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29 3b  , pAr, &zWhere);
28d10 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
28d20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
28d30 20 70 41 72 2d 3e 7a 44 69 72 20 29 7b 0a 20 20   pAr->zDir ){.  
28d40 20 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74      zDir = sqlit
28d50 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f 22  e3_mprintf("%s/"
28d60 2c 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20 20  , pAr->zDir);.  
28d70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
28d80 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Dir = sqlite3_mp
28d90 72 69 6e 74 66 28 22 22 29 3b 0a 20 20 20 20 7d  rintf("");.    }
28da0 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  .    if( zDir==0
28db0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
28dc0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 73 68 65  OMEM;.  }..  she
28dd0 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28  llPreparePrintf(
28de0 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70  pAr->db, &rc, &p
28df0 53 71 6c 2c 20 7a 53 71 6c 31 2c 20 0a 20 20 20  Sql, zSql1, .   
28e00 20 20 20 61 7a 45 78 74 72 61 41 72 67 5b 70 41     azExtraArg[pA
28e10 72 2d 3e 62 5a 69 70 5d 2c 20 70 41 72 2d 3e 7a  r->bZip], pAr->z
28e20 53 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72 65  SrcTable, zWhere
28e30 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  .  );..  if( rc=
28e40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28e50 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69    j = sqlite3_bi
28e60 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
28e70 65 78 28 70 53 71 6c 2c 20 22 24 64 69 72 22 29  ex(pSql, "$dir")
28e80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
28e90 6e 64 5f 74 65 78 74 28 70 53 71 6c 2c 20 6a 2c  nd_text(pSql, j,
28ea0 20 7a 44 69 72 2c 20 2d 31 2c 20 53 51 4c 49 54   zDir, -1, SQLIT
28eb0 45 5f 53 54 41 54 49 43 29 3b 0a 0a 20 20 20 20  E_STATIC);..    
28ec0 2f 2a 20 52 75 6e 20 74 68 65 20 53 45 4c 45 43  /* Run the SELEC
28ed0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 77 69 63  T statement twic
28ee0 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  e. The first tim
28ef0 65 2c 20 77 72 69 74 65 66 69 6c 65 28 29 20 69  e, writefile() i
28f00 73 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a 20  s called.    ** 
28f10 66 6f 72 20 61 6c 6c 20 61 72 63 68 69 76 65 20  for all archive 
28f20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 73 68 6f  members that sho
28f30 75 6c 64 20 62 65 20 65 78 74 72 61 63 74 65 64  uld be extracted
28f40 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 74 69 6d  . The second tim
28f50 65 2c 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 66  e,.    ** only f
28f60 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 69  or the directori
28f70 65 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  es. This is beca
28f80 75 73 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d  use the timestam
28f90 70 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 78  ps for.    ** ex
28fa0 74 72 61 63 74 65 64 20 64 69 72 65 63 74 6f 72  tracted director
28fb0 69 65 73 20 6d 75 73 74 20 62 65 20 72 65 73 65  ies must be rese
28fc0 74 20 61 66 74 65 72 20 74 68 65 79 20 61 72 65  t after they are
28fd0 20 70 6f 70 75 6c 61 74 65 64 20 28 61 73 0a 20   populated (as. 
28fe0 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 69 6e 67     ** populating
28ff0 20 74 68 65 6d 20 63 68 61 6e 67 65 73 20 74 68   them changes th
29000 65 20 74 69 6d 65 73 74 61 6d 70 29 2e 20 20 2a  e timestamp).  *
29010 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
29020 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
29030 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  j = sqlite3_bind
29040 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
29050 28 70 53 71 6c 2c 20 22 24 64 69 72 4f 6e 6c 79  (pSql, "$dirOnly
29060 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
29070 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c 2c  3_bind_int(pSql,
29080 20 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66   j, i);.      if
29090 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29  ( pAr->bDryRun )
290a0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
290b0 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75  rintf(pAr->p->ou
290c0 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  t, "%s\n", sqlit
290d0 65 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b 0a 20  e3_sql(pSql));. 
290e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
290f0 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
29100 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
29110 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
29120 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20  step(pSql) ){.  
29130 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30          if( i==0
29140 20 26 26 20 70 41 72 2d 3e 62 56 65 72 62 6f 73   && pAr->bVerbos
29150 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
29160 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
29170 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  ->p->out, "%s\n"
29180 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
29190 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29 3b  _text(pSql, 0));
291a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
291b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
291c0 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28       shellReset(
291d0 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20 20 20  &rc, pSql);.    
291e0 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c  }.    shellFinal
291f0 69 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a  ize(&rc, pSql);.
29200 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
29210 72 65 65 28 7a 44 69 72 29 3b 0a 20 20 73 71 6c  ree(zDir);.  sql
29220 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65  ite3_free(zWhere
29230 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
29240 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
29250 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
29260 6e 20 7a 53 71 6c 2e 20 20 4f 72 20 69 66 20 64  n zSql.  Or if d
29270 6f 69 6e 67 20 61 20 2d 2d 64 72 79 72 75 6e 2c  oing a --dryrun,
29280 20 6d 65 72 65 6c 79 20 70 72 69 6e 74 20 69 74   merely print it
29290 20 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   out..*/.static 
292a0 69 6e 74 20 61 72 45 78 65 63 53 71 6c 28 41 72  int arExecSql(Ar
292b0 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63 6f  Command *pAr, co
292c0 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b  nst char *zSql){
292d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
292e0 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b   pAr->bDryRun ){
292f0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
29300 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25  (pAr->p->out, "%
29310 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  s\n", zSql);.   
29320 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
29330 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
29340 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
29350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
29360 78 65 63 28 70 41 72 2d 3e 64 62 2c 20 7a 53 71  xec(pAr->db, zSq
29370 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b  l, 0, 0, &zErr);
29380 0a 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b  .    if( zErr ){
29390 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
293a0 74 66 28 73 74 64 6f 75 74 2c 20 22 45 52 52 4f  tf(stdout, "ERRO
293b0 52 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b  R: %s\n", zErr);
293c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
293d0 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 7d  ree(zErr);.    }
293e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
293f0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ;.}.../*.** Impl
29400 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61  ementation of .a
29410 72 20 22 63 72 65 61 74 65 22 20 61 6e 64 20 22  r "create" and "
29420 75 70 64 61 74 65 22 20 63 6f 6d 6d 61 6e 64 73  update" commands
29430 2e 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ..**.** Create t
29440 68 65 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65  he "sqlar" table
29450 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
29460 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
29470 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a 2a  already exist..*
29480 2a 20 54 68 65 6e 20 61 64 64 20 65 61 63 68 20  * Then add each 
29490 66 69 6c 65 20 69 6e 20 74 68 65 20 61 7a 46 69  file in the azFi
294a0 6c 65 5b 5d 20 61 72 72 61 79 20 74 6f 20 74 68  le[] array to th
294b0 65 20 61 72 63 68 69 76 65 2e 20 44 69 72 65 63  e archive. Direc
294c0 74 6f 72 69 65 73 0a 2a 2a 20 61 72 65 20 61 64  tories.** are ad
294d0 64 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e  ded recursively.
294e0 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 56 65   If argument bVe
294f0 72 62 6f 73 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  rbose is non-zer
29500 6f 2c 20 61 20 6d 65 73 73 61 67 65 20 69 73 0a  o, a message is.
29510 2a 2a 20 70 72 69 6e 74 65 64 20 6f 6e 20 73 74  ** printed on st
29520 64 6f 75 74 20 66 6f 72 20 65 61 63 68 20 66 69  dout for each fi
29530 6c 65 20 61 72 63 68 69 76 65 64 2e 0a 2a 2a 0a  le archived..**.
29540 2a 2a 20 54 68 65 20 63 72 65 61 74 65 20 63 6f  ** The create co
29550 6d 6d 61 6e 64 20 69 73 20 74 68 65 20 73 61 6d  mmand is the sam
29560 65 20 61 73 20 75 70 64 61 74 65 2c 20 65 78 63  e as update, exc
29570 65 70 74 20 74 68 61 74 20 69 74 20 64 72 6f 70  ept that it drop
29580 73 0a 2a 2a 20 61 6e 79 20 65 78 69 73 74 69 6e  s.** any existin
29590 67 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65 20  g "sqlar" table 
295a0 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67  before beginning
295b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
295c0 61 72 43 72 65 61 74 65 4f 72 55 70 64 61 74 65  arCreateOrUpdate
295d0 43 6f 6d 6d 61 6e 64 28 0a 20 20 41 72 43 6f 6d  Command(.  ArCom
295e0 6d 61 6e 64 20 2a 70 41 72 2c 20 20 20 20 20 20  mand *pAr,      
295f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
29600 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
29610 61 6e 64 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20  and options */. 
29620 20 69 6e 74 20 62 55 70 64 61 74 65 20 20 20 20   int bUpdate    
29630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29640 20 2f 2a 20 74 72 75 65 20 66 6f 72 20 61 20 2d   /* true for a -
29650 2d 63 72 65 61 74 65 2e 20 20 66 61 6c 73 65 20  -create.  false 
29660 66 6f 72 20 2d 2d 75 70 64 61 74 65 20 2a 2f 0a  for --update */.
29670 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
29680 2a 7a 43 72 65 61 74 65 20 3d 20 0a 20 20 20 20  *zCreate = .    
29690 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
296a0 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 71  IF NOT EXISTS sq
296b0 6c 61 72 28 5c 6e 22 0a 20 20 20 20 20 20 22 20  lar(\n".      " 
296c0 20 6e 61 6d 65 20 54 45 58 54 20 50 52 49 4d 41   name TEXT PRIMA
296d0 52 59 20 4b 45 59 2c 20 20 2d 2d 20 6e 61 6d 65  RY KEY,  -- name
296e0 20 6f 66 20 74 68 65 20 66 69 6c 65 5c 6e 22 0a   of the file\n".
296f0 20 20 20 20 20 20 22 20 20 6d 6f 64 65 20 49 4e        "  mode IN
29700 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T,              
29710 20 2d 2d 20 61 63 63 65 73 73 20 70 65 72 6d 69   -- access permi
29720 73 73 69 6f 6e 73 5c 6e 22 0a 20 20 20 20 20 20  ssions\n".      
29730 22 20 20 6d 74 69 6d 65 20 49 4e 54 2c 20 20 20  "  mtime INT,   
29740 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 6c 61             -- la
29750 73 74 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  st modification 
29760 74 69 6d 65 5c 6e 22 0a 20 20 20 20 20 20 22 20  time\n".      " 
29770 20 73 7a 20 49 4e 54 2c 20 20 20 20 20 20 20 20   sz INT,        
29780 20 20 20 20 20 20 20 20 20 2d 2d 20 6f 72 69 67           -- orig
29790 69 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 5c 6e  inal file size\n
297a0 22 0a 20 20 20 20 20 20 22 20 20 64 61 74 61 20  ".      "  data 
297b0 42 4c 4f 42 20 20 20 20 20 20 20 20 20 20 20 20  BLOB            
297c0 20 20 20 2d 2d 20 63 6f 6d 70 72 65 73 73 65 64     -- compressed
297d0 20 63 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 20 20   content\n".    
297e0 20 20 22 29 22 3b 0a 20 20 63 6f 6e 73 74 20 63    ")";.  const c
297f0 68 61 72 20 2a 7a 44 72 6f 70 20 3d 20 22 44 52  har *zDrop = "DR
29800 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
29810 54 53 20 73 71 6c 61 72 22 3b 0a 20 20 63 6f 6e  TS sqlar";.  con
29820 73 74 20 63 68 61 72 20 2a 7a 49 6e 73 65 72 74  st char *zInsert
29830 46 6d 74 5b 32 5d 20 3d 20 7b 0a 20 20 20 20 20  Fmt[2] = {.     
29840 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 73  "REPLACE INTO %s
29850 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65  (name,mode,mtime
29860 2c 73 7a 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20  ,sz,data)\n".   
29870 20 20 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20    "  SELECT\n". 
29880 20 20 20 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a      "    %s,\n".
29890 20 20 20 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c       "    mode,\
298a0 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d 74 69  n".     "    mti
298b0 6d 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  me,\n".     "   
298c0 20 43 41 53 45 20 73 75 62 73 74 72 28 6c 73 6d   CASE substr(lsm
298d0 6f 64 65 28 6d 6f 64 65 29 2c 31 2c 31 29 5c 6e  ode(mode),1,1)\n
298e0 22 0a 20 20 20 20 20 22 20 20 20 20 20 20 57 48  ".     "      WH
298f0 45 4e 20 27 2d 27 20 54 48 45 4e 20 6c 65 6e 67  EN '-' THEN leng
29900 74 68 28 64 61 74 61 29 5c 6e 22 0a 20 20 20 20  th(data)\n".    
29910 20 22 20 20 20 20 20 20 57 48 45 4e 20 27 64 27   "      WHEN 'd'
29920 20 54 48 45 4e 20 30 5c 6e 22 0a 20 20 20 20 20   THEN 0\n".     
29930 22 20 20 20 20 20 20 45 4c 53 45 20 2d 31 20 45  "      ELSE -1 E
29940 4e 44 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  ND,\n".     "   
29950 20 73 71 6c 61 72 5f 63 6f 6d 70 72 65 73 73 28   sqlar_compress(
29960 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20  data)\n".     " 
29970 20 46 52 4f 4d 20 66 73 64 69 72 28 25 51 2c 25   FROM fsdir(%Q,%
29980 51 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 57 48  Q)\n".     "  WH
29990 45 52 45 20 6c 73 6d 6f 64 65 28 6d 6f 64 65 29  ERE lsmode(mode)
299a0 20 4e 4f 54 20 4c 49 4b 45 20 27 3f 25 25 27 3b   NOT LIKE '?%%';
299b0 22 2c 0a 20 20 20 20 20 22 52 45 50 4c 41 43 45  ",.     "REPLACE
299c0 20 49 4e 54 4f 20 25 73 28 6e 61 6d 65 2c 6d 6f   INTO %s(name,mo
299d0 64 65 2c 6d 74 69 6d 65 2c 64 61 74 61 29 5c 6e  de,mtime,data)\n
299e0 22 0a 20 20 20 20 20 22 20 20 53 45 4c 45 43 54  ".     "  SELECT
299f0 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 25 73  \n".     "    %s
29a00 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d  ,\n".     "    m
29a10 6f 64 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20  ode,\n".     "  
29a20 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a 20 20 20 20    mtime,\n".    
29a30 20 22 20 20 20 20 64 61 74 61 5c 6e 22 0a 20 20   "    data\n".  
29a40 20 20 20 22 20 20 46 52 4f 4d 20 66 73 64 69 72     "  FROM fsdir
29a50 28 25 51 2c 25 51 29 5c 6e 22 0a 20 20 20 20 20  (%Q,%Q)\n".     
29a60 22 20 20 57 48 45 52 45 20 6c 73 6d 6f 64 65 28  "  WHERE lsmode(
29a70 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20 27  mode) NOT LIKE '
29a80 3f 25 25 27 3b 22 0a 20 20 7d 3b 0a 20 20 69 6e  ?%%';".  };.  in
29a90 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
29aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29ab0 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   For iterating t
29ac0 68 72 6f 75 67 68 20 61 7a 46 69 6c 65 5b 5d 20  hrough azFile[] 
29ad0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29af0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
29b00 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ode */.  const c
29b10 68 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20  har *zTab = 0;  
29b20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
29b30 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68  table into which
29b40 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20   to insert */.  
29b50 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68  char *zSql;.  ch
29b60 61 72 20 7a 54 65 6d 70 5b 35 30 5d 3b 0a 0a 20  ar zTemp[50];.. 
29b70 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
29b80 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a  "PRAGMA page_siz
29b90 65 3d 35 31 32 22 29 3b 0a 20 20 72 63 20 3d 20  e=512");.  rc = 
29ba0 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22  arExecSql(pAr, "
29bb0 53 41 56 45 50 4f 49 4e 54 20 61 72 3b 22 29 3b  SAVEPOINT ar;");
29bc0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
29bd0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
29be0 3b 0a 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30  ;.  zTemp[0] = 0
29bf0 3b 20 0a 20 20 69 66 28 20 70 41 72 2d 3e 62 5a  ; .  if( pAr->bZ
29c00 69 70 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69  ip ){.    /* Ini
29c10 74 69 61 6c 69 7a 65 20 74 68 65 20 7a 69 70 66  tialize the zipf
29c20 69 6c 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ile virtual tabl
29c30 65 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  e, if necessary 
29c40 2a 2f 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e  */.    if( pAr->
29c50 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 73  zFile ){.      s
29c60 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72 3b  qlite3_uint64 r;
29c70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
29c80 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
29c90 28 72 29 2c 26 72 29 3b 0a 20 20 20 20 20 20 73  (r),&r);.      s
29ca0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
29cb0 73 69 7a 65 6f 66 28 7a 54 65 6d 70 29 2c 7a 54  sizeof(zTemp),zT
29cc0 65 6d 70 2c 22 7a 69 70 25 30 31 36 6c 6c 78 22  emp,"zip%016llx"
29cd0 2c 72 29 3b 0a 20 20 20 20 20 20 7a 54 61 62 20  ,r);.      zTab 
29ce0 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 7a  = zTemp;.      z
29cf0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
29d00 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
29d10 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20  "CREATE VIRTUAL 
29d20 54 41 42 4c 45 20 74 65 6d 70 2e 25 73 20 55 53  TABLE temp.%s US
29d30 49 4e 47 20 7a 69 70 66 69 6c 65 28 25 51 29 22  ING zipfile(%Q)"
29d40 2c 0a 20 20 20 20 20 20 20 20 20 7a 54 61 62 2c  ,.         zTab,
29d50 20 70 41 72 2d 3e 7a 46 69 6c 65 0a 20 20 20 20   pAr->zFile.    
29d60 20 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20    );.      rc = 
29d70 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a  arExecSql(pAr, z
29d80 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sql);.      sqli
29d90 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
29da0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29db0 20 7a 54 61 62 20 3d 20 22 7a 69 70 22 3b 0a 20   zTab = "zip";. 
29dc0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
29dd0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
29de0 74 68 65 20 74 61 62 6c 65 20 66 6f 72 20 61 6e  the table for an
29df0 20 53 51 4c 41 52 20 2a 2f 0a 20 20 20 20 7a 54   SQLAR */.    zT
29e00 61 62 20 3d 20 22 73 71 6c 61 72 22 3b 0a 20 20  ab = "sqlar";.  
29e10 20 20 69 66 28 20 62 55 70 64 61 74 65 3d 3d 30    if( bUpdate==0
29e20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
29e30 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 44  rExecSql(pAr, zD
29e40 72 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rop);.      if( 
29e50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
29e60 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 74 72 61 6e  goto end_ar_tran
29e70 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20  saction;.    }. 
29e80 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71     rc = arExecSq
29e90 6c 28 70 41 72 2c 20 7a 43 72 65 61 74 65 29 3b  l(pAr, zCreate);
29ea0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
29eb0 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72  i<pAr->nArg && r
29ec0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
29ed0 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  +){.    char *zS
29ee0 71 6c 32 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ql2 = sqlite3_mp
29ef0 72 69 6e 74 66 28 7a 49 6e 73 65 72 74 46 6d 74  rintf(zInsertFmt
29f00 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 7a 54 61  [pAr->bZip], zTa
29f10 62 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e  b,.        pAr->
29f20 62 56 65 72 62 6f 73 65 20 3f 20 22 73 68 65 6c  bVerbose ? "shel
29f30 6c 5f 70 75 74 73 6e 6c 28 6e 61 6d 65 29 22 20  l_putsnl(name)" 
29f40 3a 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20  : "name",.      
29f50 20 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 2c    pAr->azArg[i],
29f60 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20 20 20   pAr->zDir);.   
29f70 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28   rc = arExecSql(
29f80 70 41 72 2c 20 7a 53 71 6c 32 29 3b 0a 20 20 20  pAr, zSql2);.   
29f90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
29fa0 71 6c 32 29 3b 0a 20 20 7d 0a 65 6e 64 5f 61 72  ql2);.  }.end_ar
29fb0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20 20  _transaction:.  
29fc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29fd0 4b 20 29 7b 0a 20 20 20 20 61 72 45 78 65 63 53  K ){.    arExecS
29fe0 71 6c 28 70 41 72 2c 20 22 52 4f 4c 4c 42 41 43  ql(pAr, "ROLLBAC
29ff0 4b 20 54 4f 20 61 72 3b 20 52 45 4c 45 41 53 45  K TO ar; RELEASE
2a000 20 61 72 3b 22 29 3b 0a 20 20 7d 65 6c 73 65 7b   ar;");.  }else{
2a010 0a 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63  .    rc = arExec
2a020 53 71 6c 28 70 41 72 2c 20 22 52 45 4c 45 41 53  Sql(pAr, "RELEAS
2a030 45 20 61 72 3b 22 29 3b 0a 20 20 20 20 69 66 28  E ar;");.    if(
2a040 20 70 41 72 2d 3e 62 5a 69 70 20 26 26 20 70 41   pAr->bZip && pA
2a050 72 2d 3e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20  r->zFile ){.    
2a060 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2a070 5f 6d 70 72 69 6e 74 66 28 22 44 52 4f 50 20 54  _mprintf("DROP T
2a080 41 42 4c 45 20 25 73 22 2c 20 7a 54 65 6d 70 29  ABLE %s", zTemp)
2a090 3b 0a 20 20 20 20 20 20 61 72 45 78 65 63 53 71  ;.      arExecSq
2a0a0 6c 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a 20 20  l(pAr, zSql);.  
2a0b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2a0c0 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (zSql);.    }.  
2a0d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2a0e0 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
2a0f0 74 61 74 69 6f 6e 20 6f 66 20 22 2e 61 72 22 20  tation of ".ar" 
2a100 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  dot command..*/.
2a110 73 74 61 74 69 63 20 69 6e 74 20 61 72 44 6f 74  static int arDot
2a120 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c  Command(.  Shell
2a130 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20  State *pState,  
2a140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2a150 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c  rrent shell tool
2a160 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20   state */.  int 
2a170 66 72 6f 6d 43 6d 64 4c 69 6e 65 2c 20 20 20 20  fromCmdLine,    
2a180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a190 72 75 65 20 69 66 20 2d 41 20 63 6f 6d 6d 61 6e  rue if -A comman
2a1a0 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2c 20 6e  d-line option, n
2a1b0 6f 74 20 2e 61 72 20 63 6d 64 20 2a 2f 0a 20 20  ot .ar cmd */.  
2a1c0 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20  char **azArg,   
2a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1e0 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75  /* Array of argu
2a1f0 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
2a200 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  dot command */. 
2a210 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20   int nArg       
2a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a230 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
2a240 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d  tries in azArg[]
2a250 20 2a 2f 0a 29 7b 0a 20 20 41 72 43 6f 6d 6d 61   */.){.  ArComma
2a260 6e 64 20 63 6d 64 3b 0a 20 20 69 6e 74 20 72 63  nd cmd;.  int rc
2a270 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6d 64 2c  ;.  memset(&cmd,
2a280 20 30 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 29   0, sizeof(cmd))
2a290 3b 0a 20 20 63 6d 64 2e 66 72 6f 6d 43 6d 64 4c  ;.  cmd.fromCmdL
2a2a0 69 6e 65 20 3d 20 66 72 6f 6d 43 6d 64 4c 69 6e  ine = fromCmdLin
2a2b0 65 3b 0a 20 20 72 63 20 3d 20 61 72 50 61 72 73  e;.  rc = arPars
2a2c0 65 43 6f 6d 6d 61 6e 64 28 61 7a 41 72 67 2c 20  eCommand(azArg, 
2a2d0 6e 41 72 67 2c 20 26 63 6d 64 29 3b 0a 20 20 69  nArg, &cmd);.  i
2a2e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a2f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 44 62 54   ){.    int eDbT
2a300 79 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e  ype = SHELL_OPEN
2a310 5f 55 4e 53 50 45 43 3b 0a 20 20 20 20 63 6d 64  _UNSPEC;.    cmd
2a320 2e 70 20 3d 20 70 53 74 61 74 65 3b 0a 20 20 20  .p = pState;.   
2a330 20 63 6d 64 2e 64 62 20 3d 20 70 53 74 61 74 65   cmd.db = pState
2a340 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 63 6d  ->db;.    if( cm
2a350 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  d.zFile ){.     
2a360 20 65 44 62 54 79 70 65 20 3d 20 64 65 64 75 63   eDbType = deduc
2a370 65 44 61 74 61 62 61 73 65 54 79 70 65 28 63 6d  eDatabaseType(cm
2a380 64 2e 7a 46 69 6c 65 2c 20 31 29 3b 0a 20 20 20  d.zFile, 1);.   
2a390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 44   }else{.      eD
2a3a0 62 54 79 70 65 20 3d 20 70 53 74 61 74 65 2d 3e  bType = pState->
2a3b0 6f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 7d 0a  openMode;.    }.
2a3c0 20 20 20 20 69 66 28 20 65 44 62 54 79 70 65 3d      if( eDbType=
2a3d0 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46  =SHELL_OPEN_ZIPF
2a3e0 49 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ILE ){.      if(
2a3f0 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d   cmd.eCmd==AR_CM
2a400 44 5f 45 58 54 52 41 43 54 20 7c 7c 20 63 6d 64  D_EXTRACT || cmd
2a410 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 4c 49  .eCmd==AR_CMD_LI
2a420 53 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ST ){.        if
2a430 28 20 63 6d 64 2e 7a 46 69 6c 65 3d 3d 30 20 29  ( cmd.zFile==0 )
2a440 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e  {.          cmd.
2a450 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69  zSrcTable = sqli
2a460 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70  te3_mprintf("zip
2a470 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ");.        }els
2a480 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64  e{.          cmd
2a490 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c  .zSrcTable = sql
2a4a0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69  ite3_mprintf("zi
2a4b0 70 66 69 6c 65 28 25 51 29 22 2c 20 63 6d 64 2e  pfile(%Q)", cmd.
2a4c0 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  zFile);.        
2a4d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2a4e0 63 6d 64 2e 62 5a 69 70 20 3d 20 31 3b 0a 20 20  cmd.bZip = 1;.  
2a4f0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6d 64 2e    }else if( cmd.
2a500 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  zFile ){.      i
2a510 6e 74 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20  nt flags;.      
2a520 69 66 28 20 63 6d 64 2e 62 41 70 70 65 6e 64 20  if( cmd.bAppend 
2a530 29 20 65 44 62 54 79 70 65 20 3d 20 53 48 45 4c  ) eDbType = SHEL
2a540 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53  L_OPEN_APPENDVFS
2a550 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e  ;.      if( cmd.
2a560 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43 52 45  eCmd==AR_CMD_CRE
2a570 41 54 45 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d  ATE || cmd.eCmd=
2a580 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 29  =AR_CMD_UPDATE )
2a590 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
2a5a0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
2a5b0 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
2a5c0 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20  PEN_CREATE;.    
2a5d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a5e0 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
2a5f0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
2a600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d 64       }.      cmd
2a610 2e 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  .db = 0;.      i
2a620 66 28 20 63 6d 64 2e 62 44 72 79 52 75 6e 20 29  f( cmd.bDryRun )
2a630 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2a640 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75  rintf(pState->ou
2a650 74 2c 20 22 2d 2d 20 6f 70 65 6e 20 64 61 74 61  t, "-- open data
2a660 62 61 73 65 20 27 25 73 27 25 73 5c 6e 22 2c 20  base '%s'%s\n", 
2a670 63 6d 64 2e 7a 46 69 6c 65 2c 0a 20 20 20 20 20  cmd.zFile,.     
2a680 20 20 20 20 20 20 20 20 65 44 62 54 79 70 65 3d          eDbType=
2a690 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45  =SHELL_OPEN_APPE
2a6a0 4e 44 56 46 53 20 3f 20 22 20 75 73 69 6e 67 20  NDVFS ? " using 
2a6b0 27 61 70 6e 64 76 66 73 27 22 20 3a 20 22 22 29  'apndvfs'" : "")
2a6c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a6d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
2a6e0 6e 5f 76 32 28 63 6d 64 2e 7a 46 69 6c 65 2c 20  n_v2(cmd.zFile, 
2a6f0 26 63 6d 64 2e 64 62 2c 20 66 6c 61 67 73 2c 20  &cmd.db, flags, 
2a700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 65 44  .             eD
2a710 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45  bType==SHELL_OPE
2a720 4e 5f 41 50 50 45 4e 44 56 46 53 20 3f 20 22 61  N_APPENDVFS ? "a
2a730 70 6e 64 76 66 73 22 20 3a 20 30 29 3b 0a 20 20  pndvfs" : 0);.  
2a740 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a750 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2a760 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2a770 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65  err, "cannot ope
2a780 6e 20 66 69 6c 65 3a 20 25 73 20 28 25 73 29 5c  n file: %s (%s)\
2a790 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  n", .           
2a7a0 20 63 6d 64 2e 7a 46 69 6c 65 2c 20 73 71 6c 69   cmd.zFile, sqli
2a7b0 74 65 33 5f 65 72 72 6d 73 67 28 63 6d 64 2e 64  te3_errmsg(cmd.d
2a7c0 62 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  b).        );.  
2a7d0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2a7e0 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20 20 20 20  r_command;.     
2a7f0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2a800 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28 63 6d 64  _fileio_init(cmd
2a810 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  .db, 0, 0);.    
2a820 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61 72 5f    sqlite3_sqlar_
2a830 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20 30 2c 20  init(cmd.db, 0, 
2a840 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
2a850 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
2a860 6e 28 63 6d 64 2e 64 62 2c 20 22 73 68 65 6c 6c  n(cmd.db, "shell
2a870 5f 70 75 74 73 6e 6c 22 2c 20 31 2c 20 53 51 4c  _putsnl", 1, SQL
2a880 49 54 45 5f 55 54 46 38 2c 20 63 6d 64 2e 70 2c  ITE_UTF8, cmd.p,
2a890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2a8b0 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c 20 30 2c  hellPutsFunc, 0,
2a8c0 20 30 29 3b 0a 0a 20 20 20 20 7d 0a 20 20 20 20   0);..    }.    
2a8d0 69 66 28 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c  if( cmd.zSrcTabl
2a8e0 65 3d 3d 30 20 26 26 20 63 6d 64 2e 62 5a 69 70  e==0 && cmd.bZip
2a8f0 3d 3d 30 20 26 26 20 63 6d 64 2e 65 43 6d 64 21  ==0 && cmd.eCmd!
2a900 3d 41 52 5f 43 4d 44 5f 48 45 4c 50 20 29 7b 0a  =AR_CMD_HELP ){.
2a910 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65 43        if( cmd.eC
2a920 6d 64 21 3d 41 52 5f 43 4d 44 5f 43 52 45 41 54  md!=AR_CMD_CREAT
2a930 45 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  E.       && sqli
2a940 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
2a950 5f 6d 65 74 61 64 61 74 61 28 63 6d 64 2e 64 62  _metadata(cmd.db
2a960 2c 30 2c 22 73 71 6c 61 72 22 2c 22 6e 61 6d 65  ,0,"sqlar","name
2a970 22 2c 30 2c 30 2c 30 2c 30 2c 30 29 0a 20 20 20  ",0,0,0,0,0).   
2a980 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74     ){.        ut
2a990 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2a9a0 2c 20 22 64 61 74 61 62 61 73 65 20 64 6f 65 73  , "database does
2a9b0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20   not contain an 
2a9c0 27 73 71 6c 61 72 27 20 74 61 62 6c 65 5c 6e 22  'sqlar' table\n"
2a9d0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2a9e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2a9f0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2aa00 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20 20 20 20  r_command;.     
2aa10 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e 7a 53 72   }.      cmd.zSr
2aa20 63 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  cTable = sqlite3
2aa30 5f 6d 70 72 69 6e 74 66 28 22 73 71 6c 61 72 22  _mprintf("sqlar"
2aa40 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77  );.    }..    sw
2aa50 69 74 63 68 28 20 63 6d 64 2e 65 43 6d 64 20 29  itch( cmd.eCmd )
2aa60 7b 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f  {.      case AR_
2aa70 43 4d 44 5f 43 52 45 41 54 45 3a 0a 20 20 20 20  CMD_CREATE:.    
2aa80 20 20 20 20 72 63 20 3d 20 61 72 43 72 65 61 74      rc = arCreat
2aa90 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64  eOrUpdateCommand
2aaa0 28 26 63 6d 64 2c 20 30 29 3b 0a 20 20 20 20 20  (&cmd, 0);.     
2aab0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
2aac0 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 45 58 54   case AR_CMD_EXT
2aad0 52 41 43 54 3a 0a 20 20 20 20 20 20 20 20 72 63  RACT:.        rc
2aae0 20 3d 20 61 72 45 78 74 72 61 63 74 43 6f 6d 6d   = arExtractComm
2aaf0 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20 20 20 20  and(&cmd);.     
2ab00 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
2ab10 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c 49 53   case AR_CMD_LIS
2ab20 54 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  T:.        rc = 
2ab30 61 72 4c 69 73 74 43 6f 6d 6d 61 6e 64 28 26 63  arListCommand(&c
2ab40 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  md);.        bre
2ab50 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
2ab60 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20 20  AR_CMD_HELP:.   
2ab70 20 20 20 20 20 61 72 55 73 61 67 65 28 70 53 74       arUsage(pSt
2ab80 61 74 65 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 20  ate->out);.     
2ab90 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
2aba0 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
2abb0 20 20 61 73 73 65 72 74 28 20 63 6d 64 2e 65 43    assert( cmd.eC
2abc0 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54  md==AR_CMD_UPDAT
2abd0 45 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  E );.        rc 
2abe0 3d 20 61 72 43 72 65 61 74 65 4f 72 55 70 64 61  = arCreateOrUpda
2abf0 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c 20  teCommand(&cmd, 
2ac00 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
2ac10 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65 6e 64  k;.    }.  }.end
2ac20 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3a 0a 20 20 69  _ar_command:.  i
2ac30 66 28 20 63 6d 64 2e 64 62 21 3d 70 53 74 61 74  f( cmd.db!=pStat
2ac40 65 2d 3e 64 62 20 29 7b 0a 20 20 20 20 63 6c 6f  e->db ){.    clo
2ac50 73 65 5f 64 62 28 63 6d 64 2e 64 62 29 3b 0a 20  se_db(cmd.db);. 
2ac60 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
2ac70 65 28 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 29  e(cmd.zSrcTable)
2ac80 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
2ac90 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  }./* End of the 
2aca0 22 2e 61 72 63 68 69 76 65 22 20 6f 72 20 22 2e  ".archive" or ".
2acb0 61 72 22 20 63 6f 6d 6d 61 6e 64 20 6c 6f 67 69  ar" command logi
2acc0 63 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c.**************
2acd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ace0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2acf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ad00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ad10 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  ****/.#endif /* 
2ad20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2ad30 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2ad40 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
2ad50 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 20  LITE_HAVE_ZLIB) 
2ad60 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  */.../*.** If an
2ad70 20 69 6e 70 75 74 20 6c 69 6e 65 20 62 65 67 69   input line begi
2ad80 6e 73 20 77 69 74 68 20 22 2e 22 20 74 68 65 6e  ns with "." then
2ad90 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75   invoke this rou
2ada0 74 69 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65  tine to.** proce
2adb0 73 73 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a  ss that line..**
2adc0 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20  .** Return 1 on 
2add0 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74  error, 2 to exit
2ade0 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73  , and 0 otherwis
2adf0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2ae00 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64   do_meta_command
2ae10 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 53 68  (char *zLine, Sh
2ae20 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
2ae30 69 6e 74 20 68 20 3d 20 31 3b 0a 20 20 69 6e 74  int h = 1;.  int
2ae40 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e 74   nArg = 0;.  int
2ae50 20 6e 2c 20 63 3b 0a 20 20 69 6e 74 20 72 63 20   n, c;.  int rc 
2ae60 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 61 7a 41  = 0;.  char *azA
2ae70 72 67 5b 35 30 5d 3b 0a 0a 23 69 66 6e 64 65 66  rg[50];..#ifndef
2ae80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2ae90 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
2aea0 70 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  p->expert.pExper
2aeb0 74 20 29 7b 0a 20 20 20 20 65 78 70 65 72 74 46  t ){.    expertF
2aec0 69 6e 69 73 68 28 70 2c 20 31 2c 20 30 29 3b 0a  inish(p, 1, 0);.
2aed0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2aee0 20 50 61 72 73 65 20 74 68 65 20 69 6e 70 75 74   Parse the input
2aef0 20 6c 69 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e   line into token
2af00 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  s..  */.  while(
2af10 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 6e 41 72   zLine[h] && nAr
2af20 67 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 41 72  g<ArraySize(azAr
2af30 67 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  g) ){.    while(
2af40 20 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68   IsSpace(zLine[h
2af50 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ h++; }.   
2af60 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 30   if( zLine[h]==0
2af70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
2af80 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 27 27  ( zLine[h]=='\''
2af90 20 7c 7c 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 22   || zLine[h]=='"
2afa0 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  ' ){.      int d
2afb0 65 6c 69 6d 20 3d 20 7a 4c 69 6e 65 5b 68 2b 2b  elim = zLine[h++
2afc0 5d 3b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e  ];.      azArg[n
2afd0 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b  Arg++] = &zLine[
2afe0 68 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  h];.      while(
2aff0 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 7a 4c 69   zLine[h] && zLi
2b000 6e 65 5b 68 5d 21 3d 64 65 6c 69 6d 20 29 7b 0a  ne[h]!=delim ){.
2b010 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e          if( zLin
2b020 65 5b 68 5d 3d 3d 27 5c 5c 27 20 26 26 20 64 65  e[h]=='\\' && de
2b030 6c 69 6d 3d 3d 27 22 27 20 26 26 20 7a 4c 69 6e  lim=='"' && zLin
2b040 65 5b 68 2b 31 5d 21 3d 30 20 29 20 68 2b 2b 3b  e[h+1]!=0 ) h++;
2b050 0a 20 20 20 20 20 20 20 20 68 2b 2b 3b 0a 20 20  .        h++;.  
2b060 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2b070 7a 4c 69 6e 65 5b 68 5d 3d 3d 64 65 6c 69 6d 20  zLine[h]==delim 
2b080 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65  ){.        zLine
2b090 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  [h++] = 0;.     
2b0a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c   }.      if( del
2b0b0 69 6d 3d 3d 27 22 27 20 29 20 72 65 73 6f 6c 76  im=='"' ) resolv
2b0c0 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a  e_backslashes(az
2b0d0 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20  Arg[nArg-1]);.  
2b0e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2b0f0 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26  zArg[nArg++] = &
2b100 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20  zLine[h];.      
2b110 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20  while( zLine[h] 
2b120 26 26 20 21 49 73 53 70 61 63 65 28 7a 4c 69 6e  && !IsSpace(zLin
2b130 65 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a  e[h]) ){ h++; }.
2b140 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b        if( zLine[
2b150 68 5d 20 29 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20  h] ) zLine[h++] 
2b160 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 73 6f 6c  = 0;.      resol
2b170 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61  ve_backslashes(a
2b180 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20  zArg[nArg-1]);. 
2b190 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
2b1a0 72 6f 63 65 73 73 20 74 68 65 20 69 6e 70 75 74  rocess the input
2b1b0 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   line..  */.  if
2b1c0 28 20 6e 41 72 67 3d 3d 30 20 29 20 72 65 74 75  ( nArg==0 ) retu
2b1d0 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 74 6f 6b 65  rn 0; /* no toke
2b1e0 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a  ns, no error */.
2b1f0 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61    n = strlen30(a
2b200 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20  zArg[0]);.  c = 
2b210 61 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20 63  azArg[0][0];.  c
2b220 6c 65 61 72 54 65 6d 70 46 69 6c 65 28 70 29 3b  learTempFile(p);
2b230 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2b240 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
2b250 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 61 27  ION.  if( c=='a'
2b260 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2b270 67 5b 30 5d 2c 20 22 61 75 74 68 22 2c 20 6e 29  g[0], "auth", n)
2b280 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
2b290 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg!=2 ){.      
2b2a0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2b2b0 72 2c 20 22 55 73 61 67 65 3a 20 2e 61 75 74 68  r, "Usage: .auth
2b2c0 20 4f 4e 7c 4f 46 46 5c 6e 22 29 3b 0a 20 20 20   ON|OFF\n");.   
2b2d0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2b2e0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2b2f0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
2b300 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
2b310 3b 0a 20 20 20 20 69 66 28 20 62 6f 6f 6c 65 61  ;.    if( boolea
2b320 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
2b330 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2b340 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
2b350 28 70 2d 3e 64 62 2c 20 73 68 65 6c 6c 41 75 74  (p->db, shellAut
2b360 68 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  h, p);.    }else
2b370 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2b380 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70  set_authorizer(p
2b390 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
2b3a0 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
2b3b0 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
2b3c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2b3d0 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
2b3e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45  ined(SQLITE_HAVE
2b3f0 5f 5a 4c 49 42 29 0a 20 20 69 66 28 20 63 3d 3d  _ZLIB).  if( c==
2b400 27 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'a' && strncmp(a
2b410 7a 41 72 67 5b 30 5d 2c 20 22 61 72 63 68 69 76  zArg[0], "archiv
2b420 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
2b430 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
2b440 20 20 20 20 72 63 20 3d 20 61 72 44 6f 74 43 6f      rc = arDotCo
2b450 6d 6d 61 6e 64 28 70 2c 20 30 2c 20 61 7a 41 72  mmand(p, 0, azAr
2b460 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73  g, nArg);.  }els
2b470 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  e.#endif..  if( 
2b480 28 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20  (c=='b' && n>=3 
2b490 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2b4a0 5b 30 5d 2c 20 22 62 61 63 6b 75 70 22 2c 20 6e  [0], "backup", n
2b4b0 29 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 63 3d 3d  )==0).   || (c==
2b4c0 27 73 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  's' && n>=3 && s
2b4d0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2b4e0 20 22 73 61 76 65 22 2c 20 6e 29 3d 3d 30 29 0a   "save", n)==0).
2b4f0 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63    ){.    const c
2b500 68 61 72 20 2a 7a 44 65 73 74 46 69 6c 65 20 3d  har *zDestFile =
2b510 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
2b520 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 20  ar *zDb = 0;.   
2b530 20 73 71 6c 69 74 65 33 20 2a 70 44 65 73 74 3b   sqlite3 *pDest;
2b540 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
2b550 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20  kup *pBackup;.  
2b560 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 63 6f 6e    int j;.    con
2b570 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20  st char *zVfs = 
2b580 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20  0;.    for(j=1; 
2b590 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b 0a 20 20  j<nArg; j++){.  
2b5a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2b5b0 7a 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20  z = azArg[j];.  
2b5c0 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
2b5d0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
2b5e0 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b   z[1]=='-' ) z++
2b5f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  ;.        if( st
2b600 72 63 6d 70 28 7a 2c 20 22 2d 61 70 70 65 6e 64  rcmp(z, "-append
2b610 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
2b620 20 20 20 7a 56 66 73 20 3d 20 22 61 70 6e 64 76     zVfs = "apndv
2b630 66 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  fs";.        }el
2b640 73 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  se.        {.   
2b650 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2b660 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e  tf(stderr, "unkn
2b670 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e  own option: %s\n
2b680 22 2c 20 61 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20  ", azArg[j]);.  
2b690 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
2b6a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b6b0 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 65 73    }else if( zDes
2b6c0 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  tFile==0 ){.    
2b6d0 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20      zDestFile = 
2b6e0 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20  azArg[j];.      
2b6f0 7d 65 6c 73 65 20 69 66 28 20 7a 44 62 3d 3d 30  }else if( zDb==0
2b700 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 62 20   ){.        zDb 
2b710 3d 20 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20 20  = zDestFile;.   
2b720 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d       zDestFile =
2b730 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20   azArg[j];.     
2b740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b750 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2b760 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 61 63 6b  r, "Usage: .back
2b770 75 70 20 3f 44 42 3f 20 3f 2d 2d 61 70 70 65 6e  up ?DB? ?--appen
2b780 64 3f 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b  d? FILENAME\n");
2b790 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2b7a0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
2b7b0 0a 20 20 20 20 69 66 28 20 7a 44 65 73 74 46 69  .    if( zDestFi
2b7c0 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  le==0 ){.      r
2b7d0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2b7e0 2c 20 22 6d 69 73 73 69 6e 67 20 46 49 4c 45 4e  , "missing FILEN
2b7f0 41 4d 45 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20  AME argument on 
2b800 2e 62 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20 20  .backup\n");.   
2b810 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2b820 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d   }.    if( zDb==
2b830 30 20 29 20 7a 44 62 20 3d 20 22 6d 61 69 6e 22  0 ) zDb = "main"
2b840 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2b850 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 44 65 73 74  e3_open_v2(zDest
2b860 46 69 6c 65 2c 20 26 70 44 65 73 74 2c 20 0a 20  File, &pDest, . 
2b870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b880 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2b890 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
2b8a0 45 4e 5f 43 52 45 41 54 45 2c 20 7a 56 66 73 29  EN_CREATE, zVfs)
2b8b0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2b8c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b8d0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2b8e0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
2b8f0 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
2b900 6e 22 2c 20 7a 44 65 73 74 46 69 6c 65 29 3b 0a  n", zDestFile);.
2b910 20 20 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70        close_db(p
2b920 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Dest);.      ret
2b930 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2b940 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
2b950 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71      pBackup = sq
2b960 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69  lite3_backup_ini
2b970 74 28 70 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c  t(pDest, "main",
2b980 20 70 2d 3e 64 62 2c 20 7a 44 62 29 3b 0a 20 20   p->db, zDb);.  
2b990 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30    if( pBackup==0
2b9a0 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
2b9b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2b9c0 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
2b9d0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73  ite3_errmsg(pDes
2b9e0 74 29 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  t));.      close
2b9f0 5f 64 62 28 70 44 65 73 74 29 3b 0a 20 20 20 20  _db(pDest);.    
2ba00 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2ba10 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28 72  }.    while(  (r
2ba20 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  c = sqlite3_back
2ba30 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c  up_step(pBackup,
2ba40 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  100))==SQLITE_OK
2ba50 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33   ){}.    sqlite3
2ba60 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70  _backup_finish(p
2ba70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28  Backup);.    if(
2ba80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
2ba90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30   ){.      rc = 0
2baa0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2bab0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2bac0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
2bad0 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
2bae0 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20  rmsg(pDest));.  
2baf0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2bb00 7d 0a 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70  }.    close_db(p
2bb10 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  Dest);.  }else..
2bb20 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20    if( c=='b' && 
2bb30 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
2bb40 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 69 6c 22  azArg[0], "bail"
2bb50 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
2bb60 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
2bb70 20 20 20 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f      bail_on_erro
2bb80 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  r = booleanValue
2bb90 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20  (azArg[1]);.    
2bba0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
2bbb0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2bbc0 22 55 73 61 67 65 3a 20 2e 62 61 69 6c 20 6f 6e  "Usage: .bail on
2bbd0 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |off\n");.      
2bbe0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
2bbf0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2bc00 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'b' && n>=3 && s
2bc10 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2bc20 20 22 62 69 6e 61 72 79 22 2c 20 6e 29 3d 3d 30   "binary", n)==0
2bc30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
2bc40 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
2bc50 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
2bc60 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20  Arg[1]) ){.     
2bc70 20 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65     setBinaryMode
2bc80 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20  (p->out, 1);.   
2bc90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bca0 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 70 2d    setTextMode(p-
2bcb0 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  >out, 1);.      
2bcc0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2bcd0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2bce0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62  derr, "Usage: .b
2bcf0 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 5c 6e 22 29  inary on|off\n")
2bd00 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2bd10 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2bd20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 73   if( c=='c' && s
2bd30 74 72 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22  trcmp(azArg[0],"
2bd40 63 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  cd")==0 ){.    i
2bd50 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 23 69  f( nArg==2 ){.#i
2bd60 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
2bd70 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
2bd80 33 32 29 0a 20 20 20 20 20 20 77 63 68 61 72 5f  32).      wchar_
2bd90 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 77  t *z = sqlite3_w
2bda0 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69  in32_utf8_to_uni
2bdb0 63 6f 64 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  code(azArg[1]);.
2bdc0 20 20 20 20 20 20 72 63 20 3d 20 21 53 65 74 43        rc = !SetC
2bdd0 75 72 72 65 6e 74 44 69 72 65 63 74 6f 72 79 57  urrentDirectoryW
2bde0 28 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (z);.      sqlit
2bdf0 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73  e3_free(z);.#els
2be00 65 0a 20 20 20 20 20 20 72 63 20 3d 20 63 68 64  e.      rc = chd
2be10 69 72 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 65  ir(azArg[1]);.#e
2be20 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72  ndif.      if( r
2be30 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  c ){.        utf
2be40 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2be50 20 22 43 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20   "Cannot change 
2be60 74 6f 20 64 69 72 65 63 74 6f 72 79 20 5c 22 25  to directory \"%
2be70 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d  s\"\n", azArg[1]
2be80 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2be90 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
2bea0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
2beb0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2bec0 55 73 61 67 65 3a 20 2e 63 64 20 44 49 52 45 43  Usage: .cd DIREC
2bed0 54 4f 52 59 5c 6e 22 29 3b 0a 20 20 20 20 20 20  TORY\n");.      
2bee0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
2bef0 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20  }else..  /* The 
2bf00 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 22 2e 62  undocumented ".b
2bf10 72 65 61 6b 70 6f 69 6e 74 22 20 63 6f 6d 6d 61  reakpoint" comma
2bf20 6e 64 20 63 61 75 73 65 73 20 61 20 63 61 6c 6c  nd causes a call
2bf30 20 74 6f 20 74 68 65 20 6e 6f 2d 6f 70 0a 20 20   to the no-op.  
2bf40 2a 2a 20 72 6f 75 74 69 6e 65 20 6e 61 6d 65 64  ** routine named
2bf50 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74   test_breakpoint
2bf60 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ()..  */.  if( c
2bf70 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='b' && n>=3 &&
2bf80 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2bf90 5d 2c 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c  ], "breakpoint",
2bfa0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 65   n)==0 ){.    te
2bfb0 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b  st_breakpoint();
2bfc0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2bfd0 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20 26  c=='c' && n>=3 &
2bfe0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2bff0 30 5d 2c 20 22 63 68 61 6e 67 65 73 22 2c 20 6e  0], "changes", n
2c000 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
2c010 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
2c020 20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28   setOrClearFlag(
2c030 70 2c 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68  p, SHFLG_CountCh
2c040 61 6e 67 65 73 2c 20 61 7a 41 72 67 5b 31 5d 29  anges, azArg[1])
2c050 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2c060 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2c070 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63  derr, "Usage: .c
2c080 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 5c 6e 22  hanges on|off\n"
2c090 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2c0a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
2c0b0 20 20 2f 2a 20 43 61 6e 63 65 6c 20 6f 75 74 70    /* Cancel outp
2c0c0 75 74 20 72 65 64 69 72 65 63 74 69 6f 6e 2c 20  ut redirection, 
2c0d0 69 66 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  if it is current
2c0e0 6c 79 20 73 65 74 20 28 62 79 20 2e 74 65 73 74  ly set (by .test
2c0f0 63 61 73 65 29 0a 20 20 2a 2a 20 54 68 65 6e 20  case).  ** Then 
2c100 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  read the content
2c110 20 6f 66 20 74 68 65 20 74 65 73 74 63 61 73 65   of the testcase
2c120 2d 6f 75 74 2e 74 78 74 20 66 69 6c 65 20 61 6e  -out.txt file an
2c130 64 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  d compare agains
2c140 74 0a 20 20 2a 2a 20 61 7a 41 72 67 5b 31 5d 2e  t.  ** azArg[1].
2c150 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64    If there are d
2c160 69 66 66 65 72 65 6e 63 65 73 2c 20 72 65 70 6f  ifferences, repo
2c170 72 74 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 20  rt an error and 
2c180 65 78 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  exit..  */.  if(
2c190 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20   c=='c' && n>=3 
2c1a0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2c1b0 5b 30 5d 2c 20 22 63 68 65 63 6b 22 2c 20 6e 29  [0], "check", n)
2c1c0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
2c1d0 2a 7a 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 6f  *zRes = 0;.    o
2c1e0 75 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a  utput_reset(p);.
2c1f0 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20      if( nArg!=2 
2c200 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2c210 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2c220 67 65 3a 20 2e 63 68 65 63 6b 20 47 4c 4f 42 2d  ge: .check GLOB-
2c230 50 41 54 54 45 52 4e 5c 6e 22 29 3b 0a 20 20 20  PATTERN\n");.   
2c240 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d     rc = 2;.    }
2c250 65 6c 73 65 20 69 66 28 20 28 7a 52 65 73 20 3d  else if( (zRes =
2c260 20 72 65 61 64 46 69 6c 65 28 22 74 65 73 74 63   readFile("testc
2c270 61 73 65 2d 6f 75 74 2e 74 78 74 22 2c 20 30 29  ase-out.txt", 0)
2c280 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61  )==0 ){.      ra
2c290 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2c2a0 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
2c2b0 72 65 61 64 20 27 74 65 73 74 63 61 73 65 2d 6f  read 'testcase-o
2c2c0 75 74 2e 74 78 74 27 5c 6e 22 29 3b 0a 20 20 20  ut.txt'\n");.   
2c2d0 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d     rc = 2;.    }
2c2e0 65 6c 73 65 20 69 66 28 20 74 65 73 74 63 61 73  else if( testcas
2c2f0 65 5f 67 6c 6f 62 28 61 7a 41 72 67 5b 31 5d 2c  e_glob(azArg[1],
2c300 7a 52 65 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  zRes)==0 ){.    
2c310 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2c320 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20  derr,.          
2c330 20 20 20 20 20 20 20 22 74 65 73 74 63 61 73 65         "testcase
2c340 2d 25 73 20 46 41 49 4c 45 44 5c 6e 20 45 78 70  -%s FAILED\n Exp
2c350 65 63 74 65 64 3a 20 5b 25 73 5d 5c 6e 20 20 20  ected: [%s]\n   
2c360 20 20 20 47 6f 74 3a 20 5b 25 73 5d 5c 6e 22 2c     Got: [%s]\n",
2c370 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c380 20 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c 20    p->zTestcase, 
2c390 61 7a 41 72 67 5b 31 5d 2c 20 7a 52 65 73 29 3b  azArg[1], zRes);
2c3a0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2c3b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c3c0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f  utf8_printf(stdo
2c3d0 75 74 2c 20 22 74 65 73 74 63 61 73 65 2d 25 73  ut, "testcase-%s
2c3e0 20 6f 6b 5c 6e 22 2c 20 70 2d 3e 7a 54 65 73 74   ok\n", p->zTest
2c3f0 63 61 73 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  case);.      p->
2c400 6e 43 68 65 63 6b 2b 2b 3b 0a 20 20 20 20 7d 0a  nCheck++;.    }.
2c410 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2c420 28 7a 52 65 73 29 3b 0a 20 20 7d 65 6c 73 65 0a  (zRes);.  }else.
2c430 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26  .  if( c=='c' &&
2c440 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2c450 5d 2c 20 22 63 6c 6f 6e 65 22 2c 20 6e 29 3d 3d  ], "clone", n)==
2c460 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
2c470 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 74 72  g==2 ){.      tr
2c480 79 54 6f 43 6c 6f 6e 65 28 70 2c 20 61 7a 41 72  yToClone(p, azAr
2c490 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
2c4a0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2c4b0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2c4c0 65 3a 20 2e 63 6c 6f 6e 65 20 46 49 4c 45 4e 41  e: .clone FILENA
2c4d0 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ME\n");.      rc
2c4e0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
2c4f0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64  lse..  if( c=='d
2c500 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74 72 6e  ' && n>1 && strn
2c510 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64  cmp(azArg[0], "d
2c520 61 74 61 62 61 73 65 73 22 2c 20 6e 29 3d 3d 30  atabases", n)==0
2c530 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61   ){.    ShellSta
2c540 74 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61  te data;.    cha
2c550 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
2c560 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
2c570 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
2c580 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64  ata, p, sizeof(d
2c590 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e  ata));.    data.
2c5a0 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a  showHeader = 0;.
2c5b0 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
2c5c0 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
2c5d0 45 5f 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69  E_List;.    sqli
2c5e0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2c5f0 65 6f 66 28 64 61 74 61 2e 63 6f 6c 53 65 70 61  eof(data.colSepa
2c600 72 61 74 6f 72 29 2c 64 61 74 61 2e 63 6f 6c 53  rator),data.colS
2c610 65 70 61 72 61 74 6f 72 2c 22 3a 20 22 29 3b 0a  eparator,": ");.
2c620 20 20 20 20 64 61 74 61 2e 63 6e 74 20 3d 20 30      data.cnt = 0
2c630 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
2c640 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43  ec(p->db, "SELEC
2c650 54 20 6e 61 6d 65 2c 20 66 69 6c 65 20 46 52 4f  T name, file FRO
2c660 4d 20 70 72 61 67 6d 61 5f 64 61 74 61 62 61 73  M pragma_databas
2c670 65 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20 20 20  e_list",.       
2c680 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61            callba
2c690 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
2c6a0 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  Msg);.    if( zE
2c6b0 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 75  rrMsg ){.      u
2c6c0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2c6d0 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  r,"Error: %s\n",
2c6e0 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20   zErrMsg);.     
2c6f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
2c700 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63  rrMsg);.      rc
2c710 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
2c720 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64  lse..  if( c=='d
2c730 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
2c740 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2c750 64 62 63 6f 6e 66 69 67 22 2c 20 6e 29 3d 3d 30  dbconfig", n)==0
2c760 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
2c770 6f 6e 73 74 20 73 74 72 75 63 74 20 44 62 43 6f  onst struct DbCo
2c780 6e 66 69 67 43 68 6f 69 63 65 73 20 7b 0a 20 20  nfigChoices {.  
2c790 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2c7a0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74  zName;.      int
2c7b0 20 6f 70 3b 0a 20 20 20 20 7d 20 61 44 62 43 6f   op;.    } aDbCo
2c7c0 6e 66 69 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  nfig[] = {.     
2c7d0 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 66 6b 65     { "enable_fke
2c7e0 79 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f  y",      SQLITE_
2c7f0 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
2c800 46 4b 45 59 20 20 20 20 20 20 20 20 20 20 20 20  FKEY            
2c810 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 65 6e  },.        { "en
2c820 61 62 6c 65 5f 74 72 69 67 67 65 72 22 2c 20 20  able_trigger",  
2c830 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
2c840 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 20  _ENABLE_TRIGGER 
2c850 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2c860 20 20 20 7b 20 22 66 74 73 33 5f 74 6f 6b 65 6e     { "fts3_token
2c870 69 7a 65 72 22 2c 20 20 20 53 51 4c 49 54 45 5f  izer",   SQLITE_
2c880 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
2c890 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 20 20  FTS3_TOKENIZER  
2c8a0 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 6c 6f  },.        { "lo
2c8b0 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20  ad_extension",  
2c8c0 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
2c8d0 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54  _ENABLE_LOAD_EXT
2c8e0 45 4e 53 49 4f 4e 20 20 7d 2c 0a 20 20 20 20 20  ENSION  },.     
2c8f0 20 20 20 7b 20 22 6e 6f 5f 63 6b 70 74 5f 6f 6e     { "no_ckpt_on
2c900 5f 63 6c 6f 73 65 22 2c 20 53 51 4c 49 54 45 5f  _close", SQLITE_
2c910 44 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54  DBCONFIG_NO_CKPT
2c920 5f 4f 4e 5f 43 4c 4f 53 45 20 20 20 20 20 20 20  _ON_CLOSE       
2c930 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 65 6e  },.        { "en
2c940 61 62 6c 65 5f 71 70 73 67 22 2c 20 20 20 20 20  able_qpsg",     
2c950 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
2c960 5f 45 4e 41 42 4c 45 5f 51 50 53 47 20 20 20 20  _ENABLE_QPSG    
2c970 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2c980 20 20 20 7b 20 22 74 72 69 67 67 65 72 5f 65 71     { "trigger_eq
2c990 70 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f  p",      SQLITE_
2c9a0 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52  DBCONFIG_TRIGGER
2c9b0 5f 45 51 50 20 20 20 20 20 20 20 20 20 20 20 20  _EQP            
2c9c0 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 72 65  },.        { "re
2c9d0 73 65 74 5f 64 61 74 61 62 61 73 65 22 2c 20 20  set_database",  
2c9e0 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
2c9f0 5f 52 45 53 45 54 5f 44 41 54 41 42 41 53 45 20  _RESET_DATABASE 
2ca00 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7d          },.    }
2ca10 3b 0a 20 20 20 20 69 6e 74 20 69 69 2c 20 76 3b  ;.    int ii, v;
2ca20 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
2ca30 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  0);.    for(ii=0
2ca40 3b 20 69 69 3c 41 72 72 61 79 53 69 7a 65 28 61  ; ii<ArraySize(a
2ca50 44 62 43 6f 6e 66 69 67 29 3b 20 69 69 2b 2b 29  DbConfig); ii++)
2ca60 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  {.      if( nArg
2ca70 3e 31 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41  >1 && strcmp(azA
2ca80 72 67 5b 31 5d 2c 20 61 44 62 43 6f 6e 66 69 67  rg[1], aDbConfig
2ca90 5b 69 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29  [ii].zName)!=0 )
2caa0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2cab0 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a   if( nArg>=3 ){.
2cac0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2cad0 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c  db_config(p->db,
2cae0 20 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 6f   aDbConfig[ii].o
2caf0 70 2c 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28  p, booleanValue(
2cb00 61 7a 41 72 67 5b 32 5d 29 2c 20 30 29 3b 0a 20  azArg[2]), 0);. 
2cb10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2cb20 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70  ite3_db_config(p
2cb30 2d 3e 64 62 2c 20 61 44 62 43 6f 6e 66 69 67 5b  ->db, aDbConfig[
2cb40 69 69 5d 2e 6f 70 2c 20 2d 31 2c 20 26 76 29 3b  ii].op, -1, &v);
2cb50 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2cb60 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 38 73  tf(p->out, "%18s
2cb70 20 25 73 5c 6e 22 2c 20 61 44 62 43 6f 6e 66 69   %s\n", aDbConfi
2cb80 67 5b 69 69 5d 2e 7a 4e 61 6d 65 2c 20 76 20 3f  g[ii].zName, v ?
2cb90 20 22 6f 6e 22 20 3a 20 22 6f 66 66 22 29 3b 0a   "on" : "off");.
2cba0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31        if( nArg>1
2cbb0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
2cbc0 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26      if( nArg>1 &
2cbd0 26 20 69 69 3d 3d 41 72 72 61 79 53 69 7a 65 28  & ii==ArraySize(
2cbe0 61 44 62 43 6f 6e 66 69 67 29 20 29 7b 0a 20 20  aDbConfig) ){.  
2cbf0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2cc00 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2cc10 75 6e 6b 6e 6f 77 6e 20 64 62 63 6f 6e 66 69 67  unknown dbconfig
2cc20 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
2cc30 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 75 74 66  g[1]);.      utf
2cc40 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2cc50 20 22 45 6e 74 65 72 20 5c 22 2e 64 62 63 6f 6e   "Enter \".dbcon
2cc60 66 69 67 5c 22 20 77 69 74 68 20 6e 6f 20 61 72  fig\" with no ar
2cc70 67 75 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c 69  guments for a li
2cc80 73 74 5c 6e 22 29 3b 0a 20 20 20 20 7d 20 20 20  st\n");.    }   
2cc90 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2cca0 63 3d 3d 27 64 27 20 26 26 20 6e 3e 3d 33 20 26  c=='d' && n>=3 &
2ccb0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2ccc0 30 5d 2c 20 22 64 62 69 6e 66 6f 22 2c 20 6e 29  0], "dbinfo", n)
2ccd0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
2cce0 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d  shell_dbinfo_com
2ccf0 6d 61 6e 64 28 70 2c 20 6e 41 72 67 2c 20 61 7a  mand(p, nArg, az
2cd00 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  Arg);.  }else.. 
2cd10 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73   if( c=='d' && s
2cd20 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2cd30 20 22 64 75 6d 70 22 2c 20 6e 29 3d 3d 30 20 29   "dump", n)==0 )
2cd40 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2cd50 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 0a 20 20 20   *zLike = 0;.   
2cd60 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
2cd70 73 61 76 65 64 53 68 6f 77 48 65 61 64 65 72 20  savedShowHeader 
2cd80 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b  = p->showHeader;
2cd90 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64 53 68  .    int savedSh
2cda0 65 6c 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 68  ellFlags = p->sh
2cdb0 65 6c 6c 46 6c 67 73 3b 0a 20 20 20 20 53 68 65  ellFlgs;.    She
2cdc0 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53  llClearFlag(p, S
2cdd0 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77  HFLG_PreserveRow
2cde0 69 64 7c 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65  id|SHFLG_Newline
2cdf0 73 7c 53 48 46 4c 47 5f 45 63 68 6f 29 3b 0a 20  s|SHFLG_Echo);. 
2ce00 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41     for(i=1; i<nA
2ce10 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
2ce20 69 66 28 20 61 7a 41 72 67 5b 69 5d 5b 30 5d 3d  if( azArg[i][0]=
2ce30 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
2ce40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
2ce50 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20 20 20 20  azArg[i]+1;.    
2ce60 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
2ce70 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) z++;.       
2ce80 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 70   if( strcmp(z,"p
2ce90 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 22 29  reserve-rowids")
2cea0 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ==0 ){.#ifdef SQ
2ceb0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2cec0 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 20  LTABLE.         
2ced0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2cee0 72 72 2c 20 22 54 68 65 20 2d 2d 70 72 65 73 65  rr, "The --prese
2cef0 72 76 65 2d 72 6f 77 69 64 73 20 6f 70 74 69 6f  rve-rowids optio
2cf00 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69  n is not compati
2cf10 62 6c 65 22 0a 20 20 20 20 20 20 20 20 20 20 20  ble".           
2cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf30 20 20 22 20 77 69 74 68 20 53 51 4c 49 54 45 5f    " with SQLITE_
2cf40 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2cf50 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  E\n");.         
2cf60 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
2cf70 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
2cf80 6d 61 6e 64 5f 65 78 69 74 3b 0a 23 65 6c 73 65  mand_exit;.#else
2cf90 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c  .          Shell
2cfa0 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  SetFlag(p, SHFLG
2cfb0 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 29 3b  _PreserveRowid);
2cfc0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
2cfd0 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  }else.        if
2cfe0 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e 65 77 6c  ( strcmp(z,"newl
2cff0 69 6e 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ines")==0 ){.   
2d000 20 20 20 20 20 20 20 53 68 65 6c 6c 53 65 74 46         ShellSetF
2d010 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77  lag(p, SHFLG_New
2d020 6c 69 6e 65 73 29 3b 0a 20 20 20 20 20 20 20 20  lines);.        
2d030 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a  }else.        {.
2d040 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
2d050 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e  intf(stderr, "Un
2d060 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25  known option \"%
2d070 73 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d 70 5c 22  s\" on \".dump\"
2d080 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  \n", azArg[i]);.
2d090 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
2d0a0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2d0b0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2d0c0 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  it;.        }.  
2d0d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c      }else if( zL
2d0e0 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ike ){.        r
2d0f0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2d100 2c 20 22 55 73 61 67 65 3a 20 2e 64 75 6d 70 20  , "Usage: .dump 
2d110 3f 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f 77 69  ?--preserve-rowi
2d120 64 73 3f 20 22 0a 20 20 20 20 20 20 20 20 20 20  ds? ".          
2d130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d140 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f 20 3f   "?--newlines? ?
2d150 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22  LIKE-PATTERN?\n"
2d160 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2d170 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
2d180 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
2d190 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
2d1a0 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d 20          zLike = 
2d1b0 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
2d1c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  }.    }.    open
2d1d0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 2f  _db(p, 0);.    /
2d1e0 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62  * When playing b
2d1f0 61 63 6b 20 61 20 22 64 75 6d 70 22 2c 20 74 68  ack a "dump", th
2d200 65 20 63 6f 6e 74 65 6e 74 20 6d 69 67 68 74 20  e content might 
2d210 61 70 70 65 61 72 20 69 6e 20 61 6e 20 6f 72 64  appear in an ord
2d220 65 72 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20  er.    ** which 
2d230 63 61 75 73 65 73 20 69 6d 6d 65 64 69 61 74 65  causes immediate
2d240 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
2d250 73 74 72 61 69 6e 74 73 20 74 6f 20 62 65 20 76  straints to be v
2d260 69 6f 6c 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  iolated..    ** 
2d270 53 6f 20 64 69 73 61 62 6c 65 20 66 6f 72 65 69  So disable forei
2d280 67 6e 2d 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn-key constrain
2d290 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 74 6f  t enforcement to
2d2a0 20 70 72 65 76 65 6e 74 20 70 72 6f 62 6c 65 6d   prevent problem
2d2b0 73 2e 20 2a 2f 0a 20 20 20 20 72 61 77 5f 70 72  s. */.    raw_pr
2d2c0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52  intf(p->out, "PR
2d2d0 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
2d2e0 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20  s=OFF;\n");.    
2d2f0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
2d300 74 2c 20 22 42 45 47 49 4e 20 54 52 41 4e 53 41  t, "BEGIN TRANSA
2d310 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20  CTION;\n");.    
2d320 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d  p->writableSchem
2d330 61 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 68  a = 0;.    p->sh
2d340 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  owHeader = 0;.  
2d350 20 20 2f 2a 20 53 65 74 20 77 72 69 74 61 62 6c    /* Set writabl
2d360 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 73 69 6e 63  e_schema=ON sinc
2d370 65 20 64 6f 69 6e 67 20 73 6f 20 66 6f 72 63 65  e doing so force
2d380 73 20 53 51 4c 69 74 65 20 74 6f 20 69 6e 69 74  s SQLite to init
2d390 69 61 6c 69 7a 65 0a 20 20 20 20 2a 2a 20 61 73  ialize.    ** as
2d3a0 20 6d 75 63 68 20 6f 66 20 74 68 65 20 73 63 68   much of the sch
2d3b0 65 6d 61 20 61 73 20 69 74 20 63 61 6e 20 65 76  ema as it can ev
2d3c0 65 6e 20 69 66 20 74 68 65 20 73 71 6c 69 74 65  en if the sqlite
2d3d0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 69 73  _master table is
2d3e0 0a 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 2e  .    ** corrupt.
2d3f0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
2d400 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56  exec(p->db, "SAV
2d410 45 50 4f 49 4e 54 20 64 75 6d 70 3b 20 50 52 41  EPOINT dump; PRA
2d420 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
2d430 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20 30  ema=ON", 0, 0, 0
2d440 29 3b 0a 20 20 20 20 70 2d 3e 6e 45 72 72 20 3d  );.    p->nErr =
2d450 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6b   0;.    if( zLik
2d460 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 75  e==0 ){.      ru
2d470 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75  n_schema_dump_qu
2d480 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22  ery(p,.        "
2d490 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70  SELECT name, typ
2d4a0 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
2d4b0 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
2d4c0 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
2d4d0 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65  OT NULL AND type
2d4e0 3d 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61  =='table' AND na
2d4f0 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73 65 71 75  me!='sqlite_sequ
2d500 65 6e 63 65 27 22 0a 20 20 20 20 20 20 29 3b 0a  ence'".      );.
2d510 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61        run_schema
2d520 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20  _dump_query(p,. 
2d530 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
2d540 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46  ame, type, sql F
2d550 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
2d560 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
2d570 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c 69 74 65  RE name=='sqlite
2d580 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20  _sequence'".    
2d590 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74    );.      run_t
2d5a0 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28  able_dump_query(
2d5b0 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  p,.        "SELE
2d5c0 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  CT sql FROM sqli
2d5d0 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
2d5e0 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
2d5f0 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65  OT NULL AND type
2d600 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72   IN ('index','tr
2d610 69 67 67 65 72 27 2c 27 76 69 65 77 27 29 22 2c  igger','view')",
2d620 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
2d630 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
2d640 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20 20 7a  r *zSql;.      z
2d650 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
2d660 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22  rintf(.        "
2d670 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70  SELECT name, typ
2d680 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
2d690 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
2d6a0 20 20 20 20 22 57 48 45 52 45 20 74 62 6c 5f 6e      "WHERE tbl_n
2d6b0 61 6d 65 20 4c 49 4b 45 20 25 51 20 41 4e 44 20  ame LIKE %Q AND 
2d6c0 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 22 0a 20  type=='table'". 
2d6d0 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 73 71         "  AND sq
2d6e0 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 7a 4c 69  l NOT NULL", zLi
2d6f0 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73  ke);.      run_s
2d700 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79  chema_dump_query
2d710 28 70 2c 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  (p,zSql);.      
2d720 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
2d730 6c 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  l);.      zSql =
2d740 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2d750 28 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  (.        "SELEC
2d760 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  T sql FROM sqlit
2d770 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
2d780 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f     "WHERE sql NO
2d790 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20  T NULL".        
2d7a0 22 20 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28  "  AND type IN (
2d7b0 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65 72  'index','trigger
2d7c0 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20 20  ','view')".     
2d7d0 20 20 20 22 20 20 41 4e 44 20 74 62 6c 5f 6e 61     "  AND tbl_na
2d7e0 6d 65 20 4c 49 4b 45 20 25 51 22 2c 20 7a 4c 69  me LIKE %Q", zLi
2d7f0 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74  ke);.      run_t
2d800 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28  able_dump_query(
2d810 70 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 20  p, zSql, 0);.   
2d820 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2d830 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
2d840 20 69 66 28 20 70 2d 3e 77 72 69 74 61 62 6c 65   if( p->writable
2d850 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
2d860 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
2d870 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  t, "PRAGMA writa
2d880 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 5c  ble_schema=OFF;\
2d890 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72  n");.      p->wr
2d8a0 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30  itableSchema = 0
2d8b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2d8c0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
2d8d0 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
2d8e0 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30  _schema=OFF;", 0
2d8f0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
2d900 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
2d910 20 22 52 45 4c 45 41 53 45 20 64 75 6d 70 3b 22   "RELEASE dump;"
2d920 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
2d930 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
2d940 74 2c 20 70 2d 3e 6e 45 72 72 20 3f 20 22 52 4f  t, p->nErr ? "RO
2d950 4c 4c 42 41 43 4b 3b 20 2d 2d 20 64 75 65 20 74  LLBACK; -- due t
2d960 6f 20 65 72 72 6f 72 73 5c 6e 22 20 3a 20 22 43  o errors\n" : "C
2d970 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 20 20  OMMIT;\n");.    
2d980 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  p->showHeader = 
2d990 73 61 76 65 64 53 68 6f 77 48 65 61 64 65 72 3b  savedShowHeader;
2d9a0 0a 20 20 20 20 70 2d 3e 73 68 65 6c 6c 46 6c 67  .    p->shellFlg
2d9b0 73 20 3d 20 73 61 76 65 64 53 68 65 6c 6c 46 6c  s = savedShellFl
2d9c0 61 67 73 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  ags;.  }else..  
2d9d0 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
2d9e0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2d9f0 22 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b  "echo", n)==0 ){
2da00 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
2da10 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43   ){.      setOrC
2da20 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c  learFlag(p, SHFL
2da30 47 5f 45 63 68 6f 2c 20 61 7a 41 72 67 5b 31 5d  G_Echo, azArg[1]
2da40 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2da50 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2da60 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2da70 65 63 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  echo on|off\n");
2da80 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2da90 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
2daa0 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
2dab0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2dac0 22 65 71 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  "eqp", n)==0 ){.
2dad0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
2dae0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  ){.      p->auto
2daf0 45 51 50 74 65 73 74 20 3d 20 30 3b 0a 20 20 20  EQPtest = 0;.   
2db00 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
2db10 41 72 67 5b 31 5d 2c 22 66 75 6c 6c 22 29 3d 3d  Arg[1],"full")==
2db20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
2db30 61 75 74 6f 45 51 50 20 3d 20 41 55 54 4f 45 51  autoEQP = AUTOEQ
2db40 50 5f 66 75 6c 6c 3b 0a 20 20 20 20 20 20 7d 65  P_full;.      }e
2db50 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
2db60 7a 41 72 67 5b 31 5d 2c 22 74 72 69 67 67 65 72  zArg[1],"trigger
2db70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
2db80 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41 55   p->autoEQP = AU
2db90 54 4f 45 51 50 5f 74 72 69 67 67 65 72 3b 0a 20  TOEQP_trigger;. 
2dba0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
2dbb0 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
2dbc0 74 65 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  test")==0 ){.   
2dbd0 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20       p->autoEQP 
2dbe0 3d 20 41 55 54 4f 45 51 50 5f 6f 6e 3b 0a 20 20  = AUTOEQP_on;.  
2dbf0 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50        p->autoEQP
2dc00 74 65 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  test = 1;.      
2dc10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2dc20 2d 3e 61 75 74 6f 45 51 50 20 3d 20 28 75 38 29  ->autoEQP = (u8)
2dc30 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
2dc40 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  rg[1]);.      }.
2dc50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2dc60 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2dc70 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65 71 70  rr, "Usage: .eqp
2dc80 20 6f 66 66 7c 6f 6e 7c 74 72 69 67 67 65 72 7c   off|on|trigger|
2dc90 66 75 6c 6c 5c 6e 22 29 3b 0a 20 20 20 20 20 20  full\n");.      
2dca0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
2dcb0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2dcc0 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'e' && strncmp(a
2dcd0 7a 41 72 67 5b 30 5d 2c 20 22 65 78 69 74 22 2c  zArg[0], "exit",
2dce0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
2dcf0 28 20 6e 41 72 67 3e 31 20 26 26 20 28 72 63 20  ( nArg>1 && (rc 
2dd00 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61  = (int)integerVa
2dd10 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 29 21 3d  lue(azArg[1]))!=
2dd20 30 20 29 20 65 78 69 74 28 72 63 29 3b 0a 20 20  0 ) exit(rc);.  
2dd30 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73    rc = 2;.  }els
2dd40 65 0a 0a 20 20 2f 2a 20 54 68 65 20 22 2e 65 78  e..  /* The ".ex
2dd50 70 6c 61 69 6e 22 20 63 6f 6d 6d 61 6e 64 20 69  plain" command i
2dd60 73 20 61 75 74 6f 6d 61 74 69 63 20 6e 6f 77 2e  s automatic now.
2dd70 20 20 49 74 20 69 73 20 6c 61 72 67 65 6c 79 20    It is largely 
2dd80 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 74 0a 20  pointless.  It. 
2dd90 20 2a 2a 20 72 65 74 61 69 6e 65 64 20 70 75 72   ** retained pur
2dda0 65 6c 79 20 66 6f 72 20 62 61 63 6b 77 61 72 64  ely for backward
2ddb0 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
2ddc0 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20  */.  if( c=='e' 
2ddd0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2dde0 5b 30 5d 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20  [0], "explain", 
2ddf0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  n)==0 ){.    int
2de00 20 76 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66   val = 1;.    if
2de10 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20  ( nArg>=2 ){.   
2de20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
2de30 41 72 67 5b 31 5d 2c 22 61 75 74 6f 22 29 3d 3d  Arg[1],"auto")==
2de40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 76 61 6c  0 ){.        val
2de50 20 3d 20 39 39 3b 0a 20 20 20 20 20 20 7d 65 6c   = 99;.      }el
2de60 73 65 7b 0a 20 20 20 20 20 20 20 20 76 61 6c 20  se{.        val 
2de70 3d 20 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28  =  booleanValue(
2de80 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
2de90 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2dea0 20 76 61 6c 3d 3d 31 20 26 26 20 70 2d 3e 6d 6f   val==1 && p->mo
2deb0 64 65 21 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  de!=MODE_Explain
2dec0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 6f 72   ){.      p->nor
2ded0 6d 61 6c 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64  malMode = p->mod
2dee0 65 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  e;.      p->mode
2def0 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b   = MODE_Explain;
2df00 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78  .      p->autoEx
2df10 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  plain = 0;.    }
2df20 65 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d 30 20  else if( val==0 
2df30 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
2df40 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61  mode==MODE_Expla
2df50 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d 20 70  in ) p->mode = p
2df60 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20 20  ->normalMode;.  
2df70 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61      p->autoExpla
2df80 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  in = 0;.    }els
2df90 65 20 69 66 28 20 76 61 6c 3d 3d 39 39 20 29 7b  e if( val==99 ){
2dfa0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f  .      if( p->mo
2dfb0 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  de==MODE_Explain
2dfc0 20 29 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e   ) p->mode = p->
2dfd0 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20 20 20 20  normalMode;.    
2dfe0 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e    p->autoExplain
2dff0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
2e000 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  lse..#ifndef SQL
2e010 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2e020 54 41 42 4c 45 0a 20 20 69 66 28 20 63 3d 3d 27  TABLE.  if( c=='
2e030 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  e' && strncmp(az
2e040 41 72 67 5b 30 5d 2c 20 22 65 78 70 65 72 74 22  Arg[0], "expert"
2e050 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  , n)==0 ){.    o
2e060 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
2e070 20 20 65 78 70 65 72 74 44 6f 74 43 6f 6d 6d 61    expertDotComma
2e080 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72  nd(p, azArg, nAr
2e090 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  g);.  }else.#end
2e0a0 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 66 27  if..  if( c=='f'
2e0b0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2e0c0 67 5b 30 5d 2c 20 22 66 75 6c 6c 73 63 68 65 6d  g[0], "fullschem
2e0d0 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  a", n)==0 ){.   
2e0e0 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61   ShellState data
2e0f0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  ;.    char *zErr
2e100 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Msg = 0;.    int
2e110 20 64 6f 53 74 61 74 73 20 3d 20 30 3b 0a 20 20   doStats = 0;.  
2e120 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20    memcpy(&data, 
2e130 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29  p, sizeof(data))
2e140 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48  ;.    data.showH
2e150 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64  eader = 0;.    d
2e160 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
2e170 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d  .mode = MODE_Sem
2e180 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  i;.    if( nArg=
2e190 3d 32 20 26 26 20 6f 70 74 69 6f 6e 4d 61 74 63  =2 && optionMatc
2e1a0 68 28 61 7a 41 72 67 5b 31 5d 2c 20 22 69 6e 64  h(azArg[1], "ind
2e1b0 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 64  ent") ){.      d
2e1c0 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
2e1d0 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 50 72 65  .mode = MODE_Pre
2e1e0 74 74 79 3b 0a 20 20 20 20 20 20 6e 41 72 67 20  tty;.      nArg 
2e1f0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
2e200 66 28 20 6e 41 72 67 21 3d 31 20 29 7b 0a 20 20  f( nArg!=1 ){.  
2e210 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2e220 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2e230 66 75 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e  fullschema ?--in
2e240 64 65 6e 74 3f 5c 6e 22 29 3b 0a 20 20 20 20 20  dent?\n");.     
2e250 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
2e260 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2e270 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
2e280 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
2e290 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e2a0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20  _exec(p->db,.   
2e2b0 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20      "SELECT sql 
2e2c0 46 52 4f 4d 22 0a 20 20 20 20 20 20 20 22 20 20  FROM".       "  
2e2d0 28 53 45 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c  (SELECT sql sql,
2e2e0 20 74 79 70 65 20 74 79 70 65 2c 20 74 62 6c 5f   type type, tbl_
2e2f0 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e  name tbl_name, n
2e300 61 6d 65 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20  ame name, rowid 
2e310 78 22 0a 20 20 20 20 20 20 20 22 20 20 20 20 20  x".       "     
2e320 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
2e330 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20  er UNION ALL".  
2e340 20 20 20 20 20 22 20 20 20 53 45 4c 45 43 54 20       "   SELECT 
2e350 73 71 6c 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e  sql, type, tbl_n
2e360 61 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64  ame, name, rowid
2e370 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d   FROM sqlite_tem
2e380 70 5f 6d 61 73 74 65 72 29 20 22 0a 20 20 20 20  p_master) ".    
2e390 20 20 20 22 57 48 45 52 45 20 74 79 70 65 21 3d     "WHERE type!=
2e3a0 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 4e  'meta' AND sql N
2e3b0 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20  OTNULL AND name 
2e3c0 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65  NOT LIKE 'sqlite
2e3d0 5f 25 27 20 22 0a 20 20 20 20 20 20 20 22 4f 52  _%' ".       "OR
2e3e0 44 45 52 20 42 59 20 72 6f 77 69 64 22 2c 0a 20  DER BY rowid",. 
2e3f0 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20        callback, 
2e400 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a  &data, &zErrMsg.
2e410 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72      );.    if( r
2e420 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e430 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
2e440 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 20  mt *pStmt;.     
2e450 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
2e460 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a  epare_v2(p->db,.
2e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2e480 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
2e490 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
2e4a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e4b0 22 20 57 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f  " WHERE name GLO
2e4c0 42 20 27 73 71 6c 69 74 65 5f 73 74 61 74 5b 31  B 'sqlite_stat[1
2e4d0 33 34 5d 27 22 2c 0a 20 20 20 20 20 20 20 20 20  34]'",.         
2e4e0 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74        -1, &pStmt
2e4f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 6f 53 74  , 0);.      doSt
2e500 61 74 73 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  ats = sqlite3_st
2e510 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
2e520 45 5f 52 4f 57 3b 0a 20 20 20 20 20 20 73 71 6c  E_ROW;.      sql
2e530 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
2e540 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tmt);.    }.    
2e550 69 66 28 20 64 6f 53 74 61 74 73 3d 3d 30 20 29  if( doStats==0 )
2e560 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2e570 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 20 4e  tf(p->out, "/* N
2e580 6f 20 53 54 41 54 20 74 61 62 6c 65 73 20 61 76  o STAT tables av
2e590 61 69 6c 61 62 6c 65 20 2a 2f 5c 6e 22 29 3b 0a  ailable */\n");.
2e5a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e5b0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
2e5c0 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c  ut, "ANALYZE sql
2e5d0 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b  ite_master;\n");
2e5e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65  .      sqlite3_e
2e5f0 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45  xec(p->db, "SELE
2e600 43 54 20 27 41 4e 41 4c 59 5a 45 20 73 71 6c 69  CT 'ANALYZE sqli
2e610 74 65 5f 6d 61 73 74 65 72 27 22 2c 0a 20 20 20  te_master'",.   
2e620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e630 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
2e640 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
2e650 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64    data.cMode = d
2e660 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f  ata.mode = MODE_
2e670 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 64 61  Insert;.      da
2e680 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  ta.zDestTable = 
2e690 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 3b 0a  "sqlite_stat1";.
2e6a0 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63        shell_exec
2e6b0 28 26 64 61 74 61 2c 20 22 53 45 4c 45 43 54 20  (&data, "SELECT 
2e6c0 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  * FROM sqlite_st
2e6d0 61 74 31 22 2c 20 26 7a 45 72 72 4d 73 67 29 3b  at1", &zErrMsg);
2e6e0 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44 65 73  .      data.zDes
2e6f0 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69 74 65  tTable = "sqlite
2e700 5f 73 74 61 74 33 22 3b 0a 20 20 20 20 20 20 73  _stat3";.      s
2e710 68 65 6c 6c 5f 65 78 65 63 28 26 64 61 74 61 2c  hell_exec(&data,
2e720 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
2e730 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 20 26  sqlite_stat3", &
2e740 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
2e750 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20  data.zDestTable 
2e760 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22  = "sqlite_stat4"
2e770 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78  ;.      shell_ex
2e780 65 63 28 26 64 61 74 61 2c 20 22 53 45 4c 45 43  ec(&data, "SELEC
2e790 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
2e7a0 73 74 61 74 34 22 2c 20 26 7a 45 72 72 4d 73 67  stat4", &zErrMsg
2e7b0 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
2e7c0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41  ntf(p->out, "ANA
2e7d0 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74  LYZE sqlite_mast
2e7e0 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20  er;\n");.    }. 
2e7f0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2e800 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='h' && strncmp(
2e810 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 61 64 65  azArg[0], "heade
2e820 72 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  rs", n)==0 ){.  
2e830 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
2e840 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f 77 48 65  .      p->showHe
2e850 61 64 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61  ader = booleanVa
2e860 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
2e870 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e880 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2e890 72 2c 20 22 55 73 61 67 65 3a 20 2e 68 65 61 64  r, "Usage: .head
2e8a0 65 72 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a  ers on|off\n");.
2e8b0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2e8c0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
2e8d0 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72  f( c=='h' && str
2e8e0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2e8f0 68 65 6c 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  help", n)==0 ){.
2e900 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 32 20      if( nArg>=2 
2e910 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 68 6f  ){.      n = sho
2e920 77 48 65 6c 70 28 70 2d 3e 6f 75 74 2c 20 61 7a  wHelp(p->out, az
2e930 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69  Arg[1]);.      i
2e940 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
2e950 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2e960 2d 3e 6f 75 74 2c 20 22 4e 6f 74 68 69 6e 67 20  ->out, "Nothing 
2e970 6d 61 74 63 68 65 73 20 27 25 73 27 5c 6e 22 2c  matches '%s'\n",
2e980 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
2e990 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2e9a0 20 20 20 20 20 73 68 6f 77 48 65 6c 70 28 70 2d       showHelp(p-
2e9b0 3e 6f 75 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  >out, 0);.    }.
2e9c0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2e9d0 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70  =='i' && strncmp
2e9e0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f  (azArg[0], "impo
2e9f0 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  rt", n)==0 ){.  
2ea00 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20    char *zTable; 
2ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ea20 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74   Insert data int
2ea30 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  o this table */.
2ea40 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b      char *zFile;
2ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea60 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
2ea70 74 6f 20 65 78 74 72 61 20 63 6f 6e 74 65 6e 74  to extra content
2ea80 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 73 71 6c   from */.    sql
2ea90 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
2eaa0 20 3d 20 4e 55 4c 4c 3b 20 2f 2a 20 41 20 73 74   = NULL; /* A st
2eab0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
2eac0 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
2ead0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2eae0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
2eaf0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
2eb00 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20      int nByte;  
2eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2eb30 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74 72  es in an SQL str
2eb40 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ing */.    int i
2eb50 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
2eb60 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2eb70 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 69  ounters */.    i
2eb80 6e 74 20 6e 65 65 64 43 6f 6d 6d 69 74 3b 20 20  nt needCommit;  
2eb90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2eba0 75 65 20 74 6f 20 43 4f 4d 4d 49 54 20 6f 72 20  ue to COMMIT or 
2ebb0 52 4f 4c 4c 42 41 43 4b 20 61 74 20 65 6e 64 20  ROLLBACK at end 
2ebc0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b  */.    int nSep;
2ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ebe0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ebf0 62 79 74 65 73 20 69 6e 20 70 2d 3e 63 6f 6c 53  bytes in p->colS
2ec00 65 70 61 72 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20  eparator[] */.  
2ec10 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20    char *zSql;   
2ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ec30 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   An SQL statemen
2ec40 74 20 2a 2f 0a 20 20 20 20 49 6d 70 6f 72 74 43  t */.    ImportC
2ec50 74 78 20 73 43 74 78 3b 20 20 20 20 20 20 20 20  tx sCtx;        
2ec60 20 20 20 20 20 2f 2a 20 52 65 61 64 65 72 20 63       /* Reader c
2ec70 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 63 68  ontext */.    ch
2ec80 61 72 20 2a 28 53 51 4c 49 54 45 5f 43 44 45 43  ar *(SQLITE_CDEC
2ec90 4c 20 2a 78 52 65 61 64 29 28 49 6d 70 6f 72 74  L *xRead)(Import
2eca0 43 74 78 2a 29 3b 20 2f 2a 20 46 75 6e 63 20 74  Ctx*); /* Func t
2ecb0 6f 20 72 65 61 64 20 6f 6e 65 20 76 61 6c 75 65  o read one value
2ecc0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28 53 51 4c   */.    int (SQL
2ecd0 49 54 45 5f 43 44 45 43 4c 20 2a 78 43 6c 6f 73  ITE_CDECL *xClos
2ece0 65 72 29 28 46 49 4c 45 2a 29 3b 20 20 20 20 20  er)(FILE*);     
2ecf0 20 2f 2a 20 46 75 6e 63 20 74 6f 20 63 6c 6f 73   /* Func to clos
2ed00 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 69  e file */..    i
2ed10 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20  f( nArg!=3 ){.  
2ed20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2ed30 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2ed40 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41 42 4c  import FILE TABL
2ed50 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 67 6f 74  E\n");.      got
2ed60 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2ed70 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  xit;.    }.    z
2ed80 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b  File = azArg[1];
2ed90 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a  .    zTable = az
2eda0 41 72 67 5b 32 5d 3b 0a 20 20 20 20 73 65 65 6e  Arg[2];.    seen
2edb0 49 6e 74 65 72 72 75 70 74 20 3d 20 30 3b 0a 20  Interrupt = 0;. 
2edc0 20 20 20 6d 65 6d 73 65 74 28 26 73 43 74 78 2c     memset(&sCtx,
2edd0 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 74 78 29   0, sizeof(sCtx)
2ede0 29 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  );.    open_db(p
2edf0 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d  , 0);.    nSep =
2ee00 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c   strlen30(p->col
2ee10 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
2ee20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20  if( nSep==0 ){. 
2ee30 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2ee40 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20  stderr,.        
2ee50 20 20 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a           "Error:
2ee60 20 6e 6f 6e 2d 6e 75 6c 6c 20 63 6f 6c 75 6d 6e   non-null column
2ee70 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69   separator requi
2ee80 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e  red for import\n
2ee90 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
2eea0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
2eeb0 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20 20 20 20  ( nSep>1 ){.    
2eec0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2eed0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75 6c  err, "Error: mul
2eee0 74 69 2d 63 68 61 72 61 63 74 65 72 20 63 6f 6c  ti-character col
2eef0 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73 20 6e  umn separators n
2ef00 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20  ot allowed".    
2ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef20 20 20 22 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e    " for import\n
2ef30 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
2ef40 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53   1;.    }.    nS
2ef50 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d  ep = strlen30(p-
2ef60 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
2ef70 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20      if( nSep==0 
2ef80 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2ef90 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2efa0 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 72 6f 77  or: non-null row
2efb0 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69   separator requi
2efc0 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e  red for import\n
2efd0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
2efe0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
2eff0 28 20 6e 53 65 70 3d 3d 32 20 26 26 20 70 2d 3e  ( nSep==2 && p->
2f000 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 43 73 76 20 26  mode==MODE_Csv &
2f010 26 20 73 74 72 63 6d 70 28 70 2d 3e 72 6f 77 53  & strcmp(p->rowS
2f020 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 72  eparator, SEP_Cr
2f030 4c 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Lf)==0 ){.      
2f040 2f 2a 20 57 68 65 6e 20 69 6d 70 6f 72 74 69 6e  /* When importin
2f050 67 20 43 53 56 20 28 6f 6e 6c 79 29 2c 20 69 66  g CSV (only), if
2f060 20 74 68 65 20 72 6f 77 20 73 65 70 61 72 61 74   the row separat
2f070 6f 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  or is set to the
2f080 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  .      ** defaul
2f090 74 20 6f 75 74 70 75 74 20 72 6f 77 20 73 65 70  t output row sep
2f0a0 61 72 61 74 6f 72 2c 20 63 68 61 6e 67 65 20 69  arator, change i
2f0b0 74 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74  t to the default
2f0c0 20 69 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a 20   input.      ** 
2f0d0 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20  row separator.  
2f0e0 54 68 69 73 20 61 76 6f 69 64 73 20 68 61 76 69  This avoids havi
2f0f0 6e 67 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 64  ng to maintain d
2f100 69 66 66 65 72 65 6e 74 20 69 6e 70 75 74 0a 20  ifferent input. 
2f110 20 20 20 20 20 2a 2a 20 61 6e 64 20 6f 75 74 70       ** and outp
2f120 75 74 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  ut row separator
2f130 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  s. */.      sqli
2f140 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2f150 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
2f160 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61  tor), p->rowSepa
2f170 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b  rator, SEP_Row);
2f180 0a 20 20 20 20 20 20 6e 53 65 70 20 3d 20 73 74  .      nSep = st
2f190 72 6c 65 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70  rlen30(p->rowSep
2f1a0 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  arator);.    }. 
2f1b0 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20 29 7b     if( nSep>1 ){
2f1c0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2f1d0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2f1e0 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61 63 74 65  : multi-characte
2f1f0 72 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 73  r row separators
2f200 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20   not allowed".  
2f210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f220 20 20 20 20 22 20 66 6f 72 20 69 6d 70 6f 72 74      " for import
2f230 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
2f240 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2f250 73 43 74 78 2e 7a 46 69 6c 65 20 3d 20 7a 46 69  sCtx.zFile = zFi
2f260 6c 65 3b 0a 20 20 20 20 73 43 74 78 2e 6e 4c 69  le;.    sCtx.nLi
2f270 6e 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ne = 1;.    if( 
2f280 73 43 74 78 2e 7a 46 69 6c 65 5b 30 5d 3d 3d 27  sCtx.zFile[0]=='
2f290 7c 27 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  |' ){.#ifdef SQL
2f2a0 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20  ITE_OMIT_POPEN. 
2f2b0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2f2c0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2f2d0 70 69 70 65 73 20 61 72 65 20 6e 6f 74 20 73 75  pipes are not su
2f2e0 70 70 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20  pported in this 
2f2f0 4f 53 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  OS\n");.      re
2f300 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20  turn 1;.#else.  
2f310 20 20 20 20 73 43 74 78 2e 69 6e 20 3d 20 70 6f      sCtx.in = po
2f320 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65 2b 31  pen(sCtx.zFile+1
2f330 2c 20 22 72 22 29 3b 0a 20 20 20 20 20 20 73 43  , "r");.      sC
2f340 74 78 2e 7a 46 69 6c 65 20 3d 20 22 3c 70 69 70  tx.zFile = "<pip
2f350 65 3e 22 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73  e>";.      xClos
2f360 65 72 20 3d 20 70 63 6c 6f 73 65 3b 0a 23 65 6e  er = pclose;.#en
2f370 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
2f380 20 20 20 20 20 73 43 74 78 2e 69 6e 20 3d 20 66       sCtx.in = f
2f390 6f 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65 2c  open(sCtx.zFile,
2f3a0 20 22 72 62 22 29 3b 0a 20 20 20 20 20 20 78 43   "rb");.      xC
2f3b0 6c 6f 73 65 72 20 3d 20 66 63 6c 6f 73 65 3b 0a  loser = fclose;.
2f3c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
2f3d0 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73 63 69  >mode==MODE_Asci
2f3e0 69 20 29 7b 0a 20 20 20 20 20 20 78 52 65 61 64  i ){.      xRead
2f3f0 20 3d 20 61 73 63 69 69 5f 72 65 61 64 5f 6f 6e   = ascii_read_on
2f400 65 5f 66 69 65 6c 64 3b 0a 20 20 20 20 7d 65 6c  e_field;.    }el
2f410 73 65 7b 0a 20 20 20 20 20 20 78 52 65 61 64 20  se{.      xRead 
2f420 3d 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66  = csv_read_one_f
2f430 69 65 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ield;.    }.    
2f440 69 66 28 20 73 43 74 78 2e 69 6e 3d 3d 30 20 29  if( sCtx.in==0 )
2f450 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
2f460 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2f470 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
2f480 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65  \"%s\"\n", zFile
2f490 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2f4a0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 74  1;.    }.    sCt
2f4b0 78 2e 63 43 6f 6c 53 65 70 20 3d 20 70 2d 3e 63  x.cColSep = p->c
2f4c0 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a  olSeparator[0];.
2f4d0 20 20 20 20 73 43 74 78 2e 63 52 6f 77 53 65 70      sCtx.cRowSep
2f4e0 20 3d 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74   = p->rowSeparat
2f4f0 6f 72 5b 30 5d 3b 0a 20 20 20 20 7a 53 71 6c 20  or[0];.    zSql 
2f500 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2f510 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
2f520 20 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20   %s", zTable);. 
2f530 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
2f540 7b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28  {.      xCloser(
2f550 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20  sCtx.in);.      
2f560 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d  shell_out_of_mem
2f570 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ory();.    }.   
2f580 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33   nByte = strlen3
2f590 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20  0(zSql);.    rc 
2f5a0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
2f5b0 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
2f5c0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
2f5d0 3b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70  ;.    import_app
2f5e0 65 6e 64 5f 63 68 61 72 28 26 73 43 74 78 2c 20  end_char(&sCtx, 
2f5f0 30 29 3b 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73  0);    /* To ens
2f600 75 72 65 20 73 43 74 78 2e 7a 20 69 73 20 61 6c  ure sCtx.z is al
2f610 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 69  located */.    i
2f620 66 28 20 72 63 20 26 26 20 73 71 6c 69 74 65 33  f( rc && sqlite3
2f630 5f 73 74 72 67 6c 6f 62 28 22 6e 6f 20 73 75 63  _strglob("no suc
2f640 68 20 74 61 62 6c 65 3a 20 2a 22 2c 20 73 71 6c  h table: *", sql
2f650 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
2f660 62 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  b))==0 ){.      
2f670 63 68 61 72 20 2a 7a 43 72 65 61 74 65 20 3d 20  char *zCreate = 
2f680 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2f690 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 73  "CREATE TABLE %s
2f6a0 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  ", zTable);.    
2f6b0 20 20 63 68 61 72 20 63 53 65 70 20 3d 20 27 28    char cSep = '(
2f6c0 27 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ';.      while( 
2f6d0 78 52 65 61 64 28 26 73 43 74 78 29 20 29 7b 0a  xRead(&sCtx) ){.
2f6e0 20 20 20 20 20 20 20 20 7a 43 72 65 61 74 65 20          zCreate 
2f6f0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2f700 66 28 22 25 7a 25 63 5c 6e 20 20 5c 22 25 77 5c  f("%z%c\n  \"%w\
2f710 22 20 54 45 58 54 22 2c 20 7a 43 72 65 61 74 65  " TEXT", zCreate
2f720 2c 20 63 53 65 70 2c 20 73 43 74 78 2e 7a 29 3b  , cSep, sCtx.z);
2f730 0a 20 20 20 20 20 20 20 20 63 53 65 70 20 3d 20  .        cSep = 
2f740 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ',';.        if(
2f750 20 73 43 74 78 2e 63 54 65 72 6d 21 3d 73 43 74   sCtx.cTerm!=sCt
2f760 78 2e 63 43 6f 6c 53 65 70 20 29 20 62 72 65 61  x.cColSep ) brea
2f770 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2f780 20 69 66 28 20 63 53 65 70 3d 3d 27 28 27 20 29   if( cSep=='(' )
2f790 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2f7a0 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b  3_free(zCreate);
2f7b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f7c0 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20  _free(sCtx.z);. 
2f7d0 20 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73         xCloser(s
2f7e0 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20  Ctx.in);.       
2f7f0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2f800 65 72 72 2c 22 25 73 3a 20 65 6d 70 74 79 20 66  err,"%s: empty f
2f810 69 6c 65 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69  ile\n", sCtx.zFi
2f820 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  le);.        ret
2f830 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
2f840 20 20 20 20 20 7a 43 72 65 61 74 65 20 3d 20 73       zCreate = s
2f850 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2f860 25 7a 5c 6e 29 22 2c 20 7a 43 72 65 61 74 65 29  %z\n)", zCreate)
2f870 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2f880 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
2f890 20 7a 43 72 65 61 74 65 2c 20 30 2c 20 30 2c 20   zCreate, 0, 0, 
2f8a0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
2f8b0 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b  3_free(zCreate);
2f8c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
2f8d0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
2f8e0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43 52  intf(stderr, "CR
2f8f0 45 41 54 45 20 54 41 42 4c 45 20 25 73 28 2e 2e  EATE TABLE %s(..
2f900 2e 29 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22  .) failed: %s\n"
2f910 2c 20 7a 54 61 62 6c 65 2c 0a 20 20 20 20 20 20  , zTable,.      
2f920 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2f930 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
2f940 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2f950 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a  3_free(sCtx.z);.
2f960 20 20 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28          xCloser(
2f970 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20  sCtx.in);.      
2f980 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2f990 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
2f9a0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2f9b0 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
2f9c0 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
2f9d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2f9e0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
2f9f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2fa00 20 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69   if (pStmt) sqli
2fa10 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
2fa20 6d 74 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  mt);.      utf8_
2fa30 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
2fa40 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
2fa50 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
2fa60 62 29 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73  b));.      xClos
2fa70 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20  er(sCtx.in);.   
2fa80 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2fa90 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71   }.    nCol = sq
2faa0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
2fab0 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73  nt(pStmt);.    s
2fac0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2fad0 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d  pStmt);.    pStm
2fae0 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e  t = 0;.    if( n
2faf0 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Col==0 ) return 
2fb00 30 3b 20 2f 2a 20 6e 6f 20 63 6f 6c 75 6d 6e 73  0; /* no columns
2fb10 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20  , no error */.  
2fb20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2fb30 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 42 79 74 65  _malloc64( nByte
2fb40 2a 32 20 2b 20 32 30 20 2b 20 6e 43 6f 6c 2a 32  *2 + 20 + nCol*2
2fb50 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   );.    if( zSql
2fb60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 78 43 6c  ==0 ){.      xCl
2fb70 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20  oser(sCtx.in);. 
2fb80 20 20 20 20 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f       shell_out_o
2fb90 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20  f_memory();.    
2fba0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  }.    sqlite3_sn
2fbb0 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 32 30 2c  printf(nByte+20,
2fbc0 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 49   zSql, "INSERT I
2fbd0 4e 54 4f 20 5c 22 25 77 5c 22 20 56 41 4c 55 45  NTO \"%w\" VALUE
2fbe0 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  S(?", zTable);. 
2fbf0 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28     j = strlen30(
2fc00 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69  zSql);.    for(i
2fc10 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =1; i<nCol; i++)
2fc20 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  {.      zSql[j++
2fc30 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a  ] = ',';.      z
2fc40 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a  Sql[j++] = '?';.
2fc50 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a      }.    zSql[j
2fc60 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a  ++] = ')';.    z
2fc70 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  Sql[j] = 0;.    
2fc80 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
2fc90 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
2fca0 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
2fcb0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
2fcc0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
2fcd0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2fce0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2fcf0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
2fd00 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
2fd10 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
2fd20 20 20 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c    if (pStmt) sql
2fd30 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
2fd40 74 6d 74 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f  tmt);.      xClo
2fd50 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20  ser(sCtx.in);.  
2fd60 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2fd70 20 20 7d 0a 20 20 20 20 6e 65 65 64 43 6f 6d 6d    }.    needComm
2fd80 69 74 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74  it = sqlite3_get
2fd90 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 70 2d 3e 64  _autocommit(p->d
2fda0 62 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64  b);.    if( need
2fdb0 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69 74 65 33  Commit ) sqlite3
2fdc0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 42 45  _exec(p->db, "BE
2fdd0 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  GIN", 0, 0, 0);.
2fde0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 6e      do{.      in
2fdf0 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 73 43  t startLine = sC
2fe00 74 78 2e 6e 4c 69 6e 65 3b 0a 20 20 20 20 20 20  tx.nLine;.      
2fe10 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
2fe20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
2fe30 68 61 72 20 2a 7a 20 3d 20 78 52 65 61 64 28 26  har *z = xRead(&
2fe40 73 43 74 78 29 3b 0a 20 20 20 20 20 20 20 20 2f  sCtx);.        /
2fe50 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 69 64  *.        ** Did
2fe60 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d 6f 66   we reach end-of
2fe70 2d 66 69 6c 65 20 62 65 66 6f 72 65 20 66 69 6e  -file before fin
2fe80 64 69 6e 67 20 61 6e 79 20 63 6f 6c 75 6d 6e 73  ding any columns
2fe90 3f 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20  ?.        ** If 
2fea0 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65 61 64  so, stop instead
2feb0 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67   of NULL filling
2fec0 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 63   the remaining c
2fed0 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 20 20 20 20  olumns..        
2fee0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  */.        if( z
2fef0 3d 3d 30 20 26 26 20 69 3d 3d 30 20 29 20 62 72  ==0 && i==0 ) br
2ff00 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a  eak;.        /*.
2ff10 20 20 20 20 20 20 20 20 2a 2a 20 44 69 64 20 77          ** Did w
2ff20 65 20 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66  e reach end-of-f
2ff30 69 6c 65 20 4f 52 20 65 6e 64 2d 6f 66 2d 6c 69  ile OR end-of-li
2ff40 6e 65 20 62 65 66 6f 72 65 20 66 69 6e 64 69 6e  ne before findin
2ff50 67 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a  g any.        **
2ff60 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 41 53 43 49   columns in ASCI
2ff70 49 20 6d 6f 64 65 3f 20 20 49 66 20 73 6f 2c 20  I mode?  If so, 
2ff80 73 74 6f 70 20 69 6e 73 74 65 61 64 20 6f 66 20  stop instead of 
2ff90 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67 0a 20 20 20  NULL filling.   
2ffa0 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 6d 61       ** the rema
2ffb0 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ining columns.. 
2ffc0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2ffd0 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d    if( p->mode==M
2ffe0 4f 44 45 5f 41 73 63 69 69 20 26 26 20 28 7a 3d  ODE_Ascii && (z=
2fff0 3d 30 20 7c 7c 20 7a 5b 30 5d 3d 3d 30 29 20 26  =0 || z[0]==0) &
30000 26 20 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  & i==0 ) break;.
30010 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
30020 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
30030 20 69 2b 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c   i+1, z, -1, SQL
30040 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
30050 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43          if( i<nC
30060 6f 6c 2d 31 20 26 26 20 73 43 74 78 2e 63 54 65  ol-1 && sCtx.cTe
30070 72 6d 21 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70  rm!=sCtx.cColSep
30080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
30090 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
300a0 2c 20 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74  , "%s:%d: expect
300b0 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75  ed %d columns bu
300c0 74 20 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20  t found %d - ". 
300d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
300e0 20 20 20 20 20 20 20 20 20 22 66 69 6c 6c 69 6e           "fillin
300f0 67 20 74 68 65 20 72 65 73 74 20 77 69 74 68 20  g the rest with 
30100 4e 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20  NULL\n",.       
30110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30120 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73     sCtx.zFile, s
30130 74 61 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20  tartLine, nCol, 
30140 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  i+1);.          
30150 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
30160 20 20 77 68 69 6c 65 28 20 69 3c 3d 6e 43 6f 6c    while( i<=nCol
30170 20 29 7b 20 73 71 6c 69 74 65 33 5f 62 69 6e 64   ){ sqlite3_bind
30180 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b  _null(pStmt, i);
30190 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20   i++; }.        
301a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
301b0 69 66 28 20 73 43 74 78 2e 63 54 65 72 6d 3d 3d  if( sCtx.cTerm==
301c0 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 7b 0a  sCtx.cColSep ){.
301d0 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
301e0 20 20 20 20 20 20 78 52 65 61 64 28 26 73 43 74        xRead(&sCt
301f0 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b  x);.          i+
30200 2b 3b 0a 20 20 20 20 20 20 20 20 7d 77 68 69 6c  +;.        }whil
30210 65 28 20 73 43 74 78 2e 63 54 65 72 6d 3d 3d 73  e( sCtx.cTerm==s
30220 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 3b 0a 20  Ctx.cColSep );. 
30230 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
30240 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25  tf(stderr, "%s:%
30250 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63  d: expected %d c
30260 6f 6c 75 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64  olumns but found
30270 20 25 64 20 2d 20 22 0a 20 20 20 20 20 20 20 20   %d - ".        
30280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30290 22 65 78 74 72 61 73 20 69 67 6e 6f 72 65 64 5c  "extras ignored\
302a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
302b0 20 20 20 20 20 20 20 20 20 20 20 20 73 43 74 78              sCtx
302c0 2e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e  .zFile, startLin
302d0 65 2c 20 6e 43 6f 6c 2c 20 69 29 3b 0a 20 20 20  e, nCol, i);.   
302e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
302f0 3e 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  >=nCol ){.      
30300 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
30310 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Stmt);.        r
30320 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
30330 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
30340 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30350 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
30360 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
30370 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 49 4e 53  err, "%s:%d: INS
30380 45 52 54 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e  ERT failed: %s\n
30390 22 2c 20 73 43 74 78 2e 7a 46 69 6c 65 2c 0a 20  ", sCtx.zFile,. 
303a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
303b0 20 20 20 20 20 73 74 61 72 74 4c 69 6e 65 2c 20       startLine, 
303c0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
303d0 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  ->db));.        
303e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77  }.      }.    }w
303f0 68 69 6c 65 28 20 73 43 74 78 2e 63 54 65 72 6d  hile( sCtx.cTerm
30400 21 3d 45 4f 46 20 29 3b 0a 0a 20 20 20 20 78 43  !=EOF );..    xC
30410 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a  loser(sCtx.in);.
30420 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
30430 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20 73 71  (sCtx.z);.    sq
30440 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
30450 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  Stmt);.    if( n
30460 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69  eedCommit ) sqli
30470 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
30480 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20  "COMMIT", 0, 0, 
30490 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66  0);.  }else..#if
304a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 54 45  ndef SQLITE_UNTE
304b0 53 54 41 42 4c 45 0a 20 20 69 66 28 20 63 3d 3d  STABLE.  if( c==
304c0 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'i' && strncmp(a
304d0 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 73 74  zArg[0], "impost
304e0 65 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  er", n)==0 ){.  
304f0 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
30500 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 69 73 74    char *zCollist
30510 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
30520 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
30530 20 20 20 69 6e 74 20 74 6e 75 6d 20 3d 20 30 3b     int tnum = 0;
30540 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
30550 69 66 28 20 21 28 6e 41 72 67 3d 3d 33 20 7c 7c  if( !(nArg==3 ||
30560 20 28 6e 41 72 67 3d 3d 32 20 26 26 20 73 71 6c   (nArg==2 && sql
30570 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 41  ite3_stricmp(azA
30580 72 67 5b 31 5d 2c 22 6f 66 66 22 29 3d 3d 30 29  rg[1],"off")==0)
30590 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  ) ){.      utf8_
305a0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
305b0 55 73 61 67 65 3a 20 2e 69 6d 70 6f 73 74 65 72  Usage: .imposter
305c0 20 49 4e 44 45 58 20 49 4d 50 4f 53 54 45 52 5c   INDEX IMPOSTER\
305d0 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
305e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
305f0 20 20 20 20 20 2e 69 6d 70 6f 73 74 65 72 20 6f       .imposter o
30600 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ff\n");.      rc
30610 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
30620 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
30630 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70  it;.    }.    op
30640 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
30650 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
30660 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65        sqlite3_te
30670 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
30680 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
30690 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69  TER, p->db, "mai
306a0 6e 22 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20  n", 0, 1);.     
306b0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
306c0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
306d0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
306e0 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
306f0 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20  T rootpage FROM 
30700 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
30710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30720 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
30730 45 20 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20  E name='%q' AND 
30740 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 61  type='index'", a
30750 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 73 71  zArg[1]);.    sq
30760 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
30770 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
30780 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
30790 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
307a0 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 73 71  Sql);.    if( sq
307b0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
307c0 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
307d0 0a 20 20 20 20 20 20 74 6e 75 6d 20 3d 20 73 71  .      tnum = sq
307e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
307f0 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
30800 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  }.    sqlite3_fi
30810 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
30820 20 20 20 69 66 28 20 74 6e 75 6d 3d 3d 30 20 29     if( tnum==0 )
30830 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
30840 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6e 6f 20  ntf(stderr, "no 
30850 73 75 63 68 20 69 6e 64 65 78 3a 20 5c 22 25 73  such index: \"%s
30860 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29  \"\n", azArg[1])
30870 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
30880 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
30890 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
308a0 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73    }.    zSql = s
308b0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
308c0 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e  PRAGMA index_xin
308d0 66 6f 3d 27 25 71 27 22 2c 20 61 7a 41 72 67 5b  fo='%q'", azArg[
308e0 31 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  1]);.    rc = sq
308f0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
30900 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
30910 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
30920 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
30930 53 71 6c 29 3b 0a 20 20 20 20 69 20 3d 20 30 3b  Sql);.    i = 0;
30940 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69  .    while( sqli
30950 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
30960 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
30970 20 20 20 20 20 63 68 61 72 20 7a 4c 61 62 65 6c       char zLabel
30980 5b 32 30 5d 3b 0a 20 20 20 20 20 20 63 6f 6e 73  [20];.      cons
30990 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 28  t char *zCol = (
309a0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
309b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
309c0 70 53 74 6d 74 2c 32 29 3b 0a 20 20 20 20 20 20  pStmt,2);.      
309d0 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  i++;.      if( z
309e0 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col==0 ){.      
309f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f    if( sqlite3_co
30a00 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 31  lumn_int(pStmt,1
30a10 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  )==-1 ){.       
30a20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57 49     zCol = "_ROWI
30a30 44 5f 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  D_";.        }el
30a40 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
30a50 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
30a60 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 2c 7a 4c  izeof(zLabel),zL
30a70 61 62 65 6c 2c 22 65 78 70 72 25 64 22 2c 69 29  abel,"expr%d",i)
30a80 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c  ;.          zCol
30a90 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20   = zLabel;.     
30aa0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
30ab0 20 20 20 69 66 28 20 7a 43 6f 6c 6c 69 73 74 3d     if( zCollist=
30ac0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  =0 ){.        zC
30ad0 6f 6c 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  ollist = sqlite3
30ae0 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22  _mprintf("\"%w\"
30af0 22 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  ", zCol);.      
30b00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
30b10 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c 69 74 65  Collist = sqlite
30b20 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2c 5c 22  3_mprintf("%z,\"
30b30 25 77 5c 22 22 2c 20 7a 43 6f 6c 6c 69 73 74 2c  %w\"", zCollist,
30b40 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   zCol);.      }.
30b50 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
30b60 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
30b70 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  );.    zSql = sq
30b80 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
30b90 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
30ba0 20 54 41 42 4c 45 20 5c 22 25 77 5c 22 28 25 73   TABLE \"%w\"(%s
30bb0 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 25 73 29  ,PRIMARY KEY(%s)
30bc0 29 57 49 54 48 4f 55 54 20 52 4f 57 49 44 22 2c  )WITHOUT ROWID",
30bd0 0a 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67  .          azArg
30be0 5b 32 5d 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a  [2], zCollist, z
30bf0 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 73 71  Collist);.    sq
30c00 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c  lite3_free(zColl
30c10 69 73 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ist);.    rc = s
30c20 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
30c30 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
30c40 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
30c50 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 20  >db, "main", 1, 
30c60 74 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  tnum);.    if( r
30c70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30c80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
30c90 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
30ca0 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  Sql, 0, 0, 0);. 
30cb0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73       sqlite3_tes
30cc0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
30cd0 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
30ce0 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e  ER, p->db, "main
30cf0 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  ", 0, 0);.      
30d00 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
30d10 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
30d20 64 65 72 72 2c 20 22 45 72 72 6f 72 20 69 6e 20  derr, "Error in 
30d30 5b 25 73 5d 3a 20 25 73 5c 6e 22 2c 20 7a 53 71  [%s]: %s\n", zSq
30d40 6c 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  l, sqlite3_errms
30d50 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
30d60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30d70 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f  utf8_printf(stdo
30d80 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a 53 71  ut, "%s;\n", zSq
30d90 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  l);.        raw_
30da0 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 0a 20  printf(stdout,. 
30db0 20 20 20 20 20 20 20 20 20 20 22 57 41 52 4e 49            "WARNI
30dc0 4e 47 3a 20 77 72 69 74 69 6e 67 20 74 6f 20 61  NG: writing to a
30dd0 6e 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  n imposter table
30de0 20 77 69 6c 6c 20 63 6f 72 72 75 70 74 20 74 68   will corrupt th
30df0 65 20 69 6e 64 65 78 21 5c 6e 22 0a 20 20 20 20  e index!\n".    
30e00 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
30e10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30e20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
30e30 72 2c 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43  r, "SQLITE_TESTC
30e40 54 52 4c 5f 49 4d 50 4f 53 54 45 52 20 72 65 74  TRL_IMPOSTER ret
30e50 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29 3b  urns %d\n", rc);
30e60 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
30e70 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
30e80 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d  _free(zSql);.  }
30e90 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 21  else.#endif /* !
30ea0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
30eb0 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c  MIT_TEST_CONTROL
30ec0 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  ) */..#ifdef SQL
30ed0 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
30ee0 43 45 0a 20 20 69 66 28 20 63 3d 3d 27 69 27 20  CE.  if( c=='i' 
30ef0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
30f00 5b 30 5d 2c 20 22 69 6f 74 72 61 63 65 22 2c 20  [0], "iotrace", 
30f10 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 51 4c  n)==0 ){.    SQL
30f20 49 54 45 5f 41 50 49 20 65 78 74 65 72 6e 20 76  ITE_API extern v
30f30 6f 69 64 20 28 53 51 4c 49 54 45 5f 43 44 45 43  oid (SQLITE_CDEC
30f40 4c 20 2a 73 71 6c 69 74 65 33 49 6f 54 72 61 63  L *sqlite3IoTrac
30f50 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  e)(const char*, 
30f60 2e 2e 2e 29 3b 0a 20 20 20 20 69 66 28 20 69 6f  ...);.    if( io
30f70 74 72 61 63 65 20 26 26 20 69 6f 74 72 61 63 65  trace && iotrace
30f80 21 3d 73 74 64 6f 75 74 20 29 20 66 63 6c 6f 73  !=stdout ) fclos
30f90 65 28 69 6f 74 72 61 63 65 29 3b 0a 20 20 20 20  e(iotrace);.    
30fa0 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  iotrace = 0;.   
30fb0 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20   if( nArg<2 ){. 
30fc0 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72       sqlite3IoTr
30fd0 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ace = 0;.    }el
30fe0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a  se if( strcmp(az
30ff0 41 72 67 5b 31 5d 2c 20 22 2d 22 29 3d 3d 30 20  Arg[1], "-")==0 
31000 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
31010 49 6f 54 72 61 63 65 20 3d 20 69 6f 74 72 61 63  IoTrace = iotrac
31020 65 50 72 69 6e 74 66 3b 0a 20 20 20 20 20 20 69  ePrintf;.      i
31030 6f 74 72 61 63 65 20 3d 20 73 74 64 6f 75 74 3b  otrace = stdout;
31040 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
31050 20 20 69 6f 74 72 61 63 65 20 3d 20 66 6f 70 65    iotrace = fope
31060 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 77 22 29  n(azArg[1], "w")
31070 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6f 74 72  ;.      if( iotr
31080 61 63 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ace==0 ){.      
31090 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
310a0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61  derr, "Error: ca
310b0 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22  nnot open \"%s\"
310c0 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  \n", azArg[1]);.
310d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
310e0 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  oTrace = 0;.    
310f0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
31100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31110 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20   sqlite3IoTrace 
31120 3d 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66 3b  = iotracePrintf;
31130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
31140 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
31150 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 6e   if( c=='l' && n
31160 3e 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=5 && strncmp(a
31170 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6d 69 74 73  zArg[0], "limits
31180 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
31190 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
311a0 75 63 74 20 7b 0a 20 20 20 20 20 20 20 63 6f 6e  uct {.       con
311b0 73 74 20 63 68 61 72 20 2a 7a 4c 69 6d 69 74 4e  st char *zLimitN
311c0 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame;   /* Name o
311d0 66 20 61 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20  f a limit */.   
311e0 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 43 6f 64      int limitCod
311f0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
31200 20 49 6e 74 65 67 65 72 20 63 6f 64 65 20 66 6f   Integer code fo
31210 72 20 74 68 61 74 20 6c 69 6d 69 74 20 2a 2f 0a  r that limit */.
31220 20 20 20 20 7d 20 61 4c 69 6d 69 74 5b 5d 20 3d      } aLimit[] =
31230 20 7b 0a 20 20 20 20 20 20 7b 20 22 6c 65 6e 67   {.      { "leng
31240 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  th",            
31250 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
31260 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20 20  _LENGTH         
31270 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
31280 20 20 20 20 7b 20 22 73 71 6c 5f 6c 65 6e 67 74      { "sql_lengt
31290 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53  h",            S
312a0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f  QLITE_LIMIT_SQL_
312b0 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20  LENGTH          
312c0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
312d0 20 22 63 6f 6c 75 6d 6e 22 2c 20 20 20 20 20 20   "column",      
312e0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
312f0 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20 20  _LIMIT_COLUMN   
31300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31310 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 65 78 70   },.      { "exp
31320 72 5f 64 65 70 74 68 22 2c 20 20 20 20 20 20 20  r_depth",       
31330 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
31340 54 5f 45 58 50 52 5f 44 45 50 54 48 20 20 20 20  T_EXPR_DEPTH    
31350 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
31360 20 20 20 20 20 7b 20 22 63 6f 6d 70 6f 75 6e 64       { "compound
31370 5f 73 65 6c 65 63 74 22 2c 20 20 20 20 20 20 20  _select",       
31380 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
31390 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 20 20 20  POUND_SELECT    
313a0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
313b0 7b 20 22 76 64 62 65 5f 6f 70 22 2c 20 20 20 20  { "vdbe_op",    
313c0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
313d0 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 20  E_LIMIT_VDBE_OP 
313e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
313f0 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 66 75    },.      { "fu
31400 6e 63 74 69 6f 6e 5f 61 72 67 22 2c 20 20 20 20  nction_arg",    
31410 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
31420 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  IT_FUNCTION_ARG 
31430 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
31440 20 20 20 20 20 20 7b 20 22 61 74 74 61 63 68 65        { "attache
31450 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  d",             
31460 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54   SQLITE_LIMIT_AT
31470 54 41 43 48 45 44 20 20 20 20 20 20 20 20 20 20  TACHED          
31480 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
31490 20 7b 20 22 6c 69 6b 65 5f 70 61 74 74 65 72 6e   { "like_pattern
314a0 5f 6c 65 6e 67 74 68 22 2c 20 20 20 53 51 4c 49  _length",   SQLI
314b0 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41  TE_LIMIT_LIKE_PA
314c0 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20 20 20  TTERN_LENGTH    
314d0 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 76     },.      { "v
314e0 61 72 69 61 62 6c 65 5f 6e 75 6d 62 65 72 22 2c  ariable_number",
314f0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
31500 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
31510 42 45 52 20 20 20 20 20 20 20 20 20 20 20 7d 2c  BER           },
31520 0a 20 20 20 20 20 20 7b 20 22 74 72 69 67 67 65  .      { "trigge
31530 72 5f 64 65 70 74 68 22 2c 20 20 20 20 20 20 20  r_depth",       
31540 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54    SQLITE_LIMIT_T
31550 52 49 47 47 45 52 5f 44 45 50 54 48 20 20 20 20  RIGGER_DEPTH    
31560 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
31570 20 20 7b 20 22 77 6f 72 6b 65 72 5f 74 68 72 65    { "worker_thre
31580 61 64 73 22 2c 20 20 20 20 20 20 20 20 53 51 4c  ads",        SQL
31590 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
315a0 5f 54 48 52 45 41 44 53 20 20 20 20 20 20 20 20  _THREADS        
315b0 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20      },.    };.  
315c0 20 20 69 6e 74 20 69 2c 20 6e 32 3b 0a 20 20 20    int i, n2;.   
315d0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
315e0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 31 20      if( nArg==1 
315f0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
31600 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4c  ; i<ArraySize(aL
31610 69 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  imit); i++){.   
31620 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 32 30       printf("%20
31630 73 20 25 64 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b  s %d\n", aLimit[
31640 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20  i].zLimitName,. 
31650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
31660 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64  lite3_limit(p->d
31670 62 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e 6c 69 6d  b, aLimit[i].lim
31680 69 74 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20  itCode, -1));.  
31690 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
316a0 69 66 28 20 6e 41 72 67 3e 33 20 29 7b 0a 20 20  if( nArg>3 ){.  
316b0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
316c0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
316d0 6c 69 6d 69 74 20 4e 41 4d 45 20 3f 4e 45 57 2d  limit NAME ?NEW-
316e0 56 41 4c 55 45 3f 5c 6e 22 29 3b 0a 20 20 20 20  VALUE?\n");.    
316f0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
31700 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
31710 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 65 6c 73  d_exit;.    }els
31720 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 69  e{.      int iLi
31730 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mit = -1;.      
31740 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a  n2 = strlen30(az
31750 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 66  Arg[1]);.      f
31760 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
31770 69 7a 65 28 61 4c 69 6d 69 74 29 3b 20 69 2b 2b  ize(aLimit); i++
31780 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
31790 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
317a0 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74  aLimit[i].zLimit
317b0 4e 61 6d 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20  Name, azArg[1], 
317c0 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
317d0 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 30      if( iLimit<0
317e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
317f0 69 4c 69 6d 69 74 20 3d 20 69 3b 0a 20 20 20 20  iLimit = i;.    
31800 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31810 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
31820 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 61 6d  intf(stderr, "am
31830 62 69 67 75 6f 75 73 20 6c 69 6d 69 74 3a 20 5c  biguous limit: \
31840 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  "%s\"\n", azArg[
31850 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1]);.           
31860 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
31870 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
31880 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
31890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
318a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
318b0 20 69 66 28 20 69 4c 69 6d 69 74 3c 30 20 29 7b   if( iLimit<0 ){
318c0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
318d0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e  intf(stderr, "un
318e0 6b 6e 6f 77 6e 20 6c 69 6d 69 74 3a 20 5c 22 25  known limit: \"%
318f0 73 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  s\"\n".         
31900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
31910 65 6e 74 65 72 20 5c 22 2e 6c 69 6d 69 74 73 5c  enter \".limits\
31920 22 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65  " with no argume
31930 6e 74 73 20 66 6f 72 20 61 20 6c 69 73 74 2e 5c  nts for a list.\
31940 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
31950 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41               azA
31960 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[1]);.        
31970 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
31980 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
31990 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
319a0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d        if( nArg==
319b0 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  3 ){.        sql
319c0 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62  ite3_limit(p->db
319d0 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d  , aLimit[iLimit]
319e0 2e 6c 69 6d 69 74 43 6f 64 65 2c 0a 20 20 20 20  .limitCode,.    
319f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a00 20 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61    (int)integerVa
31a10 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 29 3b 0a  lue(azArg[2]));.
31a20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72        }.      pr
31a30 69 6e 74 66 28 22 25 32 30 73 20 25 64 5c 6e 22  intf("%20s %d\n"
31a40 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d  , aLimit[iLimit]
31a50 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20 20 20  .zLimitName,.   
31a60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31a70 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61  3_limit(p->db, a
31a80 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69  Limit[iLimit].li
31a90 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20  mitCode, -1));. 
31aa0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
31ab0 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 6e 3e  if( c=='l' && n>
31ac0 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  2 && strncmp(azA
31ad0 72 67 5b 30 5d 2c 20 22 6c 69 6e 74 22 2c 20 6e  rg[0], "lint", n
31ae0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e  )==0 ){.    open
31af0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6c  _db(p, 0);.    l
31b00 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c  intDotCommand(p,
31b10 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20   azArg, nArg);. 
31b20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20   }else..#ifndef 
31b30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
31b40 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 69 66 28  _EXTENSION.  if(
31b50 20 63 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e 63   c=='l' && strnc
31b60 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f  mp(azArg[0], "lo
31b70 61 64 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ad", n)==0 ){.  
31b80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
31b90 69 6c 65 2c 20 2a 7a 50 72 6f 63 3b 0a 20 20 20  ile, *zProc;.   
31ba0 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
31bb0 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   0;.    if( nArg
31bc0 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  <2 ){.      raw_
31bd0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
31be0 55 73 61 67 65 3a 20 2e 6c 6f 61 64 20 46 49 4c  Usage: .load FIL
31bf0 45 20 3f 45 4e 54 52 59 50 4f 49 4e 54 3f 5c 6e  E ?ENTRYPOINT?\n
31c00 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
31c10 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
31c20 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
31c30 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65 20      }.    zFile 
31c40 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
31c50 7a 50 72 6f 63 20 3d 20 6e 41 72 67 3e 3d 33 20  zProc = nArg>=3 
31c60 3f 20 61 7a 41 72 67 5b 32 5d 20 3a 20 30 3b 0a  ? azArg[2] : 0;.
31c70 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
31c80 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
31c90 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  te3_load_extensi
31ca0 6f 6e 28 70 2d 3e 64 62 2c 20 7a 46 69 6c 65 2c  on(p->db, zFile,
31cb0 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67   zProc, &zErrMsg
31cc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
31cd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31ce0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
31cf0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
31d00 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  \n", zErrMsg);. 
31d10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
31d20 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
31d30 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
31d40 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
31d50 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20    if( c=='l' && 
31d60 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
31d70 2c 20 22 6c 6f 67 22 2c 20 6e 29 3d 3d 30 20 29  , "log", n)==0 )
31d80 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d  {.    if( nArg!=
31d90 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  2 ){.      raw_p
31da0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
31db0 73 61 67 65 3a 20 2e 6c 6f 67 20 46 49 4c 45 4e  sage: .log FILEN
31dc0 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  AME\n");.      r
31dd0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
31de0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
31df0 61 72 20 2a 7a 46 69 6c 65 20 3d 20 61 7a 41 72  ar *zFile = azAr
31e00 67 5b 31 5d 3b 0a 20 20 20 20 20 20 6f 75 74 70  g[1];.      outp
31e10 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d  ut_file_close(p-
31e20 3e 70 4c 6f 67 29 3b 0a 20 20 20 20 20 20 70 2d  >pLog);.      p-
31e30 3e 70 4c 6f 67 20 3d 20 6f 75 74 70 75 74 5f 66  >pLog = output_f
31e40 69 6c 65 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c 20  ile_open(zFile, 
31e50 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0);.    }.  }els
31e60 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6d 27 20  e..  if( c=='m' 
31e70 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
31e80 5b 30 5d 2c 20 22 6d 6f 64 65 22 2c 20 6e 29 3d  [0], "mode", n)=
31e90 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
31ea0 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 6e 41  char *zMode = nA
31eb0 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d  rg>=2 ? azArg[1]
31ec0 20 3a 20 22 22 3b 0a 20 20 20 20 69 6e 74 20 6e   : "";.    int n
31ed0 32 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4d 6f  2 = strlen30(zMo
31ee0 64 65 29 3b 0a 20 20 20 20 69 6e 74 20 63 32 20  de);.    int c2 
31ef0 3d 20 7a 4d 6f 64 65 5b 30 5d 3b 0a 20 20 20 20  = zMode[0];.    
31f00 69 66 28 20 63 32 3d 3d 27 6c 27 20 26 26 20 6e  if( c2=='l' && n
31f10 32 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61  2>2 && strncmp(a
31f20 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e 65 73 22 2c  zArg[1],"lines",
31f30 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
31f40 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c  p->mode = MODE_L
31f50 69 6e 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ine;.      sqlit
31f60 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
31f70 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
31f80 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
31f90 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a  ator, SEP_Row);.
31fa0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
31fb0 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70  =='c' && strncmp
31fc0 28 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d  (azArg[1],"colum
31fd0 6e 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  ns",n2)==0 ){.  
31fe0 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
31ff0 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  DE_Column;.     
32000 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
32010 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53  f(sizeof(p->rowS
32020 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f  eparator), p->ro
32030 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  wSeparator, SEP_
32040 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Row);.    }else 
32050 69 66 28 20 63 32 3d 3d 27 6c 27 20 26 26 20 6e  if( c2=='l' && n
32060 32 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61  2>2 && strncmp(a
32070 7a 41 72 67 5b 31 5d 2c 22 6c 69 73 74 22 2c 6e  zArg[1],"list",n
32080 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
32090 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69  ->mode = MODE_Li
320a0 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  st;.      sqlite
320b0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
320c0 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  f(p->colSeparato
320d0 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  r), p->colSepara
320e0 74 6f 72 2c 20 53 45 50 5f 43 6f 6c 75 6d 6e 29  tor, SEP_Column)
320f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
32100 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
32110 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
32120 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
32130 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20  r, SEP_Row);.   
32140 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
32150 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  h' && strncmp(az
32160 41 72 67 5b 31 5d 2c 22 68 74 6d 6c 22 2c 6e 32  Arg[1],"html",n2
32170 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
32180 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 48 74 6d  >mode = MODE_Htm
32190 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
321a0 20 63 32 3d 3d 27 74 27 20 26 26 20 73 74 72 6e   c2=='t' && strn
321b0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 63  cmp(azArg[1],"tc
321c0 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  l",n2)==0 ){.   
321d0 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
321e0 45 5f 54 63 6c 3b 0a 20 20 20 20 20 20 73 71 6c  E_Tcl;.      sql
321f0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
32200 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72  zeof(p->colSepar
32210 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70  ator), p->colSep
32220 61 72 61 74 6f 72 2c 20 53 45 50 5f 53 70 61 63  arator, SEP_Spac
32230 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
32240 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
32250 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
32260 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
32270 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20  tor, SEP_Row);. 
32280 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
32290 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='c' && strncmp(
322a0 61 7a 41 72 67 5b 31 5d 2c 22 63 73 76 22 2c 6e  azArg[1],"csv",n
322b0 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
322c0 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 73  ->mode = MODE_Cs
322d0 76 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  v;.      sqlite3
322e0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
322f0 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
32300 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ), p->colSeparat
32310 6f 72 2c 20 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a  or, SEP_Comma);.
32320 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
32330 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
32340 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
32350 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
32360 20 53 45 50 5f 43 72 4c 66 29 3b 0a 20 20 20 20   SEP_CrLf);.    
32370 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 74  }else if( c2=='t
32380 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
32390 72 67 5b 31 5d 2c 22 74 61 62 73 22 2c 6e 32 29  rg[1],"tabs",n2)
323a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
323b0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74  mode = MODE_List
323c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
323d0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
323e0 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
323f0 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
32400 72 2c 20 53 45 50 5f 54 61 62 29 3b 0a 20 20 20  r, SEP_Tab);.   
32410 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
32420 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  i' && strncmp(az
32430 41 72 67 5b 31 5d 2c 22 69 6e 73 65 72 74 22 2c  Arg[1],"insert",
32440 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
32450 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49  p->mode = MODE_I
32460 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 73 65 74  nsert;.      set
32470 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70 2c 20 6e  _table_name(p, n
32480 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32  Arg>=3 ? azArg[2
32490 5d 20 3a 20 22 74 61 62 6c 65 22 29 3b 0a 20 20  ] : "table");.  
324a0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d    }else if( c2==
324b0 27 71 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'q' && strncmp(a
324c0 7a 41 72 67 5b 31 5d 2c 22 71 75 6f 74 65 22 2c  zArg[1],"quote",
324d0 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
324e0 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 51  p->mode = MODE_Q
324f0 75 6f 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20  uote;.    }else 
32500 69 66 28 20 63 32 3d 3d 27 61 27 20 26 26 20 73  if( c2=='a' && s
32510 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
32520 22 61 73 63 69 69 22 2c 6e 32 29 3d 3d 30 20 29  "ascii",n2)==0 )
32530 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
32540 3d 20 4d 4f 44 45 5f 41 73 63 69 69 3b 0a 20 20  = MODE_Ascii;.  
32550 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
32560 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63  intf(sizeof(p->c
32570 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  olSeparator), p-
32580 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53  >colSeparator, S
32590 45 50 5f 55 6e 69 74 29 3b 0a 20 20 20 20 20 20  EP_Unit);.      
325a0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
325b0 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65  (sizeof(p->rowSe
325c0 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77  parator), p->row
325d0 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52  Separator, SEP_R
325e0 65 63 6f 72 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ecord);.    }els
325f0 65 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b  e if( nArg==1 ){
32600 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
32610 66 28 70 2d 3e 6f 75 74 2c 20 22 63 75 72 72 65  f(p->out, "curre
32620 6e 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 3a 20  nt output mode: 
32630 25 73 5c 6e 22 2c 20 6d 6f 64 65 44 65 73 63 72  %s\n", modeDescr
32640 5b 70 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20 20 20  [p->mode]);.    
32650 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
32660 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
32670 22 45 72 72 6f 72 3a 20 6d 6f 64 65 20 73 68 6f  "Error: mode sho
32680 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22  uld be one of: "
32690 0a 20 20 20 20 20 20 20 20 20 22 61 73 63 69 69  .         "ascii
326a0 20 63 6f 6c 75 6d 6e 20 63 73 76 20 68 74 6d 6c   column csv html
326b0 20 69 6e 73 65 72 74 20 6c 69 6e 65 20 6c 69 73   insert line lis
326c0 74 20 71 75 6f 74 65 20 74 61 62 73 20 74 63 6c  t quote tabs tcl
326d0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
326e0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d   1;.    }.    p-
326f0 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  >cMode = p->mode
32700 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
32710 20 63 3d 3d 27 6e 27 20 26 26 20 73 74 72 6e 63   c=='n' && strnc
32720 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6e 75  mp(azArg[0], "nu
32730 6c 6c 76 61 6c 75 65 22 2c 20 6e 29 3d 3d 30 20  llvalue", n)==0 
32740 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
32750 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =2 ){.      sqli
32760 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
32770 65 6f 66 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  eof(p->nullValue
32780 29 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c  ), p->nullValue,
32790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
327a0 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20          "%.*s", 
327b0 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70  (int)ArraySize(p
327c0 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 2d 31 2c 20  ->nullValue)-1, 
327d0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d  azArg[1]);.    }
327e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
327f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
32800 55 73 61 67 65 3a 20 2e 6e 75 6c 6c 76 61 6c 75  Usage: .nullvalu
32810 65 20 53 54 52 49 4e 47 5c 6e 22 29 3b 0a 20 20  e STRING\n");.  
32820 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
32830 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
32840 20 63 3d 3d 27 6f 27 20 26 26 20 73 74 72 6e 63   c=='o' && strnc
32850 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 70  mp(azArg[0], "op
32860 65 6e 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 3e  en", n)==0 && n>
32870 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =2 ){.    char *
32880 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 20 20 2f  zNewFilename;  /
32890 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
328a0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
328b0 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  pen */.    int i
328c0 4e 61 6d 65 20 3d 20 31 3b 20 20 20 20 20 20 20  Name = 1;       
328d0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 7a 41 72  /* Index in azAr
328e0 67 5b 5d 20 6f 66 20 74 68 65 20 66 69 6c 65 6e  g[] of the filen
328f0 61 6d 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ame */.    int n
32900 65 77 46 6c 61 67 20 3d 20 30 3b 20 20 20 20 20  ewFlag = 0;     
32910 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65 74  /* True to delet
32920 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 6f 70  e file before op
32930 65 6e 69 6e 67 20 2a 2f 0a 20 20 20 20 2f 2a 20  ening */.    /* 
32940 43 6c 6f 73 65 20 74 68 65 20 65 78 69 73 74 69  Close the existi
32950 6e 67 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ng database */. 
32960 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65     session_close
32970 5f 61 6c 6c 28 70 29 3b 0a 20 20 20 20 63 6c 6f  _all(p);.    clo
32980 73 65 5f 64 62 28 70 2d 3e 64 62 29 3b 0a 20 20  se_db(p->db);.  
32990 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 20    p->db = 0;.   
329a0 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20   p->zDbFilename 
329b0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
329c0 5f 66 72 65 65 28 70 2d 3e 7a 46 72 65 65 4f 6e  _free(p->zFreeOn
329d0 43 6c 6f 73 65 29 3b 0a 20 20 20 20 70 2d 3e 7a  Close);.    p->z
329e0 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b  FreeOnClose = 0;
329f0 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65  .    p->openMode
32a00 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e   = SHELL_OPEN_UN
32a10 53 50 45 43 3b 0a 20 20 20 20 2f 2a 20 43 68 65  SPEC;.    /* Che
32a20 63 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 2d 6c  ck for command-l
32a30 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ine arguments */
32a40 0a 20 20 20 20 66 6f 72 28 69 4e 61 6d 65 3d 31  .    for(iName=1
32a50 3b 20 69 4e 61 6d 65 3c 6e 41 72 67 20 26 26 20  ; iName<nArg && 
32a60 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 5b 30 5d 3d  azArg[iName][0]=
32a70 3d 27 2d 27 3b 20 69 4e 61 6d 65 2b 2b 29 7b 0a  ='-'; iName++){.
32a80 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
32a90 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 4e 61 6d   *z = azArg[iNam
32aa0 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70  e];.      if( op
32ab0 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 22 6e 65 77  tionMatch(z,"new
32ac0 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  ") ){.        ne
32ad0 77 46 6c 61 67 20 3d 20 31 3b 0a 23 69 66 64 65  wFlag = 1;.#ifde
32ae0 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c  f SQLITE_HAVE_ZL
32af0 49 42 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  IB.      }else i
32b00 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a  f( optionMatch(z
32b10 2c 20 22 7a 69 70 22 29 20 29 7b 0a 20 20 20 20  , "zip") ){.    
32b20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20      p->openMode 
32b30 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50  = SHELL_OPEN_ZIP
32b40 46 49 4c 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20  FILE;.#endif.   
32b50 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 74     }else if( opt
32b60 69 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 61 70 70  ionMatch(z, "app
32b70 65 6e 64 22 29 20 29 7b 0a 20 20 20 20 20 20 20  end") ){.       
32b80 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53   p->openMode = S
32b90 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44  HELL_OPEN_APPEND
32ba0 56 46 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  VFS;.      }else
32bb0 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68   if( optionMatch
32bc0 28 7a 2c 20 22 72 65 61 64 6f 6e 6c 79 22 29 20  (z, "readonly") 
32bd0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70  ){.        p->op
32be0 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f  enMode = SHELL_O
32bf0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
32c00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
32c10 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]=='-' ){.     
32c20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
32c30 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20  tderr, "unknown 
32c40 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a  option: %s\n", z
32c50 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
32c60 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
32c70 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
32c80 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
32c90 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 66 69 6c  .    /* If a fil
32ca0 65 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69  ename is specifi
32cb0 65 64 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ed, try to open 
32cc0 69 74 20 66 69 72 73 74 20 2a 2f 0a 20 20 20 20  it first */.    
32cd0 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 20 3d 20 6e  zNewFilename = n
32ce0 41 72 67 3e 69 4e 61 6d 65 20 3f 20 73 71 6c 69  Arg>iName ? sqli
32cf0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
32d00 2c 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 29 20  , azArg[iName]) 
32d10 3a 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65  : 0;.    if( zNe
32d20 77 46 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20  wFilename ){.   
32d30 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29     if( newFlag )
32d40 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65   shellDeleteFile
32d50 28 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a  (zNewFilename);.
32d60 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65        p->zDbFile
32d70 6e 61 6d 65 20 3d 20 7a 4e 65 77 46 69 6c 65 6e  name = zNewFilen
32d80 61 6d 65 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f  ame;.      open_
32d90 64 62 28 70 2c 20 4f 50 45 4e 5f 44 42 5f 4b 45  db(p, OPEN_DB_KE
32da0 45 50 41 4c 49 56 45 29 3b 0a 20 20 20 20 20 20  EPALIVE);.      
32db0 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a  if( p->db==0 ){.
32dc0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
32dd0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
32de0 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
32df0 27 25 73 27 5c 6e 22 2c 20 7a 4e 65 77 46 69 6c  '%s'\n", zNewFil
32e00 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
32e10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 65  sqlite3_free(zNe
32e20 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  wFilename);.    
32e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32e40 20 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65   p->zFreeOnClose
32e50 20 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b   = zNewFilename;
32e60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
32e70 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20     if( p->db==0 
32e80 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 73 20 61  ){.      /* As a
32e90 20 66 61 6c 6c 2d 62 61 63 6b 20 6f 70 65 6e 20   fall-back open 
32ea0 61 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  a TEMP database 
32eb0 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 46  */.      p->zDbF
32ec0 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ilename = 0;.   
32ed0 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
32ee0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
32ef0 0a 20 20 69 66 28 20 28 63 3d 3d 27 6f 27 0a 20  .  if( (c=='o'. 
32f00 20 20 20 20 20 20 20 26 26 20 28 73 74 72 6e 63         && (strnc
32f10 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 75  mp(azArg[0], "ou
32f20 74 70 75 74 22 2c 20 6e 29 3d 3d 30 7c 7c 73 74  tput", n)==0||st
32f30 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
32f40 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 29 29 0a  "once", n)==0)).
32f50 20 20 20 7c 7c 20 28 63 3d 3d 27 65 27 20 26 26     || (c=='e' &&
32f60 20 6e 3d 3d 35 20 26 26 20 73 74 72 63 6d 70 28   n==5 && strcmp(
32f70 61 7a 41 72 67 5b 30 5d 2c 22 65 78 63 65 6c 22  azArg[0],"excel"
32f80 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63  )==0).  ){.    c
32f90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
32fa0 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41   = nArg>=2 ? azA
32fb0 72 67 5b 31 5d 20 3a 20 22 73 74 64 6f 75 74 22  rg[1] : "stdout"
32fc0 3b 0a 20 20 20 20 69 6e 74 20 62 54 78 74 4d 6f  ;.    int bTxtMo
32fd0 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  de = 0;.    if( 
32fe0 61 7a 41 72 67 5b 30 5d 5b 30 5d 3d 3d 27 65 27  azArg[0][0]=='e'
32ff0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 61   ){.      /* Tra
33000 6e 73 66 6f 72 6d 20 74 68 65 20 22 2e 65 78 63  nsform the ".exc
33010 65 6c 22 20 63 6f 6d 6d 61 6e 64 20 69 6e 74 6f  el" command into
33020 20 22 2e 6f 6e 63 65 20 2d 78 22 20 2a 2f 0a 20   ".once -x" */. 
33030 20 20 20 20 20 6e 41 72 67 20 3d 20 32 3b 0a 20       nArg = 2;. 
33040 20 20 20 20 20 61 7a 41 72 67 5b 30 5d 20 3d 20       azArg[0] = 
33050 22 6f 6e 63 65 22 3b 0a 20 20 20 20 20 20 7a 46  "once";.      zF
33060 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 20 3d  ile = azArg[1] =
33070 20 22 2d 78 22 3b 0a 20 20 20 20 20 20 6e 20 3d   "-x";.      n =
33080 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   4;.    }.    if
33090 28 20 6e 41 72 67 3e 32 20 29 7b 0a 20 20 20 20  ( nArg>2 ){.    
330a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
330b0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 25  derr, "Usage: .%
330c0 73 20 5b 2d 65 7c 2d 78 7c 46 49 4c 45 5d 5c 6e  s [-e|-x|FILE]\n
330d0 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20  ", azArg[0]);.  
330e0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
330f0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
33100 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
33110 20 20 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73      if( n>1 && s
33120 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
33130 20 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 20 29   "once", n)==0 )
33140 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  {.      if( nArg
33150 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  <2 ){.        ra
33160 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
33170 20 22 55 73 61 67 65 3a 20 2e 6f 6e 63 65 20 28   "Usage: .once (
33180 2d 65 7c 2d 78 7c 46 49 4c 45 29 5c 6e 22 29 3b  -e|-x|FILE)\n");
33190 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
331a0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
331b0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
331c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
331d0 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20 32 3b 0a  ->outCount = 2;.
331e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
331f0 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20 30   p->outCount = 0
33200 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 75 74 70  ;.    }.    outp
33210 75 74 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20  ut_reset(p);.   
33220 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 27   if( zFile[0]=='
33230 2d 27 20 26 26 20 7a 46 69 6c 65 5b 31 5d 3d 3d  -' && zFile[1]==
33240 27 2d 27 20 29 20 7a 46 69 6c 65 2b 2b 3b 0a 23  '-' ) zFile++;.#
33250 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
33260 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20  HAVE_SYSTEM.    
33270 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
33280 2c 20 22 2d 65 22 29 3d 3d 30 20 7c 7c 20 73 74  , "-e")==0 || st
33290 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 2d 78 22  rcmp(zFile, "-x"
332a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
332b0 3e 64 6f 58 64 67 4f 70 65 6e 20 3d 20 31 3b 0a  >doXdgOpen = 1;.
332c0 20 20 20 20 20 20 6f 75 74 70 75 74 4d 6f 64 65        outputMode
332d0 50 75 73 68 28 70 29 3b 0a 20 20 20 20 20 20 69  Push(p);.      i
332e0 66 28 20 7a 46 69 6c 65 5b 31 5d 3d 3d 27 78 27  f( zFile[1]=='x'
332f0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 54   ){.        newT
33300 65 6d 70 46 69 6c 65 28 70 2c 20 22 63 73 76 22  empFile(p, "csv"
33310 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6d 6f  );.        p->mo
33320 64 65 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20  de = MODE_Csv;. 
33330 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
33340 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
33350 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c  ->colSeparator),
33360 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
33370 2c 20 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a 20 20  , SEP_Comma);.  
33380 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
33390 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
333a0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
333b0 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
333c0 20 53 45 50 5f 43 72 4c 66 29 3b 0a 20 20 20 20   SEP_CrLf);.    
333d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
333e0 20 6e 65 77 54 65 6d 70 46 69 6c 65 28 70 2c 20   newTempFile(p, 
333f0 22 74 78 74 22 29 3b 0a 20 20 20 20 20 20 20 20  "txt");.        
33400 62 54 78 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  bTxtMode = 1;.  
33410 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c      }.      zFil
33420 65 20 3d 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  e = p->zTempFile
33430 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
33440 2a 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f  * SQLITE_NOHAVE_
33450 53 59 53 54 45 4d 20 2a 2f 0a 20 20 20 20 69 66  SYSTEM */.    if
33460 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20  ( zFile[0]=='|' 
33470 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
33480 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20  _OMIT_POPEN.    
33490 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
334a0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 70 69 70  err, "Error: pip
334b0 65 73 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f  es are not suppo
334c0 72 74 65 64 20 69 6e 20 74 68 69 73 20 4f 53 5c  rted in this OS\
334d0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
334e0 31 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20  1;.      p->out 
334f0 3d 20 73 74 64 6f 75 74 3b 0a 23 65 6c 73 65 0a  = stdout;.#else.
33500 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 70        p->out = p
33510 6f 70 65 6e 28 7a 46 69 6c 65 20 2b 20 31 2c 20  open(zFile + 1, 
33520 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  "w");.      if( 
33530 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  p->out==0 ){.   
33540 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
33550 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
33560 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 70 69 70 65  cannot open pipe
33570 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c   \"%s\"\n", zFil
33580 65 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 20 20  e + 1);.        
33590 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b  p->out = stdout;
335a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
335b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
335c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
335d0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
335e0 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f 75  >outfile), p->ou
335f0 74 66 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46 69  tfile, "%s", zFi
33600 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  le);.      }.#en
33610 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
33620 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 6f 75       p->out = ou
33630 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a  tput_file_open(z
33640 46 69 6c 65 2c 20 62 54 78 74 4d 6f 64 65 29 3b  File, bTxtMode);
33650 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 75  .      if( p->ou
33660 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
33670 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
33680 2c 22 6f 66 66 22 29 21 3d 30 20 29 7b 0a 20 20  ,"off")!=0 ){.  
33690 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
336a0 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
336b0 72 3a 20 63 61 6e 6e 6f 74 20 77 72 69 74 65 20  r: cannot write 
336c0 74 6f 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46  to \"%s\"\n", zF
336d0 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ile);.        }.
336e0 20 20 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d          p->out =
336f0 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 20   stdout;.       
33700 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
33710 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
33720 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
33730 28 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69  (sizeof(p->outfi
33740 6c 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c  le), p->outfile,
33750 20 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20   "%s", zFile);. 
33760 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
33770 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
33780 70 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  p' && n>=3 && st
33790 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
337a0 22 70 72 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29  "print", n)==0 )
337b0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
337c0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
337d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
337e0 28 20 69 3e 31 20 29 20 72 61 77 5f 70 72 69 6e  ( i>1 ) raw_prin
337f0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29 3b  tf(p->out, " ");
33800 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
33810 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
33820 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
33830 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  }.    raw_printf
33840 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
33850 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
33860 3d 3d 27 70 27 20 26 26 20 73 74 72 6e 63 6d 70  =='p' && strncmp
33870 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70 72 6f 6d  (azArg[0], "prom
33880 70 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  pt", n)==0 ){.  
33890 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 32 29    if( nArg >= 2)
338a0 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79   {.      strncpy
338b0 28 6d 61 69 6e 50 72 6f 6d 70 74 2c 61 7a 41 72  (mainPrompt,azAr
338c0 67 5b 31 5d 2c 28 69 6e 74 29 41 72 72 61 79 53  g[1],(int)ArrayS
338d0 69 7a 65 28 6d 61 69 6e 50 72 6f 6d 70 74 29 2d  ize(mainPrompt)-
338e0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
338f0 28 20 6e 41 72 67 20 3e 3d 20 33 29 20 7b 0a 20  ( nArg >= 3) {. 
33900 20 20 20 20 20 73 74 72 6e 63 70 79 28 63 6f 6e       strncpy(con
33910 74 69 6e 75 65 50 72 6f 6d 70 74 2c 61 7a 41 72  tinuePrompt,azAr
33920 67 5b 32 5d 2c 28 69 6e 74 29 41 72 72 61 79 53  g[2],(int)ArrayS
33930 69 7a 65 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d  ize(continueProm
33940 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  pt)-1);.    }.  
33950 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
33960 27 71 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'q' && strncmp(a
33970 7a 41 72 67 5b 30 5d 2c 20 22 71 75 69 74 22 2c  zArg[0], "quit",
33980 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   n)==0 ){.    rc
33990 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20   = 2;.  }else.. 
339a0 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20 6e   if( c=='r' && n
339b0 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
339c0 7a 41 72 67 5b 30 5d 2c 20 22 72 65 61 64 22 2c  zArg[0], "read",
339d0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49   n)==0 ){.    FI
339e0 4c 45 20 2a 61 6c 74 3b 0a 20 20 20 20 69 66 28  LE *alt;.    if(
339f0 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20   nArg!=2 ){.    
33a00 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
33a10 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 72 65  err, "Usage: .re
33a20 61 64 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20 20  ad FILE\n");.   
33a30 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
33a40 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
33a50 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
33a60 20 20 20 61 6c 74 20 3d 20 66 6f 70 65 6e 28 61     alt = fopen(a
33a70 7a 41 72 67 5b 31 5d 2c 20 22 72 62 22 29 3b 0a  zArg[1], "rb");.
33a80 20 20 20 20 69 66 28 20 61 6c 74 3d 3d 30 20 29      if( alt==0 )
33a90 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
33aa0 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
33ab0 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  r: cannot open \
33ac0 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  "%s\"\n", azArg[
33ad0 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  1]);.      rc = 
33ae0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
33af0 20 20 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73      rc = process
33b00 5f 69 6e 70 75 74 28 70 2c 20 61 6c 74 29 3b 0a  _input(p, alt);.
33b10 20 20 20 20 20 20 66 63 6c 6f 73 65 28 61 6c 74        fclose(alt
33b20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
33b30 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72 27 20 26  ..  if( c=='r' &
33b40 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
33b50 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65 73  p(azArg[0], "res
33b60 74 6f 72 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  tore", n)==0 ){.
33b70 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
33b80 7a 53 72 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f  zSrcFile;.    co
33b90 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
33ba0 20 20 20 73 71 6c 69 74 65 33 20 2a 70 53 72 63     sqlite3 *pSrc
33bb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61  ;.    sqlite3_ba
33bc0 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20  ckup *pBackup;. 
33bd0 20 20 20 69 6e 74 20 6e 54 69 6d 65 6f 75 74 20     int nTimeout 
33be0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 6e 41  = 0;..    if( nA
33bf0 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 7a  rg==2 ){.      z
33c00 53 72 63 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b  SrcFile = azArg[
33c10 31 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20  1];.      zDb = 
33c20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 7d 65 6c 73  "main";.    }els
33c30 65 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b  e if( nArg==3 ){
33c40 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20  .      zSrcFile 
33c50 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20  = azArg[2];.    
33c60 20 20 7a 44 62 20 3d 20 61 7a 41 72 67 5b 31 5d    zDb = azArg[1]
33c70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
33c80 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
33c90 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 72  derr, "Usage: .r
33ca0 65 73 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45  estore ?DB? FILE
33cb0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
33cc0 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
33cd0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
33ce0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
33cf0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 53   sqlite3_open(zS
33d00 72 63 46 69 6c 65 2c 20 26 70 53 72 63 29 3b 0a  rcFile, &pSrc);.
33d10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33d20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
33d30 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
33d40 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
33d50 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
33d60 2c 20 7a 53 72 63 46 69 6c 65 29 3b 0a 20 20 20  , zSrcFile);.   
33d70 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 53 72 63     close_db(pSrc
33d80 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
33d90 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65  1;.    }.    ope
33da0 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
33db0 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65  pBackup = sqlite
33dc0 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 2d  3_backup_init(p-
33dd0 3e 64 62 2c 20 7a 44 62 2c 20 70 53 72 63 2c 20  >db, zDb, pSrc, 
33de0 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69 66 28  "main");.    if(
33df0 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20   pBackup==0 ){. 
33e00 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
33e10 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
33e20 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
33e30 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
33e40 20 20 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70        close_db(p
33e50 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Src);.      retu
33e60 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
33e70 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c  while( (rc = sql
33e80 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70  ite3_backup_step
33e90 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d  (pBackup,100))==
33ea0 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
33eb0 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54      || rc==SQLIT
33ec0 45 5f 42 55 53 59 20 20 29 7b 0a 20 20 20 20 20  E_BUSY  ){.     
33ed0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33ee0 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
33ef0 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e  if( nTimeout++ >
33f00 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  = 3 ) break;.   
33f10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65       sqlite3_sle
33f20 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20 20 7d  ep(100);.      }
33f30 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
33f40 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68  e3_backup_finish
33f50 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69  (pBackup);.    i
33f60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
33f70 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  NE ){.      rc =
33f80 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
33f90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
33fa0 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  Y || rc==SQLITE_
33fb0 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20  LOCKED ){.      
33fc0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
33fd0 72 2c 20 22 45 72 72 6f 72 3a 20 73 6f 75 72 63  r, "Error: sourc
33fe0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 62 75  e database is bu
33ff0 73 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  sy\n");.      rc
34000 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
34010 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
34020 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
34030 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
34040 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
34050 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
34060 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 5f      }.    close_
34070 64 62 28 70 53 72 63 29 3b 0a 20 20 7d 65 6c 73  db(pSrc);.  }els
34080 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  e..  if( c=='s' 
34090 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
340a0 5b 30 5d 2c 20 22 73 63 61 6e 73 74 61 74 73 22  [0], "scanstats"
340b0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
340c0 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
340d0 20 20 20 20 70 2d 3e 73 63 61 6e 73 74 61 74 73      p->scanstats
340e0 4f 6e 20 3d 20 28 75 38 29 62 6f 6f 6c 65 61 6e  On = (u8)boolean
340f0 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
34100 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
34110 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
34120 53 54 41 54 55 53 0a 20 20 20 20 20 20 72 61 77  STATUS.      raw
34130 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
34140 22 57 61 72 6e 69 6e 67 3a 20 2e 73 63 61 6e 73  "Warning: .scans
34150 74 61 74 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  tats not availab
34160 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  le in this build
34170 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  .\n");.#endif.  
34180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
34190 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
341a0 2c 20 22 55 73 61 67 65 3a 20 2e 73 63 61 6e 73  , "Usage: .scans
341b0 74 61 74 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  tats on|off\n");
341c0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
341d0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
341e0 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74  if( c=='s' && st
341f0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
34200 22 73 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20  "schema", n)==0 
34210 29 7b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74  ){.    ShellText
34220 20 73 53 65 6c 65 63 74 3b 0a 20 20 20 20 53 68   sSelect;.    Sh
34230 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20  ellState data;. 
34240 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
34250 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
34260 63 68 61 72 20 2a 7a 44 69 76 20 3d 20 22 28 22  char *zDiv = "("
34270 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
34280 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
34290 20 69 6e 74 20 69 53 63 68 65 6d 61 20 3d 20 30   int iSchema = 0
342a0 3b 0a 20 20 20 20 69 6e 74 20 62 44 65 62 75 67  ;.    int bDebug
342b0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69   = 0;.    int ii
342c0 3b 0a 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  ;..    open_db(p
342d0 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  , 0);.    memcpy
342e0 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f  (&data, p, sizeo
342f0 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61  f(data));.    da
34300 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  ta.showHeader = 
34310 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f 64  0;.    data.cMod
34320 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20  e = data.mode = 
34330 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69  MODE_Semi;.    i
34340 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65 63 74  nitText(&sSelect
34350 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 31 3b  );.    for(ii=1;
34360 20 69 69 3c 6e 41 72 67 3b 20 69 69 2b 2b 29 7b   ii<nArg; ii++){
34370 0a 20 20 20 20 20 20 69 66 28 20 6f 70 74 69 6f  .      if( optio
34380 6e 4d 61 74 63 68 28 61 7a 41 72 67 5b 69 69 5d  nMatch(azArg[ii]
34390 2c 22 69 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20  ,"indent") ){.  
343a0 20 20 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65        data.cMode
343b0 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d   = data.mode = M
343c0 4f 44 45 5f 50 72 65 74 74 79 3b 0a 20 20 20 20  ODE_Pretty;.    
343d0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69    }else if( opti
343e0 6f 6e 4d 61 74 63 68 28 61 7a 41 72 67 5b 69 69  onMatch(azArg[ii
343f0 5d 2c 22 64 65 62 75 67 22 29 20 29 7b 0a 20 20  ],"debug") ){.  
34400 20 20 20 20 20 20 62 44 65 62 75 67 20 3d 20 31        bDebug = 1
34410 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
34420 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
34430 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 61 7a        zName = az
34440 41 72 67 5b 69 69 5d 3b 0a 20 20 20 20 20 20 7d  Arg[ii];.      }
34450 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 61  else{.        ra
34460 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
34470 20 22 55 73 61 67 65 3a 20 2e 73 63 68 65 6d 61   "Usage: .schema
34480 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20 3f 4c 49 4b   ?--indent? ?LIK
34490 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a  E-PATTERN?\n");.
344a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
344b0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
344c0 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
344d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
344e0 20 20 69 66 28 20 7a 4e 61 6d 65 21 3d 30 20 29    if( zName!=0 )
344f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4d 61  {.      int isMa
34500 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 73  ster = sqlite3_s
34510 74 72 6c 69 6b 65 28 7a 4e 61 6d 65 2c 20 22 73  trlike(zName, "s
34520 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 27  qlite_master", '
34530 5c 5c 27 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69  \\')==0;.      i
34540 66 28 20 69 73 4d 61 73 74 65 72 20 7c 7c 20 73  f( isMaster || s
34550 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a  qlite3_strlike(z
34560 4e 61 6d 65 2c 22 73 71 6c 69 74 65 5f 74 65 6d  Name,"sqlite_tem
34570 70 5f 6d 61 73 74 65 72 22 2c 20 27 5c 5c 27 29  p_master", '\\')
34580 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
34590 68 61 72 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d  har *new_argv[2]
345a0 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a  , *new_colv[2];.
345b0 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76          new_argv
345c0 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  [0] = sqlite3_mp
345d0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
345e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 43 52               "CR
345f0 45 41 54 45 20 54 41 42 4c 45 20 25 73 20 28 5c  EATE TABLE %s (\
34600 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
34610 20 20 20 20 20 20 20 20 20 22 20 20 74 79 70 65           "  type
34620 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20   text,\n".      
34630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34640 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22  "  name text,\n"
34650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34660 20 20 20 20 20 20 20 22 20 20 74 62 6c 5f 6e 61         "  tbl_na
34670 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  me text,\n".    
34680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34690 20 20 22 20 20 72 6f 6f 74 70 61 67 65 20 69 6e    "  rootpage in
346a0 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20 20  teger,\n".      
346b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346c0 22 20 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20  "  sql text\n". 
346d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346e0 20 20 20 20 20 22 29 22 2c 20 69 73 4d 61 73 74       ")", isMast
346f0 65 72 20 3f 20 22 73 71 6c 69 74 65 5f 6d 61 73  er ? "sqlite_mas
34700 74 65 72 22 20 3a 20 22 73 71 6c 69 74 65 5f 74  ter" : "sqlite_t
34710 65 6d 70 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20  emp_master");.  
34720 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 31        new_argv[1
34730 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  ] = 0;.        n
34740 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71  ew_colv[0] = "sq
34750 6c 22 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f  l";.        new_
34760 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  colv[1] = 0;.   
34770 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 28 26 64       callback(&d
34780 61 74 61 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76  ata, 1, new_argv
34790 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20  , new_colv);.   
347a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
347b0 65 28 6e 65 77 5f 61 72 67 76 5b 30 5d 29 3b 0a  e(new_argv[0]);.
347c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
347d0 20 20 69 66 28 20 7a 44 69 76 20 29 7b 0a 20 20    if( zDiv ){.  
347e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
347f0 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20   *pStmt = 0;.   
34800 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
34810 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
34820 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46  , "SELECT name F
34830 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61 74 61 62  ROM pragma_datab
34840 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20  ase_list",.     
34850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34860 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53           -1, &pS
34870 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tmt, 0);.      i
34880 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
34890 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
348a0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
348b0 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
348c0 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
348d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
348e0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
348f0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
34900 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
34910 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
34920 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e     }.      appen
34930 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
34940 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d  "SELECT sql FROM
34950 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 53 63  ", 0);.      iSc
34960 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  hema = 0;.      
34970 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
34980 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
34990 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
349a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
349b0 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  b = (const char*
349c0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
349d0 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  text(pStmt, 0);.
349e0 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 53 63          char zSc
349f0 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20 20 20 20  Num[30];.       
34a00 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
34a10 66 28 73 69 7a 65 6f 66 28 7a 53 63 4e 75 6d 29  f(sizeof(zScNum)
34a20 2c 20 7a 53 63 4e 75 6d 2c 20 22 25 64 22 2c 20  , zScNum, "%d", 
34a30 2b 2b 69 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ++iSchema);.    
34a40 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
34a50 73 53 65 6c 65 63 74 2c 20 7a 44 69 76 2c 20 30  sSelect, zDiv, 0
34a60 29 3b 0a 20 20 20 20 20 20 20 20 7a 44 69 76 20  );.        zDiv 
34a70 3d 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 22 3b  = " UNION ALL ";
34a80 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
34a90 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53  ext(&sSelect, "S
34aa0 45 4c 45 43 54 20 73 68 65 6c 6c 5f 61 64 64 5f  ELECT shell_add_
34ab0 73 63 68 65 6d 61 28 73 71 6c 2c 22 2c 20 30 29  schema(sql,", 0)
34ac0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
34ad0 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 44  lite3_stricmp(zD
34ae0 62 2c 20 22 6d 61 69 6e 22 29 21 3d 30 20 29 7b  b, "main")!=0 ){
34af0 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e  .          appen
34b00 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
34b10 7a 44 62 2c 20 27 22 27 29 3b 0a 20 20 20 20 20  zDb, '"');.     
34b20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
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 4e 55 4c 4c 22 2c  sSelect, "NULL",
34b50 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
34b60 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
34b70 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2c 6e 61  t(&sSelect, ",na
34b80 6d 65 29 20 41 53 20 73 71 6c 2c 20 74 79 70 65  me) AS sql, type
34b90 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65  , tbl_name, name
34ba0 2c 20 72 6f 77 69 64 2c 22 2c 20 30 29 3b 0a 20  , rowid,", 0);. 
34bb0 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
34bc0 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 53 63 4e  t(&sSelect, zScN
34bd0 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  um, 0);.        
34be0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
34bf0 65 63 74 2c 20 22 20 41 53 20 73 6e 75 6d 2c 20  ect, " AS snum, 
34c00 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  ", 0);.        a
34c10 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
34c20 63 74 2c 20 7a 44 62 2c 20 27 5c 27 27 29 3b 0a  ct, zDb, '\'');.
34c30 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
34c40 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 41  xt(&sSelect, " A
34c50 53 20 73 6e 61 6d 65 20 46 52 4f 4d 20 22 2c 20  S sname FROM ", 
34c60 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  0);.        appe
34c70 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
34c80 20 7a 44 62 2c 20 27 22 27 29 3b 0a 20 20 20 20   zDb, '"');.    
34c90 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
34ca0 73 53 65 6c 65 63 74 2c 20 22 2e 73 71 6c 69 74  sSelect, ".sqlit
34cb0 65 5f 6d 61 73 74 65 72 22 2c 20 30 29 3b 0a 20  e_master", 0);. 
34cc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
34cd0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
34ce0 74 6d 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  tmt);.#ifdef SQL
34cf0 49 54 45 5f 49 4e 54 52 4f 53 50 45 43 54 49 4f  ITE_INTROSPECTIO
34d00 4e 5f 50 52 41 47 4d 41 53 0a 20 20 20 20 20 20  N_PRAGMAS.      
34d10 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
34d20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
34d30 26 73 53 65 6c 65 63 74 2c 0a 20 20 20 20 20 20  &sSelect,.      
34d40 20 20 20 20 20 22 20 55 4e 49 4f 4e 20 41 4c 4c       " UNION ALL
34d50 20 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f 6d 6f   SELECT shell_mo
34d60 64 75 6c 65 5f 73 63 68 65 6d 61 28 6e 61 6d 65  dule_schema(name
34d70 29 2c 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  ),".           "
34d80 20 27 74 61 62 6c 65 27 2c 20 6e 61 6d 65 2c 20   'table', name, 
34d90 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 39 65 2b 39  name, name, 9e+9
34da0 39 2c 20 27 6d 61 69 6e 27 20 46 52 4f 4d 20 70  9, 'main' FROM p
34db0 72 61 67 6d 61 5f 6d 6f 64 75 6c 65 5f 6c 69 73  ragma_module_lis
34dc0 74 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  t", 0);.      }.
34dd0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 70 70  #endif.      app
34de0 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
34df0 2c 20 22 29 20 57 48 45 52 45 20 22 2c 20 30 29  , ") WHERE ", 0)
34e00 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d  ;.      if( zNam
34e10 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  e ){.        cha
34e20 72 20 2a 7a 51 61 72 67 20 3d 20 73 71 6c 69 74  r *zQarg = sqlit
34e30 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 51 22 2c  e3_mprintf("%Q",
34e40 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
34e50 20 69 6e 74 20 62 47 6c 6f 62 20 3d 20 73 74 72   int bGlob = str
34e60 63 68 72 28 7a 4e 61 6d 65 2c 20 27 2a 27 29 20  chr(zName, '*') 
34e70 21 3d 20 30 20 7c 7c 20 73 74 72 63 68 72 28 7a  != 0 || strchr(z
34e80 4e 61 6d 65 2c 20 27 3f 27 29 20 21 3d 20 30 20  Name, '?') != 0 
34e90 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
34ea0 20 20 20 20 20 20 20 73 74 72 63 68 72 28 7a 4e         strchr(zN
34eb0 61 6d 65 2c 20 27 5b 27 29 20 21 3d 20 30 3b 0a  ame, '[') != 0;.
34ec0 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
34ed0 68 72 28 7a 4e 61 6d 65 2c 20 27 2e 27 29 20 29  hr(zName, '.') )
34ee0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65  {.          appe
34ef0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
34f00 20 22 6c 6f 77 65 72 28 70 72 69 6e 74 66 28 27   "lower(printf('
34f10 25 73 2e 25 73 27 2c 73 6e 61 6d 65 2c 74 62 6c  %s.%s',sname,tbl
34f20 5f 6e 61 6d 65 29 29 22 2c 20 30 29 3b 0a 20 20  _name))", 0);.  
34f30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34f40 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
34f50 74 28 26 73 53 65 6c 65 63 74 2c 20 22 6c 6f 77  t(&sSelect, "low
34f60 65 72 28 74 62 6c 5f 6e 61 6d 65 29 22 2c 20 30  er(tbl_name)", 0
34f70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
34f80 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
34f90 26 73 53 65 6c 65 63 74 2c 20 62 47 6c 6f 62 20  &sSelect, bGlob 
34fa0 3f 20 22 20 47 4c 4f 42 20 22 20 3a 20 22 20 4c  ? " GLOB " : " L
34fb0 49 4b 45 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  IKE ", 0);.     
34fc0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
34fd0 53 65 6c 65 63 74 2c 20 7a 51 61 72 67 2c 20 30  Select, zQarg, 0
34fe0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
34ff0 62 47 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 20  bGlob ){.       
35000 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
35010 53 65 6c 65 63 74 2c 20 22 20 45 53 43 41 50 45  Select, " ESCAPE
35020 20 27 5c 5c 27 20 22 2c 20 30 29 3b 0a 20 20 20   '\\' ", 0);.   
35030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
35040 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
35050 63 74 2c 20 22 20 41 4e 44 20 22 2c 20 30 29 3b  ct, " AND ", 0);
35060 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35070 5f 66 72 65 65 28 7a 51 61 72 67 29 3b 0a 20 20  _free(zQarg);.  
35080 20 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65      }.      appe
35090 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
350a0 20 22 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41   "type!='meta' A
350b0 4e 44 20 73 71 6c 20 49 53 20 4e 4f 54 20 4e 55  ND sql IS NOT NU
350c0 4c 4c 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL".            
350d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
350e0 20 4f 52 44 45 52 20 42 59 20 73 6e 75 6d 2c 20   ORDER BY snum, 
350f0 72 6f 77 69 64 22 2c 20 30 29 3b 0a 20 20 20 20  rowid", 0);.    
35100 20 20 69 66 28 20 62 44 65 62 75 67 20 29 7b 0a    if( bDebug ){.
35110 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
35120 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 53 51 4c  ntf(p->out, "SQL
35130 3a 20 25 73 3b 5c 6e 22 2c 20 73 53 65 6c 65 63  : %s;\n", sSelec
35140 74 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  t.z);.      }els
35150 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
35160 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
35170 64 62 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 63  db, sSelect.z, c
35180 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20  allback, &data, 
35190 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
351a0 20 7d 0a 20 20 20 20 20 20 66 72 65 65 54 65 78   }.      freeTex
351b0 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20  t(&sSelect);.   
351c0 20 7d 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d   }.    if( zErrM
351d0 73 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  sg ){.      utf8
351e0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  _printf(stderr,"
351f0 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  Error: %s\n", zE
35200 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71  rrMsg);.      sq
35210 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
35220 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  sg);.      rc = 
35230 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
35240 20 72 63 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc != SQLITE_OK
35250 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
35260 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
35270 6f 72 3a 20 71 75 65 72 79 69 6e 67 20 73 63 68  or: querying sch
35280 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c  ema information\
35290 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
352a0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
352b0 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
352c0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 20 64  }.  }else..#if d
352d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
352e0 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
352f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
35300 4c 45 43 54 54 52 41 43 45 29 0a 20 20 69 66 28  LECTTRACE).  if(
35310 20 63 3d 3d 27 73 27 20 26 26 20 6e 3d 3d 31 31   c=='s' && n==11
35320 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
35330 67 5b 30 5d 2c 20 22 73 65 6c 65 63 74 74 72 61  g[0], "selecttra
35340 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ce", n)==0 ){.  
35350 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54    sqlite3SelectT
35360 72 61 63 65 20 3d 20 28 69 6e 74 29 69 6e 74 65  race = (int)inte
35370 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  gerValue(azArg[1
35380 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ]);.  }else.#end
35390 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
353a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
353b0 53 53 49 4f 4e 29 0a 20 20 69 66 28 20 63 3d 3d  SSION).  if( c==
353c0 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
353d0 7a 41 72 67 5b 30 5d 2c 22 73 65 73 73 69 6f 6e  zArg[0],"session
353e0 22 2c 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d 33 20  ",n)==0 && n>=3 
353f0 29 7b 0a 20 20 20 20 4f 70 65 6e 53 65 73 73 69  ){.    OpenSessi
35400 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20 26  on *pSession = &
35410 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 30 5d 3b 0a  p->aSession[0];.
35420 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6d 64      char **azCmd
35430 20 3d 20 26 61 7a 41 72 67 5b 31 5d 3b 0a 20 20   = &azArg[1];.  
35440 20 20 69 6e 74 20 69 53 65 73 20 3d 20 30 3b 0a    int iSes = 0;.
35450 20 20 20 20 69 6e 74 20 6e 43 6d 64 20 3d 20 6e      int nCmd = n
35460 41 72 67 20 2d 20 31 3b 0a 20 20 20 20 69 6e 74  Arg - 1;.    int
35470 20 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   i;.    if( nArg
35480 3c 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73 69  <=1 ) goto sessi
35490 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  on_syntax_error;
354a0 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
354b0 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  0);.    if( nArg
354c0 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  >=3 ){.      for
354d0 28 69 53 65 73 3d 30 3b 20 69 53 65 73 3c 70 2d  (iSes=0; iSes<p-
354e0 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 53 65 73 2b  >nSession; iSes+
354f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
35500 73 74 72 63 6d 70 28 70 2d 3e 61 53 65 73 73 69  strcmp(p->aSessi
35510 6f 6e 5b 69 53 65 73 5d 2e 7a 4e 61 6d 65 2c 20  on[iSes].zName, 
35520 61 7a 41 72 67 5b 31 5d 29 3d 3d 30 20 29 20 62  azArg[1])==0 ) b
35530 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
35540 20 20 20 20 69 66 28 20 69 53 65 73 3c 70 2d 3e      if( iSes<p->
35550 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20  nSession ){.    
35560 20 20 20 20 70 53 65 73 73 69 6f 6e 20 3d 20 26      pSession = &
35570 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73  p->aSession[iSes
35580 5d 3b 0a 20 20 20 20 20 20 20 20 61 7a 43 6d 64  ];.        azCmd
35590 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 43 6d 64  ++;.        nCmd
355a0 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  --;.      }else{
355b0 0a 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f  .        pSessio
355c0 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e  n = &p->aSession
355d0 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 65  [0];.        iSe
355e0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
355f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 2e 73 65     }..    /* .se
35600 73 73 69 6f 6e 20 61 74 74 61 63 68 20 54 41 42  ssion attach TAB
35610 4c 45 0a 20 20 20 20 2a 2a 20 49 6e 76 6f 6b 65  LE.    ** Invoke
35620 20 74 68 65 20 73 71 6c 69 74 65 33 73 65 73 73   the sqlite3sess
35630 69 6f 6e 5f 61 74 74 61 63 68 28 29 20 69 6e 74  ion_attach() int
35640 65 72 66 61 63 65 20 74 6f 20 61 74 74 61 63 68  erface to attach
35650 20 61 20 70 61 72 74 69 63 75 6c 61 72 0a 20 20   a particular.  
35660 20 20 2a 2a 20 74 61 62 6c 65 20 73 6f 20 74 68    ** table so th
35670 61 74 20 69 74 20 69 73 20 6e 65 76 65 72 20 66  at it is never f
35680 69 6c 74 65 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  iltered..    */.
35690 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
356a0 7a 43 6d 64 5b 30 5d 2c 22 61 74 74 61 63 68 22  zCmd[0],"attach"
356b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
356c0 28 20 6e 43 6d 64 21 3d 32 20 29 20 67 6f 74 6f  ( nCmd!=2 ) goto
356d0 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
356e0 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  error;.      if(
356f0 20 70 53 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20   pSession->p==0 
35700 29 7b 0a 20 20 20 20 20 20 20 20 73 65 73 73 69  ){.        sessi
35710 6f 6e 5f 6e 6f 74 5f 6f 70 65 6e 3a 0a 20 20 20  on_not_open:.   
35720 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
35730 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20  stderr, "ERROR: 
35740 4e 6f 20 73 65 73 73 69 6f 6e 73 20 61 72 65 20  No sessions are 
35750 6f 70 65 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  open\n");.      
35760 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
35770 63 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69  c = sqlite3sessi
35780 6f 6e 5f 61 74 74 61 63 68 28 70 53 65 73 73 69  on_attach(pSessi
35790 6f 6e 2d 3e 70 2c 20 61 7a 43 6d 64 5b 31 5d 29  on->p, azCmd[1])
357a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
357b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61   ){.          ra
357c0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
357d0 20 22 45 52 52 4f 52 3a 20 73 71 6c 69 74 65 33   "ERROR: sqlite3
357e0 73 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 29  session_attach()
357f0 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20   returns %d\n", 
35800 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rc);.          r
35810 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  c = 0;.        }
35820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
35830 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73  se..    /* .sess
35840 69 6f 6e 20 63 68 61 6e 67 65 73 65 74 20 46 49  ion changeset FI
35850 4c 45 0a 20 20 20 20 2a 2a 20 2e 73 65 73 73 69  LE.    ** .sessi
35860 6f 6e 20 70 61 74 63 68 73 65 74 20 46 49 4c 45  on patchset FILE
35870 0a 20 20 20 20 2a 2a 20 57 72 69 74 65 20 61 20  .    ** Write a 
35880 63 68 61 6e 67 65 73 65 74 20 6f 72 20 70 61 74  changeset or pat
35890 63 68 73 65 74 20 69 6e 74 6f 20 61 20 66 69 6c  chset into a fil
358a0 65 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20  e.  The file is 
358b0 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 20  overwritten..   
358c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
358d0 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 63 68 61  mp(azCmd[0],"cha
358e0 6e 67 65 73 65 74 22 29 3d 3d 30 20 7c 7c 20 73  ngeset")==0 || s
358f0 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22  trcmp(azCmd[0],"
35900 70 61 74 63 68 73 65 74 22 29 3d 3d 30 20 29 7b  patchset")==0 ){
35910 0a 20 20 20 20 20 20 46 49 4c 45 20 2a 6f 75 74  .      FILE *out
35920 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
35930 6e 43 6d 64 21 3d 32 20 29 20 67 6f 74 6f 20 73  nCmd!=2 ) goto s
35940 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72  ession_syntax_er
35950 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ror;.      if( p
35960 53 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29 20  Session->p==0 ) 
35970 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 6e 6f 74  goto session_not
35980 5f 6f 70 65 6e 3b 0a 20 20 20 20 20 20 6f 75 74  _open;.      out
35990 20 3d 20 66 6f 70 65 6e 28 61 7a 43 6d 64 5b 31   = fopen(azCmd[1
359a0 5d 2c 20 22 77 62 22 29 3b 0a 20 20 20 20 20 20  ], "wb");.      
359b0 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20  if( out==0 ){.  
359c0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
359d0 66 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52  f(stderr, "ERROR
359e0 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
359f0 25 73 5c 22 20 66 6f 72 20 77 72 69 74 69 6e 67  %s\" for writing
35a00 5c 6e 22 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b 0a  \n", azCmd[1]);.
35a10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
35a20 20 20 20 20 20 69 6e 74 20 73 7a 43 68 6e 67 3b       int szChng;
35a30 0a 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70  .        void *p
35a40 43 68 6e 67 3b 0a 20 20 20 20 20 20 20 20 69 66  Chng;.        if
35a50 28 20 61 7a 43 6d 64 5b 30 5d 5b 30 5d 3d 3d 27  ( azCmd[0][0]=='
35a60 63 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c' ){.          
35a70 72 63 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73  rc = sqlite3sess
35a80 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28 70 53  ion_changeset(pS
35a90 65 73 73 69 6f 6e 2d 3e 70 2c 20 26 73 7a 43 68  ession->p, &szCh
35aa0 6e 67 2c 20 26 70 43 68 6e 67 29 3b 0a 20 20 20  ng, &pChng);.   
35ab0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
35ac0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
35ad0 65 33 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73  e3session_patchs
35ae0 65 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20  et(pSession->p, 
35af0 26 73 7a 43 68 6e 67 2c 20 26 70 43 68 6e 67 29  &szChng, &pChng)
35b00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35b10 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
35b20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
35b30 45 72 72 6f 72 3a 20 65 72 72 6f 72 20 63 6f 64  Error: error cod
35b40 65 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20  e %d\n", rc);.  
35b50 20 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a          rc = 0;.
35b60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35b70 20 20 69 66 28 20 70 43 68 6e 67 0a 20 20 20 20    if( pChng.    
35b80 20 20 20 20 20 20 26 26 20 66 77 72 69 74 65 28        && fwrite(
35b90 70 43 68 6e 67 2c 20 73 7a 43 68 6e 67 2c 20 31  pChng, szChng, 1
35ba0 2c 20 6f 75 74 29 21 3d 31 20 29 7b 0a 20 20 20  , out)!=1 ){.   
35bb0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
35bc0 66 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52  f(stderr, "ERROR
35bd0 3a 20 46 61 69 6c 65 64 20 74 6f 20 77 72 69 74  : Failed to writ
35be0 65 20 65 6e 74 69 72 65 20 25 64 2d 62 79 74 65  e entire %d-byte
35bf0 20 6f 75 74 70 75 74 5c 6e 22 2c 0a 20 20 20 20   output\n",.    
35c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a                sz
35c10 43 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  Chng);.        }
35c20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35c30 5f 66 72 65 65 28 70 43 68 6e 67 29 3b 0a 20 20  _free(pChng);.  
35c40 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
35c50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
35c60 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65  else..    /* .se
35c70 73 73 69 6f 6e 20 63 6c 6f 73 65 0a 20 20 20 20  ssion close.    
35c80 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 69 64 65  ** Close the ide
35c90 6e 74 69 66 69 65 64 20 73 65 73 73 69 6f 6e 0a  ntified session.
35ca0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
35cb0 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20  trcmp(azCmd[0], 
35cc0 22 63 6c 6f 73 65 22 29 3d 3d 30 20 29 7b 0a 20  "close")==0 ){. 
35cd0 20 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 31       if( nCmd!=1
35ce0 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f   ) goto session_
35cf0 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20  syntax_error;.  
35d00 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73      if( p->nSess
35d10 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ion ){.        s
35d20 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 70 53 65  ession_close(pSe
35d30 73 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20  ssion);.        
35d40 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73  p->aSession[iSes
35d50 5d 20 3d 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b  ] = p->aSession[
35d60 2d 2d 70 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a  --p->nSession];.
35d70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
35d80 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69  e..    /* .sessi
35d90 6f 6e 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45  on enable ?BOOLE
35da0 41 4e 3f 0a 20 20 20 20 2a 2a 20 51 75 65 72 79  AN?.    ** Query
35db0 20 6f 72 20 73 65 74 20 74 68 65 20 65 6e 61 62   or set the enab
35dc0 6c 65 20 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20  le flag.    */. 
35dd0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
35de0 43 6d 64 5b 30 5d 2c 20 22 65 6e 61 62 6c 65 22  Cmd[0], "enable"
35df0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
35e00 74 20 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20  t ii;.      if( 
35e10 6e 43 6d 64 3e 32 20 29 20 67 6f 74 6f 20 73 65  nCmd>2 ) goto se
35e20 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
35e30 6f 72 3b 0a 20 20 20 20 20 20 69 69 20 3d 20 6e  or;.      ii = n
35e40 43 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a 20 62 6f  Cmd==1 ? -1 : bo
35e50 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 43 6d 64  oleanValue(azCmd
35e60 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [1]);.      if( 
35e70 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20  p->nSession ){. 
35e80 20 20 20 20 20 20 20 69 69 20 3d 20 73 71 6c 69         ii = sqli
35e90 74 65 33 73 65 73 73 69 6f 6e 5f 65 6e 61 62 6c  te3session_enabl
35ea0 65 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 69  e(pSession->p, i
35eb0 69 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38  i);.        utf8
35ec0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
35ed0 22 73 65 73 73 69 6f 6e 20 25 73 20 65 6e 61 62  "session %s enab
35ee0 6c 65 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c  le flag = %d\n",
35ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35f00 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a       pSession->z
35f10 4e 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20  Name, ii);.     
35f20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20   }.    }else..  
35f30 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 66 69    /* .session fi
35f40 6c 74 65 72 20 47 4c 4f 42 20 2e 2e 2e 2e 0a 20  lter GLOB ..... 
35f50 20 20 20 2a 2a 20 53 65 74 20 61 20 6c 69 73 74     ** Set a list
35f60 20 6f 66 20 47 4c 4f 42 20 70 61 74 74 65 72 6e   of GLOB pattern
35f70 73 20 6f 66 20 74 61 62 6c 65 20 6e 61 6d 65 73  s of table names
35f80 20 74 6f 20 62 65 20 65 78 63 6c 75 64 65 64 2e   to be excluded.
35f90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
35fa0 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c  strcmp(azCmd[0],
35fb0 20 22 66 69 6c 74 65 72 22 29 3d 3d 30 20 29 7b   "filter")==0 ){
35fc0 0a 20 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6e  .      int ii, n
35fd0 42 79 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Byte;.      if( 
35fe0 6e 43 6d 64 3c 32 20 29 20 67 6f 74 6f 20 73 65  nCmd<2 ) goto se
35ff0 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
36000 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  or;.      if( p-
36010 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20  >nSession ){.   
36020 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
36030 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c  i<pSession->nFil
36040 74 65 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ter; ii++){.    
36050 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
36060 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46  ee(pSession->azF
36070 69 6c 74 65 72 5b 69 69 5d 29 3b 0a 20 20 20 20  ilter[ii]);.    
36080 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
36090 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73  lite3_free(pSess
360a0 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a  ion->azFilter);.
360b0 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20          nByte = 
360c0 73 69 7a 65 6f 66 28 70 53 65 73 73 69 6f 6e 2d  sizeof(pSession-
360d0 3e 61 7a 46 69 6c 74 65 72 5b 30 5d 29 2a 28 6e  >azFilter[0])*(n
360e0 43 6d 64 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Cmd-1);.        
360f0 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74  pSession->azFilt
36100 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  er = sqlite3_mal
36110 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
36120 20 20 20 20 20 20 69 66 28 20 70 53 65 73 73 69        if( pSessi
36130 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 3d 3d 30 20  on->azFilter==0 
36140 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
36150 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
36160 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 72 20 6d  "Error: out or m
36170 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20  emory\n");.     
36180 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
36190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
361a0 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 43 6d  for(ii=1; ii<nCm
361b0 64 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  d; ii++){.      
361c0 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a      pSession->az
361d0 46 69 6c 74 65 72 5b 69 69 2d 31 5d 20 3d 20 73  Filter[ii-1] = s
361e0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
361f0 25 73 22 2c 20 61 7a 43 6d 64 5b 69 69 5d 29 3b  %s", azCmd[ii]);
36200 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36210 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69     pSession->nFi
36220 6c 74 65 72 20 3d 20 69 69 2d 31 3b 0a 20 20 20  lter = ii-1;.   
36230 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a     }.    }else..
36240 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20      /* .session 
36250 69 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41  indirect ?BOOLEA
36260 4e 3f 0a 20 20 20 20 2a 2a 20 51 75 65 72 79 20  N?.    ** Query 
36270 6f 72 20 73 65 74 20 74 68 65 20 69 6e 64 69 72  or set the indir
36280 65 63 74 20 66 6c 61 67 0a 20 20 20 20 2a 2f 0a  ect flag.    */.
36290 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
362a0 7a 43 6d 64 5b 30 5d 2c 20 22 69 6e 64 69 72 65  zCmd[0], "indire
362b0 63 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ct")==0 ){.     
362c0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 69   int ii;.      i
362d0 66 28 20 6e 43 6d 64 3e 32 20 29 20 67 6f 74 6f  f( nCmd>2 ) goto
362e0 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
362f0 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 69 20  error;.      ii 
36300 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a  = nCmd==1 ? -1 :
36310 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
36320 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69  Cmd[1]);.      i
36330 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29  f( p->nSession )
36340 7b 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20 73  {.        ii = s
36350 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 69 6e  qlite3session_in
36360 64 69 72 65 63 74 28 70 53 65 73 73 69 6f 6e 2d  direct(pSession-
36370 3e 70 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20  >p, ii);.       
36380 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
36390 6f 75 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73  out, "session %s
363a0 20 69 6e 64 69 72 65 63 74 20 66 6c 61 67 20 3d   indirect flag =
363b0 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
363c0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 65 73              pSes
363d0 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29  sion->zName, ii)
363e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
363f0 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73  lse..    /* .ses
36400 73 69 6f 6e 20 69 73 65 6d 70 74 79 0a 20 20 20  sion isempty.   
36410 20 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66   ** Determine if
36420 20 74 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20   the session is 
36430 65 6d 70 74 79 0a 20 20 20 20 2a 2f 0a 20 20 20  empty.    */.   
36440 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d   if( strcmp(azCm
36450 64 5b 30 5d 2c 20 22 69 73 65 6d 70 74 79 22 29  d[0], "isempty")
36460 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
36470 20 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6e   ii;.      if( n
36480 43 6d 64 21 3d 31 20 29 20 67 6f 74 6f 20 73 65  Cmd!=1 ) goto se
36490 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
364a0 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  or;.      if( p-
364b0 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20  >nSession ){.   
364c0 20 20 20 20 20 69 69 20 3d 20 73 71 6c 69 74 65       ii = sqlite
364d0 33 73 65 73 73 69 6f 6e 5f 69 73 65 6d 70 74 79  3session_isempty
364e0 28 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20  (pSession->p);. 
364f0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
36500 74 66 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73  tf(p->out, "sess
36510 69 6f 6e 20 25 73 20 69 73 65 6d 70 74 79 20 66  ion %s isempty f
36520 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20  lag = %d\n",.   
36530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36540 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65   pSession->zName
36550 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , ii);.      }. 
36560 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a     }else..    /*
36570 20 2e 73 65 73 73 69 6f 6e 20 6c 69 73 74 0a 20   .session list. 
36580 20 20 20 2a 2a 20 4c 69 73 74 20 61 6c 6c 20 63     ** List all c
36590 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65  urrently open se
365a0 73 73 69 6f 6e 73 0a 20 20 20 20 2a 2f 0a 20 20  ssions.    */.  
365b0 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43    if( strcmp(azC
365c0 6d 64 5b 30 5d 2c 22 6c 69 73 74 22 29 3d 3d 30  md[0],"list")==0
365d0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
365e0 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e  0; i<p->nSession
365f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
36600 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
36610 75 74 2c 20 22 25 64 20 25 73 5c 6e 22 2c 20 69  ut, "%d %s\n", i
36620 2c 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d  , p->aSession[i]
36630 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  .zName);.      }
36640 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
36650 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 6f 70 65 6e  /* .session open
36660 20 44 42 20 4e 41 4d 45 0a 20 20 20 20 2a 2a 20   DB NAME.    ** 
36670 4f 70 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69  Open a new sessi
36680 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 20 6f  on called NAME o
36690 6e 20 74 68 65 20 61 74 74 61 63 68 65 64 20 64  n the attached d
366a0 61 74 61 62 61 73 65 20 44 42 2e 0a 20 20 20 20  atabase DB..    
366b0 2a 2a 20 44 42 20 69 73 20 6e 6f 72 6d 61 6c 6c  ** DB is normall
366c0 79 20 22 6d 61 69 6e 22 2e 0a 20 20 20 20 2a 2f  y "main"..    */
366d0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
366e0 61 7a 43 6d 64 5b 30 5d 2c 22 6f 70 65 6e 22 29  azCmd[0],"open")
366f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ==0 ){.      cha
36700 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  r *zName;.      
36710 69 66 28 20 6e 43 6d 64 21 3d 33 20 29 20 67 6f  if( nCmd!=3 ) go
36720 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61  to session_synta
36730 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7a  x_error;.      z
36740 4e 61 6d 65 20 3d 20 61 7a 43 6d 64 5b 32 5d 3b  Name = azCmd[2];
36750 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  .      if( zName
36760 5b 30 5d 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  [0]==0 ) goto se
36770 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
36780 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  or;.      for(i=
36790 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e  0; i<p->nSession
367a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
367b0 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 61 53  if( strcmp(p->aS
367c0 65 73 73 69 6f 6e 5b 69 5d 2e 7a 4e 61 6d 65 2c  ession[i].zName,
367d0 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
367e0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
367f0 74 66 28 73 74 64 65 72 72 2c 20 22 53 65 73 73  tf(stderr, "Sess
36800 69 6f 6e 20 5c 22 25 73 5c 22 20 61 6c 72 65 61  ion \"%s\" alrea
36810 64 79 20 65 78 69 73 74 73 5c 6e 22 2c 20 7a 4e  dy exists\n", zN
36820 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
36830 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
36840 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  d_exit;.        
36850 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
36860 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 3e  if( p->nSession>
36870 3d 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 53  =ArraySize(p->aS
36880 65 73 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20  ession) ){.     
36890 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
368a0 64 65 72 72 2c 20 22 4d 61 78 69 6d 75 6d 20 6f  derr, "Maximum o
368b0 66 20 25 64 20 73 65 73 73 69 6f 6e 73 5c 6e 22  f %d sessions\n"
368c0 2c 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61  , ArraySize(p->a
368d0 53 65 73 73 69 6f 6e 29 29 3b 0a 20 20 20 20 20  Session));.     
368e0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
368f0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
36900 20 7d 0a 20 20 20 20 20 20 70 53 65 73 73 69 6f   }.      pSessio
36910 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e  n = &p->aSession
36920 5b 70 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20  [p->nSession];. 
36930 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36940 33 73 65 73 73 69 6f 6e 5f 63 72 65 61 74 65 28  3session_create(
36950 70 2d 3e 64 62 2c 20 61 7a 43 6d 64 5b 31 5d 2c  p->db, azCmd[1],
36960 20 26 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a   &pSession->p);.
36970 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
36980 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
36990 74 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e  tf(stderr, "Cann
369a0 6f 74 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 3a  ot open session:
369b0 20 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 5c 6e   error code=%d\n
369c0 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  ", rc);.        
369d0 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rc = 0;.        
369e0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
369f0 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
36a00 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e        pSession->
36a10 6e 46 69 6c 74 65 72 20 3d 20 30 3b 0a 20 20 20  nFilter = 0;.   
36a20 20 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f     sqlite3sessio
36a30 6e 5f 74 61 62 6c 65 5f 66 69 6c 74 65 72 28 70  n_table_filter(p
36a40 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 73 65 73 73  Session->p, sess
36a50 69 6f 6e 5f 66 69 6c 74 65 72 2c 20 70 53 65 73  ion_filter, pSes
36a60 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e  sion);.      p->
36a70 6e 53 65 73 73 69 6f 6e 2b 2b 3b 0a 20 20 20 20  nSession++;.    
36a80 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d    pSession->zNam
36a90 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
36aa0 6e 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29  ntf("%s", zName)
36ab0 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20  ;.    }else.    
36ac0 2f 2a 20 49 66 20 6e 6f 20 63 6f 6d 6d 61 6e 64  /* If no command
36ad0 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 2c 20 73   name matches, s
36ae0 68 6f 77 20 61 20 73 79 6e 74 61 78 20 65 72 72  how a syntax err
36af0 6f 72 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f  or */.    sessio
36b00 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3a 0a  n_syntax_error:.
36b10 20 20 20 20 73 68 6f 77 48 65 6c 70 28 70 2d 3e      showHelp(p->
36b20 6f 75 74 2c 20 22 73 65 73 73 69 6f 6e 22 29 3b  out, "session");
36b30 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
36b40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
36b50 45 42 55 47 0a 20 20 2f 2a 20 55 6e 64 6f 63 75  EBUG.  /* Undocu
36b60 6d 65 6e 74 65 64 20 63 6f 6d 6d 61 6e 64 73 20  mented commands 
36b70 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 74 65 73  for internal tes
36b80 74 69 6e 67 2e 20 20 53 75 62 6a 65 63 74 20 74  ting.  Subject t
36b90 6f 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 77 69  o change.  ** wi
36ba0 74 68 6f 75 74 20 6e 6f 74 69 63 65 2e 20 2a 2f  thout notice. */
36bb0 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26  .  if( c=='s' &&
36bc0 20 6e 3e 3d 31 30 20 26 26 20 73 74 72 6e 63 6d   n>=10 && strncm
36bd0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65 6c  p(azArg[0], "sel
36be0 66 74 65 73 74 2d 22 2c 20 39 29 3d 3d 30 20 29  ftest-", 9)==0 )
36bf0 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  {.    if( strncm
36c00 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c 20 22 62  p(azArg[0]+9, "b
36c10 6f 6f 6c 65 61 6e 22 2c 20 6e 2d 39 29 3d 3d 30  oolean", n-9)==0
36c20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   ){.      int i,
36c30 20 76 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   v;.      for(i=
36c40 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  1; i<nArg; i++){
36c50 0a 20 20 20 20 20 20 20 20 76 20 3d 20 62 6f 6f  .        v = boo
36c60 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
36c70 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66  i]);.        utf
36c80 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
36c90 20 22 25 73 3a 20 25 64 20 30 78 25 78 5c 6e 22   "%s: %d 0x%x\n"
36ca0 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 76 2c 20 76  , azArg[i], v, v
36cb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
36cc0 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70  .    if( strncmp
36cd0 28 61 7a 41 72 67 5b 30 5d 2b 39 2c 20 22 69 6e  (azArg[0]+9, "in
36ce0 74 65 67 65 72 22 2c 20 6e 2d 39 29 3d 3d 30 20  teger", n-9)==0 
36cf0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  ){.      int i; 
36d00 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b  sqlite3_int64 v;
36d10 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
36d20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
36d30 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b        char zBuf[
36d40 32 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 76 20  200];.        v 
36d50 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61  = integerValue(a
36d60 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
36d70 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
36d80 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
36d90 7a 42 75 66 2c 22 25 73 3a 20 25 6c 6c 64 20 30  zBuf,"%s: %lld 0
36da0 78 25 6c 6c 78 5c 6e 22 2c 20 61 7a 41 72 67 5b  x%llx\n", azArg[
36db0 69 5d 2c 76 2c 76 29 3b 0a 20 20 20 20 20 20 20  i],v,v);.       
36dc0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
36dd0 6f 75 74 2c 20 22 25 73 22 2c 20 7a 42 75 66 29  out, "%s", zBuf)
36de0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36df0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
36e00 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20    if( c=='s' && 
36e10 6e 3e 3d 34 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=4 && strncmp(
36e20 61 7a 41 72 67 5b 30 5d 2c 22 73 65 6c 66 74 65  azArg[0],"selfte
36e30 73 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  st",n)==0 ){.   
36e40 20 69 6e 74 20 62 49 73 49 6e 69 74 20 3d 20 30   int bIsInit = 0
36e50 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
36e60 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
36e70 74 68 65 20 53 45 4c 46 54 45 53 54 20 74 61 62  the SELFTEST tab
36e80 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 56  le */.    int bV
36e90 65 72 62 6f 73 65 20 3d 20 30 3b 20 20 20 20 20  erbose = 0;     
36ea0 20 20 20 2f 2a 20 56 65 72 62 6f 73 65 20 6f 75     /* Verbose ou
36eb0 74 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tput */.    int 
36ec0 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73 3b  bSelftestExists;
36ed0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
36ee0 53 45 4c 46 54 45 53 54 20 61 6c 72 65 61 64 79  SELFTEST already
36ef0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69   exists */.    i
36f00 6e 74 20 69 2c 20 6b 3b 20 20 20 20 20 20 20 20  nt i, k;        
36f10 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
36f20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20  counters */.    
36f30 69 6e 74 20 6e 54 65 73 74 20 3d 20 30 3b 20 20  int nTest = 0;  
36f40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
36f50 65 72 20 6f 66 20 74 65 73 74 73 20 72 75 6e 73  er of tests runs
36f60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 72 72   */.    int nErr
36f70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
36f80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
36f90 72 6f 72 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20  rors seen */.   
36fa0 20 53 68 65 6c 6c 54 65 78 74 20 73 74 72 3b 20   ShellText str; 
36fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 73            /* Ans
36fc0 77 65 72 20 66 6f 72 20 61 20 71 75 65 72 79 20  wer for a query 
36fd0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
36fe0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20  tmt *pStmt = 0; 
36ff0 2f 2a 20 51 75 65 72 79 20 61 67 61 69 6e 73 74  /* Query against
37000 20 74 68 65 20 53 45 4c 46 54 45 53 54 20 74 61   the SELFTEST ta
37010 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6f 70 65 6e  ble */..    open
37020 5f 64 62 28 70 2c 30 29 3b 0a 20 20 20 20 66 6f  _db(p,0);.    fo
37030 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=1; i<nArg; i
37040 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ++){.      const
37050 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67   char *z = azArg
37060 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [i];.      if( z
37070 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d  [0]=='-' && z[1]
37080 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20  =='-' ) z++;.   
37090 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
370a0 22 2d 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a 20  "-init")==0 ){. 
370b0 20 20 20 20 20 20 20 62 49 73 49 6e 69 74 20 3d         bIsInit =
370c0 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a   1;.      }else.
370d0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
370e0 28 7a 2c 22 2d 76 22 29 3d 3d 30 20 29 7b 0a 20  (z,"-v")==0 ){. 
370f0 20 20 20 20 20 20 20 62 56 65 72 62 6f 73 65 2b         bVerbose+
37100 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  +;.      }else. 
37110 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75       {.        u
37120 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
37130 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69  r, "Unknown opti
37140 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 25  on \"%s\" on \"%
37150 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  s\"\n",.        
37160 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72              azAr
37170 67 5b 69 5d 2c 20 61 7a 41 72 67 5b 30 5d 29 3b  g[i], azArg[0]);
37180 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
37190 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 68 6f  ntf(stderr, "Sho
371a0 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 2d  uld be one of: -
371b0 2d 69 6e 69 74 20 2d 76 5c 6e 22 29 3b 0a 20 20  -init -v\n");.  
371c0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
371d0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
371e0 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
371f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
37200 69 66 28 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  if( sqlite3_tabl
37210 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
37220 61 28 70 2d 3e 64 62 2c 22 6d 61 69 6e 22 2c 22  a(p->db,"main","
37230 73 65 6c 66 74 65 73 74 22 2c 30 2c 30 2c 30 2c  selftest",0,0,0,
37240 30 2c 30 2c 30 29 0a 20 20 20 20 20 20 20 20 20  0,0,0).         
37250 20 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29    != SQLITE_OK )
37260 7b 0a 20 20 20 20 20 20 62 53 65 6c 66 74 65 73  {.      bSelftes
37270 74 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 20  tExists = 0;.   
37280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 53   }else{.      bS
37290 65 6c 66 74 65 73 74 45 78 69 73 74 73 20 3d 20  elftestExists = 
372a0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
372b0 20 62 49 73 49 6e 69 74 20 29 7b 0a 20 20 20 20   bIsInit ){.    
372c0 20 20 63 72 65 61 74 65 53 65 6c 66 74 65 73 74    createSelftest
372d0 54 61 62 6c 65 28 70 29 3b 0a 20 20 20 20 20 20  Table(p);.      
372e0 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73 20  bSelftestExists 
372f0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
37300 6e 69 74 54 65 78 74 28 26 73 74 72 29 3b 0a 20  nitText(&str);. 
37310 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
37320 74 72 2c 20 22 78 22 2c 20 30 29 3b 0a 20 20 20  tr, "x", 0);.   
37330 20 66 6f 72 28 6b 3d 62 53 65 6c 66 74 65 73 74   for(k=bSelftest
37340 45 78 69 73 74 73 3b 20 6b 3e 3d 30 3b 20 6b 2d  Exists; k>=0; k-
37350 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d  -){.      if( k=
37360 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =1 ){.        rc
37370 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
37380 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20  re_v2(p->db,.   
37390 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
373a0 20 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61 6e 73 20   tno,op,cmd,ans 
373b0 46 52 4f 4d 20 73 65 6c 66 74 65 73 74 20 4f 52  FROM selftest OR
373c0 44 45 52 20 42 59 20 74 6e 6f 22 2c 0a 20 20 20  DER BY tno",.   
373d0 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53           -1, &pS
373e0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  tmt, 0);.      }
373f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
37400 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
37410 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20  re_v2(p->db,.   
37420 20 20 20 20 20 20 20 22 56 41 4c 55 45 53 28 30         "VALUES(0
37430 2c 27 6d 65 6d 6f 27 2c 27 4d 69 73 73 69 6e 67  ,'memo','Missing
37440 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20   SELFTEST table 
37450 2d 20 64 65 66 61 75 6c 74 20 63 68 65 63 6b 73  - default checks
37460 20 6f 6e 6c 79 27 2c 27 27 29 2c 22 0a 20 20 20   only',''),".   
37470 20 20 20 20 20 20 20 22 20 20 20 20 20 20 28 31         "      (1
37480 2c 27 72 75 6e 27 2c 27 50 52 41 47 4d 41 20 69  ,'run','PRAGMA i
37490 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 27 2c  ntegrity_check',
374a0 27 6f 6b 27 29 22 2c 0a 20 20 20 20 20 20 20 20  'ok')",.        
374b0 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29    -1, &pStmt, 0)
374c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
374d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
374e0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
374f0 65 72 72 2c 20 22 45 72 72 6f 72 20 71 75 65 72  err, "Error quer
37500 79 69 6e 67 20 74 68 65 20 73 65 6c 66 74 65 73  ying the selftes
37510 74 20 74 61 62 6c 65 5c 6e 22 29 3b 0a 20 20 20  t table\n");.   
37520 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
37530 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
37540 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
37550 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
37560 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
37570 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
37580 69 3d 31 3b 20 73 71 6c 69 74 65 33 5f 73 74 65  i=1; sqlite3_ste
37590 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
375a0 5f 52 4f 57 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  _ROW; i++){.    
375b0 20 20 20 20 69 6e 74 20 74 6e 6f 20 3d 20 73 71      int tno = sq
375c0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
375d0 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
375e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
375f0 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zOp = (const cha
37600 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
37610 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
37620 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
37630 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 28 63 6f  char *zSql = (co
37640 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
37650 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
37660 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  tmt, 2);.       
37670 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6e   const char *zAn
37680 73 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  s = (const char*
37690 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
376a0 74 65 78 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a  text(pStmt, 3);.
376b0 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a  .        k = 0;.
376c0 20 20 20 20 20 20 20 20 69 66 28 20 62 56 65 72          if( bVer
376d0 62 6f 73 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  bose>0 ){.      
376e0 20 20 20 20 63 68 61 72 20 2a 7a 51 75 6f 74 65      char *zQuote
376f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
37700 74 66 28 22 25 71 22 2c 20 7a 53 71 6c 29 3b 0a  tf("%q", zSql);.
37710 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66            printf
37720 28 22 25 64 3a 20 25 73 20 25 73 5c 6e 22 2c 20  ("%d: %s %s\n", 
37730 74 6e 6f 2c 20 7a 4f 70 2c 20 7a 53 71 6c 29 3b  tno, zOp, zSql);
37740 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
37750 65 33 5f 66 72 65 65 28 7a 51 75 6f 74 65 29 3b  e3_free(zQuote);
37760 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37770 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f     if( strcmp(zO
37780 70 2c 22 6d 65 6d 6f 22 29 3d 3d 30 20 29 7b 0a  p,"memo")==0 ){.
37790 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
377a0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
377b0 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  s\n"