/ Hex Artifact Content
Login

Artifact 30eac60e064eca559c173b46e243c912c30c90c34bdcaafeabb03b5537c72a1c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
01a0: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
01b0: 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 75 74 69 6c  and line.** util
01c0: 69 74 79 20 66 6f 72 20 61 63 63 65 73 73 69 6e  ity for accessin
01d0: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
01e0: 65 73 2e 0a 2a 2f 0a 23 69 66 20 28 64 65 66 69  es..*/.#if (defi
01f0: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
0200: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20 26  efined(WIN32)) &
0210: 26 20 21 64 65 66 69 6e 65 64 28 5f 43 52 54 5f  & !defined(_CRT_
0220: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0230: 47 53 29 0a 2f 2a 20 54 68 69 73 20 6e 65 65 64  GS)./* This need
0240: 73 20 74 6f 20 63 6f 6d 65 20 62 65 66 6f 72 65  s to come before
0250: 20 61 6e 79 20 69 6e 63 6c 75 64 65 73 20 66 6f   any includes fo
0260: 72 20 4d 53 56 43 20 63 6f 6d 70 69 6c 65 72 20  r MSVC compiler 
0270: 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 43 52 54 5f  */.#define _CRT_
0280: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0290: 47 53 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  GS.#endif../*.**
02a0: 20 57 61 72 6e 69 6e 67 20 70 72 61 67 6d 61 73   Warning pragmas
02b0: 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 6d 73 76   copied from msv
02c0: 63 2e 68 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  c.h in the core.
02d0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
02e0: 5f 4d 53 43 5f 56 45 52 29 0a 23 70 72 61 67 6d  _MSC_VER).#pragm
02f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0300: 65 20 3a 20 34 30 35 34 29 0a 23 70 72 61 67 6d  e : 4054).#pragm
0310: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0320: 65 20 3a 20 34 30 35 35 29 0a 23 70 72 61 67 6d  e : 4055).#pragm
0330: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0340: 65 20 3a 20 34 31 30 30 29 0a 23 70 72 61 67 6d  e : 4100).#pragm
0350: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0360: 65 20 3a 20 34 31 32 37 29 0a 23 70 72 61 67 6d  e : 4127).#pragm
0370: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0380: 65 20 3a 20 34 31 33 30 29 0a 23 70 72 61 67 6d  e : 4130).#pragm
0390: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03a0: 65 20 3a 20 34 31 35 32 29 0a 23 70 72 61 67 6d  e : 4152).#pragm
03b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03c0: 65 20 3a 20 34 31 38 39 29 0a 23 70 72 61 67 6d  e : 4189).#pragm
03d0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03e0: 65 20 3a 20 34 32 30 36 29 0a 23 70 72 61 67 6d  e : 4206).#pragm
03f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0400: 65 20 3a 20 34 32 31 30 29 0a 23 70 72 61 67 6d  e : 4210).#pragm
0410: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0420: 65 20 3a 20 34 32 33 32 29 0a 23 70 72 61 67 6d  e : 4232).#pragm
0430: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0440: 65 20 3a 20 34 32 34 34 29 0a 23 70 72 61 67 6d  e : 4244).#pragm
0450: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0460: 65 20 3a 20 34 33 30 35 29 0a 23 70 72 61 67 6d  e : 4305).#pragm
0470: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0480: 65 20 3a 20 34 33 30 36 29 0a 23 70 72 61 67 6d  e : 4306).#pragm
0490: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04a0: 65 20 3a 20 34 37 30 32 29 0a 23 70 72 61 67 6d  e : 4702).#pragm
04b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04c0: 65 20 3a 20 34 37 30 36 29 0a 23 65 6e 64 69 66  e : 4706).#endif
04d0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 4d 53 43   /* defined(_MSC
04e0: 5f 56 45 52 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VER) */../*.** 
04f0: 4e 6f 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  No support for l
0500: 6f 61 64 61 62 6c 65 20 65 78 74 65 6e 73 69 6f  oadable extensio
0510: 6e 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ns in VxWorks..*
0520: 2f 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28 5f  /.#if (defined(_
0530: 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  _RTP__) || defin
0540: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 29  ed(_WRS_KERNEL))
0550: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
0560: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
0570: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
0580: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
0590: 49 4f 4e 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ION 1.#endif../*
05a0: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6c 61 72 67 65  .** Enable large
05b0: 2d 66 69 6c 65 20 73 75 70 70 6f 72 74 20 66 6f  -file support fo
05c0: 72 20 66 6f 70 65 6e 28 29 20 61 6e 64 20 66 72  r fopen() and fr
05d0: 69 65 6e 64 73 20 6f 6e 20 75 6e 69 78 2e 0a 2a  iends on unix..*
05e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
05f0: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64  _DISABLE_LFS.# d
0600: 65 66 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c  efine _LARGE_FIL
0610: 45 20 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64  E       1.# ifnd
0620: 65 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  ef _FILE_OFFSET_
0630: 42 49 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20  BITS.#   define 
0640: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
0650: 53 20 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64  S 64.# endif.# d
0660: 65 66 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45  efine _LARGEFILE
0670: 5f 53 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66  _SOURCE 1.#endif
0680: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  ..#include <stdl
0690: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
06a0: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
06b0: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
06c0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
06d0: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
06e0: 65 33 2e 68 22 0a 74 79 70 65 64 65 66 20 73 71  e3.h".typedef sq
06f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34 3b  lite3_int64 i64;
0700: 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33  .typedef sqlite3
0710: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 74 79 70  _uint64 u64;.typ
0720: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
0730: 61 72 20 75 38 3b 0a 23 69 66 20 53 51 4c 49 54  ar u8;.#if SQLIT
0740: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
0750: 41 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20  ATION.# include 
0760: 22 73 71 6c 69 74 65 33 75 73 65 72 61 75 74 68  "sqlite3userauth
0770: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c  .h".#endif.#incl
0780: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69  ude <ctype.h>.#i
0790: 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68  nclude <stdarg.h
07a0: 3e 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  >..#if !defined(
07b0: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
07c0: 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69 6e 63  ned(WIN32).# inc
07d0: 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a  lude <signal.h>.
07e0: 23 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  # if !defined(__
07f0: 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  RTP__) && !defin
0800: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
0810: 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e  #  include <pwd.
0820: 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  h>.# endif.#endi
0830: 66 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  f.#if (!defined(
0840: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
0850: 6e 65 64 28 57 49 4e 33 32 29 29 20 7c 7c 20 64  ned(WIN32)) || d
0860: 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32  efined(__MINGW32
0870: 5f 5f 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  __).# include <u
0880: 6e 69 73 74 64 2e 68 3e 0a 23 20 69 6e 63 6c 75  nistd.h>.# inclu
0890: 64 65 20 3c 64 69 72 65 6e 74 2e 68 3e 0a 23 20  de <dirent.h>.# 
08a0: 64 65 66 69 6e 65 20 47 45 54 50 49 44 20 67 65  define GETPID ge
08b0: 74 70 69 64 0a 23 20 69 66 20 64 65 66 69 6e 65  tpid.# if define
08c0: 64 28 5f 5f 4d 49 4e 47 57 33 32 5f 5f 29 0a 23  d(__MINGW32__).#
08d0: 20 20 64 65 66 69 6e 65 20 44 49 52 45 4e 54 20    define DIRENT 
08e0: 64 69 72 65 6e 74 0a 23 20 20 69 66 6e 64 65 66  dirent.#  ifndef
08f0: 20 53 5f 49 53 4c 4e 4b 0a 23 20 20 20 64 65 66   S_ISLNK.#   def
0900: 69 6e 65 20 53 5f 49 53 4c 4e 4b 28 6d 6f 64 65  ine S_ISLNK(mode
0910: 29 20 28 30 29 0a 23 20 20 65 6e 64 69 66 0a 23  ) (0).#  endif.#
0920: 20 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 64   endif.#else.# d
0930: 65 66 69 6e 65 20 47 45 54 50 49 44 20 28 69 6e  efine GETPID (in
0940: 74 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  t)GetCurrentProc
0950: 65 73 73 49 64 0a 23 65 6e 64 69 66 0a 23 69 6e  essId.#endif.#in
0960: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
0970: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0980: 73 2f 73 74 61 74 2e 68 3e 0a 0a 23 69 66 20 48  s/stat.h>..#if H
0990: 41 56 45 5f 52 45 41 44 4c 49 4e 45 0a 23 20 69  AVE_READLINE.# i
09a0: 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65  nclude <readline
09b0: 2f 72 65 61 64 6c 69 6e 65 2e 68 3e 0a 23 20 69  /readline.h>.# i
09c0: 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65  nclude <readline
09d0: 2f 68 69 73 74 6f 72 79 2e 68 3e 0a 23 65 6e 64  /history.h>.#end
09e0: 69 66 0a 0a 23 69 66 20 48 41 56 45 5f 45 44 49  if..#if HAVE_EDI
09f0: 54 4c 49 4e 45 0a 23 20 69 6e 63 6c 75 64 65 20  TLINE.# include 
0a00: 3c 65 64 69 74 6c 69 6e 65 2f 72 65 61 64 6c 69  <editline/readli
0a10: 6e 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69  ne.h>.#endif..#i
0a20: 66 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 20  f HAVE_EDITLINE 
0a30: 7c 7c 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45  || HAVE_READLINE
0a40: 0a 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ..# define shell
0a50: 5f 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 20  _add_history(X) 
0a60: 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  add_history(X).#
0a70: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65   define shell_re
0a80: 61 64 5f 68 69 73 74 6f 72 79 28 58 29 20 72 65  ad_history(X) re
0a90: 61 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20  ad_history(X).# 
0aa0: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72 69  define shell_wri
0ab0: 74 65 5f 68 69 73 74 6f 72 79 28 58 29 20 77 72  te_history(X) wr
0ac0: 69 74 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  ite_history(X).#
0ad0: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74   define shell_st
0ae0: 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58 29 20  ifle_history(X) 
0af0: 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58  stifle_history(X
0b00: 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ).# define shell
0b10: 5f 72 65 61 64 6c 69 6e 65 28 58 29 20 72 65 61  _readline(X) rea
0b20: 64 6c 69 6e 65 28 58 29 0a 0a 23 65 6c 69 66 20  dline(X)..#elif 
0b30: 48 41 56 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a 0a  HAVE_LINENOISE..
0b40: 23 20 69 6e 63 6c 75 64 65 20 22 6c 69 6e 65 6e  # include "linen
0b50: 6f 69 73 65 2e 68 22 0a 23 20 64 65 66 69 6e 65  oise.h".# define
0b60: 20 73 68 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f   shell_add_histo
0b70: 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48  ry(X) linenoiseH
0b80: 69 73 74 6f 72 79 41 64 64 28 58 29 0a 23 20 64  istoryAdd(X).# d
0b90: 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64  efine shell_read
0ba0: 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e 65  _history(X) line
0bb0: 6e 6f 69 73 65 48 69 73 74 6f 72 79 4c 6f 61 64  noiseHistoryLoad
0bc0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65  (X).# define she
0bd0: 6c 6c 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79  ll_write_history
0be0: 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48 69 73  (X) linenoiseHis
0bf0: 74 6f 72 79 53 61 76 65 28 58 29 0a 23 20 64 65  torySave(X).# de
0c00: 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c  fine shell_stifl
0c10: 65 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e  e_history(X) lin
0c20: 65 6e 6f 69 73 65 48 69 73 74 6f 72 79 53 65 74  enoiseHistorySet
0c30: 4d 61 78 4c 65 6e 28 58 29 0a 23 20 64 65 66 69  MaxLen(X).# defi
0c40: 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 6c 69 6e  ne shell_readlin
0c50: 65 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 28 58  e(X) linenoise(X
0c60: 29 0a 0a 23 65 6c 73 65 0a 0a 23 20 64 65 66 69  )..#else..# defi
0c70: 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69  ne shell_read_hi
0c80: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0c90: 65 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69  e shell_write_hi
0ca0: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0cb0: 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68  e shell_stifle_h
0cc0: 69 73 74 6f 72 79 28 58 29 0a 0a 23 20 64 65 66  istory(X)..# def
0cd0: 69 6e 65 20 53 48 45 4c 4c 5f 55 53 45 5f 4c 4f  ine SHELL_USE_LO
0ce0: 43 41 4c 5f 47 45 54 4c 49 4e 45 20 31 0a 23 65  CAL_GETLINE 1.#e
0cf0: 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e  ndif...#if defin
0d00: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
0d10: 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69  fined(WIN32).# i
0d20: 6e 63 6c 75 64 65 20 3c 69 6f 2e 68 3e 0a 23 20  nclude <io.h>.# 
0d30: 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68  include <fcntl.h
0d40: 3e 0a 23 20 64 65 66 69 6e 65 20 69 73 61 74 74  >.# define isatt
0d50: 79 28 68 29 20 5f 69 73 61 74 74 79 28 68 29 0a  y(h) _isatty(h).
0d60: 23 20 69 66 6e 64 65 66 20 61 63 63 65 73 73 0a  # ifndef access.
0d70: 23 20 20 64 65 66 69 6e 65 20 61 63 63 65 73 73  #  define access
0d80: 28 66 2c 6d 29 20 5f 61 63 63 65 73 73 28 28 66  (f,m) _access((f
0d90: 29 2c 28 6d 29 29 0a 23 20 65 6e 64 69 66 0a 23  ),(m)).# endif.#
0da0: 20 69 66 6e 64 65 66 20 75 6e 6c 69 6e 6b 0a 23   ifndef unlink.#
0db0: 20 20 64 65 66 69 6e 65 20 75 6e 6c 69 6e 6b 20    define unlink 
0dc0: 5f 75 6e 6c 69 6e 6b 0a 23 20 65 6e 64 69 66 0a  _unlink.# endif.
0dd0: 23 20 69 66 6e 64 65 66 20 73 74 72 64 75 70 0a  # ifndef strdup.
0de0: 23 20 20 64 65 66 69 6e 65 20 73 74 72 64 75 70  #  define strdup
0df0: 20 5f 73 74 72 64 75 70 0a 23 20 65 6e 64 69 66   _strdup.# endif
0e00: 0a 23 20 75 6e 64 65 66 20 70 6f 70 65 6e 0a 23  .# undef popen.#
0e10: 20 64 65 66 69 6e 65 20 70 6f 70 65 6e 20 5f 70   define popen _p
0e20: 6f 70 65 6e 0a 23 20 75 6e 64 65 66 20 70 63 6c  open.# undef pcl
0e30: 6f 73 65 0a 23 20 64 65 66 69 6e 65 20 70 63 6c  ose.# define pcl
0e40: 6f 73 65 20 5f 70 63 6c 6f 73 65 0a 23 65 6c 73  ose _pclose.#els
0e50: 65 0a 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  e. /* Make sure 
0e60: 69 73 61 74 74 79 28 29 20 68 61 73 20 61 20 70  isatty() has a p
0e70: 72 6f 74 6f 74 79 70 65 2e 20 2a 2f 0a 20 65 78  rototype. */. ex
0e80: 74 65 72 6e 20 69 6e 74 20 69 73 61 74 74 79 28  tern int isatty(
0e90: 69 6e 74 29 3b 0a 0a 23 20 69 66 20 21 64 65 66  int);..# if !def
0ea0: 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 26 26  ined(__RTP__) &&
0eb0: 20 21 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b   !defined(_WRS_K
0ec0: 45 52 4e 45 4c 29 0a 20 20 2f 2a 20 70 6f 70 65  ERNEL).  /* pope
0ed0: 6e 20 61 6e 64 20 70 63 6c 6f 73 65 20 61 72 65  n and pclose are
0ee0: 20 6e 6f 74 20 43 38 39 20 66 75 6e 63 74 69 6f   not C89 functio
0ef0: 6e 73 20 61 6e 64 20 73 6f 20 61 72 65 0a 20 20  ns and so are.  
0f00: 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 6f 6d 69  ** sometimes omi
0f10: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 3c 73  tted from the <s
0f20: 74 64 69 6f 2e 68 3e 20 68 65 61 64 65 72 20 2a  tdio.h> header *
0f30: 2f 0a 20 20 20 65 78 74 65 72 6e 20 46 49 4c 45  /.   extern FILE
0f40: 20 2a 70 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68   *popen(const ch
0f50: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
0f60: 3b 0a 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ;.   extern int 
0f70: 70 63 6c 6f 73 65 28 46 49 4c 45 2a 29 3b 0a 23  pclose(FILE*);.#
0f80: 20 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20   else.#  define 
0f90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45  SQLITE_OMIT_POPE
0fa0: 4e 20 31 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  N 1.# endif.#end
0fb0: 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
0fc0: 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 20 57  _WIN32_WCE)./* W
0fd0: 69 6e 64 6f 77 73 20 43 45 20 28 61 72 6d 2d 77  indows CE (arm-w
0fe0: 69 6e 63 65 2d 6d 69 6e 67 77 33 32 63 65 2d 67  ince-mingw32ce-g
0ff0: 63 63 29 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f  cc) does not pro
1000: 76 69 64 65 20 69 73 61 74 74 79 28 29 0a 20 2a  vide isatty(). *
1010: 20 74 68 75 73 20 77 65 20 61 6c 77 61 79 73 20   thus we always 
1020: 61 73 73 75 6d 65 20 74 68 61 74 20 77 65 20 68  assume that we h
1030: 61 76 65 20 61 20 63 6f 6e 73 6f 6c 65 2e 20 54  ave a console. T
1040: 68 61 74 20 63 61 6e 20 62 65 0a 20 2a 20 6f 76  hat can be. * ov
1050: 65 72 72 69 64 64 65 6e 20 77 69 74 68 20 74 68  erridden with th
1060: 65 20 2d 62 61 74 63 68 20 63 6f 6d 6d 61 6e 64  e -batch command
1070: 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a 20 2a   line option.. *
1080: 2f 0a 23 64 65 66 69 6e 65 20 69 73 61 74 74 79  /.#define isatty
1090: 28 78 29 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x) 1.#endif../*
10a0: 20 63 74 79 70 65 20 6d 61 63 72 6f 73 20 74 68   ctype macros th
10b0: 61 74 20 77 6f 72 6b 20 77 69 74 68 20 73 69 67  at work with sig
10c0: 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 20 2a  ned characters *
10d0: 2f 0a 23 64 65 66 69 6e 65 20 49 73 53 70 61 63  /.#define IsSpac
10e0: 65 28 58 29 20 20 69 73 73 70 61 63 65 28 28 75  e(X)  isspace((u
10f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a  nsigned char)X).
1100: 23 64 65 66 69 6e 65 20 49 73 44 69 67 69 74 28  #define IsDigit(
1110: 58 29 20 20 69 73 64 69 67 69 74 28 28 75 6e 73  X)  isdigit((uns
1120: 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a 23 64  igned char)X).#d
1130: 65 66 69 6e 65 20 54 6f 4c 6f 77 65 72 28 58 29  efine ToLower(X)
1140: 20 20 28 63 68 61 72 29 74 6f 6c 6f 77 65 72 28    (char)tolower(
1150: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58  (unsigned char)X
1160: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
1170: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
1180: 64 28 57 49 4e 33 32 29 0a 23 69 6e 63 6c 75 64  d(WIN32).#includ
1190: 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 0a 2f  e <windows.h>../
11a0: 2a 20 73 74 72 69 6e 67 20 63 6f 6e 76 65 72 73  * string convers
11b0: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 6f 6e 6c  ion routines onl
11c0: 79 20 6e 65 65 64 65 64 20 6f 6e 20 57 69 6e 33  y needed on Win3
11d0: 32 20 2a 2f 0a 65 78 74 65 72 6e 20 63 68 61 72  2 */.extern char
11e0: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
11f0: 75 6e 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28  unicode_to_utf8(
1200: 4c 50 43 57 53 54 52 29 3b 0a 65 78 74 65 72 6e  LPCWSTR);.extern
1210: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77   char *sqlite3_w
1220: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
1230: 38 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20  8_v2(const char 
1240: 2a 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20  *, int);.extern 
1250: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
1260: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73  n32_utf8_to_mbcs
1270: 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  _v2(const char *
1280: 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20 4c  , int);.extern L
1290: 50 57 53 54 52 20 73 71 6c 69 74 65 33 5f 77 69  PWSTR sqlite3_wi
12a0: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63  n32_utf8_to_unic
12b0: 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ode(const char *
12c0: 7a 54 65 78 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  zText);.#endif..
12d0: 2f 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 2c 20 77  /* On Windows, w
12e0: 65 20 6e 6f 72 6d 61 6c 6c 79 20 72 75 6e 20 77  e normally run w
12f0: 69 74 68 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  ith output mode 
1300: 6f 66 20 54 45 58 54 20 73 6f 20 74 68 61 74 20  of TEXT so that 
1310: 5c 6e 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a  \n characters.**
1320: 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
1330: 6c 79 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e  ly translated in
1340: 74 6f 20 5c 72 5c 6e 2e 20 20 48 6f 77 65 76 65  to \r\n.  Howeve
1350: 72 2c 20 74 68 69 73 20 62 65 68 61 76 69 6f 72  r, this behavior
1360: 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20   needs.** to be 
1370: 64 69 73 61 62 6c 65 64 20 69 6e 20 73 6f 6d 65  disabled in some
1380: 20 63 61 73 65 73 20 28 65 78 3a 20 77 68 65 6e   cases (ex: when
1390: 20 67 65 6e 65 72 61 74 69 6e 67 20 43 53 56 20   generating CSV 
13a0: 6f 75 74 70 75 74 20 61 6e 64 20 77 68 65 6e 0a  output and when.
13b0: 2a 2a 20 72 65 6e 64 65 72 69 6e 67 20 71 75 6f  ** rendering quo
13c0: 74 65 64 20 73 74 72 69 6e 67 73 20 74 68 61 74  ted strings that
13d0: 20 63 6f 6e 74 61 69 6e 20 5c 6e 20 63 68 61 72   contain \n char
13e0: 61 63 74 65 72 73 29 2e 20 20 54 68 65 20 66 6f  acters).  The fo
13f0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
1400: 6e 65 73 20 74 61 6b 65 20 63 61 72 65 20 6f 66  nes take care of
1410: 20 74 68 61 74 2e 0a 2a 2f 0a 23 69 66 20 64 65   that..*/.#if de
1420: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
1430: 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a   defined(WIN32).
1440: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 42  static void setB
1450: 69 6e 61 72 79 4d 6f 64 65 28 46 49 4c 45 20 2a  inaryMode(FILE *
1460: 66 69 6c 65 2c 20 69 6e 74 20 69 73 4f 75 74 70  file, int isOutp
1470: 75 74 29 7b 0a 20 20 69 66 28 20 69 73 4f 75 74  ut){.  if( isOut
1480: 70 75 74 20 29 20 66 66 6c 75 73 68 28 66 69 6c  put ) fflush(fil
1490: 65 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65 28 5f  e);.  _setmode(_
14a0: 66 69 6c 65 6e 6f 28 66 69 6c 65 29 2c 20 5f 4f  fileno(file), _O
14b0: 5f 42 49 4e 41 52 59 29 3b 0a 7d 0a 73 74 61 74  _BINARY);.}.stat
14c0: 69 63 20 76 6f 69 64 20 73 65 74 54 65 78 74 4d  ic void setTextM
14d0: 6f 64 65 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20  ode(FILE *file, 
14e0: 69 6e 74 20 69 73 4f 75 74 70 75 74 29 7b 0a 20  int isOutput){. 
14f0: 20 69 66 28 20 69 73 4f 75 74 70 75 74 20 29 20   if( isOutput ) 
1500: 66 66 6c 75 73 68 28 66 69 6c 65 29 3b 0a 20 20  fflush(file);.  
1510: 5f 73 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f  _setmode(_fileno
1520: 28 66 69 6c 65 29 2c 20 5f 4f 5f 54 45 58 54 29  (file), _O_TEXT)
1530: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1540: 6e 65 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65  ne setBinaryMode
1550: 28 58 2c 59 29 0a 23 20 64 65 66 69 6e 65 20 73  (X,Y).# define s
1560: 65 74 54 65 78 74 4d 6f 64 65 28 58 2c 59 29 0a  etTextMode(X,Y).
1570: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 54 72 75 65  #endif.../* True
1580: 20 69 66 20 74 68 65 20 74 69 6d 65 72 20 69 73   if the timer is
1590: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74   enabled */.stat
15a0: 69 63 20 69 6e 74 20 65 6e 61 62 6c 65 54 69 6d  ic int enableTim
15b0: 65 72 20 3d 20 30 3b 0a 0a 2f 2a 20 52 65 74 75  er = 0;../* Retu
15c0: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 77  rn the current w
15d0: 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 2a  all-clock time *
15e0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
15f0: 5f 69 6e 74 36 34 20 74 69 6d 65 4f 66 44 61 79  _int64 timeOfDay
1600: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
1610: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 63 6c   sqlite3_vfs *cl
1620: 6f 63 6b 56 66 73 20 3d 20 30 3b 0a 20 20 73 71  ockVfs = 0;.  sq
1630: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 3b 0a 20  lite3_int64 t;. 
1640: 20 69 66 28 20 63 6c 6f 63 6b 56 66 73 3d 3d 30   if( clockVfs==0
1650: 20 29 20 63 6c 6f 63 6b 56 66 73 20 3d 20 73 71   ) clockVfs = sq
1660: 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1670: 29 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66  );.  if( clockVf
1680: 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32 20 26  s->iVersion>=2 &
1690: 26 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72  & clockVfs->xCur
16a0: 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 21 3d 30  rentTimeInt64!=0
16b0: 20 29 7b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73   ){.    clockVfs
16c0: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  ->xCurrentTimeIn
16d0: 74 36 34 28 63 6c 6f 63 6b 56 66 73 2c 20 26 74  t64(clockVfs, &t
16e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16f0: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 63 6c  double r;.    cl
1700: 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74  ockVfs->xCurrent
1710: 54 69 6d 65 28 63 6c 6f 63 6b 56 66 73 2c 20 26  Time(clockVfs, &
1720: 72 29 3b 0a 20 20 20 20 74 20 3d 20 28 73 71 6c  r);.    t = (sql
1730: 69 74 65 33 5f 69 6e 74 36 34 29 28 72 2a 38 36  ite3_int64)(r*86
1740: 34 30 30 30 30 30 2e 30 29 3b 0a 20 20 7d 0a 20  400000.0);.  }. 
1750: 20 72 65 74 75 72 6e 20 74 3b 0a 7d 0a 0a 23 69   return t;.}..#i
1760: 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  f !defined(_WIN3
1770: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 57  2) && !defined(W
1780: 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65  IN32) && !define
1790: 64 28 5f 5f 6d 69 6e 75 78 29 0a 23 69 6e 63 6c  d(__minux).#incl
17a0: 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e  ude <sys/time.h>
17b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72  .#include <sys/r
17c0: 65 73 6f 75 72 63 65 2e 68 3e 0a 0a 2f 2a 20 56  esource.h>../* V
17d0: 78 57 6f 72 6b 73 20 64 6f 65 73 20 6e 6f 74 20  xWorks does not 
17e0: 73 75 70 70 6f 72 74 20 67 65 74 72 75 73 61 67  support getrusag
17f0: 65 28 29 20 61 73 20 66 61 72 20 61 73 20 77 65  e() as far as we
1800: 20 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 20 2a   can determine *
1810: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  /.#if defined(_W
1820: 52 53 5f 4b 45 52 4e 45 4c 29 20 7c 7c 20 64 65  RS_KERNEL) || de
1830: 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 0a 73  fined(__RTP__).s
1840: 74 72 75 63 74 20 72 75 73 61 67 65 20 7b 0a 20  truct rusage {. 
1850: 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
1860: 72 75 5f 75 74 69 6d 65 3b 20 2f 2a 20 75 73 65  ru_utime; /* use
1870: 72 20 43 50 55 20 74 69 6d 65 20 75 73 65 64 20  r CPU time used 
1880: 2a 2f 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  */.  struct time
1890: 76 61 6c 20 72 75 5f 73 74 69 6d 65 3b 20 2f 2a  val ru_stime; /*
18a0: 20 73 79 73 74 65 6d 20 43 50 55 20 74 69 6d 65   system CPU time
18b0: 20 75 73 65 64 20 2a 2f 0a 7d 3b 0a 23 64 65 66   used */.};.#def
18c0: 69 6e 65 20 67 65 74 72 75 73 61 67 65 28 41 2c  ine getrusage(A,
18d0: 42 29 20 6d 65 6d 73 65 74 28 42 2c 30 2c 73 69  B) memset(B,0,si
18e0: 7a 65 6f 66 28 2a 42 29 29 0a 23 65 6e 64 69 66  zeof(*B)).#endif
18f0: 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75  ../* Saved resou
1900: 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  rce information 
1910: 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  for the beginnin
1920: 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  g of an operatio
1930: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  n */.static stru
1940: 63 74 20 72 75 73 61 67 65 20 73 42 65 67 69 6e  ct rusage sBegin
1950: 3b 20 20 2f 2a 20 43 50 55 20 74 69 6d 65 20 61  ;  /* CPU time a
1960: 74 20 73 74 61 72 74 20 2a 2f 0a 73 74 61 74 69  t start */.stati
1970: 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  c sqlite3_int64 
1980: 69 42 65 67 69 6e 3b 20 20 2f 2a 20 57 61 6c 6c  iBegin;  /* Wall
1990: 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 61 74 20 73  -clock time at s
19a0: 74 61 72 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42  tart */../*.** B
19b0: 65 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f  egin timing an o
19c0: 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  peration.*/.stat
19d0: 69 63 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d  ic void beginTim
19e0: 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  er(void){.  if( 
19f0: 65 6e 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20  enableTimer ){. 
1a00: 20 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53     getrusage(RUS
1a10: 41 47 45 5f 53 45 4c 46 2c 20 26 73 42 65 67 69  AGE_SELF, &sBegi
1a20: 6e 29 3b 0a 20 20 20 20 69 42 65 67 69 6e 20 3d  n);.    iBegin =
1a30: 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20   timeOfDay();.  
1a40: 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  }.}../* Return t
1a50: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 6f 66  he difference of
1a60: 20 74 77 6f 20 74 69 6d 65 5f 73 74 72 75 63 74   two time_struct
1a70: 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a  s in seconds */.
1a80: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69  static double ti
1a90: 6d 65 44 69 66 66 28 73 74 72 75 63 74 20 74 69  meDiff(struct ti
1aa0: 6d 65 76 61 6c 20 2a 70 53 74 61 72 74 2c 20 73  meval *pStart, s
1ab0: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70  truct timeval *p
1ac0: 45 6e 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  End){.  return (
1ad0: 70 45 6e 64 2d 3e 74 76 5f 75 73 65 63 20 2d 20  pEnd->tv_usec - 
1ae0: 70 53 74 61 72 74 2d 3e 74 76 5f 75 73 65 63 29  pStart->tv_usec)
1af0: 2a 30 2e 30 30 30 30 30 31 20 2b 0a 20 20 20 20  *0.000001 +.    
1b00: 20 20 20 20 20 28 64 6f 75 62 6c 65 29 28 70 45       (double)(pE
1b10: 6e 64 2d 3e 74 76 5f 73 65 63 20 2d 20 70 53 74  nd->tv_sec - pSt
1b20: 61 72 74 2d 3e 74 76 5f 73 65 63 29 3b 0a 7d 0a  art->tv_sec);.}.
1b30: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
1b40: 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e   timing results.
1b50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b60: 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  endTimer(void){.
1b70: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
1b80: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1b90: 5f 69 6e 74 36 34 20 69 45 6e 64 20 3d 20 74 69  _int64 iEnd = ti
1ba0: 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20 20 20 73  meOfDay();.    s
1bb0: 74 72 75 63 74 20 72 75 73 61 67 65 20 73 45 6e  truct rusage sEn
1bc0: 64 3b 0a 20 20 20 20 67 65 74 72 75 73 61 67 65  d;.    getrusage
1bd0: 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73  (RUSAGE_SELF, &s
1be0: 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  End);.    printf
1bf0: 28 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c  ("Run Time: real
1c00: 20 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79   %.3f user %f sy
1c10: 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s %f\n",.       
1c20: 28 69 45 6e 64 20 2d 20 69 42 65 67 69 6e 29 2a  (iEnd - iBegin)*
1c30: 30 2e 30 30 31 2c 0a 20 20 20 20 20 20 20 74 69  0.001,.       ti
1c40: 6d 65 44 69 66 66 28 26 73 42 65 67 69 6e 2e 72  meDiff(&sBegin.r
1c50: 75 5f 75 74 69 6d 65 2c 20 26 73 45 6e 64 2e 72  u_utime, &sEnd.r
1c60: 75 5f 75 74 69 6d 65 29 2c 0a 20 20 20 20 20 20  u_utime),.      
1c70: 20 74 69 6d 65 44 69 66 66 28 26 73 42 65 67 69   timeDiff(&sBegi
1c80: 6e 2e 72 75 5f 73 74 69 6d 65 2c 20 26 73 45 6e  n.ru_stime, &sEn
1c90: 64 2e 72 75 5f 73 74 69 6d 65 29 29 3b 0a 20 20  d.ru_stime));.  
1ca0: 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47  }.}..#define BEG
1cb0: 49 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69  IN_TIMER beginTi
1cc0: 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e  mer().#define EN
1cd0: 44 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72  D_TIMER endTimer
1ce0: 28 29 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54  ().#define HAS_T
1cf0: 49 4d 45 52 20 31 0a 0a 23 65 6c 69 66 20 28 64  IMER 1..#elif (d
1d00: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
1d10: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
1d20: 29 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f  )../* Saved reso
1d30: 75 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  urce information
1d40: 20 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69   for the beginni
1d50: 6e 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ng of an operati
1d60: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 48 41 4e  on */.static HAN
1d70: 44 4c 45 20 68 50 72 6f 63 65 73 73 3b 0a 73 74  DLE hProcess;.st
1d80: 61 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74  atic FILETIME ft
1d90: 4b 65 72 6e 65 6c 42 65 67 69 6e 3b 0a 73 74 61  KernelBegin;.sta
1da0: 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74 55  tic FILETIME ftU
1db0: 73 65 72 42 65 67 69 6e 3b 0a 73 74 61 74 69 63  serBegin;.static
1dc0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66   sqlite3_int64 f
1dd0: 74 57 61 6c 6c 42 65 67 69 6e 3b 0a 74 79 70 65  tWallBegin;.type
1de0: 64 65 66 20 42 4f 4f 4c 20 28 57 49 4e 41 50 49  def BOOL (WINAPI
1df0: 20 2a 47 45 54 50 52 4f 43 54 49 4d 45 53 29 28   *GETPROCTIMES)(
1e00: 48 41 4e 44 4c 45 2c 20 4c 50 46 49 4c 45 54 49  HANDLE, LPFILETI
1e10: 4d 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 2c 0a  ME, LPFILETIME,.
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 2c 20      LPFILETIME, 
1e50: 4c 50 46 49 4c 45 54 49 4d 45 29 3b 0a 73 74 61  LPFILETIME);.sta
1e60: 74 69 63 20 47 45 54 50 52 4f 43 54 49 4d 45 53  tic GETPROCTIMES
1e70: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
1e80: 41 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a  Addr = NULL;../*
1e90: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
1ea0: 20 69 66 20 77 65 20 68 61 76 65 20 74 69 6d 65   if we have time
1eb0: 72 20 73 75 70 70 6f 72 74 2e 20 20 52 65 74 75  r support.  Retu
1ec0: 72 6e 20 31 20 69 66 20 6e 65 63 65 73 73 61 72  rn 1 if necessar
1ed0: 79 0a 2a 2a 20 73 75 70 70 6f 72 74 20 66 6f 75  y.** support fou
1ee0: 6e 64 20 28 6f 72 20 66 6f 75 6e 64 20 70 72 65  nd (or found pre
1ef0: 76 69 6f 75 73 6c 79 29 2e 0a 2a 2f 0a 73 74 61  viously)..*/.sta
1f00: 74 69 63 20 69 6e 74 20 68 61 73 54 69 6d 65 72  tic int hasTimer
1f10: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 67 65  (void){.  if( ge
1f20: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64  tProcessTimesAdd
1f30: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
1f40: 31 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  1;.  } else {.  
1f50: 20 20 2f 2a 20 47 65 74 50 72 6f 63 65 73 73 54    /* GetProcessT
1f60: 69 6d 65 73 28 29 20 69 73 6e 27 74 20 73 75 70  imes() isn't sup
1f70: 70 6f 72 74 65 64 20 69 6e 20 57 49 4e 39 35 20  ported in WIN95 
1f80: 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72 20 57  and some other W
1f90: 69 6e 64 6f 77 73 0a 20 20 20 20 2a 2a 20 76 65  indows.    ** ve
1fa0: 72 73 69 6f 6e 73 2e 20 53 65 65 20 69 66 20 74  rsions. See if t
1fb0: 68 65 20 76 65 72 73 69 6f 6e 20 77 65 20 61 72  he version we ar
1fc0: 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 68 61 73  e running on has
1fd0: 20 69 74 2c 20 61 6e 64 20 69 66 20 69 74 0a 20   it, and if it. 
1fe0: 20 20 20 2a 2a 20 64 6f 65 73 2c 20 73 61 76 65     ** does, save
1ff0: 20 6f 66 66 20 61 20 70 6f 69 6e 74 65 72 20 74   off a pointer t
2000: 6f 20 69 74 20 61 6e 64 20 74 68 65 20 63 75 72  o it and the cur
2010: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 68 61 6e  rent process han
2020: 64 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dle..    */.    
2030: 68 50 72 6f 63 65 73 73 20 3d 20 47 65 74 43 75  hProcess = GetCu
2040: 72 72 65 6e 74 50 72 6f 63 65 73 73 28 29 3b 0a  rrentProcess();.
2050: 20 20 20 20 69 66 28 20 68 50 72 6f 63 65 73 73      if( hProcess
2060: 20 29 7b 0a 20 20 20 20 20 20 48 49 4e 53 54 41   ){.      HINSTA
2070: 4e 43 45 20 68 69 6e 73 74 4c 69 62 20 3d 20 4c  NCE hinstLib = L
2080: 6f 61 64 4c 69 62 72 61 72 79 28 54 45 58 54 28  oadLibrary(TEXT(
2090: 22 4b 65 72 6e 65 6c 33 32 2e 64 6c 6c 22 29 29  "Kernel32.dll"))
20a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c  ;.      if( NULL
20b0: 20 21 3d 20 68 69 6e 73 74 4c 69 62 20 29 7b 0a   != hinstLib ){.
20c0: 20 20 20 20 20 20 20 20 67 65 74 50 72 6f 63 65          getProce
20d0: 73 73 54 69 6d 65 73 41 64 64 72 20 3d 0a 20 20  ssTimesAddr =.  
20e0: 20 20 20 20 20 20 20 20 20 20 28 47 45 54 50 52            (GETPR
20f0: 4f 43 54 49 4d 45 53 29 20 47 65 74 50 72 6f 63  OCTIMES) GetProc
2100: 41 64 64 72 65 73 73 28 68 69 6e 73 74 4c 69 62  Address(hinstLib
2110: 2c 20 22 47 65 74 50 72 6f 63 65 73 73 54 69 6d  , "GetProcessTim
2120: 65 73 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  es");.        if
2130: 28 20 4e 55 4c 4c 20 21 3d 20 67 65 74 50 72 6f  ( NULL != getPro
2140: 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 29 7b  cessTimesAddr ){
2150: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2160: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
2170: 20 20 20 20 20 20 20 46 72 65 65 4c 69 62 72 61         FreeLibra
2180: 72 79 28 68 69 6e 73 74 4c 69 62 29 3b 0a 20 20  ry(hinstLib);.  
2190: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
21a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
21b0: 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69 6d 69 6e  *.** Begin timin
21c0: 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  g an operation.*
21d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
21e0: 67 69 6e 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  ginTimer(void){.
21f0: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
2200: 72 20 26 26 20 67 65 74 50 72 6f 63 65 73 73 54  r && getProcessT
2210: 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20  imesAddr ){.    
2220: 46 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74  FILETIME ftCreat
2230: 69 6f 6e 2c 20 66 74 45 78 69 74 3b 0a 20 20 20  ion, ftExit;.   
2240: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
2250: 41 64 64 72 28 68 50 72 6f 63 65 73 73 2c 26 66  Addr(hProcess,&f
2260: 74 43 72 65 61 74 69 6f 6e 2c 26 66 74 45 78 69  tCreation,&ftExi
2270: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2280: 20 20 20 20 20 20 20 20 20 20 20 26 66 74 4b 65             &ftKe
2290: 72 6e 65 6c 42 65 67 69 6e 2c 26 66 74 55 73 65  rnelBegin,&ftUse
22a0: 72 42 65 67 69 6e 29 3b 0a 20 20 20 20 66 74 57  rBegin);.    ftW
22b0: 61 6c 6c 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f  allBegin = timeO
22c0: 66 44 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  fDay();.  }.}../
22d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 66  * Return the dif
22e0: 66 65 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 46  ference of two F
22f0: 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 73 20  ILETIME structs 
2300: 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 73 74  in seconds */.st
2310: 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69 6d 65  atic double time
2320: 44 69 66 66 28 46 49 4c 45 54 49 4d 45 20 2a 70  Diff(FILETIME *p
2330: 53 74 61 72 74 2c 20 46 49 4c 45 54 49 4d 45 20  Start, FILETIME 
2340: 2a 70 45 6e 64 29 7b 0a 20 20 73 71 6c 69 74 65  *pEnd){.  sqlite
2350: 5f 69 6e 74 36 34 20 69 36 34 53 74 61 72 74 20  _int64 i64Start 
2360: 3d 20 2a 28 28 73 71 6c 69 74 65 5f 69 6e 74 36  = *((sqlite_int6
2370: 34 20 2a 29 20 70 53 74 61 72 74 29 3b 0a 20 20  4 *) pStart);.  
2380: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 36 34  sqlite_int64 i64
2390: 45 6e 64 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f  End = *((sqlite_
23a0: 69 6e 74 36 34 20 2a 29 20 70 45 6e 64 29 3b 0a  int64 *) pEnd);.
23b0: 20 20 72 65 74 75 72 6e 20 28 64 6f 75 62 6c 65    return (double
23c0: 29 20 28 28 69 36 34 45 6e 64 20 2d 20 69 36 34  ) ((i64End - i64
23d0: 53 74 61 72 74 29 20 2f 20 31 30 30 30 30 30 30  Start) / 1000000
23e0: 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  0.0);.}../*.** P
23f0: 72 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67 20  rint the timing 
2400: 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74  results..*/.stat
2410: 69 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65 72  ic void endTimer
2420: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e  (void){.  if( en
2430: 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74  ableTimer && get
2440: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
2450: 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45 20  ){.    FILETIME 
2460: 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45 78  ftCreation, ftEx
2470: 69 74 2c 20 66 74 4b 65 72 6e 65 6c 45 6e 64 2c  it, ftKernelEnd,
2480: 20 66 74 55 73 65 72 45 6e 64 3b 0a 20 20 20 20   ftUserEnd;.    
2490: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 74  sqlite3_int64 ft
24a0: 57 61 6c 6c 45 6e 64 20 3d 20 74 69 6d 65 4f 66  WallEnd = timeOf
24b0: 44 61 79 28 29 3b 0a 20 20 20 20 67 65 74 50 72  Day();.    getPr
24c0: 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 28 68  ocessTimesAddr(h
24d0: 50 72 6f 63 65 73 73 2c 26 66 74 43 72 65 61 74  Process,&ftCreat
24e0: 69 6f 6e 2c 26 66 74 45 78 69 74 2c 26 66 74 4b  ion,&ftExit,&ftK
24f0: 65 72 6e 65 6c 45 6e 64 2c 26 66 74 55 73 65 72  ernelEnd,&ftUser
2500: 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  End);.    printf
2510: 28 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c  ("Run Time: real
2520: 20 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79   %.3f user %f sy
2530: 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s %f\n",.       
2540: 28 66 74 57 61 6c 6c 45 6e 64 20 2d 20 66 74 57  (ftWallEnd - ftW
2550: 61 6c 6c 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c  allBegin)*0.001,
2560: 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69 66 66  .       timeDiff
2570: 28 26 66 74 55 73 65 72 42 65 67 69 6e 2c 20 26  (&ftUserBegin, &
2580: 66 74 55 73 65 72 45 6e 64 29 2c 0a 20 20 20 20  ftUserEnd),.    
2590: 20 20 20 74 69 6d 65 44 69 66 66 28 26 66 74 4b     timeDiff(&ftK
25a0: 65 72 6e 65 6c 42 65 67 69 6e 2c 20 26 66 74 4b  ernelBegin, &ftK
25b0: 65 72 6e 65 6c 45 6e 64 29 29 3b 0a 20 20 7d 0a  ernelEnd));.  }.
25c0: 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47 49 4e  }..#define BEGIN
25d0: 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69 6d 65  _TIMER beginTime
25e0: 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f  r().#define END_
25f0: 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72 28 29  TIMER endTimer()
2600: 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54 49 4d  .#define HAS_TIM
2610: 45 52 20 68 61 73 54 69 6d 65 72 28 29 0a 0a 23  ER hasTimer()..#
2620: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 42 45 47  else.#define BEG
2630: 49 4e 5f 54 49 4d 45 52 0a 23 64 65 66 69 6e 65  IN_TIMER.#define
2640: 20 45 4e 44 5f 54 49 4d 45 52 0a 23 64 65 66 69   END_TIMER.#defi
2650: 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 30 0a 23  ne HAS_TIMER 0.#
2660: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65  endif../*.** Use
2670: 64 20 74 6f 20 70 72 65 76 65 6e 74 20 77 61 72  d to prevent war
2680: 6e 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73  nings about unus
2690: 65 64 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2f  ed parameters.*/
26a0: 0a 23 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f  .#define UNUSED_
26b0: 50 41 52 41 4d 45 54 45 52 28 78 29 20 28 76 6f  PARAMETER(x) (vo
26c0: 69 64 29 28 78 29 0a 0a 2f 2a 0a 2a 2a 20 4e 75  id)(x)../*.** Nu
26d0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
26e0: 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2f 0a   in an array.*/.
26f0: 23 64 65 66 69 6e 65 20 41 72 72 61 79 53 69 7a  #define ArraySiz
2700: 65 28 58 29 20 20 28 69 6e 74 29 28 73 69 7a 65  e(X)  (int)(size
2710: 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30  of(X)/sizeof(X[0
2720: 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ]))../*.** If th
2730: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6c 61 67  e following flag
2740: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 63 6f   is set, then co
2750: 6d 6d 61 6e 64 20 65 78 65 63 75 74 69 6f 6e 20  mmand execution 
2760: 73 74 6f 70 73 0a 2a 2a 20 61 74 20 61 6e 20 65  stops.** at an e
2770: 72 72 6f 72 20 69 66 20 77 65 20 61 72 65 20 6e  rror if we are n
2780: 6f 74 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a  ot interactive..
2790: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
27a0: 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 30 3b  il_on_error = 0;
27b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 72 65 61 74 20 73  ../*.** Threat s
27c0: 74 64 69 6e 20 61 73 20 61 6e 20 69 6e 74 65 72  tdin as an inter
27d0: 61 63 74 69 76 65 20 69 6e 70 75 74 20 69 66 20  active input if 
27e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  the following va
27f0: 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 74 72 75  riable.** is tru
2800: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  e.  Otherwise, a
2810: 73 73 75 6d 65 20 73 74 64 69 6e 20 69 73 20 63  ssume stdin is c
2820: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 66 69  onnected to a fi
2830: 6c 65 20 6f 72 20 70 69 70 65 2e 0a 2a 2f 0a 73  le or pipe..*/.s
2840: 74 61 74 69 63 20 69 6e 74 20 73 74 64 69 6e 5f  tatic int stdin_
2850: 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d  is_interactive =
2860: 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 57 69   1;../*.** On Wi
2870: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 77 65  ndows systems we
2880: 20 68 61 76 65 20 74 6f 20 6b 6e 6f 77 20 69 66   have to know if
2890: 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
28a0: 20 69 73 20 61 20 63 6f 6e 73 6f 6c 65 0a 2a 2a   is a console.**
28b0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 72 61   in order to tra
28c0: 6e 73 6c 61 74 65 20 55 54 46 2d 38 20 69 6e 74  nslate UTF-8 int
28d0: 6f 20 4d 42 43 53 2e 20 20 54 68 65 20 66 6f 6c  o MBCS.  The fol
28e0: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
28f0: 69 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 72  is.** true if tr
2900: 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 72 65 71  anslation is req
2910: 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  uired..*/.static
2920: 20 69 6e 74 20 73 74 64 6f 75 74 5f 69 73 5f 63   int stdout_is_c
2930: 6f 6e 73 6f 6c 65 20 3d 20 31 3b 0a 0a 2f 2a 0a  onsole = 1;../*.
2940: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2950: 20 69 73 20 74 68 65 20 6f 70 65 6e 20 53 51 4c   is the open SQL
2960: 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 57  ite database.  W
2970: 65 20 6d 61 6b 65 20 61 20 70 6f 69 6e 74 65 72  e make a pointer
2980: 0a 2a 2a 20 74 6f 20 74 68 69 73 20 64 61 74 61  .** to this data
2990: 62 61 73 65 20 61 20 73 74 61 74 69 63 20 76 61  base a static va
29a0: 72 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 69  riable so that i
29b0: 74 20 63 61 6e 20 62 65 20 61 63 63 65 73 73 65  t can be accesse
29c0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 53 49 47 49  d.** by the SIGI
29d0: 4e 54 20 68 61 6e 64 6c 65 72 20 74 6f 20 69 6e  NT handler to in
29e0: 74 65 72 72 75 70 74 20 64 61 74 61 62 61 73 65  terrupt database
29f0: 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a   processing..*/.
2a00: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 20 2a  static sqlite3 *
2a10: 67 6c 6f 62 61 6c 44 62 20 3d 20 30 3b 0a 0a 2f  globalDb = 0;../
2a20: 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 61 6e 20  *.** True if an 
2a30: 69 6e 74 65 72 72 75 70 74 20 28 43 6f 6e 74 72  interrupt (Contr
2a40: 6f 6c 2d 43 29 20 68 61 73 20 62 65 65 6e 20 72  ol-C) has been r
2a50: 65 63 65 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  eceived..*/.stat
2a60: 69 63 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20  ic volatile int 
2a70: 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20  seenInterrupt = 
2a80: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  0;../*.** This i
2a90: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 6f 75  s the name of ou
2aa0: 72 20 70 72 6f 67 72 61 6d 2e 20 49 74 20 69 73  r program. It is
2ab0: 20 73 65 74 20 69 6e 20 6d 61 69 6e 28 29 2c 20   set in main(), 
2ac0: 75 73 65 64 0a 2a 2a 20 69 6e 20 61 20 6e 75 6d  used.** in a num
2ad0: 62 65 72 20 6f 66 20 6f 74 68 65 72 20 70 6c 61  ber of other pla
2ae0: 63 65 73 2c 20 6d 6f 73 74 6c 79 20 66 6f 72 20  ces, mostly for 
2af0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
2b00: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2b10: 41 72 67 76 30 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72  Argv0;../*.** Pr
2b20: 6f 6d 70 74 20 73 74 72 69 6e 67 73 2e 20 49 6e  ompt strings. In
2b30: 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 6d 61 69  itialized in mai
2b40: 6e 2e 20 53 65 74 74 61 62 6c 65 20 77 69 74 68  n. Settable with
2b50: 0a 2a 2a 20 20 20 2e 70 72 6f 6d 70 74 20 6d 61  .**   .prompt ma
2b60: 69 6e 20 63 6f 6e 74 69 6e 75 65 0a 2a 2f 0a 73  in continue.*/.s
2b70: 74 61 74 69 63 20 63 68 61 72 20 6d 61 69 6e 50  tatic char mainP
2b80: 72 6f 6d 70 74 5b 32 30 5d 3b 20 20 20 20 20 2f  rompt[20];     /
2b90: 2a 20 46 69 72 73 74 20 6c 69 6e 65 20 70 72 6f  * First line pro
2ba0: 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 73  mpt. default: "s
2bb0: 71 6c 69 74 65 3e 20 22 2a 2f 0a 73 74 61 74 69  qlite> "*/.stati
2bc0: 63 20 63 68 61 72 20 63 6f 6e 74 69 6e 75 65 50  c char continueP
2bd0: 72 6f 6d 70 74 5b 32 30 5d 3b 20 2f 2a 20 43 6f  rompt[20]; /* Co
2be0: 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70  ntinuation promp
2bf0: 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 20 20 20  t. default: "   
2c00: 2e 2e 2e 3e 20 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ...> " */../*.**
2c10: 20 52 65 6e 64 65 72 20 6f 75 74 70 75 74 20 6c   Render output l
2c20: 69 6b 65 20 66 70 72 69 6e 74 66 28 29 2e 20 20  ike fprintf().  
2c30: 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f  Except, if the o
2c40: 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74  utput is going t
2c50: 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 73 6f 6c 65  o the.** console
2c60: 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
2c70: 72 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 57 69 6e  running on a Win
2c80: 64 6f 77 73 20 6d 61 63 68 69 6e 65 2c 20 74 72  dows machine, tr
2c90: 61 6e 73 6c 61 74 65 20 74 68 65 0a 2a 2a 20 6f  anslate the.** o
2ca0: 75 74 70 75 74 20 66 72 6f 6d 20 55 54 46 2d 38  utput from UTF-8
2cb0: 20 69 6e 74 6f 20 4d 42 43 53 2e 0a 2a 2f 0a 23   into MBCS..*/.#
2cc0: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
2cd0: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
2ce0: 4e 33 32 29 0a 76 6f 69 64 20 75 74 66 38 5f 70  N32).void utf8_p
2cf0: 72 69 6e 74 66 28 46 49 4c 45 20 2a 6f 75 74 2c  rintf(FILE *out,
2d00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
2d10: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
2d20: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
2d30: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
2d40: 29 3b 0a 20 20 69 66 28 20 73 74 64 6f 75 74 5f  );.  if( stdout_
2d50: 69 73 5f 63 6f 6e 73 6f 6c 65 20 26 26 20 28 6f  is_console && (o
2d60: 75 74 3d 3d 73 74 64 6f 75 74 20 7c 7c 20 6f 75  ut==stdout || ou
2d70: 74 3d 3d 73 74 64 65 72 72 29 20 29 7b 0a 20 20  t==stderr) ){.  
2d80: 20 20 63 68 61 72 20 2a 7a 31 20 3d 20 73 71 6c    char *z1 = sql
2d90: 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
2da0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
2db0: 63 68 61 72 20 2a 7a 32 20 3d 20 73 71 6c 69 74  char *z2 = sqlit
2dc0: 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
2dd0: 5f 6d 62 63 73 5f 76 32 28 7a 31 2c 20 30 29 3b  _mbcs_v2(z1, 0);
2de0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2df0: 65 28 7a 31 29 3b 0a 20 20 20 20 66 70 75 74 73  e(z1);.    fputs
2e00: 28 7a 32 2c 20 6f 75 74 29 3b 0a 20 20 20 20 73  (z2, out);.    s
2e10: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 32 29 3b  qlite3_free(z2);
2e20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 66  .  }else{.    vf
2e30: 70 72 69 6e 74 66 28 6f 75 74 2c 20 7a 46 6f 72  printf(out, zFor
2e40: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 20 20  mat, ap);.  }.  
2e50: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65  va_end(ap);.}.#e
2e60: 6c 69 66 20 21 64 65 66 69 6e 65 64 28 75 74 66  lif !defined(utf
2e70: 38 5f 70 72 69 6e 74 66 29 0a 23 20 64 65 66 69  8_printf).# defi
2e80: 6e 65 20 75 74 66 38 5f 70 72 69 6e 74 66 20 66  ne utf8_printf f
2e90: 70 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a 2f  printf.#endif../
2ea0: 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 6f 75 74 70  *.** Render outp
2eb0: 75 74 20 6c 69 6b 65 20 66 70 72 69 6e 74 66 28  ut like fprintf(
2ec0: 29 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  ).  This should 
2ed0: 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 61  not be used on a
2ee0: 6e 79 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  nything that.** 
2ef0: 69 6e 63 6c 75 64 65 73 20 73 74 72 69 6e 67 20  includes string 
2f00: 66 6f 72 6d 61 74 74 69 6e 67 20 28 65 2e 67 2e  formatting (e.g.
2f10: 20 22 25 73 22 29 2e 0a 2a 2f 0a 23 69 66 20 21   "%s")..*/.#if !
2f20: 64 65 66 69 6e 65 64 28 72 61 77 5f 70 72 69 6e  defined(raw_prin
2f30: 74 66 29 0a 23 20 64 65 66 69 6e 65 20 72 61 77  tf).# define raw
2f40: 5f 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66 0a  _printf fprintf.
2f50: 23 65 6e 64 69 66 0a 0a 2f 2a 20 49 6e 64 69 63  #endif../* Indic
2f60: 61 74 65 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72  ate out-of-memor
2f70: 79 20 61 6e 64 20 65 78 69 74 2e 20 2a 2f 0a 73  y and exit. */.s
2f80: 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
2f90: 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 76  _out_of_memory(v
2fa0: 6f 69 64 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e  oid){.  raw_prin
2fb0: 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
2fc0: 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c  : out of memory\
2fd0: 6e 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a  n");.  exit(1);.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49  }../*.** Write I
2ff0: 2f 4f 20 74 72 61 63 65 73 20 74 6f 20 74 68 65  /O traces to the
3000: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61   following strea
3010: 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  m..*/.#ifdef SQL
3020: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
3030: 43 45 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  CE.static FILE *
3040: 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  iotrace = 0;.#en
3050: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
3060: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69  routine works li
3070: 6b 65 20 70 72 69 6e 74 66 20 69 6e 20 74 68 61  ke printf in tha
3080: 74 20 69 74 73 20 66 69 72 73 74 20 61 72 67 75  t its first argu
3090: 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72  ment is a.** for
30a0: 6d 61 74 20 73 74 72 69 6e 67 20 61 6e 64 20 73  mat string and s
30b0: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
30c0: 6e 74 73 20 61 72 65 20 76 61 6c 75 65 73 20 74  nts are values t
30d0: 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
30e0: 0a 2a 2a 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  .** in place of 
30f0: 25 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 72  % fields.  The r
3100: 65 73 75 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74  esult of formatt
3110: 69 6e 67 20 74 68 69 73 20 73 74 72 69 6e 67 0a  ing this string.
3120: 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ** is written to
3130: 20 69 6f 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66   iotrace..*/.#if
3140: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3150: 45 5f 49 4f 54 52 41 43 45 0a 73 74 61 74 69 63  E_IOTRACE.static
3160: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 43 44 45   void SQLITE_CDE
3170: 43 4c 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66  CL iotracePrintf
3180: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f  (const char *zFo
3190: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
31a0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
31b0: 20 2a 7a 3b 0a 20 20 69 66 28 20 69 6f 74 72 61   *z;.  if( iotra
31c0: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
31d0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
31e0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73  Format);.  z = s
31f0: 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
3200: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
3210: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 75 74  va_end(ap);.  ut
3220: 66 38 5f 70 72 69 6e 74 66 28 69 6f 74 72 61 63  f8_printf(iotrac
3230: 65 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73  e, "%s", z);.  s
3240: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
3250: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
3260: 4f 75 74 70 75 74 20 73 74 72 69 6e 67 20 7a 55  Output string zU
3270: 74 66 20 74 6f 20 73 74 72 65 61 6d 20 70 4f 75  tf to stream pOu
3280: 74 20 61 73 20 77 20 63 68 61 72 61 63 74 65 72  t as w character
3290: 73 2e 20 20 49 66 20 77 20 69 73 20 6e 65 67 61  s.  If w is nega
32a0: 74 69 76 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 69  tive,.** then ri
32b0: 67 68 74 2d 6a 75 73 74 69 66 79 20 74 68 65 20  ght-justify the 
32c0: 74 65 78 74 2e 20 20 57 20 69 73 20 74 68 65 20  text.  W is the 
32d0: 77 69 64 74 68 20 69 6e 20 55 54 46 2d 38 20 63  width in UTF-8 c
32e0: 68 61 72 61 63 74 65 72 73 2c 20 6e 6f 74 0a 2a  haracters, not.*
32f0: 2a 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 69  * in bytes.  Thi
3300: 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  s is different f
3310: 72 6f 6d 20 74 68 65 20 25 2a 2e 2a 73 20 73 70  rom the %*.*s sp
3320: 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 70  ecification in p
3330: 72 69 6e 74 66 0a 2a 2a 20 73 69 6e 63 65 20 77  rintf.** since w
3340: 69 74 68 20 25 2a 2e 2a 73 20 74 68 65 20 77 69  ith %*.*s the wi
3350: 64 74 68 20 69 73 20 6d 65 61 73 75 72 65 64 20  dth is measured 
3360: 69 6e 20 62 79 74 65 73 2c 20 6e 6f 74 20 63 68  in bytes, not ch
3370: 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  aracters..*/.sta
3380: 74 69 63 20 76 6f 69 64 20 75 74 66 38 5f 77 69  tic void utf8_wi
3390: 64 74 68 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a  dth_print(FILE *
33a0: 70 4f 75 74 2c 20 69 6e 74 20 77 2c 20 63 6f 6e  pOut, int w, con
33b0: 73 74 20 63 68 61 72 20 2a 7a 55 74 66 29 7b 0a  st char *zUtf){.
33c0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
33d0: 3b 0a 20 20 69 6e 74 20 61 77 20 3d 20 77 3c 30  ;.  int aw = w<0
33e0: 20 3f 20 2d 77 20 3a 20 77 3b 0a 20 20 63 68 61   ? -w : w;.  cha
33f0: 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20  r zBuf[1000];.  
3400: 69 66 28 20 61 77 3e 28 69 6e 74 29 73 69 7a 65  if( aw>(int)size
3410: 6f 66 28 7a 42 75 66 29 2f 33 20 29 20 61 77 20  of(zBuf)/3 ) aw 
3420: 3d 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42  = (int)sizeof(zB
3430: 75 66 29 2f 33 3b 0a 20 20 66 6f 72 28 69 3d 6e  uf)/3;.  for(i=n
3440: 3d 30 3b 20 7a 55 74 66 5b 69 5d 3b 20 69 2b 2b  =0; zUtf[i]; i++
3450: 29 7b 0a 20 20 20 20 69 66 28 20 28 7a 55 74 66  ){.    if( (zUtf
3460: 5b 69 5d 26 30 78 63 30 29 21 3d 30 78 38 30 20  [i]&0xc0)!=0x80 
3470: 29 7b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  ){.      n++;.  
3480: 20 20 20 20 69 66 28 20 6e 3d 3d 61 77 20 29 7b      if( n==aw ){
3490: 0a 20 20 20 20 20 20 20 20 64 6f 7b 20 69 2b 2b  .        do{ i++
34a0: 3b 20 7d 77 68 69 6c 65 28 20 28 7a 55 74 66 5b  ; }while( (zUtf[
34b0: 69 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29  i]&0xc0)==0x80 )
34c0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
34d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
34e0: 20 7d 0a 20 20 69 66 28 20 6e 3e 3d 61 77 20 29   }.  if( n>=aw )
34f0: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
3500: 66 28 70 4f 75 74 2c 20 22 25 2e 2a 73 22 2c 20  f(pOut, "%.*s", 
3510: 69 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73  i, zUtf);.  }els
3520: 65 20 69 66 28 20 77 3c 30 20 29 7b 0a 20 20 20  e if( w<0 ){.   
3530: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 4f 75   utf8_printf(pOu
3540: 74 2c 20 22 25 2a 73 25 73 22 2c 20 61 77 2d 6e  t, "%*s%s", aw-n
3550: 2c 20 22 22 2c 20 7a 55 74 66 29 3b 0a 20 20 7d  , "", zUtf);.  }
3560: 65 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70  else{.    utf8_p
3570: 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 25  rintf(pOut, "%s%
3580: 2a 73 22 2c 20 7a 55 74 66 2c 20 61 77 2d 6e 2c  *s", zUtf, aw-n,
3590: 20 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a   "");.  }.}.../*
35a0: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 73 20 69  .** Determines i
35b0: 66 20 61 20 73 74 72 69 6e 67 20 69 73 20 61 20  f a string is a 
35c0: 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a  number of not..*
35d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e  /.static int isN
35e0: 75 6d 62 65 72 28 63 6f 6e 73 74 20 63 68 61 72  umber(const char
35f0: 20 2a 7a 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75   *z, int *realnu
3600: 6d 29 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d  m){.  if( *z=='-
3610: 27 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a  ' || *z=='+' ) z
3620: 2b 2b 3b 0a 20 20 69 66 28 20 21 49 73 44 69 67  ++;.  if( !IsDig
3630: 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65  it(*z) ){.    re
3640: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b  turn 0;.  }.  z+
3650: 2b 3b 0a 20 20 69 66 28 20 72 65 61 6c 6e 75 6d  +;.  if( realnum
3660: 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b   ) *realnum = 0;
3670: 0a 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69  .  while( IsDigi
3680: 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  t(*z) ){ z++; }.
3690: 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b    if( *z=='.' ){
36a0: 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  .    z++;.    if
36b0: 28 20 21 49 73 44 69 67 69 74 28 2a 7a 29 20 29  ( !IsDigit(*z) )
36c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77   return 0;.    w
36d0: 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a 7a  hile( IsDigit(*z
36e0: 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ z++; }.    
36f0: 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72  if( realnum ) *r
3700: 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a  ealnum = 1;.  }.
3710: 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c    if( *z=='e' ||
3720: 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20   *z=='E' ){.    
3730: 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  z++;.    if( *z=
3740: 3d 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20  ='+' || *z=='-' 
3750: 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21  ) z++;.    if( !
3760: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65  IsDigit(*z) ) re
3770: 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
3780: 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29  e( IsDigit(*z) )
3790: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { z++; }.    if(
37a0: 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c   realnum ) *real
37b0: 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  num = 1;.  }.  r
37c0: 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a  eturn *z==0;.}..
37d0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
37e0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68  string length th
37f0: 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f  at is limited to
3800: 20 77 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f   what can be sto
3810: 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20  red in.** lower 
3820: 33 30 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d  30 bits of a 32-
3830: 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67  bit signed integ
3840: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
3850: 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74  t strlen30(const
3860: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e   char *z){.  con
3870: 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b  st char *z2 = z;
3880: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b  .  while( *z2 ){
3890: 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72   z2++; }.  retur
38a0: 6e 20 30 78 33 66 66 66 66 66 66 66 20 26 20 28  n 0x3fffffff & (
38b0: 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a  int)(z2 - z);.}.
38c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
38d0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 73 74  e length of a st
38e0: 72 69 6e 67 20 69 6e 20 63 68 61 72 61 63 74 65  ring in characte
38f0: 72 73 2e 20 20 4d 75 6c 74 69 62 79 74 65 20 55  rs.  Multibyte U
3900: 54 46 38 20 63 68 61 72 61 63 74 65 72 73 0a 2a  TF8 characters.*
3910: 2a 20 63 6f 75 6e 74 20 61 73 20 61 20 73 69 6e  * count as a sin
3920: 67 6c 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  gle character..*
3930: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72  /.static int str
3940: 6c 65 6e 43 68 61 72 28 63 6f 6e 73 74 20 63 68  lenChar(const ch
3950: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20  ar *z){.  int n 
3960: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  = 0;.  while( *z
3970: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 30 78 63   ){.    if( (0xc
3980: 30 26 2a 28 7a 2b 2b 29 29 21 3d 30 78 38 30 20  0&*(z++))!=0x80 
3990: 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ) n++;.  }.  ret
39a0: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
39b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61  This routine rea
39c0: 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78  ds a line of tex
39d0: 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20  t from FILE in, 
39e0: 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65  stores.** the te
39f0: 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  xt in memory obt
3a00: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
3a10: 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20  c() and returns 
3a20: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
3a30: 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20  the text.  NULL 
3a40: 69 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65  is returned at e
3a50: 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69  nd of file, or i
3a60: 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61  f malloc().** fa
3a70: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c  ils..**.** If zL
3a80: 69 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ine is not NULL 
3a90: 74 68 65 6e 20 69 74 20 69 73 20 61 20 6d 61 6c  then it is a mal
3aa0: 6c 6f 63 65 64 20 62 75 66 66 65 72 20 72 65 74  loced buffer ret
3ab0: 75 72 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20  urned from.** a 
3ac0: 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f  previous call to
3ad0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 68   this routine th
3ae0: 61 74 20 6d 61 79 20 62 65 20 72 65 75 73 65 64  at may be reused
3af0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
3b00: 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28   *local_getline(
3b10: 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c  char *zLine, FIL
3b20: 45 20 2a 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c  E *in){.  int nL
3b30: 69 6e 65 20 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f  ine = zLine==0 ?
3b40: 20 30 20 3a 20 31 30 30 3b 0a 20 20 69 6e 74 20   0 : 100;.  int 
3b50: 6e 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28  n = 0;..  while(
3b60: 20 31 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b   1 ){.    if( n+
3b70: 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20  100>nLine ){.   
3b80: 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65     nLine = nLine
3b90: 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20  *2 + 100;.      
3ba0: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
3bb0: 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20  zLine, nLine);. 
3bc0: 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d       if( zLine==
3bd0: 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66  0 ) shell_out_of
3be0: 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d  _memory();.    }
3bf0: 0a 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26  .    if( fgets(&
3c00: 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20  zLine[n], nLine 
3c10: 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20  - n, in)==0 ){. 
3c20: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
3c30: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c  .        free(zL
3c40: 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ine);.        re
3c50: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
3c60: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
3c70: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
3c80: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
3c90: 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b  ( zLine[n] ) n++
3ca0: 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  ;.    if( n>0 &&
3cb0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
3cc0: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
3cd0: 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26        if( n>0 &&
3ce0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72   zLine[n-1]=='\r
3cf0: 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a  ' ) n--;.      z
3d00: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
3d10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3d20: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
3d30: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
3d40: 65 64 28 57 49 4e 33 32 29 0a 20 20 2f 2a 20 46  ed(WIN32).  /* F
3d50: 6f 72 20 69 6e 74 65 72 61 63 74 69 76 65 20 69  or interactive i
3d60: 6e 70 75 74 20 6f 6e 20 57 69 6e 64 6f 77 73 20  nput on Windows 
3d70: 73 79 73 74 65 6d 73 2c 20 74 72 61 6e 73 6c 61  systems, transla
3d80: 74 65 20 74 68 65 0a 20 20 2a 2a 20 6d 75 6c 74  te the.  ** mult
3d90: 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  i-byte character
3da0: 73 65 74 20 63 68 61 72 61 63 74 65 72 73 20 69  set characters i
3db0: 6e 74 6f 20 55 54 46 2d 38 2e 20 2a 2f 0a 20 20  nto UTF-8. */.  
3dc0: 69 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74  if( stdin_is_int
3dd0: 65 72 61 63 74 69 76 65 20 26 26 20 69 6e 3d 3d  eractive && in==
3de0: 73 74 64 69 6e 20 29 7b 0a 20 20 20 20 63 68 61  stdin ){.    cha
3df0: 72 20 2a 7a 54 72 61 6e 73 20 3d 20 73 71 6c 69  r *zTrans = sqli
3e00: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
3e10: 6f 5f 75 74 66 38 5f 76 32 28 7a 4c 69 6e 65 2c  o_utf8_v2(zLine,
3e20: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 72   0);.    if( zTr
3e30: 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ans ){.      int
3e40: 20 6e 54 72 61 6e 73 20 3d 20 73 74 72 6c 65 6e   nTrans = strlen
3e50: 33 30 28 7a 54 72 61 6e 73 29 2b 31 3b 0a 20 20  30(zTrans)+1;.  
3e60: 20 20 20 20 69 66 28 20 6e 54 72 61 6e 73 3e 6e      if( nTrans>n
3e70: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Line ){.        
3e80: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
3e90: 7a 4c 69 6e 65 2c 20 6e 54 72 61 6e 73 29 3b 0a  zLine, nTrans);.
3ea0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e          if( zLin
3eb0: 65 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74  e==0 ) shell_out
3ec0: 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20  _of_memory();.  
3ed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63      }.      memc
3ee0: 70 79 28 7a 4c 69 6e 65 2c 20 7a 54 72 61 6e 73  py(zLine, zTrans
3ef0: 2c 20 6e 54 72 61 6e 73 29 3b 0a 20 20 20 20 20  , nTrans);.     
3f00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
3f10: 72 61 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rans);.    }.  }
3f20: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
3f30: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
3f40: 66 69 6e 65 64 28 57 49 4e 33 32 29 20 2a 2f 0a  fined(WIN32) */.
3f50: 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a    return zLine;.
3f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
3f70: 65 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20  e a single line 
3f80: 6f 66 20 69 6e 70 75 74 20 74 65 78 74 2e 0a 2a  of input text..*
3f90: 2a 0a 2a 2a 20 49 66 20 69 6e 3d 3d 30 20 74 68  *.** If in==0 th
3fa0: 65 6e 20 72 65 61 64 20 66 72 6f 6d 20 73 74 61  en read from sta
3fb0: 6e 64 61 72 64 20 69 6e 70 75 74 20 61 6e 64 20  ndard input and 
3fc0: 70 72 6f 6d 70 74 20 62 65 66 6f 72 65 20 65 61  prompt before ea
3fd0: 63 68 20 6c 69 6e 65 2e 0a 2a 2a 20 49 66 20 69  ch line..** If i
3fe0: 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69 73  sContinuation is
3ff0: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 63 6f   true, then a co
4000: 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70  ntinuation promp
4010: 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  t is appropriate
4020: 2e 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69 6e  ..** If isContin
4030: 75 61 74 69 6f 6e 20 69 73 20 7a 65 72 6f 2c 20  uation is zero, 
4040: 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 70 72  then the main pr
4050: 6f 6d 70 74 20 73 68 6f 75 6c 64 20 62 65 20 75  ompt should be u
4060: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 50  sed..**.** If zP
4070: 72 69 6f 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  rior is not NULL
4080: 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 62 75   then it is a bu
4090: 66 66 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  ffer from a prio
40a0: 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 2a  r call to this.*
40b0: 2a 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 63  * routine that c
40c0: 61 6e 20 62 65 20 72 65 75 73 65 64 2e 0a 2a 2a  an be reused..**
40d0: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
40e0: 73 20 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63  s stored in spac
40f0: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
4100: 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  malloc() and mus
4110: 74 20 65 69 74 68 65 72 0a 2a 2a 20 62 65 20 66  t either.** be f
4120: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
4130: 65 72 20 6f 72 20 65 6c 73 65 20 70 61 73 73 65  er or else passe
4140: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 69 73  d back into this
4150: 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 68 65   routine via the
4160: 0a 2a 2a 20 7a 50 72 69 6f 72 20 61 72 67 75 6d  .** zPrior argum
4170: 65 6e 74 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a  ent for reuse..*
4180: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6f  /.static char *o
4190: 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 46 49  ne_input_line(FI
41a0: 4c 45 20 2a 69 6e 2c 20 63 68 61 72 20 2a 7a 50  LE *in, char *zP
41b0: 72 69 6f 72 2c 20 69 6e 74 20 69 73 43 6f 6e 74  rior, int isCont
41c0: 69 6e 75 61 74 69 6f 6e 29 7b 0a 20 20 63 68 61  inuation){.  cha
41d0: 72 20 2a 7a 50 72 6f 6d 70 74 3b 0a 20 20 63 68  r *zPrompt;.  ch
41e0: 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20 69  ar *zResult;.  i
41f0: 66 28 20 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20  f( in!=0 ){.    
4200: 7a 52 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f  zResult = local_
4210: 67 65 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20  getline(zPrior, 
4220: 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  in);.  }else{.  
4230: 20 20 7a 50 72 6f 6d 70 74 20 3d 20 69 73 43 6f    zPrompt = isCo
4240: 6e 74 69 6e 75 61 74 69 6f 6e 20 3f 20 63 6f 6e  ntinuation ? con
4250: 74 69 6e 75 65 50 72 6f 6d 70 74 20 3a 20 6d 61  tinuePrompt : ma
4260: 69 6e 50 72 6f 6d 70 74 3b 0a 23 69 66 20 53 48  inPrompt;.#if SH
4270: 45 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c 5f 47 45  ELL_USE_LOCAL_GE
4280: 54 4c 49 4e 45 0a 20 20 20 20 70 72 69 6e 74 66  TLINE.    printf
4290: 28 22 25 73 22 2c 20 7a 50 72 6f 6d 70 74 29 3b  ("%s", zPrompt);
42a0: 0a 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f  .    fflush(stdo
42b0: 75 74 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74  ut);.    zResult
42c0: 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65   = local_getline
42d0: 28 7a 50 72 69 6f 72 2c 20 73 74 64 69 6e 29 3b  (zPrior, stdin);
42e0: 0a 23 65 6c 73 65 0a 20 20 20 20 66 72 65 65 28  .#else.    free(
42f0: 7a 50 72 69 6f 72 29 3b 0a 20 20 20 20 7a 52 65  zPrior);.    zRe
4300: 73 75 6c 74 20 3d 20 73 68 65 6c 6c 5f 72 65 61  sult = shell_rea
4310: 64 6c 69 6e 65 28 7a 50 72 6f 6d 70 74 29 3b 0a  dline(zPrompt);.
4320: 20 20 20 20 69 66 28 20 7a 52 65 73 75 6c 74 20      if( zResult 
4330: 26 26 20 2a 7a 52 65 73 75 6c 74 20 29 20 73 68  && *zResult ) sh
4340: 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f 72 79 28  ell_add_history(
4350: 7a 52 65 73 75 6c 74 29 3b 0a 23 65 6e 64 69 66  zResult);.#endif
4360: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
4370: 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  esult;.}.../*.**
4380: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
4390: 65 20 6f 66 20 61 20 68 65 78 61 64 65 63 69 6d  e of a hexadecim
43a0: 61 6c 20 64 69 67 69 74 2e 20 20 52 65 74 75 72  al digit.  Retur
43b0: 6e 20 2d 31 20 69 66 20 74 68 65 20 69 6e 70 75  n -1 if the inpu
43c0: 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 68 65  t.** is not a he
43d0: 78 20 64 69 67 69 74 2e 0a 2a 2f 0a 73 74 61 74  x digit..*/.stat
43e0: 69 63 20 69 6e 74 20 68 65 78 44 69 67 69 74 56  ic int hexDigitV
43f0: 61 6c 75 65 28 63 68 61 72 20 63 29 7b 0a 20 20  alue(char c){.  
4400: 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c  if( c>='0' && c<
4410: 3d 27 39 27 20 29 20 72 65 74 75 72 6e 20 63 20  ='9' ) return c 
4420: 2d 20 27 30 27 3b 0a 20 20 69 66 28 20 63 3e 3d  - '0';.  if( c>=
4430: 27 61 27 20 26 26 20 63 3c 3d 27 66 27 20 29 20  'a' && c<='f' ) 
4440: 72 65 74 75 72 6e 20 63 20 2d 20 27 61 27 20 2b  return c - 'a' +
4450: 20 31 30 3b 0a 20 20 69 66 28 20 63 3e 3d 27 41   10;.  if( c>='A
4460: 27 20 26 26 20 63 3c 3d 27 46 27 20 29 20 72 65  ' && c<='F' ) re
4470: 74 75 72 6e 20 63 20 2d 20 27 41 27 20 2b 20 31  turn c - 'A' + 1
4480: 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0;.  return -1;.
4490: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  }../*.** Interpr
44a0: 65 74 20 7a 41 72 67 20 61 73 20 61 6e 20 69 6e  et zArg as an in
44b0: 74 65 67 65 72 20 76 61 6c 75 65 2c 20 70 6f 73  teger value, pos
44c0: 73 69 62 6c 79 20 77 69 74 68 20 73 75 66 66 69  sibly with suffi
44d0: 78 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  xes..*/.static s
44e0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 6e 74  qlite3_int64 int
44f0: 65 67 65 72 56 61 6c 75 65 28 63 6f 6e 73 74 20  egerValue(const 
4500: 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73  char *zArg){.  s
4510: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 20 3d  qlite3_int64 v =
4520: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   0;.  static con
4530: 73 74 20 73 74 72 75 63 74 20 7b 20 63 68 61 72  st struct { char
4540: 20 2a 7a 53 75 66 66 69 78 3b 20 69 6e 74 20 69   *zSuffix; int i
4550: 4d 75 6c 74 3b 20 7d 20 61 4d 75 6c 74 5b 5d 20  Mult; } aMult[] 
4560: 3d 20 7b 0a 20 20 20 20 7b 20 22 4b 69 42 22 2c  = {.    { "KiB",
4570: 20 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22   1024 },.    { "
4580: 4d 69 42 22 2c 20 31 30 32 34 2a 31 30 32 34 20  MiB", 1024*1024 
4590: 7d 2c 0a 20 20 20 20 7b 20 22 47 69 42 22 2c 20  },.    { "GiB", 
45a0: 31 30 32 34 2a 31 30 32 34 2a 31 30 32 34 20 7d  1024*1024*1024 }
45b0: 2c 0a 20 20 20 20 7b 20 22 4b 42 22 2c 20 20 31  ,.    { "KB",  1
45c0: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 42  000 },.    { "MB
45d0: 22 2c 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20  ",  1000000 },. 
45e0: 20 20 20 7b 20 22 47 42 22 2c 20 20 31 30 30 30     { "GB",  1000
45f0: 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20  000000 },.    { 
4600: 22 4b 22 2c 20 20 20 31 30 30 30 20 7d 2c 0a 20  "K",   1000 },. 
4610: 20 20 20 7b 20 22 4d 22 2c 20 20 20 31 30 30 30     { "M",   1000
4620: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 22  000 },.    { "G"
4630: 2c 20 20 20 31 30 30 30 30 30 30 30 30 30 20 7d  ,   1000000000 }
4640: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
4650: 20 20 69 6e 74 20 69 73 4e 65 67 20 3d 20 30 3b    int isNeg = 0;
4660: 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d  .  if( zArg[0]==
4670: 27 2d 27 20 29 7b 0a 20 20 20 20 69 73 4e 65 67  '-' ){.    isNeg
4680: 20 3d 20 31 3b 0a 20 20 20 20 7a 41 72 67 2b 2b   = 1;.    zArg++
4690: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 41  ;.  }else if( zA
46a0: 72 67 5b 30 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20  rg[0]=='+' ){.  
46b0: 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 0a 20 20    zArg++;.  }.  
46c0: 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27  if( zArg[0]=='0'
46d0: 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27   && zArg[1]=='x'
46e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 3b 0a 20   ){.    int x;. 
46f0: 20 20 20 7a 41 72 67 20 2b 3d 20 32 3b 0a 20 20     zArg += 2;.  
4700: 20 20 77 68 69 6c 65 28 20 28 78 20 3d 20 68 65    while( (x = he
4710: 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67  xDigitValue(zArg
4720: 5b 30 5d 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20  [0]))>=0 ){.    
4730: 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20 78    v = (v<<4) + x
4740: 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a  ;.      zArg++;.
4750: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
4760: 20 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69     while( IsDigi
4770: 74 28 7a 41 72 67 5b 30 5d 29 20 29 7b 0a 20 20  t(zArg[0]) ){.  
4780: 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 7a      v = v*10 + z
4790: 41 72 67 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20  Arg[0] - '0';.  
47a0: 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20      zArg++;.    
47b0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  }.  }.  for(i=0;
47c0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 75   i<ArraySize(aMu
47d0: 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  lt); i++){.    i
47e0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
47f0: 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e 7a 53 75 66  mp(aMult[i].zSuf
4800: 66 69 78 2c 20 7a 41 72 67 29 3d 3d 30 20 29 7b  fix, zArg)==0 ){
4810: 0a 20 20 20 20 20 20 76 20 2a 3d 20 61 4d 75 6c  .      v *= aMul
4820: 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a 20 20 20 20  t[i].iMult;.    
4830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4840: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 73 4e 65   }.  return isNe
4850: 67 3f 20 2d 76 20 3a 20 76 3b 0a 7d 0a 0a 2f 2a  g? -v : v;.}../*
4860: 0a 2a 2a 20 41 20 76 61 72 69 61 62 6c 65 20 6c  .** A variable l
4870: 65 6e 67 74 68 20 73 74 72 69 6e 67 20 74 6f 20  ength string to 
4880: 77 68 69 63 68 20 6f 6e 65 20 63 61 6e 20 61 70  which one can ap
4890: 70 65 6e 64 20 74 65 78 74 2e 0a 2a 2f 0a 74 79  pend text..*/.ty
48a0: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65  pedef struct She
48b0: 6c 6c 54 65 78 74 20 53 68 65 6c 6c 54 65 78 74  llText ShellText
48c0: 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 54 65  ;.struct ShellTe
48d0: 78 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  xt {.  char *z;.
48e0: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e    int n;.  int n
48f0: 41 6c 6c 6f 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Alloc;.};../*.**
4900: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
4910: 64 65 73 74 72 6f 79 20 61 20 53 68 65 6c 6c 54  destroy a ShellT
4920: 65 78 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  ext object.*/.st
4930: 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 54 65  atic void initTe
4940: 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a 70 29  xt(ShellText *p)
4950: 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
4960: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a   sizeof(*p));.}.
4970: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
4980: 54 65 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a  Text(ShellText *
4990: 70 29 7b 0a 20 20 66 72 65 65 28 70 2d 3e 7a 29  p){.  free(p->z)
49a0: 3b 0a 20 20 69 6e 69 74 54 65 78 74 28 70 29 3b  ;.  initText(p);
49b0: 0a 7d 0a 0a 2f 2a 20 7a 49 6e 20 69 73 20 65 69  .}../* zIn is ei
49c0: 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 20 74  ther a pointer t
49d0: 6f 20 61 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61  o a NULL-termina
49e0: 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 6d 65  ted string in me
49f0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  mory obtained.**
4a00: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20   from malloc(), 
4a10: 6f 72 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  or a NULL pointe
4a20: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 70 6f  r. The string po
4a30: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 41 70 70  inted to by zApp
4a40: 65 6e 64 20 69 73 0a 2a 2a 20 61 64 64 65 64 20  end is.** added 
4a50: 74 6f 20 7a 49 6e 2c 20 61 6e 64 20 74 68 65 20  to zIn, and the 
4a60: 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20  result returned 
4a70: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
4a80: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
4a90: 2e 0a 2a 2a 20 7a 49 6e 2c 20 69 66 20 69 74 20  ..** zIn, if it 
4aa0: 77 61 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73  was not NULL, is
4ab0: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
4ac0: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
4ad0: 65 6e 74 2c 20 71 75 6f 74 65 2c 20 69 73 20 6e  ent, quote, is n
4ae0: 6f 74 20 27 5c 30 27 2c 20 74 68 65 6e 20 69 74  ot '\0', then it
4af0: 20 69 73 20 75 73 65 64 20 61 73 20 61 0a 2a 2a   is used as a.**
4b00: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
4b10: 20 66 6f 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f   for zAppend..*/
4b20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70  .static void app
4b30: 65 6e 64 54 65 78 74 28 53 68 65 6c 6c 54 65 78  endText(ShellTex
4b40: 74 20 2a 70 2c 20 63 68 61 72 20 63 6f 6e 73 74  t *p, char const
4b50: 20 2a 7a 41 70 70 65 6e 64 2c 20 63 68 61 72 20   *zAppend, char 
4b60: 71 75 6f 74 65 29 7b 0a 20 20 69 6e 74 20 6c 65  quote){.  int le
4b70: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
4b80: 74 20 6e 41 70 70 65 6e 64 20 3d 20 73 74 72 6c  t nAppend = strl
4b90: 65 6e 33 30 28 7a 41 70 70 65 6e 64 29 3b 0a 0a  en30(zAppend);..
4ba0: 20 20 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b    len = nAppend+
4bb0: 70 2d 3e 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75  p->n+1;.  if( qu
4bc0: 6f 74 65 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b  ote ){.    len +
4bd0: 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 2;.    for(i=0
4be0: 3b 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b  ; i<nAppend; i++
4bf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70  ){.      if( zAp
4c00: 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29  pend[i]==quote )
4c10: 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   len++;.    }.  
4c20: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 6c 65  }..  if( p->n+le
4c30: 6e 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  n>=p->nAlloc ){.
4c40: 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20      p->nAlloc = 
4c50: 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6c 65  p->nAlloc*2 + le
4c60: 6e 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 7a  n + 20;.    p->z
4c70: 20 3d 20 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c   = realloc(p->z,
4c80: 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
4c90: 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73   if( p->z==0 ) s
4ca0: 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
4cb0: 72 79 28 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ry();.  }..  if(
4cc0: 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 68   quote ){.    ch
4cd0: 61 72 20 2a 7a 43 73 72 20 3d 20 70 2d 3e 7a 2b  ar *zCsr = p->z+
4ce0: 70 2d 3e 6e 3b 0a 20 20 20 20 2a 7a 43 73 72 2b  p->n;.    *zCsr+
4cf0: 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 66  + = quote;.    f
4d00: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e  or(i=0; i<nAppen
4d10: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 2a  d; i++){.      *
4d20: 7a 43 73 72 2b 2b 20 3d 20 7a 41 70 70 65 6e 64  zCsr++ = zAppend
4d30: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [i];.      if( z
4d40: 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65  Append[i]==quote
4d50: 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f   ) *zCsr++ = quo
4d60: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a  te;.    }.    *z
4d70: 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20  Csr++ = quote;. 
4d80: 20 20 20 70 2d 3e 6e 20 3d 20 28 69 6e 74 29 28     p->n = (int)(
4d90: 7a 43 73 72 20 2d 20 70 2d 3e 7a 29 3b 0a 20 20  zCsr - p->z);.  
4da0: 20 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a    *zCsr = '\0';.
4db0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
4dc0: 63 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e 2c 20 7a  cpy(p->z+p->n, z
4dd0: 41 70 70 65 6e 64 2c 20 6e 41 70 70 65 6e 64 29  Append, nAppend)
4de0: 3b 0a 20 20 20 20 70 2d 3e 6e 20 2b 3d 20 6e 41  ;.    p->n += nA
4df0: 70 70 65 6e 64 3b 0a 20 20 20 20 70 2d 3e 7a 5b  ppend;.    p->z[
4e00: 70 2d 3e 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  p->n] = '\0';.  
4e10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
4e20: 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  pt to determine 
4e30: 69 66 20 69 64 65 6e 74 69 66 69 65 72 20 7a 4e  if identifier zN
4e40: 61 6d 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ame needs to be 
4e50: 71 75 6f 74 65 64 2c 20 65 69 74 68 65 72 0a 2a  quoted, either.*
4e60: 2a 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e  * because it con
4e70: 74 61 69 6e 73 20 6e 6f 6e 2d 61 6c 70 68 61 6e  tains non-alphan
4e80: 75 6d 65 72 69 63 20 63 68 61 72 61 63 74 65 72  umeric character
4e90: 73 2c 20 6f 72 20 62 65 63 61 75 73 65 20 69 74  s, or because it
4ea0: 20 69 73 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65   is an.** SQLite
4eb0: 20 6b 65 79 77 6f 72 64 2e 20 20 42 65 20 63 6f   keyword.  Be co
4ec0: 6e 73 65 72 76 61 74 69 76 65 20 69 6e 20 74 68  nservative in th
4ed0: 69 73 20 65 73 74 69 6d 61 74 65 3a 20 20 57 68  is estimate:  Wh
4ee0: 65 6e 20 69 6e 20 64 6f 75 62 74 20 61 73 73 75  en in doubt assu
4ef0: 6d 65 0a 2a 2a 20 74 68 61 74 20 71 75 6f 74 69  me.** that quoti
4f00: 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ng is required..
4f10: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 27 22 27  **.** Return '"'
4f20: 20 69 66 20 71 75 6f 74 69 6e 67 20 69 73 20 72   if quoting is r
4f30: 65 71 75 69 72 65 64 2e 20 20 52 65 74 75 72 6e  equired.  Return
4f40: 20 30 20 69 66 20 6e 6f 20 71 75 6f 74 69 6e 67   0 if no quoting
4f50: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   is required..*/
4f60: 0a 73 74 61 74 69 63 20 63 68 61 72 20 71 75 6f  .static char quo
4f70: 74 65 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61  teChar(const cha
4f80: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
4f90: 20 69 3b 0a 20 20 69 66 28 20 21 69 73 61 6c 70   i;.  if( !isalp
4fa0: 68 61 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ha((unsigned cha
4fb0: 72 29 7a 4e 61 6d 65 5b 30 5d 29 20 26 26 20 7a  r)zName[0]) && z
4fc0: 4e 61 6d 65 5b 30 5d 21 3d 27 5f 27 20 29 20 72  Name[0]!='_' ) r
4fd0: 65 74 75 72 6e 20 27 22 27 3b 0a 20 20 66 6f 72  eturn '"';.  for
4fe0: 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20  (i=0; zName[i]; 
4ff0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69  i++){.    if( !i
5000: 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64  salnum((unsigned
5010: 20 63 68 61 72 29 7a 4e 61 6d 65 5b 69 5d 29 20   char)zName[i]) 
5020: 26 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27  && zName[i]!='_'
5030: 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20   ) return '"';. 
5040: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
5050: 74 65 33 5f 6b 65 79 77 6f 72 64 5f 63 68 65 63  te3_keyword_chec
5060: 6b 28 7a 4e 61 6d 65 2c 20 69 29 20 3f 20 27 22  k(zName, i) ? '"
5070: 27 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ' : 0;.}../*.** 
5080: 43 6f 6e 73 74 72 75 63 74 20 61 20 66 61 6b 65  Construct a fake
5090: 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61 6e 64   object name and
50a0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20   column list to 
50b0: 64 65 73 63 72 69 62 65 20 74 68 65 20 73 74 72  describe the str
50c0: 75 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74 68 65  ucture.** of the
50d0: 20 76 69 65 77 2c 20 76 69 72 74 75 61 6c 20 74   view, virtual t
50e0: 61 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65 20 76  able, or table v
50f0: 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 7a  alued function z
5100: 53 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f  Schema.zName..*/
5110: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 68  .static char *sh
5120: 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 0a 20  ellFakeSchema(. 
5130: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
5140: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5150: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
5160: 69 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ion containing t
5170: 68 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f 6e  he vtab */.  con
5180: 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  st char *zSchema
5190: 2c 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f  ,    /* Schema o
51a0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
51b0: 6f 6c 64 69 6e 67 20 74 68 65 20 76 74 61 62 20  olding the vtab 
51c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
51d0: 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f 2a 20  *zName       /* 
51e0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
51f0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
5200: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
5210: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
5220: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53   char *zSql;.  S
5230: 68 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 63 68  hellText s;.  ch
5240: 61 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61  ar cQuote;.  cha
5250: 72 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20  r *zDiv = "(";. 
5260: 20 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a   int nRow = 0;..
5270: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
5280: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
5290: 20 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f 69 6e   \"%w\".table_in
52a0: 66 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20 20 20  fo=%Q;",.       
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53 63 68    zSchema ? zSch
52d0: 65 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e  ema : "main", zN
52e0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
52f0: 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
5300: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
5310: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
5320: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 6e 69  ree(zSql);.  ini
5330: 74 54 65 78 74 28 26 73 29 3b 0a 20 20 69 66 28  tText(&s);.  if(
5340: 20 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   zSchema ){.    
5350: 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68  cQuote = quoteCh
5360: 61 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20  ar(zSchema);.   
5370: 20 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73   if( cQuote && s
5380: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
5390: 53 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 3d 3d  Schema,"temp")==
53a0: 30 20 29 20 63 51 75 6f 74 65 20 3d 20 30 3b 0a  0 ) cQuote = 0;.
53b0: 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
53c0: 73 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51 75 6f  s, zSchema, cQuo
53d0: 74 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  te);.    appendT
53e0: 65 78 74 28 26 73 2c 20 22 2e 22 2c 20 30 29 3b  ext(&s, ".", 0);
53f0: 0a 20 20 7d 0a 20 20 63 51 75 6f 74 65 20 3d 20  .  }.  cQuote = 
5400: 71 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29  quoteChar(zName)
5410: 3b 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26  ;.  appendText(&
5420: 73 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f 74 65  s, zName, cQuote
5430: 29 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  );.  while( sqli
5440: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
5450: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
5460: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5470: 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Col = (const cha
5480: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
5490: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
54a0: 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20  ;.    nRow++;.  
54b0: 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c    appendText(&s,
54c0: 20 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 7a   zDiv, 0);.    z
54d0: 44 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20 20 63  Div = ",";.    c
54e0: 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61  Quote = quoteCha
54f0: 72 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70  r(zCol);.    app
5500: 65 6e 64 54 65 78 74 28 26 73 2c 20 7a 43 6f 6c  endText(&s, zCol
5510: 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d 0a 20  , cQuote);.  }. 
5520: 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
5530: 22 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ")", 0);.  sqlit
5540: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
5550: 74 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77 3d 3d  t);.  if( nRow==
5560: 30 20 29 7b 0a 20 20 20 20 66 72 65 65 54 65 78  0 ){.    freeTex
5570: 74 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a 20 3d  t(&s);.    s.z =
5580: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5590: 20 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   s.z;.}../*.** S
55a0: 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68  QL function:  sh
55b0: 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d  ell_module_schem
55c0: 61 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  a(X).**.** Retur
55d0: 6e 20 61 20 66 61 6b 65 20 73 63 68 65 6d 61 20  n a fake schema 
55e0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2d 76 61  for the table-va
55f0: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72  lued function or
5600: 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75   eponymous virtu
5610: 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e 0a 2a  al.** table X..*
5620: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
5630: 65 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 28  ellModuleSchema(
5640: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
5650: 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
5660: 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
5670: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
5680: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5690: 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
56a0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
56b0: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
56c0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20  ;.  char *zFake 
56d0: 3d 20 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d  = shellFakeSchem
56e0: 61 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  a(sqlite3_contex
56f0: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78  t_db_handle(pCtx
5700: 29 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ), 0, zName);.  
5710: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5720: 28 6e 56 61 6c 29 3b 0a 20 20 69 66 28 20 7a 46  (nVal);.  if( zF
5730: 61 6b 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ake ){.    sqlit
5740: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
5750: 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  Ctx, sqlite3_mpr
5760: 69 6e 74 66 28 22 2f 2a 20 25 73 20 2a 2f 22 2c  intf("/* %s */",
5770: 20 7a 46 61 6b 65 29 2c 0a 20 20 20 20 20 20 20   zFake),.       
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65   -1, sqlite3_fre
57a0: 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 46 61  e);.    free(zFa
57b0: 6b 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ke);.  }.}../*.*
57c0: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20  * SQL function: 
57d0: 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d   shell_add_schem
57e0: 61 28 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41 64 64  a(S,X).**.** Add
57f0: 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65   the schema name
5800: 20 58 20 74 6f 20 74 68 65 20 43 52 45 41 54 45   X to the CREATE
5810: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 53 20   statement in S 
5820: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72  and return the r
5830: 65 73 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d 70 6c  esult..** Exampl
5840: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45  es:.**.**    CRE
5850: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 20  ATE TABLE t1(x) 
5860: 20 20 2d 3e 20 20 20 43 52 45 41 54 45 20 54 41    ->   CREATE TA
5870: 42 4c 45 20 78 79 7a 2e 74 31 28 78 29 3b 0a 2a  BLE xyz.t1(x);.*
5880: 2a 0a 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b 73 20  *.** Also works 
5890: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41  on.**.**    CREA
58a0: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43  TE INDEX.**    C
58b0: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
58c0: 45 58 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  EX.**    CREATE 
58d0: 56 49 45 57 0a 2a 2a 20 20 20 20 43 52 45 41 54  VIEW.**    CREAT
58e0: 45 20 54 52 49 47 47 45 52 0a 2a 2a 20 20 20 20  E TRIGGER.**    
58f0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
5900: 41 42 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ABLE.**.** This 
5910: 55 44 46 20 69 73 20 75 73 65 64 20 62 79 20 74  UDF is used by t
5920: 68 65 20 2e 73 63 68 65 6d 61 20 63 6f 6d 6d 61  he .schema comma
5930: 6e 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  nd to insert the
5940: 20 73 63 68 65 6d 61 20 6e 61 6d 65 20 6f 66 0a   schema name of.
5950: 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ** attached data
5960: 62 61 73 65 73 20 69 6e 74 6f 20 74 68 65 20 6d  bases into the m
5970: 69 64 64 6c 65 20 6f 66 20 74 68 65 20 73 71 6c  iddle of the sql
5980: 69 74 65 5f 6d 61 73 74 65 72 2e 73 71 6c 20 66  ite_master.sql f
5990: 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ield..*/.static 
59a0: 76 6f 69 64 20 73 68 65 6c 6c 41 64 64 53 63 68  void shellAddSch
59b0: 65 6d 61 4e 61 6d 65 28 0a 20 20 73 71 6c 69 74  emaName(.  sqlit
59c0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
59d0: 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20  ,.  int nVal,.  
59e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
59f0: 61 70 56 61 6c 0a 29 7b 0a 20 20 73 74 61 74 69  apVal.){.  stati
5a00: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 50  c const char *aP
5a10: 72 65 66 69 78 5b 5d 20 3d 20 7b 0a 20 20 20 20  refix[] = {.    
5a20: 20 22 54 41 42 4c 45 22 2c 0a 20 20 20 20 20 22   "TABLE",.     "
5a30: 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 55 4e  INDEX",.     "UN
5a40: 49 51 55 45 20 49 4e 44 45 58 22 2c 0a 20 20 20  IQUE INDEX",.   
5a50: 20 20 22 56 49 45 57 22 2c 0a 20 20 20 20 20 22    "VIEW",.     "
5a60: 54 52 49 47 47 45 52 22 2c 0a 20 20 20 20 20 22  TRIGGER",.     "
5a70: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22 0a 20  VIRTUAL TABLE". 
5a80: 20 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b   };.  int i = 0;
5a90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5aa0: 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  In = (const char
5ab0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
5ac0: 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  text(apVal[0]);.
5ad0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
5ae0: 63 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74 20 63  chema = (const c
5af0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
5b00: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d  ue_text(apVal[1]
5b10: 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
5b20: 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
5b30: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5b40: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32  lue_text(apVal[2
5b50: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ]);.  sqlite3 *d
5b60: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
5b70: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43  ext_db_handle(pC
5b80: 74 78 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  tx);.  UNUSED_PA
5b90: 52 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b 0a 20  RAMETER(nVal);. 
5ba0: 20 69 66 28 20 7a 49 6e 21 3d 30 20 26 26 20 73   if( zIn!=0 && s
5bb0: 74 72 6e 63 6d 70 28 7a 49 6e 2c 20 22 43 52 45  trncmp(zIn, "CRE
5bc0: 41 54 45 20 22 2c 20 37 29 3d 3d 30 20 29 7b 0a  ATE ", 7)==0 ){.
5bd0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28      for(i=0; i<(
5be0: 69 6e 74 29 28 73 69 7a 65 6f 66 28 61 50 72 65  int)(sizeof(aPre
5bf0: 66 69 78 29 2f 73 69 7a 65 6f 66 28 61 50 72 65  fix)/sizeof(aPre
5c00: 66 69 78 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a  fix[0])); i++){.
5c10: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
5c20: 72 6c 65 6e 33 30 28 61 50 72 65 66 69 78 5b 69  rlen30(aPrefix[i
5c30: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ]);.      if( st
5c40: 72 6e 63 6d 70 28 7a 49 6e 2b 37 2c 20 61 50 72  rncmp(zIn+7, aPr
5c50: 65 66 69 78 5b 69 5d 2c 20 6e 29 3d 3d 30 20 26  efix[i], n)==0 &
5c60: 26 20 7a 49 6e 5b 6e 2b 37 5d 3d 3d 27 20 27 20  & zIn[n+7]==' ' 
5c70: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
5c80: 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  *z = 0;.        
5c90: 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d 20 30 3b  char *zFake = 0;
5ca0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63  .        if( zSc
5cb0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20  hema ){.        
5cc0: 20 20 63 68 61 72 20 63 51 75 6f 74 65 20 3d 20    char cQuote = 
5cd0: 71 75 6f 74 65 43 68 61 72 28 7a 53 63 68 65 6d  quoteChar(zSchem
5ce0: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  a);.          if
5cf0: 28 20 63 51 75 6f 74 65 20 26 26 20 73 71 6c 69  ( cQuote && sqli
5d00: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53 63 68  te3_stricmp(zSch
5d10: 65 6d 61 2c 22 74 65 6d 70 22 29 21 3d 30 20 29  ema,"temp")!=0 )
5d20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5d30: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5d40: 66 28 22 25 2e 2a 73 20 5c 22 25 77 5c 22 2e 25  f("%.*s \"%w\".%
5d50: 73 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53  s", n+7, zIn, zS
5d60: 63 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b  chema, zIn+n+8);
5d70: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
5d80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5d90: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5da0: 66 28 22 25 2e 2a 73 20 25 73 2e 25 73 22 2c 20  f("%.*s %s.%s", 
5db0: 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65 6d  n+7, zIn, zSchem
5dc0: 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20 20  a, zIn+n+8);.   
5dd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5de0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   }.        if( z
5df0: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 26 26  Name.         &&
5e00: 20 61 50 72 65 66 69 78 5b 69 5d 5b 30 5d 3d 3d   aPrefix[i][0]==
5e10: 27 56 27 0a 20 20 20 20 20 20 20 20 20 26 26 20  'V'.         && 
5e20: 28 7a 46 61 6b 65 20 3d 20 73 68 65 6c 6c 46 61  (zFake = shellFa
5e30: 6b 65 53 63 68 65 6d 61 28 64 62 2c 20 7a 53 63  keSchema(db, zSc
5e40: 68 65 6d 61 2c 20 7a 4e 61 6d 65 29 29 21 3d 30  hema, zName))!=0
5e50: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
5e60: 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
5e70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5e80: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5e90: 66 28 22 25 73 5c 6e 2f 2a 20 25 73 20 2a 2f 22  f("%s\n/* %s */"
5ea0: 2c 20 7a 49 6e 2c 20 7a 46 61 6b 65 29 3b 0a 20  , zIn, zFake);. 
5eb0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20              z = 
5ed0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
5ee0: 22 25 7a 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c 20  "%z\n/* %s */", 
5ef0: 7a 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20  z, zFake);.     
5f00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5f10: 20 66 72 65 65 28 7a 46 61 6b 65 29 3b 0a 20 20   free(zFake);.  
5f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5f30: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20  if( z ){.       
5f40: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5f50: 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20  t_text(pCtx, z, 
5f60: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
5f70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
5f80: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
5f90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5fa0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
5fb0: 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70  t_value(pCtx, ap
5fc0: 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Val[0]);.}../*.*
5fd0: 2a 20 54 68 65 20 73 6f 75 72 63 65 20 63 6f 64  * The source cod
5fe0: 65 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 75  e for several ru
5ff0: 6e 2d 74 69 6d 65 20 6c 6f 61 64 61 62 6c 65 20  n-time loadable 
6000: 65 78 74 65 6e 73 69 6f 6e 73 20 69 73 20 69 6e  extensions is in
6010: 73 65 72 74 65 64 0a 2a 2a 20 62 65 6c 6f 77 20  serted.** below 
6020: 62 79 20 74 68 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d  by the ../tool/m
6030: 6b 73 68 65 6c 6c 63 2e 74 63 6c 20 73 63 72 69  kshellc.tcl scri
6040: 70 74 2e 20 20 42 65 66 6f 72 65 20 70 72 6f 63  pt.  Before proc
6050: 65 73 73 69 6e 67 20 74 68 61 74 20 69 6e 63 6c  essing that incl
6060: 75 64 65 64 0a 2a 2a 20 63 6f 64 65 2c 20 77 65  uded.** code, we
6070: 20 6e 65 65 64 20 74 6f 20 6f 76 65 72 72 69 64   need to overrid
6080: 65 20 73 6f 6d 65 20 6d 61 63 72 6f 73 20 74 6f  e some macros to
6090: 20 6d 61 6b 65 20 74 68 65 20 69 6e 63 6c 75 64   make the includ
60a0: 65 64 20 70 72 6f 67 72 61 6d 20 63 6f 64 65 0a  ed program code.
60b0: 2a 2a 20 77 6f 72 6b 20 68 65 72 65 20 69 6e 20  ** work here in 
60c0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
60d0: 69 73 20 72 65 67 75 6c 61 72 20 70 72 6f 67 72  is regular progr
60e0: 61 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  am..*/.#define S
60f0: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
6100: 49 4e 49 54 31 0a 23 64 65 66 69 6e 65 20 53 51  INIT1.#define SQ
6110: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
6120: 4e 49 54 32 28 58 29 20 28 76 6f 69 64 29 28 58  NIT2(X) (void)(X
6130: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
6140: 57 49 4e 33 32 29 20 26 26 20 64 65 66 69 6e 65  WIN32) && define
6150: 64 28 5f 4d 53 43 5f 56 45 52 29 0a 49 4e 43 4c  d(_MSC_VER).INCL
6160: 55 44 45 20 74 65 73 74 5f 77 69 6e 64 69 72 65  UDE test_windire
6170: 6e 74 2e 68 0a 49 4e 43 4c 55 44 45 20 74 65 73  nt.h.INCLUDE tes
6180: 74 5f 77 69 6e 64 69 72 65 6e 74 2e 63 0a 23 64  t_windirent.c.#d
6190: 65 66 69 6e 65 20 64 69 72 65 6e 74 20 44 49 52  efine dirent DIR
61a0: 45 4e 54 0a 23 65 6e 64 69 66 0a 49 4e 43 4c 55  ENT.#endif.INCLU
61b0: 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73  DE ../ext/misc/s
61c0: 68 61 74 68 72 65 65 2e 63 0a 49 4e 43 4c 55 44  hathree.c.INCLUD
61d0: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 66 69  E ../ext/misc/fi
61e0: 6c 65 69 6f 2e 63 0a 49 4e 43 4c 55 44 45 20 2e  leio.c.INCLUDE .
61f0: 2e 2f 65 78 74 2f 6d 69 73 63 2f 63 6f 6d 70 6c  ./ext/misc/compl
6200: 65 74 69 6f 6e 2e 63 0a 49 4e 43 4c 55 44 45 20  etion.c.INCLUDE 
6210: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 61 70 70 65  ../ext/misc/appe
6220: 6e 64 76 66 73 2e 63 0a 49 4e 43 4c 55 44 45 20  ndvfs.c.INCLUDE 
6230: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 6d 65 6d 74  ../ext/misc/memt
6240: 72 61 63 65 2e 63 0a 23 69 66 64 65 66 20 53 51  race.c.#ifdef SQ
6250: 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 49  LITE_HAVE_ZLIB.I
6260: 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69  NCLUDE ../ext/mi
6270: 73 63 2f 7a 69 70 66 69 6c 65 2e 63 0a 49 4e 43  sc/zipfile.c.INC
6280: 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63  LUDE ../ext/misc
6290: 2f 73 71 6c 61 72 2e 63 0a 23 65 6e 64 69 66 0a  /sqlar.c.#endif.
62a0: 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 65  INCLUDE ../ext/e
62b0: 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65 78 70  xpert/sqlite3exp
62c0: 65 72 74 2e 68 0a 49 4e 43 4c 55 44 45 20 2e 2e  ert.h.INCLUDE ..
62d0: 2f 65 78 74 2f 65 78 70 65 72 74 2f 73 71 6c 69  /ext/expert/sqli
62e0: 74 65 33 65 78 70 65 72 74 2e 63 0a 0a 23 69 66  te3expert.c..#if
62f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6300: 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
6310: 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f  /*.** State info
6320: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 73 69  rmation for a si
6330: 6e 67 6c 65 20 6f 70 65 6e 20 73 65 73 73 69 6f  ngle open sessio
6340: 6e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  n.*/.typedef str
6350: 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  uct OpenSession 
6360: 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 73 74 72  OpenSession;.str
6370: 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  uct OpenSession 
6380: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
63a0: 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 66 6f  Symbolic name fo
63b0: 72 20 74 68 69 73 20 73 65 73 73 69 6f 6e 20 2a  r this session *
63c0: 2f 0a 20 20 69 6e 74 20 6e 46 69 6c 74 65 72 3b  /.  int nFilter;
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
63e0: 4e 75 6d 62 65 72 20 6f 66 20 78 46 69 6c 74 65  Number of xFilte
63f0: 72 20 72 65 6a 65 63 74 69 6f 6e 20 47 4c 4f 42  r rejection GLOB
6400: 20 70 61 74 74 65 72 6e 73 20 2a 2f 0a 20 20 63   patterns */.  c
6410: 68 61 72 20 2a 2a 61 7a 46 69 6c 74 65 72 3b 20  har **azFilter; 
6420: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
6430: 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65 6a 65   of xFilter reje
6440: 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74 74 65  ction GLOB patte
6450: 72 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rns */.  sqlite3
6460: 5f 73 65 73 73 69 6f 6e 20 2a 70 3b 20 20 20 20  _session *p;    
6470: 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20 73 65    /* The open se
6480: 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 65 6e 64  ssion */.};.#end
6490: 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 65 6c 6c 20  if../*.** Shell 
64a0: 6f 75 74 70 75 74 20 6d 6f 64 65 20 69 6e 66 6f  output mode info
64b0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65 66  rmation from bef
64c0: 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e  ore ".explain on
64d0: 22 2c 0a 2a 2a 20 73 61 76 65 64 20 73 6f 20 74  ",.** saved so t
64e0: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65  hat it can be re
64f0: 73 74 6f 72 65 64 20 62 79 20 22 2e 65 78 70 6c  stored by ".expl
6500: 61 69 6e 20 6f 66 66 22 0a 2a 2f 0a 74 79 70 65  ain off".*/.type
6510: 64 65 66 20 73 74 72 75 63 74 20 53 61 76 65 64  def struct Saved
6520: 4d 6f 64 65 49 6e 66 6f 20 53 61 76 65 64 4d 6f  ModeInfo SavedMo
6530: 64 65 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 53  deInfo;.struct S
6540: 61 76 65 64 4d 6f 64 65 49 6e 66 6f 20 7b 0a 20  avedModeInfo {. 
6550: 20 69 6e 74 20 76 61 6c 69 64 3b 20 20 20 20 20   int valid;     
6560: 20 20 20 20 20 2f 2a 20 49 73 20 74 68 65 72 65       /* Is there
6570: 20 6c 65 67 69 74 20 64 61 74 61 20 69 6e 20 68   legit data in h
6580: 65 72 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f  ere? */.  int mo
6590: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
65a0: 20 4d 6f 64 65 20 70 72 69 6f 72 20 74 6f 20 22   Mode prior to "
65b0: 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a  .explain on" */.
65c0: 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72    int showHeader
65d0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 22 2e 68  ;     /* The ".h
65e0: 65 61 64 65 72 22 20 73 65 74 74 69 6e 67 20 70  eader" setting p
65f0: 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61 69  rior to ".explai
6600: 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 63  n on" */.  int c
6610: 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f  olWidth[100];  /
6620: 2a 20 43 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20  * Column widths 
6630: 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61  prior to ".expla
6640: 69 6e 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a 74 79  in on" */.};..ty
6650: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 78 70  pedef struct Exp
6660: 65 72 74 49 6e 66 6f 20 45 78 70 65 72 74 49 6e  ertInfo ExpertIn
6670: 66 6f 3b 0a 73 74 72 75 63 74 20 45 78 70 65 72  fo;.struct Exper
6680: 74 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74 65  tInfo {.  sqlite
6690: 33 65 78 70 65 72 74 20 2a 70 45 78 70 65 72 74  3expert *pExpert
66a0: 3b 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65  ;.  int bVerbose
66b0: 3b 0a 7d 3b 0a 0a 2f 2a 20 41 20 73 69 6e 67 6c  ;.};../* A singl
66c0: 65 20 6c 69 6e 65 20 69 6e 20 74 68 65 20 45 51  e line in the EQ
66d0: 50 20 6f 75 74 70 75 74 20 2a 2f 0a 74 79 70 65  P output */.type
66e0: 64 65 66 20 73 74 72 75 63 74 20 45 51 50 47 72  def struct EQPGr
66f0: 61 70 68 52 6f 77 20 45 51 50 47 72 61 70 68 52  aphRow EQPGraphR
6700: 6f 77 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72  ow;.struct EQPGr
6710: 61 70 68 52 6f 77 20 7b 0a 20 20 69 6e 74 20 69  aphRow {.  int i
6720: 45 71 70 49 64 3b 20 20 20 20 20 20 20 20 20 20  EqpId;          
6730: 20 2f 2a 20 49 44 20 66 6f 72 20 74 68 69 73 20   /* ID for this 
6740: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  row */.  int iPa
6750: 72 65 6e 74 49 64 3b 20 20 20 20 20 20 20 20 2f  rentId;        /
6760: 2a 20 49 44 20 6f 66 20 74 68 65 20 70 61 72 65  * ID of the pare
6770: 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 45 51 50 47  nt row */.  EQPG
6780: 72 61 70 68 52 6f 77 20 2a 70 4e 65 78 74 3b 20  raphRow *pNext; 
6790: 20 20 2f 2a 20 4e 65 78 74 20 72 6f 77 20 69 6e    /* Next row in
67a0: 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 63   sequence */.  c
67b0: 68 61 72 20 7a 54 65 78 74 5b 31 5d 3b 20 20 20  har zText[1];   
67c0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20       /* Text to 
67d0: 64 69 73 70 6c 61 79 20 66 6f 72 20 74 68 69 73  display for this
67e0: 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41   row */.};../* A
67f0: 6c 6c 20 45 51 50 20 6f 75 74 70 75 74 20 69 73  ll EQP output is
6800: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
6810: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
6820: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
6830: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45  typedef struct E
6840: 51 50 47 72 61 70 68 20 45 51 50 47 72 61 70 68  QPGraph EQPGraph
6850: 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72 61 70  ;.struct EQPGrap
6860: 68 20 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f  h {.  EQPGraphRo
6870: 77 20 2a 70 52 6f 77 3b 20 20 20 20 2f 2a 20 4c  w *pRow;    /* L
6880: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c  inked list of al
6890: 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 45 51  l rows of the EQ
68a0: 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 45 51  P output */.  EQ
68b0: 50 47 72 61 70 68 52 6f 77 20 2a 70 4c 61 73 74  PGraphRow *pLast
68c0: 3b 20 20 20 2f 2a 20 4c 61 73 74 20 65 6c 65 6d  ;   /* Last elem
68d0: 65 6e 74 20 6f 66 20 74 68 65 20 70 52 6f 77 20  ent of the pRow 
68e0: 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 7a  list */.  char z
68f0: 50 72 65 66 69 78 5b 31 30 30 5d 3b 20 20 20 20  Prefix[100];    
6900: 2f 2a 20 47 72 61 70 68 20 70 72 65 66 69 78 20  /* Graph prefix 
6910: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  */.};../*.** Sta
6920: 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
6930: 62 6f 75 74 20 74 68 65 20 64 61 74 61 62 61 73  bout the databas
6940: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
6950: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 6e 0a  contained in an.
6960: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ** instance of t
6970: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
6980: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
6990: 65 66 20 73 74 72 75 63 74 20 53 68 65 6c 6c 53  ef struct ShellS
69a0: 74 61 74 65 20 53 68 65 6c 6c 53 74 61 74 65 3b  tate ShellState;
69b0: 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 53 74 61  .struct ShellSta
69c0: 74 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  te {.  sqlite3 *
69d0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
69e0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   The database */
69f0: 0a 20 20 75 38 20 61 75 74 6f 45 78 70 6c 61 69  .  u8 autoExplai
6a00: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74  n;        /* Aut
6a10: 6f 6d 61 74 69 63 61 6c 6c 79 20 74 75 72 6e 20  omatically turn 
6a20: 6f 6e 20 2e 65 78 70 6c 61 69 6e 20 6d 6f 64 65  on .explain mode
6a30: 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50   */.  u8 autoEQP
6a40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6a50: 52 75 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52  Run EXPLAIN QUER
6a60: 59 20 50 4c 41 4e 20 70 72 69 6f 72 20 74 6f 20  Y PLAN prior to 
6a70: 73 65 61 63 68 20 53 51 4c 20 73 74 6d 74 20 2a  seach SQL stmt *
6a80: 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50 74 65  /.  u8 autoEQPte
6a90: 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 61 75  st;        /* au
6aa0: 74 6f 45 51 50 20 69 73 20 69 6e 20 74 65 73 74  toEQP is in test
6ab0: 20 6d 6f 64 65 20 2a 2f 0a 20 20 75 38 20 61 75   mode */.  u8 au
6ac0: 74 6f 45 51 50 74 72 61 63 65 3b 20 20 20 20 20  toEQPtrace;     
6ad0: 20 20 2f 2a 20 61 75 74 6f 45 51 50 20 69 73 20    /* autoEQP is 
6ae0: 69 6e 20 74 72 61 63 65 20 6d 6f 64 65 20 2a 2f  in trace mode */
6af0: 0a 20 20 75 38 20 73 74 61 74 73 4f 6e 3b 20 20  .  u8 statsOn;  
6b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
6b10: 65 20 74 6f 20 64 69 73 70 6c 61 79 20 6d 65 6d  e to display mem
6b20: 6f 72 79 20 73 74 61 74 73 20 62 65 66 6f 72 65  ory stats before
6b30: 20 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a   each finalize *
6b40: 2f 0a 20 20 75 38 20 73 63 61 6e 73 74 61 74 73  /.  u8 scanstats
6b50: 4f 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  On;        /* Tr
6b60: 75 65 20 74 6f 20 64 69 73 70 6c 61 79 20 73 63  ue to display sc
6b70: 61 6e 20 73 74 61 74 73 20 62 65 66 6f 72 65 20  an stats before 
6b80: 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a 2f  each finalize */
6b90: 0a 20 20 75 38 20 6f 70 65 6e 4d 6f 64 65 3b 20  .  u8 openMode; 
6ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 48 45            /* SHE
6bb0: 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 2c 20  LL_OPEN_NORMAL, 
6bc0: 5f 41 50 50 45 4e 44 56 46 53 2c 20 6f 72 20 5f  _APPENDVFS, or _
6bd0: 5a 49 50 46 49 4c 45 20 2a 2f 0a 20 20 75 38 20  ZIPFILE */.  u8 
6be0: 64 6f 58 64 67 4f 70 65 6e 3b 20 20 20 20 20 20  doXdgOpen;      
6bf0: 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 73 74      /* Invoke st
6c00: 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70 65  art/open/xdg-ope
6c10: 6e 20 69 6e 20 6f 75 74 70 75 74 5f 72 65 73 65  n in output_rese
6c20: 74 28 29 20 2a 2f 0a 20 20 75 38 20 6e 45 71 70  t() */.  u8 nEqp
6c30: 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Level;          
6c40: 2f 2a 20 44 65 70 74 68 20 6f 66 20 74 68 65 20  /* Depth of the 
6c50: 45 51 50 20 6f 75 74 70 75 74 20 67 72 61 70 68  EQP output graph
6c60: 20 2a 2f 0a 20 20 75 38 20 65 54 72 61 63 65 54   */.  u8 eTraceT
6c70: 79 70 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ype;         /* 
6c80: 53 48 45 4c 4c 5f 54 52 41 43 45 5f 2a 20 76 61  SHELL_TRACE_* va
6c90: 6c 75 65 20 66 6f 72 20 74 79 70 65 20 6f 66 20  lue for type of 
6ca0: 74 72 61 63 65 20 2a 2f 0a 20 20 75 6e 73 69 67  trace */.  unsig
6cb0: 6e 65 64 20 6d 45 71 70 4c 69 6e 65 73 3b 20 20  ned mEqpLines;  
6cc0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 76 65 72    /* Mask of ver
6cd0: 69 74 69 63 61 6c 20 6c 69 6e 65 73 20 69 6e 20  itical lines in 
6ce0: 74 68 65 20 45 51 50 20 6f 75 74 70 75 74 20 67  the EQP output g
6cf0: 72 61 70 68 20 2a 2f 0a 20 20 69 6e 74 20 6f 75  raph */.  int ou
6d00: 74 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  tCount;         
6d10: 20 2f 2a 20 52 65 76 65 72 74 20 74 6f 20 73 74   /* Revert to st
6d20: 64 6f 75 74 20 77 68 65 6e 20 72 65 61 63 68 69  dout when reachi
6d30: 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74  ng zero */.  int
6d40: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
6d50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6d60: 20 72 65 63 6f 72 64 73 20 64 69 73 70 6c 61 79   records display
6d70: 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 69  ed so far */.  i
6d80: 6e 74 20 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20  nt lineno;      
6d90: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
6da0: 6d 62 65 72 20 6f 66 20 6c 61 73 74 20 6c 69 6e  mber of last lin
6db0: 65 20 72 65 61 64 20 66 72 6f 6d 20 69 6e 20 2a  e read from in *
6dc0: 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20  /.  FILE *in;   
6dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
6de0: 61 64 20 63 6f 6d 6d 61 6e 64 73 20 66 72 6f 6d  ad commands from
6df0: 20 74 68 69 73 20 73 74 72 65 61 6d 20 2a 2f 0a   this stream */.
6e00: 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20    FILE *out;    
6e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
6e20: 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
6e30: 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61 63 65 4f  /.  FILE *traceO
6e40: 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 75  ut;        /* Ou
6e50: 74 70 75 74 20 66 6f 72 20 73 71 6c 69 74 65 33  tput for sqlite3
6e60: 5f 74 72 61 63 65 28 29 20 2a 2f 0a 20 20 69 6e  _trace() */.  in
6e70: 74 20 6e 45 72 72 3b 20 20 20 20 20 20 20 20 20  t nErr;         
6e80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6e90: 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f  f errors seen */
6ea0: 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20 20 20  .  int mode;    
6eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
6ec0: 6f 75 74 70 75 74 20 6d 6f 64 65 20 73 65 74 74  output mode sett
6ed0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64  ing */.  int mod
6ee0: 65 50 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20  ePrior;         
6ef0: 2f 2a 20 53 61 76 65 64 20 6d 6f 64 65 20 2a 2f  /* Saved mode */
6f00: 0a 20 20 69 6e 74 20 63 4d 6f 64 65 3b 20 20 20  .  int cMode;   
6f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 6d            /* tem
6f20: 70 6f 72 61 72 79 20 6f 75 74 70 75 74 20 6d 6f  porary output mo
6f30: 64 65 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  de for the curre
6f40: 6e 74 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nt query */.  in
6f50: 74 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 20 20 20  t normalMode;   
6f60: 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6d       /* Output m
6f70: 6f 64 65 20 62 65 66 6f 72 65 20 22 2e 65 78 70  ode before ".exp
6f80: 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e  lain on" */.  in
6f90: 74 20 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  t writableSchema
6fa0: 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  ;    /* True if 
6fb0: 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
6fc0: 73 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69  schema=ON */.  i
6fd0: 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20  nt showHeader;  
6fe0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
6ff0: 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d   show column nam
7000: 65 73 20 69 6e 20 4c 69 73 74 20 6f 72 20 43 6f  es in List or Co
7010: 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 69  lumn mode */.  i
7020: 6e 74 20 6e 43 68 65 63 6b 3b 20 20 20 20 20 20  nt nCheck;      
7030: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7040: 6f 66 20 22 2e 63 68 65 63 6b 22 20 63 6f 6d 6d  of ".check" comm
7050: 61 6e 64 73 20 72 75 6e 20 2a 2f 0a 20 20 75 6e  ands run */.  un
7060: 73 69 67 6e 65 64 20 6e 50 72 6f 67 72 65 73 73  signed nProgress
7070: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
7080: 66 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  f progress callb
7090: 61 63 6b 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  acks encountered
70a0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d   */.  unsigned m
70b0: 78 50 72 6f 67 72 65 73 73 3b 20 20 20 2f 2a 20  xProgress;   /* 
70c0: 4d 61 78 69 6d 75 6d 20 70 72 6f 67 72 65 73 73  Maximum progress
70d0: 20 63 61 6c 6c 62 61 63 6b 73 20 62 65 66 6f 72   callbacks befor
70e0: 65 20 66 61 69 6c 69 6e 67 20 2a 2f 0a 20 20 75  e failing */.  u
70f0: 6e 73 69 67 6e 65 64 20 66 6c 67 50 72 6f 67 72  nsigned flgProgr
7100: 65 73 73 3b 20 20 2f 2a 20 46 6c 61 67 73 20 66  ess;  /* Flags f
7110: 6f 72 20 74 68 65 20 70 72 6f 67 72 65 73 73 20  or the progress 
7120: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 6e  callback */.  un
7130: 73 69 67 6e 65 64 20 73 68 65 6c 6c 46 6c 67 73  signed shellFlgs
7140: 3b 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20  ;    /* Various 
7150: 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  flags */.  sqlit
7160: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 61 78 3b 20  e3_int64 szMax; 
7170: 20 20 2f 2a 20 2d 2d 6d 61 78 73 69 7a 65 20 61    /* --maxsize a
7180: 72 67 75 6d 65 6e 74 20 74 6f 20 2e 6f 70 65 6e  rgument to .open
7190: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 73   */.  char *zDes
71a0: 74 54 61 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20  tTable;      /* 
71b0: 4e 61 6d 65 20 6f 66 20 64 65 73 74 69 6e 61 74  Name of destinat
71c0: 69 6f 6e 20 74 61 62 6c 65 20 77 68 65 6e 20 4d  ion table when M
71d0: 4f 44 45 5f 49 6e 73 65 72 74 20 2a 2f 0a 20 20  ODE_Insert */.  
71e0: 63 68 61 72 20 2a 7a 54 65 6d 70 46 69 6c 65 3b  char *zTempFile;
71f0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
7200: 61 72 79 20 66 69 6c 65 20 74 68 61 74 20 6d 69  ary file that mi
7210: 67 68 74 20 6e 65 65 64 20 64 65 6c 65 74 69 6e  ght need deletin
7220: 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 65 73  g */.  char zTes
7230: 74 63 61 73 65 5b 33 30 5d 3b 20 20 20 20 2f 2a  tcase[30];    /*
7240: 20 4e 61 6d 65 20 6f 66 20 63 75 72 72 65 6e 74   Name of current
7250: 20 74 65 73 74 20 63 61 73 65 20 2a 2f 0a 20 20   test case */.  
7260: 63 68 61 72 20 63 6f 6c 53 65 70 61 72 61 74 6f  char colSeparato
7270: 72 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6c 75 6d 6e  r[20]; /* Column
7280: 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   separator chara
7290: 63 74 65 72 20 66 6f 72 20 73 65 76 65 72 61 6c  cter for several
72a0: 20 6d 6f 64 65 73 20 2a 2f 0a 20 20 63 68 61 72   modes */.  char
72b0: 20 72 6f 77 53 65 70 61 72 61 74 6f 72 5b 32 30   rowSeparator[20
72c0: 5d 3b 20 2f 2a 20 52 6f 77 20 73 65 70 61 72 61  ]; /* Row separa
72d0: 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 66 6f  tor character fo
72e0: 72 20 4d 4f 44 45 5f 41 73 63 69 69 20 2a 2f 0a  r MODE_Ascii */.
72f0: 20 20 63 68 61 72 20 63 6f 6c 53 65 70 50 72 69    char colSepPri
7300: 6f 72 5b 32 30 5d 3b 20 20 2f 2a 20 53 61 76 65  or[20];  /* Save
7310: 64 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  d column separat
7320: 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 72 6f 77  or */.  char row
7330: 53 65 70 50 72 69 6f 72 5b 32 30 5d 3b 20 20 2f  SepPrior[20];  /
7340: 2a 20 53 61 76 65 64 20 72 6f 77 20 73 65 70 61  * Saved row sepa
7350: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63  rator */.  int c
7360: 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 20  olWidth[100];   
7370: 20 20 2f 2a 20 52 65 71 75 65 73 74 65 64 20 77    /* Requested w
7380: 69 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c  idth of each col
7390: 75 6d 6e 20 77 68 65 6e 20 69 6e 20 63 6f 6c 75  umn when in colu
73a0: 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20 69 6e 74 20  mn mode*/.  int 
73b0: 61 63 74 75 61 6c 57 69 64 74 68 5b 31 30 30 5d  actualWidth[100]
73c0: 3b 20 20 2f 2a 20 41 63 74 75 61 6c 20 77 69 64  ;  /* Actual wid
73d0: 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d  th of each colum
73e0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 6e 75 6c 6c  n */.  char null
73f0: 56 61 6c 75 65 5b 32 30 5d 3b 20 20 20 20 2f 2a  Value[20];    /*
7400: 20 54 68 65 20 74 65 78 74 20 74 6f 20 70 72 69   The text to pri
7410: 6e 74 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63  nt when a NULL c
7420: 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 0a 20  omes back from. 
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7440: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64          ** the d
7450: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61  atabase */.  cha
7460: 72 20 6f 75 74 66 69 6c 65 5b 46 49 4c 45 4e 41  r outfile[FILENA
7470: 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69 6c 65  ME_MAX]; /* File
7480: 6e 61 6d 65 20 66 6f 72 20 2a 6f 75 74 20 2a 2f  name for *out */
7490: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
74a0: 44 62 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 2f  DbFilename;    /
74b0: 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * name of the da
74c0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
74d0: 20 63 68 61 72 20 2a 7a 46 72 65 65 4f 6e 43 6c   char *zFreeOnCl
74e0: 6f 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ose;         /* 
74f0: 46 69 6c 65 6e 61 6d 65 20 74 6f 20 66 72 65 65  Filename to free
7500: 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f   when closing */
7510: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7520: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs;           /
7530: 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 74 6f  * Name of VFS to
7540: 20 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65   use */.  sqlite
7550: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
7560: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74   /* Current stat
7570: 65 6d 65 6e 74 20 69 66 20 61 6e 79 2e 20 2a 2f  ement if any. */
7580: 0a 20 20 46 49 4c 45 20 2a 70 4c 6f 67 3b 20 20  .  FILE *pLog;  
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
75a0: 74 65 20 6c 6f 67 20 6f 75 74 70 75 74 20 68 65  te log output he
75b0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 49  re */.  int *aiI
75c0: 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20 2f  ndent;         /
75d0: 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 64 65 6e  * Array of inden
75e0: 74 73 20 75 73 65 64 20 69 6e 20 4d 4f 44 45 5f  ts used in MODE_
75f0: 45 78 70 6c 61 69 6e 20 2a 2f 0a 20 20 69 6e 74  Explain */.  int
7600: 20 6e 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20   nIndent;       
7610: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
7620: 72 72 61 79 20 61 69 49 6e 64 65 6e 74 5b 5d 20  rray aiIndent[] 
7630: 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 6e 74  */.  int iIndent
7640: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
7650: 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20  ndex of current 
7660: 6f 70 20 69 6e 20 61 69 49 6e 64 65 6e 74 5b 5d  op in aiIndent[]
7670: 20 2a 2f 0a 20 20 45 51 50 47 72 61 70 68 20 73   */.  EQPGraph s
7680: 47 72 61 70 68 3b 20 20 20 20 20 20 20 2f 2a 20  Graph;       /* 
7690: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  Information for 
76a0: 74 68 65 20 67 72 61 70 68 69 63 61 6c 20 45 58  the graphical EX
76b0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
76c0: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
76d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
76e0: 53 53 49 4f 4e 29 0a 20 20 69 6e 74 20 6e 53 65  SSION).  int nSe
76f0: 73 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ssion;          
7700: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7710: 61 63 74 69 76 65 20 73 65 73 73 69 6f 6e 73 20  active sessions 
7720: 2a 2f 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e  */.  OpenSession
7730: 20 61 53 65 73 73 69 6f 6e 5b 34 5d 3b 20 20 2f   aSession[4];  /
7740: 2a 20 41 72 72 61 79 20 6f 66 20 73 65 73 73 69  * Array of sessi
7750: 6f 6e 73 2e 20 20 5b 30 5d 20 69 73 20 69 6e 20  ons.  [0] is in 
7760: 66 6f 63 75 73 2e 20 2a 2f 0a 23 65 6e 64 69 66  focus. */.#endif
7770: 0a 20 20 45 78 70 65 72 74 49 6e 66 6f 20 65 78  .  ExpertInfo ex
7780: 70 65 72 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  pert;        /* 
7790: 56 61 6c 69 64 20 69 66 20 70 72 65 76 69 6f 75  Valid if previou
77a0: 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 22 2e  s command was ".
77b0: 65 78 70 65 72 74 20 4f 50 54 2e 2e 2e 22 20 2a  expert OPT..." *
77c0: 2f 0a 7d 3b 0a 0a 0a 2f 2a 20 41 6c 6c 6f 77 65  /.};.../* Allowe
77d0: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53 68 65  d values for She
77e0: 6c 6c 53 74 61 74 65 2e 61 75 74 6f 45 51 50 0a  llState.autoEQP.
77f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45  */.#define AUTOE
7800: 51 50 5f 6f 66 66 20 20 20 20 20 20 30 20 20 20  QP_off      0   
7810: 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 6f 6d          /* Autom
7820: 61 74 69 63 20 45 58 50 4c 41 49 4e 20 51 55 45  atic EXPLAIN QUE
7830: 52 59 20 50 4c 41 4e 20 69 73 20 6f 66 66 20 2a  RY PLAN is off *
7840: 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51  /.#define AUTOEQ
7850: 50 5f 6f 6e 20 20 20 20 20 20 20 31 20 20 20 20  P_on       1    
7860: 20 20 20 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61         /* Automa
7870: 74 69 63 20 45 51 50 20 69 73 20 6f 6e 20 2a 2f  tic EQP is on */
7880: 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50  .#define AUTOEQP
7890: 5f 74 72 69 67 67 65 72 20 20 32 20 20 20 20 20  _trigger  2     
78a0: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 61 6e 64 20        /* On and 
78b0: 61 6c 73 6f 20 73 68 6f 77 20 70 6c 61 6e 73 20  also show plans 
78c0: 66 6f 72 20 74 72 69 67 67 65 72 73 20 2a 2f 0a  for triggers */.
78d0: 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f  #define AUTOEQP_
78e0: 66 75 6c 6c 20 20 20 20 20 33 20 20 20 20 20 20  full     3      
78f0: 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 66 75 6c       /* Show ful
7900: 6c 20 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a  l EXPLAIN */../*
7910: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
7920: 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65 2e 6f  for ShellState.o
7930: 70 65 6e 4d 6f 64 65 0a 2a 2f 0a 23 64 65 66 69  penMode.*/.#defi
7940: 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e  ne SHELL_OPEN_UN
7950: 53 50 45 43 20 20 20 20 20 20 20 30 20 20 20 20  SPEC       0    
7960: 2f 2a 20 4e 6f 20 6f 70 65 6e 2d 6d 6f 64 65 20  /* No open-mode 
7970: 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 23 64 65  specified */.#de
7980: 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  fine SHELL_OPEN_
7990: 4e 4f 52 4d 41 4c 20 20 20 20 20 20 20 31 20 20  NORMAL       1  
79a0: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 64 61 74 61    /* Normal data
79b0: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 64 65  base file */.#de
79c0: 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  fine SHELL_OPEN_
79d0: 41 50 50 45 4e 44 56 46 53 20 20 20 20 32 20 20  APPENDVFS    2  
79e0: 20 20 2f 2a 20 55 73 65 20 61 70 70 65 6e 64 76    /* Use appendv
79f0: 66 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48  fs */.#define SH
7a00: 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45  ELL_OPEN_ZIPFILE
7a10: 20 20 20 20 20 20 33 20 20 20 20 2f 2a 20 55 73        3    /* Us
7a20: 65 20 74 68 65 20 7a 69 70 66 69 6c 65 20 76 69  e the zipfile vi
7a30: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 23  rtual table */.#
7a40: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45  define SHELL_OPE
7a50: 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 20 34  N_READONLY     4
7a60: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 6e 6f      /* Open a no
7a70: 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 72 65  rmal database re
7a80: 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69  ad-only */.#defi
7a90: 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45  ne SHELL_OPEN_DE
7aa0: 53 45 52 49 41 4c 49 5a 45 20 20 35 20 20 20 20  SERIALIZE  5    
7ab0: 2f 2a 20 4f 70 65 6e 20 75 73 69 6e 67 20 73 71  /* Open using sq
7ac0: 6c 69 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a  lite3_deserializ
7ad0: 65 28 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  e() */.#define S
7ae0: 48 45 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44 42 20  HELL_OPEN_HEXDB 
7af0: 20 20 20 20 20 20 20 36 20 20 20 20 2f 2a 20 55         6    /* U
7b00: 73 65 20 22 64 62 74 6f 74 78 74 22 20 6f 75 74  se "dbtotxt" out
7b10: 70 75 74 20 61 73 20 64 61 74 61 20 73 6f 75 72  put as data sour
7b20: 63 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48  ce */.#define SH
7b30: 45 4c 4c 5f 4f 50 45 4e 5f 53 48 41 52 45 44 53  ELL_OPEN_SHAREDS
7b40: 43 48 45 4d 41 20 37 20 20 20 20 2f 2a 20 4f 70  CHEMA 7    /* Op
7b50: 65 6e 20 66 6f 72 20 73 63 68 65 6d 61 20 72 65  en for schema re
7b60: 75 73 65 20 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 77  use */../* Allow
7b70: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53 68  ed values for Sh
7b80: 65 6c 6c 53 74 61 74 65 2e 65 54 72 61 63 65 54  ellState.eTraceT
7b90: 79 70 65 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ype.*/.#define S
7ba0: 48 45 4c 4c 5f 54 52 41 43 45 5f 50 4c 41 49 4e  HELL_TRACE_PLAIN
7bb0: 20 20 20 20 20 20 30 20 20 20 20 20 20 2f 2a 20        0      /* 
7bc0: 53 68 6f 77 20 69 6e 70 75 74 20 53 51 4c 20 74  Show input SQL t
7bd0: 65 78 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ext */.#define S
7be0: 48 45 4c 4c 5f 54 52 41 43 45 5f 45 58 50 41 4e  HELL_TRACE_EXPAN
7bf0: 44 45 44 20 20 20 31 20 20 20 20 20 20 2f 2a 20  DED   1      /* 
7c00: 53 68 6f 77 20 65 78 70 61 6e 64 65 64 20 53 51  Show expanded SQ
7c10: 4c 20 74 65 78 74 20 2a 2f 0a 23 64 65 66 69 6e  L text */.#defin
7c20: 65 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f 4e 4f  e SHELL_TRACE_NO
7c30: 52 4d 41 4c 49 5a 45 44 20 32 20 20 20 20 20 20  RMALIZED 2      
7c40: 2f 2a 20 53 68 6f 77 20 6e 6f 72 6d 61 6c 69 7a  /* Show normaliz
7c50: 65 64 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 0a  ed SQL text */..
7c60: 2f 2a 20 42 69 74 73 20 69 6e 20 74 68 65 20 53  /* Bits in the S
7c70: 68 65 6c 6c 53 74 61 74 65 2e 66 6c 67 50 72 6f  hellState.flgPro
7c80: 67 72 65 73 73 20 76 61 72 69 61 62 6c 65 20 2a  gress variable *
7c90: 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f  /.#define SHELL_
7ca0: 50 52 4f 47 52 45 53 53 5f 51 55 49 45 54 20 30  PROGRESS_QUIET 0
7cb0: 78 30 31 20 20 2f 2a 20 4f 6d 69 74 20 61 6e 6e  x01  /* Omit ann
7cc0: 6f 75 6e 63 69 6e 67 20 65 76 65 72 79 20 70 72  ouncing every pr
7cd0: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
7ce0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c  */.#define SHELL
7cf0: 5f 50 52 4f 47 52 45 53 53 5f 52 45 53 45 54 20  _PROGRESS_RESET 
7d00: 30 78 30 32 20 20 2f 2a 20 52 65 73 65 74 20 74  0x02  /* Reset t
7d10: 68 65 20 63 6f 75 6e 74 20 77 68 65 6e 20 74 68  he count when th
7d20: 65 20 70 72 6f 67 72 65 73 0a 20 20 20 20 20 20  e progres.      
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
7d50: 63 61 6c 6c 62 61 63 6b 20 6c 69 6d 69 74 20 69  callback limit i
7d60: 73 20 72 65 61 63 68 65 64 2c 20 61 6e 64 20 66  s reached, and f
7d70: 6f 72 20 65 61 63 68 0a 20 20 20 20 20 20 20 20  or each.        
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d90: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f             ** to
7da0: 70 2d 6c 65 76 65 6c 20 53 51 4c 20 73 74 61 74  p-level SQL stat
7db0: 65 6d 65 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65  ement */.#define
7dc0: 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f   SHELL_PROGRESS_
7dd0: 4f 4e 43 45 20 20 30 78 30 34 20 20 2f 2a 20 43  ONCE  0x04  /* C
7de0: 61 6e 63 65 6c 20 74 68 65 20 2d 2d 6c 69 6d 69  ancel the --limi
7df0: 74 20 61 66 74 65 72 20 66 69 72 69 6e 67 20 6f  t after firing o
7e00: 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  nce */../*.** Th
7e10: 65 73 65 20 61 72 65 20 74 68 65 20 61 6c 6c 6f  ese are the allo
7e20: 77 65 64 20 73 68 65 6c 6c 46 6c 67 73 20 76 61  wed shellFlgs va
7e30: 6c 75 65 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lues.*/.#define 
7e40: 53 48 46 4c 47 5f 50 61 67 65 63 61 63 68 65 20  SHFLG_Pagecache 
7e50: 20 20 20 20 20 30 78 30 30 30 30 30 30 30 31 20       0x00000001 
7e60: 2f 2a 20 54 68 65 20 2d 2d 70 61 67 65 63 61 63  /* The --pagecac
7e70: 68 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65  he option is use
7e80: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46  d */.#define SHF
7e90: 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65 20 20 20 20  LG_Lookaside    
7ea0: 20 20 30 78 30 30 30 30 30 30 30 32 20 2f 2a 20    0x00000002 /* 
7eb0: 4c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  Lookaside memory
7ec0: 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65 66   is used */.#def
7ed0: 69 6e 65 20 53 48 46 4c 47 5f 42 61 63 6b 73 6c  ine SHFLG_Backsl
7ee0: 61 73 68 20 20 20 20 20 20 30 78 30 30 30 30 30  ash      0x00000
7ef0: 30 30 34 20 2f 2a 20 54 68 65 20 2d 2d 62 61 63  004 /* The --bac
7f00: 6b 73 6c 61 73 68 20 6f 70 74 69 6f 6e 20 69 73  kslash option is
7f10: 20 75 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65   used */.#define
7f20: 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52   SHFLG_PreserveR
7f30: 6f 77 69 64 20 20 30 78 30 30 30 30 30 30 30 38  owid  0x00000008
7f40: 20 2f 2a 20 2e 64 75 6d 70 20 70 72 65 73 65 72   /* .dump preser
7f50: 76 65 73 20 72 6f 77 69 64 20 76 61 6c 75 65 73  ves rowid values
7f60: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c   */.#define SHFL
7f70: 47 5f 4e 65 77 6c 69 6e 65 73 20 20 20 20 20 20  G_Newlines      
7f80: 20 30 78 30 30 30 30 30 30 31 30 20 2f 2a 20 2e   0x00000010 /* .
7f90: 64 75 6d 70 20 2d 2d 6e 65 77 6c 69 6e 65 20 66  dump --newline f
7fa0: 6c 61 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  lag */.#define S
7fb0: 48 46 4c 47 5f 43 6f 75 6e 74 43 68 61 6e 67 65  HFLG_CountChange
7fc0: 73 20 20 20 30 78 30 30 30 30 30 30 32 30 20 2f  s   0x00000020 /
7fd0: 2a 20 2e 63 68 61 6e 67 65 73 20 73 65 74 74 69  * .changes setti
7fe0: 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48  ng */.#define SH
7ff0: 46 4c 47 5f 45 63 68 6f 20 20 20 20 20 20 20 20  FLG_Echo        
8000: 20 20 20 30 78 30 30 30 30 30 30 34 30 20 2f 2a     0x00000040 /*
8010: 20 2e 65 63 68 6f 20 6f 72 20 2d 2d 65 63 68 6f   .echo or --echo
8020: 20 73 65 74 74 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a   setting */../*.
8030: 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 65  ** Macros for te
8040: 73 74 69 6e 67 20 61 6e 64 20 73 65 74 74 69 6e  sting and settin
8050: 67 20 73 68 65 6c 6c 46 6c 67 73 0a 2a 2f 0a 23  g shellFlgs.*/.#
8060: 64 65 66 69 6e 65 20 53 68 65 6c 6c 48 61 73 46  define ShellHasF
8070: 6c 61 67 28 50 2c 58 29 20 20 20 20 28 28 28 50  lag(P,X)    (((P
8080: 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 28  )->shellFlgs & (
8090: 58 29 29 21 3d 30 29 0a 23 64 65 66 69 6e 65 20  X))!=0).#define 
80a0: 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 50 2c 58  ShellSetFlag(P,X
80b0: 29 20 20 20 20 28 28 50 29 2d 3e 73 68 65 6c 6c  )    ((P)->shell
80c0: 46 6c 67 73 7c 3d 28 58 29 29 0a 23 64 65 66 69  Flgs|=(X)).#defi
80d0: 6e 65 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61  ne ShellClearFla
80e0: 67 28 50 2c 58 29 20 20 28 28 50 29 2d 3e 73 68  g(P,X)  ((P)->sh
80f0: 65 6c 6c 46 6c 67 73 26 3d 28 7e 28 58 29 29 29  ellFlgs&=(~(X)))
8100: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72  ../*.** These ar
8110: 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6d 6f  e the allowed mo
8120: 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  des..*/.#define 
8130: 4d 4f 44 45 5f 4c 69 6e 65 20 20 20 20 20 30 20  MODE_Line     0 
8140: 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 70   /* One column p
8150: 65 72 20 6c 69 6e 65 2e 20 20 42 6c 61 6e 6b 20  er line.  Blank 
8160: 6c 69 6e 65 20 62 65 74 77 65 65 6e 20 72 65 63  line between rec
8170: 6f 72 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ords */.#define 
8180: 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 20 20 31 20  MODE_Column   1 
8190: 20 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20 70   /* One record p
81a0: 65 72 20 6c 69 6e 65 20 69 6e 20 6e 65 61 74 20  er line in neat 
81b0: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66 69  columns */.#defi
81c0: 6e 65 20 4d 4f 44 45 5f 4c 69 73 74 20 20 20 20  ne MODE_List    
81d0: 20 32 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f 72   2  /* One recor
81e0: 64 20 70 65 72 20 6c 69 6e 65 20 77 69 74 68 20  d per line with 
81f0: 61 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a 23  a separator */.#
8200: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 53 65 6d 69  define MODE_Semi
8210: 20 20 20 20 20 33 20 20 2f 2a 20 53 61 6d 65 20       3  /* Same 
8220: 61 73 20 4d 4f 44 45 5f 4c 69 73 74 20 62 75 74  as MODE_List but
8230: 20 61 70 70 65 6e 64 20 22 3b 22 20 74 6f 20 65   append ";" to e
8240: 61 63 68 20 6c 69 6e 65 20 2a 2f 0a 23 64 65 66  ach line */.#def
8250: 69 6e 65 20 4d 4f 44 45 5f 48 74 6d 6c 20 20 20  ine MODE_Html   
8260: 20 20 34 20 20 2f 2a 20 47 65 6e 65 72 61 74 65    4  /* Generate
8270: 20 61 6e 20 58 48 54 4d 4c 20 74 61 62 6c 65 20   an XHTML table 
8280: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
8290: 49 6e 73 65 72 74 20 20 20 35 20 20 2f 2a 20 47  Insert   5  /* G
82a0: 65 6e 65 72 61 74 65 20 53 51 4c 20 22 69 6e 73  enerate SQL "ins
82b0: 65 72 74 22 20 73 74 61 74 65 6d 65 6e 74 73 20  ert" statements 
82c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
82d0: 51 75 6f 74 65 20 20 20 20 36 20 20 2f 2a 20 51  Quote    6  /* Q
82e0: 75 6f 74 65 20 76 61 6c 75 65 73 20 61 73 20 66  uote values as f
82f0: 6f 72 20 53 51 4c 20 2a 2f 0a 23 64 65 66 69 6e  or SQL */.#defin
8300: 65 20 4d 4f 44 45 5f 54 63 6c 20 20 20 20 20 20  e MODE_Tcl      
8310: 37 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 41  7  /* Generate A
8320: 4e 53 49 2d 43 20 6f 72 20 54 43 4c 20 71 75 6f  NSI-C or TCL quo
8330: 74 65 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ted elements */.
8340: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 73 76  #define MODE_Csv
8350: 20 20 20 20 20 20 38 20 20 2f 2a 20 51 75 6f 74        8  /* Quot
8360: 65 20 73 74 72 69 6e 67 73 2c 20 6e 75 6d 62 65  e strings, numbe
8370: 72 73 20 61 72 65 20 70 6c 61 69 6e 20 2a 2f 0a  rs are plain */.
8380: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 45 78 70  #define MODE_Exp
8390: 6c 61 69 6e 20 20 39 20 20 2f 2a 20 4c 69 6b 65  lain  9  /* Like
83a0: 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 2c 20 62 75   MODE_Column, bu
83b0: 74 20 64 6f 20 6e 6f 74 20 74 72 75 6e 63 61 74  t do not truncat
83c0: 65 20 64 61 74 61 20 2a 2f 0a 23 64 65 66 69 6e  e data */.#defin
83d0: 65 20 4d 4f 44 45 5f 41 73 63 69 69 20 20 20 31  e MODE_Ascii   1
83e0: 30 20 20 2f 2a 20 55 73 65 20 41 53 43 49 49 20  0  /* Use ASCII 
83f0: 75 6e 69 74 20 61 6e 64 20 72 65 63 6f 72 64 20  unit and record 
8400: 73 65 70 61 72 61 74 6f 72 73 20 28 30 78 31 46  separators (0x1F
8410: 2f 30 78 31 45 29 20 2a 2f 0a 23 64 65 66 69 6e  /0x1E) */.#defin
8420: 65 20 4d 4f 44 45 5f 50 72 65 74 74 79 20 20 31  e MODE_Pretty  1
8430: 31 20 20 2f 2a 20 50 72 65 74 74 79 2d 70 72 69  1  /* Pretty-pri
8440: 6e 74 20 73 63 68 65 6d 61 73 20 2a 2f 0a 23 64  nt schemas */.#d
8450: 65 66 69 6e 65 20 4d 4f 44 45 5f 45 51 50 20 20  efine MODE_EQP  
8460: 20 20 20 31 32 20 20 2f 2a 20 43 6f 6e 76 65 72     12  /* Conver
8470: 74 73 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  ts EXPLAIN QUERY
8480: 20 50 4c 41 4e 20 6f 75 74 70 75 74 20 69 6e 74   PLAN output int
8490: 6f 20 61 20 67 72 61 70 68 20 2a 2f 0a 0a 73 74  o a graph */..st
84a0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
84b0: 2a 6d 6f 64 65 44 65 73 63 72 5b 5d 20 3d 20 7b  *modeDescr[] = {
84c0: 0a 20 20 22 6c 69 6e 65 22 2c 0a 20 20 22 63 6f  .  "line",.  "co
84d0: 6c 75 6d 6e 22 2c 0a 20 20 22 6c 69 73 74 22 2c  lumn",.  "list",
84e0: 0a 20 20 22 73 65 6d 69 22 2c 0a 20 20 22 68 74  .  "semi",.  "ht
84f0: 6d 6c 22 2c 0a 20 20 22 69 6e 73 65 72 74 22 2c  ml",.  "insert",
8500: 0a 20 20 22 71 75 6f 74 65 22 2c 0a 20 20 22 74  .  "quote",.  "t
8510: 63 6c 22 2c 0a 20 20 22 63 73 76 22 2c 0a 20 20  cl",.  "csv",.  
8520: 22 65 78 70 6c 61 69 6e 22 2c 0a 20 20 22 61 73  "explain",.  "as
8530: 63 69 69 22 2c 0a 20 20 22 70 72 65 74 74 79 70  cii",.  "prettyp
8540: 72 69 6e 74 22 2c 0a 20 20 22 65 71 70 22 0a 7d  rint",.  "eqp".}
8550: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ;../*.** These a
8560: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 2f 72 6f  re the column/ro
8570: 77 2f 6c 69 6e 65 20 73 65 70 61 72 61 74 6f 72  w/line separator
8580: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 76 61  s used by the va
8590: 72 69 6f 75 73 0a 2a 2a 20 69 6d 70 6f 72 74 2f  rious.** import/
85a0: 65 78 70 6f 72 74 20 6d 6f 64 65 73 2e 0a 2a 2f  export modes..*/
85b0: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43 6f 6c  .#define SEP_Col
85c0: 75 6d 6e 20 20 20 20 22 7c 22 0a 23 64 65 66 69  umn    "|".#defi
85d0: 6e 65 20 53 45 50 5f 52 6f 77 20 20 20 20 20 20  ne SEP_Row      
85e0: 20 22 5c 6e 22 0a 23 64 65 66 69 6e 65 20 53 45   "\n".#define SE
85f0: 50 5f 54 61 62 20 20 20 20 20 20 20 22 5c 74 22  P_Tab       "\t"
8600: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 53 70 61  .#define SEP_Spa
8610: 63 65 20 20 20 20 20 22 20 22 0a 23 64 65 66 69  ce     " ".#defi
8620: 6e 65 20 53 45 50 5f 43 6f 6d 6d 61 20 20 20 20  ne SEP_Comma    
8630: 20 22 2c 22 0a 23 64 65 66 69 6e 65 20 53 45 50   ",".#define SEP
8640: 5f 43 72 4c 66 20 20 20 20 20 20 22 5c 72 5c 6e  _CrLf      "\r\n
8650: 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 55 6e  ".#define SEP_Un
8660: 69 74 20 20 20 20 20 20 22 5c 78 31 46 22 0a 23  it      "\x1F".#
8670: 64 65 66 69 6e 65 20 53 45 50 5f 52 65 63 6f 72  define SEP_Recor
8680: 64 20 20 20 20 22 5c 78 31 45 22 0a 0a 2f 2a 0a  d    "\x1E"../*.
8690: 2a 2a 20 41 20 63 61 6c 6c 62 61 63 6b 20 66 6f  ** A callback fo
86a0: 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 6f  r the sqlite3_lo
86b0: 67 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  g() interface..*
86c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
86d0: 65 6c 6c 4c 6f 67 28 76 6f 69 64 20 2a 70 41 72  ellLog(void *pAr
86e0: 67 2c 20 69 6e 74 20 69 45 72 72 43 6f 64 65 2c  g, int iErrCode,
86f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73   const char *zMs
8700: 67 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  g){.  ShellState
8710: 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74   *p = (ShellStat
8720: 65 2a 29 70 41 72 67 3b 0a 20 20 69 66 28 20 70  e*)pArg;.  if( p
8730: 2d 3e 70 4c 6f 67 3d 3d 30 20 29 20 72 65 74 75  ->pLog==0 ) retu
8740: 72 6e 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  rn;.  utf8_print
8750: 66 28 70 2d 3e 70 4c 6f 67 2c 20 22 28 25 64 29  f(p->pLog, "(%d)
8760: 20 25 73 5c 6e 22 2c 20 69 45 72 72 43 6f 64 65   %s\n", iErrCode
8770: 2c 20 7a 4d 73 67 29 3b 0a 20 20 66 66 6c 75 73  , zMsg);.  fflus
8780: 68 28 70 2d 3e 70 4c 6f 67 29 3b 0a 7d 0a 0a 2f  h(p->pLog);.}../
8790: 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  *.** SQL functio
87a0: 6e 3a 20 20 73 68 65 6c 6c 5f 70 75 74 73 6e 6c  n:  shell_putsnl
87b0: 28 58 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  (X).**.** Write 
87c0: 74 68 65 20 74 65 78 74 20 58 20 74 6f 20 74 68  the text X to th
87d0: 65 20 73 63 72 65 65 6e 20 28 6f 72 20 77 68 61  e screen (or wha
87e0: 74 65 76 65 72 20 6f 75 74 70 75 74 20 69 73 20  tever output is 
87f0: 62 65 69 6e 67 20 64 69 72 65 63 74 65 64 29 0a  being directed).
8800: 2a 2a 20 61 64 64 69 6e 67 20 61 20 6e 65 77 6c  ** adding a newl
8810: 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64 2c 20  ine at the end, 
8820: 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20  and then return 
8830: 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  X..*/.static voi
8840: 64 20 73 68 65 6c 6c 50 75 74 73 46 75 6e 63 28  d shellPutsFunc(
8850: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
8860: 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
8870: 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
8880: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
8890: 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
88a0: 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29   = (ShellState*)
88b0: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
88c0: 61 28 70 43 74 78 29 3b 0a 20 20 28 76 6f 69 64  a(pCtx);.  (void
88d0: 29 6e 56 61 6c 3b 0a 20 20 75 74 66 38 5f 70 72  )nVal;.  utf8_pr
88e0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
88f0: 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  \n", sqlite3_val
8900: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d  ue_text(apVal[0]
8910: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  ));.  sqlite3_re
8920: 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c  sult_value(pCtx,
8930: 20 61 70 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f   apVal[0]);.}../
8940: 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  *.** SQL functio
8950: 6e 3a 20 20 20 65 64 69 74 28 56 41 4c 55 45 29  n:   edit(VALUE)
8960: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
8970: 20 20 20 20 65 64 69 74 28 56 41 4c 55 45 2c 45      edit(VALUE,E
8980: 44 49 54 4f 52 29 0a 2a 2a 0a 2a 2a 20 54 68 65  DITOR).**.** The
8990: 73 65 20 73 74 65 70 73 3a 0a 2a 2a 0a 2a 2a 20  se steps:.**.** 
89a0: 20 20 20 20 28 31 29 20 57 72 69 74 65 20 56 41      (1) Write VA
89b0: 4c 55 45 20 69 6e 74 6f 20 61 20 74 65 6d 70 6f  LUE into a tempo
89c0: 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  rary file..**   
89d0: 20 20 28 32 29 20 52 75 6e 20 70 72 6f 67 72 61    (2) Run progra
89e0: 6d 20 45 44 49 54 4f 52 20 6f 6e 20 74 68 61 74  m EDITOR on that
89f0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
8a00: 0a 2a 2a 20 20 20 20 20 28 33 29 20 52 65 61 64  .**     (3) Read
8a10: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
8a20: 69 6c 65 20 62 61 63 6b 20 61 6e 64 20 72 65 74  ile back and ret
8a30: 75 72 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  urn its content 
8a40: 61 73 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  as the result..*
8a50: 2a 20 20 20 20 20 28 34 29 20 44 65 6c 65 74 65  *     (4) Delete
8a60: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
8a70: 69 6c 65 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ile.**.** If the
8a80: 20 45 44 49 54 4f 52 20 61 72 67 75 6d 65 6e 74   EDITOR argument
8a90: 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 75 73 65   is omitted, use
8aa0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
8ab0: 65 20 56 49 53 55 41 4c 0a 2a 2a 20 65 6e 76 69  e VISUAL.** envi
8ac0: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
8ad0: 2e 20 20 49 66 20 73 74 69 6c 6c 20 74 68 65 72  .  If still ther
8ae0: 65 20 69 73 20 6e 6f 20 45 44 49 54 4f 52 2c 20  e is no EDITOR, 
8af0: 74 68 72 6f 75 67 68 20 61 6e 20 65 72 72 6f 72  through an error
8b00: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 68 72  ..**.** Also thr
8b10: 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ow an error if t
8b20: 68 65 20 45 44 49 54 4f 52 20 70 72 6f 67 72 61  he EDITOR progra
8b30: 6d 20 72 65 74 75 72 6e 73 20 61 20 6e 6f 6e 2d  m returns a non-
8b40: 7a 65 72 6f 20 65 78 69 74 20 63 6f 64 65 2e 0a  zero exit code..
8b50: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
8b60: 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a  E_NOHAVE_SYSTEM.
8b70: 73 74 61 74 69 63 20 76 6f 69 64 20 65 64 69 74  static void edit
8b80: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
8b90: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
8ba0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
8bb0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
8bc0: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
8bd0: 63 68 61 72 20 2a 7a 45 64 69 74 6f 72 3b 0a 20  char *zEditor;. 
8be0: 20 63 68 61 72 20 2a 7a 54 65 6d 70 46 69 6c 65   char *zTempFile
8bf0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
8c00: 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6d  *db;.  char *zCm
8c10: 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62 42 69  d = 0;.  int bBi
8c20: 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  n;.  int rc;.  i
8c30: 6e 74 20 68 61 73 43 52 4e 4c 20 3d 20 30 3b 0a  nt hasCRNL = 0;.
8c40: 20 20 46 49 4c 45 20 2a 66 20 3d 20 30 3b 0a 20    FILE *f = 0;. 
8c50: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
8c60: 7a 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  z;.  sqlite3_int
8c70: 36 34 20 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64  64 x;.  unsigned
8c80: 20 63 68 61 72 20 2a 70 20 3d 20 30 3b 0a 0a 20   char *p = 0;.. 
8c90: 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a   if( argc==2 ){.
8ca0: 20 20 20 20 7a 45 64 69 74 6f 72 20 3d 20 28 63      zEditor = (c
8cb0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
8cc0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
8cd0: 67 76 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  gv[1]);.  }else{
8ce0: 0a 20 20 20 20 7a 45 64 69 74 6f 72 20 3d 20 67  .    zEditor = g
8cf0: 65 74 65 6e 76 28 22 56 49 53 55 41 4c 22 29 3b  etenv("VISUAL");
8d00: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 45 64 69 74  .  }.  if( zEdit
8d10: 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  or==0 ){.    sql
8d20: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
8d30: 72 28 63 6f 6e 74 65 78 74 2c 20 22 6e 6f 20 65  r(context, "no e
8d40: 64 69 74 6f 72 20 66 6f 72 20 65 64 69 74 28 29  ditor for edit()
8d50: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  ", -1);.    retu
8d60: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  rn;.  }.  if( sq
8d70: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
8d80: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
8d90: 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71  E_NULL ){.    sq
8da0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
8db0: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 4e 55 4c  or(context, "NUL
8dc0: 4c 20 69 6e 70 75 74 20 74 6f 20 65 64 69 74 28  L input to edit(
8dd0: 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  )", -1);.    ret
8de0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20  urn;.  }.  db = 
8df0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
8e00: 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78  db_handle(contex
8e10: 74 29 3b 0a 20 20 7a 54 65 6d 70 46 69 6c 65 20  t);.  zTempFile 
8e20: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
8e30: 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
8e40: 30 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  0, SQLITE_FCNTL_
8e50: 54 45 4d 50 46 49 4c 45 4e 41 4d 45 2c 20 26 7a  TEMPFILENAME, &z
8e60: 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  TempFile);.  if(
8e70: 20 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b   zTempFile==0 ){
8e80: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e  .    sqlite3_uin
8e90: 74 36 34 20 72 20 3d 20 30 3b 0a 20 20 20 20 73  t64 r = 0;.    s
8ea0: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
8eb0: 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29  s(sizeof(r), &r)
8ec0: 3b 0a 20 20 20 20 7a 54 65 6d 70 46 69 6c 65 20  ;.    zTempFile 
8ed0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
8ee0: 66 28 22 74 65 6d 70 25 6c 6c 78 22 2c 20 72 29  f("temp%llx", r)
8ef0: 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 46  ;.    if( zTempF
8f00: 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
8f10: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
8f20: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
8f30: 78 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  xt);.      retur
8f40: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  n;.    }.  }.  b
8f50: 42 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Bin = sqlite3_va
8f60: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
8f70: 29 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 3b 0a  )==SQLITE_BLOB;.
8f80: 20 20 2f 2a 20 57 68 65 6e 20 77 72 69 74 69 6e    /* When writin
8f90: 67 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  g the file to be
8fa0: 20 65 64 69 74 65 64 2c 20 64 6f 20 5c 6e 20 74   edited, do \n t
8fb0: 6f 20 5c 72 5c 6e 20 63 6f 6e 76 65 72 73 69 6f  o \r\n conversio
8fc0: 6e 73 20 6f 6e 20 73 79 73 74 65 6d 73 0a 20 20  ns on systems.  
8fd0: 2a 2a 20 74 68 61 74 20 77 61 6e 74 20 5c 72 5c  ** that want \r\
8fe0: 6e 20 6c 69 6e 65 20 65 6e 64 69 6e 67 73 20 2a  n line endings *
8ff0: 2f 0a 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 54  /.  f = fopen(zT
9000: 65 6d 70 46 69 6c 65 2c 20 62 42 69 6e 20 3f 20  empFile, bBin ? 
9010: 22 77 62 22 20 3a 20 22 77 22 29 3b 0a 20 20 69  "wb" : "w");.  i
9020: 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73  f( f==0 ){.    s
9030: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
9040: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 65 64  ror(context, "ed
9050: 69 74 28 29 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  it() cannot open
9060: 20 74 65 6d 70 20 66 69 6c 65 22 2c 20 2d 31 29   temp file", -1)
9070: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f  ;.    goto edit_
9080: 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  func_end;.  }.  
9090: 73 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  sz = sqlite3_val
90a0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
90b0: 29 3b 0a 20 20 69 66 28 20 62 42 69 6e 20 29 7b  );.  if( bBin ){
90c0: 0a 20 20 20 20 78 20 3d 20 66 77 72 69 74 65 28  .    x = fwrite(
90d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
90e0: 6f 62 28 61 72 67 76 5b 30 5d 29 2c 20 31 2c 20  ob(argv[0]), 1, 
90f0: 73 7a 2c 20 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  sz, f);.  }else{
9100: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
9110: 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  *z = (const char
9120: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
9130: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
9140: 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 77     /* Remember w
9150: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
9160: 65 20 76 61 6c 75 65 20 6f 72 69 67 69 6e 61 6c  e value original
9170: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 5c 72 5c  ly contained \r\
9180: 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 20 26  n */.    if( z &
9190: 26 20 73 74 72 73 74 72 28 7a 2c 22 5c 72 5c 6e  & strstr(z,"\r\n
91a0: 22 29 21 3d 30 20 29 20 68 61 73 43 52 4e 4c 20  ")!=0 ) hasCRNL 
91b0: 3d 20 31 3b 0a 20 20 20 20 78 20 3d 20 66 77 72  = 1;.    x = fwr
91c0: 69 74 65 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  ite(sqlite3_valu
91d0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c  e_text(argv[0]),
91e0: 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20 7d 0a   1, sz, f);.  }.
91f0: 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 66    fclose(f);.  f
9200: 20 3d 20 30 3b 0a 20 20 69 66 28 20 78 21 3d 73   = 0;.  if( x!=s
9210: 7a 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  z ){.    sqlite3
9220: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
9230: 6e 74 65 78 74 2c 20 22 65 64 69 74 28 29 20 63  ntext, "edit() c
9240: 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74  ould not write t
9250: 68 65 20 77 68 6f 6c 65 20 66 69 6c 65 22 2c 20  he whole file", 
9260: 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64  -1);.    goto ed
9270: 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d  it_func_end;.  }
9280: 0a 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65  .  zCmd = sqlite
9290: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 5c 22  3_mprintf("%s \"
92a0: 25 73 5c 22 22 2c 20 7a 45 64 69 74 6f 72 2c 20  %s\"", zEditor, 
92b0: 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66  zTempFile);.  if
92c0: 28 20 7a 43 6d 64 3d 3d 30 20 29 7b 0a 20 20 20  ( zCmd==0 ){.   
92d0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
92e0: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
92f0: 65 78 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ext);.    goto e
9300: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20  dit_func_end;.  
9310: 7d 0a 20 20 72 63 20 3d 20 73 79 73 74 65 6d 28  }.  rc = system(
9320: 7a 43 6d 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  zCmd);.  sqlite3
9330: 5f 66 72 65 65 28 7a 43 6d 64 29 3b 0a 20 20 69  _free(zCmd);.  i
9340: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
9350: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
9360: 72 28 63 6f 6e 74 65 78 74 2c 20 22 45 44 49 54  r(context, "EDIT
9370: 4f 52 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e 2d  OR returned non-
9380: 7a 65 72 6f 22 2c 20 2d 31 29 3b 0a 20 20 20 20  zero", -1);.    
9390: 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65  goto edit_func_e
93a0: 6e 64 3b 0a 20 20 7d 0a 20 20 66 20 3d 20 66 6f  nd;.  }.  f = fo
93b0: 70 65 6e 28 7a 54 65 6d 70 46 69 6c 65 2c 20 22  pen(zTempFile, "
93c0: 72 62 22 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30  rb");.  if( f==0
93d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
93e0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
93f0: 74 65 78 74 2c 0a 20 20 20 20 20 20 22 65 64 69  text,.      "edi
9400: 74 28 29 20 63 61 6e 6e 6f 74 20 72 65 6f 70 65  t() cannot reope
9410: 6e 20 74 65 6d 70 20 66 69 6c 65 20 61 66 74 65  n temp file afte
9420: 72 20 65 64 69 74 22 2c 20 2d 31 29 3b 0a 20 20  r edit", -1);.  
9430: 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63    goto edit_func
9440: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 66 73 65 65  _end;.  }.  fsee
9450: 6b 28 66 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44  k(f, 0, SEEK_END
9460: 29 3b 0a 20 20 73 7a 20 3d 20 66 74 65 6c 6c 28  );.  sz = ftell(
9470: 66 29 3b 0a 20 20 72 65 77 69 6e 64 28 66 29 3b  f);.  rewind(f);
9480: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  p = sqlite3_m
9490: 61 6c 6c 6f 63 36 34 28 20 73 7a 2b 28 62 42 69  alloc64( sz+(bBi
94a0: 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70  n==0) );.  if( p
94b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
94c0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
94d0: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
94e0: 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75      goto edit_fu
94f0: 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 78 20  nc_end;.  }.  x 
9500: 3d 20 66 72 65 61 64 28 70 2c 20 31 2c 20 73 7a  = fread(p, 1, sz
9510: 2c 20 66 29 3b 0a 20 20 66 63 6c 6f 73 65 28 66  , f);.  fclose(f
9520: 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20 69 66  );.  f = 0;.  if
9530: 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20 20 73  ( x!=sz ){.    s
9540: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
9550: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 63 6f  ror(context, "co
9560: 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 62 61 63  uld not read bac
9570: 6b 20 74 68 65 20 77 68 6f 6c 65 20 66 69 6c 65  k the whole file
9580: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f  ", -1);.    goto
9590: 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a   edit_func_end;.
95a0: 20 20 7d 0a 20 20 69 66 28 20 62 42 69 6e 20 29    }.  if( bBin )
95b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
95c0: 73 75 6c 74 5f 62 6c 6f 62 36 34 28 63 6f 6e 74  sult_blob64(cont
95d0: 65 78 74 2c 20 70 2c 20 73 7a 2c 20 73 71 6c 69  ext, p, sz, sqli
95e0: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 65 6c  te3_free);.  }el
95f0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
9600: 69 6e 74 36 34 20 69 2c 20 6a 3b 0a 20 20 20 20  int64 i, j;.    
9610: 69 66 28 20 68 61 73 43 52 4e 4c 20 29 7b 0a 20  if( hasCRNL ){. 
9620: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f       /* If the o
9630: 72 69 67 69 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  riginal contains
9640: 20 5c 72 5c 6e 20 74 68 65 6e 20 64 6f 20 6e 6f   \r\n then do no
9650: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 62 61 63   conversions bac
9660: 6b 20 74 6f 20 5c 6e 20 2a 2f 0a 20 20 20 20 20  k to \n */.     
9670: 20 6a 20 3d 20 73 7a 3b 0a 20 20 20 20 7d 65 6c   j = sz;.    }el
9680: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  se{.      /* If 
9690: 74 68 65 20 66 69 6c 65 20 64 69 64 20 6e 6f 74  the file did not
96a0: 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 74   originally cont
96b0: 61 69 6e 20 5c 72 5c 6e 20 74 68 65 6e 20 63 6f  ain \r\n then co
96c0: 6e 76 65 72 74 20 61 6e 79 20 6e 65 77 0a 20 20  nvert any new.  
96d0: 20 20 20 20 2a 2a 20 5c 72 5c 6e 20 62 61 63 6b      ** \r\n back
96e0: 20 69 6e 74 6f 20 5c 6e 20 2a 2f 0a 20 20 20 20   into \n */.    
96f0: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 73    for(i=j=0; i<s
9700: 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  z; i++){.       
9710: 20 69 66 28 20 70 5b 69 5d 3d 3d 27 5c 72 27 20   if( p[i]=='\r' 
9720: 26 26 20 70 5b 69 2b 31 5d 3d 3d 27 5c 6e 27 20  && p[i+1]=='\n' 
9730: 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  ) i++;.        p
9740: 5b 6a 2b 2b 5d 20 3d 20 70 5b 69 5d 3b 0a 20 20  [j++] = p[i];.  
9750: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 7a 20 3d      }.      sz =
9760: 20 6a 3b 0a 20 20 20 20 20 20 70 5b 73 7a 5d 20   j;.      p[sz] 
9770: 3d 20 30 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20  = 0;.    } .    
9780: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
9790: 65 78 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 28  ext64(context, (
97a0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 2c 20 73  const char*)p, s
97b0: 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  z,.             
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
97d0: 69 74 65 33 5f 66 72 65 65 2c 20 53 51 4c 49 54  ite3_free, SQLIT
97e0: 45 5f 55 54 46 38 29 3b 0a 20 20 7d 0a 20 20 70  E_UTF8);.  }.  p
97f0: 20 3d 20 30 3b 0a 0a 65 64 69 74 5f 66 75 6e 63   = 0;..edit_func
9800: 5f 65 6e 64 3a 0a 20 20 69 66 28 20 66 20 29 20  _end:.  if( f ) 
9810: 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 75 6e 6c  fclose(f);.  unl
9820: 69 6e 6b 28 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  ink(zTempFile);.
9830: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9840: 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c  TempFile);.  sql
9850: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a  ite3_free(p);.}.
9860: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9870: 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 20 2a  _NOHAVE_SYSTEM *
9880: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 6f 72  /../*.** Save or
9890: 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
98a0: 72 65 6e 74 20 6f 75 74 70 75 74 20 6d 6f 64 65  rent output mode
98b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
98c0: 6f 75 74 70 75 74 4d 6f 64 65 50 75 73 68 28 53  outputModePush(S
98d0: 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
98e0: 20 70 2d 3e 6d 6f 64 65 50 72 69 6f 72 20 3d 20   p->modePrior = 
98f0: 70 2d 3e 6d 6f 64 65 3b 0a 20 20 6d 65 6d 63 70  p->mode;.  memcp
9900: 79 28 70 2d 3e 63 6f 6c 53 65 70 50 72 69 6f 72  y(p->colSepPrior
9910: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
9920: 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c  r, sizeof(p->col
9930: 53 65 70 61 72 61 74 6f 72 29 29 3b 0a 20 20 6d  Separator));.  m
9940: 65 6d 63 70 79 28 70 2d 3e 72 6f 77 53 65 70 50  emcpy(p->rowSepP
9950: 72 69 6f 72 2c 20 70 2d 3e 72 6f 77 53 65 70 61  rior, p->rowSepa
9960: 72 61 74 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d  rator, sizeof(p-
9970: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 29 3b  >rowSeparator));
9980: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  .}.static void o
9990: 75 74 70 75 74 4d 6f 64 65 50 6f 70 28 53 68 65  utputModePop(She
99a0: 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 70  llState *p){.  p
99b0: 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  ->mode = p->mode
99c0: 50 72 69 6f 72 3b 0a 20 20 6d 65 6d 63 70 79 28  Prior;.  memcpy(
99d0: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
99e0: 20 70 2d 3e 63 6f 6c 53 65 70 50 72 69 6f 72 2c   p->colSepPrior,
99f0: 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65   sizeof(p->colSe
9a00: 70 61 72 61 74 6f 72 29 29 3b 0a 20 20 6d 65 6d  parator));.  mem
9a10: 63 70 79 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  cpy(p->rowSepara
9a20: 74 6f 72 2c 20 70 2d 3e 72 6f 77 53 65 70 50 72  tor, p->rowSepPr
9a30: 69 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 72  ior, sizeof(p->r
9a40: 6f 77 53 65 70 61 72 61 74 6f 72 29 29 3b 0a 7d  owSeparator));.}
9a50: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74  ../*.** Output t
9a60: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
9a70: 61 73 20 61 20 68 65 78 2d 65 6e 63 6f 64 65 64  as a hex-encoded
9a80: 20 62 6c 6f 62 20 28 65 67 2e 20 58 27 31 32 33   blob (eg. X'123
9a90: 34 27 20 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  4' ).*/.static v
9aa0: 6f 69 64 20 6f 75 74 70 75 74 5f 68 65 78 5f 62  oid output_hex_b
9ab0: 6c 6f 62 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  lob(FILE *out, c
9ac0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62  onst void *pBlob
9ad0: 2c 20 69 6e 74 20 6e 42 6c 6f 62 29 7b 0a 20 20  , int nBlob){.  
9ae0: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
9af0: 42 6c 6f 62 20 3d 20 28 63 68 61 72 20 2a 29 70  Blob = (char *)p
9b00: 42 6c 6f 62 3b 0a 20 20 72 61 77 5f 70 72 69 6e  Blob;.  raw_prin
9b10: 74 66 28 6f 75 74 2c 22 58 27 22 29 3b 0a 20 20  tf(out,"X'");.  
9b20: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 6c 6f 62  for(i=0; i<nBlob
9b30: 3b 20 69 2b 2b 29 7b 20 72 61 77 5f 70 72 69 6e  ; i++){ raw_prin
9b40: 74 66 28 6f 75 74 2c 22 25 30 32 78 22 2c 7a 42  tf(out,"%02x",zB
9b50: 6c 6f 62 5b 69 5d 26 30 78 66 66 29 3b 20 7d 0a  lob[i]&0xff); }.
9b60: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
9b70: 2c 22 27 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ,"'");.}../*.** 
9b80: 46 69 6e 64 20 61 20 73 74 72 69 6e 67 20 74 68  Find a string th
9b90: 61 74 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20  at is not found 
9ba0: 61 6e 79 77 68 65 72 65 20 69 6e 20 7a 5b 5d 2e  anywhere in z[].
9bb0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
9bc0: 65 72 0a 2a 2a 20 74 6f 20 74 68 61 74 20 73 74  er.** to that st
9bd0: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 72 79 20  ring..**.** Try 
9be0: 74 6f 20 75 73 65 20 7a 41 20 61 6e 64 20 7a 42  to use zA and zB
9bf0: 20 66 69 72 73 74 2e 20 20 49 66 20 62 6f 74 68   first.  If both
9c00: 20 6f 66 20 74 68 6f 73 65 20 61 72 65 20 61 6c   of those are al
9c10: 72 65 61 64 79 20 66 6f 75 6e 64 20 69 6e 20 7a  ready found in z
9c20: 5b 5d 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20  [].** then make 
9c30: 75 70 20 73 6f 6d 65 20 73 74 72 69 6e 67 20 61  up some string a
9c40: 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74  nd store it in t
9c50: 68 65 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a  he buffer zBuf..
9c60: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
9c70: 63 68 61 72 20 2a 75 6e 75 73 65 64 5f 73 74 72  char *unused_str
9c80: 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ing(.  const cha
9c90: 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20  r *z,           
9ca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
9cb0: 6c 74 20 6d 75 73 74 20 6e 6f 74 20 61 70 70 65  lt must not appe
9cc0: 61 72 20 61 6e 79 77 68 65 72 65 20 69 6e 20 7a  ar anywhere in z
9cd0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
9ce0: 20 2a 7a 41 2c 20 63 6f 6e 73 74 20 63 68 61 72   *zA, const char
9cf0: 20 2a 7a 42 2c 20 20 20 2f 2a 20 54 72 79 20 74   *zB,   /* Try t
9d00: 68 65 73 65 20 66 69 72 73 74 20 2a 2f 0a 20 20  hese first */.  
9d10: 63 68 61 72 20 2a 7a 42 75 66 20 20 20 20 20 20  char *zBuf      
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d30: 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 73 74    /* Space to st
9d40: 6f 72 65 20 61 20 67 65 6e 65 72 61 74 65 64 20  ore a generated 
9d50: 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75  string */.){.  u
9d60: 6e 73 69 67 6e 65 64 20 69 20 3d 20 30 3b 0a 20  nsigned i = 0;. 
9d70: 20 69 66 28 20 73 74 72 73 74 72 28 7a 2c 20 7a   if( strstr(z, z
9d80: 41 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a  A)==0 ) return z
9d90: 41 3b 0a 20 20 69 66 28 20 73 74 72 73 74 72 28  A;.  if( strstr(
9da0: 7a 2c 20 7a 42 29 3d 3d 30 20 29 20 72 65 74 75  z, zB)==0 ) retu
9db0: 72 6e 20 7a 42 3b 0a 20 20 64 6f 7b 0a 20 20 20  rn zB;.  do{.   
9dc0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9dd0: 66 28 32 30 2c 7a 42 75 66 2c 22 28 25 73 25 75  f(20,zBuf,"(%s%u
9de0: 29 22 2c 20 7a 41 2c 20 69 2b 2b 29 3b 0a 20 20  )", zA, i++);.  
9df0: 7d 77 68 69 6c 65 28 20 73 74 72 73 74 72 28 7a  }while( strstr(z
9e00: 2c 7a 42 75 66 29 21 3d 30 20 29 3b 0a 20 20 72  ,zBuf)!=0 );.  r
9e10: 65 74 75 72 6e 20 7a 42 75 66 3b 0a 7d 0a 0a 2f  eturn zBuf;.}../
9e20: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
9e30: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20  given string as 
9e40: 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  a quoted string 
9e50: 75 73 69 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e  using SQL quotin
9e60: 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a  g conventions..*
9e70: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 6f  *.** See also: o
9e80: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63  utput_quoted_esc
9e90: 61 70 65 64 5f 73 74 72 69 6e 67 28 29 0a 2a 2f  aped_string().*/
9ea0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
9eb0: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
9ec0: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
9ed0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
9ee0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a  nt i;.  char c;.
9ef0: 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28    setBinaryMode(
9f00: 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69  out, 1);.  for(i
9f10: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
9f20: 30 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b  0 && c!='\''; i+
9f30: 2b 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20  +){}.  if( c==0 
9f40: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
9f50: 74 66 28 6f 75 74 2c 22 27 25 73 27 22 2c 7a 29  tf(out,"'%s'",z)
9f60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
9f70: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
9f80: 27 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  '");.    while( 
9f90: 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  *z ){.      for(
9fa0: 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  i=0; (c = z[i])!
9fb0: 3d 30 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69  =0 && c!='\''; i
9fc0: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20  ++){}.      if( 
9fd0: 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b 0a 20  c=='\'' ) i++;. 
9fe0: 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a 20 20       if( i ){.  
9ff0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
a000: 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69  f(out, "%.*s", i
a010: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a 20  , z);.        z 
a020: 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += i;.      }.  
a030: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20      if( c=='\'' 
a040: 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
a050: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
a060: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
a070: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
a080: 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
a090: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a0a0: 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20    }.      z++;. 
a0b0: 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69     }.    raw_pri
a0c0: 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20  ntf(out, "'");. 
a0d0: 20 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64 65   }.  setTextMode
a0e0: 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  (out, 1);.}../*.
a0f0: 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69  ** Output the gi
a100: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
a110: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 75 73  quoted string us
a120: 69 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e 67 20  ing SQL quoting 
a130: 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a 2a 20  conventions..** 
a140: 41 64 64 69 74 69 6f 6e 61 6c 6c 6c 79 20 2c 20  Additionallly , 
a150: 65 73 63 61 70 65 20 74 68 65 20 22 5c 6e 22 20  escape the "\n" 
a160: 61 6e 64 20 22 5c 72 22 20 63 68 61 72 61 63 74  and "\r" charact
a170: 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  ers so that they
a180: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 67 65 74 20 63   do not.** get c
a190: 6f 72 72 75 70 74 65 64 20 62 79 20 65 6e 64 2d  orrupted by end-
a1a0: 6f 66 2d 6c 69 6e 65 20 74 72 61 6e 73 6c 61 74  of-line translat
a1b0: 69 6f 6e 20 66 61 63 69 6c 69 74 69 65 73 20 69  ion facilities i
a1c0: 6e 20 73 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67  n some operating
a1d0: 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a  .** systems..**.
a1e0: 2a 2a 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20  ** This is like 
a1f0: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74  output_quoted_st
a200: 72 69 6e 67 28 29 20 62 75 74 20 77 69 74 68 20  ring() but with 
a210: 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20  the addition of 
a220: 74 68 65 20 5c 72 5c 6e 0a 2a 2a 20 65 73 63 61  the \r\n.** esca
a230: 70 65 20 6d 65 63 68 61 6e 69 73 6d 2e 0a 2a 2f  pe mechanism..*/
a240: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
a250: 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70  put_quoted_escap
a260: 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  ed_string(FILE *
a270: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
a280: 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *z){.  int i;.  
a290: 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e  char c;.  setBin
a2a0: 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b  aryMode(out, 1);
a2b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d  .  for(i=0; (c =
a2c0: 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d   z[i])!=0 && c!=
a2d0: 27 5c 27 27 20 26 26 20 63 21 3d 27 5c 6e 27 20  '\'' && c!='\n' 
a2e0: 26 26 20 63 21 3d 27 5c 72 27 3b 20 69 2b 2b 29  && c!='\r'; i++)
a2f0: 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b  {}.  if( c==0 ){
a300: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
a310: 28 6f 75 74 2c 22 27 25 73 27 22 2c 7a 29 3b 0a  (out,"'%s'",z);.
a320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
a330: 73 74 20 63 68 61 72 20 2a 7a 4e 4c 20 3d 20 30  st char *zNL = 0
a340: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
a350: 20 2a 7a 43 52 20 3d 20 30 3b 0a 20 20 20 20 69   *zCR = 0;.    i
a360: 6e 74 20 6e 4e 4c 20 3d 20 30 3b 0a 20 20 20 20  nt nNL = 0;.    
a370: 69 6e 74 20 6e 43 52 20 3d 20 30 3b 0a 20 20 20  int nCR = 0;.   
a380: 20 63 68 61 72 20 7a 42 75 66 31 5b 32 30 5d 2c   char zBuf1[20],
a390: 20 7a 42 75 66 32 5b 32 30 5d 3b 0a 20 20 20 20   zBuf2[20];.    
a3a0: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
a3b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ++){.      if( z
a3c0: 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6e 4e 4c 2b  [i]=='\n' ) nNL+
a3d0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  +;.      if( z[i
a3e0: 5d 3d 3d 27 5c 72 27 20 29 20 6e 43 52 2b 2b 3b  ]=='\r' ) nCR++;
a3f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
a400: 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  NL ){.      raw_
a410: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 72 65 70  printf(out, "rep
a420: 6c 61 63 65 28 22 29 3b 0a 20 20 20 20 20 20 7a  lace(");.      z
a430: 4e 4c 20 3d 20 75 6e 75 73 65 64 5f 73 74 72 69  NL = unused_stri
a440: 6e 67 28 7a 2c 20 22 5c 5c 6e 22 2c 20 22 5c 5c  ng(z, "\\n", "\\
a450: 30 31 32 22 2c 20 7a 42 75 66 31 29 3b 0a 20 20  012", zBuf1);.  
a460: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 43 52 20    }.    if( nCR 
a470: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
a480: 6e 74 66 28 6f 75 74 2c 20 22 72 65 70 6c 61 63  ntf(out, "replac
a490: 65 28 22 29 3b 0a 20 20 20 20 20 20 7a 43 52 20  e(");.      zCR 
a4a0: 3d 20 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28  = unused_string(
a4b0: 7a 2c 20 22 5c 5c 72 22 2c 20 22 5c 5c 30 31 35  z, "\\r", "\\015
a4c0: 22 2c 20 7a 42 75 66 32 29 3b 0a 20 20 20 20 7d  ", zBuf2);.    }
a4d0: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
a4e0: 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77  out, "'");.    w
a4f0: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
a500: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
a510: 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  z[i])!=0 && c!='
a520: 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27 20 26  \n' && c!='\r' &
a530: 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b  & c!='\''; i++){
a540: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
a550: 5c 27 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20  \'' ) i++;.     
a560: 20 69 66 28 20 69 20 29 7b 0a 20 20 20 20 20 20   if( i ){.      
a570: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
a580: 74 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29  t, "%.*s", i, z)
a590: 3b 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 69  ;.        z += i
a5a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a5b0: 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20  if( c=='\'' ){. 
a5c0: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
a5d0: 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20  f(out, "'");.   
a5e0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
a5f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a600: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
a610: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
a620: 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20        z++;.     
a630: 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a   if( c=='\n' ){.
a640: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
a650: 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 4e  tf(out, "%s", zN
a660: 4c 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  L);.        cont
a670: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
a680: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
a690: 75 74 2c 20 22 25 73 22 2c 20 7a 43 52 29 3b 0a  ut, "%s", zCR);.
a6a0: 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72      }.    raw_pr
a6b0: 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a  intf(out, "'");.
a6c0: 20 20 20 20 69 66 28 20 6e 43 52 20 29 7b 0a 20      if( nCR ){. 
a6d0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
a6e0: 6f 75 74 2c 20 22 2c 27 25 73 27 2c 63 68 61 72  out, ",'%s',char
a6f0: 28 31 33 29 29 22 2c 20 7a 43 52 29 3b 0a 20 20  (13))", zCR);.  
a700: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4e 4c 20    }.    if( nNL 
a710: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
a720: 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73 27 2c  ntf(out, ",'%s',
a730: 63 68 61 72 28 31 30 29 29 22 2c 20 7a 4e 4c 29  char(10))", zNL)
a740: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 65  ;.    }.  }.  se
a750: 74 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31  tTextMode(out, 1
a760: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70  );.}../*.** Outp
a770: 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  ut the given str
a780: 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20  ing as a quoted 
a790: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 43 20 6f  according to C o
a7a0: 72 20 54 43 4c 20 71 75 6f 74 69 6e 67 20 72 75  r TCL quoting ru
a7b0: 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  les..*/.static v
a7c0: 6f 69 64 20 6f 75 74 70 75 74 5f 63 5f 73 74 72  oid output_c_str
a7d0: 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  ing(FILE *out, c
a7e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
a7f0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 3b   unsigned int c;
a800: 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75  .  fputc('"', ou
a810: 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 63 20  t);.  while( (c 
a820: 3d 20 2a 28 7a 2b 2b 29 29 21 3d 30 20 29 7b 0a  = *(z++))!=0 ){.
a830: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20      if( c=='\\' 
a840: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63  ){.      fputc(c
a850: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70  , out);.      fp
a860: 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
a870: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22   }else if( c=='"
a880: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a890: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a8a0: 20 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75     fputc('"', ou
a8b0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a8c0: 28 20 63 3d 3d 27 5c 74 27 20 29 7b 0a 20 20 20  ( c=='\t' ){.   
a8d0: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a8e0: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a8f0: 28 27 74 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('t', out);.    
a900: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 6e  }else if( c=='\n
a910: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a920: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a930: 20 20 20 66 70 75 74 63 28 27 6e 27 2c 20 6f 75     fputc('n', ou
a940: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a950: 28 20 63 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20  ( c=='\r' ){.   
a960: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a970: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a980: 28 27 72 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('r', out);.    
a990: 7d 65 6c 73 65 20 69 66 28 20 21 69 73 70 72 69  }else if( !ispri
a9a0: 6e 74 28 63 26 30 78 66 66 29 20 29 7b 0a 20 20  nt(c&0xff) ){.  
a9b0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
a9c0: 75 74 2c 20 22 5c 5c 25 30 33 6f 22 2c 20 63 26  ut, "\\%03o", c&
a9d0: 30 78 66 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0xff);.    }else
a9e0: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c  {.      fputc(c,
a9f0: 20 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   out);.    }.  }
aa00: 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75  .  fputc('"', ou
aa10: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  t);.}../*.** Out
aa20: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
aa30: 72 69 6e 67 20 77 69 74 68 20 63 68 61 72 61 63  ring with charac
aa40: 74 65 72 73 20 74 68 61 74 20 61 72 65 20 73 70  ters that are sp
aa50: 65 63 69 61 6c 20 74 6f 0a 2a 2a 20 48 54 4d 4c  ecial to.** HTML
aa60: 20 65 73 63 61 70 65 64 2e 0a 2a 2f 0a 73 74 61   escaped..*/.sta
aa70: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
aa80: 68 74 6d 6c 5f 73 74 72 69 6e 67 28 46 49 4c 45  html_string(FILE
aa90: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
aaa0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  r *z){.  int i;.
aab0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
aac0: 20 22 22 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a   "";.  while( *z
aad0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
aae0: 20 20 20 7a 5b 69 5d 0a 20 20 20 20 20 20 20 20     z[i].        
aaf0: 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 3c 27      && z[i]!='<'
ab00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
ab10: 7a 5b 69 5d 21 3d 27 26 27 0a 20 20 20 20 20 20  z[i]!='&'.      
ab20: 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27        && z[i]!='
ab30: 3e 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  >'.            &
ab40: 26 20 7a 5b 69 5d 21 3d 27 5c 22 27 0a 20 20 20  & z[i]!='\"'.   
ab50: 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d           && z[i]
ab60: 21 3d 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20  !='\'';.        
ab70: 69 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 69  i++){}.    if( i
ab80: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  >0 ){.      utf8
ab90: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a  _printf(out,"%.*
aba0: 73 22 2c 69 2c 7a 29 3b 0a 20 20 20 20 7d 0a 20  s",i,z);.    }. 
abb0: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3c 27     if( z[i]=='<'
abc0: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
abd0: 69 6e 74 66 28 6f 75 74 2c 22 26 6c 74 3b 22 29  intf(out,"&lt;")
abe0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
abf0: 7a 5b 69 5d 3d 3d 27 26 27 20 29 7b 0a 20 20 20  z[i]=='&' ){.   
ac00: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
ac10: 74 2c 22 26 61 6d 70 3b 22 29 3b 0a 20 20 20 20  t,"&amp;");.    
ac20: 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d  }else if( z[i]==
ac30: 27 3e 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77  '>' ){.      raw
ac40: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 67 74  _printf(out,"&gt
ac50: 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ;");.    }else i
ac60: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 22 27 20 29 7b  f( z[i]=='\"' ){
ac70: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
ac80: 66 28 6f 75 74 2c 22 26 71 75 6f 74 3b 22 29 3b  f(out,"&quot;");
ac90: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
aca0: 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20  [i]=='\'' ){.   
acb0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
acc0: 74 2c 22 26 23 33 39 3b 22 29 3b 0a 20 20 20 20  t,"&#39;");.    
acd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65  }else{.      bre
ace0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20  ak;.    }.    z 
acf0: 2b 3d 20 69 20 2b 20 31 3b 0a 20 20 7d 0a 7d 0a  += i + 1;.  }.}.
ad00: 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 66 69 65 6c  ./*.** If a fiel
ad10: 64 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 63  d contains any c
ad20: 68 61 72 61 63 74 65 72 20 69 64 65 6e 74 69 66  haracter identif
ad30: 69 65 64 20 62 79 20 61 20 31 20 69 6e 20 74 68  ied by a 1 in th
ad40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 61  e following.** a
ad50: 72 72 61 79 2c 20 74 68 65 6e 20 74 68 65 20 73  rray, then the s
ad60: 74 72 69 6e 67 20 6d 75 73 74 20 62 65 20 71 75  tring must be qu
ad70: 6f 74 65 64 20 66 6f 72 20 43 53 56 2e 0a 2a 2f  oted for CSV..*/
ad80: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
ad90: 61 72 20 6e 65 65 64 43 73 76 51 75 6f 74 65 5b  ar needCsvQuote[
ada0: 5d 20 3d 20 7b 0a 20 20 31 2c 20 31 2c 20 31 2c  ] = {.  1, 1, 1,
adb0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
adc0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
add0: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
ade0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
adf0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
ae00: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
ae10: 31 2c 20 30 2c 20 31 2c 20 30 2c 20 30 2c 20 30  1, 0, 1, 0, 0, 0
ae20: 2c 20 30 2c 20 31 2c 20 20 20 30 2c 20 30 2c 20  , 0, 1,   0, 0, 
ae30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
ae40: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
ae50: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
ae60: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
ae70: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
ae80: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
ae90: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
aea0: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
aeb0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
aec0: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
aed0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
aee0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
aef0: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
af00: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
af10: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
af20: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
af30: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
af40: 30 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  0, 1,.  1, 1, 1,
af50: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
af60: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
af70: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
af80: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
af90: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
afa0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
afb0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
afc0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
afd0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
afe0: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
aff0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
b000: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b010: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
b020: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b030: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
b040: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
b050: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b060: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
b070: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
b080: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b090: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
b0a0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b0b0: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
b0c0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
b0d0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b0e0: 31 2c 20 31 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  1, 1,.};../*.** 
b0f0: 4f 75 74 70 75 74 20 61 20 73 69 6e 67 6c 65 20  Output a single 
b100: 74 65 72 6d 20 6f 66 20 43 53 56 2e 20 20 41 63  term of CSV.  Ac
b110: 74 75 61 6c 6c 79 2c 20 70 2d 3e 63 6f 6c 53 65  tually, p->colSe
b120: 70 61 72 61 74 6f 72 20 69 73 20 75 73 65 64 20  parator is used 
b130: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 65 70 61 72  for.** the separ
b140: 61 74 6f 72 2c 20 77 68 69 63 68 20 6d 61 79 20  ator, which may 
b150: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20  or may not be a 
b160: 63 6f 6d 6d 61 2e 20 20 70 2d 3e 6e 75 6c 6c 56  comma.  p->nullV
b170: 61 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65 20 6e  alue is.** the n
b180: 75 6c 6c 20 76 61 6c 75 65 2e 20 20 53 74 72 69  ull value.  Stri
b190: 6e 67 73 20 61 72 65 20 71 75 6f 74 65 64 20 69  ngs are quoted i
b1a0: 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  f necessary.  Th
b1b0: 65 20 73 65 70 61 72 61 74 6f 72 0a 2a 2a 20 69  e separator.** i
b1c0: 73 20 6f 6e 6c 79 20 69 73 73 75 65 64 20 69 66  s only issued if
b1d0: 20 62 53 65 70 20 69 73 20 74 72 75 65 2e 0a 2a   bSep is true..*
b1e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
b1f0: 74 70 75 74 5f 63 73 76 28 53 68 65 6c 6c 53 74  tput_csv(ShellSt
b200: 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ate *p, const ch
b210: 61 72 20 2a 7a 2c 20 69 6e 74 20 62 53 65 70 29  ar *z, int bSep)
b220: 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20  {.  FILE *out = 
b230: 70 2d 3e 6f 75 74 3b 0a 20 20 69 66 28 20 7a 3d  p->out;.  if( z=
b240: 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
b250: 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 70  rintf(out,"%s",p
b260: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
b270: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
b280: 3b 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 20 3d  ;.    int nSep =
b290: 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c   strlen30(p->col
b2a0: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
b2b0: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
b2c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
b2d0: 65 65 64 43 73 76 51 75 6f 74 65 5b 28 28 75 6e  eedCsvQuote[((un
b2e0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 29 5b  signed char*)z)[
b2f0: 69 5d 5d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  i]].         || 
b300: 28 7a 5b 69 5d 3d 3d 70 2d 3e 63 6f 6c 53 65 70  (z[i]==p->colSep
b310: 61 72 61 74 6f 72 5b 30 5d 20 26 26 0a 20 20 20  arator[0] &&.   
b320: 20 20 20 20 20 20 20 20 20 20 28 6e 53 65 70 3d            (nSep=
b330: 3d 31 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 2c 20  =1 || memcmp(z, 
b340: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
b350: 20 6e 53 65 70 29 3d 3d 30 29 29 20 29 7b 0a 20   nSep)==0)) ){. 
b360: 20 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20         i = 0;.  
b370: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b380: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
b390: 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
b3a0: 20 63 68 61 72 20 2a 7a 51 75 6f 74 65 64 20 3d   char *zQuoted =
b3b0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
b3c0: 28 22 5c 22 25 77 5c 22 22 2c 20 7a 29 3b 0a 20  ("\"%w\"", z);. 
b3d0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
b3e0: 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 51 75 6f  (out, "%s", zQuo
b3f0: 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
b400: 74 65 33 5f 66 72 65 65 28 7a 51 75 6f 74 65 64  te3_free(zQuoted
b410: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
b420: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
b430: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
b440: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 62     }.  }.  if( b
b450: 53 65 70 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  Sep ){.    utf8_
b460: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
b470: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
b480: 61 74 6f 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ator);.  }.}../*
b490: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b4a0: 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65 20 75   runs when the u
b4b0: 73 65 72 20 70 72 65 73 73 65 73 20 43 74 72 6c  ser presses Ctrl
b4c0: 2d 43 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  -C.*/.static voi
b4d0: 64 20 69 6e 74 65 72 72 75 70 74 5f 68 61 6e 64  d interrupt_hand
b4e0: 6c 65 72 28 69 6e 74 20 4e 6f 74 55 73 65 64 29  ler(int NotUsed)
b4f0: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
b500: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
b510: 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 2b 2b   seenInterrupt++
b520: 3b 0a 20 20 69 66 28 20 73 65 65 6e 49 6e 74 65  ;.  if( seenInte
b530: 72 72 75 70 74 3e 32 20 29 20 65 78 69 74 28 31  rrupt>2 ) exit(1
b540: 29 3b 0a 20 20 69 66 28 20 67 6c 6f 62 61 6c 44  );.  if( globalD
b550: 62 20 29 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  b ) sqlite3_inte
b560: 72 72 75 70 74 28 67 6c 6f 62 61 6c 44 62 29 3b  rrupt(globalDb);
b570: 0a 7d 0a 0a 23 69 66 20 28 64 65 66 69 6e 65 64  .}..#if (defined
b580: 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69  (_WIN32) || defi
b590: 6e 65 64 28 57 49 4e 33 32 29 29 20 26 26 20 21  ned(WIN32)) && !
b5a0: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
b5b0: 43 45 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  CE)./*.** This r
b5c0: 6f 75 74 69 6e 65 20 72 75 6e 73 20 66 6f 72 20  outine runs for 
b5d0: 63 6f 6e 73 6f 6c 65 20 65 76 65 6e 74 73 20 28  console events (
b5e0: 65 2e 67 2e 20 43 74 72 6c 2d 43 29 20 6f 6e 20  e.g. Ctrl-C) on 
b5f0: 57 69 6e 33 32 0a 2a 2f 0a 73 74 61 74 69 63 20  Win32.*/.static 
b600: 42 4f 4f 4c 20 57 49 4e 41 50 49 20 43 6f 6e 73  BOOL WINAPI Cons
b610: 6f 6c 65 43 74 72 6c 48 61 6e 64 6c 65 72 28 0a  oleCtrlHandler(.
b620: 20 20 44 57 4f 52 44 20 64 77 43 74 72 6c 54 79    DWORD dwCtrlTy
b630: 70 65 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65  pe /* One of the
b640: 20 43 54 52 4c 5f 2a 5f 45 56 45 4e 54 20 63 6f   CTRL_*_EVENT co
b650: 6e 73 74 61 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  nstants */.){.  
b660: 69 66 28 20 64 77 43 74 72 6c 54 79 70 65 3d 3d  if( dwCtrlType==
b670: 43 54 52 4c 5f 43 5f 45 56 45 4e 54 20 29 7b 0a  CTRL_C_EVENT ){.
b680: 20 20 20 20 69 6e 74 65 72 72 75 70 74 5f 68 61      interrupt_ha
b690: 6e 64 6c 65 72 28 30 29 3b 0a 20 20 20 20 72 65  ndler(0);.    re
b6a0: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 20  turn TRUE;.  }. 
b6b0: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d   return FALSE;.}
b6c0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
b6d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
b6e0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  HORIZATION./*.**
b6f0: 20 57 68 65 6e 20 74 68 65 20 22 2e 61 75 74 68   When the ".auth
b700: 20 4f 4e 22 20 69 73 20 73 65 74 2c 20 74 68 65   ON" is set, the
b710: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 75 74 68 6f   following autho
b720: 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  rizer callback i
b730: 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 20 20 49  s.** invoked.  I
b740: 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  t always returns
b750: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
b760: 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 41  tatic int shellA
b770: 75 74 68 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c  uth(.  void *pCl
b780: 69 65 6e 74 44 61 74 61 2c 0a 20 20 69 6e 74 20  ientData,.  int 
b790: 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  op,.  const char
b7a0: 20 2a 7a 41 31 2c 0a 20 20 63 6f 6e 73 74 20 63   *zA1,.  const c
b7b0: 68 61 72 20 2a 7a 41 32 2c 0a 20 20 63 6f 6e 73  har *zA2,.  cons
b7c0: 74 20 63 68 61 72 20 2a 7a 41 33 2c 0a 20 20 63  t char *zA3,.  c
b7d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 34 0a 29  onst char *zA4.)
b7e0: 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  {.  ShellState *
b7f0: 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a  p = (ShellState*
b800: 29 70 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  )pClientData;.  
b810: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
b820: 72 20 2a 61 7a 41 63 74 69 6f 6e 5b 5d 20 3d 20  r *azAction[] = 
b830: 7b 20 30 2c 0a 20 20 20 20 20 22 43 52 45 41 54  { 0,.     "CREAT
b840: 45 5f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20  E_INDEX",       
b850: 20 20 22 43 52 45 41 54 45 5f 54 41 42 4c 45 22    "CREATE_TABLE"
b860: 2c 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  ,         "CREAT
b870: 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22 2c 0a 20  E_TEMP_INDEX",. 
b880: 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50      "CREATE_TEMP
b890: 5f 54 41 42 4c 45 22 2c 20 20 20 20 22 43 52 45  _TABLE",    "CRE
b8a0: 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ATE_TEMP_TRIGGER
b8b0: 22 2c 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50  ",  "CREATE_TEMP
b8c0: 5f 56 49 45 57 22 2c 0a 20 20 20 20 20 22 43 52  _VIEW",.     "CR
b8d0: 45 41 54 45 5f 54 52 49 47 47 45 52 22 2c 20 20  EATE_TRIGGER",  
b8e0: 20 20 20 20 20 22 43 52 45 41 54 45 5f 56 49 45       "CREATE_VIE
b8f0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 22 44 45  W",          "DE
b900: 4c 45 54 45 22 2c 0a 20 20 20 20 20 22 44 52 4f  LETE",.     "DRO
b910: 50 5f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20  P_INDEX",       
b920: 20 20 20 20 22 44 52 4f 50 5f 54 41 42 4c 45 22      "DROP_TABLE"
b930: 2c 20 20 20 20 20 20 20 20 20 20 20 22 44 52 4f  ,           "DRO
b940: 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22 2c 0a 20  P_TEMP_INDEX",. 
b950: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54      "DROP_TEMP_T
b960: 41 42 4c 45 22 2c 20 20 20 20 20 20 22 44 52 4f  ABLE",      "DRO
b970: 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 2c  P_TEMP_TRIGGER",
b980: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 56      "DROP_TEMP_V
b990: 49 45 57 22 2c 0a 20 20 20 20 20 22 44 52 4f 50  IEW",.     "DROP
b9a0: 5f 54 52 49 47 47 45 52 22 2c 20 20 20 20 20 20  _TRIGGER",      
b9b0: 20 20 20 22 44 52 4f 50 5f 56 49 45 57 22 2c 20     "DROP_VIEW", 
b9c0: 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45             "INSE
b9d0: 52 54 22 2c 0a 20 20 20 20 20 22 50 52 41 47 4d  RT",.     "PRAGM
b9e0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
b9f0: 20 20 22 52 45 41 44 22 2c 20 20 20 20 20 20 20    "READ",       
ba00: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
ba10: 54 22 2c 0a 20 20 20 20 20 22 54 52 41 4e 53 41  T",.     "TRANSA
ba20: 43 54 49 4f 4e 22 2c 20 20 20 20 20 20 20 20 20  CTION",         
ba30: 20 22 55 50 44 41 54 45 22 2c 20 20 20 20 20 20   "UPDATE",      
ba40: 20 20 20 20 20 20 20 20 20 22 41 54 54 41 43 48           "ATTACH
ba50: 22 2c 0a 20 20 20 20 20 22 44 45 54 41 43 48 22  ",.     "DETACH"
ba60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ba70: 22 41 4c 54 45 52 5f 54 41 42 4c 45 22 2c 20 20  "ALTER_TABLE",  
ba80: 20 20 20 20 20 20 20 20 22 52 45 49 4e 44 45 58          "REINDEX
ba90: 22 2c 0a 20 20 20 20 20 22 41 4e 41 4c 59 5a 45  ",.     "ANALYZE
baa0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
bab0: 22 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22 2c  "CREATE_VTABLE",
bac0: 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56 54          "DROP_VT
bad0: 41 42 4c 45 22 2c 0a 20 20 20 20 20 22 46 55 4e  ABLE",.     "FUN
bae0: 43 54 49 4f 4e 22 2c 20 20 20 20 20 20 20 20 20  CTION",         
baf0: 20 20 20 20 22 53 41 56 45 50 4f 49 4e 54 22 2c      "SAVEPOINT",
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 22 52 45 43              "REC
bb10: 55 52 53 49 56 45 22 0a 20 20 7d 3b 0a 20 20 69  URSIVE".  };.  i
bb20: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
bb30: 61 72 20 2a 61 7a 5b 34 5d 3b 0a 20 20 61 7a 5b  ar *az[4];.  az[
bb40: 30 5d 20 3d 20 7a 41 31 3b 0a 20 20 61 7a 5b 31  0] = zA1;.  az[1
bb50: 5d 20 3d 20 7a 41 32 3b 0a 20 20 61 7a 5b 32 5d  ] = zA2;.  az[2]
bb60: 20 3d 20 7a 41 33 3b 0a 20 20 61 7a 5b 33 5d 20   = zA3;.  az[3] 
bb70: 3d 20 7a 41 34 3b 0a 20 20 75 74 66 38 5f 70 72  = zA4;.  utf8_pr
bb80: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 61 75  intf(p->out, "au
bb90: 74 68 6f 72 69 7a 65 72 3a 20 25 73 22 2c 20 61  thorizer: %s", a
bba0: 7a 41 63 74 69 6f 6e 5b 6f 70 5d 29 3b 0a 20 20  zAction[op]);.  
bbb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 34 3b 20 69 2b  for(i=0; i<4; i+
bbc0: 2b 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  +){.    raw_prin
bbd0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29 3b  tf(p->out, " ");
bbe0: 0a 20 20 20 20 69 66 28 20 61 7a 5b 69 5d 20 29  .    if( az[i] )
bbf0: 7b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63  {.      output_c
bc00: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
bc10: 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  az[i]);.    }els
bc20: 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
bc30: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 4e 55 4c  ntf(p->out, "NUL
bc40: 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  L");.    }.  }. 
bc50: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
bc60: 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 72 65 74  ut, "\n");.  ret
bc70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
bc80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
bc90: 72 69 6e 74 20 61 20 73 63 68 65 6d 61 20 73 74  rint a schema st
bca0: 61 74 65 6d 65 6e 74 2e 20 20 50 61 72 74 20 6f  atement.  Part o
bcb0: 66 20 4d 4f 44 45 5f 53 65 6d 69 20 61 6e 64 20  f MODE_Semi and 
bcc0: 4d 4f 44 45 5f 50 72 65 74 74 79 20 6f 75 74 70  MODE_Pretty outp
bcd0: 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ut..**.** This r
bce0: 6f 75 74 69 6e 65 20 63 6f 6e 76 65 72 74 73 20  outine converts 
bcf0: 73 6f 6d 65 20 43 52 45 41 54 45 20 54 41 42 4c  some CREATE TABL
bd00: 45 20 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72  E statements for
bd10: 20 73 68 61 64 6f 77 20 74 61 62 6c 65 73 0a 2a   shadow tables.*
bd20: 2a 20 69 6e 20 46 54 53 33 2f 34 2f 35 20 69 6e  * in FTS3/4/5 in
bd30: 74 6f 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  to CREATE TABLE 
bd40: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 74  IF NOT EXISTS st
bd50: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
bd60: 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 53 63  tic void printSc
bd70: 68 65 6d 61 4c 69 6e 65 28 46 49 4c 45 20 2a 6f  hemaLine(FILE *o
bd80: 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ut, const char *
bd90: 7a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  z, const char *z
bda0: 54 61 69 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c  Tail){.  if( sql
bdb0: 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 43 52  ite3_strglob("CR
bdc0: 45 41 54 45 20 54 41 42 4c 45 20 5b 27 5c 22 5d  EATE TABLE ['\"]
bdd0: 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20  *", z)==0 ){.   
bde0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
bdf0: 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
be00: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73  IF NOT EXISTS %s
be10: 25 73 22 2c 20 7a 2b 31 33 2c 20 7a 54 61 69 6c  %s", z+13, zTail
be20: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
be30: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
be40: 20 22 25 73 25 73 22 2c 20 7a 2c 20 7a 54 61 69   "%s%s", z, zTai
be50: 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  l);.  }.}.static
be60: 20 76 6f 69 64 20 70 72 69 6e 74 53 63 68 65 6d   void printSchem
be70: 61 4c 69 6e 65 4e 28 46 49 4c 45 20 2a 6f 75 74  aLineN(FILE *out
be80: 2c 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  , char *z, int n
be90: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
bea0: 61 69 6c 29 7b 0a 20 20 63 68 61 72 20 63 20 3d  ail){.  char c =
beb0: 20 7a 5b 6e 5d 3b 0a 20 20 7a 5b 6e 5d 20 3d 20   z[n];.  z[n] = 
bec0: 30 3b 0a 20 20 70 72 69 6e 74 53 63 68 65 6d 61  0;.  printSchema
bed0: 4c 69 6e 65 28 6f 75 74 2c 20 7a 2c 20 7a 54 61  Line(out, z, zTa
bee0: 69 6c 29 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 63 3b  il);.  z[n] = c;
bef0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
bf00: 20 74 72 75 65 20 69 66 20 73 74 72 69 6e 67 20   true if string 
bf10: 7a 5b 5d 20 68 61 73 20 6e 6f 74 68 69 6e 67 20  z[] has nothing 
bf20: 62 75 74 20 77 68 69 74 65 73 70 61 63 65 20 61  but whitespace a
bf30: 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 74 6f 20 74  nd comments to t
bf40: 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
bf50: 20 66 69 72 73 74 20 6c 69 6e 65 2e 0a 2a 2f 0a   first line..*/.
bf60: 73 74 61 74 69 63 20 69 6e 74 20 77 73 54 6f 45  static int wsToE
bf70: 6f 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ol(const char *z
bf80: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
bf90: 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(i=0; z[i]; i++
bfa0: 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  ){.    if( z[i]=
bfb0: 3d 27 5c 6e 27 20 29 20 72 65 74 75 72 6e 20 31  ='\n' ) return 1
bfc0: 3b 0a 20 20 20 20 69 66 28 20 49 73 53 70 61 63  ;.    if( IsSpac
bfd0: 65 28 7a 5b 69 5d 29 20 29 20 63 6f 6e 74 69 6e  e(z[i]) ) contin
bfe0: 75 65 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  ue;.    if( z[i]
bff0: 3d 3d 27 2d 27 20 26 26 20 7a 5b 69 2b 31 5d 3d  =='-' && z[i+1]=
c000: 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 31 3b  ='-' ) return 1;
c010: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
c020: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
c030: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
c040: 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 45  w entry to the E
c050: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
c060: 4e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63  N data.*/.static
c070: 20 76 6f 69 64 20 65 71 70 5f 61 70 70 65 6e 64   void eqp_append
c080: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
c090: 69 6e 74 20 69 45 71 70 49 64 2c 20 69 6e 74 20  int iEqpId, int 
c0a0: 70 32 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  p2, const char *
c0b0: 7a 54 65 78 74 29 7b 0a 20 20 45 51 50 47 72 61  zText){.  EQPGra
c0c0: 70 68 52 6f 77 20 2a 70 4e 65 77 3b 0a 20 20 69  phRow *pNew;.  i
c0d0: 6e 74 20 6e 54 65 78 74 20 3d 20 73 74 72 6c 65  nt nText = strle
c0e0: 6e 33 30 28 7a 54 65 78 74 29 3b 0a 20 20 69 66  n30(zText);.  if
c0f0: 28 20 70 2d 3e 61 75 74 6f 45 51 50 74 65 73 74  ( p->autoEQPtest
c100: 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
c110: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 2c  ntf(p->out, "%d,
c120: 25 64 2c 25 73 5c 6e 22 2c 20 69 45 71 70 49 64  %d,%s\n", iEqpId
c130: 2c 20 70 32 2c 20 7a 54 65 78 74 29 3b 0a 20 20  , p2, zText);.  
c140: 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  }.  pNew = sqlit
c150: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a  e3_malloc64( siz
c160: 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 6e 54 65  eof(*pNew) + nTe
c170: 78 74 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  xt );.  if( pNew
c180: 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f  ==0 ) shell_out_
c190: 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 70  of_memory();.  p
c1a0: 4e 65 77 2d 3e 69 45 71 70 49 64 20 3d 20 69 45  New->iEqpId = iE
c1b0: 71 70 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 50  qpId;.  pNew->iP
c1c0: 61 72 65 6e 74 49 64 20 3d 20 70 32 3b 0a 20 20  arentId = p2;.  
c1d0: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 54 65  memcpy(pNew->zTe
c1e0: 78 74 2c 20 7a 54 65 78 74 2c 20 6e 54 65 78 74  xt, zText, nText
c1f0: 2b 31 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  +1);.  pNew->pNe
c200: 78 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  xt = 0;.  if( p-
c210: 3e 73 47 72 61 70 68 2e 70 4c 61 73 74 20 29 7b  >sGraph.pLast ){
c220: 0a 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 70  .    p->sGraph.p
c230: 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  Last->pNext = pN
c240: 65 77 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ew;.  }else{.   
c250: 20 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 20   p->sGraph.pRow 
c260: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 2d  = pNew;.  }.  p-
c270: 3e 73 47 72 61 70 68 2e 70 4c 61 73 74 20 3d 20  >sGraph.pLast = 
c280: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pNew;.}../*.** F
c290: 72 65 65 20 61 6e 64 20 72 65 73 65 74 20 74 68  ree and reset th
c2a0: 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  e EXPLAIN QUERY 
c2b0: 50 4c 41 4e 20 64 61 74 61 20 74 68 61 74 20 68  PLAN data that h
c2c0: 61 73 20 62 65 65 6e 20 63 6f 6c 6c 65 63 74 65  as been collecte
c2d0: 64 0a 2a 2a 20 69 6e 20 70 2d 3e 73 47 72 61 70  d.** in p->sGrap
c2e0: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  h..*/.static voi
c2f0: 64 20 65 71 70 5f 72 65 73 65 74 28 53 68 65 6c  d eqp_reset(Shel
c300: 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 45 51  lState *p){.  EQ
c310: 50 47 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 2c  PGraphRow *pRow,
c320: 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
c330: 52 6f 77 20 3d 20 70 2d 3e 73 47 72 61 70 68 2e  Row = p->sGraph.
c340: 70 52 6f 77 3b 20 70 52 6f 77 3b 20 70 52 6f 77  pRow; pRow; pRow
c350: 20 3d 20 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   = pNext){.    p
c360: 4e 65 78 74 20 3d 20 70 52 6f 77 2d 3e 70 4e 65  Next = pRow->pNe
c370: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
c380: 66 72 65 65 28 70 52 6f 77 29 3b 0a 20 20 7d 0a  free(pRow);.  }.
c390: 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 73 47 72    memset(&p->sGr
c3a0: 61 70 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  aph, 0, sizeof(p
c3b0: 2d 3e 73 47 72 61 70 68 29 29 3b 0a 7d 0a 0a 2f  ->sGraph));.}../
c3c0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 78  * Return the nex
c3d0: 74 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  t EXPLAIN QUERY 
c3e0: 50 4c 41 4e 20 6c 69 6e 65 20 77 69 74 68 20 69  PLAN line with i
c3f0: 45 71 70 49 64 20 74 68 61 74 20 6f 63 63 75 72  EqpId that occur
c400: 73 20 61 66 74 65 72 0a 2a 2a 20 70 4f 6c 64 2c  s after.** pOld,
c410: 20 6f 72 20 72 65 74 75 72 6e 20 74 68 65 20 66   or return the f
c420: 69 72 73 74 20 73 75 63 68 20 6c 69 6e 65 20 69  irst such line i
c430: 66 20 70 4f 6c 64 20 69 73 20 4e 55 4c 4c 0a 2a  f pOld is NULL.*
c440: 2f 0a 73 74 61 74 69 63 20 45 51 50 47 72 61 70  /.static EQPGrap
c450: 68 52 6f 77 20 2a 65 71 70 5f 6e 65 78 74 5f 72  hRow *eqp_next_r
c460: 6f 77 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  ow(ShellState *p
c470: 2c 20 69 6e 74 20 69 45 71 70 49 64 2c 20 45 51  , int iEqpId, EQ
c480: 50 47 72 61 70 68 52 6f 77 20 2a 70 4f 6c 64 29  PGraphRow *pOld)
c490: 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20  {.  EQPGraphRow 
c4a0: 2a 70 52 6f 77 20 3d 20 70 4f 6c 64 20 3f 20 70  *pRow = pOld ? p
c4b0: 4f 6c 64 2d 3e 70 4e 65 78 74 20 3a 20 70 2d 3e  Old->pNext : p->
c4c0: 73 47 72 61 70 68 2e 70 52 6f 77 3b 0a 20 20 77  sGraph.pRow;.  w
c4d0: 68 69 6c 65 28 20 70 52 6f 77 20 26 26 20 70 52  hile( pRow && pR
c4e0: 6f 77 2d 3e 69 50 61 72 65 6e 74 49 64 21 3d 69  ow->iParentId!=i
c4f0: 45 71 70 49 64 20 29 20 70 52 6f 77 20 3d 20 70  EqpId ) pRow = p
c500: 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65  Row->pNext;.  re
c510: 74 75 72 6e 20 70 52 6f 77 3b 0a 7d 0a 0a 2f 2a  turn pRow;.}../*
c520: 20 52 65 6e 64 65 72 20 61 20 73 69 6e 67 6c 65   Render a single
c530: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 67 72   level of the gr
c540: 61 70 68 20 74 68 61 74 20 68 61 73 20 69 45 71  aph that has iEq
c550: 70 49 64 20 61 73 20 69 74 73 20 70 61 72 65 6e  pId as its paren
c560: 74 2e 20 20 43 61 6c 6c 65 64 0a 2a 2a 20 72 65  t.  Called.** re
c570: 63 75 72 73 69 76 65 6c 79 20 74 6f 20 72 65 6e  cursively to ren
c580: 64 65 72 20 73 75 62 6c 65 76 65 6c 73 2e 0a 2a  der sublevels..*
c590: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 71  /.static void eq
c5a0: 70 5f 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 53  p_render_level(S
c5b0: 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e  hellState *p, in
c5c0: 74 20 69 45 71 70 49 64 29 7b 0a 20 20 45 51 50  t iEqpId){.  EQP
c5d0: 47 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 2c 20  GraphRow *pRow, 
c5e0: 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 6e 20  *pNext;.  int n 
c5f0: 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 73 47  = strlen30(p->sG
c600: 72 61 70 68 2e 7a 50 72 65 66 69 78 29 3b 0a 20  raph.zPrefix);. 
c610: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72 28   char *z;.  for(
c620: 70 52 6f 77 20 3d 20 65 71 70 5f 6e 65 78 74 5f  pRow = eqp_next_
c630: 72 6f 77 28 70 2c 20 69 45 71 70 49 64 2c 20 30  row(p, iEqpId, 0
c640: 29 3b 20 70 52 6f 77 3b 20 70 52 6f 77 20 3d 20  ); pRow; pRow = 
c650: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
c660: 74 20 3d 20 65 71 70 5f 6e 65 78 74 5f 72 6f 77  t = eqp_next_row
c670: 28 70 2c 20 69 45 71 70 49 64 2c 20 70 52 6f 77  (p, iEqpId, pRow
c680: 29 3b 0a 20 20 20 20 7a 20 3d 20 70 52 6f 77 2d  );.    z = pRow-
c690: 3e 7a 54 65 78 74 3b 0a 20 20 20 20 75 74 66 38  >zText;.    utf8
c6a0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
c6b0: 22 25 73 25 73 25 73 5c 6e 22 2c 20 70 2d 3e 73  "%s%s%s\n", p->s
c6c0: 47 72 61 70 68 2e 7a 50 72 65 66 69 78 2c 20 70  Graph.zPrefix, p
c6d0: 4e 65 78 74 20 3f 20 22 7c 2d 2d 22 20 3a 20 22  Next ? "|--" : "
c6e0: 60 2d 2d 22 2c 20 7a 29 3b 0a 20 20 20 20 69 66  `--", z);.    if
c6f0: 28 20 6e 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  ( n<(int)sizeof(
c700: 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69  p->sGraph.zPrefi
c710: 78 29 2d 37 20 29 7b 0a 20 20 20 20 20 20 6d 65  x)-7 ){.      me
c720: 6d 63 70 79 28 26 70 2d 3e 73 47 72 61 70 68 2e  mcpy(&p->sGraph.
c730: 7a 50 72 65 66 69 78 5b 6e 5d 2c 20 70 4e 65 78  zPrefix[n], pNex
c740: 74 20 3f 20 22 7c 20 20 22 20 3a 20 22 20 20 20  t ? "|  " : "   
c750: 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 65 71 70  ", 4);.      eqp
c760: 5f 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 70 2c  _render_level(p,
c770: 20 70 52 6f 77 2d 3e 69 45 71 70 49 64 29 3b 0a   pRow->iEqpId);.
c780: 20 20 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e        p->sGraph.
c790: 7a 50 72 65 66 69 78 5b 6e 5d 20 3d 20 30 3b 0a  zPrefix[n] = 0;.
c7a0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
c7b0: 2a 2a 20 44 69 73 70 6c 61 79 20 61 6e 64 20 72  ** Display and r
c7c0: 65 73 65 74 20 74 68 65 20 45 58 50 4c 41 49 4e  eset the EXPLAIN
c7d0: 20 51 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61   QUERY PLAN data
c7e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c7f0: 65 71 70 5f 72 65 6e 64 65 72 28 53 68 65 6c 6c  eqp_render(Shell
c800: 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 45 51 50  State *p){.  EQP
c810: 47 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d  GraphRow *pRow =
c820: 20 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 3b   p->sGraph.pRow;
c830: 0a 20 20 69 66 28 20 70 52 6f 77 20 29 7b 0a 20  .  if( pRow ){. 
c840: 20 20 20 69 66 28 20 70 52 6f 77 2d 3e 7a 54 65     if( pRow->zTe
c850: 78 74 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20  xt[0]=='-' ){.  
c860: 20 20 20 20 69 66 28 20 70 52 6f 77 2d 3e 70 4e      if( pRow->pN
c870: 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ext==0 ){.      
c880: 20 20 65 71 70 5f 72 65 73 65 74 28 70 29 3b 0a    eqp_reset(p);.
c890: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
c8a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74        }.      ut
c8b0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
c8c0: 2c 20 22 25 73 5c 6e 22 2c 20 70 52 6f 77 2d 3e  , "%s\n", pRow->
c8d0: 7a 54 65 78 74 2b 33 29 3b 0a 20 20 20 20 20 20  zText+3);.      
c8e0: 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 20 3d  p->sGraph.pRow =
c8f0: 20 70 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20   pRow->pNext;.  
c900: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c910: 28 70 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73  (pRow);.    }els
c920: 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  e{.      utf8_pr
c930: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 51 55  intf(p->out, "QU
c940: 45 52 59 20 50 4c 41 4e 5c 6e 22 29 3b 0a 20 20  ERY PLAN\n");.  
c950: 20 20 7d 0a 20 20 20 20 70 2d 3e 73 47 72 61 70    }.    p->sGrap
c960: 68 2e 7a 50 72 65 66 69 78 5b 30 5d 20 3d 20 30  h.zPrefix[0] = 0
c970: 3b 0a 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72  ;.    eqp_render
c980: 5f 6c 65 76 65 6c 28 70 2c 20 30 29 3b 0a 20 20  _level(p, 0);.  
c990: 20 20 65 71 70 5f 72 65 73 65 74 28 70 29 3b 0a    eqp_reset(p);.
c9a0: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
c9b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
c9c0: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a  ESS_CALLBACK./*.
c9d0: 2a 2a 20 50 72 6f 67 72 65 73 73 20 68 61 6e 64  ** Progress hand
c9e0: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  ler callback..*/
c9f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 67  .static int prog
ca00: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 76 6f 69  ress_handler(voi
ca10: 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 29 20  d *pClientData) 
ca20: 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  {.  ShellState *
ca30: 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a  p = (ShellState*
ca40: 29 70 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  )pClientData;.  
ca50: 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a  p->nProgress++;.
ca60: 20 20 69 66 28 20 70 2d 3e 6e 50 72 6f 67 72 65    if( p->nProgre
ca70: 73 73 3e 3d 70 2d 3e 6d 78 50 72 6f 67 72 65 73  ss>=p->mxProgres
ca80: 73 20 26 26 20 70 2d 3e 6d 78 50 72 6f 67 72 65  s && p->mxProgre
ca90: 73 73 3e 30 20 29 7b 0a 20 20 20 20 72 61 77 5f  ss>0 ){.    raw_
caa0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
cab0: 50 72 6f 67 72 65 73 73 20 6c 69 6d 69 74 20 72  Progress limit r
cac0: 65 61 63 68 65 64 20 28 25 75 29 5c 6e 22 2c 20  eached (%u)\n", 
cad0: 70 2d 3e 6e 50 72 6f 67 72 65 73 73 29 3b 0a 20  p->nProgress);. 
cae0: 20 20 20 69 66 28 20 70 2d 3e 66 6c 67 50 72 6f     if( p->flgPro
caf0: 67 72 65 73 73 20 26 20 53 48 45 4c 4c 5f 50 52  gress & SHELL_PR
cb00: 4f 47 52 45 53 53 5f 52 45 53 45 54 20 29 20 70  OGRESS_RESET ) p
cb10: 2d 3e 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  ->nProgress = 0;
cb20: 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 67 50  .    if( p->flgP
cb30: 72 6f 67 72 65 73 73 20 26 20 53 48 45 4c 4c 5f  rogress & SHELL_
cb40: 50 52 4f 47 52 45 53 53 5f 4f 4e 43 45 20 29 20  PROGRESS_ONCE ) 
cb50: 70 2d 3e 6d 78 50 72 6f 67 72 65 73 73 20 3d 20  p->mxProgress = 
cb60: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  0;.    return 1;
cb70: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66  .  }.  if( (p->f
cb80: 6c 67 50 72 6f 67 72 65 73 73 20 26 20 53 48 45  lgProgress & SHE
cb90: 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 51 55 49 45  LL_PROGRESS_QUIE
cba0: 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77  T)==0 ){.    raw
cbb0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
cbc0: 22 50 72 6f 67 72 65 73 73 20 25 75 5c 6e 22 2c  "Progress %u\n",
cbd0: 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 29 3b 0a   p->nProgress);.
cbe0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
cbf0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
cc00: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
cc10: 5f 43 41 4c 4c 42 41 43 4b 20 2a 2f 0a 0a 2f 2a  _CALLBACK */../*
cc20: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
cc30: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
cc40: 20 74 68 61 74 20 74 68 65 20 73 68 65 6c 6c 0a   that the shell.
cc50: 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65  ** invokes for e
cc60: 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65  ach row of a que
cc70: 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  ry result..*/.st
cc80: 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 63  atic int shell_c
cc90: 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20  allback(.  void 
cca0: 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 6e 41 72  *pArg,.  int nAr
ccb0: 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  g,        /* Num
ccc0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
ccd0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20  lumns */.  char 
cce0: 2a 2a 61 7a 41 72 67 2c 20 20 20 20 2f 2a 20 54  **azArg,    /* T
ccf0: 65 78 74 20 6f 66 20 65 61 63 68 20 72 65 73 75  ext of each resu
cd00: 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  lt column */.  c
cd10: 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c 20 20 20 20  har **azCol,    
cd20: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  /* Column names 
cd30: 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 54 79 70 65  */.  int *aiType
cd40: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
cd50: 74 79 70 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  types */.){.  in
cd60: 74 20 69 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74  t i;.  ShellStat
cd70: 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
cd80: 74 65 2a 29 70 41 72 67 3b 0a 0a 20 20 69 66 28  te*)pArg;..  if(
cd90: 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75   azArg==0 ) retu
cda0: 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20  rn 0;.  switch( 
cdb0: 70 2d 3e 63 4d 6f 64 65 20 29 7b 0a 20 20 20 20  p->cMode ){.    
cdc0: 63 61 73 65 20 4d 4f 44 45 5f 4c 69 6e 65 3a 20  case MODE_Line: 
cdd0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 20 3d 20  {.      int w = 
cde0: 35 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41  5;.      if( azA
cdf0: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
ce00: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
ce10: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
ce20: 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74      int len = st
ce30: 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 20  rlen30(azCol[i] 
ce40: 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29  ? azCol[i] : "")
ce50: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  ;.        if( le
ce60: 6e 3e 77 20 29 20 77 20 3d 20 6c 65 6e 3b 0a 20  n>w ) w = len;. 
ce70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ce80: 20 70 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20 75 74   p->cnt++>0 ) ut
ce90: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
cea0: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
ceb0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
cec0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
ced0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   i++){.        u
cee0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
cef0: 74 2c 22 25 2a 73 20 3d 20 25 73 25 73 22 2c 20  t,"%*s = %s%s", 
cf00: 77 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20  w, azCol[i],.   
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41               azA
cf20: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
cf30: 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c   : p->nullValue,
cf40: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
cf50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
cf60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
cf70: 20 20 63 61 73 65 20 4d 4f 44 45 5f 45 78 70 6c    case MODE_Expl
cf80: 61 69 6e 3a 0a 20 20 20 20 63 61 73 65 20 4d 4f  ain:.    case MO
cf90: 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 20  DE_Column: {.   
cfa0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
cfb0: 69 6e 74 20 61 45 78 70 6c 61 69 6e 57 69 64 74  int aExplainWidt
cfc0: 68 73 5b 5d 20 3d 20 7b 34 2c 20 31 33 2c 20 34  hs[] = {4, 13, 4
cfd0: 2c 20 34 2c 20 34 2c 20 31 33 2c 20 32 2c 20 31  , 4, 4, 13, 2, 1
cfe0: 33 7d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  3};.      const 
cff0: 69 6e 74 20 2a 63 6f 6c 57 69 64 74 68 3b 0a 20  int *colWidth;. 
d000: 20 20 20 20 20 69 6e 74 20 73 68 6f 77 48 64 72       int showHdr
d010: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 72 6f  ;.      char *ro
d020: 77 53 65 70 3b 0a 20 20 20 20 20 20 69 66 28 20  wSep;.      if( 
d030: 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 43  p->cMode==MODE_C
d040: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
d050: 20 63 6f 6c 57 69 64 74 68 20 3d 20 70 2d 3e 63   colWidth = p->c
d060: 6f 6c 57 69 64 74 68 3b 0a 20 20 20 20 20 20 20  olWidth;.       
d070: 20 73 68 6f 77 48 64 72 20 3d 20 70 2d 3e 73 68   showHdr = p->sh
d080: 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 20 20  owHeader;.      
d090: 20 20 72 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f    rowSep = p->ro
d0a0: 77 53 65 70 61 72 61 74 6f 72 3b 0a 20 20 20 20  wSeparator;.    
d0b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d0c0: 20 63 6f 6c 57 69 64 74 68 20 3d 20 61 45 78 70   colWidth = aExp
d0d0: 6c 61 69 6e 57 69 64 74 68 73 3b 0a 20 20 20 20  lainWidths;.    
d0e0: 20 20 20 20 73 68 6f 77 48 64 72 20 3d 20 31 3b      showHdr = 1;
d0f0: 0a 20 20 20 20 20 20 20 20 72 6f 77 53 65 70 20  .        rowSep 
d100: 3d 20 53 45 50 5f 52 6f 77 3b 0a 20 20 20 20 20  = SEP_Row;.     
d110: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
d120: 63 6e 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20 20  cnt++==0 ){.    
d130: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
d140: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
d150: 20 20 20 20 20 69 6e 74 20 77 2c 20 6e 3b 0a 20       int w, n;. 
d160: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41           if( i<A
d170: 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57  rraySize(p->colW
d180: 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20  idth) ){.       
d190: 20 20 20 20 20 77 20 3d 20 63 6f 6c 57 69 64 74       w = colWidt
d1a0: 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  h[i];.          
d1b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d1c0: 20 20 20 77 20 3d 20 30 3b 0a 20 20 20 20 20 20     w = 0;.      
d1d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d1e0: 69 66 28 20 77 3d 3d 30 20 29 7b 0a 20 20 20 20  if( w==0 ){.    
d1f0: 20 20 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c          w = strl
d200: 65 6e 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 20  enChar(azCol[i] 
d210: 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29  ? azCol[i] : "")
d220: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
d230: 28 20 77 3c 31 30 20 29 20 77 20 3d 20 31 30 3b  ( w<10 ) w = 10;
d240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d  .            n =
d250: 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72   strlenChar(azAr
d260: 67 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 3f 20  g && azArg[i] ? 
d270: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
d280: 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
d290: 20 20 20 20 20 20 69 66 28 20 77 3c 6e 20 29 20        if( w<n ) 
d2a0: 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  w = n;.         
d2b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
d2c0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   i<ArraySize(p->
d2d0: 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a  actualWidth) ){.
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61              p->a
d2f0: 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 20 3d 20  ctualWidth[i] = 
d300: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  w;.          }. 
d310: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 68 6f           if( sho
d320: 77 48 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  wHdr ){.        
d330: 20 20 20 20 75 74 66 38 5f 77 69 64 74 68 5f 70      utf8_width_p
d340: 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20 77 2c 20  rint(p->out, w, 
d350: 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  azCol[i]);.     
d360: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
d370: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
d380: 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77   i==nArg-1 ? row
d390: 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20  Sep : "  ");.   
d3a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d3b0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
d3c0: 68 6f 77 48 64 72 20 29 7b 0a 20 20 20 20 20 20  howHdr ){.      
d3d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
d3e0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
d3f0: 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20         int w;.  
d400: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
d410: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74  ArraySize(p->act
d420: 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20  ualWidth) ){.   
d430: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
d440: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69  p->actualWidth[i
d450: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
d460: 20 20 69 66 28 20 77 3c 30 20 29 20 77 20 3d 20    if( w<0 ) w = 
d470: 2d 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -w;.            
d480: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d490: 20 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20        w = 10;.  
d4a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d4b0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
d4c0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e  ntf(p->out,"%-*.
d4d0: 2a 73 25 73 22 2c 77 2c 77 2c 0a 20 20 20 20 20  *s%s",w,w,.     
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
d4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20 20 20 20 20  ---------".     
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
d540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20 20 20  ---------",.    
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d590: 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53  i==nArg-1 ? rowS
d5a0: 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20  ep : "  ");.    
d5b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d5c0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
d5d0: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
d5e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
d5f0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
d600: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77  ){.        int w
d610: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  ;.        if( i<
d620: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74  ArraySize(p->act
d630: 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20  ualWidth) ){.   
d640: 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d 3e 61          w = p->a
d650: 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20  ctualWidth[i];. 
d660: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
d670: 20 20 20 20 20 20 20 20 20 77 20 3d 20 31 30 3b           w = 10;
d680: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d690: 20 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d     if( p->cMode=
d6a0: 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 26 26  =MODE_Explain &&
d6b0: 20 61 7a 41 72 67 5b 69 5d 20 26 26 20 73 74 72   azArg[i] && str
d6c0: 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d  lenChar(azArg[i]
d6d0: 29 3e 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )>w ){.         
d6e0: 20 77 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28   w = strlenChar(
d6f0: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
d700: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
d710: 20 69 3d 3d 31 20 26 26 20 70 2d 3e 61 69 49 6e   i==1 && p->aiIn
d720: 64 65 6e 74 20 26 26 20 70 2d 3e 70 53 74 6d 74  dent && p->pStmt
d730: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
d740: 28 20 70 2d 3e 69 49 6e 64 65 6e 74 3c 70 2d 3e  ( p->iIndent<p->
d750: 6e 49 6e 64 65 6e 74 20 29 7b 0a 20 20 20 20 20  nIndent ){.     
d760: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
d770: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2a 2e 73  tf(p->out, "%*.s
d780: 22 2c 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 70  ", p->aiIndent[p
d790: 2d 3e 69 49 6e 64 65 6e 74 5d 2c 20 22 22 29 3b  ->iIndent], "");
d7a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d7b0: 20 20 20 20 20 20 20 70 2d 3e 69 49 6e 64 65 6e         p->iInden
d7c0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
d7d0: 20 20 20 20 20 20 20 75 74 66 38 5f 77 69 64 74         utf8_widt
d7e0: 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20  h_print(p->out, 
d7f0: 77 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a  w, azArg[i] ? az
d800: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
d810: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
d820: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
d830: 75 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72  ut, "%s", i==nAr
d840: 67 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22  g-1 ? rowSep : "
d850: 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20    ");.      }.  
d860: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d870: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 53  .    case MODE_S
d880: 65 6d 69 3a 20 7b 20 20 20 2f 2a 20 2e 73 63 68  emi: {   /* .sch
d890: 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63 68  ema and .fullsch
d8a0: 65 6d 61 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  ema output */.  
d8b0: 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c      printSchemaL
d8c0: 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ine(p->out, azAr
d8d0: 67 5b 30 5d 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20  g[0], ";\n");.  
d8e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d8f0: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 50  .    case MODE_P
d900: 72 65 74 74 79 3a 20 7b 20 20 2f 2a 20 2e 73 63  retty: {  /* .sc
d910: 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63  hema and .fullsc
d920: 68 65 6d 61 20 77 69 74 68 20 2d 2d 69 6e 64 65  hema with --inde
d930: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  nt */.      char
d940: 20 2a 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a   *z;.      int j
d950: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 72  ;.      int nPar
d960: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68  en = 0;.      ch
d970: 61 72 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20  ar cEnd = 0;.   
d980: 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 20     char c;.     
d990: 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 30 3b 0a   int nLine = 0;.
d9a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41        assert( nA
d9b0: 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  rg==1 );.      i
d9c0: 66 28 20 61 7a 41 72 67 5b 30 5d 3d 3d 30 20 29  f( azArg[0]==0 )
d9d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
d9e0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  ( sqlite3_strlik
d9f0: 65 28 22 43 52 45 41 54 45 20 56 49 45 57 25 22  e("CREATE VIEW%"
da00: 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d  , azArg[0], 0)==
da10: 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69  0.       || sqli
da20: 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 43 52 45  te3_strlike("CRE
da30: 41 54 45 20 54 52 49 47 25 22 2c 20 61 7a 41 72  ATE TRIG%", azAr
da40: 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a 20 20 20 20  g[0], 0)==0.    
da50: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66    ){.        utf
da60: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
da70: 20 22 25 73 3b 5c 6e 22 2c 20 61 7a 41 72 67 5b   "%s;\n", azArg[
da80: 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  0]);.        bre
da90: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
daa0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
dab0: 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 41 72  rintf("%s", azAr
dac0: 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 6a 20 3d  g[0]);.      j =
dad0: 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   0;.      for(i=
dae0: 30 3b 20 49 73 53 70 61 63 65 28 7a 5b 69 5d 29  0; IsSpace(z[i])
daf0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 66  ; i++){}.      f
db00: 6f 72 28 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  or(; (c = z[i])!
db10: 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
db20: 20 20 69 66 28 20 49 73 53 70 61 63 65 28 63 29    if( IsSpace(c)
db30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
db40: 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 5c 72 27 20 29  ( z[j-1]=='\r' )
db50: 20 7a 5b 6a 2d 31 5d 20 3d 20 27 5c 6e 27 3b 0a   z[j-1] = '\n';.
db60: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73            if( Is
db70: 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 7c 7c  Space(z[j-1]) ||
db80: 20 7a 5b 6a 2d 31 5d 3d 3d 27 28 27 20 29 20 63   z[j-1]=='(' ) c
db90: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
dba0: 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27   }else if( (c=='
dbb0: 28 27 20 7c 7c 20 63 3d 3d 27 29 27 29 20 26 26  (' || c==')') &&
dbc0: 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63 65 28   j>0 && IsSpace(
dbd0: 7a 5b 6a 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20  z[j-1]) ){.     
dbe0: 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20       j--;.      
dbf0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b    }.        z[j+
dc00: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a  +] = c;.      }.
dc10: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30        while( j>0
dc20: 20 26 26 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d   && IsSpace(z[j-
dc30: 31 5d 29 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  1]) ){ j--; }.  
dc40: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
dc50: 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e 33 30      if( strlen30
dc60: 28 7a 29 3e 3d 37 39 20 29 7b 0a 20 20 20 20 20  (z)>=79 ){.     
dc70: 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63     for(i=j=0; (c
dc80: 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b   = z[i])!=0; i++
dc90: 29 7b 20 20 2f 2a 20 43 6f 70 79 20 63 68 61 6e  ){  /* Copy chan
dca0: 67 65 73 20 66 72 6f 6d 20 7a 5b 69 5d 20 62 61  ges from z[i] ba
dcb0: 63 6b 20 74 6f 20 7a 5b 6a 5d 20 2a 2f 0a 20 20  ck to z[j] */.  
dcc0: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63          if( c==c
dcd0: 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  End ){.         
dce0: 20 20 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20     cEnd = 0;.   
dcf0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
dd00: 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5c   c=='"' || c=='\
dd10: 27 27 20 7c 7c 20 63 3d 3d 27 60 27 20 29 7b 0a  '' || c=='`' ){.
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 63 45 6e 64              cEnd
dd30: 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20   = c;.          
dd40: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27  }else if( c=='['
dd50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
dd60: 63 45 6e 64 20 3d 20 27 5d 27 3b 0a 20 20 20 20  cEnd = ']';.    
dd70: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
dd80: 63 3d 3d 27 2d 27 20 26 26 20 7a 5b 69 2b 31 5d  c=='-' && z[i+1]
dd90: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
dda0: 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5c 6e 27       cEnd = '\n'
ddb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
ddc0: 65 20 69 66 28 20 63 3d 3d 27 28 27 20 29 7b 0a  e if( c=='(' ){.
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 61 72              nPar
dde0: 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  en++;.          
ddf0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 29 27  }else if( c==')'
de00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
de10: 6e 50 61 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20  nParen--;.      
de20: 20 20 20 20 20 20 69 66 28 20 6e 4c 69 6e 65 3e        if( nLine>
de30: 30 20 26 26 20 6e 50 61 72 65 6e 3d 3d 30 20 26  0 && nParen==0 &
de40: 26 20 6a 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  & j>0 ){.       
de50: 20 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65         printSche
de60: 6d 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20  maLineN(p->out, 
de70: 7a 2c 20 6a 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  z, j, "\n");.   
de80: 20 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 30             j = 0
de90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
dea0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
deb0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63        z[j++] = c
dec0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
ded0: 6e 50 61 72 65 6e 3d 3d 31 20 26 26 20 63 45 6e  nParen==1 && cEn
dee0: 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  d==0.           
def0: 26 26 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d  && (c=='(' || c=
df00: 3d 27 5c 6e 27 20 7c 7c 20 28 63 3d 3d 27 2c 27  ='\n' || (c==','
df10: 20 26 26 20 21 77 73 54 6f 45 6f 6c 28 7a 2b 69   && !wsToEol(z+i
df20: 2b 31 29 29 29 0a 20 20 20 20 20 20 20 20 20 20  +1))).          
df30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
df40: 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6a 2d 2d  f( c=='\n' ) j--
df50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ;.            pr
df60: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70  intSchemaLineN(p
df70: 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e  ->out, z, j, "\n
df80: 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20    ");.          
df90: 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    j = 0;.       
dfa0: 20 20 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20       nLine++;.  
dfb0: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
dfc0: 20 49 73 53 70 61 63 65 28 7a 5b 69 2b 31 5d 29   IsSpace(z[i+1])
dfd0: 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ i++; }.     
dfe0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
dff0: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20  .        z[j] = 
e000: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
e010: 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65   printSchemaLine
e020: 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 22 3b 5c 6e  (p->out, z, ";\n
e030: 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
e040: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20  3_free(z);.     
e050: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e060: 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69 73 74    case MODE_List
e070: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
e080: 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e  >cnt++==0 && p->
e090: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
e0a0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e0b0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
e0c0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
e0d0: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22  tf(p->out,"%s%s"
e0e0: 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20  ,azCol[i],.     
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 3d 3d               i==
e100: 6e 41 72 67 2d 31 20 3f 20 70 2d 3e 72 6f 77 53  nArg-1 ? p->rowS
e110: 65 70 61 72 61 74 6f 72 20 3a 20 70 2d 3e 63 6f  eparator : p->co
e120: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
e130: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
e140: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
e150: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
e160: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
e170: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
e180: 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
e190: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
e1a0: 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 2d 3e 6e 75  z==0 ) z = p->nu
e1b0: 6c 6c 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  llValue;.       
e1c0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
e1d0: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
e1e0: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 41 72         if( i<nAr
e1f0: 67 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  g-1 ){.         
e200: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
e210: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f  out, "%s", p->co
e220: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
e230: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e240: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
e250: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
e260: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
e270: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e280: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
e290: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e2a0: 4d 4f 44 45 5f 48 74 6d 6c 3a 20 7b 0a 20 20 20  MODE_Html: {.   
e2b0: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d     if( p->cnt++=
e2c0: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
e2d0: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72  der ){.        r
e2e0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
e2f0: 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20  ,"<TR>");.      
e300: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
e310: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
e320: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
e330: 3e 6f 75 74 2c 22 3c 54 48 3e 22 29 3b 0a 20 20  >out,"<TH>");.  
e340: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68          output_h
e350: 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  tml_string(p->ou
e360: 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  t, azCol[i]);.  
e370: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
e380: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 48 3e  tf(p->out,"</TH>
e390: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  \n");.        }.
e3a0: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
e3b0: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e  tf(p->out,"</TR>
e3c0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
e3d0: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
e3e0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
e3f0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
e400: 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20  t,"<TR>");.     
e410: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
e420: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
e430: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
e440: 74 2c 22 3c 54 44 3e 22 29 3b 0a 20 20 20 20 20  t,"<TD>");.     
e450: 20 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73     output_html_s
e460: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
e470: 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69  Arg[i] ? azArg[i
e480: 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  ] : p->nullValue
e490: 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  );.        raw_p
e4a0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f  rintf(p->out,"</
e4b0: 54 44 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  TD>\n");.      }
e4c0: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
e4d0: 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c  f(p->out,"</TR>\
e4e0: 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  n");.      break
e4f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e500: 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20 20 20   MODE_Tcl: {.   
e510: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d     if( p->cnt++=
e520: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
e530: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66  der ){.        f
e540: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
e550: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
e560: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
e570: 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69 5d 20  p->out,azCol[i] 
e580: 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29  ? azCol[i] : "")
e590: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 69  ;.          if(i
e5a0: 3c 6e 41 72 67 2d 31 29 20 75 74 66 38 5f 70 72  <nArg-1) utf8_pr
e5b0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
e5c0: 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ", p->colSeparat
e5d0: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  or);.        }. 
e5e0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
e5f0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
e600: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
e610: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e620: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
e630: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72  break;.      for
e640: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
e650: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6f 75 74 70  +){.        outp
e660: 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  ut_c_string(p->o
e670: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61  ut, azArg[i] ? a
e680: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
e690: 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20  lValue);.       
e6a0: 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75 74   if(i<nArg-1) ut
e6b0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e6c0: 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65  , "%s", p->colSe
e6d0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
e6e0: 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  }.      utf8_pri
e6f0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
e700: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
e710: 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
e720: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e730: 4d 4f 44 45 5f 43 73 76 3a 20 7b 0a 20 20 20 20  MODE_Csv: {.    
e740: 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28    setBinaryMode(
e750: 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20  p->out, 1);.    
e760: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d    if( p->cnt++==
e770: 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64  0 && p->showHead
e780: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  er ){.        fo
e790: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
e7a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  ++){.          o
e7b0: 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61 7a 43  utput_csv(p, azC
e7c0: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
e7d0: 20 3a 20 22 22 2c 20 69 3c 6e 41 72 67 2d 31 29   : "", i<nArg-1)
e7e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e7f0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
e800: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
e810: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
e820: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
e830: 28 20 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20 20  ( nArg>0 ){.    
e840: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e850: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
e860: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28       output_csv(
e870: 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 69 3c 6e  p, azArg[i], i<n
e880: 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Arg-1);.        
e890: 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  }.        utf8_p
e8a0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
e8b0: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
e8c0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tor);.      }.  
e8d0: 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28      setTextMode(
e8e0: 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20  p->out, 1);.    
e8f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e900: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 49 6e 73     case MODE_Ins
e910: 65 72 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ert: {.      if(
e920: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
e930: 6b 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  k;.      utf8_pr
e940: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 49 4e 53  intf(p->out,"INS
e950: 45 52 54 20 49 4e 54 4f 20 25 73 22 2c 70 2d 3e  ERT INTO %s",p->
e960: 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20  zDestTable);.   
e970: 20 20 20 69 66 28 20 70 2d 3e 73 68 6f 77 48 65     if( p->showHe
e980: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
e990: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
e9a0: 74 2c 22 28 22 29 3b 0a 20 20 20 20 20 20 20 20  t,"(");.        
e9b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
e9c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
e9d0: 20 69 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70   if( i>0 ) raw_p
e9e0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c  rintf(p->out, ",
e9f0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ");.          if
ea00: 28 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43 6f  ( quoteChar(azCo
ea10: 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  l[i]) ){.       
ea20: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73       char *z = s
ea30: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
ea40: 5c 22 25 77 5c 22 22 2c 20 61 7a 43 6f 6c 5b 69  \"%w\"", azCol[i
ea50: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
ea60: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
ea70: 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20  ut, "%s", z);.  
ea80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ea90: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20  3_free(z);.     
eaa0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
eab0: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
eac0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
ead0: 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20   azCol[i]);.    
eae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
eaf0: 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  }.        raw_pr
eb00: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29 22 29  intf(p->out,")")
eb10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
eb20: 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  p->cnt++;.      
eb30: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
eb40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72   i++){.        r
eb50: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
eb60: 2c 20 69 3e 30 20 3f 20 22 2c 22 20 3a 20 22 20  , i>0 ? "," : " 
eb70: 56 41 4c 55 45 53 28 22 29 3b 0a 20 20 20 20 20  VALUES(");.     
eb80: 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b 69 5d     if( (azArg[i]
eb90: 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70 65 20  ==0) || (aiType 
eba0: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
ebb0: 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20  LITE_NULL) ){.  
ebc0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
ebd0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c  ntf(p->out,"NULL
ebe0: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ");.        }els
ebf0: 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20  e if( aiType && 
ec00: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
ec10: 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20  E_TEXT ){.      
ec20: 20 20 20 20 69 66 28 20 53 68 65 6c 6c 48 61 73      if( ShellHas
ec30: 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65  Flag(p, SHFLG_Ne
ec40: 77 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20  wlines) ){.     
ec50: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75         output_qu
ec60: 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  oted_string(p->o
ec70: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  ut, azArg[i]);. 
ec80: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74 70              outp
eca0: 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70 65  ut_quoted_escape
ecb0: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
ecc0: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
ecd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ece0: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
ecf0: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
ed00: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b  QLITE_INTEGER ){
ed10: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
ed20: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
ed30: 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  s", azArg[i]);. 
ed40: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
ed50: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
ed60: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  e[i]==SQLITE_FLO
ed70: 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AT ){.          
ed80: 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20 20 20  char z[50];.    
ed90: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d        double r =
eda0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
edb0: 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d 74 2c  double(p->pStmt,
edc0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   i);.          s
edd0: 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 75 72  qlite3_uint64 ur
ede0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
edf0: 70 79 28 26 75 72 2c 26 72 2c 73 69 7a 65 6f 66  py(&ur,&r,sizeof
ee00: 28 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (r));.          
ee10: 69 66 28 20 75 72 3d 3d 30 78 37 66 66 30 30 30  if( ur==0x7ff000
ee20: 30 30 30 30 30 30 30 30 30 30 4c 4c 20 29 7b 0a  0000000000LL ){.
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f              raw_
ee40: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
ee50: 31 65 39 39 39 22 29 3b 0a 20 20 20 20 20 20 20  1e999");.       
ee60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75 72 3d     }else if( ur=
ee70: 3d 30 78 66 66 66 30 30 30 30 30 30 30 30 30 30  =0xfff0000000000
ee80: 30 30 30 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  000LL ){.       
ee90: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
eea0: 70 2d 3e 6f 75 74 2c 20 22 2d 31 65 39 39 39 22  p->out, "-1e999"
eeb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
eec0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
eed0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
eee0: 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c 20  (50,z,"%!.20g", 
eef0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
ef00: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
ef10: 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  t, "%s", z);.   
ef20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ef30: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
ef40: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
ef50: 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70  SQLITE_BLOB && p
ef60: 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
ef70: 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20       const void 
ef80: 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33  *pBlob = sqlite3
ef90: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d 3e  _column_blob(p->
efa0: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
efb0: 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d       int nBlob =
efc0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
efd0: 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74 2c 20  bytes(p->pStmt, 
efe0: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  i);.          ou
eff0: 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 70 2d  tput_hex_blob(p-
f000: 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c  >out, pBlob, nBl
f010: 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ob);.        }el
f020: 73 65 20 69 66 28 20 69 73 4e 75 6d 62 65 72 28  se if( isNumber(
f030: 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b 0a  azArg[i], 0) ){.
f040: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
f050: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
f060: 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ", azArg[i]);.  
f070: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f080: 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20  ShellHasFlag(p, 
f090: 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20  SHFLG_Newlines) 
f0a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  ){.          out
f0b0: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
f0c0: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
f0d0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
f0e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  se{.          ou
f0f0: 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61  tput_quoted_esca
f100: 70 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  ped_string(p->ou
f110: 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  t, azArg[i]);.  
f120: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f130: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
f140: 28 70 2d 3e 6f 75 74 2c 22 29 3b 5c 6e 22 29 3b  (p->out,");\n");
f150: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f160: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
f170: 45 5f 51 75 6f 74 65 3a 20 7b 0a 20 20 20 20 20  E_Quote: {.     
f180: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
f190: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
f1a0: 20 70 2d 3e 63 6e 74 3d 3d 30 20 26 26 20 70 2d   p->cnt==0 && p-
f1b0: 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20  >showHeader ){. 
f1c0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
f1d0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
f1e0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
f1f0: 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e  ) raw_printf(p->
f200: 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20  out, ",");.     
f210: 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74       output_quot
f220: 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ed_string(p->out
f230: 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  , azCol[i]);.   
f240: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
f250: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
f260: 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  ,"\n");.      }.
f270: 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a        p->cnt++;.
f280: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
f290: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
f2a0: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 72       if( i>0 ) r
f2b0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
f2c0: 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20  , ",");.        
f2d0: 69 66 28 20 28 61 7a 41 72 67 5b 69 5d 3d 3d 30  if( (azArg[i]==0
f2e0: 29 20 7c 7c 20 28 61 69 54 79 70 65 20 26 26 20  ) || (aiType && 
f2f0: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
f300: 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  E_NULL) ){.     
f310: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
f320: 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22 29 3b  (p->out,"NULL");
f330: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
f340: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
f350: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 54  ype[i]==SQLITE_T
f360: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EXT ){.         
f370: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73   output_quoted_s
f380: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
f390: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
f3a0: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
f3b0: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
f3c0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29  SQLITE_INTEGER )
f3d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
f3e0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
f3f0: 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  %s", azArg[i]);.
f400: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
f410: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
f420: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c  pe[i]==SQLITE_FL
f430: 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OAT ){.         
f440: 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20 20   char z[50];.   
f450: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20         double r 
f460: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
f470: 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d 74  _double(p->pStmt
f480: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
f490: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
f4a0: 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c 20  (50,z,"%!.20g", 
f4b0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61  r);.          ra
f4c0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
f4d0: 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20   "%s", z);.     
f4e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54     }else if( aiT
f4f0: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
f500: 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26  ==SQLITE_BLOB &&
f510: 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20   p->pStmt ){.   
f520: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69         const voi
f530: 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74  d *pBlob = sqlit
f540: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
f550: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
f560: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62         int nBlob
f570: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
f580: 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74  n_bytes(p->pStmt
f590: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
f5a0: 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28  output_hex_blob(
f5b0: 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e  p->out, pBlob, n
f5c0: 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  Blob);.        }
f5d0: 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d 62 65  else if( isNumbe
f5e0: 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29  r(azArg[i], 0) )
f5f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
f600: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
f610: 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  %s", azArg[i]);.
f620: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
f630: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
f640: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d  quoted_string(p-
f650: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  >out, azArg[i]);
f660: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f670: 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69   }.      raw_pri
f680: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29  ntf(p->out,"\n")
f690: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f6a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
f6b0: 44 45 5f 41 73 63 69 69 3a 20 7b 0a 20 20 20 20  DE_Ascii: {.    
f6c0: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d    if( p->cnt++==
f6d0: 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64  0 && p->showHead
f6e0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  er ){.        fo
f6f0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
f700: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
f710: 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72  f( i>0 ) utf8_pr
f720: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
f730: 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ", p->colSeparat
f740: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 75  or);.          u
f750: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
f760: 74 2c 22 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 20  t,"%s",azCol[i] 
f770: 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29  ? azCol[i] : "")
f780: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f790: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
f7a0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
f7b0: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
f7c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f7d0: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
f7e0: 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ak;.      for(i=
f7f0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
f800: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30  .        if( i>0
f810: 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70   ) utf8_printf(p
f820: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
f830: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
f840: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
f850: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61  tf(p->out,"%s",a
f860: 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b  zArg[i] ? azArg[
f870: 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75  i] : p->nullValu
f880: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
f890: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
f8a0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72  >out, "%s", p->r
f8b0: 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
f8c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f8d0: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 45  .    case MODE_E
f8e0: 51 50 3a 20 7b 0a 20 20 20 20 20 20 65 71 70 5f  QP: {.      eqp_
f8f0: 61 70 70 65 6e 64 28 70 2c 20 61 74 6f 69 28 61  append(p, atoi(a
f900: 7a 41 72 67 5b 30 5d 29 2c 20 61 74 6f 69 28 61  zArg[0]), atoi(a
f910: 7a 41 72 67 5b 31 5d 29 2c 20 61 7a 41 72 67 5b  zArg[1]), azArg[
f920: 33 5d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  3]);.      break
f930: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
f940: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
f950: 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61 6c   This is the cal
f960: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74 68  lback routine th
f970: 61 74 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  at the SQLite li
f980: 62 72 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b 65 73  brary.** invokes
f990: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
f9a0: 20 61 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e   a query result.
f9b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
f9c0: 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41  allback(void *pA
f9d0: 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68  rg, int nArg, ch
f9e0: 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72  ar **azArg, char
f9f0: 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 2f 2a 20   **azCol){.  /* 
fa00: 73 69 6e 63 65 20 77 65 20 64 6f 6e 27 74 20 68  since we don't h
fa10: 61 76 65 20 74 79 70 65 20 69 6e 66 6f 2c 20 63  ave type info, c
fa20: 61 6c 6c 20 74 68 65 20 73 68 65 6c 6c 5f 63 61  all the shell_ca
fa30: 6c 6c 62 61 63 6b 20 77 69 74 68 20 61 20 4e 55  llback with a NU
fa40: 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 72 65  LL value */.  re
fa50: 74 75 72 6e 20 73 68 65 6c 6c 5f 63 61 6c 6c 62  turn shell_callb
fa60: 61 63 6b 28 70 41 72 67 2c 20 6e 41 72 67 2c 20  ack(pArg, nArg, 
fa70: 61 7a 41 72 67 2c 20 61 7a 43 6f 6c 2c 20 4e 55  azArg, azCol, NU
fa80: 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  LL);.}../*.** Th
fa90: 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61  is is the callba
faa0: 63 6b 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  ck routine from 
fab0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 74  sqlite3_exec() t
fac0: 68 61 74 20 61 70 70 65 6e 64 73 20 61 6c 6c 0a  hat appends all.
fad0: 2a 2a 20 6f 75 74 70 75 74 20 6f 6e 74 6f 20 74  ** output onto t
fae0: 68 65 20 65 6e 64 20 6f 66 20 61 20 53 68 65 6c  he end of a Shel
faf0: 6c 54 65 78 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f  lText object..*/
fb00: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 70 74  .static int capt
fb10: 75 72 65 4f 75 74 70 75 74 43 61 6c 6c 62 61 63  ureOutputCallbac
fb20: 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  k(void *pArg, in
fb30: 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  t nArg, char **a
fb40: 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 29  zArg, char **az)
fb50: 7b 0a 20 20 53 68 65 6c 6c 54 65 78 74 20 2a 70  {.  ShellText *p
fb60: 20 3d 20 28 53 68 65 6c 6c 54 65 78 74 2a 29 70   = (ShellText*)p
fb70: 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Arg;.  int i;.  
fb80: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
fb90: 28 61 7a 29 3b 0a 20 20 69 66 28 20 61 7a 41 72  (az);.  if( azAr
fba0: 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
fbb0: 0a 20 20 69 66 28 20 70 2d 3e 6e 20 29 20 61 70  .  if( p->n ) ap
fbc0: 70 65 6e 64 54 65 78 74 28 70 2c 20 22 7c 22 2c  pendText(p, "|",
fbd0: 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0);.  for(i=0; 
fbe0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
fbf0: 20 20 69 66 28 20 69 20 29 20 61 70 70 65 6e 64    if( i ) append
fc00: 54 65 78 74 28 70 2c 20 22 2c 22 2c 20 30 29 3b  Text(p, ",", 0);
fc10: 0a 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69  .    if( azArg[i
fc20: 5d 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 70  ] ) appendText(p
fc30: 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 30 29 3b 0a  , azArg[i], 0);.
fc40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
fc50: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
fc60: 65 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  e an appropriate
fc70: 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20   SELFTEST table 
fc80: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
fc90: 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
fca0: 76 6f 69 64 20 63 72 65 61 74 65 53 65 6c 66 74  void createSelft
fcb0: 65 73 74 54 61 62 6c 65 28 53 68 65 6c 6c 53 74  estTable(ShellSt
fcc0: 61 74 65 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  ate *p){.  char 
fcd0: 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
fce0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
fcf0: 64 62 2c 0a 20 20 20 20 22 53 41 56 45 50 4f 49  db,.    "SAVEPOI
fd00: 4e 54 20 73 65 6c 66 74 65 73 74 5f 69 6e 69 74  NT selftest_init
fd10: 3b 5c 6e 22 0a 20 20 20 20 22 43 52 45 41 54 45  ;\n".    "CREATE
fd20: 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58   TABLE IF NOT EX
fd30: 49 53 54 53 20 73 65 6c 66 74 65 73 74 28 5c 6e  ISTS selftest(\n
fd40: 22 0a 20 20 20 20 22 20 20 74 6e 6f 20 49 4e 54  ".    "  tno INT
fd50: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
fd60: 2c 5c 6e 22 20 20 20 2f 2a 20 54 65 73 74 20 6e  ,\n"   /* Test n
fd70: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 22 20 20  umber */.    "  
fd80: 6f 70 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20  op TEXT,\n"     
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fda0: 20 4f 70 65 72 61 74 6f 72 3a 20 20 6d 65 6d 6f   Operator:  memo
fdb0: 20 72 75 6e 20 2a 2f 0a 20 20 20 20 22 20 20 63   run */.    "  c
fdc0: 6d 64 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20  md TEXT,\n"     
fdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fde0: 43 6f 6d 6d 61 6e 64 20 74 65 78 74 20 2a 2f 0a  Command text */.
fdf0: 20 20 20 20 22 20 20 61 6e 73 20 54 45 58 54 5c      "  ans TEXT\
fe00: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
fe10: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
fe20: 61 6e 73 77 65 72 20 2a 2f 0a 20 20 20 20 22 29  answer */.    ")
fe30: 3b 22 0a 20 20 20 20 22 43 52 45 41 54 45 20 54  ;".    "CREATE T
fe40: 45 4d 50 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c  EMP TABLE [_shel
fe50: 6c 24 73 65 6c 66 5d 28 6f 70 2c 63 6d 64 2c 61  l$self](op,cmd,a
fe60: 6e 73 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53  ns);\n".    "INS
fe70: 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c  ERT INTO [_shell
fe80: 24 73 65 6c 66 5d 28 72 6f 77 69 64 2c 6f 70 2c  $self](rowid,op,
fe90: 63 6d 64 29 5c 6e 22 0a 20 20 20 20 22 20 20 56  cmd)\n".    "  V
fea0: 41 4c 55 45 53 28 63 6f 61 6c 65 73 63 65 28 28  ALUES(coalesce((
feb0: 53 45 4c 45 43 54 20 28 6d 61 78 28 74 6e 6f 29  SELECT (max(tno)
fec0: 2b 31 30 30 29 2f 31 30 20 46 52 4f 4d 20 73 65  +100)/10 FROM se
fed0: 6c 66 74 65 73 74 29 2c 31 30 29 2c 5c 6e 22 0a  lftest),10),\n".
fee0: 20 20 20 20 22 20 20 20 20 20 20 20 20 20 27 6d      "         'm
fef0: 65 6d 6f 27 2c 27 54 65 73 74 73 20 67 65 6e 65  emo','Tests gene
ff00: 72 61 74 65 64 20 62 79 20 2d 2d 69 6e 69 74 27  rated by --init'
ff10: 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52  );\n".    "INSER
ff20: 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73  T INTO [_shell$s
ff30: 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53  elf]\n".    "  S
ff40: 45 4c 45 43 54 20 27 72 75 6e 27 2c 5c 6e 22 0a  ELECT 'run',\n".
ff50: 20 20 20 20 22 20 20 20 20 27 53 45 4c 45 43 54      "    'SELECT
ff60: 20 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28   hex(sha3_query(
ff70: 27 27 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61  ''SELECT type,na
ff80: 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20  me,tbl_name,sql 
ff90: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffb0: 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f     "FROM sqlite_
ffc0: 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20  master ORDER BY 
ffd0: 32 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20  2'',224))',\n". 
ffe0: 20 20 20 22 20 20 20 20 68 65 78 28 73 68 61 33     "    hex(sha3
fff0: 5f 71 75 65 72 79 28 27 53 45 4c 45 43 54 20 74  _query('SELECT t
10000 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d  ype,name,tbl_nam
10010 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20  e,sql ".        
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10030 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d    "FROM sqlite_m
10040 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20 32  aster ORDER BY 2
10050 27 2c 32 32 34 29 29 3b 5c 6e 22 0a 20 20 20 20  ',224));\n".    
10060 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73  "INSERT INTO [_s
10070 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20  hell$self]\n".  
10080 20 20 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e    "  SELECT 'run
10090 27 2c 22 0a 20 20 20 20 22 20 20 20 20 27 53 45  ',".    "    'SE
100a0 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f 71 75  LECT hex(sha3_qu
100b0 65 72 79 28 27 27 53 45 4c 45 43 54 20 2a 20 46  ery(''SELECT * F
100c0 52 4f 4d 20 5c 22 27 20 7c 7c 22 0a 20 20 20 20  ROM \"' ||".    
100d0 22 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  "        printf(
100e0 27 25 77 27 2c 6e 61 6d 65 29 20 7c 7c 20 27 5c  '%w',name) || '\
100f0 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 27 27 2c  " NOT INDEXED'',
10100 32 32 34 29 29 27 2c 5c 6e 22 0a 20 20 20 20 22  224))',\n".    "
10110 20 20 20 20 68 65 78 28 73 68 61 33 5f 71 75 65      hex(sha3_que
10120 72 79 28 70 72 69 6e 74 66 28 27 53 45 4c 45 43  ry(printf('SELEC
10130 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20  T * FROM \"%w\" 
10140 4e 4f 54 20 49 4e 44 45 58 45 44 27 2c 6e 61 6d  NOT INDEXED',nam
10150 65 29 2c 32 32 34 29 29 5c 6e 22 0a 20 20 20 20  e),224))\n".    
10160 22 20 20 46 52 4f 4d 20 28 5c 6e 22 0a 20 20 20  "  FROM (\n".   
10170 20 22 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d   "    SELECT nam
10180 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
10190 73 74 65 72 5c 6e 22 0a 20 20 20 20 22 20 20 20  ster\n".    "   
101a0 20 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61    WHERE type='ta
101b0 62 6c 65 27 5c 6e 22 0a 20 20 20 20 22 20 20 20  ble'\n".    "   
101c0 20 20 20 20 41 4e 44 20 6e 61 6d 65 3c 3e 27 73      AND name<>'s
101d0 65 6c 66 74 65 73 74 27 5c 6e 22 0a 20 20 20 20  elftest'\n".    
101e0 22 20 20 20 20 20 20 20 41 4e 44 20 63 6f 61 6c  "       AND coal
101f0 65 73 63 65 28 72 6f 6f 74 70 61 67 65 2c 30 29  esce(rootpage,0)
10200 3e 30 5c 6e 22 0a 20 20 20 20 22 20 20 29 5c 6e  >0\n".    "  )\n
10210 22 0a 20 20 20 20 22 20 4f 52 44 45 52 20 42 59  ".    " ORDER BY
10220 20 6e 61 6d 65 3b 5c 6e 22 0a 20 20 20 20 22 49   name;\n".    "I
10230 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65  NSERT INTO [_she
10240 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20  ll$self]\n".    
10250 22 20 20 56 41 4c 55 45 53 28 27 72 75 6e 27 2c  "  VALUES('run',
10260 27 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74  'PRAGMA integrit
10270 79 5f 63 68 65 63 6b 27 2c 27 6f 6b 27 29 3b 5c  y_check','ok');\
10280 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49  n".    "INSERT I
10290 4e 54 4f 20 73 65 6c 66 74 65 73 74 28 74 6e 6f  NTO selftest(tno
102a0 2c 6f 70 2c 63 6d 64 2c 61 6e 73 29 22 0a 20 20  ,op,cmd,ans)".  
102b0 20 20 22 20 20 53 45 4c 45 43 54 20 72 6f 77 69    "  SELECT rowi
102c0 64 2a 31 30 2c 6f 70 2c 63 6d 64 2c 61 6e 73 20  d*10,op,cmd,ans 
102d0 46 52 4f 4d 20 5b 5f 73 68 65 6c 6c 24 73 65 6c  FROM [_shell$sel
102e0 66 5d 3b 5c 6e 22 0a 20 20 20 20 22 44 52 4f 50  f];\n".    "DROP
102f0 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c 24 73   TABLE [_shell$s
10300 65 6c 66 5d 3b 22 0a 20 20 20 20 2c 30 2c 30 2c  elf];".    ,0,0,
10310 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
10320 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
10330 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
10340 72 72 2c 20 22 53 45 4c 46 54 45 53 54 20 69 6e  rr, "SELFTEST in
10350 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69  itialization fai
10360 6c 75 72 65 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  lure: %s\n", zEr
10370 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  rMsg);.    sqlit
10380 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
10390 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
103a0 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c  exec(p->db, "REL
103b0 45 41 53 45 20 73 65 6c 66 74 65 73 74 5f 69 6e  EASE selftest_in
103c0 69 74 22 2c 30 2c 30 2c 30 29 3b 0a 7d 0a 0a 0a  it",0,0,0);.}...
103d0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
103e0 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20  stination table 
103f0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 53 68 65  field of the She
10400 6c 6c 53 74 61 74 65 20 73 74 72 75 63 74 75 72  llState structur
10410 65 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  e to.** the name
10420 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 67 69   of the table gi
10430 76 65 6e 2e 20 20 45 73 63 61 70 65 20 61 6e 79  ven.  Escape any
10440 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
10450 73 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62 6c  s in the.** tabl
10460 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  e name..*/.stati
10470 63 20 76 6f 69 64 20 73 65 74 5f 74 61 62 6c 65  c void set_table
10480 5f 6e 61 6d 65 28 53 68 65 6c 6c 53 74 61 74 65  _name(ShellState
10490 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
104a0 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
104b0 2c 20 6e 3b 0a 20 20 63 68 61 72 20 63 51 75 6f  , n;.  char cQuo
104c0 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  te;.  char *z;..
104d0 20 20 69 66 28 20 70 2d 3e 7a 44 65 73 74 54 61    if( p->zDestTa
104e0 62 6c 65 20 29 7b 0a 20 20 20 20 66 72 65 65 28  ble ){.    free(
104f0 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a  p->zDestTable);.
10500 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c      p->zDestTabl
10510 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
10520 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
10530 72 6e 3b 0a 20 20 63 51 75 6f 74 65 20 3d 20 71  rn;.  cQuote = q
10540 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b  uoteChar(zName);
10550 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28  .  n = strlen30(
10560 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 63 51  zName);.  if( cQ
10570 75 6f 74 65 20 29 20 6e 20 2b 3d 20 6e 2b 32 3b  uote ) n += n+2;
10580 0a 20 20 7a 20 3d 20 70 2d 3e 7a 44 65 73 74 54  .  z = p->zDestT
10590 61 62 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  able = malloc( n
105a0 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  +1 );.  if( z==0
105b0 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
105c0 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 6e 20 3d 20  memory();.  n = 
105d0 30 3b 0a 20 20 69 66 28 20 63 51 75 6f 74 65 20  0;.  if( cQuote 
105e0 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74  ) z[n++] = cQuot
105f0 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e  e;.  for(i=0; zN
10600 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ame[i]; i++){.  
10610 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d 65    z[n++] = zName
10620 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  [i];.    if( zNa
10630 6d 65 5b 69 5d 3d 3d 63 51 75 6f 74 65 20 29 20  me[i]==cQuote ) 
10640 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b  z[n++] = cQuote;
10650 0a 20 20 7d 0a 20 20 69 66 28 20 63 51 75 6f 74  .  }.  if( cQuot
10660 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75  e ) z[n++] = cQu
10670 6f 74 65 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b  ote;.  z[n] = 0;
10680 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  .}.../*.** Execu
10690 74 65 20 61 20 71 75 65 72 79 20 73 74 61 74 65  te a query state
106a0 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 67  ment that will g
106b0 65 6e 65 72 61 74 65 20 53 51 4c 20 6f 75 74 70  enerate SQL outp
106c0 75 74 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 74 68  ut.  Print.** th
106d0 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  e result columns
106e0 2c 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65  , comma-separate
106f0 64 2c 20 6f 6e 20 61 20 6c 69 6e 65 20 61 6e 64  d, on a line and
10700 20 74 68 65 6e 20 61 64 64 20 61 0a 2a 2a 20 73   then add a.** s
10710 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61  emicolon termina
10720 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  tor to the end o
10730 66 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a  f that line..**.
10740 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
10750 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 73 20 31   of columns is 1
10760 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e   and that column
10770 20 63 6f 6e 74 61 69 6e 73 20 74 65 78 74 20 22   contains text "
10780 2d 2d 22 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74  --".** then writ
10790 65 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f 6e 20  e the semicolon 
107a0 6f 6e 20 61 20 73 65 70 61 72 61 74 65 20 6c 69  on a separate li
107b0 6e 65 2e 20 20 54 68 61 74 20 77 61 79 2c 20 69  ne.  That way, i
107c0 66 20 61 0a 2a 2a 20 22 2d 2d 22 20 63 6f 6d 6d  f a.** "--" comm
107d0 65 6e 74 20 6f 63 63 75 72 73 20 61 74 20 74 68  ent occurs at th
107e0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 74 61  e end of the sta
107f0 74 65 6d 65 6e 74 2c 20 74 68 65 20 63 6f 6d 6d  tement, the comm
10800 65 6e 74 0a 2a 2a 20 77 6f 6e 27 74 20 63 6f 6e  ent.** won't con
10810 73 75 6d 65 20 74 68 65 20 73 65 6d 69 63 6f 6c  sume the semicol
10820 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a  on terminator..*
10830 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e  /.static int run
10840 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72  _table_dump_quer
10850 79 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  y(.  ShellState 
10860 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
10870 20 51 75 65 72 79 20 63 6f 6e 74 65 78 74 20 2a   Query context *
10880 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
10890 7a 53 65 6c 65 63 74 2c 20 20 20 20 20 2f 2a 20  zSelect,     /* 
108a0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
108b0 20 74 6f 20 65 78 74 72 61 63 74 20 63 6f 6e 74   to extract cont
108c0 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ent */.  const c
108d0 68 61 72 20 2a 7a 46 69 72 73 74 52 6f 77 20 20  har *zFirstRow  
108e0 20 20 2f 2a 20 50 72 69 6e 74 20 62 65 66 6f 72    /* Print befor
108f0 65 20 66 69 72 73 74 20 72 6f 77 2c 20 69 66 20  e first row, if 
10900 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20  not NULL */.){. 
10910 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
10920 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74 20 72 63  Select;.  int rc
10930 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 3b  ;.  int nResult;
10940 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
10950 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 72 63 20  t char *z;.  rc 
10960 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
10970 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 65 6c  e_v2(p->db, zSel
10980 65 63 74 2c 20 2d 31 2c 20 26 70 53 65 6c 65 63  ect, -1, &pSelec
10990 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  t, 0);.  if( rc!
109a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 70  =SQLITE_OK || !p
109b0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 75 74  Select ){.    ut
109c0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
109d0 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20  , "/**** ERROR: 
109e0 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e  (%d) %s *****/\n
109f0 22 2c 20 72 63 2c 0a 20 20 20 20 20 20 20 20 20  ", rc,.         
10a00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
10a10 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
10a20 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29     if( (rc&0xff)
10a30 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  !=SQLITE_CORRUPT
10a40 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   ) p->nErr++;.  
10a50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10a60 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
10a70 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20  step(pSelect);. 
10a80 20 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   nResult = sqlit
10a90 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
10aa0 70 53 65 6c 65 63 74 29 3b 0a 20 20 77 68 69 6c  pSelect);.  whil
10ab0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f  e( rc==SQLITE_RO
10ac0 57 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 69  W ){.    if( zFi
10ad0 72 73 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  rstRow ){.      
10ae0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
10af0 75 74 2c 20 22 25 73 22 2c 20 7a 46 69 72 73 74  ut, "%s", zFirst
10b00 52 6f 77 29 3b 0a 20 20 20 20 20 20 7a 46 69 72  Row);.      zFir
10b10 73 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d  stRow = 0;.    }
10b20 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20  .    z = (const 
10b30 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
10b40 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63  lumn_text(pSelec
10b50 74 2c 20 30 29 3b 0a 20 20 20 20 75 74 66 38 5f  t, 0);.    utf8_
10b60 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
10b70 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 66 6f 72  %s", z);.    for
10b80 28 69 3d 31 3b 20 69 3c 6e 52 65 73 75 6c 74 3b  (i=1; i<nResult;
10b90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 74 66   i++){.      utf
10ba0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
10bb0 20 22 2c 25 73 22 2c 20 73 71 6c 69 74 65 33 5f   ",%s", sqlite3_
10bc0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c  column_text(pSel
10bd0 65 63 74 2c 20 69 29 29 3b 0a 20 20 20 20 7d 0a  ect, i));.    }.
10be0 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a      if( z==0 ) z
10bf0 20 3d 20 22 22 3b 0a 20 20 20 20 77 68 69 6c 65   = "";.    while
10c00 28 20 7a 5b 30 5d 20 26 26 20 28 7a 5b 30 5d 21  ( z[0] && (z[0]!
10c10 3d 27 2d 27 20 7c 7c 20 7a 5b 31 5d 21 3d 27 2d  ='-' || z[1]!='-
10c20 27 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  ') ) z++;.    if
10c30 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ( z[0] ){.      
10c40 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
10c50 74 2c 20 22 5c 6e 3b 5c 6e 22 29 3b 0a 20 20 20  t, "\n;\n");.   
10c60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
10c70 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
10c80 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20   ";\n");.    }. 
10c90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
10ca0 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20  step(pSelect);. 
10cb0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
10cc0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 65 6c 65  3_finalize(pSele
10cd0 63 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ct);.  if( rc!=S
10ce0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10cf0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
10d00 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52  ut, "/**** ERROR
10d10 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f  : (%d) %s *****/
10d20 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20 20 20  \n", rc,.       
10d30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10d40 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
10d50 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66  .    if( (rc&0xf
10d60 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  f)!=SQLITE_CORRU
10d70 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a  PT ) p->nErr++;.
10d80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10d90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
10da0 74 65 20 73 70 61 63 65 20 61 6e 64 20 73 61 76  te space and sav
10db0 65 20 6f 66 66 20 63 75 72 72 65 6e 74 20 65 72  e off current er
10dc0 72 6f 72 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  ror string..*/.s
10dd0 74 61 74 69 63 20 63 68 61 72 20 2a 73 61 76 65  tatic char *save
10de0 5f 65 72 72 5f 6d 73 67 28 0a 20 20 73 71 6c 69  _err_msg(.  sqli
10df0 74 65 33 20 2a 64 62 20 20 20 20 20 20 20 20 20  te3 *db         
10e00 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74     /* Database t
10e10 6f 20 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20  o query */.){.  
10e20 69 6e 74 20 6e 45 72 72 4d 73 67 20 3d 20 31 2b  int nErrMsg = 1+
10e30 73 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33  strlen30(sqlite3
10e40 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
10e50 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
10e60 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
10e70 28 6e 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  (nErrMsg);.  if(
10e80 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
10e90 6d 65 6d 63 70 79 28 7a 45 72 72 4d 73 67 2c 20  memcpy(zErrMsg, 
10ea0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
10eb0 62 29 2c 20 6e 45 72 72 4d 73 67 29 3b 0a 20 20  b), nErrMsg);.  
10ec0 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72 4d  }.  return zErrM
10ed0 73 67 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 5f 5f  sg;.}..#ifdef __
10ee0 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20 41 74  linux__./*.** At
10ef0 74 65 6d 70 74 20 74 6f 20 64 69 73 70 6c 61 79  tempt to display
10f00 20 49 2f 4f 20 73 74 61 74 73 20 6f 6e 20 4c 69   I/O stats on Li
10f10 6e 75 78 20 75 73 69 6e 67 20 2f 70 72 6f 63 2f  nux using /proc/
10f20 50 49 44 2f 69 6f 0a 2a 2f 0a 73 74 61 74 69 63  PID/io.*/.static
10f30 20 76 6f 69 64 20 64 69 73 70 6c 61 79 4c 69 6e   void displayLin
10f40 75 78 49 6f 53 74 61 74 73 28 46 49 4c 45 20 2a  uxIoStats(FILE *
10f50 6f 75 74 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e  out){.  FILE *in
10f60 3b 0a 20 20 63 68 61 72 20 7a 5b 32 30 30 5d 3b  ;.  char z[200];
10f70 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
10f80 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
10f90 2c 20 22 2f 70 72 6f 63 2f 25 64 2f 69 6f 22 2c  , "/proc/%d/io",
10fa0 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 69 6e   getpid());.  in
10fb0 20 3d 20 66 6f 70 65 6e 28 7a 2c 20 22 72 62 22   = fopen(z, "rb"
10fc0 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  );.  if( in==0 )
10fd0 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65   return;.  while
10fe0 28 20 66 67 65 74 73 28 7a 2c 20 73 69 7a 65 6f  ( fgets(z, sizeo
10ff0 66 28 7a 29 2c 20 69 6e 29 21 3d 30 20 29 7b 0a  f(z), in)!=0 ){.
11000 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
11010 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20   struct {.      
11020 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
11030 74 65 72 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73  tern;.      cons
11040 74 20 63 68 61 72 20 2a 7a 44 65 73 63 3b 0a 20  t char *zDesc;. 
11050 20 20 20 7d 20 61 54 72 61 6e 73 5b 5d 20 3d 20     } aTrans[] = 
11060 7b 0a 20 20 20 20 20 20 7b 20 22 72 63 68 61 72  {.      { "rchar
11070 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  : ",            
11080 20 20 20 20 20 20 22 42 79 74 65 73 20 72 65 63        "Bytes rec
11090 65 69 76 65 64 20 62 79 20 72 65 61 64 28 29 3a  eived by read():
110a0 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 63  " },.      { "wc
110b0 68 61 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20  har: ",         
110c0 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20           "Bytes 
110d0 73 65 6e 74 20 74 6f 20 77 72 69 74 65 28 29 3a  sent to write():
110e0 22 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20  "    },.      { 
110f0 22 73 79 73 63 72 3a 20 22 2c 20 20 20 20 20 20  "syscr: ",      
11100 20 20 20 20 20 20 20 20 20 20 20 20 22 52 65 61              "Rea
11110 64 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  d() system calls
11120 3a 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  :"      },.     
11130 20 7b 20 22 73 79 73 63 77 3a 20 22 2c 20 20 20   { "syscw: ",   
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11150 57 72 69 74 65 28 29 20 73 79 73 74 65 6d 20 63  Write() system c
11160 61 6c 6c 73 3a 22 20 20 20 20 20 7d 2c 0a 20 20  alls:"     },.  
11170 20 20 20 20 7b 20 22 72 65 61 64 5f 62 79 74 65      { "read_byte
11180 73 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20  s: ",           
11190 20 20 22 42 79 74 65 73 20 72 65 61 64 20 66 72    "Bytes read fr
111a0 6f 6d 20 73 74 6f 72 61 67 65 3a 22 20 20 7d 2c  om storage:"  },
111b0 0a 20 20 20 20 20 20 7b 20 22 77 72 69 74 65 5f  .      { "write_
111c0 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20 20 20  bytes: ",       
111d0 20 20 20 20 20 22 42 79 74 65 73 20 77 72 69 74       "Bytes writ
111e0 74 65 6e 20 74 6f 20 73 74 6f 72 61 67 65 3a 22  ten to storage:"
111f0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 61 6e   },.      { "can
11200 63 65 6c 6c 65 64 5f 77 72 69 74 65 5f 62 79 74  celled_write_byt
11210 65 73 3a 20 22 2c 20 20 22 43 61 6e 63 65 6c 6c  es: ",  "Cancell
11220 65 64 20 77 72 69 74 65 20 62 79 74 65 73 3a 22  ed write bytes:"
11230 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20      },.    };.  
11240 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
11250 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
11260 65 28 61 54 72 61 6e 73 29 3b 20 69 2b 2b 29 7b  e(aTrans); i++){
11270 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
11280 74 72 6c 65 6e 33 30 28 61 54 72 61 6e 73 5b 69  trlen30(aTrans[i
11290 5d 2e 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20  ].zPattern);.   
112a0 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61     if( strncmp(a
112b0 54 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72  Trans[i].zPatter
112c0 6e 2c 20 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  n, z, n)==0 ){. 
112d0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
112e0 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  tf(out, "%-36s %
112f0 73 22 2c 20 61 54 72 61 6e 73 5b 69 5d 2e 7a 44  s", aTrans[i].zD
11300 65 73 63 2c 20 26 7a 5b 6e 5d 29 3b 0a 20 20 20  esc, &z[n]);.   
11310 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11320 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
11330 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 7d 0a 23 65  fclose(in);.}.#e
11340 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70  ndif../*.** Disp
11350 6c 61 79 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e  lay a single lin
11360 65 20 6f 66 20 73 74 61 74 75 73 20 75 73 69 6e  e of status usin
11370 67 20 36 34 2d 62 69 74 20 76 61 6c 75 65 73 2e  g 64-bit values.
11380 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11390 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28  displayStatLine(
113a0 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
113b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
113c0 54 68 65 20 73 68 65 6c 6c 20 63 6f 6e 74 65 78  The shell contex
113d0 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4c 61  t */.  char *zLa
113e0 62 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  bel,            
113f0 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
11400 69 73 20 6f 6e 65 20 6c 69 6e 65 20 2a 2f 0a 20  is one line */. 
11410 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
11420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
11430 72 6d 61 74 20 66 6f 72 20 74 68 65 20 72 65 73  rmat for the res
11440 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  ult */.  int iSt
11450 61 74 75 73 43 74 72 6c 2c 20 20 20 20 20 20 20  atusCtrl,       
11460 20 20 20 2f 2a 20 57 68 69 63 68 20 73 74 61 74     /* Which stat
11470 75 73 20 74 6f 20 64 69 73 70 6c 61 79 20 2a 2f  us to display */
11480 0a 20 20 69 6e 74 20 62 52 65 73 65 74 20 20 20  .  int bReset   
11490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
114a0 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 74 68  True to reset th
114b0 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20  e stats */.){.  
114c0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43  sqlite3_int64 iC
114d0 75 72 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74  ur = -1;.  sqlit
114e0 65 33 5f 69 6e 74 36 34 20 69 48 69 77 74 72 20  e3_int64 iHiwtr 
114f0 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 2c 20 6e  = -1;.  int i, n
11500 50 65 72 63 65 6e 74 3b 0a 20 20 63 68 61 72 20  Percent;.  char 
11510 7a 4c 69 6e 65 5b 32 30 30 5d 3b 0a 20 20 73 71  zLine[200];.  sq
11520 6c 69 74 65 33 5f 73 74 61 74 75 73 36 34 28 69  lite3_status64(i
11530 53 74 61 74 75 73 43 74 72 6c 2c 20 26 69 43 75  StatusCtrl, &iCu
11540 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
11550 65 74 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  et);.  for(i=0, 
11560 6e 50 65 72 63 65 6e 74 3d 30 3b 20 7a 46 6f 72  nPercent=0; zFor
11570 6d 61 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  mat[i]; i++){.  
11580 20 20 69 66 28 20 7a 46 6f 72 6d 61 74 5b 69 5d    if( zFormat[i]
11590 3d 3d 27 25 27 20 29 20 6e 50 65 72 63 65 6e 74  =='%' ) nPercent
115a0 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  ++;.  }.  if( nP
115b0 65 72 63 65 6e 74 3e 31 20 29 7b 0a 20 20 20 20  ercent>1 ){.    
115c0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
115d0 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20  (sizeof(zLine), 
115e0 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20  zLine, zFormat, 
115f0 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20  iCur, iHiwtr);. 
11600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
11610 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
11620 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e  eof(zLine), zLin
11630 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 69 48 69 77  e, zFormat, iHiw
11640 74 72 29 3b 0a 20 20 7d 0a 20 20 72 61 77 5f 70  tr);.  }.  raw_p
11650 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
11660 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 4c 61 62  -36s %s\n", zLab
11670 65 6c 2c 20 7a 4c 69 6e 65 29 3b 0a 7d 0a 0a 2f  el, zLine);.}../
11680 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 6d 65 6d  *.** Display mem
11690 6f 72 79 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74  ory stats..*/.st
116a0 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79  atic int display
116b0 5f 73 74 61 74 73 28 0a 20 20 73 71 6c 69 74 65  _stats(.  sqlite
116c0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
116d0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
116e0 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20  e to query */.  
116f0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67  ShellState *pArg
11700 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
11710 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53  ointer to ShellS
11720 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52  tate */.  int bR
11730 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  eset            
11740 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
11750 20 72 65 73 65 74 20 74 68 65 20 73 74 61 74 73   reset the stats
11760 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75   */.){.  int iCu
11770 72 3b 0a 20 20 69 6e 74 20 69 48 69 77 74 72 3b  r;.  int iHiwtr;
11780 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20 20  .  FILE *out;.  
11790 69 66 28 20 70 41 72 67 3d 3d 30 20 7c 7c 20 70  if( pArg==0 || p
117a0 41 72 67 2d 3e 6f 75 74 3d 3d 30 20 29 20 72 65  Arg->out==0 ) re
117b0 74 75 72 6e 20 30 3b 0a 20 20 6f 75 74 20 3d 20  turn 0;.  out = 
117c0 70 41 72 67 2d 3e 6f 75 74 3b 0a 0a 20 20 69 66  pArg->out;..  if
117d0 28 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 26 26  ( pArg->pStmt &&
117e0 20 28 70 41 72 67 2d 3e 73 74 61 74 73 4f 6e 20   (pArg->statsOn 
117f0 26 20 32 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  & 2) ){.    int 
11800 6e 43 6f 6c 2c 20 69 2c 20 78 3b 0a 20 20 20 20  nCol, i, x;.    
11810 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
11820 74 6d 74 20 3d 20 70 41 72 67 2d 3e 70 53 74 6d  tmt = pArg->pStm
11830 74 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30  t;.    char z[10
11840 30 5d 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 73  0];.    nCol = s
11850 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
11860 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
11870 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
11880 22 25 2d 33 36 73 20 25 64 5c 6e 22 2c 20 22 4e  "%-36s %d\n", "N
11890 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
118a0 63 6f 6c 75 6d 6e 73 3a 22 2c 20 6e 43 6f 6c 29  columns:", nCol)
118b0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
118c0 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
118d0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
118e0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 7a 2c  ntf(sizeof(z),z,
118f0 22 43 6f 6c 75 6d 6e 20 25 64 20 25 6e 6e 61 6d  "Column %d %nnam
11900 65 3a 22 2c 20 69 2c 20 26 78 29 3b 0a 20 20 20  e:", i, &x);.   
11910 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
11920 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22  ut, "%-36s %s\n"
11930 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  , z, sqlite3_col
11940 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69  umn_name(pStmt,i
11950 29 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ));.#ifndef SQLI
11960 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
11970 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
11980 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c  nprintf(30, z+x,
11990 20 22 64 65 63 6c 61 72 65 64 20 74 79 70 65 3a   "declared type:
119a0 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  ");.      utf8_p
119b0 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36  rintf(out, "%-36
119c0 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69  s %s\n", z, sqli
119d0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74  te3_column_declt
119e0 79 70 65 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a  ype(pStmt, i));.
119f0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
11a00 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
11a10 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
11a20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
11a30 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22 64 61 74  tf(30, z+x, "dat
11a40 61 62 61 73 65 20 6e 61 6d 65 3a 22 29 3b 0a 20  abase name:");. 
11a50 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
11a60 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c  (out, "%-36s %s\
11a70 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63  n", z, sqlite3_c
11a80 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e  olumn_database_n
11a90 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20  ame(pStmt,i));. 
11aa0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
11ab0 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22  rintf(30, z+x, "
11ac0 74 61 62 6c 65 20 6e 61 6d 65 3a 22 29 3b 0a 20  table name:");. 
11ad0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
11ae0 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c  (out, "%-36s %s\
11af0 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63  n", z, sqlite3_c
11b00 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65  olumn_table_name
11b10 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20  (pStmt,i));.    
11b20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
11b30 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22 6f 72 69  tf(30, z+x, "ori
11b40 67 69 6e 20 6e 61 6d 65 3a 22 29 3b 0a 20 20 20  gin name:");.   
11b50 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
11b60 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22  ut, "%-36s %s\n"
11b70 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  , z, sqlite3_col
11b80 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 28  umn_origin_name(
11b90 70 53 74 6d 74 2c 69 29 29 3b 0a 23 65 6e 64 69  pStmt,i));.#endi
11ba0 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64  f.    }.  }..  d
11bb0 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
11bc0 41 72 67 2c 20 22 4d 65 6d 6f 72 79 20 55 73 65  Arg, "Memory Use
11bd0 64 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20  d:",.     "%lld 
11be0 28 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73  (max %lld) bytes
11bf0 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53  ", SQLITE_STATUS
11c00 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 62 52  _MEMORY_USED, bR
11c10 65 73 65 74 29 3b 0a 20 20 64 69 73 70 6c 61 79  eset);.  display
11c20 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
11c30 4e 75 6d 62 65 72 20 6f 66 20 4f 75 74 73 74 61  Number of Outsta
11c40 6e 64 69 6e 67 20 41 6c 6c 6f 63 61 74 69 6f 6e  nding Allocation
11c50 73 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20  s:",.     "%lld 
11c60 28 6d 61 78 20 25 6c 6c 64 29 22 2c 20 53 51 4c  (max %lld)", SQL
11c70 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f  ITE_STATUS_MALLO
11c80 43 5f 43 4f 55 4e 54 2c 20 62 52 65 73 65 74 29  C_COUNT, bReset)
11c90 3b 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68  ;.  if( pArg->sh
11ca0 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f  ellFlgs & SHFLG_
11cb0 50 61 67 65 63 61 63 68 65 20 29 7b 0a 20 20 20  Pagecache ){.   
11cc0 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
11cd0 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f  (pArg, "Number o
11ce0 66 20 50 63 61 63 68 65 20 50 61 67 65 73 20 55  f Pcache Pages U
11cf0 73 65 64 3a 22 2c 0a 20 20 20 20 20 20 20 22 25  sed:",.       "%
11d00 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20 70  lld (max %lld) p
11d10 61 67 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54  ages", SQLITE_ST
11d20 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 55  ATUS_PAGECACHE_U
11d30 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  SED, bReset);.  
11d40 7d 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c  }.  displayStatL
11d50 69 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65  ine(pArg, "Numbe
11d60 72 20 6f 66 20 50 63 61 63 68 65 20 4f 76 65 72  r of Pcache Over
11d70 66 6c 6f 77 20 42 79 74 65 73 3a 22 2c 0a 20 20  flow Bytes:",.  
11d80 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c     "%lld (max %l
11d90 6c 64 29 20 62 79 74 65 73 22 2c 20 53 51 4c 49  ld) bytes", SQLI
11da0 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41  TE_STATUS_PAGECA
11db0 43 48 45 5f 4f 56 45 52 46 4c 4f 57 2c 20 62 52  CHE_OVERFLOW, bR
11dc0 65 73 65 74 29 3b 0a 20 20 64 69 73 70 6c 61 79  eset);.  display
11dd0 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
11de0 4c 61 72 67 65 73 74 20 41 6c 6c 6f 63 61 74 69  Largest Allocati
11df0 6f 6e 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64  on:",.     "%lld
11e00 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f   bytes", SQLITE_
11e10 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49  STATUS_MALLOC_SI
11e20 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64  ZE, bReset);.  d
11e30 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
11e40 41 72 67 2c 20 22 4c 61 72 67 65 73 74 20 50 63  Arg, "Largest Pc
11e50 61 63 68 65 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a  ache Allocation:
11e60 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 62 79  ",.     "%lld by
11e70 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41  tes", SQLITE_STA
11e80 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 53 49  TUS_PAGECACHE_SI
11e90 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a 23 69 66  ZE, bReset);.#if
11ea0 64 65 66 20 59 59 54 52 41 43 4b 4d 41 58 53 54  def YYTRACKMAXST
11eb0 41 43 4b 44 45 50 54 48 0a 20 20 64 69 73 70 6c  ACKDEPTH.  displ
11ec0 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c  ayStatLine(pArg,
11ed0 20 22 44 65 65 70 65 73 74 20 50 61 72 73 65 72   "Deepest Parser
11ee0 20 53 74 61 63 6b 3a 22 2c 0a 20 20 20 20 20 22   Stack:",.     "
11ef0 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 22  %lld (max %lld)"
11f00 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  , SQLITE_STATUS_
11f10 50 41 52 53 45 52 5f 53 54 41 43 4b 2c 20 62 52  PARSER_STACK, bR
11f20 65 73 65 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  eset);.#endif.. 
11f30 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 69   if( db ){.    i
11f40 66 28 20 70 41 72 67 2d 3e 73 68 65 6c 6c 46 6c  f( pArg->shellFl
11f50 67 73 20 26 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61  gs & SHFLG_Looka
11f60 73 69 64 65 20 29 7b 0a 20 20 20 20 20 20 69 48  side ){.      iH
11f70 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
11f80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
11f90 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
11fa0 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f  LITE_DBSTATUS_LO
11fb0 4f 4b 41 53 49 44 45 5f 55 53 45 44 2c 0a 20 20  OKASIDE_USED,.  
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fd0 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48        &iCur, &iH
11fe0 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
11ff0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
12000 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20 20  pArg->out,.     
12010 20 20 20 20 20 20 20 20 20 22 4c 6f 6f 6b 61 73           "Lookas
12020 69 64 65 20 53 6c 6f 74 73 20 55 73 65 64 3a 20  ide Slots Used: 
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12040 64 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c 0a 20  d (max %d)\n",. 
12050 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75               iCu
12060 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20  r, iHiwtr);.    
12070 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
12080 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
12090 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44  BSTATUS_LOOKASID
120a0 45 5f 48 49 54 2c 0a 20 20 20 20 20 20 20 20 20  E_HIT,.         
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
120c0 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
120d0 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61  Reset);.      ra
120e0 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
120f0 75 74 2c 20 22 53 75 63 63 65 73 73 66 75 6c 20  ut, "Successful 
12100 6c 6f 6f 6b 61 73 69 64 65 20 61 74 74 65 6d 70  lookaside attemp
12110 74 73 3a 20 20 20 20 20 20 20 25 64 5c 6e 22 2c  ts:       %d\n",
12120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
12130 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71  Hiwtr);.      sq
12140 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
12150 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
12160 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49  TUS_LOOKASIDE_MI
12170 53 53 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20  SS_SIZE,.       
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12190 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
121a0 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20   bReset);.      
121b0 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
121c0 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65  >out, "Lookaside
121d0 20 66 61 69 6c 75 72 65 73 20 64 75 65 20 74 6f   failures due to
121e0 20 73 69 7a 65 3a 20 20 20 20 20 20 25 64 5c 6e   size:      %d\n
121f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
12200 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20   iHiwtr);.      
12210 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
12220 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
12230 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f  TATUS_LOOKASIDE_
12240 4d 49 53 53 5f 46 55 4c 4c 2c 0a 20 20 20 20 20  MISS_FULL,.     
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12260 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74     &iCur, &iHiwt
12270 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
12280 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12290 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69  g->out, "Lookasi
122a0 64 65 20 66 61 69 6c 75 72 65 73 20 64 75 65 20  de failures due 
122b0 74 6f 20 4f 4f 4d 3a 20 20 20 20 20 20 20 25 64  to OOM:       %d
122c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
122d0 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20     iHiwtr);.    
122e0 7d 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  }.    iHiwtr = i
122f0 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
12300 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
12310 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
12320 54 55 53 5f 43 41 43 48 45 5f 55 53 45 44 2c 20  TUS_CACHE_USED, 
12330 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
12340 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
12350 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12360 74 2c 20 22 50 61 67 65 72 20 48 65 61 70 20 55  t, "Pager Heap U
12370 73 61 67 65 3a 20 20 20 20 20 20 20 20 20 20 20  sage:           
12380 20 20 20 20 20 20 20 20 20 25 64 20 62 79 74 65           %d byte
12390 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
123a0 20 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69    iCur);.    iHi
123b0 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
123c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
123d0 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
123e0 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45  E_DBSTATUS_CACHE
123f0 5f 48 49 54 2c 20 26 69 43 75 72 2c 20 26 69 48  _HIT, &iCur, &iH
12400 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61  iwtr, 1);.    ra
12410 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
12420 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20  ut, "Page cache 
12430 68 69 74 73 3a 20 20 20 20 20 20 20 20 20 20 20  hits:           
12440 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
12450 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77   iCur);.    iHiw
12460 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
12470 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
12480 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
12490 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
124a0 4d 49 53 53 2c 20 26 69 43 75 72 2c 20 26 69 48  MISS, &iCur, &iH
124b0 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61  iwtr, 1);.    ra
124c0 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
124d0 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20  ut, "Page cache 
124e0 6d 69 73 73 65 73 3a 20 20 20 20 20 20 20 20 20  misses:         
124f0 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
12500 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77   iCur);.    iHiw
12510 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
12520 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
12530 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
12540 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
12550 57 52 49 54 45 2c 20 26 69 43 75 72 2c 20 26 69  WRITE, &iCur, &i
12560 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72  Hiwtr, 1);.    r
12570 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
12580 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65  out, "Page cache
12590 20 77 72 69 74 65 73 3a 20 20 20 20 20 20 20 20   writes:        
125a0 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
125b0 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69  , iCur);.    iHi
125c0 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
125d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
125e0 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
125f0 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45  E_DBSTATUS_CACHE
12600 5f 53 50 49 4c 4c 2c 20 26 69 43 75 72 2c 20 26  _SPILL, &iCur, &
12610 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20  iHiwtr, 1);.    
12620 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
12630 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68  >out, "Page cach
12640 65 20 73 70 69 6c 6c 73 3a 20 20 20 20 20 20 20  e spills:       
12650 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
12660 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48  ", iCur);.    iH
12670 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
12680 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
12690 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
126a0 54 45 5f 44 42 53 54 41 54 55 53 5f 53 43 48 45  TE_DBSTATUS_SCHE
126b0 4d 41 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20  MA_USED, &iCur, 
126c0 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
126d0 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
126e0 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 63 68  (pArg->out, "Sch
126f0 65 6d 61 20 48 65 61 70 20 55 73 61 67 65 3a 20  ema Heap Usage: 
12700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12710 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20    %d bytes\n",. 
12720 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72 29             iCur)
12730 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  ;.    iHiwtr = i
12740 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
12750 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
12760 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
12770 54 55 53 5f 53 54 4d 54 5f 55 53 45 44 2c 20 26  TUS_STMT_USED, &
12780 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
12790 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
127a0 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
127b0 2c 20 22 53 74 61 74 65 6d 65 6e 74 20 48 65 61  , "Statement Hea
127c0 70 2f 4c 6f 6f 6b 61 73 69 64 65 20 55 73 61 67  p/Lookaside Usag
127d0 65 3a 20 20 20 20 20 20 25 64 20 62 79 74 65 73  e:      %d bytes
127e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
127f0 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69   iCur);.  }..  i
12800 66 28 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 29  f( pArg->pStmt )
12810 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c  {.    iCur = sql
12820 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
12830 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51  (pArg->pStmt, SQ
12840 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
12850 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 0a 20  FULLSCAN_STEP,. 
12860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 52                bR
12880 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12890 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
128a0 20 22 46 75 6c 6c 73 63 61 6e 20 53 74 65 70 73   "Fullscan Steps
128b0 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
128c0 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
128d0 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
128e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
128f0 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
12900 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
12910 55 53 5f 53 4f 52 54 2c 20 62 52 65 73 65 74 29  US_SORT, bReset)
12920 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
12930 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 6f 72  (pArg->out, "Sor
12940 74 20 4f 70 65 72 61 74 69 6f 6e 73 3a 20 20 20  t Operations:   
12950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12960 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
12970 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74      iCur = sqlit
12980 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
12990 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49  Arg->pStmt, SQLI
129a0 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
129b0 54 4f 49 4e 44 45 58 2c 62 52 65 73 65 74 29 3b  TOINDEX,bReset);
129c0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
129d0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 41 75 74 6f  pArg->out, "Auto
129e0 69 6e 64 65 78 20 49 6e 73 65 72 74 73 3a 20 20  index Inserts:  
129f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a00 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12a10 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65     iCur = sqlite
12a20 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41  3_stmt_status(pA
12a30 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54  rg->pStmt, SQLIT
12a40 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f  E_STMTSTATUS_VM_
12a50 53 54 45 50 2c 20 62 52 65 73 65 74 29 3b 0a 20  STEP, bReset);. 
12a60 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12a70 72 67 2d 3e 6f 75 74 2c 20 22 56 69 72 74 75 61  rg->out, "Virtua
12a80 6c 20 4d 61 63 68 69 6e 65 20 53 74 65 70 73 3a  l Machine Steps:
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12aa0 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
12ab0 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
12ac0 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
12ad0 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
12ae0 53 54 4d 54 53 54 41 54 55 53 5f 52 45 50 52 45  STMTSTATUS_REPRE
12af0 50 41 52 45 2c 20 62 52 65 73 65 74 29 3b 0a 20  PARE, bReset);. 
12b00 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12b10 72 67 2d 3e 6f 75 74 2c 20 22 52 65 70 72 65 70  rg->out, "Reprep
12b20 61 72 65 20 6f 70 65 72 61 74 69 6f 6e 73 3a 20  are operations: 
12b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12b40 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
12b50 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
12b60 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
12b70 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
12b80 53 54 4d 54 53 54 41 54 55 53 5f 52 55 4e 2c 20  STMTSTATUS_RUN, 
12b90 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
12ba0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12bb0 74 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 74 69  t, "Number of ti
12bc0 6d 65 73 20 72 75 6e 3a 20 20 20 20 20 20 20 20  mes run:        
12bd0 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
12be0 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20  iCur);.    iCur 
12bf0 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
12c00 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d  tatus(pArg->pStm
12c10 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  t, SQLITE_STMTST
12c20 41 54 55 53 5f 4d 45 4d 55 53 45 44 2c 20 62 52  ATUS_MEMUSED, bR
12c30 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12c40 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12c50 20 22 4d 65 6d 6f 72 79 20 75 73 65 64 20 62 79   "Memory used by
12c60 20 70 72 65 70 61 72 65 64 20 73 74 6d 74 3a 20   prepared stmt: 
12c70 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
12c80 75 72 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ur);.  }..#ifdef
12c90 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 20 20 64 69 73   __linux__.  dis
12ca0 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73  playLinuxIoStats
12cb0 28 70 41 72 67 2d 3e 6f 75 74 29 3b 0a 23 65 6e  (pArg->out);.#en
12cc0 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  dif..  /* Do not
12cd0 20 72 65 6d 6f 76 65 20 74 68 69 73 20 6d 61 63   remove this mac
12ce0 68 69 6e 65 20 72 65 61 64 61 62 6c 65 20 63 6f  hine readable co
12cf0 6d 6d 65 6e 74 3a 20 65 78 74 72 61 2d 73 74 61  mment: extra-sta
12d00 74 73 2d 6f 75 74 70 75 74 2d 68 65 72 65 20 2a  ts-output-here *
12d10 2f 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  /..  return 0;.}
12d20 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20  ../*.** Display 
12d30 73 63 61 6e 20 73 74 61 74 73 2e 0a 2a 2f 0a 73  scan stats..*/.s
12d40 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c  tatic void displ
12d50 61 79 5f 73 63 61 6e 73 74 61 74 73 28 0a 20 20  ay_scanstats(.  
12d60 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20 71  /* Database to q
12d90 75 65 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c 53  uery */.  ShellS
12da0 74 61 74 65 20 2a 70 41 72 67 20 20 20 20 20 20  tate *pArg      
12db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
12dc0 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61  nter to ShellSta
12dd0 74 65 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  te */.){.#ifndef
12de0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
12df0 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
12e00 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
12e10 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(db);.  UNUSED_
12e20 50 41 52 41 4d 45 54 45 52 28 70 41 72 67 29 3b  PARAMETER(pArg);
12e30 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 69 2c 20  .#else.  int i, 
12e40 6b 2c 20 6e 2c 20 6d 78 3b 0a 20 20 72 61 77 5f  k, n, mx;.  raw_
12e50 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12e60 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 63 61 6e  , "-------- scan
12e70 73 74 61 74 73 20 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  stats --------\n
12e80 22 29 3b 0a 20 20 6d 78 20 3d 20 30 3b 0a 20 20  ");.  mx = 0;.  
12e90 66 6f 72 28 6b 3d 30 3b 20 6b 3c 3d 6d 78 3b 20  for(k=0; k<=mx; 
12ea0 6b 2b 2b 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65  k++){.    double
12eb0 20 72 45 73 74 4c 6f 6f 70 20 3d 20 31 2e 30 3b   rEstLoop = 1.0;
12ec0 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20  .    for(i=n=0; 
12ed0 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  1; i++){.      s
12ee0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 20 3d  qlite3_stmt *p =
12ef0 20 70 41 72 67 2d 3e 70 53 74 6d 74 3b 0a 20 20   pArg->pStmt;.  
12f00 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
12f10 34 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73 69 74 3b  4 nLoop, nVisit;
12f20 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 45  .      double rE
12f30 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  st;.      int iS
12f40 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  id;.      const 
12f50 63 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 0a  char *zExplain;.
12f60 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
12f70 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
12f80 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53  s(p, i, SQLITE_S
12f90 43 41 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20 28  CANSTAT_NLOOP, (
12fa0 76 6f 69 64 2a 29 26 6e 4c 6f 6f 70 29 20 29 7b  void*)&nLoop) ){
12fb0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
12fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
12fd0 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
12fe0 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49  tatus(p, i, SQLI
12ff0 54 45 5f 53 43 41 4e 53 54 41 54 5f 53 45 4c 45  TE_SCANSTAT_SELE
13000 43 54 49 44 2c 20 28 76 6f 69 64 2a 29 26 69 53  CTID, (void*)&iS
13010 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  id);.      if( i
13020 53 69 64 3e 6d 78 20 29 20 6d 78 20 3d 20 69 53  Sid>mx ) mx = iS
13030 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53  id;.      if( iS
13040 69 64 21 3d 6b 20 29 20 63 6f 6e 74 69 6e 75 65  id!=k ) continue
13050 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  ;.      if( n==0
13060 20 29 7b 0a 20 20 20 20 20 20 20 20 72 45 73 74   ){.        rEst
13070 4c 6f 6f 70 20 3d 20 28 64 6f 75 62 6c 65 29 6e  Loop = (double)n
13080 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  Loop;.        if
13090 28 20 6b 3e 30 20 29 20 72 61 77 5f 70 72 69 6e  ( k>0 ) raw_prin
130a0 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d  tf(pArg->out, "-
130b0 2d 2d 2d 2d 2d 2d 2d 20 73 75 62 71 75 65 72 79  ------- subquery
130c0 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 20   %d -------\n", 
130d0 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
130e0 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c    n++;.      sql
130f0 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74  ite3_stmt_scanst
13100 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54  atus(p, i, SQLIT
13110 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56 49 53 49  E_SCANSTAT_NVISI
13120 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56 69 73 69  T, (void*)&nVisi
13130 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
13140 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
13150 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53  s(p, i, SQLITE_S
13160 43 41 4e 53 54 41 54 5f 45 53 54 2c 20 28 76 6f  CANSTAT_EST, (vo
13170 69 64 2a 29 26 72 45 73 74 29 3b 0a 20 20 20 20  id*)&rEst);.    
13180 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
13190 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20  canstatus(p, i, 
131a0 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
131b0 45 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a 29  EXPLAIN, (void*)
131c0 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  &zExplain);.    
131d0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
131e0 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 70 20 25  rg->out, "Loop %
131f0 32 64 3a 20 25 73 5c 6e 22 2c 20 6e 2c 20 7a 45  2d: %s\n", n, zE
13200 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 72  xplain);.      r
13210 45 73 74 4c 6f 6f 70 20 2a 3d 20 72 45 73 74 3b  EstLoop *= rEst;
13220 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
13230 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20  f(pArg->out,.   
13240 20 20 20 20 20 20 20 22 20 20 20 20 20 20 20 20         "        
13250 20 6e 4c 6f 6f 70 3d 25 2d 38 6c 6c 64 20 6e 52   nLoop=%-8lld nR
13260 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77  ow=%-8lld estRow
13270 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77 2f 4c  =%-8lld estRow/L
13280 6f 6f 70 3d 25 2d 38 67 5c 6e 22 2c 0a 20 20 20  oop=%-8g\n",.   
13290 20 20 20 20 20 20 20 6e 4c 6f 6f 70 2c 20 6e 56         nLoop, nV
132a0 69 73 69 74 2c 20 28 73 71 6c 69 74 65 33 5f 69  isit, (sqlite3_i
132b0 6e 74 36 34 29 28 72 45 73 74 4c 6f 6f 70 2b 30  nt64)(rEstLoop+0
132c0 2e 35 29 2c 20 72 45 73 74 0a 20 20 20 20 20 20  .5), rEst.      
132d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
132e0 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
132f0 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  out, "----------
13300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13310 2d 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  -\n");.#endif.}.
13320 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
13330 20 61 7a 41 72 72 61 79 20 70 6f 69 6e 74 73 20   azArray points 
13340 74 6f 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e  to a zero-termin
13350 61 74 65 64 20 61 72 72 61 79 20 6f 66 20 73 74  ated array of st
13360 72 69 6e 67 73 2e 20 7a 53 74 72 0a 2a 2a 20 70  rings. zStr.** p
13370 6f 69 6e 74 73 20 74 6f 20 61 20 73 69 6e 67 6c  oints to a singl
13380 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  e nul-terminated
13390 20 73 74 72 69 6e 67 2e 20 52 65 74 75 72 6e 20   string. Return 
133a0 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 7a 53 74 72  non-zero if zStr
133b0 0a 2a 2a 20 69 73 20 65 71 75 61 6c 2c 20 61 63  .** is equal, ac
133c0 63 6f 72 64 69 6e 67 20 74 6f 20 73 74 72 63 6d  cording to strcm
133d0 70 28 29 2c 20 74 6f 20 61 6e 79 20 6f 66 20 74  p(), to any of t
133e0 68 65 20 73 74 72 69 6e 67 73 20 69 6e 20 74 68  he strings in th
133f0 65 20 61 72 72 61 79 2e 0a 2a 2a 20 4f 74 68 65  e array..** Othe
13400 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 7a 65  rwise, return ze
13410 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
13420 74 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 63  t str_in_array(c
13430 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c  onst char *zStr,
13440 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a   const char **az
13450 41 72 72 61 79 29 7b 0a 20 20 69 6e 74 20 69 3b  Array){.  int i;
13460 0a 20 20 66 6f 72 28 69 3d 30 3b 20 61 7a 41 72  .  for(i=0; azAr
13470 72 61 79 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ray[i]; i++){.  
13480 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28    if( 0==strcmp(
13490 7a 53 74 72 2c 20 61 7a 41 72 72 61 79 5b 69 5d  zStr, azArray[i]
134a0 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
134b0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
134c0 0a 2f 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70 69 6c  ./*.** If compil
134d0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 70 53 71  ed statement pSq
134e0 6c 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  l appears to be 
134f0 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65  an EXPLAIN state
13500 6d 65 6e 74 2c 20 61 6c 6c 6f 63 61 74 65 0a 2a  ment, allocate.*
13510 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74  * and populate t
13520 68 65 20 53 68 65 6c 6c 53 74 61 74 65 2e 61 69  he ShellState.ai
13530 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79 20 77  Indent[] array w
13540 69 74 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ith the number o
13550 66 0a 2a 2a 20 73 70 61 63 65 73 20 65 61 63 68  f.** spaces each
13560 20 6f 70 63 6f 64 65 20 73 68 6f 75 6c 64 20 62   opcode should b
13570 65 20 69 6e 64 65 6e 74 65 64 20 62 65 66 6f 72  e indented befor
13580 65 20 69 74 20 69 73 20 6f 75 74 70 75 74 2e 0a  e it is output..
13590 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 6e 74  **.** The indent
135a0 69 6e 67 20 72 75 6c 65 73 20 61 72 65 3a 0a 2a  ing rules are:.*
135b0 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65  *.**     * For e
135c0 61 63 68 20 22 4e 65 78 74 22 2c 20 22 50 72 65  ach "Next", "Pre
135d0 76 22 2c 20 22 56 4e 65 78 74 22 20 6f 72 20 22  v", "VNext" or "
135e0 56 50 72 65 76 22 20 69 6e 73 74 72 75 63 74 69  VPrev" instructi
135f0 6f 6e 2c 20 69 6e 64 65 6e 74 0a 2a 2a 20 20 20  on, indent.**   
13600 20 20 20 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20      all opcodes 
13610 74 68 61 74 20 6f 63 63 75 72 20 62 65 74 77 65  that occur betwe
13620 65 6e 20 74 68 65 20 70 32 20 6a 75 6d 70 20 64  en the p2 jump d
13630 65 73 74 69 6e 61 74 69 6f 6e 20 61 6e 64 20 74  estination and t
13640 68 65 20 6f 70 63 6f 64 65 0a 2a 2a 20 20 20 20  he opcode.**    
13650 20 20 20 69 74 73 65 6c 66 20 62 79 20 32 20 73     itself by 2 s
13660 70 61 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  paces..**.**    
13670 20 2a 20 46 6f 72 20 65 61 63 68 20 22 47 6f 74   * For each "Got
13680 6f 22 2c 20 69 66 20 74 68 65 20 6a 75 6d 70 20  o", if the jump 
13690 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 65  destination is e
136a0 61 72 6c 69 65 72 20 69 6e 20 74 68 65 20 70 72  arlier in the pr
136b0 6f 67 72 61 6d 0a 2a 2a 20 20 20 20 20 20 20 61  ogram.**       a
136c0 6e 64 20 65 6e 64 73 20 6f 6e 20 6f 6e 65 20 6f  nd ends on one o
136d0 66 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 59  f:.**          Y
136e0 69 65 6c 64 20 20 53 65 65 6b 47 74 20 20 53 65  ield  SeekGt  Se
136f0 65 6b 4c 74 20 20 52 6f 77 53 65 74 52 65 61 64  ekLt  RowSetRead
13700 20 20 52 65 77 69 6e 64 0a 2a 2a 20 20 20 20 20    Rewind.**     
13710 20 20 6f 72 20 69 66 20 74 68 65 20 50 31 20 70    or if the P1 p
13720 61 72 61 6d 65 74 65 72 20 69 73 20 6f 6e 65 20  arameter is one 
13730 69 6e 73 74 65 61 64 20 6f 66 20 7a 65 72 6f 2c  instead of zero,
13740 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 6e 20 69  .**       then i
13750 6e 64 65 6e 74 20 61 6c 6c 20 6f 70 63 6f 64 65  ndent all opcode
13760 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 61  s between the ea
13770 72 6c 69 65 72 20 69 6e 73 74 72 75 63 74 69 6f  rlier instructio
13780 6e 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 22  n.**       and "
13790 47 6f 74 6f 22 20 62 79 20 32 20 73 70 61 63 65  Goto" by 2 space
137a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
137b0 64 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70  d explain_data_p
137c0 72 65 70 61 72 65 28 53 68 65 6c 6c 53 74 61 74  repare(ShellStat
137d0 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73 74  e *p, sqlite3_st
137e0 6d 74 20 2a 70 53 71 6c 29 7b 0a 20 20 63 6f 6e  mt *pSql){.  con
137f0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20  st char *zSql;  
13800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13810 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  The text of the 
13820 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
13830 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13850 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 63 68     /* Used to ch
13860 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 61  eck if this is a
13870 6e 20 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 69  n EXPLAIN */.  i
13880 6e 74 20 2a 61 62 59 69 65 6c 64 20 3d 20 30 3b  nt *abYield = 0;
13890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
138a0 2a 20 54 72 75 65 20 69 66 20 6f 70 20 69 73 20  * True if op is 
138b0 61 6e 20 4f 50 5f 59 69 65 6c 64 20 2a 2f 0a 20  an OP_Yield */. 
138c0 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b   int nAlloc = 0;
138d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138e0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
138f0 7a 65 20 6f 66 20 70 2d 3e 61 69 49 6e 64 65 6e  ze of p->aiInden
13900 74 5b 5d 2c 20 61 62 59 69 65 6c 64 20 2a 2f 0a  t[], abYield */.
13910 20 20 69 6e 74 20 69 4f 70 3b 20 20 20 20 20 20    int iOp;      
13920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13930 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6f 70    /* Index of op
13940 65 72 61 74 69 6f 6e 20 69 6e 20 70 2d 3e 61 69  eration in p->ai
13950 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 0a 20 20 63  Indent[] */..  c
13960 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4e 65 78  onst char *azNex
13970 74 5b 5d 20 3d 20 7b 20 22 4e 65 78 74 22 2c 20  t[] = { "Next", 
13980 22 50 72 65 76 22 2c 20 22 56 50 72 65 76 22 2c  "Prev", "VPrev",
13990 20 22 56 4e 65 78 74 22 2c 20 22 53 6f 72 74 65   "VNext", "Sorte
139a0 72 4e 65 78 74 22 2c 20 30 20 7d 3b 0a 20 20 63  rNext", 0 };.  c
139b0 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 59 69 65  onst char *azYie
139c0 6c 64 5b 5d 20 3d 20 7b 20 22 59 69 65 6c 64 22  ld[] = { "Yield"
139d0 2c 20 22 53 65 65 6b 4c 54 22 2c 20 22 53 65 65  , "SeekLT", "See
139e0 6b 47 54 22 2c 20 22 52 6f 77 53 65 74 52 65 61  kGT", "RowSetRea
139f0 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
13a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a10 22 52 65 77 69 6e 64 22 2c 20 30 20 7d 3b 0a 20  "Rewind", 0 };. 
13a20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 47   const char *azG
13a30 6f 74 6f 5b 5d 20 3d 20 7b 20 22 47 6f 74 6f 22  oto[] = { "Goto"
13a40 2c 20 30 20 7d 3b 0a 0a 20 20 2f 2a 20 54 72 79  , 0 };..  /* Try
13a50 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 69   to figure out i
13a60 66 20 74 68 69 73 20 69 73 20 72 65 61 6c 6c 79  f this is really
13a70 20 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61 74   an EXPLAIN stat
13a80 65 6d 65 6e 74 2e 20 49 66 20 74 68 69 73 0a 20  ement. If this. 
13a90 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 76 65   ** cannot be ve
13aa0 72 69 66 69 65 64 2c 20 72 65 74 75 72 6e 20 65  rified, return e
13ab0 61 72 6c 79 2e 20 20 2a 2f 0a 20 20 69 66 28 20  arly.  */.  if( 
13ac0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
13ad0 6f 75 6e 74 28 70 53 71 6c 29 21 3d 38 20 29 7b  ount(pSql)!=8 ){
13ae0 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20  .    p->cMode = 
13af0 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65 74  p->mode;.    ret
13b00 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20  urn;.  }.  zSql 
13b10 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53  = sqlite3_sql(pS
13b20 71 6c 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  ql);.  if( zSql=
13b30 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
13b40 6f 72 28 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d 3d 27  or(z=zSql; *z=='
13b50 20 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27 20 7c   ' || *z=='\t' |
13b60 7c 20 2a 7a 3d 3d 27 5c 6e 27 20 7c 7c 20 2a 7a  | *z=='\n' || *z
13b70 3d 3d 27 5c 66 27 20 7c 7c 20 2a 7a 3d 3d 27 5c  =='\f' || *z=='\
13b80 72 27 3b 20 7a 2b 2b 29 3b 0a 20 20 69 66 28 20  r'; z++);.  if( 
13b90 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
13ba0 28 7a 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 37  (z, "explain", 7
13bb0 29 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64  ) ){.    p->cMod
13bc0 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20  e = p->mode;.   
13bd0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
13be0 66 6f 72 28 69 4f 70 3d 30 3b 20 53 51 4c 49 54  for(iOp=0; SQLIT
13bf0 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
13c00 74 65 70 28 70 53 71 6c 29 3b 20 69 4f 70 2b 2b  tep(pSql); iOp++
13c10 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
13c20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71    int iAddr = sq
13c30 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
13c40 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 63  (pSql, 0);.    c
13c50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d  onst char *zOp =
13c60 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
13c70 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
13c80 74 28 70 53 71 6c 2c 20 31 29 3b 0a 0a 20 20 20  t(pSql, 1);..   
13c90 20 2f 2a 20 53 65 74 20 70 32 20 74 6f 20 74 68   /* Set p2 to th
13ca0 65 20 50 32 20 66 69 65 6c 64 20 6f 66 20 74 68  e P2 field of th
13cb0 65 20 63 75 72 72 65 6e 74 20 6f 70 63 6f 64 65  e current opcode
13cc0 2e 20 54 68 65 6e 2c 20 61 73 73 75 6d 69 6e 67  . Then, assuming
13cd0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 70 32 20   that.    ** p2 
13ce0 69 73 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  is an instructio
13cf0 6e 20 61 64 64 72 65 73 73 2c 20 73 65 74 20 76  n address, set v
13d00 61 72 69 61 62 6c 65 20 70 32 6f 70 20 74 6f 20  ariable p2op to 
13d10 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
13d20 74 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63  t.    ** instruc
13d30 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 69 49 6e  tion in the aiIn
13d40 64 65 6e 74 5b 5d 20 61 72 72 61 79 2e 20 70 32  dent[] array. p2
13d50 20 61 6e 64 20 70 32 6f 70 20 6d 61 79 20 62 65   and p2op may be
13d60 20 64 69 66 66 65 72 65 6e 74 20 69 66 0a 20 20   different if.  
13d70 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
13d80 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
13d90 70 61 72 74 20 6f 66 20 61 20 73 75 62 2d 70 72  part of a sub-pr
13da0 6f 67 72 61 6d 20 67 65 6e 65 72 61 74 65 64 20  ogram generated 
13db0 62 79 20 61 6e 0a 20 20 20 20 2a 2a 20 53 51 4c  by an.    ** SQL
13dc0 20 74 72 69 67 67 65 72 20 6f 72 20 66 6f 72 65   trigger or fore
13dd0 69 67 6e 20 6b 65 79 2e 20 20 2a 2f 0a 20 20 20  ign key.  */.   
13de0 20 69 6e 74 20 70 32 20 3d 20 73 71 6c 69 74 65   int p2 = sqlite
13df0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71  3_column_int(pSq
13e00 6c 2c 20 33 29 3b 0a 20 20 20 20 69 6e 74 20 70  l, 3);.    int p
13e10 32 6f 70 20 3d 20 28 70 32 20 2b 20 28 69 4f 70  2op = (p2 + (iOp
13e20 2d 69 41 64 64 72 29 29 3b 0a 0a 20 20 20 20 2f  -iAddr));..    /
13e30 2a 20 47 72 6f 77 20 74 68 65 20 70 2d 3e 61 69  * Grow the p->ai
13e40 49 6e 64 65 6e 74 20 61 72 72 61 79 20 61 73 20  Indent array as 
13e50 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20  required */.    
13e60 69 66 28 20 69 4f 70 3e 3d 6e 41 6c 6c 6f 63 20  if( iOp>=nAlloc 
13e70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 70  ){.      if( iOp
13e80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
13e90 2a 20 44 6f 20 66 75 72 74 68 65 72 20 76 65 72  * Do further ver
13ea0 66 69 63 61 74 69 6f 6e 20 74 68 61 74 20 74 68  fication that th
13eb0 69 73 20 69 73 20 65 78 70 6c 61 69 6e 20 6f 75  is is explain ou
13ec0 74 70 75 74 2e 20 20 41 62 6f 72 74 20 69 66 0a  tput.  Abort if.
13ed0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73          ** it is
13ee0 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20   not */.        
13ef0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
13f00 72 20 2a 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 5d  r *explainCols[]
13f10 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
13f20 22 61 64 64 72 22 2c 20 22 6f 70 63 6f 64 65 22  "addr", "opcode"
13f30 2c 20 22 70 31 22 2c 20 22 70 32 22 2c 20 22 70  , "p1", "p2", "p
13f40 33 22 2c 20 22 70 34 22 2c 20 22 70 35 22 2c 20  3", "p4", "p5", 
13f50 22 63 6f 6d 6d 65 6e 74 22 20 7d 3b 0a 20 20 20  "comment" };.   
13f60 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20       int jj;.   
13f70 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a       for(jj=0; j
13f80 6a 3c 41 72 72 61 79 53 69 7a 65 28 65 78 70 6c  j<ArraySize(expl
13f90 61 69 6e 43 6f 6c 73 29 3b 20 6a 6a 2b 2b 29 7b  ainCols); jj++){
13fa0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
13fb0 74 72 63 6d 70 28 73 71 6c 69 74 65 33 5f 63 6f  trcmp(sqlite3_co
13fc0 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 71 6c 2c 6a  lumn_name(pSql,j
13fd0 6a 29 2c 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 6a  j),explainCols[j
13fe0 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  j])!=0 ){.      
13ff0 20 20 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d        p->cMode =
14000 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20   p->mode;.      
14010 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
14020 73 65 74 28 70 53 71 6c 29 3b 0a 20 20 20 20 20  set(pSql);.     
14030 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
14040 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14050 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14060 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31 30 30     nAlloc += 100
14070 3b 0a 20 20 20 20 20 20 70 2d 3e 61 69 49 6e 64  ;.      p->aiInd
14080 65 6e 74 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69  ent = (int*)sqli
14090 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d  te3_realloc64(p-
140a0 3e 61 69 49 6e 64 65 6e 74 2c 20 6e 41 6c 6c 6f  >aiIndent, nAllo
140b0 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a  c*sizeof(int));.
140c0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 69 49        if( p->aiI
140d0 6e 64 65 6e 74 3d 3d 30 20 29 20 73 68 65 6c 6c  ndent==0 ) shell
140e0 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29  _out_of_memory()
140f0 3b 0a 20 20 20 20 20 20 61 62 59 69 65 6c 64 20  ;.      abYield 
14100 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f  = (int*)sqlite3_
14110 72 65 61 6c 6c 6f 63 36 34 28 61 62 59 69 65 6c  realloc64(abYiel
14120 64 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  d, nAlloc*sizeof
14130 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66  (int));.      if
14140 28 20 61 62 59 69 65 6c 64 3d 3d 30 20 29 20 73  ( abYield==0 ) s
14150 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
14160 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ry();.    }.    
14170 61 62 59 69 65 6c 64 5b 69 4f 70 5d 20 3d 20 73  abYield[iOp] = s
14180 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c  tr_in_array(zOp,
14190 20 61 7a 59 69 65 6c 64 29 3b 0a 20 20 20 20 70   azYield);.    p
141a0 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 4f 70 5d 20  ->aiIndent[iOp] 
141b0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 49 6e 64  = 0;.    p->nInd
141c0 65 6e 74 20 3d 20 69 4f 70 2b 31 3b 0a 0a 20 20  ent = iOp+1;..  
141d0 20 20 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72    if( str_in_arr
141e0 61 79 28 7a 4f 70 2c 20 61 7a 4e 65 78 74 29 20  ay(zOp, azNext) 
141f0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  ){.      for(i=p
14200 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29  2op; i<iOp; i++)
14210 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20   p->aiIndent[i] 
14220 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  += 2;.    }.    
14230 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79  if( str_in_array
14240 28 7a 4f 70 2c 20 61 7a 47 6f 74 6f 29 20 26 26  (zOp, azGoto) &&
14250 20 70 32 6f 70 3c 70 2d 3e 6e 49 6e 64 65 6e 74   p2op<p->nIndent
14260 0a 20 20 20 20 20 26 26 20 28 61 62 59 69 65 6c  .     && (abYiel
14270 64 5b 70 32 6f 70 5d 20 7c 7c 20 73 71 6c 69 74  d[p2op] || sqlit
14280 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
14290 71 6c 2c 20 32 29 29 0a 20 20 20 20 29 7b 0a 20  ql, 2)).    ){. 
142a0 20 20 20 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b       for(i=p2op;
142b0 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e   i<iOp; i++) p->
142c0 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32  aiIndent[i] += 2
142d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
142e0 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20  ->iIndent = 0;. 
142f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 62   sqlite3_free(ab
14300 59 69 65 6c 64 29 3b 0a 20 20 73 71 6c 69 74 65  Yield);.  sqlite
14310 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b 0a 7d  3_reset(pSql);.}
14320 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
14330 20 61 72 72 61 79 20 61 6c 6c 6f 63 61 74 65 64   array allocated
14340 20 62 79 20 65 78 70 6c 61 69 6e 5f 64 61 74 61   by explain_data
14350 5f 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73  _prepare()..*/.s
14360 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
14370 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 53  in_data_delete(S
14380 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
14390 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
143a0 3e 61 69 49 6e 64 65 6e 74 29 3b 0a 20 20 70 2d  >aiIndent);.  p-
143b0 3e 61 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20  >aiIndent = 0;. 
143c0 20 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 30 3b   p->nIndent = 0;
143d0 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20  .  p->iIndent = 
143e0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61  0;.}../*.** Disa
143f0 62 6c 65 20 61 6e 64 20 72 65 73 74 6f 72 65 20  ble and restore 
14400 2e 77 68 65 72 65 74 72 61 63 65 20 61 6e 64 20  .wheretrace and 
14410 2e 73 65 6c 65 63 74 74 72 61 63 65 20 73 65 74  .selecttrace set
14420 74 69 6e 67 73 2e 0a 2a 2f 0a 23 69 66 20 64 65  tings..*/.#if de
14430 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
14440 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
14450 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c  QLITE_ENABLE_SEL
14460 45 43 54 54 52 41 43 45 29 0a 65 78 74 65 72 6e  ECTTRACE).extern
14470 20 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65   int sqlite3Sele
14480 63 74 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20  ctTrace;.static 
14490 69 6e 74 20 73 61 76 65 64 53 65 6c 65 63 74 54  int savedSelectT
144a0 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66  race;.#endif.#if
144b0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
144c0 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65  DEBUG) && define
144d0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
144e0 57 48 45 52 45 54 52 41 43 45 29 0a 65 78 74 65  WHERETRACE).exte
144f0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57 68  rn int sqlite3Wh
14500 65 72 65 54 72 61 63 65 3b 0a 73 74 61 74 69 63  ereTrace;.static
14510 20 69 6e 74 20 73 61 76 65 64 57 68 65 72 65 54   int savedWhereT
14520 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 73 74 61  race;.#endif.sta
14530 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65  tic void disable
14540 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64  _debug_trace_mod
14550 65 73 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65  es(void){.#if de
14560 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
14570 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
14580 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c  QLITE_ENABLE_SEL
14590 45 43 54 54 52 41 43 45 29 0a 20 20 73 61 76 65  ECTTRACE).  save
145a0 64 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73  dSelectTrace = s
145b0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
145c0 65 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  e;.  sqlite3Sele
145d0 63 74 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  ctTrace = 0;.#en
145e0 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
145f0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
14600 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
14610 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43  ENABLE_WHERETRAC
14620 45 29 0a 20 20 73 61 76 65 64 57 68 65 72 65 54  E).  savedWhereT
14630 72 61 63 65 20 3d 20 73 71 6c 69 74 65 33 57 68  race = sqlite3Wh
14640 65 72 65 54 72 61 63 65 3b 0a 20 20 73 71 6c 69  ereTrace;.  sqli
14650 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
14660 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74  0;.#endif.}.stat
14670 69 63 20 76 6f 69 64 20 72 65 73 74 6f 72 65 5f  ic void restore_
14680 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65  debug_trace_mode
14690 73 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66  s(void){.#if def
146a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
146b0 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
146c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45  LITE_ENABLE_SELE
146d0 43 54 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74  CTTRACE).  sqlit
146e0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20  e3SelectTrace = 
146f0 73 61 76 65 64 53 65 6c 65 63 74 54 72 61 63 65  savedSelectTrace
14700 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
14710 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
14720 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
14730 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
14740 45 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65  ETRACE).  sqlite
14750 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 73 61  3WhereTrace = sa
14760 76 65 64 57 68 65 72 65 54 72 61 63 65 3b 0a 23  vedWhereTrace;.#
14770 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 43 72 65 61  endif.}../* Crea
14780 74 65 20 74 68 65 20 54 45 4d 50 20 74 61 62 6c  te the TEMP tabl
14790 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  e used to store 
147a0 70 61 72 61 6d 65 74 65 72 20 62 69 6e 64 69 6e  parameter bindin
147b0 67 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  gs */.static voi
147c0 64 20 62 69 6e 64 5f 74 61 62 6c 65 5f 69 6e 69  d bind_table_ini
147d0 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  t(ShellState *p)
147e0 7b 0a 20 20 69 6e 74 20 77 72 53 63 68 65 6d 61  {.  int wrSchema
147f0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
14800 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c  db_config(p->db,
14810 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
14820 5f 57 52 49 54 41 42 4c 45 5f 53 43 48 45 4d 41  _WRITABLE_SCHEMA
14830 2c 20 2d 31 2c 20 26 77 72 53 63 68 65 6d 61 29  , -1, &wrSchema)
14840 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  ;.  sqlite3_db_c
14850 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20 53 51 4c  onfig(p->db, SQL
14860 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 57 52 49  ITE_DBCONFIG_WRI
14870 54 41 42 4c 45 5f 53 43 48 45 4d 41 2c 20 31 2c  TABLE_SCHEMA, 1,
14880 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65   0);.  sqlite3_e
14890 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22  xec(p->db,.    "
148a0 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20  CREATE TABLE IF 
148b0 4e 4f 54 20 45 58 49 53 54 53 20 74 65 6d 70 2e  NOT EXISTS temp.
148c0 73 71 6c 69 74 65 5f 70 61 72 61 6d 65 74 65 72  sqlite_parameter
148d0 73 28 5c 6e 22 0a 20 20 20 20 22 20 20 6b 65 79  s(\n".    "  key
148e0 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45   TEXT PRIMARY KE
148f0 59 2c 5c 6e 22 0a 20 20 20 20 22 20 20 76 61 6c  Y,\n".    "  val
14900 75 65 20 41 4e 59 5c 6e 22 0a 20 20 20 20 22 29  ue ANY\n".    ")
14910 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 22   WITHOUT ROWID;"
14920 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a  ,.    0, 0, 0);.
14930 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
14940 66 69 67 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54  fig(p->db, SQLIT
14950 45 5f 44 42 43 4f 4e 46 49 47 5f 57 52 49 54 41  E_DBCONFIG_WRITA
14960 42 4c 45 5f 53 43 48 45 4d 41 2c 20 77 72 53 63  BLE_SCHEMA, wrSc
14970 68 65 6d 61 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  hema, 0);.}../*.
14980 2a 2a 20 42 69 6e 64 20 70 61 72 61 6d 65 74 65  ** Bind paramete
14990 72 73 20 6f 6e 20 61 20 70 72 65 70 61 72 65 64  rs on a prepared
149a0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
149b0 2a 20 50 61 72 61 6d 65 74 65 72 20 62 69 6e 64  * Parameter bind
149c0 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66  ings are taken f
149d0 72 6f 6d 20 61 20 54 45 4d 50 20 74 61 62 6c 65  rom a TEMP table
149e0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
149f0 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20 54 45  .**    CREATE TE
14a00 4d 50 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  MP TABLE sqlite_
14a10 70 61 72 61 6d 65 74 65 72 73 28 6b 65 79 20 54  parameters(key T
14a20 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  EXT PRIMARY KEY,
14a30 20 76 61 6c 75 65 29 0a 2a 2a 20 20 20 20 57 49   value).**    WI
14a40 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a  THOUT ROWID;.**.
14a50 2a 2a 20 4e 6f 20 62 69 6e 64 69 6e 67 73 20 6f  ** No bindings o
14a60 63 63 75 72 20 69 66 20 74 68 69 73 20 74 61 62  ccur if this tab
14a70 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
14a80 74 2e 20 20 54 68 65 20 73 70 65 63 69 61 6c 20  t.  The special 
14a90 63 68 61 72 61 63 74 65 72 20 27 24 27 0a 2a 2a  character '$'.**
14aa0 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   is included in 
14ab0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  the table name t
14ac0 6f 20 68 65 6c 70 20 70 72 65 76 65 6e 74 20 63  o help prevent c
14ad0 6f 6c 6c 69 73 69 6f 6e 73 20 77 69 74 68 20 61  ollisions with a
14ae0 63 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2a  ctual tables..**
14af0 20 54 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20   The table must 
14b00 62 65 20 69 6e 20 74 68 65 20 54 45 4d 50 20 73  be in the TEMP s
14b10 63 68 65 6d 61 2e 0a 2a 2f 0a 73 74 61 74 69 63  chema..*/.static
14b20 20 76 6f 69 64 20 62 69 6e 64 5f 70 72 65 70 61   void bind_prepa
14b30 72 65 64 5f 73 74 6d 74 28 53 68 65 6c 6c 53 74  red_stmt(ShellSt
14b40 61 74 65 20 2a 70 41 72 67 2c 20 73 71 6c 69 74  ate *pArg, sqlit
14b50 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b  e3_stmt *pStmt){
14b60 0a 20 20 69 6e 74 20 6e 56 61 72 3b 0a 20 20 69  .  int nVar;.  i
14b70 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
14b80 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
14b90 70 51 20 3d 20 30 3b 0a 0a 20 20 6e 56 61 72 20  pQ = 0;..  nVar 
14ba0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  = sqlite3_bind_p
14bb0 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70  arameter_count(p
14bc0 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 6e 56 61  Stmt);.  if( nVa
14bd0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20  r==0 ) return;  
14be0 2f 2a 20 4e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  /* Nothing to do
14bf0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
14c00 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
14c10 65 74 61 64 61 74 61 28 70 41 72 67 2d 3e 64 62  etadata(pArg->db
14c20 2c 20 22 54 45 4d 50 22 2c 20 22 73 71 6c 69 74  , "TEMP", "sqlit
14c30 65 5f 70 61 72 61 6d 65 74 65 72 73 22 2c 0a 20  e_parameters",. 
14c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c60 20 20 20 22 6b 65 79 22 2c 20 30 2c 20 30 2c 20     "key", 0, 0, 
14c70 30 2c 20 30 2c 20 30 29 21 3d 53 51 4c 49 54 45  0, 0, 0)!=SQLITE
14c80 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
14c90 6e 3b 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20  n; /* Parameter 
14ca0 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65  table does not e
14cb0 78 69 73 74 20 2a 2f 0a 20 20 7d 0a 20 20 72 63  xist */.  }.  rc
14cc0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
14cd0 72 65 5f 76 32 28 70 41 72 67 2d 3e 64 62 2c 0a  re_v2(pArg->db,.
14ce0 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
14cf0 54 20 76 61 6c 75 65 20 46 52 4f 4d 20 74 65 6d  T value FROM tem
14d00 70 2e 73 71 6c 69 74 65 5f 70 61 72 61 6d 65 74  p.sqlite_paramet
14d10 65 72 73 22 0a 20 20 20 20 20 20 20 20 20 20 22  ers".          "
14d20 20 57 48 45 52 45 20 6b 65 79 3d 3f 31 22 2c 20   WHERE key=?1", 
14d30 2d 31 2c 20 26 70 51 2c 20 30 29 3b 0a 20 20 69  -1, &pQ, 0);.  i
14d40 66 28 20 72 63 20 7c 7c 20 70 51 3d 3d 30 20 29  f( rc || pQ==0 )
14d50 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
14d60 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b  =1; i<=nVar; i++
14d70 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 4e 75 6d  ){.    char zNum
14d80 5b 33 30 5d 3b 0a 20 20 20 20 63 6f 6e 73 74 20  [30];.    const 
14d90 63 68 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c  char *zVar = sql
14da0 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
14db0 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20  ter_name(pStmt, 
14dc0 69 29 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 72  i);.    if( zVar
14dd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
14de0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
14df0 7a 65 6f 66 28 7a 4e 75 6d 29 2c 7a 4e 75 6d 2c  zeof(zNum),zNum,
14e00 22 3f 25 64 22 2c 69 29 3b 0a 20 20 20 20 20 20  "?%d",i);.      
14e10 7a 56 61 72 20 3d 20 7a 4e 75 6d 3b 0a 20 20 20  zVar = zNum;.   
14e20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62   }.    sqlite3_b
14e30 69 6e 64 5f 74 65 78 74 28 70 51 2c 20 31 2c 20  ind_text(pQ, 1, 
14e40 7a 56 61 72 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zVar, -1, SQLITE
14e50 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 69 66  _STATIC);.    if
14e60 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
14e70 51 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  Q)==SQLITE_ROW )
14e80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
14e90 62 69 6e 64 5f 76 61 6c 75 65 28 70 53 74 6d 74  bind_value(pStmt
14ea0 2c 20 69 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  , i, sqlite3_col
14eb0 75 6d 6e 5f 76 61 6c 75 65 28 70 51 2c 20 30 29  umn_value(pQ, 0)
14ec0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
14ed0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
14ee0 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b  _null(pStmt, i);
14ef0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
14f00 65 33 5f 72 65 73 65 74 28 70 51 29 3b 0a 20 20  e3_reset(pQ);.  
14f10 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  }.  sqlite3_fina
14f20 6c 69 7a 65 28 70 51 29 3b 0a 7d 0a 0a 2f 2a 0a  lize(pQ);.}../*.
14f30 2a 2a 20 52 75 6e 20 61 20 70 72 65 70 61 72 65  ** Run a prepare
14f40 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 73  d statement.*/.s
14f50 74 61 74 69 63 20 76 6f 69 64 20 65 78 65 63 5f  tatic void exec_
14f60 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 0a 20  prepared_stmt(. 
14f70 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72   ShellState *pAr
14f80 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
14f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fa0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
14fb0 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20  ShellState */.  
14fc0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
14fd0 74 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 20  tmt             
14fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ff0 20 2f 2a 20 53 74 61 74 6d 65 6e 74 20 74 6f 20   /* Statment to 
15000 72 75 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  run */.){.  int 
15010 72 63 3b 0a 0a 20 20 2f 2a 20 70 65 72 66 6f 72  rc;..  /* perfor
15020 6d 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70  m the first step
15030 2e 20 20 74 68 69 73 20 77 69 6c 6c 20 74 65 6c  .  this will tel
15040 6c 20 75 73 20 69 66 20 77 65 0a 20 20 2a 2a 20  l us if we.  ** 
15050 68 61 76 65 20 61 20 72 65 73 75 6c 74 20 73 65  have a result se
15060 74 20 6f 72 20 6e 6f 74 20 61 6e 64 20 68 6f 77  t or not and how
15070 20 77 69 64 65 20 69 74 20 69 73 2e 0a 20 20 2a   wide it is..  *
15080 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
15090 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
150a0 2f 2a 20 69 66 20 77 65 20 68 61 76 65 20 61 20  /* if we have a 
150b0 72 65 73 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f  result set... */
150c0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f  .  if( SQLITE_RO
150d0 57 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 2f  W == rc ){.    /
150e0 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * allocate space
150f0 20 66 6f 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74   for col name pt
15100 72 2c 20 76 61 6c 75 65 20 70 74 72 2c 20 61 6e  r, value ptr, an
15110 64 20 74 79 70 65 20 2a 2f 0a 20 20 20 20 69 6e  d type */.    in
15120 74 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  t nCol = sqlite3
15130 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
15140 74 6d 74 29 3b 0a 20 20 20 20 76 6f 69 64 20 2a  tmt);.    void *
15150 70 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f  pData = sqlite3_
15160 6d 61 6c 6c 6f 63 36 34 28 33 2a 6e 43 6f 6c 2a  malloc64(3*nCol*
15170 73 69 7a 65 6f 66 28 63 6f 6e 73 74 20 63 68 61  sizeof(const cha
15180 72 2a 29 20 2b 20 31 29 3b 0a 20 20 20 20 69 66  r*) + 1);.    if
15190 28 20 21 70 44 61 74 61 20 29 7b 0a 20 20 20 20  ( !pData ){.    
151a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
151b0 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
151c0 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43        char **azC
151d0 6f 6c 73 20 3d 20 28 63 68 61 72 20 2a 2a 29 70  ols = (char **)p
151e0 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4e 61  Data;      /* Na
151f0 6d 65 73 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  mes of result co
15200 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 63  lumns */.      c
15210 68 61 72 20 2a 2a 61 7a 56 61 6c 73 20 3d 20 26  har **azVals = &
15220 61 7a 43 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20  azCols[nCol];   
15230 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a      /* Results *
15240 2f 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 69 54  /.      int *aiT
15250 79 70 65 73 20 3d 20 28 69 6e 74 20 2a 29 26 61  ypes = (int *)&a
15260 7a 56 61 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20  zVals[nCol]; /* 
15270 52 65 73 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a  Result types */.
15280 20 20 20 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a        int i, x;.
15290 20 20 20 20 20 20 61 73 73 65 72 74 28 73 69 7a        assert(siz
152a0 65 6f 66 28 69 6e 74 29 20 3c 3d 20 73 69 7a 65  eof(int) <= size
152b0 6f 66 28 63 68 61 72 20 2a 29 29 3b 0a 20 20 20  of(char *));.   
152c0 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 70     /* save off p
152d0 74 72 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61  trs to column na
152e0 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  mes */.      for
152f0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
15300 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 7a 43 6f  +){.        azCo
15310 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72 20 2a 29  ls[i] = (char *)
15320 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
15330 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ame(pStmt, i);. 
15340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 7b       }.      do{
15350 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 78 74 72  .        /* extr
15360 61 63 74 20 74 68 65 20 64 61 74 61 20 61 6e 64  act the data and
15370 20 64 61 74 61 20 74 79 70 65 73 20 2a 2f 0a 20   data types */. 
15380 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
15390 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
153a0 20 20 20 20 20 20 20 20 61 69 54 79 70 65 73 5b          aiTypes[
153b0 69 5d 20 3d 20 78 20 3d 20 73 71 6c 69 74 65 33  i] = x = sqlite3
153c0 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
153d0 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
153e0 20 20 69 66 28 20 78 3d 3d 53 51 4c 49 54 45 5f    if( x==SQLITE_
153f0 42 4c 4f 42 20 26 26 20 70 41 72 67 20 26 26 20  BLOB && pArg && 
15400 70 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44  pArg->cMode==MOD
15410 45 5f 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20  E_Insert ){.    
15420 20 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69          azVals[i
15430 5d 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  ] = "";.        
15440 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15450 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d       azVals[i] =
15460 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
15470 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
15480 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
15490 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
154a0 20 21 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28   !azVals[i] && (
154b0 61 69 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49  aiTypes[i]!=SQLI
154c0 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  TE_NULL) ){.    
154d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
154e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
154f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20 2f 2a         break; /*
15500 20 66 72 6f 6d 20 66 6f 72 20 2a 2f 0a 20 20 20   from for */.   
15510 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15520 20 7d 20 2f 2a 20 65 6e 64 20 66 6f 72 20 2a 2f   } /* end for */
15530 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20  ..        /* if 
15540 64 61 74 61 20 61 6e 64 20 74 79 70 65 73 20 65  data and types e
15550 78 74 72 61 63 74 65 64 20 73 75 63 63 65 73 73  xtracted success
15560 66 75 6c 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20  fully... */.    
15570 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
15580 4f 57 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20  OW == rc ){.    
15590 20 20 20 20 20 20 2f 2a 20 63 61 6c 6c 20 74 68        /* call th
155a0 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62  e supplied callb
155b0 61 63 6b 20 77 69 74 68 20 74 68 65 20 72 65 73  ack with the res
155c0 75 6c 74 20 72 6f 77 20 64 61 74 61 20 2a 2f 0a  ult row data */.
155d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 68            if( sh
155e0 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72  ell_callback(pAr
155f0 67 2c 20 6e 43 6f 6c 2c 20 61 7a 56 61 6c 73 2c  g, nCol, azVals,
15600 20 61 7a 43 6f 6c 73 2c 20 61 69 54 79 70 65 73   azCols, aiTypes
15610 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
15620 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f   rc = SQLITE_ABO
15630 52 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  RT;.          }e
15640 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
15650 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
15660 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ep(pStmt);.     
15670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
15680 0a 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20  .      } while( 
15690 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63  SQLITE_ROW == rc
156a0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
156b0 33 5f 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20  3_free(pData);. 
156c0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
156d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
156e0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
156f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
15700 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
15710 6f 63 65 73 73 20 53 51 4c 20 69 66 20 74 68 65  ocess SQL if the
15720 20 70 72 65 76 69 6f 75 73 20 73 68 65 6c 6c 20   previous shell 
15730 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 77 61 73 20 22  command.** was "
15740 2e 65 78 70 65 72 74 22 2e 20 49 74 20 70 61 73  .expert". It pas
15750 73 65 73 20 74 68 65 20 53 51 4c 20 69 6e 20 74  ses the SQL in t
15760 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
15770 6e 74 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a  nt directly to.*
15780 2a 20 74 68 65 20 73 71 6c 69 74 65 33 65 78 70  * the sqlite3exp
15790 65 72 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  ert object..**.*
157a0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
157b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
157c0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
157d0 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  e, an SQLite err
157e0 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74  or.** code. In t
157f0 68 69 73 20 63 61 73 65 2c 20 28 2a 70 7a 45 72  his case, (*pzEr
15800 72 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  r) may be set to
15810 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
15820 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  er containing.**
15830 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67   an English lang
15840 75 61 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61  uage error messa
15850 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ge. It is the re
15860 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
15870 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  the.** caller to
15880 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
15890 20 74 68 69 73 20 62 75 66 66 65 72 20 75 73 69   this buffer usi
158a0 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
158b0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
158c0 20 65 78 70 65 72 74 48 61 6e 64 6c 65 53 51 4c   expertHandleSQL
158d0 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
158e0 70 53 74 61 74 65 2c 20 0a 20 20 63 6f 6e 73 74  pState, .  const
158f0 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20   char *zSql, .  
15900 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
15910 20 20 61 73 73 65 72 74 28 20 70 53 74 61 74 65    assert( pState
15920 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
15930 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a   );.  assert( pz
15940 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72  Err==0 || *pzErr
15950 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
15960 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 73  sqlite3_expert_s
15970 71 6c 28 70 53 74 61 74 65 2d 3e 65 78 70 65 72  ql(pState->exper
15980 74 2e 70 45 78 70 65 72 74 2c 20 7a 53 71 6c 2c  t.pExpert, zSql,
15990 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pzErr);.}../*.*
159a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
159b0 69 73 20 63 61 6c 6c 65 64 20 65 69 74 68 65 72  is called either
159c0 20 74 6f 20 73 69 6c 65 6e 74 6c 79 20 63 6c 65   to silently cle
159d0 61 6e 20 75 70 20 74 68 65 20 6f 62 6a 65 63 74  an up the object
159e0 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74  .** created by t
159f0 68 65 20 22 2e 65 78 70 65 72 74 22 20 63 6f 6d  he ".expert" com
15a00 6d 61 6e 64 20 28 69 66 20 62 43 61 6e 63 65 6c  mand (if bCancel
15a10 3d 3d 31 29 2c 20 6f 72 20 74 6f 20 67 65 6e 65  ==1), or to gene
15a20 72 61 74 65 20 61 20 0a 2a 2a 20 72 65 70 6f 72  rate a .** repor
15a30 74 20 66 72 6f 6d 20 69 74 20 61 6e 64 20 74 68  t from it and th
15a40 65 6e 20 63 6c 65 61 6e 20 69 74 20 75 70 20 28  en clean it up (
15a50 69 66 20 62 43 61 6e 63 65 6c 3d 3d 30 29 2e 0a  if bCancel==0)..
15a60 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
15a70 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
15a80 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
15a90 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65  rwise, an SQLite
15aa0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20   error.** code. 
15ab0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 28 2a  In this case, (*
15ac0 70 7a 45 72 72 29 20 6d 61 79 20 62 65 20 73 65  pzErr) may be se
15ad0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
15ae0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
15af0 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20  g.** an English 
15b00 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d  language error m
15b10 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
15b20 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
15b30 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
15b40 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
15b50 66 72 65 65 20 74 68 69 73 20 62 75 66 66 65 72  free this buffer
15b60 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66   using sqlite3_f
15b70 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
15b80 20 69 6e 74 20 65 78 70 65 72 74 46 69 6e 69 73   int expertFinis
15b90 68 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  h(.  ShellState 
15ba0 2a 70 53 74 61 74 65 2c 0a 20 20 69 6e 74 20 62  *pState,.  int b
15bb0 43 61 6e 63 65 6c 2c 0a 20 20 63 68 61 72 20 2a  Cancel,.  char *
15bc0 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20  *pzErr.){.  int 
15bd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15be0 20 20 73 71 6c 69 74 65 33 65 78 70 65 72 74 20    sqlite3expert 
15bf0 2a 70 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70  *p = pState->exp
15c00 65 72 74 2e 70 45 78 70 65 72 74 3b 0a 20 20 61  ert.pExpert;.  a
15c10 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73  ssert( p );.  as
15c20 73 65 72 74 28 20 62 43 61 6e 63 65 6c 20 7c 7c  sert( bCancel ||
15c30 20 70 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a   pzErr==0 || *pz
15c40 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Err==0 );.  if( 
15c50 62 43 61 6e 63 65 6c 3d 3d 30 20 29 7b 0a 20 20  bCancel==0 ){.  
15c60 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53    FILE *out = pS
15c70 74 61 74 65 2d 3e 6f 75 74 3b 0a 20 20 20 20 69  tate->out;.    i
15c80 6e 74 20 62 56 65 72 62 6f 73 65 20 3d 20 70 53  nt bVerbose = pS
15c90 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65  tate->expert.bVe
15ca0 72 62 6f 73 65 3b 0a 0a 20 20 20 20 72 63 20 3d  rbose;..    rc =
15cb0 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
15cc0 61 6e 61 6c 79 7a 65 28 70 2c 20 70 7a 45 72 72  analyze(p, pzErr
15cd0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
15ce0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15cf0 20 20 69 6e 74 20 6e 51 75 65 72 79 20 3d 20 73    int nQuery = s
15d00 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 63 6f  qlite3_expert_co
15d10 75 6e 74 28 70 29 3b 0a 20 20 20 20 20 20 69 6e  unt(p);.      in
15d20 74 20 69 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  t i;..      if( 
15d30 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20  bVerbose ){.    
15d40 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15d50 7a 43 61 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f  zCand = sqlite3_
15d60 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c  expert_report(p,
15d70 30 2c 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f  0,EXPERT_REPORT_
15d80 43 41 4e 44 49 44 41 54 45 53 29 3b 0a 20 20 20  CANDIDATES);.   
15d90 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
15da0 6f 75 74 2c 20 22 2d 2d 20 43 61 6e 64 69 64 61  out, "-- Candida
15db0 74 65 73 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  tes ------------
15dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15dd0 2d 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  -\n");.        r
15de0 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
15df0 25 73 5c 6e 22 2c 20 7a 43 61 6e 64 29 3b 0a 20  %s\n", zCand);. 
15e00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
15e10 28 69 3d 30 3b 20 69 3c 6e 51 75 65 72 79 3b 20  (i=0; i<nQuery; 
15e20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  i++){.        co
15e30 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
15e40 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
15e50 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50  report(p, i, EXP
15e60 45 52 54 5f 52 45 50 4f 52 54 5f 53 51 4c 29 3b  ERT_REPORT_SQL);
15e70 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
15e80 68 61 72 20 2a 7a 49 64 78 20 3d 20 73 71 6c 69  har *zIdx = sqli
15e90 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72  te3_expert_repor
15ea0 74 28 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52  t(p, i, EXPERT_R
15eb0 45 50 4f 52 54 5f 49 4e 44 45 58 45 53 29 3b 0a  EPORT_INDEXES);.
15ec0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
15ed0 61 72 20 2a 7a 45 51 50 20 3d 20 73 71 6c 69 74  ar *zEQP = sqlit
15ee0 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74  e3_expert_report
15ef0 28 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45  (p, i, EXPERT_RE
15f00 50 4f 52 54 5f 50 4c 41 4e 29 3b 0a 20 20 20 20  PORT_PLAN);.    
15f10 20 20 20 20 69 66 28 20 7a 49 64 78 3d 3d 30 20      if( zIdx==0 
15f20 29 20 7a 49 64 78 20 3d 20 22 28 6e 6f 20 6e 65  ) zIdx = "(no ne
15f30 77 20 69 6e 64 65 78 65 73 29 5c 6e 22 3b 0a 20  w indexes)\n";. 
15f40 20 20 20 20 20 20 20 69 66 28 20 62 56 65 72 62         if( bVerb
15f50 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ose ){.         
15f60 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
15f70 20 22 2d 2d 20 51 75 65 72 79 20 25 64 20 2d 2d   "-- Query %d --
15f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  --------------\n
15fa0 22 2c 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ",i+1);.        
15fb0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
15fc0 2c 20 22 25 73 5c 6e 5c 6e 22 2c 20 7a 53 71 6c  , "%s\n\n", zSql
15fd0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15fe0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
15ff0 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 64  out, "%s\n", zId
16000 78 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  x);.        raw_
16010 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c  printf(out, "%s\
16020 6e 22 2c 20 7a 45 51 50 29 3b 0a 20 20 20 20 20  n", zEQP);.     
16030 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
16040 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 64 65  qlite3_expert_de
16050 73 74 72 6f 79 28 70 29 3b 0a 20 20 70 53 74 61  stroy(p);.  pSta
16060 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65  te->expert.pExpe
16070 72 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  rt = 0;.  return
16080 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
16090 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
160a0 22 2e 65 78 70 65 72 74 22 20 64 6f 74 20 63 6f  ".expert" dot co
160b0 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  mmand..*/.static
160c0 20 69 6e 74 20 65 78 70 65 72 74 44 6f 74 43 6f   int expertDotCo
160d0 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74  mmand(.  ShellSt
160e0 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20  ate *pState,    
160f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
16100 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73  ent shell tool s
16110 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tate */.  char *
16120 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20  *azArg,         
16130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
16140 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
16150 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f  passed to dot co
16160 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  mmand */.  int n
16170 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
16180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
16190 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
161a0 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b  in azArg[] */.){
161b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
161c0 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a  TE_OK;.  char *z
161d0 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Err = 0;.  int i
161e0 3b 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 20  ;.  int iSample 
161f0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
16200 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
16210 45 78 70 65 72 74 3d 3d 30 20 29 3b 0a 20 20 6d  Expert==0 );.  m
16220 65 6d 73 65 74 28 26 70 53 74 61 74 65 2d 3e 65  emset(&pState->e
16230 78 70 65 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66  xpert, 0, sizeof
16240 28 45 78 70 65 72 74 49 6e 66 6f 29 29 3b 0a 0a  (ExpertInfo));..
16250 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53    for(i=1; rc==S
16260 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41  QLITE_OK && i<nA
16270 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  rg; i++){.    ch
16280 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d  ar *z = azArg[i]
16290 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
162a0 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26   if( z[0]=='-' &
162b0 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b  & z[1]=='-' ) z+
162c0 2b 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65  +;.    n = strle
162d0 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20  n30(z);.    if( 
162e0 6e 3e 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e 63  n>=2 && 0==strnc
162f0 6d 70 28 7a 2c 20 22 2d 76 65 72 62 6f 73 65 22  mp(z, "-verbose"
16300 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 53  , n) ){.      pS
16310 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65  tate->expert.bVe
16320 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rbose = 1;.    }
16330 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e 3e  .    else if( n>
16340 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70  =2 && 0==strncmp
16350 28 7a 2c 20 22 2d 73 61 6d 70 6c 65 22 2c 20 6e  (z, "-sample", n
16360 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ) ){.      if( i
16370 3d 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20  ==(nArg-1) ){.  
16380 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
16390 28 73 74 64 65 72 72 2c 20 22 6f 70 74 69 6f 6e  (stderr, "option
163a0 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67   requires an arg
163b0 75 6d 65 6e 74 3a 20 25 73 5c 6e 22 2c 20 7a 29  ument: %s\n", z)
163c0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
163d0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
163e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
163f0 20 20 69 53 61 6d 70 6c 65 20 3d 20 28 69 6e 74    iSample = (int
16400 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a  )integerValue(az
16410 41 72 67 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20  Arg[++i]);.     
16420 20 20 20 69 66 28 20 69 53 61 6d 70 6c 65 3c 30     if( iSample<0
16430 20 7c 7c 20 69 53 61 6d 70 6c 65 3e 31 30 30 20   || iSample>100 
16440 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
16450 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
16460 22 76 61 6c 75 65 20 6f 75 74 20 6f 66 20 72 61  "value out of ra
16470 6e 67 65 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72  nge: %s\n", azAr
16480 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[i]);.         
16490 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
164a0 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
164b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
164c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
164d0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
164e0 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20  unknown option: 
164f0 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20  %s\n", z);.     
16500 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
16510 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OR;.    }.  }.. 
16520 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16530 4f 4b 20 29 7b 0a 20 20 20 20 70 53 74 61 74 65  OK ){.    pState
16540 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
16550 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72   = sqlite3_exper
16560 74 5f 6e 65 77 28 70 53 74 61 74 65 2d 3e 64 62  t_new(pState->db
16570 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66  , &zErr);.    if
16580 28 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74  ( pState->expert
16590 2e 70 45 78 70 65 72 74 3d 3d 30 20 29 7b 0a 20  .pExpert==0 ){. 
165a0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
165b0 73 74 64 65 72 72 2c 20 22 73 71 6c 69 74 65 33  stderr, "sqlite3
165c0 5f 65 78 70 65 72 74 5f 6e 65 77 3a 20 25 73 5c  _expert_new: %s\
165d0 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20  n", zErr);.     
165e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
165f0 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OR;.    }else{. 
16600 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 70       sqlite3_exp
16610 65 72 74 5f 63 6f 6e 66 69 67 28 0a 20 20 20 20  ert_config(.    
16620 20 20 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78        pState->ex
16630 70 65 72 74 2e 70 45 78 70 65 72 74 2c 20 45 58  pert.pExpert, EX
16640 50 45 52 54 5f 43 4f 4e 46 49 47 5f 53 41 4d 50  PERT_CONFIG_SAMP
16650 4c 45 2c 20 69 53 61 6d 70 6c 65 0a 20 20 20 20  LE, iSample.    
16660 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a    );.    }.  }..
16670 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
16680 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20  endif /* ifndef 
16690 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
166a0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 73 74 61  UALTABLE */..sta
166b0 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 72  tic void shellPr
166c0 65 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33  epare(.  sqlite3
166d0 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52   *db, .  int *pR
166e0 63 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  c, .  const char
166f0 20 2a 7a 53 71 6c 2c 20 0a 20 20 73 71 6c 69 74   *zSql, .  sqlit
16700 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
16710 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20  .){.  *ppStmt = 
16720 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  0;.  if( *pRc==S
16730 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16740 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
16750 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
16760 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74  zSql, -1, ppStmt
16770 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
16780 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16790 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
167a0 73 74 64 65 72 72 2c 20 22 73 71 6c 20 65 72 72  stderr, "sql err
167b0 6f 72 3a 20 25 73 20 28 25 64 29 5c 6e 22 2c 20  or: %s (%d)\n", 
167c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
167d0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 73  e3_errmsg(db), s
167e0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
167f0 62 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  b).      );.    
16800 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20    *pRc = rc;.   
16810 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63   }.  }.}..static
16820 20 76 6f 69 64 20 73 68 65 6c 6c 45 78 65 63 50   void shellExecP
16830 72 69 6e 74 66 28 0a 20 20 73 71 6c 69 74 65 33  rintf(.  sqlite3
16840 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52   *db, .  int *pR
16850 63 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  c, .  const char
16860 20 2a 7a 46 6d 74 2c 20 0a 20 20 2e 2e 2e 0a 29   *zFmt, .  ....)
16870 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  {.  if( *pRc==SQ
16880 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 76  LITE_OK ){.    v
16890 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 63  a_list ap;.    c
168a0 68 61 72 20 2a 7a 3b 0a 20 20 20 20 76 61 5f 73  har *z;.    va_s
168b0 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
168c0 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
168d0 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61  vmprintf(zFmt, a
168e0 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
168f0 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  p);.    if( z==0
16900 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d   ){.      *pRc =
16910 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
16920 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16930 2a 70 52 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  *pRc = sqlite3_e
16940 78 65 63 28 64 62 2c 20 7a 2c 20 30 2c 20 30 2c  xec(db, z, 0, 0,
16950 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
16960 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20  e3_free(z);.    
16970 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
16980 76 6f 69 64 20 73 68 65 6c 6c 50 72 65 70 61 72  void shellPrepar
16990 65 50 72 69 6e 74 66 28 0a 20 20 73 71 6c 69 74  ePrintf(.  sqlit
169a0 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a  e3 *db, .  int *
169b0 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  pRc, .  sqlite3_
169c0 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20  stmt **ppStmt,. 
169d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
169e0 74 2c 20 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 2a  t, .  ....){.  *
169f0 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66  ppStmt = 0;.  if
16a00 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
16a10 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74  K ){.    va_list
16a20 20 61 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   ap;.    char *z
16a30 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  ;.    va_start(a
16a40 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20  p, zFmt);.    z 
16a50 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e  = sqlite3_vmprin
16a60 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20  tf(zFmt, ap);.  
16a70 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
16a80 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
16a90 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
16aa0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
16ab0 73 65 7b 0a 20 20 20 20 20 20 73 68 65 6c 6c 50  se{.      shellP
16ac0 72 65 70 61 72 65 28 64 62 2c 20 70 52 63 2c 20  repare(db, pRc, 
16ad0 7a 2c 20 70 70 53 74 6d 74 29 3b 0a 20 20 20 20  z, ppStmt);.    
16ae0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
16af0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
16b00 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
16b10 6c 46 69 6e 61 6c 69 7a 65 28 0a 20 20 69 6e 74  lFinalize(.  int
16b20 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65   *pRc, .  sqlite
16b30 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b  3_stmt *pStmt.){
16b40 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
16b50 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
16b60 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e  = sqlite3_db_han
16b70 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  dle(pStmt);.    
16b80 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
16b90 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
16ba0 3b 0a 20 20 20 20 69 66 28 20 2a 70 52 63 3d 3d  ;.    if( *pRc==
16bb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16bc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16bd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16be0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
16bf0 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a 20 25  r, "SQL error: %
16c00 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
16c10 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20  rmsg(db));.     
16c20 20 7d 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20   }.      *pRc = 
16c30 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  rc;.    }.  }.}.
16c40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
16c50 6c 6c 52 65 73 65 74 28 0a 20 20 69 6e 74 20 2a  llReset(.  int *
16c60 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  pRc, .  sqlite3_
16c70 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a 20  stmt *pStmt.){. 
16c80 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
16c90 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
16ca0 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
16cb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
16cc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16cd0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
16ce0 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62  *db = sqlite3_db
16cf0 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a  _handle(pStmt);.
16d00 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
16d10 28 73 74 64 65 72 72 2c 20 22 53 51 4c 20 65 72  (stderr, "SQL er
16d20 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
16d30 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
16d40 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 63 20  .    }.    *pRc 
16d50 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  = rc;.  }.}..sta
16d60 74 69 63 20 69 6e 74 20 73 68 61 72 65 64 53 63  tic int sharedSc
16d70 68 65 6d 61 46 69 78 28 53 68 65 6c 6c 53 74 61  hemaFix(ShellSta
16d80 74 65 20 2a 70 53 74 61 74 65 2c 20 63 6f 6e 73  te *pState, cons
16d90 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 69 6e 74  t char *zDb, int
16da0 20 65 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63   eFix){.  int rc
16db0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16dc0 69 36 34 20 69 4c 61 73 74 20 3d 20 30 3b 0a 20  i64 iLast = 0;. 
16dd0 20 69 6e 74 20 69 43 6f 6f 6b 69 65 20 3d 20 30   int iCookie = 0
16de0 3b 0a 20 20 69 6e 74 20 69 41 75 74 6f 56 61 63  ;.  int iAutoVac
16df0 75 75 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  uum = 0;.  sqlit
16e00 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
16e10 20 30 3b 0a 0a 20 20 73 68 65 6c 6c 45 78 65 63   0;..  shellExec
16e20 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 64  Printf(pState->d
16e30 62 2c 20 26 72 63 2c 20 22 41 54 54 41 43 48 20  b, &rc, "ATTACH 
16e40 27 25 71 27 20 41 53 20 5f 73 68 61 72 65 64 5f  '%q' AS _shared_
16e50 73 63 68 65 6d 61 5f 74 6d 70 22 2c 20 7a 44 62  schema_tmp", zDb
16e60 29 3b 0a 20 20 73 68 65 6c 6c 45 78 65 63 50 72  );.  shellExecPr
16e70 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62 2c  intf(pState->db,
16e80 20 26 72 63 2c 20 22 50 52 41 47 4d 41 20 77 72   &rc, "PRAGMA wr
16e90 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20  itable_schema = 
16ea0 31 22 29 3b 0a 20 20 73 68 65 6c 6c 45 78 65 63  1");.  shellExec
16eb0 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 64  Printf(pState->d
16ec0 62 2c 20 26 72 63 2c 20 22 42 45 47 49 4e 22 29  b, &rc, "BEGIN")
16ed0 3b 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65  ;.  shellPrepare
16ee0 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 64  Printf(pState->d
16ef0 62 2c 20 26 72 63 2c 20 26 70 53 74 6d 74 2c 20  b, &rc, &pStmt, 
16f00 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6d  .      "SELECT m
16f10 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20 5f  ax(rowid) FROM _
16f20 73 68 61 72 65 64 5f 73 63 68 65 6d 61 5f 74 6d  shared_schema_tm
16f30 70 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  p.sqlite_master"
16f40 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  .  );.  sqlite3_
16f50 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 69  step(pStmt);.  i
16f60 4c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 63  Last = sqlite3_c
16f70 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
16f80 74 2c 20 30 29 3b 0a 20 20 73 68 65 6c 6c 46 69  t, 0);.  shellFi
16f90 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 74 6d  nalize(&rc, pStm
16fa0 74 29 3b 0a 20 20 73 68 65 6c 6c 50 72 65 70 61  t);.  shellPrepa
16fb0 72 65 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d  rePrintf(pState-
16fc0 3e 64 62 2c 20 26 72 63 2c 20 26 70 53 74 6d 74  >db, &rc, &pStmt
16fd0 2c 0a 20 20 20 20 20 20 22 49 4e 53 45 52 54 20  ,.      "INSERT 
16fe0 49 4e 54 4f 20 5f 73 68 61 72 65 64 5f 73 63 68  INTO _shared_sch
16ff0 65 6d 61 5f 74 6d 70 2e 73 71 6c 69 74 65 5f 6d  ema_tmp.sqlite_m
17000 61 73 74 65 72 20 53 45 4c 45 43 54 20 22 0a 20  aster SELECT ". 
17010 20 20 20 20 20 22 20 20 74 79 70 65 2c 20 6e 61       "  type, na
17020 6d 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 28 22  me, tbl_name, ("
17030 0a 20 20 20 20 20 20 22 20 20 20 20 53 45 4c 45  .      "    SELE
17040 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d  CT rootpage FROM
17050 20 5f 73 68 61 72 65 64 5f 73 63 68 65 6d 61 5f   _shared_schema_
17060 74 6d 70 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  tmp.sqlite_maste
17070 72 20 57 48 45 52 45 20 22 0a 20 20 20 20 20 20  r WHERE ".      
17080 22 20 20 20 20 20 20 74 79 70 65 20 49 53 20 6f  "      type IS o
17090 2e 74 79 70 65 20 41 4e 44 20 6e 61 6d 65 20 49  .type AND name I
170a0 53 20 6f 2e 6e 61 6d 65 20 41 4e 44 20 72 6f 77  S o.name AND row
170b0 69 64 3c 3d 3f 22 0a 20 20 20 20 20 20 22 20 20  id<=?".      "  
170c0 29 2c 20 73 71 6c 20 46 52 4f 4d 20 6d 61 69 6e  ), sql FROM main
170d0 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 41  .sqlite_master A
170e0 53 20 6f 22 0a 20 20 29 3b 0a 20 20 73 71 6c 69  S o".  );.  sqli
170f0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
17100 53 74 6d 74 2c 20 31 2c 20 69 4c 61 73 74 29 3b  Stmt, 1, iLast);
17110 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  .  sqlite3_step(
17120 70 53 74 6d 74 29 3b 0a 20 20 73 68 65 6c 6c 46  pStmt);.  shellF
17130 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 74  inalize(&rc, pSt
17140 6d 74 29 3b 0a 0a 20 20 73 68 65 6c 6c 45 78 65  mt);..  shellExe
17150 63 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  cPrintf(pState->
17160 64 62 2c 20 26 72 63 2c 0a 20 20 20 20 20 20 22  db, &rc,.      "
17170 44 45 4c 45 54 45 20 46 52 4f 4d 20 5f 73 68 61  DELETE FROM _sha
17180 72 65 64 5f 73 63 68 65 6d 61 5f 74 6d 70 2e 73  red_schema_tmp.s
17190 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
171a0 52 45 20 72 6f 77 69 64 3c 3d 25 6c 6c 64 22 2c  RE rowid<=%lld",
171b0 0a 20 20 20 20 20 20 69 4c 61 73 74 0a 20 20 29  .      iLast.  )
171c0 3b 0a 20 20 73 68 65 6c 6c 45 78 65 63 50 72 69  ;.  shellExecPri
171d0 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  ntf(pState->db, 
171e0 26 72 63 2c 20 22 43 4f 4d 4d 49 54 22 29 3b 0a  &rc, "COMMIT");.
171f0 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
17200 53 74 61 74 65 2d 3e 64 62 2c 20 22 50 52 41 47  State->db, "PRAG
17210 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
17220 6d 61 20 3d 20 30 22 2c 20 30 2c 20 30 2c 20 30  ma = 0", 0, 0, 0
17230 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68  );..  /* Copy th
17240 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 73 65  e auto-vacuum se
17250 74 74 69 6e 67 20 66 72 6f 6d 20 6d 61 69 6e 20  tting from main 
17260 74 6f 20 74 68 65 20 74 61 72 67 65 74 20 64 62  to the target db
17270 20 2a 2f 0a 20 20 73 68 65 6c 6c 50 72 65 70 61   */.  shellPrepa
17280 72 65 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d  rePrintf(pState-
17290 3e 64 62 2c 20 26 72 63 2c 20 26 70 53 74 6d 74  >db, &rc, &pStmt
172a0 2c 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 61  , "PRAGMA main.a
172b0 75 74 6f 5f 76 61 63 75 75 6d 22 29 3b 0a 20 20  uto_vacuum");.  
172c0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
172d0 6d 74 29 3b 0a 20 20 69 41 75 74 6f 56 61 63 75  mt);.  iAutoVacu
172e0 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  um = sqlite3_col
172f0 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30  umn_int(pStmt, 0
17300 29 3b 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  );.  shellFinali
17310 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a  ze(&rc, pStmt);.
17320 20 20 73 68 65 6c 6c 45 78 65 63 50 72 69 6e 74    shellExecPrint
17330 66 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72  f(pState->db, &r
17340 63 2c 20 0a 20 20 20 20 20 20 22 50 52 41 47 4d  c, .      "PRAGM
17350 41 20 5f 73 68 61 72 65 64 5f 73 63 68 65 6d 61  A _shared_schema
17360 5f 74 6d 70 2e 61 75 74 6f 5f 76 61 63 75 75 6d  _tmp.auto_vacuum
17370 20 3d 20 25 64 22 2c 20 69 41 75 74 6f 56 61 63   = %d", iAutoVac
17380 75 75 6d 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 56  uum.  );..  /* V
17390 61 63 75 75 6d 20 74 68 65 20 64 62 20 69 6e 20  acuum the db in 
173a0 6f 72 64 65 72 20 74 6f 20 73 74 61 6e 64 61 72  order to standar
173b0 64 69 7a 65 20 74 68 65 20 72 6f 6f 74 70 61 67  dize the rootpag
173c0 65 20 6e 75 6d 62 65 72 73 2e 20 2a 2f 0a 20 20  e numbers. */.  
173d0 73 68 65 6c 6c 45 78 65 63 50 72 69 6e 74 66 28  shellExecPrintf(
173e0 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c  pState->db, &rc,
173f0 20 22 56 41 43 55 55 4d 20 5f 73 68 61 72 65 64   "VACUUM _shared
17400 5f 73 63 68 65 6d 61 5f 74 6d 70 22 29 3b 0a 0a  _schema_tmp");..
17410 20 20 2f 2a 20 53 65 74 20 74 68 65 20 73 63 68    /* Set the sch
17420 65 6d 61 2d 63 6f 6f 6b 69 65 20 76 61 6c 75 65  ema-cookie value
17430 20 74 6f 20 74 68 65 20 73 61 6d 65 20 61 73 20   to the same as 
17440 64 61 74 61 62 61 73 65 20 22 6d 61 69 6e 22 20  database "main" 
17450 2a 2f 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72  */.  shellPrepar
17460 65 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  ePrintf(pState->
17470 64 62 2c 20 26 72 63 2c 20 26 70 53 74 6d 74 2c  db, &rc, &pStmt,
17480 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 63   "PRAGMA main.sc
17490 68 65 6d 61 5f 76 65 72 73 69 6f 6e 22 29 3b 0a  hema_version");.
174a0 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
174b0 53 74 6d 74 29 3b 0a 20 20 69 43 6f 6f 6b 69 65  Stmt);.  iCookie
174c0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
174d0 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
174e0 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65  .  shellFinalize
174f0 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20  (&rc, pStmt);.  
17500 73 68 65 6c 6c 45 78 65 63 50 72 69 6e 74 66 28  shellExecPrintf(
17510 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c  pState->db, &rc,
17520 20 0a 20 20 20 20 20 20 22 50 52 41 47 4d 41 20   .      "PRAGMA 
17530 5f 73 68 61 72 65 64 5f 73 63 68 65 6d 61 5f 74  _shared_schema_t
17540 6d 70 2e 73 63 68 65 6d 61 5f 76 65 72 73 69 6f  mp.schema_versio
17550 6e 20 3d 20 25 64 22 2c 20 69 43 6f 6f 6b 69 65  n = %d", iCookie
17560 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  .  );..  sqlite3
17570 5f 65 78 65 63 28 70 53 74 61 74 65 2d 3e 64 62  _exec(pState->db
17580 2c 20 22 44 45 54 41 43 48 20 5f 73 68 61 72 65  , "DETACH _share
17590 64 5f 73 63 68 65 6d 61 5f 74 6d 70 22 2c 20 30  d_schema_tmp", 0
175a0 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  , 0, 0);.  retur
175b0 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
175c0 69 6e 74 20 73 68 61 72 65 64 53 63 68 65 6d 61  int sharedSchema
175d0 43 68 65 63 6b 28 53 68 65 6c 6c 53 74 61 74 65  Check(ShellState
175e0 20 2a 70 53 74 61 74 65 2c 20 63 6f 6e 73 74 20   *pState, const 
175f0 63 68 61 72 20 2a 7a 44 62 2c 20 69 6e 74 20 2a  char *zDb, int *
17600 70 65 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63  peFix){.  int rc
17610 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17620 69 6e 74 20 62 46 61 69 6c 65 64 20 3d 20 30 3b  int bFailed = 0;
17630 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
17640 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 69  *pStmt = 0;..  i
17650 66 28 20 70 65 46 69 78 20 29 20 2a 70 65 46 69  f( peFix ) *peFi
17660 78 20 3d 20 30 3b 0a 20 20 73 68 65 6c 6c 45 78  x = 0;.  shellEx
17670 65 63 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d  ecPrintf(pState-
17680 3e 64 62 2c 20 26 72 63 2c 20 22 41 54 54 41 43  >db, &rc, "ATTAC
17690 48 20 27 25 71 27 20 41 53 20 5f 73 68 61 72 65  H '%q' AS _share
176a0 64 5f 73 63 68 65 6d 61 5f 74 6d 70 22 2c 20 7a  d_schema_tmp", z
176b0 44 62 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  Db);..  /* Check
176c0 20 69 66 20 74 68 69 73 20 64 61 74 61 62 61 73   if this databas
176d0 65 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 73  e has the same s
176e0 65 74 20 6f 66 20 6f 62 6a 65 63 74 73 20 61 73  et of objects as
176f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 62 20   the current db 
17700 2a 2f 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72  */.  shellPrepar
17710 65 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  ePrintf(pState->
17720 64 62 2c 20 26 72 63 2c 20 26 70 53 74 6d 74 2c  db, &rc, &pStmt,
17730 20 0a 20 20 20 20 22 53 45 4c 45 43 54 20 74 79   .    "SELECT ty
17740 70 65 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 5f 73  pe, name FROM _s
17750 68 61 72 65 64 5f 73 63 68 65 6d 61 5f 74 6d 70  hared_schema_tmp
17760 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 41  .sqlite_master A
17770 53 20 6f 20 22 0a 20 20 20 20 22 57 48 45 52 45  S o ".    "WHERE
17780 20 4e 4f 54 20 45 58 49 53 54 53 20 28 22 0a 20   NOT EXISTS (". 
17790 20 20 20 22 20 20 53 45 4c 45 43 54 20 31 20 46     "  SELECT 1 F
177a0 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65 5f  ROM main.sqlite_
177b0 6d 61 73 74 65 72 20 22 0a 20 20 20 20 22 20 20  master ".    "  
177c0 20 20 57 48 45 52 45 20 6e 61 6d 65 20 49 53 20    WHERE name IS 
177d0 6f 2e 6e 61 6d 65 20 41 4e 44 20 74 79 70 65 20  o.name AND type 
177e0 49 53 20 6f 2e 74 79 70 65 22 0a 20 20 20 20 22  IS o.type".    "
177f0 29 22 0a 20 20 20 20 22 20 55 4e 49 4f 4e 20 41  )".    " UNION A
17800 4c 4c 20 22 0a 20 20 20 20 22 53 45 4c 45 43 54  LL ".    "SELECT
17810 20 74 79 70 65 2c 20 6e 61 6d 65 20 46 52 4f 4d   type, name FROM
17820 20 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73   main.sqlite_mas
17830 74 65 72 20 41 53 20 6f 20 22 0a 20 20 20 20 22  ter AS o ".    "
17840 57 48 45 52 45 20 4e 4f 54 20 45 58 49 53 54 53  WHERE NOT EXISTS
17850 20 28 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43   (".    "  SELEC
17860 54 20 31 20 46 52 4f 4d 20 5f 73 68 61 72 65 64  T 1 FROM _shared
17870 5f 73 63 68 65 6d 61 5f 74 6d 70 2e 73 71 6c 69  _schema_tmp.sqli
17880 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
17890 22 20 20 20 20 57 48 45 52 45 20 6e 61 6d 65 20  "    WHERE name 
178a0 49 53 20 6f 2e 6e 61 6d 65 20 41 4e 44 20 74 79  IS o.name AND ty
178b0 70 65 20 49 53 20 6f 2e 74 79 70 65 22 0a 20 20  pe IS o.type".  
178c0 20 20 22 29 22 0a 20 20 29 3b 0a 20 20 69 66 28    ")".  );.  if(
178d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
178e0 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
178f0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
17900 29 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  ) ){.    utf8_pr
17910 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74  intf(pState->out
17920 2c 20 22 25 73 20 69 73 20 4e 4f 54 20 63 6f 6d  , "%s is NOT com
17930 70 61 74 69 62 6c 65 20 28 6f 62 6a 65 63 74 73  patible (objects
17940 29 5c 6e 22 2c 20 7a 44 62 29 3b 0a 20 20 20 20  )\n", zDb);.    
17950 62 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d  bFailed = 1;.  }
17960 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65  .  shellFinalize
17970 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 0a 20  (&rc, pStmt);.. 
17980 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69   /* Check if thi
17990 73 20 64 61 74 61 62 61 73 65 20 68 61 73 20 74  s database has t
179a0 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 53  he same set of S
179b0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 61 73  QL statements as
179c0 20 74 68 65 20 0a 20 20 2a 2a 20 63 75 72 72 65   the .  ** curre
179d0 6e 74 20 64 62 2e 20 2a 2f 0a 20 20 69 66 28 20  nt db. */.  if( 
179e0 62 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  bFailed==0 ){.  
179f0 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72    shellPreparePr
17a00 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62 2c  intf(pState->db,
17a10 20 26 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a 20   &rc, &pStmt, . 
17a20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 31         "SELECT 1
17a30 20 46 52 4f 4d 20 5f 73 68 61 72 65 64 5f 73 63   FROM _shared_sc
17a40 68 65 6d 61 5f 74 6d 70 2e 73 71 6c 69 74 65 5f  hema_tmp.sqlite_
17a50 6d 61 73 74 65 72 20 41 53 20 6f 20 22 0a 20 20  master AS o ".  
17a60 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c        "WHERE sql
17a70 20 49 53 20 4e 4f 54 20 28 22 0a 20 20 20 20 20   IS NOT (".     
17a80 20 20 20 22 20 20 53 45 4c 45 43 54 20 73 71 6c     "  SELECT sql
17a90 20 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74   FROM main.sqlit
17aa0 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
17ab0 20 20 20 22 20 20 20 20 57 48 45 52 45 20 6e 61     "    WHERE na
17ac0 6d 65 20 49 53 20 6f 2e 6e 61 6d 65 20 41 4e 44  me IS o.name AND
17ad0 20 74 79 70 65 20 49 53 20 6f 2e 74 79 70 65 22   type IS o.type"
17ae0 0a 20 20 20 20 20 20 20 20 22 29 22 0a 20 20 20  .        ")".   
17af0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
17b00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
17b10 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
17b20 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
17b30 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
17b40 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22  f(pState->out, "
17b50 25 73 20 69 73 20 4e 4f 54 20 63 6f 6d 70 61 74  %s is NOT compat
17b60 69 62 6c 65 20 28 53 51 4c 29 5c 6e 22 2c 20 7a  ible (SQL)\n", z
17b70 44 62 29 3b 0a 20 20 20 20 20 20 62 46 61 69 6c  Db);.      bFail
17b80 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
17b90 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28    shellFinalize(
17ba0 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20 7d  &rc, pStmt);.  }
17bb0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
17bc0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 68 61  this database ha
17bd0 73 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f  s the same set o
17be0 66 20 72 6f 6f 74 20 70 61 67 65 73 20 61 73 20  f root pages as 
17bf0 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a  the current .  *
17c00 2a 20 64 62 2e 20 2a 2f 0a 20 20 69 66 28 20 62  * db. */.  if( b
17c10 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
17c20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69   shellPreparePri
17c30 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  ntf(pState->db, 
17c40 26 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a 20 20  &rc, &pStmt, .  
17c50 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 31 20        "SELECT 1 
17c60 46 52 4f 4d 20 5f 73 68 61 72 65 64 5f 73 63 68  FROM _shared_sch
17c70 65 6d 61 5f 74 6d 70 2e 73 71 6c 69 74 65 5f 6d  ema_tmp.sqlite_m
17c80 61 73 74 65 72 20 41 53 20 6f 20 22 0a 20 20 20  aster AS o ".   
17c90 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 6f 74       "WHERE root
17ca0 70 61 67 65 20 49 53 20 4e 4f 54 20 28 22 0a 20  page IS NOT (". 
17cb0 20 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54         "  SELECT
17cc0 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 6d   rootpage FROM m
17cd0 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  ain.sqlite_maste
17ce0 72 20 22 0a 20 20 20 20 20 20 20 20 22 20 20 20  r ".        "   
17cf0 20 57 48 45 52 45 20 6e 61 6d 65 20 49 53 20 6f   WHERE name IS o
17d00 2e 6e 61 6d 65 20 41 4e 44 20 74 79 70 65 20 49  .name AND type I
17d10 53 20 6f 2e 74 79 70 65 22 0a 20 20 20 20 20 20  S o.type".      
17d20 20 20 22 29 22 0a 20 20 20 20 29 3b 0a 20 20 20    ")".    );.   
17d30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17d40 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
17d50 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
17d60 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 69  Stmt) ){.      i
17d70 66 28 20 70 65 46 69 78 3d 3d 30 20 29 7b 0a 20  f( peFix==0 ){. 
17d80 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
17d90 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20  tf(pState->out, 
17da0 22 25 73 20 69 73 20 4e 4f 54 20 63 6f 6d 70 61  "%s is NOT compa
17db0 74 69 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65  tible (root page
17dc0 73 29 5c 6e 22 2c 20 7a 44 62 29 3b 0a 20 20 20  s)\n", zDb);.   
17dd0 20 20 20 7d 0a 20 20 20 20 20 20 62 46 61 69 6c     }.      bFail
17de0 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  ed = 1;.      if
17df0 28 20 70 65 46 69 78 20 29 20 2a 70 65 46 69 78  ( peFix ) *peFix
17e00 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
17e10 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
17e20 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a  c, pStmt);.  }..
17e30 20 20 69 66 28 20 62 46 61 69 6c 65 64 3d 3d 30    if( bFailed==0
17e40 20 29 7b 0a 20 20 20 20 73 68 65 6c 6c 50 72 65   ){.    shellPre
17e50 70 61 72 65 50 72 69 6e 74 66 28 70 53 74 61 74  parePrintf(pStat
17e60 65 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 53 74  e->db, &rc, &pSt
17e70 6d 74 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45  mt, .        "SE
17e80 4c 45 43 54 20 31 20 57 48 45 52 45 20 28 22 0a  LECT 1 WHERE (".
17e90 20 20 20 20 20 20 20 20 22 20 20 53 45 4c 45 43          "  SELEC
17ea0 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 72  T group_concat(r
17eb0 6f 6f 74 70 61 67 65 20 7c 7c 20 27 2e 27 20 7c  ootpage || '.' |
17ec0 7c 20 6e 61 6d 65 20 7c 7c 20 27 2e 27 20 7c 7c  | name || '.' ||
17ed0 20 73 71 6c 2c 20 27 2e 27 29 20 22 0a 20 20 20   sql, '.') ".   
17ee0 20 20 20 20 20 22 20 20 46 52 4f 4d 20 5f 73 68       "  FROM _sh
17ef0 61 72 65 64 5f 73 63 68 65 6d 61 5f 74 6d 70 2e  ared_schema_tmp.
17f00 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
17f10 20 20 20 20 20 20 20 22 29 20 49 53 20 4e 4f 54         ") IS NOT
17f20 20 28 22 0a 20 20 20 20 20 20 20 20 22 20 20 53   (".        "  S
17f30 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63  ELECT group_conc
17f40 61 74 28 72 6f 6f 74 70 61 67 65 20 7c 7c 20 27  at(rootpage || '
17f50 2e 27 20 7c 7c 20 6e 61 6d 65 20 7c 7c 20 27 2e  .' || name || '.
17f60 27 20 7c 7c 20 73 71 6c 2c 20 27 2e 27 29 20 22  ' || sql, '.') "
17f70 0a 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d  .        "  FROM
17f80 20 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73   main.sqlite_mas
17f90 74 65 72 22 0a 20 20 20 20 20 20 20 20 22 29 22  ter".        ")"
17fa0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
17fb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17fc0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
17fd0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
17fe0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 65   ){.      if( pe
17ff0 46 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Fix==0 ){.      
18000 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 53    utf8_printf(pS
18010 74 61 74 65 2d 3e 6f 75 74 2c 20 0a 20 20 20 20  tate->out, .    
18020 20 20 20 20 20 20 20 20 22 25 73 20 69 73 20 4e          "%s is N
18030 4f 54 20 63 6f 6d 70 61 74 69 62 6c 65 20 28 6f  OT compatible (o
18040 72 64 65 72 20 6f 66 20 73 71 6c 69 74 65 5f 6d  rder of sqlite_m
18050 61 73 74 65 72 20 72 6f 77 73 29 5c 6e 22 2c 20  aster rows)\n", 
18060 7a 44 62 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  zDb.        );. 
18070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 46 61       }.      bFa
18080 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
18090 69 66 28 20 70 65 46 69 78 20 29 20 2a 70 65 46  if( peFix ) *peF
180a0 69 78 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  ix = 2;.    }.  
180b0 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28    shellFinalize(
180c0 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20 7d  &rc, pStmt);.  }
180d0 0a 0a 20 20 69 66 28 20 62 46 61 69 6c 65 64 3d  ..  if( bFailed=
180e0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d  =0 ){.    int iM
180f0 61 69 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e  ain = -1;.    in
18100 74 20 69 4e 65 77 20 3d 20 2b 31 3b 0a 20 20 20  t iNew = +1;.   
18110 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69   shellPreparePri
18120 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  ntf(pState->db, 
18130 26 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a 20 20  &rc, &pStmt, .  
18140 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 6d 61        "PRAGMA ma
18150 69 6e 2e 73 63 68 65 6d 61 5f 76 65 72 73 69 6f  in.schema_versio
18160 6e 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  n".    );.    if
18170 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18180 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
18190 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
181a0 74 29 20 29 7b 0a 20 20 20 20 20 20 69 4d 61 69  t) ){.      iMai
181b0 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n = sqlite3_colu
181c0 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
181d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c  ;.    }.    shel
181e0 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70  lFinalize(&rc, p
181f0 53 74 6d 74 29 3b 0a 20 20 20 20 73 68 65 6c 6c  Stmt);.    shell
18200 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 70 53  PreparePrintf(pS
18210 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 20 26  tate->db, &rc, &
18220 70 53 74 6d 74 2c 20 0a 20 20 20 20 20 20 20 20  pStmt, .        
18230 22 50 52 41 47 4d 41 20 5f 73 68 61 72 65 64 5f  "PRAGMA _shared_
18240 73 63 68 65 6d 61 5f 74 6d 70 2e 73 63 68 65 6d  schema_tmp.schem
18250 61 5f 76 65 72 73 69 6f 6e 22 0a 20 20 20 20 29  a_version".    )
18260 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
18270 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
18280 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
18290 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
182a0 20 20 20 20 69 4e 65 77 20 3d 20 73 71 6c 69 74      iNew = sqlit
182b0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
182c0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  tmt, 0);.    }. 
182d0 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65     shellFinalize
182e0 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20  (&rc, pStmt);.  
182f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18300 5f 4f 4b 20 26 26 20 69 4d 61 69 6e 21 3d 69 4e  _OK && iMain!=iN
18310 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
18320 70 65 46 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20  peFix==0 ){.    
18330 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
18340 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 0a 20 20  pState->out, .  
18350 20 20 20 20 20 20 20 20 20 20 22 25 73 20 69 73            "%s is
18360 20 4e 4f 54 20 63 6f 6d 70 61 74 69 62 6c 65 20   NOT compatible 
18370 28 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 29 5c  (schema cookie)\
18380 6e 22 2c 20 7a 44 62 0a 20 20 20 20 20 20 20 20  n", zDb.        
18390 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
183a0 20 62 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20   bFailed = 1;.  
183b0 20 20 20 20 69 66 28 20 70 65 46 69 78 20 29 20      if( peFix ) 
183c0 2a 70 65 46 69 78 20 3d 20 33 3b 0a 20 20 20 20  *peFix = 3;.    
183d0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
183e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 46  =SQLITE_OK && bF
183f0 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
18400 75 74 66 38 5f 70 72 69 6e 74 66 28 70 53 74 61  utf8_printf(pSta
18410 74 65 2d 3e 6f 75 74 2c 20 22 25 73 20 69 73 20  te->out, "%s is 
18420 63 6f 6d 70 61 74 69 62 6c 65 5c 6e 22 2c 20 7a  compatible\n", z
18430 44 62 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  Db);.  }..  sqli
18440 74 65 33 5f 65 78 65 63 28 70 53 74 61 74 65 2d  te3_exec(pState-
18450 3e 64 62 2c 20 22 44 45 54 41 43 48 20 5f 73 68  >db, "DETACH _sh
18460 61 72 65 64 5f 73 63 68 65 6d 61 5f 74 6d 70 22  ared_schema_tmp"
18470 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  , 0, 0, 0);.  re
18480 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18490 2a 20 2e 73 68 61 72 65 64 2d 73 63 68 65 6d 61  * .shared-schema
184a0 20 63 68 65 63 6b 7c 66 69 78 20 44 42 31 20 44   check|fix DB1 D
184b0 42 32 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  B2....*/.static 
184c0 69 6e 74 20 73 68 61 72 65 64 53 63 68 65 6d 61  int sharedSchema
184d0 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68  DotCommand(.  Sh
184e0 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
184f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
18500 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74   Current shell t
18510 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63  ool state */.  c
18520 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
18530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18540 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
18550 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
18560 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
18570 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20  int nArg        
18580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18590 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
185a0 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
185b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
185c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
185d0 74 20 62 46 69 78 20 3d 20 30 3b 20 20 20 20 20  t bFix = 0;     
185e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
185f0 20 46 69 78 20 64 61 74 61 62 61 73 65 73 20 69   Fix databases i
18600 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
18610 69 6e 74 20 6e 31 3b 0a 20 20 69 6e 74 20 69 3b  int n1;.  int i;
18620 0a 20 20 69 66 28 20 6e 41 72 67 3c 33 20 29 7b  .  if( nArg<3 ){
18630 0a 20 20 20 20 67 6f 74 6f 20 73 68 61 72 65 64  .    goto shared
18640 5f 73 63 68 65 6d 61 5f 75 73 61 67 65 3b 0a 20  _schema_usage;. 
18650 20 7d 0a 0a 20 20 6e 31 20 3d 20 28 69 6e 74 29   }..  n1 = (int)
18660 73 74 72 6c 65 6e 28 61 7a 41 72 67 5b 31 5d 29  strlen(azArg[1])
18670 3b 0a 20 20 69 66 28 20 6e 31 3e 30 20 26 26 20  ;.  if( n1>0 && 
18680 6e 31 3c 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28  n1<=3 && memcmp(
18690 22 66 69 78 22 2c 20 61 7a 41 72 67 5b 31 5d 2c  "fix", azArg[1],
186a0 20 6e 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 62   n1)==0 ){.    b
186b0 46 69 78 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Fix = 1;.  }else
186c0 20 69 66 28 20 6e 31 3d 3d 30 20 7c 7c 20 6e 31   if( n1==0 || n1
186d0 3e 35 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 63 68  >5 || memcmp("ch
186e0 65 63 6b 22 2c 20 61 7a 41 72 67 5b 31 5d 2c 20  eck", azArg[1], 
186f0 6e 31 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  n1) ){.    goto 
18700 73 68 61 72 65 64 5f 73 63 68 65 6d 61 5f 75 73  shared_schema_us
18710 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  age;.  }..  for(
18720 69 3d 32 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=2; rc==SQLITE_
18730 4f 4b 20 26 26 20 69 3c 6e 41 72 67 3b 20 69 2b  OK && i<nArg; i+
18740 2b 29 7b 0a 20 20 20 20 69 6e 74 20 65 46 69 78  +){.    int eFix
18750 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
18760 68 61 72 65 64 53 63 68 65 6d 61 43 68 65 63 6b  haredSchemaCheck
18770 28 70 53 74 61 74 65 2c 20 61 7a 41 72 67 5b 69  (pState, azArg[i
18780 5d 2c 20 62 46 69 78 20 3f 20 26 65 46 69 78 20  ], bFix ? &eFix 
18790 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  : 0);.    if( rc
187a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
187b0 46 69 78 20 26 26 20 65 46 69 78 20 29 7b 0a 20  Fix && eFix ){. 
187c0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
187d0 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 46  (pState->out, "F
187e0 69 78 69 6e 67 20 25 73 2e 2e 2e 20 22 2c 20 61  ixing %s... ", a
187f0 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
18800 66 66 6c 75 73 68 28 70 53 74 61 74 65 2d 3e 6f  fflush(pState->o
18810 75 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ut);.      rc = 
18820 73 68 61 72 65 64 53 63 68 65 6d 61 46 69 78 28  sharedSchemaFix(
18830 70 53 74 61 74 65 2c 20 61 7a 41 72 67 5b 69 5d  pState, azArg[i]
18840 2c 20 65 46 69 78 29 3b 0a 20 20 20 20 20 20 69  , eFix);.      i
18850 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18860 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
18870 20 73 68 61 72 65 64 53 63 68 65 6d 61 43 68 65   sharedSchemaChe
18880 63 6b 28 70 53 74 61 74 65 2c 20 61 7a 41 72 67  ck(pState, azArg
18890 5b 69 5d 2c 20 26 65 46 69 78 29 3b 0a 20 20 20  [i], &eFix);.   
188a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
188b0 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 78 20 29  ITE_OK && eFix )
188c0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
188d0 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  _printf(pState->
188e0 6f 75 74 2c 20 22 56 41 43 55 55 4d 69 6e 67 20  out, "VACUUMing 
188f0 6d 61 69 6e 2e 2e 2e 20 22 29 3b 0a 20 20 20 20  main... ");.    
18900 20 20 20 20 20 20 66 66 6c 75 73 68 28 70 53 74        fflush(pSt
18910 61 74 65 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 20  ate->out);.     
18920 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18930 33 5f 65 78 65 63 28 70 53 74 61 74 65 2d 3e 64  3_exec(pState->d
18940 62 2c 20 22 56 41 43 55 55 4d 20 6d 61 69 6e 22  b, "VACUUM main"
18950 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
18960 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
18970 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18980 20 20 20 20 20 20 20 72 63 20 3d 20 73 68 61 72         rc = shar
18990 65 64 53 63 68 65 6d 61 43 68 65 63 6b 28 70 53  edSchemaCheck(pS
189a0 74 61 74 65 2c 20 61 7a 41 72 67 5b 69 5d 2c 20  tate, azArg[i], 
189b0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
189c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
189d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
189e0 65 74 75 72 6e 20 72 63 3b 0a 20 73 68 61 72 65  eturn rc;. share
189f0 64 5f 73 63 68 65 6d 61 5f 75 73 61 67 65 3a 0a  d_schema_usage:.
18a00 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
18a10 65 72 72 2c 20 22 75 73 61 67 65 3a 20 2e 73 68  err, "usage: .sh
18a20 61 72 65 64 2d 73 63 68 65 6d 61 20 63 68 65 63  ared-schema chec
18a30 6b 7c 66 69 78 20 44 42 31 20 44 42 32 2e 2e 2e  k|fix DB1 DB2...
18a40 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  \n");.  return S
18a50 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
18a60 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
18a70 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 65   statement or se
18a80 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 2e  t of statements.
18a90 20 20 50 72 69 6e 74 0a 2a 2a 20 61 6e 79 20 72    Print.** any r
18aa0 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f 6c 75 6d  esult rows/colum
18ab0 6e 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ns depending on 
18ac0 74 68 65 20 63 75 72 72 65 6e 74 20 6d 6f 64 65  the current mode
18ad0 0a 2a 2a 20 73 65 74 20 76 69 61 20 74 68 65 20  .** set via the 
18ae0 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63  supplied callbac
18af0 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  k..**.** This is
18b00 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20 74 6f   very similar to
18b10 20 53 51 4c 69 74 65 27 73 20 62 75 69 6c 74 2d   SQLite's built-
18b20 69 6e 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  in sqlite3_exec(
18b30 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 65 78  ).** function ex
18b40 63 65 70 74 20 69 74 20 74 61 6b 65 73 20 61 20  cept it takes a 
18b50 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65  slightly differe
18b60 6e 74 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 61  nt callback.** a
18b70 6e 64 20 63 61 6c 6c 62 61 63 6b 20 64 61 74 61  nd callback data
18b80 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
18b90 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 65  atic int shell_e
18ba0 78 65 63 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  xec(.  ShellStat
18bb0 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20  e *pArg,        
18bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bd0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
18be0 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 63  hellState */.  c
18bf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
18c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
18c20 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  to be evaluated 
18c30 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
18c40 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20 20  rMsg            
18c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18c60 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72 69 74  * Error msg writ
18c70 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
18c80 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
18c90 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 20 20 20  Stmt = NULL;    
18ca0 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 74 6f   /* Statement to
18cb0 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20 69   execute. */.  i
18cc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18cd0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
18ce0 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
18cf0 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 63 6f  .  int rc2;.  co
18d00 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66 74 6f  nst char *zLefto
18d10 76 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ver;          /*
18d20 20 54 61 69 6c 20 6f 66 20 75 6e 70 72 6f 63 65   Tail of unproce
18d30 73 73 65 64 20 53 51 4c 20 2a 2f 0a 20 20 73 71  ssed SQL */.  sq
18d40 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 41 72 67  lite3 *db = pArg
18d50 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 7a 45  ->db;..  if( pzE
18d60 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 2a 70 7a  rrMsg ){.    *pz
18d70 45 72 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20  ErrMsg = NULL;. 
18d80 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
18d90 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
18da0 41 42 4c 45 0a 20 20 69 66 28 20 70 41 72 67 2d  ABLE.  if( pArg-
18db0 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20  >expert.pExpert 
18dc0 29 7b 0a 20 20 20 20 72 63 20 3d 20 65 78 70 65  ){.    rc = expe
18dd0 72 74 48 61 6e 64 6c 65 53 51 4c 28 70 41 72 67  rtHandleSQL(pArg
18de0 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72 4d 73 67  , zSql, pzErrMsg
18df0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 65 78  );.    return ex
18e00 70 65 72 74 46 69 6e 69 73 68 28 70 41 72 67 2c  pertFinish(pArg,
18e10 20 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29   (rc!=SQLITE_OK)
18e20 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d  , pzErrMsg);.  }
18e30 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65  .#endif..  while
18e40 28 20 7a 53 71 6c 5b 30 5d 20 26 26 20 28 53 51  ( zSql[0] && (SQ
18e50 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72 63 29 20 29  LITE_OK == rc) )
18e60 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
18e70 73 74 20 63 68 61 72 20 2a 7a 53 74 6d 74 53 71  st char *zStmtSq
18e80 6c 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  l;.    rc = sqli
18e90 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
18ea0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
18eb0 74 6d 74 2c 20 26 7a 4c 65 66 74 6f 76 65 72 29  tmt, &zLeftover)
18ec0 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
18ed0 5f 4f 4b 20 21 3d 20 72 63 20 29 7b 0a 20 20 20  _OK != rc ){.   
18ee0 20 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20     if( pzErrMsg 
18ef0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  ){.        *pzEr
18f00 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72 5f  rMsg = save_err_
18f10 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  msg(db);.      }
18f20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18f30 20 20 69 66 28 20 21 70 53 74 6d 74 20 29 7b 0a    if( !pStmt ){.
18f40 20 20 20 20 20 20 20 20 2f 2a 20 74 68 69 73 20          /* this 
18f50 68 61 70 70 65 6e 73 20 66 6f 72 20 61 20 63 6f  happens for a co
18f60 6d 6d 65 6e 74 20 6f 72 20 77 68 69 74 65 2d 73  mment or white-s
18f70 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  pace */.        
18f80 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72  zSql = zLeftover
18f90 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
18fa0 20 49 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d   IsSpace(zSql[0]
18fb0 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20  ) ) zSql++;.    
18fc0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
18fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 74 6d      }.      zStm
18fe0 74 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73  tSql = sqlite3_s
18ff0 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ql(pStmt);.     
19000 20 69 66 28 20 7a 53 74 6d 74 53 71 6c 3d 3d 30   if( zStmtSql==0
19010 20 29 20 7a 53 74 6d 74 53 71 6c 20 3d 20 22 22   ) zStmtSql = ""
19020 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49  ;.      while( I
19030 73 53 70 61 63 65 28 7a 53 74 6d 74 53 71 6c 5b  sSpace(zStmtSql[
19040 30 5d 29 20 29 20 7a 53 74 6d 74 53 71 6c 2b 2b  0]) ) zStmtSql++
19050 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 73 61 76 65  ;..      /* save
19060 20 6f 66 66 20 74 68 65 20 70 72 65 70 61 72 65   off the prepare
19070 64 20 73 74 61 74 6d 65 6e 74 20 68 61 6e 64 6c  d statment handl
19080 65 20 61 6e 64 20 72 65 73 65 74 20 72 6f 77 20  e and reset row 
19090 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69  count */.      i
190a0 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20  f( pArg ){.     
190b0 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d     pArg->pStmt =
190c0 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20   pStmt;.        
190d0 70 41 72 67 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20  pArg->cnt = 0;. 
190e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
190f0 20 65 63 68 6f 20 74 68 65 20 73 71 6c 20 73 74   echo the sql st
19100 61 74 65 6d 65 6e 74 20 69 66 20 65 63 68 6f 20  atement if echo 
19110 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  on */.      if( 
19120 70 41 72 67 20 26 26 20 53 68 65 6c 6c 48 61 73  pArg && ShellHas
19130 46 6c 61 67 28 70 41 72 67 2c 20 53 48 46 4c 47  Flag(pArg, SHFLG
19140 5f 45 63 68 6f 29 20 29 7b 0a 20 20 20 20 20 20  _Echo) ){.      
19150 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
19160 72 67 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  rg->out, "%s\n",
19170 20 7a 53 74 6d 74 53 71 6c 20 3f 20 7a 53 74 6d   zStmtSql ? zStm
19180 74 53 71 6c 20 3a 20 7a 53 71 6c 29 3b 0a 20 20  tSql : zSql);.  
19190 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
191a0 53 68 6f 77 20 74 68 65 20 45 58 50 4c 41 49 4e  Show the EXPLAIN
191b0 20 51 55 45 52 59 20 50 4c 41 4e 20 69 66 20 2e   QUERY PLAN if .
191c0 65 71 70 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 20  eqp is on */.   
191d0 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70     if( pArg && p
191e0 41 72 67 2d 3e 61 75 74 6f 45 51 50 20 26 26 20  Arg->autoEQP && 
191f0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69 73 65  sqlite3_stmt_ise
19200 78 70 6c 61 69 6e 28 70 53 74 6d 74 29 3d 3d 30  xplain(pStmt)==0
19210 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19220 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61  te3_stmt *pExpla
19230 69 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  in;.        char
19240 20 2a 7a 45 51 50 3b 0a 20 20 20 20 20 20 20 20   *zEQP;.        
19250 69 6e 74 20 74 72 69 67 67 65 72 45 51 50 20 3d  int triggerEQP =
19260 20 30 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61   0;.        disa
19270 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f  ble_debug_trace_
19280 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20 20  modes();.       
19290 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
192a0 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  ig(db, SQLITE_DB
192b0 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45  CONFIG_TRIGGER_E
192c0 51 50 2c 20 2d 31 2c 20 26 74 72 69 67 67 65 72  QP, -1, &trigger
192d0 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20 69 66  EQP);.        if
192e0 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e  ( pArg->autoEQP>
192f0 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72  =AUTOEQP_trigger
19300 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
19310 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
19320 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  db, SQLITE_DBCON
19330 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c  FIG_TRIGGER_EQP,
19340 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
19350 7d 0a 20 20 20 20 20 20 20 20 7a 45 51 50 20 3d  }.        zEQP =
19360 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
19370 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  ("EXPLAIN QUERY 
19380 50 4c 41 4e 20 25 73 22 2c 20 7a 53 74 6d 74 53  PLAN %s", zStmtS
19390 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ql);.        rc 
193a0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
193b0 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d  e_v2(db, zEQP, -
193c0 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29  1, &pExplain, 0)
193d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
193e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
193f0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
19400 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78  sqlite3_step(pEx
19410 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45 5f 52  plain)==SQLITE_R
19420 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OW ){.          
19430 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
19440 51 50 4c 69 6e 65 20 3d 20 28 63 6f 6e 73 74 20  QPLine = (const 
19450 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
19460 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c 61  lumn_text(pExpla
19470 69 6e 2c 33 29 3b 0a 20 20 20 20 20 20 20 20 20  in,3);.         
19480 20 20 20 69 6e 74 20 69 45 71 70 49 64 20 3d 20     int iEqpId = 
19490 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
194a0 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b  nt(pExplain, 0);
194b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
194c0 20 69 50 61 72 65 6e 74 49 64 20 3d 20 73 71 6c   iParentId = sql
194d0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
194e0 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a 20 20  pExplain, 1);.  
194f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 45            if( zE
19500 51 50 4c 69 6e 65 5b 30 5d 3d 3d 27 2d 27 20 29  QPLine[0]=='-' )
19510 20 65 71 70 5f 72 65 6e 64 65 72 28 70 41 72 67   eqp_render(pArg
19520 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  );.            e
19530 71 70 5f 61 70 70 65 6e 64 28 70 41 72 67 2c 20  qp_append(pArg, 
19540 69 45 71 70 49 64 2c 20 69 50 61 72 65 6e 74 49  iEqpId, iParentI
19550 64 2c 20 7a 45 51 50 4c 69 6e 65 29 3b 0a 20 20  d, zEQPLine);.  
19560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19570 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72 28 70      eqp_render(p
19580 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Arg);.        }.
19590 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
195a0 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69  finalize(pExplai
195b0 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
195c0 74 65 33 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a  te3_free(zEQP);.
195d0 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67          if( pArg
195e0 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45  ->autoEQP>=AUTOE
195f0 51 50 5f 66 75 6c 6c 20 29 7b 0a 20 20 20 20 20  QP_full ){.     
19600 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 64 6f 20       /* Also do 
19610 61 6e 20 45 58 50 4c 41 49 4e 20 66 6f 72 20 22  an EXPLAIN for "
19620 2e 65 71 70 20 66 75 6c 6c 22 20 6d 6f 64 65 20  .eqp full" mode 
19630 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45 51  */.          zEQ
19640 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  P = sqlite3_mpri
19650 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 25 73 22  ntf("EXPLAIN %s"
19660 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20 20 20  , zStmtSql);.   
19670 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19680 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
19690 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45  b, zEQP, -1, &pE
196a0 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20  xplain, 0);.    
196b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
196c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
196d0 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f         pArg->cMo
196e0 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69  de = MODE_Explai
196f0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  n;.            e
19700 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70  xplain_data_prep
19710 61 72 65 28 70 41 72 67 2c 20 70 45 78 70 6c 61  are(pArg, pExpla
19720 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  in);.           
19730 20 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73   exec_prepared_s
19740 74 6d 74 28 70 41 72 67 2c 20 70 45 78 70 6c 61  tmt(pArg, pExpla
19750 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  in);.           
19760 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65   explain_data_de
19770 6c 65 74 65 28 70 41 72 67 29 3b 0a 20 20 20 20  lete(pArg);.    
19780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19790 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
197a0 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20  ze(pExplain);.  
197b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
197c0 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20 20 20  free(zEQP);.    
197d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
197e0 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e  ( pArg->autoEQP>
197f0 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72  =AUTOEQP_trigger
19800 20 26 26 20 74 72 69 67 67 65 72 45 51 50 3d 3d   && triggerEQP==
19810 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
19820 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
19830 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f  (db, SQLITE_DBCO
19840 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50  NFIG_TRIGGER_EQP
19850 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
19860 20 20 20 2f 2a 20 52 65 70 72 65 70 61 72 65 20     /* Reprepare 
19870 70 53 74 6d 74 20 62 65 66 6f 72 65 20 72 65 61  pStmt before rea
19880 63 74 69 76 69 6e 67 20 74 72 61 63 65 20 6d 6f  ctiving trace mo
19890 64 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  des */.         
198a0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
198b0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
198c0 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70      sqlite3_prep
198d0 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
198e0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
198f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
19900 41 72 67 20 29 20 70 41 72 67 2d 3e 70 53 74 6d  Arg ) pArg->pStm
19910 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20  t = pStmt;.     
19920 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 73     }.        res
19930 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63 65  tore_debug_trace
19940 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20  _modes();.      
19950 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  }..      if( pAr
19960 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72  g ){.        pAr
19970 67 2d 3e 63 4d 6f 64 65 20 3d 20 70 41 72 67 2d  g->cMode = pArg-
19980 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 69  >mode;.        i
19990 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 78 70  f( pArg->autoExp
199a0 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lain ){.        
199b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
199c0 6d 74 5f 69 73 65 78 70 6c 61 69 6e 28 70 53 74  mt_isexplain(pSt
199d0 6d 74 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  mt)==1 ){.      
199e0 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64        pArg->cMod
199f0 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  e = MODE_Explain
19a00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
19a10 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
19a20 74 65 33 5f 73 74 6d 74 5f 69 73 65 78 70 6c 61  te3_stmt_isexpla
19a30 69 6e 28 70 53 74 6d 74 29 3d 3d 32 20 29 7b 0a  in(pStmt)==2 ){.
19a40 20 20 20 20 20 20 20 20 20 20 20 20 70 41 72 67              pArg
19a50 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45  ->cMode = MODE_E
19a60 51 50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  QP;.          }.
19a70 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
19a80 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68 65     /* If the she
19a90 6c 6c 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ll is currently 
19aa0 69 6e 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f  in ".explain" mo
19ab0 64 65 2c 20 67 61 74 68 65 72 20 74 68 65 20 65  de, gather the e
19ac0 78 74 72 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  xtra.        ** 
19ad0 64 61 74 61 20 72 65 71 75 69 72 65 64 20 74 6f  data required to
19ae0 20 61 64 64 20 69 6e 64 65 6e 74 73 20 74 6f 20   add indents to 
19af0 74 68 65 20 6f 75 74 70 75 74 2e 2a 2f 0a 20 20  the output.*/.  
19b00 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e        if( pArg->
19b10 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c  cMode==MODE_Expl
19b20 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ain ){.         
19b30 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72   explain_data_pr
19b40 65 70 61 72 65 28 70 41 72 67 2c 20 70 53 74 6d  epare(pArg, pStm
19b50 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
19b60 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 69 6e      }..      bin
19b70 64 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28  d_prepared_stmt(
19b80 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20 20  pArg, pStmt);.  
19b90 20 20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65      exec_prepare
19ba0 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 53 74  d_stmt(pArg, pSt
19bb0 6d 74 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  mt);.      expla
19bc0 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70  in_data_delete(p
19bd0 41 72 67 29 3b 0a 20 20 20 20 20 20 65 71 70 5f  Arg);.      eqp_
19be0 72 65 6e 64 65 72 28 70 41 72 67 29 3b 0a 0a 20  render(pArg);.. 
19bf0 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 75 73       /* print us
19c00 61 67 65 20 73 74 61 74 73 20 69 66 20 73 74 61  age stats if sta
19c10 74 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ts on */.      i
19c20 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
19c30 3e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20  >statsOn ){.    
19c40 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61 74      display_stat
19c50 73 28 64 62 2c 20 70 41 72 67 2c 20 30 29 3b 0a  s(db, pArg, 0);.
19c60 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
19c70 2a 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f 75  * print loop-cou
19c80 6e 74 65 72 73 20 69 66 20 72 65 71 75 69 72 65  nters if require
19c90 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  d */.      if( p
19ca0 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73 63 61  Arg && pArg->sca
19cb0 6e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20  nstatsOn ){.    
19cc0 20 20 20 20 64 69 73 70 6c 61 79 5f 73 63 61 6e      display_scan
19cd0 73 74 61 74 73 28 64 62 2c 20 70 41 72 67 29 3b  stats(db, pArg);
19ce0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
19cf0 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  /* Finalize the 
19d00 73 74 61 74 65 6d 65 6e 74 20 6a 75 73 74 20 65  statement just e
19d10 78 65 63 75 74 65 64 2e 20 49 66 20 74 68 69 73  xecuted. If this
19d20 20 66 61 69 6c 73 2c 20 73 61 76 65 20 61 0a 20   fails, save a. 
19d30 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20       ** copy of 
19d40 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
19d50 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  e. Otherwise, se
19d60 74 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74 20  t zSql to point 
19d70 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
19d80 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 74  next statement t
19d90 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20  o execute. */.  
19da0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
19db0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
19dc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19dd0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20  =SQLITE_NOMEM ) 
19de0 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
19df0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19e00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71  K ){.        zSq
19e10 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20  l = zLeftover;. 
19e20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73         while( Is
19e30 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29  Space(zSql[0]) )
19e40 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d   zSql++;.      }
19e50 65 6c 73 65 20 69 66 28 20 70 7a 45 72 72 4d 73  else if( pzErrMs
19e60 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a  g ){.        *pz
19e70 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72  ErrMsg = save_er
19e80 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20  r_msg(db);.     
19e90 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c 65   }..      /* cle
19ea0 61 72 20 73 61 76 65 64 20 73 74 6d 74 20 68 61  ar saved stmt ha
19eb0 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  ndle */.      if
19ec0 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ( pArg ){.      
19ed0 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20    pArg->pStmt = 
19ee0 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NULL;.      }.  
19ef0 20 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20 77    }.  } /* end w
19f00 68 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72  hile */..  retur
19f10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
19f20 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 70 72  elease memory pr
19f30 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
19f40 65 64 20 62 79 20 74 61 62 6c 65 43 6f 6c 75 6d  ed by tableColum
19f50 6e 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74 61 74  nList()..*/.stat
19f60 69 63 20 76 6f 69 64 20 66 72 65 65 43 6f 6c 75  ic void freeColu
19f70 6d 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a 61 7a  mnList(char **az
19f80 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
19f90 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b   for(i=1; azCol[
19fa0 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  i]; i++){.    sq
19fb0 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c  lite3_free(azCol
19fc0 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 61  [i]);.  }.  /* a
19fd0 7a 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73 74 61  zCol[0] is a sta
19fe0 74 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  tic string */.  
19ff0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43  sqlite3_free(azC
1a000 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ol);.}../*.** Re
1a010 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  turn a list of p
1a020 6f 69 6e 74 65 72 73 20 74 6f 20 73 74 72 69 6e  ointers to strin
1a030 67 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65  gs which are the
1a040 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a 2a   names of all.**
1a050 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c   columns in tabl
1a060 65 20 7a 54 61 62 2e 20 20 20 54 68 65 20 6d 65  e zTab.   The me
1a070 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
1a080 20 6e 61 6d 65 73 20 69 73 20 64 79 6e 61 6d 69   names is dynami
1a090 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  cally.** allocat
1a0a0 65 64 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72  ed and must be r
1a0b0 65 6c 65 61 73 65 64 20 62 79 20 74 68 65 20 63  eleased by the c
1a0c0 61 6c 6c 65 72 20 75 73 69 6e 67 20 61 20 73 75  aller using a su
1a0d0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
1a0e0 20 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69   to freeColumnLi
1a0f0 73 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  st()..**.** The 
1a100 61 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79 20 69  azCol[0] entry i
1a110 73 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e 20  s usually NULL. 
1a120 20 48 6f 77 65 76 65 72 2c 20 69 66 20 7a 54 61   However, if zTa
1a130 62 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77  b contains a row
1a140 69 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68 61 74  id.** value that
1a150 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72 65   needs to be pre
1a160 73 65 72 76 65 64 2c 20 74 68 65 6e 20 61 7a 43  served, then azC
1a170 6f 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65 64 20  ol[0] is filled 
1a180 69 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6e  in with the.** n
1a190 61 6d 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ame of the rowid
1a1a0 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54   column..**.** T
1a1b0 68 65 20 66 69 72 73 74 20 72 65 67 75 6c 61 72  he first regular
1a1c0 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74   column in the t
1a1d0 61 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b 31 5d  able is azCol[1]
1a1e0 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73 20 74  .  The list is t
1a1f0 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62 79 20  erminated.** by 
1a200 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 7a  an entry with az
1a210 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73 74  Col[i]==0..*/.st
1a220 61 74 69 63 20 63 68 61 72 20 2a 2a 74 61 62 6c  atic char **tabl
1a230 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68 65 6c  eColumnList(Shel
1a240 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74  lState *p, const
1a250 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20   char *zTab){.  
1a260 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20 30  char **azCol = 0
1a270 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
1a280 20 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61 72 20   *pStmt;.  char 
1a290 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 43 6f  *zSql;.  int nCo
1a2a0 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41 6c  l = 0;.  int nAl
1a2b0 6c 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  loc = 0;.  int n
1a2c0 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  PK = 0;       /*
1a2d0 20 4e 75 6d 62 65 72 20 6f 66 20 50 52 49 4d 41   Number of PRIMA
1a2e0 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 73  RY KEY columns s
1a2f0 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  een */.  int isI
1a300 50 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  PK = 0;     /* T
1a310 72 75 65 20 69 66 20 6f 6e 65 20 50 52 49 4d 41  rue if one PRIMA
1a320 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 66  RY KEY column of
1a330 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 2a 2f   type INTEGER */
1a340 0a 20 20 69 6e 74 20 70 72 65 73 65 72 76 65 52  .  int preserveR
1a350 6f 77 69 64 20 3d 20 53 68 65 6c 6c 48 61 73 46  owid = ShellHasF
1a360 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72 65  lag(p, SHFLG_Pre
1a370 73 65 72 76 65 52 6f 77 69 64 29 3b 0a 20 20 69  serveRowid);.  i
1a380 6e 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d  nt rc;..  zSql =
1a390 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1a3a0 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69  ("PRAGMA table_i
1a3b0 6e 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b 0a  nfo=%Q", zTab);.
1a3c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
1a3d0 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
1a3e0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
1a3f0 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
1a400 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69  _free(zSql);.  i
1a410 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 30  f( rc ) return 0
1a420 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ;.  while( sqlit
1a430 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
1a440 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1a450 20 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c 6c    if( nCol>=nAll
1a460 6f 63 2d 32 20 29 7b 0a 20 20 20 20 20 20 6e 41  oc-2 ){.      nA
1a470 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32 20  lloc = nAlloc*2 
1a480 2b 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20 20 20  + nCol + 10;.   
1a490 20 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69 74     azCol = sqlit
1a4a0 65 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f 6c  e3_realloc(azCol
1a4b0 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28  , nAlloc*sizeof(
1a4c0 61 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20  azCol[0]));.    
1a4d0 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29    if( azCol==0 )
1a4e0 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65   shell_out_of_me
1a4f0 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20  mory();.    }.  
1a500 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d 20    azCol[++nCol] 
1a510 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1a520 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
1a530 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
1a540 74 2c 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20  t, 1));.    if( 
1a550 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
1a560 6e 74 28 70 53 74 6d 74 2c 20 35 29 20 29 7b 0a  nt(pStmt, 5) ){.
1a570 20 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20 20        nPK++;.   
1a580 20 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20 20     if( nPK==1.  
1a590 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f       && sqlite3_
1a5a0 73 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20 63  stricmp((const c
1a5b0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
1a5c0 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32  umn_text(pStmt,2
1a5d0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e               "IN
1a5f0 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20  TEGER")==0.     
1a600 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50   ){.        isIP
1a610 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  K = 1;.      }el
1a620 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50  se{.        isIP
1a630 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  K = 0;.      }. 
1a640 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1a650 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
1a660 74 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c 3d  t);.  if( azCol=
1a670 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1a680 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a 20   azCol[0] = 0;. 
1a690 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20 3d   azCol[nCol+1] =
1a6a0 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65   0;..  /* The de
1a6b0 63 69 73 69 6f 6e 20 6f 66 20 77 68 65 74 68 65  cision of whethe
1a6c0 72 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69 64  r or not a rowid
1a6d0 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 74 6f   really needs to
1a6e0 20 62 65 20 70 72 65 73 65 72 76 65 64 0a 20 20   be preserved.  
1a6f0 2a 2a 20 69 73 20 74 72 69 63 6b 79 2e 20 20 57  ** is tricky.  W
1a700 65 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20  e never need to 
1a710 70 72 65 73 65 72 76 65 20 61 20 72 6f 77 69 64  preserve a rowid
1a720 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52   for a WITHOUT R
1a730 4f 57 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a 20  OWID table.  ** 
1a740 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
1a750 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
1a760 52 59 20 4b 45 59 2e 20 20 57 65 20 61 72 65 20  RY KEY.  We are 
1a770 75 6e 61 62 6c 65 20 74 6f 20 70 72 65 73 65 72  unable to preser
1a780 76 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20 6f  ve.  ** rowids o
1a790 6e 20 74 61 62 6c 65 73 20 77 68 65 72 65 20 74  n tables where t
1a7a0 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e 61 63  he rowid is inac
1a7b0 63 65 73 73 69 62 6c 65 20 62 65 63 61 75 73 65  cessible because
1a7c0 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72   there are other
1a7d0 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e  .  ** columns in
1a7e0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 64   the table named
1a7f0 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69   "rowid", "_rowi
1a800 64 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e 0a  d_", and "oid"..
1a810 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 73 65    */.  if( prese
1a820 72 76 65 52 6f 77 69 64 20 26 26 20 69 73 49 50  rveRowid && isIP
1a830 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  K ){.    /* If a
1a840 20 73 69 6e 67 6c 65 20 50 52 49 4d 41 52 59 20   single PRIMARY 
1a850 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20  KEY column with 
1a860 74 79 70 65 20 49 4e 54 45 47 45 52 20 77 61 73  type INTEGER was
1a870 20 73 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a 20   seen, then it. 
1a880 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 61     ** might be a
1a890 6e 20 61 6c 69 73 65 20 66 6f 72 20 74 68 65 20  n alise for the 
1a8a0 52 4f 57 49 44 2e 20 20 42 75 74 20 69 74 20 6d  ROWID.  But it m
1a8b0 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20 57  ight also be a W
1a8c0 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 20  ITHOUT ROWID.   
1a8d0 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61 20 49   ** table or a I
1a8e0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1a8f0 45 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c 20  EY DESC column, 
1a900 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68  neither of which
1a910 20 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57 49   are.    ** ROWI
1a920 44 20 61 6c 69 61 73 65 73 2e 20 20 54 6f 20 64  D aliases.  To d
1a930 69 73 74 69 6e 67 75 69 73 68 20 74 68 65 73 65  istinguish these
1a940 20 63 61 73 65 73 2c 20 63 68 65 63 6b 20 74 6f   cases, check to
1a950 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 74   see if.    ** t
1a960 68 65 72 65 20 69 73 20 61 20 22 70 6b 22 20 65  here is a "pk" e
1a970 6e 74 72 79 20 69 6e 20 22 50 52 41 47 4d 41 20  ntry in "PRAGMA 
1a980 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20 54 68  index_list".  Th
1a990 65 72 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ere will be.    
1a9a0 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65 78  ** no "pk" index
1a9b0 20 69 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   if the PRIMARY 
1a9c0 4b 45 59 20 72 65 61 6c 6c 79 20 69 73 20 61 6e  KEY really is an
1a9d0 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52   alias for the R
1a9e0 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  OWID..    */.   
1a9f0 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
1aa00 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
1aa10 31 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69 6e  1 FROM pragma_in
1aa20 64 65 78 5f 6c 69 73 74 28 25 51 29 22 0a 20 20  dex_list(%Q)".  
1aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa40 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
1aa50 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20 7a   origin='pk'", z
1aa60 54 61 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Tab);.    rc = s
1aa70 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
1aa80 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
1aa90 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
1aaa0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1aab0 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  zSql);.    if( r
1aac0 63 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 43  c ){.      freeC
1aad0 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29  olumnList(azCol)
1aae0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1aaf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1ab00 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
1ab10 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tmt);.    sqlite
1ab20 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
1ab30 29 3b 0a 20 20 20 20 70 72 65 73 65 72 76 65 52  );.    preserveR
1ab40 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49 54  owid = rc==SQLIT
1ab50 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28  E_ROW;.  }.  if(
1ab60 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 29   preserveRowid )
1ab70 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70 72  {.    /* Only pr
1ab80 65 73 65 72 76 65 20 74 68 65 20 72 6f 77 69 64  eserve the rowid
1ab90 20 69 66 20 77 65 20 63 61 6e 20 66 69 6e 64 20   if we can find 
1aba0 61 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 66 6f  a name to use fo
1abb0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 77  r the.    ** row
1abc0 69 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63  id */.    static
1abd0 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b 5d   char *azRowid[]
1abe0 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22 5f   = { "rowid", "_
1abf0 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22 20 7d  rowid_", "oid" }
1ac00 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ;.    int i, j;.
1ac10 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33      for(j=0; j<3
1ac20 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; j++){.      fo
1ac30 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b 20  r(i=1; i<=nCol; 
1ac40 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
1ac50 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
1ac60 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a 43  p(azRowid[j],azC
1ac70 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65 61  ol[i])==0 ) brea
1ac80 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1ac90 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a 20   if( i>nCol ){. 
1aca0 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69         /* At thi
1acb0 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77  s point, we know
1acc0 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a 5d   that azRowid[j]
1acd0 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65   is not the name
1ace0 20 6f 66 20 61 6e 79 0a 20 20 20 20 20 20 20 20   of any.        
1acf0 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c 75  ** ordinary colu
1ad00 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  mn in the table.
1ad10 20 20 56 65 72 69 66 79 20 74 68 61 74 20 61 7a    Verify that az
1ad20 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20 76 61  Rowid[j] is a va
1ad30 6c 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  lid.        ** n
1ad40 61 6d 65 20 66 6f 72 20 74 68 65 20 72 6f 77 69  ame for the rowi
1ad50 64 20 62 65 66 6f 72 65 20 61 64 64 69 6e 67 20  d before adding 
1ad60 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e 20  it to azCol[0]. 
1ad70 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20   WITHOUT ROWID. 
1ad80 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73         ** tables
1ad90 20 77 69 6c 6c 20 66 61 69 6c 20 74 68 69 73 20   will fail this 
1ada0 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20 20  last check */.  
1adb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1adc0 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
1add0 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c 30  metadata(p->db,0
1ade0 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a 5d  ,zTab,azRowid[j]
1adf0 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20  ,0,0,0,0,0);.   
1ae00 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1ae10 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b 30  ITE_OK ) azCol[0
1ae20 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b 0a  ] = azRowid[j];.
1ae30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1ae40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ae50 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c 3b  .  return azCol;
1ae60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c 65  .}../*.** Toggle
1ae70 20 74 68 65 20 72 65 76 65 72 73 65 5f 75 6e 6f   the reverse_uno
1ae80 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 20 73  rdered_selects s
1ae90 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  etting..*/.stati
1aea0 63 20 76 6f 69 64 20 74 6f 67 67 6c 65 53 65 6c  c void toggleSel
1aeb0 65 63 74 4f 72 64 65 72 28 73 71 6c 69 74 65 33  ectOrder(sqlite3
1aec0 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74 65 33   *db){.  sqlite3
1aed0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
1aee0 3b 0a 20 20 69 6e 74 20 69 53 65 74 74 69 6e 67  ;.  int iSetting
1aef0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 53 74   = 0;.  char zSt
1af00 6d 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74  mt[100];.  sqlit
1af10 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
1af20 2c 20 22 50 52 41 47 4d 41 20 72 65 76 65 72 73  , "PRAGMA revers
1af30 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65  e_unordered_sele
1af40 63 74 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74  cts", -1, &pStmt
1af50 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  , 0);.  if( sqli
1af60 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
1af70 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
1af80 20 20 20 69 53 65 74 74 69 6e 67 20 3d 20 73 71     iSetting = sq
1af90 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
1afa0 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  (pStmt, 0);.  }.
1afb0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
1afc0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c  ze(pStmt);.  sql
1afd0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
1afe0 7a 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53 74  zeof(zStmt), zSt
1aff0 6d 74 2c 0a 20 20 20 20 20 20 20 22 50 52 41 47  mt,.       "PRAG
1b000 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64  MA reverse_unord
1b010 65 72 65 64 5f 73 65 6c 65 63 74 73 28 25 64 29  ered_selects(%d)
1b020 22 2c 20 21 69 53 65 74 74 69 6e 67 29 3b 0a 20  ", !iSetting);. 
1b030 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
1b040 2c 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20 30  , zStmt, 0, 0, 0
1b050 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1b060 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 74 20   is a different 
1b070 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
1b080 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69 6e   used for dumpin
1b090 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
1b0a0 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63 65  ** Each row rece
1b0b0 69 76 65 64 20 62 79 20 74 68 69 73 20 63 61 6c  ived by this cal
1b0c0 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f  lback consists o
1b0d0 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c 0a  f a table name,.
1b0e0 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79 70  ** the table typ
1b0f0 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22 74  e ("index" or "t
1b100 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20 74  able") and SQL t
1b110 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62  o create the tab
1b120 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  le..** This rout
1b130 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e 74  ine should print
1b140 20 74 65 78 74 20 73 75 66 66 69 63 69 65 6e 74   text sufficient
1b150 20 74 6f 20 72 65 63 72 65 61 74 65 20 74 68 65   to recreate the
1b160 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
1b170 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c 62  c int dump_callb
1b180 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ack(void *pArg, 
1b190 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a  int nArg, char *
1b1a0 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  *azArg, char **a
1b1b0 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e 74  zNotUsed){.  int
1b1c0 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61   rc;.  const cha
1b1d0 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f 6e  r *zTable;.  con
1b1e0 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
1b1f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1b200 71 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ql;.  ShellState
1b210 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74   *p = (ShellStat
1b220 65 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e 55  e *)pArg;..  UNU
1b230 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 7a  SED_PARAMETER(az
1b240 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
1b250 6e 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72 67  nArg!=3 || azArg
1b260 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1b270 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67    zTable = azArg
1b280 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20 61  [0];.  zType = a
1b290 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20  zArg[1];.  zSql 
1b2a0 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20 69  = azArg[2];..  i
1b2b0 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c 65  f( strcmp(zTable
1b2c0 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  , "sqlite_sequen
1b2d0 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ce")==0 ){.    r
1b2e0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
1b2f0 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73  , "DELETE FROM s
1b300 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c  qlite_sequence;\
1b310 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n");.  }else if(
1b320 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
1b330 28 22 73 71 6c 69 74 65 5f 73 74 61 74 3f 22 2c  ("sqlite_stat?",
1b340 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a 20   zTable)==0 ){. 
1b350 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
1b360 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73  >out, "ANALYZE s
1b370 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22  qlite_master;\n"
1b380 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
1b390 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22  trncmp(zTable, "
1b3a0 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20  sqlite_", 7)==0 
1b3b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1b3c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
1b3d0 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45 41  ncmp(zSql, "CREA
1b3e0 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
1b3f0 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 20)==0 ){.   
1b400 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20 20   char *zIns;.   
1b410 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62 6c   if( !p->writabl
1b420 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  eSchema ){.     
1b430 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
1b440 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74  ut, "PRAGMA writ
1b450 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c  able_schema=ON;\
1b460 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72  n");.      p->wr
1b470 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 31  itableSchema = 1
1b480 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e 73  ;.    }.    zIns
1b490 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1b4a0 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53 45  tf(.       "INSE
1b4b0 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d  RT INTO sqlite_m
1b4c0 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65 2c  aster(type,name,
1b4d0 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61 67  tbl_name,rootpag
1b4e0 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20 22  e,sql)".       "
1b4f0 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c 27  VALUES('table','
1b500 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27 29  %q','%q',0,'%q')
1b510 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62 6c  ;",.       zTabl
1b520 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c 29  e, zTable, zSql)
1b530 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
1b540 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  f(p->out, "%s\n"
1b550 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71 6c  , zIns);.    sql
1b560 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29 3b  ite3_free(zIns);
1b570 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1b580 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e   }else{.    prin
1b590 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f  tSchemaLine(p->o
1b5a0 75 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22 29  ut, zSql, ";\n")
1b5b0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74 72  ;.  }..  if( str
1b5c0 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62 6c  cmp(zType, "tabl
1b5d0 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68  e")==0 ){.    Sh
1b5e0 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74 3b  ellText sSelect;
1b5f0 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73  .    ShellText s
1b600 54 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72 20  Table;.    char 
1b610 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e 74  **azCol;.    int
1b620 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 61   i;.    char *sa
1b630 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20 20  vedDestTable;.  
1b640 20 20 69 6e 74 20 73 61 76 65 64 4d 6f 64 65 3b    int savedMode;
1b650 0a 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74 61  ..    azCol = ta
1b660 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 2c  bleColumnList(p,
1b670 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66   zTable);.    if
1b680 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  ( azCol==0 ){.  
1b690 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20      p->nErr++;. 
1b6a0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1b6b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 77     }..    /* Alw
1b6c0 61 79 73 20 71 75 6f 74 65 20 74 68 65 20 74 61  ays quote the ta
1b6d0 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20 69  ble name, even i
1b6e0 66 20 69 74 20 61 70 70 65 61 72 73 20 74 6f 20  f it appears to 
1b6f0 62 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a 20  be pure ascii,. 
1b700 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69 74     ** in case it
1b710 20 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20 45   is a keyword. E
1b720 78 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  x:  INSERT INTO 
1b730 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a 20  "table" ... */. 
1b740 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 54 61     initText(&sTa
1b750 62 6c 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  ble);.    append
1b760 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 7a 54  Text(&sTable, zT
1b770 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28  able, quoteChar(
1b780 7a 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f 2a  zTable));.    /*
1b790 20 49 66 20 70 72 65 73 65 72 76 69 6e 67 20 74   If preserving t
1b7a0 68 65 20 72 6f 77 69 64 2c 20 61 64 64 20 61 20  he rowid, add a 
1b7b0 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74 65  column list afte
1b7c0 72 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  r the table name
1b7d0 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65  ..    ** In othe
1b7e0 72 20 77 6f 72 64 73 3a 20 20 22 49 4e 53 45 52  r words:  "INSER
1b7f0 54 20 49 4e 54 4f 20 74 61 62 28 72 6f 77 69 64  T INTO tab(rowid
1b800 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c 55  ,a,b,c,...) VALU
1b810 45 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20  ES(...)".    ** 
1b820 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
1b830 73 75 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54  sual "INSERT INT
1b840 4f 20 74 61 62 20 56 41 4c 55 45 53 28 2e 2e 2e  O tab VALUES(...
1b850 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  )"..    */.    i
1b860 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20  f( azCol[0] ){. 
1b870 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
1b880 26 73 54 61 62 6c 65 2c 20 22 28 22 2c 20 30 29  &sTable, "(", 0)
1b890 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  ;.      appendTe
1b8a0 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f  xt(&sTable, azCo
1b8b0 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  l[0], 0);.      
1b8c0 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69  for(i=1; azCol[i
1b8d0 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
1b8e0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61   appendText(&sTa
1b8f0 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20  ble, ",", 0);.  
1b900 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
1b910 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b  (&sTable, azCol[
1b920 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a  i], quoteChar(az
1b930 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20  Col[i]));.      
1b940 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  }.      appendTe
1b950 78 74 28 26 73 54 61 62 6c 65 2c 20 22 29 22 2c  xt(&sTable, ")",
1b960 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
1b970 2f 2a 20 42 75 69 6c 64 20 61 6e 20 61 70 70 72  /* Build an appr
1b980 6f 70 72 69 61 74 65 20 53 45 4c 45 43 54 20 73  opriate SELECT s
1b990 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
1b9a0 69 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65 63  initText(&sSelec
1b9b0 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  t);.    appendTe
1b9c0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45  xt(&sSelect, "SE
1b9d0 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20 20  LECT ", 0);.    
1b9e0 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a  if( azCol[0] ){.
1b9f0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
1ba00 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c  (&sSelect, azCol
1ba10 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  [0], 0);.      a
1ba20 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
1ba30 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20  ct, ",", 0);.   
1ba40 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20   }.    for(i=1; 
1ba50 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  azCol[i]; i++){.
1ba60 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
1ba70 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c  (&sSelect, azCol
1ba80 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61  [i], quoteChar(a
1ba90 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20  zCol[i]));.     
1baa0 20 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d 20   if( azCol[i+1] 
1bab0 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ){.        appen
1bac0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
1bad0 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ",", 0);.      }
1bae0 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 43  .    }.    freeC
1baf0 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29  olumnList(azCol)
1bb00 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
1bb10 28 26 73 53 65 6c 65 63 74 2c 20 22 20 46 52 4f  (&sSelect, " FRO
1bb20 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 61 70 70  M ", 0);.    app
1bb30 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
1bb40 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43  , zTable, quoteC
1bb50 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a 20  har(zTable));.. 
1bb60 20 20 20 73 61 76 65 64 44 65 73 74 54 61 62 6c     savedDestTabl
1bb70 65 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c  e = p->zDestTabl
1bb80 65 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f 64 65  e;.    savedMode
1bb90 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20   = p->mode;.    
1bba0 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  p->zDestTable = 
1bbb0 73 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70 2d  sTable.z;.    p-
1bbc0 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64 65  >mode = p->cMode
1bbd0 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a   = MODE_Insert;.
1bbe0 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65      rc = shell_e
1bbf0 78 65 63 28 70 2c 20 73 53 65 6c 65 63 74 2e 7a  xec(p, sSelect.z
1bc00 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28 72  , 0);.    if( (r
1bc10 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
1bc20 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20  CORRUPT ){.     
1bc30 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
1bc40 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52  ut, "/****** COR
1bc50 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a  RUPTION ERROR **
1bc60 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20  *****/\n");.    
1bc70 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72    toggleSelectOr
1bc80 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  der(p->db);.    
1bc90 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c 20    shell_exec(p, 
1bca0 73 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a 20  sSelect.z, 0);. 
1bcb0 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63       toggleSelec
1bcc0 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20  tOrder(p->db);. 
1bcd0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65 73     }.    p->zDes
1bce0 74 54 61 62 6c 65 20 3d 20 73 61 76 65 64 44 65  tTable = savedDe
1bcf0 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d 3e  stTable;.    p->
1bd00 6d 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f 64 65  mode = savedMode
1bd10 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26  ;.    freeText(&
1bd20 73 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 65  sTable);.    fre
1bd30 65 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b  eText(&sSelect);
1bd40 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 70 2d  .    if( rc ) p-
1bd50 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72  >nErr++;.  }.  r
1bd60 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1bd70 2a 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55  * Run zQuery.  U
1bd80 73 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b  se dump_callback
1bd90 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61  () as the callba
1bda0 63 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68  ck routine so th
1bdb0 61 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  at.** the conten
1bdc0 74 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  ts of the query 
1bdd0 61 72 65 20 6f 75 74 70 75 74 20 61 73 20 53 51  are output as SQ
1bde0 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  L statements..**
1bdf0 0a 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61 20  .** If we get a 
1be00 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
1be10 72 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20  rror, rerun the 
1be20 71 75 65 72 79 20 61 66 74 65 72 20 61 70 70 65  query after appe
1be30 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20  nding.** "ORDER 
1be40 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 74  BY rowid DESC" t
1be50 6f 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74  o the end..*/.st
1be60 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68  atic int run_sch
1be70 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a  ema_dump_query(.
1be80 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c    ShellState *p,
1be90 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1bea0 51 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72  Query.){.  int r
1beb0 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  c;.  char *zErr 
1bec0 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
1bed0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
1bee0 7a 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61 6c  zQuery, dump_cal
1bef0 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29  lback, p, &zErr)
1bf00 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1bf10 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20  TE_CORRUPT ){.  
1bf20 20 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20    char *zQ2;.   
1bf30 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65   int len = strle
1bf40 6e 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20 20  n30(zQuery);.   
1bf50 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
1bf60 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52  ut, "/****** COR
1bf70 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a  RUPTION ERROR **
1bf80 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20  *****/\n");.    
1bf90 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
1bfa0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
1bfb0 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 25  >out, "/****** %
1bfc0 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45  s ******/\n", zE
1bfd0 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rr);.      sqlit
1bfe0 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
1bff0 20 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a 20       zErr = 0;. 
1c000 20 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20 6d     }.    zQ2 = m
1c010 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20 29  alloc( len+100 )
1c020 3b 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d 30  ;.    if( zQ2==0
1c030 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1c040 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1c050 74 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32 2c  tf(len+100, zQ2,
1c060 20 22 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f   "%s ORDER BY ro
1c070 77 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72  wid DESC", zQuer
1c080 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  y);.    rc = sql
1c090 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
1c0a0 20 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62   zQ2, dump_callb
1c0b0 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a  ack, p, &zErr);.
1c0c0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1c0d0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1c0e0 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a  p->out, "/******
1c0f0 20 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a 2a   ERROR: %s *****
1c100 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20  */\n", zErr);.  
1c110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1c120 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1c130 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  PT;.    }.    sq
1c140 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29  lite3_free(zErr)
1c150 3b 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29 3b  ;.    free(zQ2);
1c160 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1c170 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20  ;.}../*.** Text 
1c180 6f 66 20 68 65 6c 70 20 6d 65 73 73 61 67 65 73  of help messages
1c190 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 65 6c 70  ..**.** The help
1c1a0 20 74 65 78 74 20 66 6f 72 20 65 61 63 68 20 69   text for each i
1c1b0 6e 64 69 76 69 64 75 61 6c 20 63 6f 6d 6d 61 6e  ndividual comman
1c1c0 64 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20  d begins with a 
1c1d0 6c 69 6e 65 20 74 68 61 74 20 73 74 61 72 74 73  line that starts
1c1e0 0a 2a 2a 20 77 69 74 68 20 22 2e 22 2e 20 20 53  .** with ".".  S
1c1f0 75 62 73 65 71 75 65 6e 74 20 6c 69 6e 65 73 20  ubsequent lines 
1c200 61 72 65 20 73 75 70 70 6c 69 6d 65 6e 74 61 6c  are supplimental
1c210 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
1c220 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62  .** There must b
1c230 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 70  e two or more sp
1c240 61 63 65 73 20 62 65 74 77 65 65 6e 20 74 68 65  aces between the
1c250 20 65 6e 64 20 6f 66 20 74 68 65 20 63 6f 6d 6d   end of the comm
1c260 61 6e 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 73  and and the.** s
1c270 74 61 72 74 20 6f 66 20 74 68 65 20 64 65 73 63  tart of the desc
1c280 72 69 70 74 69 6f 6e 20 6f 66 20 77 68 61 74 20  ription of what 
1c290 74 68 61 74 20 63 6f 6d 6d 61 6e 64 20 64 6f 65  that command doe
1c2a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
1c2b0 73 74 20 63 68 61 72 20 2a 28 61 7a 48 65 6c 70  st char *(azHelp
1c2c0 5b 5d 29 20 3d 20 7b 0a 23 69 66 20 64 65 66 69  []) = {.#if defi
1c2d0 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f  ned(SQLITE_HAVE_
1c2e0 5a 4c 49 42 29 20 26 26 20 21 64 65 66 69 6e 65  ZLIB) && !define
1c2f0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1c300 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 22 2e  RTUALTABLE).  ".
1c310 61 72 63 68 69 76 65 20 2e 2e 2e 20 20 20 20 20  archive ...     
1c320 20 20 20 20 20 20 20 20 4d 61 6e 61 67 65 20 53          Manage S
1c330 51 4c 20 61 72 63 68 69 76 65 73 22 2c 0a 20 20  QL archives",.  
1c340 22 20 20 20 45 61 63 68 20 63 6f 6d 6d 61 6e 64  "   Each command
1c350 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74   must have exact
1c360 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  ly one of the fo
1c370 6c 6c 6f 77 69 6e 67 20 6f 70 74 69 6f 6e 73 3a  llowing options:
1c380 22 2c 0a 20 20 22 20 20 20 20 20 2d 63 2c 20 2d  ",.  "     -c, -
1c390 2d 63 72 65 61 74 65 20 20 20 20 20 20 20 20 20  -create         
1c3a0 20 20 20 20 20 20 43 72 65 61 74 65 20 61 20 6e        Create a n
1c3b0 65 77 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22  ew archive",.  "
1c3c0 20 20 20 20 20 2d 75 2c 20 2d 2d 75 70 64 61 74       -u, --updat
1c3d0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1c3e0 41 64 64 20 66 69 6c 65 73 20 6f 72 20 75 70 64  Add files or upd
1c3f0 61 74 65 20 66 69 6c 65 73 20 77 69 74 68 20 63  ate files with c
1c400 68 61 6e 67 65 64 20 6d 74 69 6d 65 22 2c 0a 20  hanged mtime",. 
1c410 20 22 20 20 20 20 20 2d 69 2c 20 2d 2d 69 6e 73   "     -i, --ins
1c420 65 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ert             
1c430 20 20 4c 69 6b 65 20 2d 75 20 62 75 74 20 61 6c    Like -u but al
1c440 77 61 79 73 20 61 64 64 20 65 76 65 6e 20 69 66  ways add even if
1c450 20 6d 74 69 6d 65 20 75 6e 63 68 61 6e 67 65 64   mtime unchanged
1c460 22 2c 0a 20 20 22 20 20 20 20 20 2d 74 2c 20 2d  ",.  "     -t, -
1c470 2d 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  -list           
1c480 20 20 20 20 20 20 4c 69 73 74 20 63 6f 6e 74 65        List conte
1c490 6e 74 73 20 6f 66 20 61 72 63 68 69 76 65 22 2c  nts of archive",
1c4a0 0a 20 20 22 20 20 20 20 20 2d 78 2c 20 2d 2d 65  .  "     -x, --e
1c4b0 78 74 72 61 63 74 20 20 20 20 20 20 20 20 20 20  xtract          
1c4c0 20 20 20 20 45 78 74 72 61 63 74 20 66 69 6c 65      Extract file
1c4d0 73 20 66 72 6f 6d 20 61 72 63 68 69 76 65 22 2c  s from archive",
1c4e0 0a 20 20 22 20 20 20 4f 70 74 69 6f 6e 61 6c 20  .  "   Optional 
1c4f0 61 72 67 75 6d 65 6e 74 73 3a 22 2c 0a 20 20 22  arguments:",.  "
1c500 20 20 20 20 20 2d 76 2c 20 2d 2d 76 65 72 62 6f       -v, --verbo
1c510 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
1c520 50 72 69 6e 74 20 65 61 63 68 20 66 69 6c 65 6e  Print each filen
1c530 61 6d 65 20 61 73 20 69 74 20 69 73 20 70 72 6f  ame as it is pro
1c540 63 65 73 73 65 64 22 2c 0a 20 20 22 20 20 20 20  cessed",.  "    
1c550 20 2d 66 20 46 49 4c 45 2c 20 2d 2d 66 69 6c 65   -f FILE, --file
1c560 20 46 49 4c 45 20 20 20 20 20 20 20 4f 70 65 72   FILE       Oper
1c570 61 74 65 20 6f 6e 20 61 72 63 68 69 76 65 20 46  ate on archive F
1c580 49 4c 45 20 28 64 65 66 61 75 6c 74 20 69 73 20  ILE (default is 
1c590 63 75 72 72 65 6e 74 20 64 62 29 22 2c 0a 20 20  current db)",.  
1c5a0 22 20 20 20 20 20 2d 61 20 46 49 4c 45 2c 20 2d  "     -a FILE, -
1c5b0 2d 61 70 70 65 6e 64 20 46 49 4c 45 20 20 20 20  -append FILE    
1c5c0 20 4f 70 65 72 61 74 65 20 6f 6e 20 46 49 4c 45   Operate on FILE
1c5d0 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68   opened using th
1c5e0 65 20 61 70 6e 64 76 66 73 20 56 46 53 22 2c 0a  e apndvfs VFS",.
1c5f0 20 20 22 20 20 20 20 20 2d 43 20 44 49 52 2c 20    "     -C DIR, 
1c600 2d 2d 64 69 72 65 63 74 6f 72 79 20 44 49 52 20  --directory DIR 
1c610 20 20 20 43 68 61 6e 67 65 20 74 6f 20 64 69 72     Change to dir
1c620 65 63 74 6f 72 79 20 44 49 52 20 74 6f 20 72 65  ectory DIR to re
1c630 61 64 2f 65 78 74 72 61 63 74 20 66 69 6c 65 73  ad/extract files
1c640 22 2c 0a 20 20 22 20 20 20 20 20 2d 6e 2c 20 2d  ",.  "     -n, -
1c650 2d 64 72 79 72 75 6e 20 20 20 20 20 20 20 20 20  -dryrun         
1c660 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20 53        Show the S
1c670 51 4c 20 74 68 61 74 20 77 6f 75 6c 64 20 68 61  QL that would ha
1c680 76 65 20 6f 63 63 75 72 72 65 64 22 2c 0a 20 20  ve occurred",.  
1c690 22 20 20 20 45 78 61 6d 70 6c 65 73 3a 22 2c 0a  "   Examples:",.
1c6a0 20 20 22 20 20 20 20 20 2e 61 72 20 2d 63 66 20    "     .ar -cf 
1c6b0 61 72 63 68 69 76 65 2e 73 61 72 20 66 6f 6f 20  archive.sar foo 
1c6c0 62 61 72 20 20 23 20 43 72 65 61 74 65 20 61 72  bar  # Create ar
1c6d0 63 68 69 76 65 2e 73 61 72 20 66 72 6f 6d 20 66  chive.sar from f
1c6e0 69 6c 65 73 20 66 6f 6f 20 61 6e 64 20 62 61 72  iles foo and bar
1c6f0 22 2c 0a 20 20 22 20 20 20 20 20 2e 61 72 20 2d  ",.  "     .ar -
1c700 74 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 20  tf archive.sar  
1c710 20 20 20 20 20 20 20 20 23 20 4c 69 73 74 20 6d          # List m
1c720 65 6d 62 65 72 73 20 6f 66 20 61 72 63 68 69 76  embers of archiv
1c730 65 2e 73 61 72 22 2c 0a 20 20 22 20 20 20 20 20  e.sar",.  "     
1c740 2e 61 72 20 2d 78 76 66 20 61 72 63 68 69 76 65  .ar -xvf archive
1c750 2e 73 61 72 20 20 20 20 20 20 20 20 20 23 20 56  .sar         # V
1c760 65 72 62 6f 73 65 6c 79 20 65 78 74 72 61 63 74  erbosely extract
1c770 20 66 69 6c 65 73 20 66 72 6f 6d 20 61 72 63 68   files from arch
1c780 69 76 65 2e 73 61 72 22 2c 0a 20 20 22 20 20 20  ive.sar",.  "   
1c790 53 65 65 20 61 6c 73 6f 3a 22 2c 0a 20 20 22 20  See also:",.  " 
1c7a0 20 20 20 20 20 68 74 74 70 3a 2f 2f 73 71 6c 69       http://sqli
1c7b0 74 65 2e 6f 72 67 2f 63 6c 69 2e 68 74 6d 6c 23  te.org/cli.html#
1c7c0 73 71 6c 61 72 5f 61 72 63 68 69 76 65 5f 73 75  sqlar_archive_su
1c7d0 70 70 6f 72 74 22 2c 0a 23 65 6e 64 69 66 0a 23  pport",.#endif.#
1c7e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c7f0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
1c800 0a 20 20 22 2e 61 75 74 68 20 4f 4e 7c 4f 46 46  .  ".auth ON|OFF
1c810 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f               Sho
1c820 77 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61 6c  w authorizer cal
1c830 6c 62 61 63 6b 73 22 2c 0a 23 65 6e 64 69 66 0a  lbacks",.#endif.
1c840 20 20 22 2e 62 61 63 6b 75 70 20 3f 44 42 3f 20    ".backup ?DB? 
1c850 46 49 4c 45 20 20 20 20 20 20 20 20 42 61 63 6b  FILE        Back
1c860 75 70 20 44 42 20 28 64 65 66 61 75 6c 74 20 5c  up DB (default \
1c870 22 6d 61 69 6e 5c 22 29 20 74 6f 20 46 49 4c 45  "main\") to FILE
1c880 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 2d 61  ",.  "       --a
1c890 70 70 65 6e 64 20 20 20 20 20 20 20 20 20 20 20  ppend           
1c8a0 20 55 73 65 20 74 68 65 20 61 70 70 65 6e 64 76   Use the appendv
1c8b0 66 73 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d  fs",.  "       -
1c8c0 2d 61 73 79 6e 63 20 20 20 20 20 20 20 20 20 20  -async          
1c8d0 20 20 20 57 72 69 74 65 20 74 6f 20 46 49 4c 45     Write to FILE
1c8e0 20 77 69 74 68 6f 75 74 20 61 20 6a 6f 75 72 6e   without a journ
1c8f0 61 6c 20 61 6e 64 20 77 69 74 68 6f 75 74 20 66  al and without f
1c900 73 79 6e 63 28 29 22 2c 0a 20 20 22 2e 62 61 69  sync()",.  ".bai
1c910 6c 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20  l on|off        
1c920 20 20 20 20 20 53 74 6f 70 20 61 66 74 65 72 20       Stop after 
1c930 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f 72  hitting an error
1c940 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 22 2c  .  Default OFF",
1c950 0a 20 20 22 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f  .  ".binary on|o
1c960 66 66 20 20 20 20 20 20 20 20 20 20 20 54 75 72  ff           Tur
1c970 6e 20 62 69 6e 61 72 79 20 6f 75 74 70 75 74 20  n binary output 
1c980 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 44 65 66 61  on or off.  Defa
1c990 75 6c 74 20 4f 46 46 22 2c 0a 20 20 22 2e 63 64  ult OFF",.  ".cd
1c9a0 20 44 49 52 45 43 54 4f 52 59 20 20 20 20 20 20   DIRECTORY      
1c9b0 20 20 20 20 20 20 43 68 61 6e 67 65 20 74 68 65        Change the
1c9c0 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f   working directo
1c9d0 72 79 20 74 6f 20 44 49 52 45 43 54 4f 52 59 22  ry to DIRECTORY"
1c9e0 2c 0a 20 20 22 2e 63 68 61 6e 67 65 73 20 6f 6e  ,.  ".changes on
1c9f0 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 53 68  |off          Sh
1ca00 6f 77 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ow number of row
1ca10 73 20 63 68 61 6e 67 65 64 20 62 79 20 53 51 4c  s changed by SQL
1ca20 22 2c 0a 20 20 22 2e 63 68 65 63 6b 20 47 4c 4f  ",.  ".check GLO
1ca30 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46  B              F
1ca40 61 69 6c 20 69 66 20 6f 75 74 70 75 74 20 73 69  ail if output si
1ca50 6e 63 65 20 2e 74 65 73 74 63 61 73 65 20 64 6f  nce .testcase do
1ca60 65 73 20 6e 6f 74 20 6d 61 74 63 68 22 2c 0a 20  es not match",. 
1ca70 20 22 2e 63 6c 6f 6e 65 20 4e 45 57 44 42 20 20   ".clone NEWDB  
1ca80 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f 6e 65             Clone
1ca90 20 64 61 74 61 20 69 6e 74 6f 20 4e 45 57 44 42   data into NEWDB
1caa0 20 66 72 6f 6d 20 74 68 65 20 65 78 69 73 74 69   from the existi
1cab0 6e 67 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20  ng database",.  
1cac0 22 2e 64 61 74 61 62 61 73 65 73 20 20 20 20 20  ".databases     
1cad0 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20 6e            List n
1cae0 61 6d 65 73 20 61 6e 64 20 66 69 6c 65 73 20 6f  ames and files o
1caf0 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  f attached datab
1cb00 61 73 65 73 22 2c 0a 20 20 22 2e 64 62 63 6f 6e  ases",.  ".dbcon
1cb10 66 69 67 20 3f 6f 70 3f 20 3f 76 61 6c 3f 20 20  fig ?op? ?val?  
1cb20 20 20 20 4c 69 73 74 20 6f 72 20 63 68 61 6e 67     List or chang
1cb30 65 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e  e sqlite3_db_con
1cb40 66 69 67 28 29 20 6f 70 74 69 6f 6e 73 22 2c 0a  fig() options",.
1cb50 20 20 22 2e 64 62 69 6e 66 6f 20 3f 44 42 3f 20    ".dbinfo ?DB? 
1cb60 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77              Show
1cb70 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d 61 74   status informat
1cb80 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 64 61  ion about the da
1cb90 74 61 62 61 73 65 22 2c 0a 20 20 22 2e 64 75 6d  tabase",.  ".dum
1cba0 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20 20 20  p ?TABLE? ...   
1cbb0 20 20 20 20 20 52 65 6e 64 65 72 20 61 6c 6c 20       Render all 
1cbc0 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
1cbd0 20 61 73 20 53 51 4c 22 2c 0a 20 20 22 20 20 20   as SQL",.  "   
1cbe0 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20  Options:",.  "  
1cbf0 20 20 20 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f     --preserve-ro
1cc00 77 69 64 73 20 20 20 20 20 20 49 6e 63 6c 75 64  wids      Includ
1cc10 65 20 52 4f 57 49 44 20 76 61 6c 75 65 73 20 69  e ROWID values i
1cc20 6e 20 74 68 65 20 6f 75 74 70 75 74 22 2c 0a 20  n the output",. 
1cc30 20 22 20 20 20 20 20 2d 2d 6e 65 77 6c 69 6e 65   "     --newline
1cc40 73 20 20 20 20 20 20 20 20 20 20 20 20 20 41 6c  s             Al
1cc50 6c 6f 77 20 75 6e 65 73 63 61 70 65 64 20 6e 65  low unescaped ne
1cc60 77 6c 69 6e 65 20 63 68 61 72 61 63 74 65 72 73  wline characters
1cc70 20 69 6e 20 6f 75 74 70 75 74 22 2c 0a 20 20 22   in output",.  "
1cc80 20 20 20 54 41 42 4c 45 20 69 73 20 4c 49 4b 45     TABLE is LIKE
1cc90 20 70 61 74 74 65 72 6e 20 66 6f 72 20 74 68 65   pattern for the
1cca0 20 74 61 62 6c 65 73 20 74 6f 20 64 75 6d 70 22   tables to dump"
1ccb0 2c 0a 20 20 22 2e 65 63 68 6f 20 6f 6e 7c 6f 66  ,.  ".echo on|of
1ccc0 66 20 20 20 20 20 20 20 20 20 20 20 20 20 54 75  f             Tu
1ccd0 72 6e 20 63 6f 6d 6d 61 6e 64 20 65 63 68 6f 20  rn command echo 
1cce0 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 20 20 22 2e  on or off",.  ".
1ccf0 65 71 70 20 6f 6e 7c 6f 66 66 7c 66 75 6c 6c 7c  eqp on|off|full|
1cd00 2e 2e 2e 20 20 20 20 20 45 6e 61 62 6c 65 20 6f  ...     Enable o
1cd10 72 20 64 69 73 61 62 6c 65 20 61 75 74 6f 6d 61  r disable automa
1cd20 74 69 63 20 45 58 50 4c 41 49 4e 20 51 55 45 52  tic EXPLAIN QUER
1cd30 59 20 50 4c 41 4e 22 2c 0a 20 20 22 20 20 20 4f  Y PLAN",.  "   O
1cd40 74 68 65 72 20 4d 6f 64 65 73 3a 22 2c 0a 23 69  ther Modes:",.#i
1cd50 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1cd60 47 0a 20 20 22 20 20 20 20 20 20 74 65 73 74 20  G.  "      test 
1cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd80 20 53 68 6f 77 20 72 61 77 20 45 58 50 4c 41 49   Show raw EXPLAI
1cd90 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 6f 75 74  N QUERY PLAN out
1cda0 70 75 74 22 2c 0a 20 20 22 20 20 20 20 20 20 74  put",.  "      t
1cdb0 72 61 63 65 20 20 20 20 20 20 20 20 20 20 20 20  race            
1cdc0 20 20 20 20 20 4c 69 6b 65 20 5c 22 66 75 6c 6c       Like \"full
1cdd0 5c 22 20 62 75 74 20 61 6c 73 6f 20 65 6e 61 62  \" but also enab
1cde0 6c 65 20 5c 22 50 52 41 47 4d 41 20 76 64 62 65  le \"PRAGMA vdbe
1cdf0 5f 74 72 61 63 65 5c 22 22 2c 0a 23 65 6e 64 69  _trace\"",.#endi
1ce00 66 0a 20 20 22 20 20 20 20 20 20 74 72 69 67 67  f.  "      trigg
1ce10 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
1ce20 20 4c 69 6b 65 20 5c 22 66 75 6c 6c 5c 22 20 62   Like \"full\" b
1ce30 75 74 20 61 6c 73 6f 20 73 68 6f 77 20 74 72 69  ut also show tri
1ce40 67 67 65 72 20 62 79 74 65 63 6f 64 65 22 2c 0a  gger bytecode",.
1ce50 20 20 22 2e 65 78 63 65 6c 20 20 20 20 20 20 20    ".excel       
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 44 69 73 70              Disp
1ce70 6c 61 79 20 74 68 65 20 6f 75 74 70 75 74 20 6f  lay the output o
1ce80 66 20 6e 65 78 74 20 63 6f 6d 6d 61 6e 64 20 69  f next command i
1ce90 6e 20 61 20 73 70 72 65 61 64 73 68 65 65 74 22  n a spreadsheet"
1cea0 2c 0a 20 20 22 2e 65 78 69 74 20 3f 43 4f 44 45  ,.  ".exit ?CODE
1ceb0 3f 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78  ?             Ex
1cec0 69 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d 20  it this program 
1ced0 77 69 74 68 20 72 65 74 75 72 6e 2d 63 6f 64 65  with return-code
1cee0 20 43 4f 44 45 22 2c 0a 20 20 22 2e 65 78 70 65   CODE",.  ".expe
1cef0 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rt              
1cf00 20 20 20 20 45 58 50 45 52 49 4d 45 4e 54 41 4c      EXPERIMENTAL
1cf10 2e 20 53 75 67 67 65 73 74 20 69 6e 64 65 78 65  . Suggest indexe
1cf20 73 20 66 6f 72 20 73 70 65 63 69 66 69 65 64 20  s for specified 
1cf30 71 75 65 72 69 65 73 22 2c 0a 2f 2a 20 42 65 63  queries",./* Bec
1cf40 61 75 73 65 20 65 78 70 6c 61 69 6e 20 6d 6f 64  ause explain mod
1cf50 65 20 63 6f 6d 65 73 20 6f 6e 20 61 75 74 6f 6d  e comes on autom
1cf60 61 74 69 63 61 6c 6c 79 20 6e 6f 77 2c 20 74 68  atically now, th
1cf70 65 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f 64  e ".explain" mod
1cf80 65 0a 2a 2a 20 69 73 20 72 65 6d 6f 76 65 64 20  e.** is removed 
1cf90 66 72 6f 6d 20 74 68 65 20 68 65 6c 70 20 73 63  from the help sc
1cfa0 72 65 65 6e 2e 20 20 49 74 20 69 73 20 73 74 69  reen.  It is sti
1cfb0 6c 6c 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72  ll supported for
1cfc0 20 6c 65 67 61 63 79 2c 20 68 6f 77 65 76 65 72   legacy, however
1cfd0 20 2a 2f 0a 2f 2a 22 2e 65 78 70 6c 61 69 6e 20   */./*".explain 
1cfe0 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f 3f 20 20 20  ?on|off|auto?   
1cff0 54 75 72 6e 20 45 58 50 4c 41 49 4e 20 6f 75 74  Turn EXPLAIN out
1d000 70 75 74 20 6d 6f 64 65 20 6f 6e 20 6f 72 20 6f  put mode on or o
1d010 66 66 20 6f 72 20 74 6f 20 61 75 74 6f 6d 61 74  ff or to automat
1d020 69 63 22 2c 2a 2f 0a 20 20 22 2e 66 75 6c 6c 73  ic",*/.  ".fulls
1d030 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f  chema ?--indent?
1d040 20 20 20 53 68 6f 77 20 73 63 68 65 6d 61 20 61     Show schema a
1d050 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  nd the content o
1d060 66 20 73 71 6c 69 74 65 5f 73 74 61 74 20 74 61  f sqlite_stat ta
1d070 62 6c 65 73 22 2c 0a 20 20 22 2e 68 65 61 64 65  bles",.  ".heade
1d080 72 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  rs on|off       
1d090 20 20 20 54 75 72 6e 20 64 69 73 70 6c 61 79 20     Turn display 
1d0a0 6f 66 20 68 65 61 64 65 72 73 20 6f 6e 20 6f 72  of headers on or
1d0b0 20 6f 66 66 22 2c 0a 20 20 22 2e 68 65 6c 70 20   off",.  ".help 
1d0c0 3f 2d 61 6c 6c 3f 20 3f 50 41 54 54 45 52 4e 3f  ?-all? ?PATTERN?
1d0d0 20 20 20 53 68 6f 77 20 68 65 6c 70 20 74 65 78     Show help tex
1d0e0 74 20 66 6f 72 20 50 41 54 54 45 52 4e 22 2c 0a  t for PATTERN",.
1d0f0 20 20 22 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20    ".import FILE 
1d100 54 41 42 4c 45 20 20 20 20 20 20 20 49 6d 70 6f  TABLE       Impo
1d110 72 74 20 64 61 74 61 20 66 72 6f 6d 20 46 49 4c  rt data from FIL
1d120 45 20 69 6e 74 6f 20 54 41 42 4c 45 22 2c 0a 23  E into TABLE",.#
1d130 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d140 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 0a  IT_TEST_CONTROL.
1d150 20 20 22 2e 69 6d 70 6f 73 74 65 72 20 49 4e 44    ".imposter IND
1d160 45 58 20 54 41 42 4c 45 20 20 20 20 43 72 65 61  EX TABLE    Crea
1d170 74 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  te imposter tabl
1d180 65 20 54 41 42 4c 45 20 6f 6e 20 69 6e 64 65 78  e TABLE on index
1d190 20 49 4e 44 45 58 22 2c 0a 23 65 6e 64 69 66 0a   INDEX",.#endif.
1d1a0 20 20 22 2e 69 6e 64 65 78 65 73 20 3f 54 41 42    ".indexes ?TAB
1d1b0 4c 45 3f 20 20 20 20 20 20 20 20 20 53 68 6f 77  LE?         Show
1d1c0 20 6e 61 6d 65 73 20 6f 66 20 69 6e 64 65 78 65   names of indexe
1d1d0 73 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20  s",.  "         
1d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1f0 20 20 49 66 20 54 41 42 4c 45 20 69 73 20 73 70    If TABLE is sp
1d200 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 73 68  ecified, only sh
1d210 6f 77 20 69 6e 64 65 78 65 73 20 66 6f 72 22 2c  ow indexes for",
1d220 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
1d230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1d240 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 54  ables matching T
1d250 41 42 4c 45 20 75 73 69 6e 67 20 74 68 65 20 4c  ABLE using the L
1d260 49 4b 45 20 6f 70 65 72 61 74 6f 72 2e 22 2c 0a  IKE operator.",.
1d270 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1d280 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 22  ABLE_IOTRACE.  "
1d290 2e 69 6f 74 72 61 63 65 20 46 49 4c 45 20 20 20  .iotrace FILE   
1d2a0 20 20 20 20 20 20 20 20 20 45 6e 61 62 6c 65 20           Enable 
1d2b0 49 2f 4f 20 64 69 61 67 6e 6f 73 74 69 63 20 6c  I/O diagnostic l
1d2c0 6f 67 67 69 6e 67 20 74 6f 20 46 49 4c 45 22 2c  ogging to FILE",
1d2d0 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 69 6d 69  .#endif.  ".limi
1d2e0 74 20 3f 4c 49 4d 49 54 3f 20 3f 56 41 4c 3f 20  t ?LIMIT? ?VAL? 
1d2f0 20 20 20 20 44 69 73 70 6c 61 79 20 6f 72 20 63      Display or c
1d300 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
1d310 6f 66 20 61 6e 20 53 51 4c 49 54 45 5f 4c 49 4d  of an SQLITE_LIM
1d320 49 54 22 2c 0a 20 20 22 2e 6c 69 6e 74 20 4f 50  IT",.  ".lint OP
1d330 54 49 4f 4e 53 20 20 20 20 20 20 20 20 20 20 20  TIONS           
1d340 20 52 65 70 6f 72 74 20 70 6f 74 65 6e 74 69 61   Report potentia
1d350 6c 20 73 63 68 65 6d 61 20 69 73 73 75 65 73 2e  l schema issues.
1d360 22 2c 0a 20 20 22 20 20 20 20 20 4f 70 74 69 6f  ",.  "     Optio
1d370 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20  ns:",.  "       
1d380 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 20 20 20   fkey-indexes   
1d390 20 20 46 69 6e 64 20 6d 69 73 73 69 6e 67 20 66    Find missing f
1d3a0 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e 64 65 78  oreign key index
1d3b0 65 73 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c  es",.#ifndef SQL
1d3c0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
1d3d0 54 45 4e 53 49 4f 4e 0a 20 20 22 2e 6c 6f 61 64  TENSION.  ".load
1d3e0 20 46 49 4c 45 20 3f 45 4e 54 52 59 3f 20 20 20   FILE ?ENTRY?   
1d3f0 20 20 20 20 4c 6f 61 64 20 61 6e 20 65 78 74 65      Load an exte
1d400 6e 73 69 6f 6e 20 6c 69 62 72 61 72 79 22 2c 0a  nsion library",.
1d410 23 65 6e 64 69 66 0a 20 20 22 2e 6c 6f 67 20 46  #endif.  ".log F
1d420 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20 20 20  ILE|off         
1d430 20 20 20 54 75 72 6e 20 6c 6f 67 67 69 6e 67 20     Turn logging 
1d440 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 46 49 4c 45  on or off.  FILE
1d450 20 63 61 6e 20 62 65 20 73 74 64 65 72 72 2f 73   can be stderr/s
1d460 74 64 6f 75 74 22 2c 0a 20 20 22 2e 6d 6f 64 65  tdout",.  ".mode
1d470 20 4d 4f 44 45 20 3f 54 41 42 4c 45 3f 20 20 20   MODE ?TABLE?   
1d480 20 20 20 20 53 65 74 20 6f 75 74 70 75 74 20 6d      Set output m
1d490 6f 64 65 22 2c 0a 20 20 22 20 20 20 4d 4f 44 45  ode",.  "   MODE
1d4a0 20 69 73 20 6f 6e 65 20 6f 66 3a 22 2c 0a 20 20   is one of:",.  
1d4b0 22 20 20 20 20 20 61 73 63 69 69 20 20 20 20 43  "     ascii    C
1d4c0 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20 64 65 6c 69  olumns/rows deli
1d4d0 6d 69 74 65 64 20 62 79 20 30 78 31 46 20 61 6e  mited by 0x1F an
1d4e0 64 20 30 78 31 45 22 2c 0a 20 20 22 20 20 20 20  d 0x1E",.  "    
1d4f0 20 63 73 76 20 20 20 20 20 20 43 6f 6d 6d 61 2d   csv      Comma-
1d500 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65 73  separated values
1d510 22 2c 0a 20 20 22 20 20 20 20 20 63 6f 6c 75 6d  ",.  "     colum
1d520 6e 20 20 20 4c 65 66 74 2d 61 6c 69 67 6e 65 64  n   Left-aligned
1d530 20 63 6f 6c 75 6d 6e 73 2e 20 20 28 53 65 65 20   columns.  (See 
1d540 2e 77 69 64 74 68 29 22 2c 0a 20 20 22 20 20 20  .width)",.  "   
1d550 20 20 68 74 6d 6c 20 20 20 20 20 48 54 4d 4c 20    html     HTML 
1d560 3c 74 61 62 6c 65 3e 20 63 6f 64 65 22 2c 0a 20  <table> code",. 
1d570 20 22 20 20 20 20 20 69 6e 73 65 72 74 20 20 20   "     insert   
1d580 53 51 4c 20 69 6e 73 65 72 74 20 73 74 61 74 65  SQL insert state
1d590 6d 65 6e 74 73 20 66 6f 72 20 54 41 42 4c 45 22  ments for TABLE"
1d5a0 2c 0a 20 20 22 20 20 20 20 20 6c 69 6e 65 20 20  ,.  "     line  
1d5b0 20 20 20 4f 6e 65 20 76 61 6c 75 65 20 70 65 72     One value per
1d5c0 20 6c 69 6e 65 22 2c 0a 20 20 22 20 20 20 20 20   line",.  "     
1d5d0 6c 69 73 74 20 20 20 20 20 56 61 6c 75 65 73 20  list     Values 
1d5e0 64 65 6c 69 6d 69 74 65 64 20 62 79 20 5c 22 7c  delimited by \"|
1d5f0 5c 22 22 2c 0a 20 20 22 20 20 20 20 20 71 75 6f  \"",.  "     quo
1d600 74 65 20 20 20 20 45 73 63 61 70 65 20 61 6e 73  te    Escape ans
1d610 77 65 72 73 20 61 73 20 66 6f 72 20 53 51 4c 22  wers as for SQL"
1d620 2c 0a 20 20 22 20 20 20 20 20 74 61 62 73 20 20  ,.  "     tabs  
1d630 20 20 20 54 61 62 2d 73 65 70 61 72 61 74 65 64     Tab-separated
1d640 20 76 61 6c 75 65 73 22 2c 0a 20 20 22 20 20 20   values",.  "   
1d650 20 20 74 63 6c 20 20 20 20 20 20 54 43 4c 20 6c    tcl      TCL l
1d660 69 73 74 20 65 6c 65 6d 65 6e 74 73 22 2c 0a 20  ist elements",. 
1d670 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52   ".nullvalue STR
1d680 49 4e 47 20 20 20 20 20 20 20 20 55 73 65 20 53  ING        Use S
1d690 54 52 49 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f  TRING in place o
1d6a0 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73 22 2c 0a  f NULL values",.
1d6b0 20 20 22 2e 6f 6e 63 65 20 28 2d 65 7c 2d 78 7c    ".once (-e|-x|
1d6c0 46 49 4c 45 29 20 20 20 20 20 20 20 4f 75 74 70  FILE)       Outp
1d6d0 75 74 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ut for the next 
1d6e0 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 6f 6e 6c 79  SQL command only
1d6f0 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20   to FILE",.  "  
1d700 20 20 20 49 66 20 46 49 4c 45 20 62 65 67 69 6e     If FILE begin
1d710 73 20 77 69 74 68 20 27 7c 27 20 74 68 65 6e 20  s with '|' then 
1d720 6f 70 65 6e 20 61 73 20 61 20 70 69 70 65 22 2c  open as a pipe",
1d730 0a 20 20 22 20 20 20 20 20 4f 74 68 65 72 20 6f  .  "     Other o
1d740 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20  ptions:",.  "   
1d750 20 20 20 20 2d 65 20 20 20 20 49 6e 76 6f 6b 65      -e    Invoke
1d760 20 73 79 73 74 65 6d 20 74 65 78 74 20 65 64 69   system text edi
1d770 74 6f 72 22 2c 0a 20 20 22 20 20 20 20 20 20 20  tor",.  "       
1d780 2d 78 20 20 20 20 4f 70 65 6e 20 69 6e 20 61 20  -x    Open in a 
1d790 73 70 72 65 61 64 73 68 65 65 74 22 2c 0a 20 20  spreadsheet",.  
1d7a0 22 2e 6f 70 65 6e 20 3f 4f 50 54 49 4f 4e 53 3f  ".open ?OPTIONS?
1d7b0 20 3f 46 49 4c 45 3f 20 20 20 43 6c 6f 73 65 20   ?FILE?   Close 
1d7c0 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
1d7d0 65 20 61 6e 64 20 72 65 6f 70 65 6e 20 46 49 4c  e and reopen FIL
1d7e0 45 22 2c 0a 20 20 22 20 20 20 20 20 4f 70 74 69  E",.  "     Opti
1d7f0 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20  ons:",.  "      
1d800 20 20 2d 2d 61 70 70 65 6e 64 20 20 20 20 20 20    --append      
1d810 20 20 55 73 65 20 61 70 70 65 6e 64 76 66 73 20    Use appendvfs 
1d820 74 6f 20 61 70 70 65 6e 64 20 64 61 74 61 62 61  to append databa
1d830 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  se to the end of
1d840 20 46 49 4c 45 22 2c 0a 23 69 66 64 65 66 20 53   FILE",.#ifdef S
1d850 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53  QLITE_ENABLE_DES
1d860 45 52 49 41 4c 49 5a 45 0a 20 20 22 20 20 20 20  ERIALIZE.  "    
1d870 20 20 20 20 2d 2d 64 65 73 65 72 69 61 6c 69 7a      --deserializ
1d880 65 20 20 20 4c 6f 61 64 20 69 6e 74 6f 20 6d 65  e   Load into me
1d890 6d 6f 72 79 20 75 73 65 69 6e 67 20 73 71 6c 69  mory useing sqli
1d8a0 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a 65 28  te3_deserialize(
1d8b0 29 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d  )",.  "        -
1d8c0 2d 68 65 78 64 62 20 20 20 20 20 20 20 20 20 4c  -hexdb         L
1d8d0 6f 61 64 20 74 68 65 20 6f 75 74 70 75 74 20 6f  oad the output o
1d8e0 66 20 5c 22 64 62 74 6f 74 78 74 5c 22 20 61 73  f \"dbtotxt\" as
1d8f0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
1d900 74 61 62 61 73 65 22 2c 0a 20 20 22 20 20 20 20  tabase",.  "    
1d910 20 20 20 20 2d 2d 6d 61 78 73 69 7a 65 20 4e 20      --maxsize N 
1d920 20 20 20 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65      Maximum size
1d930 20 66 6f 72 20 2d 2d 68 65 78 64 62 20 6f 72 20   for --hexdb or 
1d940 2d 2d 64 65 73 65 72 69 61 6c 69 7a 65 64 20 64  --deserialized d
1d950 61 74 61 62 61 73 65 22 2c 0a 23 65 6e 64 69 66  atabase",.#endif
1d960 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d 6e 65  .  "        --ne
1d970 77 20 20 20 20 20 20 20 20 20 20 20 49 6e 69 74  w           Init
1d980 69 61 6c 69 7a 65 20 46 49 4c 45 20 74 6f 20 61  ialize FILE to a
1d990 6e 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  n empty database
1d9a0 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d  ",.  "        --
1d9b0 72 65 61 64 6f 6e 6c 79 20 20 20 20 20 20 4f 70  readonly      Op
1d9c0 65 6e 20 46 49 4c 45 20 72 65 61 64 6f 6e 6c 79  en FILE readonly
1d9d0 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d  ",.  "        --
1d9e0 7a 69 70 20 20 20 20 20 20 20 20 20 20 20 46 49  zip           FI
1d9f0 4c 45 20 69 73 20 61 20 5a 49 50 20 61 72 63 68  LE is a ZIP arch
1da00 69 76 65 22 2c 0a 20 20 22 2e 6f 75 74 70 75 74  ive",.  ".output
1da10 20 3f 46 49 4c 45 3f 20 20 20 20 20 20 20 20 20   ?FILE?         
1da20 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f    Send output to
1da30 20 46 49 4c 45 20 6f 72 20 73 74 64 6f 75 74 20   FILE or stdout 
1da40 69 66 20 46 49 4c 45 20 69 73 20 6f 6d 69 74 74  if FILE is omitt
1da50 65 64 22 2c 0a 20 20 22 20 20 20 20 20 49 66 20  ed",.  "     If 
1da60 46 49 4c 45 20 62 65 67 69 6e 73 20 77 69 74 68  FILE begins with
1da70 20 27 7c 27 20 74 68 65 6e 20 6f 70 65 6e 20 69   '|' then open i
1da80 74 20 61 73 20 61 20 70 69 70 65 2e 22 2c 0a 20  t as a pipe.",. 
1da90 20 22 2e 70 61 72 61 6d 65 74 65 72 20 43 4d 44   ".parameter CMD
1daa0 20 2e 2e 2e 20 20 20 20 20 20 20 4d 61 6e 61 67   ...       Manag
1dab0 65 20 53 51 4c 20 70 61 72 61 6d 65 74 65 72 20  e SQL parameter 
1dac0 62 69 6e 64 69 6e 67 73 22 2c 0a 20 20 22 20 20  bindings",.  "  
1dad0 20 63 6c 65 61 72 20 20 20 20 20 20 20 20 20 20   clear          
1dae0 20 20 20 20 20 20 20 20 20 45 72 61 73 65 20 61           Erase a
1daf0 6c 6c 20 62 69 6e 64 69 6e 67 73 22 2c 0a 20 20  ll bindings",.  
1db00 22 20 20 20 69 6e 69 74 20 20 20 20 20 20 20 20  "   init        
1db10 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 69 74              Init
1db20 69 61 6c 69 7a 65 20 74 68 65 20 54 45 4d 50 20  ialize the TEMP 
1db30 74 61 62 6c 65 20 74 68 61 74 20 68 6f 6c 64 73  table that holds
1db40 20 62 69 6e 64 69 6e 67 73 22 2c 0a 20 20 22 20   bindings",.  " 
1db50 20 20 6c 69 73 74 20 20 20 20 20 20 20 20 20 20    list          
1db60 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20 74            List t
1db70 68 65 20 63 75 72 72 65 6e 74 20 70 61 72 61 6d  he current param
1db80 65 74 65 72 20 62 69 6e 64 69 6e 67 73 22 2c 0a  eter bindings",.
1db90 20 20 22 20 20 20 73 65 74 20 50 41 52 41 4d 45    "   set PARAME
1dba0 54 45 52 20 56 41 4c 55 45 20 20 20 20 20 47 69  TER VALUE     Gi
1dbb0 76 65 6e 20 53 51 4c 20 70 61 72 61 6d 65 74 65  ven SQL paramete
1dbc0 72 20 50 41 52 41 4d 45 54 45 52 20 61 20 76 61  r PARAMETER a va
1dbd0 6c 75 65 20 6f 66 20 56 41 4c 55 45 22 2c 0a 20  lue of VALUE",. 
1dbe0 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 52               PAR
1dc00 41 4d 45 54 45 52 20 73 68 6f 75 6c 64 20 73 74  AMETER should st
1dc10 61 72 74 20 77 69 74 68 20 27 24 27 2c 20 27 3a  art with '$', ':
1dc20 27 2c 20 27 40 27 2c 20 6f 72 20 27 3f 27 22 2c  ', '@', or '?'",
1dc30 0a 20 20 22 20 20 20 75 6e 73 65 74 20 50 41 52  .  "   unset PAR
1dc40 41 4d 45 54 45 52 20 20 20 20 20 20 20 20 20 52  AMETER         R
1dc50 65 6d 6f 76 65 20 50 41 52 41 4d 45 54 45 52 20  emove PARAMETER 
1dc60 66 72 6f 6d 20 74 68 65 20 62 69 6e 64 69 6e 67  from the binding
1dc70 20 74 61 62 6c 65 22 2c 0a 20 20 22 2e 70 72 69   table",.  ".pri
1dc80 6e 74 20 53 54 52 49 4e 47 2e 2e 2e 20 20 20 20  nt STRING...    
1dc90 20 20 20 20 20 50 72 69 6e 74 20 6c 69 74 65 72       Print liter
1dca0 61 6c 20 53 54 52 49 4e 47 22 2c 0a 23 69 66 6e  al STRING",.#ifn
1dcb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1dcc0 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
1dcd0 4b 0a 20 20 22 2e 70 72 6f 67 72 65 73 73 20 4e  K.  ".progress N
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e                In
1dcf0 76 6f 6b 65 20 70 72 6f 67 72 65 73 73 20 68 61  voke progress ha
1dd00 6e 64 6c 65 72 20 61 66 74 65 72 20 65 76 65 72  ndler after ever
1dd10 79 20 4e 20 6f 70 63 6f 64 65 73 22 2c 0a 20 20  y N opcodes",.  
1dd20 22 20 20 20 2d 2d 6c 69 6d 69 74 20 4e 20 20 20  "   --limit N   
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e                In
1dd40 74 65 72 72 75 70 74 20 61 66 74 65 72 20 4e 20  terrupt after N 
1dd50 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
1dd60 6b 73 22 2c 0a 20 20 22 20 20 20 2d 2d 6f 6e 63  ks",.  "   --onc
1dd70 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1dd80 20 20 20 20 20 44 6f 20 6e 6f 20 6d 6f 72 65 20       Do no more 
1dd90 74 68 61 6e 20 6f 6e 65 20 70 72 6f 67 72 65 73  than one progres
1dda0 73 20 69 6e 74 65 72 72 75 70 74 22 2c 0a 20 20  s interrupt",.  
1ddb0 22 20 20 20 2d 2d 71 75 69 65 74 7c 2d 71 20 20  "   --quiet|-q  
1ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f                No
1ddd0 20 6f 75 74 70 75 74 20 65 78 63 65 70 74 20 61   output except a
1dde0 74 20 69 6e 74 65 72 72 75 70 74 73 22 2c 0a 20  t interrupts",. 
1ddf0 20 22 20 20 20 2d 2d 72 65 73 65 74 20 20 20 20   "   --reset    
1de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52                 R
1de10 65 73 65 74 20 74 68 65 20 63 6f 75 6e 74 20 66  eset the count f
1de20 6f 72 20 65 61 63 68 20 69 6e 70 75 74 20 61 6e  or each input an
1de30 64 20 69 6e 74 65 72 72 75 70 74 22 2c 0a 23 65  d interrupt",.#e
1de40 6e 64 69 66 0a 20 20 22 2e 70 72 6f 6d 70 74 20  ndif.  ".prompt 
1de50 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45 20 20 20  MAIN CONTINUE   
1de60 20 52 65 70 6c 61 63 65 20 74 68 65 20 73 74 61   Replace the sta
1de70 6e 64 61 72 64 20 70 72 6f 6d 70 74 73 22 2c 0a  ndard prompts",.
1de80 20 20 22 2e 71 75 69 74 20 20 20 20 20 20 20 20    ".quit        
1de90 20 20 20 20 20 20 20 20 20 20 20 20 45 78 69 74              Exit
1dea0 20 74 68 69 73 20 70 72 6f 67 72 61 6d 22 2c 0a   this program",.
1deb0 20 20 22 2e 72 65 61 64 20 46 49 4c 45 20 20 20    ".read FILE   
1dec0 20 20 20 20 20 20 20 20 20 20 20 20 52 65 61 64              Read
1ded0 20 69 6e 70 75 74 20 66 72 6f 6d 20 46 49 4c 45   input from FILE
1dee0 22 2c 0a 20 20 22 2e 72 65 73 74 6f 72 65 20 3f  ",.  ".restore ?
1def0 44 42 3f 20 46 49 4c 45 20 20 20 20 20 20 20 52  DB? FILE       R
1df00 65 73 74 6f 72 65 20 63 6f 6e 74 65 6e 74 20 6f  estore content o
1df10 66 20 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22  f DB (default \"
1df20 6d 61 69 6e 5c 22 29 20 66 72 6f 6d 20 46 49 4c  main\") from FIL
1df30 45 22 2c 0a 20 20 22 2e 73 61 76 65 20 46 49 4c  E",.  ".save FIL
1df40 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
1df50 57 72 69 74 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  Write in-memory 
1df60 64 61 74 61 62 61 73 65 20 69 6e 74 6f 20 46 49  database into FI
1df70 4c 45 22 2c 0a 20 20 22 2e 73 63 61 6e 73 74 61  LE",.  ".scansta
1df80 74 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  ts on|off       
1df90 20 54 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74   Turn sqlite3_st
1dfa0 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 20  mt_scanstatus() 
1dfb0 6d 65 74 72 69 63 73 20 6f 6e 20 6f 72 20 6f 66  metrics on or of
1dfc0 66 22 2c 0a 20 20 22 2e 73 63 68 65 6d 61 20 3f  f",.  ".schema ?
1dfd0 50 41 54 54 45 52 4e 3f 20 20 20 20 20 20 20 20  PATTERN?        
1dfe0 53 68 6f 77 20 74 68 65 20 43 52 45 41 54 45 20  Show the CREATE 
1dff0 73 74 61 74 65 6d 65 6e 74 73 20 6d 61 74 63 68  statements match
1e000 69 6e 67 20 50 41 54 54 45 52 4e 22 2c 0a 20 20  ing PATTERN",.  
1e010 22 20 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c  "     Options:",
1e020 0a 20 20 22 20 20 20 20 20 20 20 20 20 2d 2d 69  .  "         --i
1e030 6e 64 65 6e 74 20 20 20 20 20 20 20 20 20 20 20  ndent           
1e040 20 54 72 79 20 74 6f 20 70 72 65 74 74 79 2d 70   Try to pretty-p
1e050 72 69 6e 74 20 74 68 65 20 73 63 68 65 6d 61 22  rint the schema"
1e060 2c 0a 20 20 22 2e 73 65 6c 66 74 65 73 74 20 3f  ,.  ".selftest ?
1e070 4f 50 54 49 4f 4e 53 3f 20 20 20 20 20 20 52 75  OPTIONS?      Ru
1e080 6e 20 74 65 73 74 73 20 64 65 66 69 6e 65 64 20  n tests defined 
1e090 69 6e 20 74 68 65 20 53 45 4c 46 54 45 53 54 20  in the SELFTEST 
1e0a0 74 61 62 6c 65 22 2c 0a 20 20 22 20 20 20 20 4f  table",.  "    O
1e0b0 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20  ptions:",.  "   
1e0c0 20 20 20 20 2d 2d 69 6e 69 74 20 20 20 20 20 20      --init      
1e0d0 20 20 20 20 20 20 20 20 20 43 72 65 61 74 65 20           Create 
1e0e0 61 20 6e 65 77 20 53 45 4c 46 54 45 53 54 20 74  a new SELFTEST t
1e0f0 61 62 6c 65 22 2c 0a 20 20 22 20 20 20 20 20 20  able",.  "      
1e100 20 2d 76 20 20 20 20 20 20 20 20 20 20 20 20 20   -v             
1e110 20 20 20 20 20 20 56 65 72 62 6f 73 65 20 6f 75        Verbose ou
1e120 74 70 75 74 22 2c 0a 20 20 22 2e 73 65 70 61 72  tput",.  ".separ
1e130 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f 20 20  ator COL ?ROW?  
1e140 20 20 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f     Change the co
1e150 6c 75 6d 6e 20 61 6e 64 20 72 6f 77 20 73 65 70  lumn and row sep
1e160 61 72 61 74 6f 72 73 22 2c 0a 23 69 66 20 64 65  arators",.#if de
1e170 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1e180 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 22  BLE_SESSION).  "
1e190 2e 73 65 73 73 69 6f 6e 20 3f 4e 41 4d 45 3f 20  .session ?NAME? 
1e1a0 43 4d 44 20 2e 2e 2e 20 20 43 72 65 61 74 65 20  CMD ...  Create 
1e1b0 6f 72 20 63 6f 6e 74 72 6f 6c 20 73 65 73 73 69  or control sessi
1e1c0 6f 6e 73 22 2c 0a 20 20 22 20 20 20 53 75 62 63  ons",.  "   Subc
1e1d0 6f 6d 6d 61 6e 64 73 3a 22 2c 0a 20 20 22 20 20  ommands:",.  "  
1e1e0 20 20 20 61 74 74 61 63 68 20 54 41 42 4c 45 20     attach TABLE 
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 41 74 74 61              Atta
1e200 63 68 20 54 41 42 4c 45 22 2c 0a 20 20 22 20 20  ch TABLE",.  "  
1e210 20 20 20 63 68 61 6e 67 65 73 65 74 20 46 49 4c     changeset FIL
1e220 45 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74  E           Writ
1e230 65 20 61 20 63 68 61 6e 67 65 73 65 74 20 69 6e  e a changeset in
1e240 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20  to FILE",.  "   
1e250 20 20 63 6c 6f 73 65 20 20 20 20 20 20 20 20 20    close         
1e260 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f 73 65             Close
1e270 20 6f 6e 65 20 73 65 73 73 69 6f 6e 22 2c 0a 20   one session",. 
1e280 20 22 20 20 20 20 20 65 6e 61 62 6c 65 20 3f 42   "     enable ?B
1e290 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20 20 20  OOLEAN?         
1e2a0 53 65 74 20 6f 72 20 71 75 65 72 79 20 74 68 65  Set or query the
1e2b0 20 65 6e 61 62 6c 65 20 62 69 74 22 2c 0a 20 20   enable bit",.  
1e2c0 22 20 20 20 20 20 66 69 6c 74 65 72 20 47 4c 4f  "     filter GLO
1e2d0 42 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20 52  B...           R
1e2e0 65 6a 65 63 74 20 74 61 62 6c 65 73 20 6d 61 74  eject tables mat
1e2f0 63 68 69 6e 67 20 47 4c 4f 42 73 22 2c 0a 20 20  ching GLOBs",.  
1e300 22 20 20 20 20 20 69 6e 64 69 72 65 63 74 20 3f  "     indirect ?
1e310 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20 4d  BOOLEAN?       M
1e320 61 72 6b 20 6f 72 20 71 75 65 72 79 20 74 68 65  ark or query the
1e330 20 69 6e 64 69 72 65 63 74 20 73 74 61 74 75 73   indirect status
1e340 22 2c 0a 20 20 22 20 20 20 20 20 69 73 65 6d 70  ",.  "     isemp
1e350 74 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ty              
1e360 20 20 20 20 51 75 65 72 79 20 77 68 65 74 68 65      Query whethe
1e370 72 20 74 68 65 20 73 65 73 73 69 6f 6e 20 69 73  r the session is
1e380 20 65 6d 70 74 79 22 2c 0a 20 20 22 20 20 20 20   empty",.  "    
1e390 20 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20   list           
1e3a0 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20 63            List c
1e3b0 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65  urrently open se
1e3c0 73 73 69 6f 6e 20 6e 61 6d 65 73 22 2c 0a 20 20  ssion names",.  
1e3d0 22 20 20 20 20 20 6f 70 65 6e 20 44 42 20 4e 41  "     open DB NA
1e3e0 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  ME             O
1e3f0 70 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f  pen a new sessio
1e400 6e 20 6f 6e 20 44 42 22 2c 0a 20 20 22 20 20 20  n on DB",.  "   
1e410 20 20 70 61 74 63 68 73 65 74 20 46 49 4c 45 20    patchset FILE 
1e420 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 65             Write
1e430 20 61 20 70 61 74 63 68 73 65 74 20 69 6e 74 6f   a patchset into
1e440 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 49 66   FILE",.  "   If
1e450 20 3f 4e 41 4d 45 3f 20 69 73 20 6f 6d 69 74 74   ?NAME? is omitt
1e460 65 64 2c 20 74 68 65 20 66 69 72 73 74 20 64 65  ed, the first de
1e470 66 69 6e 65 64 20 73 65 73 73 69 6f 6e 20 69 73  fined session is
1e480 20 75 73 65 64 2e 22 2c 0a 23 65 6e 64 69 66 0a   used.",.#endif.
1e490 20 20 22 2e 73 68 61 33 73 75 6d 20 2e 2e 2e 20    ".sha3sum ... 
1e4a0 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6d 70              Comp
1e4b0 75 74 65 20 61 20 53 48 41 33 20 68 61 73 68 20  ute a SHA3 hash 
1e4c0 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
1e4d0 65 6e 74 22 2c 0a 20 20 22 20 20 20 20 4f 70 74  ent",.  "    Opt
1e4e0 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20  ions:",.  "     
1e4f0 20 2d 2d 73 63 68 65 6d 61 20 20 20 20 20 20 20   --schema       
1e500 20 20 20 20 20 20 20 41 6c 73 6f 20 68 61 73 68         Also hash
1e510 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
1e520 65 72 20 74 61 62 6c 65 22 2c 0a 20 20 22 20 20  er table",.  "  
1e530 20 20 20 20 2d 2d 73 68 61 33 2d 32 32 34 20 20      --sha3-224  
1e540 20 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68            Use th
1e550 65 20 73 68 61 33 2d 32 32 34 20 61 6c 67 6f 72  e sha3-224 algor
1e560 69 74 68 6d 22 2c 0a 20 20 22 20 20 20 20 20 20  ithm",.  "      
1e570 2d 2d 73 68 61 33 2d 32 35 36 20 20 20 20 20 20  --sha3-256      
1e580 20 20 20 20 20 20 55 73 65 20 74 68 65 20 73 68        Use the sh
1e590 61 33 2d 32 35 36 20 61 6c 67 6f 72 69 74 68 6d  a3-256 algorithm
1e5a0 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
1e5b0 65 66 61 75 6c 74 2e 22 2c 0a 20 20 22 20 20 20  efault.",.  "   
1e5c0 20 20 20 2d 2d 73 68 61 33 2d 33 38 34 20 20 20     --sha3-384   
1e5d0 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68 65           Use the
1e5e0 20 73 68 61 33 2d 33 38 34 20 61 6c 67 6f 72 69   sha3-384 algori
1e5f0 74 68 6d 22 2c 0a 20 20 22 20 20 20 20 20 20 2d  thm",.  "      -
1e600 2d 73 68 61 33 2d 35 31 32 20 20 20 20 20 20 20  -sha3-512       
1e610 20 20 20 20 20 55 73 65 20 74 68 65 20 73 68 61       Use the sha
1e620 33 2d 35 31 32 20 61 6c 67 6f 72 69 74 68 6d 22  3-512 algorithm"
1e630 2c 0a 20 20 22 20 20 20 20 41 6e 79 20 6f 74 68  ,.  "    Any oth
1e640 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  er argument is a
1e650 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 66 6f   LIKE pattern fo
1e660 72 20 74 61 62 6c 65 73 20 74 6f 20 68 61 73 68  r tables to hash
1e670 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ",.#ifndef SQLIT
1e680 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a  E_NOHAVE_SYSTEM.
1e690 20 20 22 2e 73 68 65 6c 6c 20 43 4d 44 20 41 52    ".shell CMD AR
1e6a0 47 53 2e 2e 2e 20 20 20 20 20 20 20 52 75 6e 20  GS...       Run 
1e6b0 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e 20 61  CMD ARGS... in a
1e6c0 20 73 79 73 74 65 6d 20 73 68 65 6c 6c 22 2c 0a   system shell",.
1e6d0 23 65 6e 64 69 66 0a 20 20 22 2e 73 68 6f 77 20  #endif.  ".show 
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6f0 20 20 20 53 68 6f 77 20 74 68 65 20 63 75 72 72     Show the curr
1e700 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 76  ent values for v
1e710 61 72 69 6f 75 73 20 73 65 74 74 69 6e 67 73 22  arious settings"
1e720 2c 0a 20 20 22 2e 73 74 61 74 73 20 3f 6f 6e 7c  ,.  ".stats ?on|
1e730 6f 66 66 3f 20 20 20 20 20 20 20 20 20 20 53 68  off?          Sh
1e740 6f 77 20 73 74 61 74 73 20 6f 72 20 74 75 72 6e  ow stats or turn
1e750 20 73 74 61 74 73 20 6f 6e 20 6f 72 20 6f 66 66   stats on or off
1e760 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ",.#ifndef SQLIT
1e770 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a  E_NOHAVE_SYSTEM.
1e780 20 20 22 2e 73 79 73 74 65 6d 20 43 4d 44 20 41    ".system CMD A
1e790 52 47 53 2e 2e 2e 20 20 20 20 20 20 52 75 6e 20  RGS...      Run 
1e7a0 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e 20 61  CMD ARGS... in a
1e7b0 20 73 79 73 74 65 6d 20 73 68 65 6c 6c 22 2c 0a   system shell",.
1e7c0 23 65 6e 64 69 66 0a 20 20 22 2e 74 61 62 6c 65  #endif.  ".table
1e7d0 73 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20  s ?TABLE?       
1e7e0 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 6f 66     List names of
1e7f0 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67   tables matching
1e800 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41   LIKE pattern TA
1e810 42 4c 45 22 2c 0a 20 20 22 2e 74 65 73 74 63 61  BLE",.  ".testca
1e820 73 65 20 4e 41 4d 45 20 20 20 20 20 20 20 20 20  se NAME         
1e830 20 20 42 65 67 69 6e 20 72 65 64 69 72 65 63 74    Begin redirect
1e840 69 6e 67 20 6f 75 74 70 75 74 20 74 6f 20 27 74  ing output to 't
1e850 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 27  estcase-out.txt'
1e860 22 2c 0a 20 20 22 2e 74 69 6d 65 6f 75 74 20 4d  ",.  ".timeout M
1e870 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  S              T
1e880 72 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63 6b 65  ry opening locke
1e890 64 20 74 61 62 6c 65 73 20 66 6f 72 20 4d 53 20  d tables for MS 
1e8a0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 22 2c 0a 20  milliseconds",. 
1e8b0 20 22 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66 66 20   ".timer on|off 
1e8c0 20 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20             Turn 
1e8d0 53 51 4c 20 74 69 6d 65 72 20 6f 6e 20 6f 72 20  SQL timer on or 
1e8e0 6f 66 66 22 2c 0a 23 69 66 6e 64 65 66 20 53 51  off",.#ifndef SQ
1e8f0 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
1e900 20 20 22 2e 74 72 61 63 65 20 3f 4f 50 54 49 4f    ".trace ?OPTIO
1e910 4e 53 3f 20 20 20 20 20 20 20 20 20 4f 75 74 70  NS?         Outp
1e920 75 74 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  ut each SQL stat
1e930 65 6d 65 6e 74 20 61 73 20 69 74 20 69 73 20 72  ement as it is r
1e940 75 6e 22 2c 0a 20 20 22 20 20 20 20 46 49 4c 45  un",.  "    FILE
1e950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e960 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20      Send output 
1e970 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20  to FILE",.  "   
1e980 20 73 74 64 6f 75 74 20 20 20 20 20 20 20 20 20   stdout         
1e990 20 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75           Send ou
1e9a0 74 70 75 74 20 74 6f 20 73 74 64 6f 75 74 22 2c  tput to stdout",
1e9b0 0a 20 20 22 20 20 20 20 73 74 64 65 72 72 20 20  .  "    stderr  
1e9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9d0 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 73  Send output to s
1e9e0 74 64 65 72 72 22 2c 0a 20 20 22 20 20 20 20 6f  tderr",.  "    o
1e9f0 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ff              
1ea00 20 20 20 20 20 20 20 44 69 73 61 62 6c 65 20 74         Disable t
1ea10 72 61 63 69 6e 67 22 2c 0a 20 20 22 20 20 20 20  racing",.  "    
1ea20 2d 2d 65 78 70 61 6e 64 65 64 20 20 20 20 20 20  --expanded      
1ea30 20 20 20 20 20 20 20 20 45 78 70 61 6e 64 20 71          Expand q
1ea40 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 22  uery parameters"
1ea50 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
1ea60 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45  ENABLE_NORMALIZE
1ea70 0a 20 20 22 20 20 20 20 2d 2d 6e 6f 72 6d 61 6c  .  "    --normal
1ea80 69 7a 65 64 20 20 20 20 20 20 20 20 20 20 20 20  ized            
1ea90 4e 6f 72 6d 61 6c 20 74 68 65 20 53 51 4c 20 73  Normal the SQL s
1eaa0 74 61 74 65 6d 65 6e 74 73 22 2c 0a 23 65 6e 64  tatements",.#end
1eab0 69 66 0a 20 20 22 20 20 20 20 2d 2d 70 6c 61 69  if.  "    --plai
1eac0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
1ead0 20 20 53 68 6f 77 20 53 51 4c 20 61 73 20 69 74    Show SQL as it
1eae0 20 69 73 20 69 6e 70 75 74 22 2c 0a 20 20 22 20   is input",.  " 
1eaf0 20 20 20 2d 2d 73 74 6d 74 20 20 20 20 20 20 20     --stmt       
1eb00 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65             Trace
1eb10 20 73 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75   statement execu
1eb20 74 69 6f 6e 20 28 53 51 4c 49 54 45 5f 54 52 41  tion (SQLITE_TRA
1eb30 43 45 5f 53 54 4d 54 29 22 2c 0a 20 20 22 20 20  CE_STMT)",.  "  
1eb40 20 20 2d 2d 70 72 6f 66 69 6c 65 20 20 20 20 20    --profile     
1eb50 20 20 20 20 20 20 20 20 20 20 50 72 6f 66 69 6c            Profil
1eb60 65 20 73 74 61 74 65 6d 65 6e 74 73 20 28 53 51  e statements (SQ
1eb70 4c 49 54 45 5f 54 52 41 43 45 5f 50 52 4f 46 49  LITE_TRACE_PROFI
1eb80 4c 45 29 22 2c 0a 20 20 22 20 20 20 20 2d 2d 72  LE)",.  "    --r
1eb90 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ow              
1eba0 20 20 20 20 20 54 72 61 63 65 20 65 61 63 68 20       Trace each 
1ebb0 72 6f 77 20 28 53 51 4c 49 54 45 5f 54 52 41 43  row (SQLITE_TRAC
1ebc0 45 5f 52 4f 57 29 22 2c 0a 20 20 22 20 20 20 20  E_ROW)",.  "    
1ebd0 2d 2d 63 6c 6f 73 65 20 20 20 20 20 20 20 20 20  --close         
1ebe0 20 20 20 20 20 20 20 20 54 72 61 63 65 20 63 6f          Trace co
1ebf0 6e 6e 65 63 74 69 6f 6e 20 63 6c 6f 73 65 20 28  nnection close (
1ec00 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f  SQLITE_TRACE_CLO
1ec10 53 45 29 22 2c 0a 23 65 6e 64 69 66 20 2f 2a 20  SE)",.#endif /* 
1ec20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
1ec30 45 20 2a 2f 0a 20 20 22 2e 76 66 73 69 6e 66 6f  E */.  ".vfsinfo
1ec40 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20 20 20   ?AUX?          
1ec50 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
1ec60 75 74 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  ut the top-level
1ec70 20 56 46 53 22 2c 0a 20 20 22 2e 76 66 73 6c 69   VFS",.  ".vfsli
1ec80 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
1ec90 20 20 20 4c 69 73 74 20 61 6c 6c 20 61 76 61 69     List all avai
1eca0 6c 61 62 6c 65 20 56 46 53 65 73 22 2c 0a 20 20  lable VFSes",.  
1ecb0 22 2e 76 66 73 6e 61 6d 65 20 3f 41 55 58 3f 20  ".vfsname ?AUX? 
1ecc0 20 20 20 20 20 20 20 20 20 20 50 72 69 6e 74 20            Print 
1ecd0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1ece0 56 46 53 20 73 74 61 63 6b 22 2c 0a 20 20 22 2e  VFS stack",.  ".
1ecf0 77 69 64 74 68 20 4e 55 4d 31 20 4e 55 4d 32 20  width NUM1 NUM2 
1ed00 2e 2e 2e 20 20 20 20 20 53 65 74 20 63 6f 6c 75  ...     Set colu
1ed10 6d 6e 20 77 69 64 74 68 73 20 66 6f 72 20 5c 22  mn widths for \"
1ed20 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65 22 2c 0a  column\" mode",.
1ed30 20 20 22 20 20 20 20 20 4e 65 67 61 74 69 76 65    "     Negative
1ed40 20 76 61 6c 75 65 73 20 72 69 67 68 74 2d 6a 75   values right-ju
1ed50 73 74 69 66 79 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  stify",.};../*.*
1ed60 2a 20 4f 75 74 70 75 74 20 68 65 6c 70 20 74 65  * Output help te
1ed70 78 74 2e 0a 2a 2a 0a 2a 2a 20 7a 50 61 74 74 65  xt..**.** zPatte
1ed80 72 6e 20 64 65 73 63 72 69 62 65 73 20 74 68 65  rn describes the
1ed90 20 73 65 74 20 6f 66 20 63 6f 6d 6d 61 6e 64 73   set of commands
1eda0 20 66 6f 72 20 77 68 69 63 68 20 68 65 6c 70 20   for which help 
1edb0 74 65 78 74 20 69 73 20 70 72 6f 76 69 64 65 64  text is provided
1edc0 2e 0a 2a 2a 20 49 66 20 7a 50 61 74 74 65 72 6e  ..** If zPattern
1edd0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 73   is NULL, then s
1ede0 68 6f 77 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73  how all commands
1edf0 2c 20 62 75 74 20 6f 6e 6c 79 20 67 69 76 65 20  , but only give 
1ee00 61 20 6f 6e 65 2d 6c 69 6e 65 0a 2a 2a 20 64 65  a one-line.** de
1ee10 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 65 61 63  scription of eac
1ee20 68 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  h..**.** Return 
1ee30 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  the number of ma
1ee40 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tches..*/.static
1ee50 20 69 6e 74 20 73 68 6f 77 48 65 6c 70 28 46 49   int showHelp(FI
1ee60 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
1ee70 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 29 7b 0a  har *zPattern){.
1ee80 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
1ee90 6e 74 20 6a 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt j = 0;.  int 
1eea0 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  n = 0;.  char *z
1eeb0 50 61 74 3b 0a 20 20 69 66 28 20 7a 50 61 74 74  Pat;.  if( zPatt
1eec0 65 72 6e 3d 3d 30 0a 20 20 20 7c 7c 20 7a 50 61  ern==0.   || zPa
1eed0 74 74 65 72 6e 5b 30 5d 3d 3d 27 30 27 0a 20 20  ttern[0]=='0'.  
1eee0 20 7c 7c 20 73 74 72 63 6d 70 28 7a 50 61 74 74   || strcmp(zPatt
1eef0 65 72 6e 2c 22 2d 61 22 29 3d 3d 30 0a 20 20 20  ern,"-a")==0.   
1ef00 7c 7c 20 73 74 72 63 6d 70 28 7a 50 61 74 74 65  || strcmp(zPatte
1ef10 72 6e 2c 22 2d 61 6c 6c 22 29 3d 3d 30 0a 20 20  rn,"-all")==0.  
1ef20 29 7b 0a 20 20 20 20 2f 2a 20 53 68 6f 77 20 61  ){.    /* Show a
1ef30 6c 6c 20 63 6f 6d 6d 61 6e 64 73 2c 20 62 75 74  ll commands, but
1ef40 20 6f 6e 6c 79 20 6f 6e 65 20 6c 69 6e 65 20 70   only one line p
1ef50 65 72 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  er command */.  
1ef60 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d    if( zPattern==
1ef70 30 20 29 20 7a 50 61 74 74 65 72 6e 20 3d 20 22  0 ) zPattern = "
1ef80 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ";.    for(i=0; 
1ef90 69 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65  i<ArraySize(azHe
1efa0 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  lp); i++){.     
1efb0 20 69 66 28 20 61 7a 48 65 6c 70 5b 69 5d 5b 30   if( azHelp[i][0
1efc0 5d 3d 3d 27 2e 27 20 7c 7c 20 7a 50 61 74 74 65  ]=='.' || zPatte
1efd0 72 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  rn[0] ){.       
1efe0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
1eff0 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70  , "%s\n", azHelp
1f000 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 2b  [i]);.        n+
1f010 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1f020 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1f030 20 4c 6f 6f 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e   Look for comman
1f040 64 73 20 74 68 61 74 20 66 6f 72 20 77 68 69 63  ds that for whic
1f050 68 20 7a 50 61 74 74 65 72 6e 20 69 73 20 61 6e  h zPattern is an
1f060 20 65 78 61 63 74 20 70 72 65 66 69 78 20 2a 2f   exact prefix */
1f070 0a 20 20 20 20 7a 50 61 74 20 3d 20 73 71 6c 69  .    zPat = sqli
1f080 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 2e 25 73  te3_mprintf(".%s
1f090 2a 22 2c 20 7a 50 61 74 74 65 72 6e 29 3b 0a 20  *", zPattern);. 
1f0a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
1f0b0 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 3b  raySize(azHelp);
1f0c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
1f0d0 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
1f0e0 28 7a 50 61 74 2c 20 61 7a 48 65 6c 70 5b 69 5d  (zPat, azHelp[i]
1f0f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1f100 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
1f110 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b   "%s\n", azHelp[
1f120 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  i]);.        j =
1f130 20 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 6e 2b   i+1;.        n+
1f140 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1f150 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1f160 65 28 7a 50 61 74 29 3b 0a 20 20 20 20 69 66 28  e(zPat);.    if(
1f170 20 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20   n ){.      if( 
1f180 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  n==1 ){.        
1f190 2f 2a 20 77 68 65 6e 20 7a 50 61 74 74 65 72 6e  /* when zPattern
1f1a0 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
1f1b0 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 6f 6d 6d  exactly one comm
1f1c0 61 6e 64 2c 20 74 68 65 6e 20 69 6e 63 6c 75 64  and, then includ
1f1d0 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  e the.        **
1f1e0 20 64 65 74 61 69 6c 73 20 6f 66 20 74 68 61 74   details of that
1f1f0 20 63 6f 6d 6d 61 6e 64 2c 20 77 68 69 63 68 20   command, which 
1f200 73 68 6f 75 6c 64 20 62 65 67 69 6e 20 61 74 20  should begin at 
1f210 6f 66 66 73 65 74 20 6a 20 2a 2f 0a 20 20 20 20  offset j */.    
1f220 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 41 72 72      while( j<Arr
1f230 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 2d 31  aySize(azHelp)-1
1f240 20 26 26 20 61 7a 48 65 6c 70 5b 6a 5d 5b 30 5d   && azHelp[j][0]
1f250 21 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20  !='.' ){.       
1f260 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
1f270 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65  ut, "%s\n", azHe
1f280 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20  lp[j]);.        
1f290 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d    j++;.        }
1f2a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1f2b0 65 74 75 72 6e 20 6e 3b 0a 20 20 20 20 7d 0a 20  eturn n;.    }. 
1f2c0 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 63     /* Look for c
1f2d0 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 63 6f 6e  ommands that con
1f2e0 74 61 69 6e 20 7a 50 61 74 74 65 72 6e 20 61 6e  tain zPattern an
1f2f0 79 77 68 65 72 65 2e 20 20 53 68 6f 77 20 74 68  ywhere.  Show th
1f300 65 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a  e complete.    *
1f310 2a 20 74 65 78 74 20 6f 66 20 61 6c 6c 20 63 6f  * text of all co
1f320 6d 6d 61 6e 64 73 20 74 68 61 74 20 6d 61 74 63  mmands that matc
1f330 68 2e 20 2a 2f 0a 20 20 20 20 7a 50 61 74 20 3d  h. */.    zPat =
1f340 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1f350 28 22 25 25 25 73 25 25 22 2c 20 7a 50 61 74 74  ("%%%s%%", zPatt
1f360 65 72 6e 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ern);.    for(i=
1f370 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
1f380 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20 20  zHelp); i++){.  
1f390 20 20 20 20 69 66 28 20 61 7a 48 65 6c 70 5b 69      if( azHelp[i
1f3a0 5d 5b 30 5d 3d 3d 27 2e 27 20 29 20 6a 20 3d 20  ][0]=='.' ) j = 
1f3b0 69 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  i;.      if( sql
1f3c0 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a 50 61  ite3_strlike(zPa
1f3d0 74 2c 20 61 7a 48 65 6c 70 5b 69 5d 2c 20 30 29  t, azHelp[i], 0)
1f3e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==0 ){.        u
1f3f0 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
1f400 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a  "%s\n", azHelp[j
1f410 5d 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  ]);.        whil
1f420 65 28 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 61  e( j<ArraySize(a
1f430 7a 48 65 6c 70 29 2d 31 20 26 26 20 61 7a 48 65  zHelp)-1 && azHe
1f440 6c 70 5b 6a 2b 31 5d 5b 30 5d 21 3d 27 2e 27 20  lp[j+1][0]!='.' 
1f450 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  ){.          j++
1f460 3b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  ;.          utf8
1f470 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
1f480 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b  \n", azHelp[j]);
1f490 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f4a0 20 20 20 69 20 3d 20 6a 3b 0a 20 20 20 20 20 20     i = j;.      
1f4b0 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    n++;.      }. 
1f4c0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1f4d0 5f 66 72 65 65 28 7a 50 61 74 29 3b 0a 20 20 7d  _free(zPat);.  }
1f4e0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
1f4f0 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1f500 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
1f510 6e 74 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74  nt process_input
1f520 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 3b  (ShellState *p);
1f530 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
1f540 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 6c 65   content of file
1f550 20 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d 65 6d 6f   zName into memo
1f560 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
1f570 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
1f580 34 28 29 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  4().** and retur
1f590 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1f5a0 68 65 20 62 75 66 66 65 72 2e 20 54 68 65 20 63  he buffer. The c
1f5b0 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
1f5c0 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67  ible for freeing
1f5d0 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 2e 0a  .** the memory..
1f5e0 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
1f5f0 65 72 20 70 6e 42 79 74 65 20 69 73 20 6e 6f 74  er pnByte is not
1f600 20 4e 55 4c 4c 2c 20 28 2a 70 6e 42 79 74 65 29   NULL, (*pnByte)
1f610 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
1f620 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a  umber of bytes.*
1f630 2a 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  * read..**.** Fo
1f640 72 20 63 6f 6e 76 65 6e 69 65 6e 63 65 2c 20 61  r convenience, a
1f650 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
1f660 62 79 74 65 20 69 73 20 61 6c 77 61 79 73 20 61  byte is always a
1f670 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 64  ppended to the d
1f680 61 74 61 20 72 65 61 64 0a 2a 2a 20 66 72 6f 6d  ata read.** from
1f690 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65   the file before
1f6a0 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 72   the buffer is r
1f6b0 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 62 79  eturned. This by
1f6c0 74 65 20 69 73 20 6e 6f 74 20 69 6e 63 6c 75 64  te is not includ
1f6d0 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6e  ed in.** the fin
1f6e0 61 6c 20 76 61 6c 75 65 20 6f 66 20 28 2a 70 6e  al value of (*pn
1f6f0 42 79 74 65 29 2c 20 69 66 20 61 70 70 6c 69 63  Byte), if applic
1f700 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 55 4c 4c  able..**.** NULL
1f710 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1f720 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
1f730 6f 75 6e 74 65 72 65 64 2e 20 54 68 65 20 66 69  ountered. The fi
1f740 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70 6e  nal value of *pn
1f750 42 79 74 65 0a 2a 2a 20 69 73 20 75 6e 64 65 66  Byte.** is undef
1f760 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  ined in this cas
1f770 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
1f780 72 20 2a 72 65 61 64 46 69 6c 65 28 63 6f 6e 73  r *readFile(cons
1f790 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
1f7a0 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20 20 46  nt *pnByte){.  F
1f7b0 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70 65 6e 28  ILE *in = fopen(
1f7c0 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20  zName, "rb");.  
1f7d0 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20 73 69 7a 65  long nIn;.  size
1f7e0 5f 74 20 6e 52 65 61 64 3b 0a 20 20 63 68 61 72  _t nRead;.  char
1f7f0 20 2a 70 42 75 66 3b 0a 20 20 69 66 28 20 69 6e   *pBuf;.  if( in
1f800 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1f810 20 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c 20 53    fseek(in, 0, S
1f820 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 49 6e 20  EEK_END);.  nIn 
1f830 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20 20 72  = ftell(in);.  r
1f840 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20 70 42 75  ewind(in);.  pBu
1f850 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  f = sqlite3_mall
1f860 6f 63 36 34 28 20 6e 49 6e 2b 31 20 29 3b 0a 20  oc64( nIn+1 );. 
1f870 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 20   if( pBuf==0 ){ 
1f880 66 63 6c 6f 73 65 28 69 6e 29 3b 20 72 65 74 75  fclose(in); retu
1f890 72 6e 20 30 3b 20 7d 0a 20 20 6e 52 65 61 64 20  rn 0; }.  nRead 
1f8a0 3d 20 66 72 65 61 64 28 70 42 75 66 2c 20 6e 49  = fread(pBuf, nI
1f8b0 6e 2c 20 31 2c 20 69 6e 29 3b 0a 20 20 66 63 6c  n, 1, in);.  fcl
1f8c0 6f 73 65 28 69 6e 29 3b 0a 20 20 69 66 28 20 6e  ose(in);.  if( n
1f8d0 52 65 61 64 21 3d 31 20 29 7b 0a 20 20 20 20 73  Read!=1 ){.    s
1f8e0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 75 66  qlite3_free(pBuf
1f8f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1f900 0a 20 20 7d 0a 20 20 70 42 75 66 5b 6e 49 6e 5d  .  }.  pBuf[nIn]
1f910 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 6e 42 79   = 0;.  if( pnBy
1f920 74 65 20 29 20 2a 70 6e 42 79 74 65 20 3d 20 6e  te ) *pnByte = n
1f930 49 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75  In;.  return pBu
1f940 66 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  f;.}..#if define
1f950 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1f960 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 43  SESSION)./*.** C
1f970 6c 6f 73 65 20 61 20 73 69 6e 67 6c 65 20 4f 70  lose a single Op
1f980 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  enSession object
1f990 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
1f9a0 20 6f 66 20 69 74 73 20 61 73 73 6f 63 69 61 74   of its associat
1f9b0 65 64 0a 2a 2a 20 72 65 73 6f 75 72 63 65 73 2e  ed.** resources.
1f9c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1f9d0 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 4f 70  session_close(Op
1f9e0 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65 73 73  enSession *pSess
1f9f0 69 6f 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ion){.  int i;. 
1fa00 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
1fa10 64 65 6c 65 74 65 28 70 53 65 73 73 69 6f 6e 2d  delete(pSession-
1fa20 3e 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  >p);.  sqlite3_f
1fa30 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e  ree(pSession->zN
1fa40 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ame);.  for(i=0;
1fa50 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69   i<pSession->nFi
1fa60 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lter; i++){.    
1fa70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65  sqlite3_free(pSe
1fa80 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b  ssion->azFilter[
1fa90 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  i]);.  }.  sqlit
1faa0 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e  e3_free(pSession
1fab0 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20 20 6d  ->azFilter);.  m
1fac0 65 6d 73 65 74 28 70 53 65 73 73 69 6f 6e 2c 20  emset(pSession, 
1fad0 30 2c 20 73 69 7a 65 6f 66 28 4f 70 65 6e 53 65  0, sizeof(OpenSe
1fae0 73 73 69 6f 6e 29 29 3b 0a 7d 0a 23 65 6e 64 69  ssion));.}.#endi
1faf0 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  f../*.** Close a
1fb00 6c 6c 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f  ll OpenSession o
1fb10 62 6a 65 63 74 73 20 61 6e 64 20 72 65 6c 65 61  bjects and relea
1fb20 73 65 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65  se all associate
1fb30 64 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a  d resources..*/.
1fb40 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1fb50 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
1fb60 4e 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  N).static void s
1fb70 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c  ession_close_all
1fb80 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
1fb90 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1fba0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69  i=0; i<p->nSessi
1fbb0 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 65  on; i++){.    se
1fbc0 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 26 70 2d 3e  ssion_close(&p->
1fbd0 61 53 65 73 73 69 6f 6e 5b 69 5d 29 3b 0a 20 20  aSession[i]);.  
1fbe0 7d 0a 20 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20  }.  p->nSession 
1fbf0 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  = 0;.}.#else.# d
1fc00 65 66 69 6e 65 20 73 65 73 73 69 6f 6e 5f 63 6c  efine session_cl
1fc10 6f 73 65 5f 61 6c 6c 28 58 29 0a 23 65 6e 64 69  ose_all(X).#endi
1fc20 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  f../*.** Impleme
1fc30 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78  ntation of the x
1fc40 46 69 6c 74 65 72 20 66 75 6e 63 74 69 6f 6e 20  Filter function 
1fc50 66 6f 72 20 61 6e 20 6f 70 65 6e 20 73 65 73 73  for an open sess
1fc60 69 6f 6e 2e 20 20 4f 6d 69 74 0a 2a 2a 20 61 6e  ion.  Omit.** an
1fc70 79 20 74 61 62 6c 65 73 20 6e 61 6d 65 64 20 62  y tables named b
1fc80 79 20 22 2e 73 65 73 73 69 6f 6e 20 66 69 6c 74  y ".session filt
1fc90 65 72 22 20 62 75 74 20 6c 65 74 20 61 6c 6c 20  er" but let all 
1fca0 6f 74 68 65 72 20 74 61 62 6c 65 20 74 68 72 6f  other table thro
1fcb0 75 67 68 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ugh..*/.#if defi
1fcc0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1fcd0 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61 74 69  E_SESSION).stati
1fce0 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 5f 66 69  c int session_fi
1fcf0 6c 74 65 72 28 76 6f 69 64 20 2a 70 43 74 78 2c  lter(void *pCtx,
1fd00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1fd10 62 29 7b 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f  b){.  OpenSessio
1fd20 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20 28 4f  n *pSession = (O
1fd30 70 65 6e 53 65 73 73 69 6f 6e 2a 29 70 43 74 78  penSession*)pCtx
1fd40 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
1fd50 28 69 3d 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e  (i=0; i<pSession
1fd60 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b  ->nFilter; i++){
1fd70 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1fd80 5f 73 74 72 67 6c 6f 62 28 70 53 65 73 73 69 6f  _strglob(pSessio
1fd90 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 2c 20  n->azFilter[i], 
1fda0 7a 54 61 62 29 3d 3d 30 20 29 20 72 65 74 75 72  zTab)==0 ) retur
1fdb0 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
1fdc0 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 1;.}.#endif../
1fdd0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65 64 75  *.** Try to dedu
1fde0 63 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 66  ce the type of f
1fdf0 69 6c 65 20 66 6f 72 20 7a 4e 61 6d 65 20 62 61  ile for zName ba
1fe00 73 65 64 20 6f 6e 20 69 74 73 20 63 6f 6e 74 65  sed on its conte
1fe10 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 6f  nt.  Return.** o
1fe20 6e 65 20 6f 66 20 74 68 65 20 53 48 45 4c 4c 5f  ne of the SHELL_
1fe30 4f 50 45 4e 5f 2a 20 63 6f 6e 73 74 61 6e 74 73  OPEN_* constants
1fe40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
1fe50 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
1fe60 73 74 20 6f 72 20 69 73 20 65 6d 70 74 79 20 62  st or is empty b
1fe70 75 74 20 69 74 73 20 6e 61 6d 65 20 6c 6f 6f 6b  ut its name look
1fe80 73 20 6c 69 6b 65 20 61 20 5a 49 50 0a 2a 2a 20  s like a ZIP.** 
1fe90 61 72 63 68 69 76 65 20 61 6e 64 20 74 68 65 20  archive and the 
1fea0 64 66 6c 74 5a 69 70 20 66 6c 61 67 20 69 73 20  dfltZip flag is 
1feb0 74 72 75 65 2c 20 74 68 65 6e 20 61 73 73 75 6d  true, then assum
1fec0 65 20 69 74 20 69 73 20 61 20 5a 49 50 20 61 72  e it is a ZIP ar
1fed0 63 68 69 76 65 2e 0a 2a 2a 20 4f 74 68 65 72 77  chive..** Otherw
1fee0 69 73 65 2c 20 61 73 73 75 6d 65 20 61 6e 20 6f  ise, assume an o
1fef0 72 64 69 6e 61 72 79 20 64 61 74 61 62 61 73 65  rdinary database
1ff00 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
1ff10 68 65 20 66 69 6c 65 6e 61 6d 65 20 69 66 0a 2a  he filename if.*
1ff20 2a 20 74 68 65 20 74 79 70 65 20 63 61 6e 6e 6f  * the type canno
1ff30 74 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20  t be determined 
1ff40 66 72 6f 6d 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f  from content..*/
1ff50 0a 69 6e 74 20 64 65 64 75 63 65 44 61 74 61 62  .int deduceDatab
1ff60 61 73 65 54 79 70 65 28 63 6f 6e 73 74 20 63 68  aseType(const ch
1ff70 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 64  ar *zName, int d
1ff80 66 6c 74 5a 69 70 29 7b 0a 20 20 46 49 4c 45 20  fltZip){.  FILE 
1ff90 2a 66 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65  *f = fopen(zName
1ffa0 2c 20 22 72 62 22 29 3b 0a 20 20 73 69 7a 65 5f  , "rb");.  size_
1ffb0 74 20 6e 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t n;.  int rc = 
1ffc0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45  SHELL_OPEN_UNSPE
1ffd0 43 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  C;.  char zBuf[1
1ffe0 30 30 5d 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20  00];.  if( f==0 
1fff0 29 7b 0a 20 20 20 20 69 66 28 20 64 66 6c 74 5a  ){.    if( dfltZ
20000 69 70 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  ip && sqlite3_st
20010 72 6c 69 6b 65 28 22 25 2e 7a 69 70 22 2c 7a 4e  rlike("%.zip",zN
20020 61 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ame,0)==0 ){.   
20030 20 20 20 20 72 65 74 75 72 6e 20 53 48 45 4c 4c      return SHELL
20040 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20  _OPEN_ZIPFILE;. 
20050 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20060 20 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50   return SHELL_OP
20070 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d  EN_NORMAL;.    }
20080 0a 20 20 7d 0a 20 20 6e 20 3d 20 66 72 65 61 64  .  }.  n = fread
20090 28 7a 42 75 66 2c 20 31 36 2c 20 31 2c 20 66 29  (zBuf, 16, 1, f)
200a0 3b 0a 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20  ;.  if( n==1 && 
200b0 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 22 53 51  memcmp(zBuf, "SQ
200c0 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 22 2c 20  Lite format 3", 
200d0 31 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 63  16)==0 ){.    fc
200e0 6c 6f 73 65 28 66 29 3b 0a 20 20 20 20 72 65 74  lose(f);.    ret
200f0 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e  urn SHELL_OPEN_N
20100 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 66 73 65  ORMAL;.  }.  fse
20110 65 6b 28 66 2c 20 2d 32 35 2c 20 53 45 45 4b 5f  ek(f, -25, SEEK_
20120 45 4e 44 29 3b 0a 20 20 6e 20 3d 20 66 72 65 61  END);.  n = frea
20130 64 28 7a 42 75 66 2c 20 32 35 2c 20 31 2c 20 66  d(zBuf, 25, 1, f
20140 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31 20 26 26  );.  if( n==1 &&
20150 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 22 53   memcmp(zBuf, "S
20160 74 61 72 74 2d 4f 66 2d 53 51 4c 69 74 65 33 2d  tart-Of-SQLite3-
20170 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 17)==0 ){.   
20180 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e   rc = SHELL_OPEN
20190 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20 7d 65  _APPENDVFS;.  }e
201a0 6c 73 65 7b 0a 20 20 20 20 66 73 65 65 6b 28 66  lse{.    fseek(f
201b0 2c 20 2d 32 32 2c 20 53 45 45 4b 5f 45 4e 44 29  , -22, SEEK_END)
201c0 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61 64 28  ;.    n = fread(
201d0 7a 42 75 66 2c 20 32 32 2c 20 31 2c 20 66 29 3b  zBuf, 22, 1, f);
201e0 0a 20 20 20 20 69 66 28 20 6e 3d 3d 31 20 26 26  .    if( n==1 &&
201f0 20 7a 42 75 66 5b 30 5d 3d 3d 30 78 35 30 20 26   zBuf[0]==0x50 &
20200 26 20 7a 42 75 66 5b 31 5d 3d 3d 30 78 34 62 20  & zBuf[1]==0x4b 
20210 26 26 20 7a 42 75 66 5b 32 5d 3d 3d 30 78 30 35  && zBuf[2]==0x05
20220 0a 20 20 20 20 20 20 20 26 26 20 7a 42 75 66 5b  .       && zBuf[
20230 33 5d 3d 3d 30 78 30 36 20 29 7b 0a 20 20 20 20  3]==0x06 ){.    
20240 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45    rc = SHELL_OPE
20250 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d  N_ZIPFILE;.    }
20260 65 6c 73 65 20 69 66 28 20 6e 3d 3d 30 20 26 26  else if( n==0 &&
20270 20 64 66 6c 74 5a 69 70 20 26 26 20 73 71 6c 69   dfltZip && sqli
20280 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 25 2e 7a  te3_strlike("%.z
20290 69 70 22 2c 7a 4e 61 6d 65 2c 30 29 3d 3d 30 20  ip",zName,0)==0 
202a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 48  ){.      rc = SH
202b0 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45  ELL_OPEN_ZIPFILE
202c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63  ;.    }.  }.  fc
202d0 6c 6f 73 65 28 66 29 3b 0a 20 20 72 65 74 75 72  lose(f);.  retur
202e0 6e 20 72 63 3b 20 20 0a 7d 0a 0a 23 69 66 64 65  n rc;  .}..#ifde
202f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
20300 44 45 53 45 52 49 41 4c 49 5a 45 0a 2f 2a 0a 2a  DESERIALIZE./*.*
20310 2a 20 52 65 63 6f 6e 73 74 72 75 63 74 20 61 6e  * Reconstruct an
20320 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
20330 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 6f 75  ase using the ou
20340 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20 22 64  tput from the "d
20350 62 74 6f 74 78 74 22 0a 2a 2a 20 70 72 6f 67 72  btotxt".** progr
20360 61 6d 2e 20 20 52 65 61 64 20 63 6f 6e 74 65 6e  am.  Read conten
20370 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  t from the file 
20380 69 6e 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  in p->zDbFilenam
20390 65 2e 20 20 49 66 20 70 2d 3e 7a 44 62 46 69 6c  e.  If p->zDbFil
203a0 65 6e 61 6d 65 0a 2a 2a 20 69 73 20 30 2c 20 74  ename.** is 0, t
203b0 68 65 6e 20 72 65 61 64 20 66 72 6f 6d 20 73 74  hen read from st
203c0 61 6e 64 61 72 64 20 69 6e 70 75 74 2e 0a 2a 2f  andard input..*/
203d0 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
203e0 20 63 68 61 72 20 2a 72 65 61 64 48 65 78 44 62   char *readHexDb
203f0 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
20400 69 6e 74 20 2a 70 6e 44 61 74 61 29 7b 0a 20 20  int *pnData){.  
20410 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
20420 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e   = 0;.  int nLin
20430 65 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  e;.  int n = 0;.
20440 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 30 3b 0a    int pgsz = 0;.
20450 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20    int iOffset = 
20460 30 3b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20  0;.  int j, k;. 
20470 20 69 6e 74 20 72 63 3b 0a 20 20 46 49 4c 45 20   int rc;.  FILE 
20480 2a 69 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  *in;.  unsigned 
20490 63 68 61 72 20 78 5b 31 36 5d 3b 0a 20 20 63 68  char x[16];.  ch
204a0 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30 5d 3b 0a  ar zLine[1000];.
204b0 20 20 69 66 28 20 70 2d 3e 7a 44 62 46 69 6c 65    if( p->zDbFile
204c0 6e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 20 3d  name ){.    in =
204d0 20 66 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69 6c   fopen(p->zDbFil
204e0 65 6e 61 6d 65 2c 20 22 72 22 29 3b 0a 20 20 20  ename, "r");.   
204f0 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
20500 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
20510 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20  stderr, "cannot 
20520 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72 20  open \"%s\" for 
20530 72 65 61 64 69 6e 67 5c 6e 22 2c 20 70 2d 3e 7a  reading\n", p->z
20540 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  DbFilename);.   
20550 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
20560 20 7d 0a 20 20 20 20 6e 4c 69 6e 65 20 3d 20 30   }.    nLine = 0
20570 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
20580 6e 20 3d 20 70 2d 3e 69 6e 3b 0a 20 20 20 20 6e  n = p->in;.    n
20590 4c 69 6e 65 20 3d 20 70 2d 3e 6c 69 6e 65 6e 6f  Line = p->lineno
205a0 3b 0a 20 20 7d 0a 20 20 2a 70 6e 44 61 74 61 20  ;.  }.  *pnData 
205b0 3d 20 30 3b 0a 20 20 6e 4c 69 6e 65 2b 2b 3b 0a  = 0;.  nLine++;.
205c0 20 20 69 66 28 20 66 67 65 74 73 28 7a 4c 69 6e    if( fgets(zLin
205d0 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  e, sizeof(zLine)
205e0 2c 20 69 6e 29 3d 3d 30 20 29 20 67 6f 74 6f 20  , in)==0 ) goto 
205f0 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f 72 3b  readHexDb_error;
20600 0a 20 20 72 63 20 3d 20 73 73 63 61 6e 66 28 7a  .  rc = sscanf(z
20610 4c 69 6e 65 2c 20 22 7c 20 73 69 7a 65 20 25 64  Line, "| size %d
20620 20 70 61 67 65 73 69 7a 65 20 25 64 22 2c 20 26   pagesize %d", &
20630 6e 2c 20 26 70 67 73 7a 29 3b 0a 20 20 69 66 28  n, &pgsz);.  if(
20640 20 72 63 21 3d 32 20 29 20 67 6f 74 6f 20 72 65   rc!=2 ) goto re
20650 61 64 48 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20  adHexDb_error;. 
20660 20 69 66 28 20 6e 3c 3d 30 20 29 20 67 6f 74 6f   if( n<=0 ) goto
20670 20 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f 72   readHexDb_error
20680 3b 0a 20 20 61 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  a = sqlite3_
20690 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 69  malloc( n );.  i
206a0 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 75  f( a==0 ){.    u
206b0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
206c0 72 2c 20 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72  r, "Out of memor
206d0 79 21 5c 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f  y!\n");.    goto
206e0 20 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f 72   readHexDb_error
206f0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 61  ;.  }.  memset(a
20700 2c 20 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 70  , 0, n);.  if( p
20710 67 73 7a 3c 35 31 32 20 7c 7c 20 70 67 73 7a 3e  gsz<512 || pgsz>
20720 36 35 35 33 36 20 7c 7c 20 28 70 67 73 7a 20 26  65536 || (pgsz &
20730 20 28 70 67 73 7a 2d 31 29 29 21 3d 30 20 29 7b   (pgsz-1))!=0 ){
20740 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
20750 28 73 74 64 65 72 72 2c 20 22 69 6e 76 61 6c 69  (stderr, "invali
20760 64 20 70 61 67 65 73 69 7a 65 5c 6e 22 29 3b 0a  d pagesize\n");.
20770 20 20 20 20 67 6f 74 6f 20 72 65 61 64 48 65 78      goto readHex
20780 44 62 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  Db_error;.  }.  
20790 66 6f 72 28 6e 4c 69 6e 65 2b 2b 3b 20 66 67 65  for(nLine++; fge
207a0 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66  ts(zLine, sizeof
207b0 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 21 3d 30 3b  (zLine), in)!=0;
207c0 20 6e 4c 69 6e 65 2b 2b 29 7b 0a 20 20 20 20 72   nLine++){.    r
207d0 63 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69 6e 65  c = sscanf(zLine
207e0 2c 20 22 7c 20 70 61 67 65 20 25 64 20 6f 66 66  , "| page %d off
207f0 73 65 74 20 25 64 22 2c 20 26 6a 2c 20 26 6b 29  set %d", &j, &k)
20800 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 32 20  ;.    if( rc==2 
20810 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 73 65 74  ){.      iOffset
20820 20 3d 20 6b 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = k;.      cont
20830 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
20840 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4c 69 6e  if( strncmp(zLin
20850 65 2c 20 22 7c 20 65 6e 64 20 22 2c 20 36 29 3d  e, "| end ", 6)=
20860 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  =0 ){.      brea
20870 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  k;.    }.    rc 
20880 3d 20 73 73 63 61 6e 66 28 7a 4c 69 6e 65 2c 22  = sscanf(zLine,"
20890 7c 20 25 64 3a 20 25 68 68 78 20 25 68 68 78 20  | %d: %hhx %hhx 
208a0 25 68 68 78 20 25 68 68 78 20 25 68 68 78 20 25  %hhx %hhx %hhx %
208b0 68 68 78 20 25 68 68 78 20 25 68 68 78 22 0a 20  hhx %hhx %hhx". 
208c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208d0 20 20 20 20 20 22 20 20 25 68 68 78 20 25 68 68       "  %hhx %hh
208e0 78 20 25 68 68 78 20 25 68 68 78 20 25 68 68 78  x %hhx %hhx %hhx
208f0 20 25 68 68 78 20 25 68 68 78 20 25 68 68 78 22   %hhx %hhx %hhx"
20900 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20910 20 20 26 6a 2c 20 26 78 5b 30 5d 2c 20 26 78 5b    &j, &x[0], &x[
20920 31 5d 2c 20 26 78 5b 32 5d 2c 20 26 78 5b 33 5d  1], &x[2], &x[3]
20930 2c 20 26 78 5b 34 5d 2c 20 26 78 5b 35 5d 2c 20  , &x[4], &x[5], 
20940 26 78 5b 36 5d 2c 20 26 78 5b 37 5d 2c 0a 20 20  &x[6], &x[7],.  
20950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 78                &x
20960 5b 38 5d 2c 20 26 78 5b 39 5d 2c 20 26 78 5b 31  [8], &x[9], &x[1
20970 30 5d 2c 20 26 78 5b 31 31 5d 2c 20 26 78 5b 31  0], &x[11], &x[1
20980 32 5d 2c 20 26 78 5b 31 33 5d 2c 20 26 78 5b 31  2], &x[13], &x[1
20990 34 5d 2c 20 26 78 5b 31 35 5d 29 3b 0a 20 20 20  4], &x[15]);.   
209a0 20 69 66 28 20 72 63 3d 3d 31 37 20 29 7b 0a 20   if( rc==17 ){. 
209b0 20 20 20 20 20 6b 20 3d 20 69 4f 66 66 73 65 74       k = iOffset
209c0 2b 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 2b  +j;.      if( k+
209d0 31 36 3c 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20  16<=n ){.       
209e0 20 6d 65 6d 63 70 79 28 61 2b 6b 2c 20 78 2c 20   memcpy(a+k, x, 
209f0 31 36 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  16);.      }.   
20a00 20 7d 0a 20 20 7d 0a 20 20 2a 70 6e 44 61 74 61   }.  }.  *pnData
20a10 20 3d 20 6e 3b 0a 20 20 69 66 28 20 69 6e 21 3d   = n;.  if( in!=
20a20 70 2d 3e 69 6e 20 29 7b 0a 20 20 20 20 66 63 6c  p->in ){.    fcl
20a30 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 65 6c 73 65  ose(in);.  }else
20a40 7b 0a 20 20 20 20 70 2d 3e 6c 69 6e 65 6e 6f 20  {.    p->lineno 
20a50 3d 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20 20 72  = nLine;.  }.  r
20a60 65 74 75 72 6e 20 61 3b 0a 0a 72 65 61 64 48 65  eturn a;..readHe
20a70 78 44 62 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28  xDb_error:.  if(
20a80 20 69 6e 21 3d 73 74 64 69 6e 20 29 7b 0a 20 20   in!=stdin ){.  
20a90 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
20aa0 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
20ab0 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73  ( fgets(zLine, s
20ac0 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 70 2d  izeof(zLine), p-
20ad0 3e 69 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  >in)!=0 ){.     
20ae0 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20   nLine++;.      
20af0 69 66 28 73 74 72 6e 63 6d 70 28 7a 4c 69 6e 65  if(strncmp(zLine
20b00 2c 20 22 7c 20 65 6e 64 20 22 2c 20 36 29 3d 3d  , "| end ", 6)==
20b10 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
20b20 0a 20 20 20 20 70 2d 3e 6c 69 6e 65 6e 6f 20 3d  .    p->lineno =
20b30 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20 20 73 71   nLine;.  }.  sq
20b40 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20  lite3_free(a);. 
20b50 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
20b60 65 72 72 2c 22 45 72 72 6f 72 20 6f 6e 20 6c 69  err,"Error on li
20b70 6e 65 20 25 64 20 6f 66 20 2d 2d 68 65 78 64 62  ne %d of --hexdb
20b80 20 69 6e 70 75 74 5c 6e 22 2c 20 6e 4c 69 6e 65   input\n", nLine
20b90 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
20ba0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
20bb0 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41  E_ENABLE_DESERIA
20bc0 4c 49 5a 45 20 2a 2f 0a 0a 2f 2a 20 46 6c 61 67  LIZE */../* Flag
20bd0 73 20 66 6f 72 20 6f 70 65 6e 5f 64 62 28 29 2e  s for open_db().
20be0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
20bf0 6c 74 20 62 65 68 61 76 69 6f 72 20 6f 66 20 6f  lt behavior of o
20c00 70 65 6e 5f 64 62 28 29 20 69 73 20 74 6f 20 65  pen_db() is to e
20c10 78 69 74 28 31 29 20 69 66 20 74 68 65 20 64 61  xit(1) if the da
20c20 74 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f 0a  tabase fails to.
20c30 2a 2a 20 6f 70 65 6e 2e 20 20 54 68 65 20 4f 50  ** open.  The OP
20c40 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45 20  EN_DB_KEEPALIVE 
20c50 66 6c 61 67 20 63 68 61 6e 67 65 73 20 74 68 61  flag changes tha
20c60 74 20 73 6f 20 74 68 61 74 20 69 74 20 70 72 69  t so that it pri
20c70 6e 74 73 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20  nts an error.** 
20c80 62 75 74 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  but still return
20c90 73 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e  s without callin
20ca0 67 20 65 78 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  g exit..**.** Th
20cb0 65 20 4f 50 45 4e 5f 44 42 5f 5a 49 50 46 49 4c  e OPEN_DB_ZIPFIL
20cc0 45 20 66 6c 61 67 20 63 61 75 73 65 73 20 6f 70  E flag causes op
20cd0 65 6e 5f 64 62 28 29 20 74 6f 20 70 72 65 66 65  en_db() to prefe
20ce0 72 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 73 20  r to open files 
20cf0 61 73 20 61 0a 2a 2a 20 5a 49 50 20 61 72 63 68  as a.** ZIP arch
20d00 69 76 65 20 69 66 20 74 68 65 20 66 69 6c 65 20  ive if the file 
20d10 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f  does not exist o
20d20 72 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20 69  r is empty and i
20d30 74 73 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 0a  ts name matches.
20d40 2a 2a 20 74 68 65 20 2a 2e 7a 69 70 20 70 61 74  ** the *.zip pat
20d50 74 65 72 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  tern..*/.#define
20d60 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49   OPEN_DB_KEEPALI
20d70 56 45 20 20 20 30 78 30 30 31 20 20 20 2f 2a 20  VE   0x001   /* 
20d80 52 65 74 75 72 6e 20 61 66 74 65 72 20 65 72 72  Return after err
20d90 6f 72 20 69 66 20 74 72 75 65 20 2a 2f 0a 23 64  or if true */.#d
20da0 65 66 69 6e 65 20 4f 50 45 4e 5f 44 42 5f 5a 49  efine OPEN_DB_ZI
20db0 50 46 49 4c 45 20 20 20 20 20 30 78 30 30 32 20  PFILE     0x002 
20dc0 20 20 2f 2a 20 4f 70 65 6e 20 61 73 20 5a 49 50    /* Open as ZIP
20dd0 20 69 66 20 6e 61 6d 65 20 6d 61 74 63 68 65 73   if name matches
20de0 20 2a 2e 7a 69 70 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   *.zip */../*.**
20df0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64   Make sure the d
20e00 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 2e  atabase is open.
20e10 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
20e20 74 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49  then open it.  I
20e30 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
20e40 65 20 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c  e fails to open,
20e50 20 70 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20   print an error 
20e60 6d 65 73 73 61 67 65 20 61 6e 64 20 65 78 69 74  message and exit
20e70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
20e80 20 6f 70 65 6e 5f 64 62 28 53 68 65 6c 6c 53 74   open_db(ShellSt
20e90 61 74 65 20 2a 70 2c 20 69 6e 74 20 6f 70 65 6e  ate *p, int open
20ea0 46 6c 61 67 73 29 7b 0a 20 20 69 66 28 20 70 2d  Flags){.  if( p-
20eb0 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  >db==0 ){.    if
20ec0 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53  ( p->openMode==S
20ed0 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43  HELL_OPEN_UNSPEC
20ee0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
20ef0 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  >zDbFilename==0 
20f00 7c 7c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  || p->zDbFilenam
20f10 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  e[0]==0 ){.     
20f20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d     p->openMode =
20f30 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d   SHELL_OPEN_NORM
20f40 41 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  AL;.      }else{
20f50 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e  .        p->open
20f60 4d 6f 64 65 20 3d 20 28 75 38 29 64 65 64 75 63  Mode = (u8)deduc
20f70 65 44 61 74 61 62 61 73 65 54 79 70 65 28 70 2d  eDatabaseType(p-
20f80 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  >zDbFilename, . 
20f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 70 65              (ope
20fb0 6e 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f 44 42  nFlags & OPEN_DB
20fc0 5f 5a 49 50 46 49 4c 45 29 21 3d 30 29 3b 0a 20  _ZIPFILE)!=0);. 
20fd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
20fe0 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 65 6e   switch( p->open
20ff0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61  Mode ){.      ca
21000 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50  se SHELL_OPEN_AP
21010 50 45 4e 44 56 46 53 3a 20 7b 0a 20 20 20 20 20  PENDVFS: {.     
21020 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f     sqlite3_open_
21030 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  v2(p->zDbFilenam
21040 65 2c 20 26 70 2d 3e 64 62 2c 20 0a 20 20 20 20  e, &p->db, .    
21050 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
21060 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
21070 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
21080 20 22 61 70 6e 64 76 66 73 22 29 3b 0a 20 20 20   "apndvfs");.   
21090 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
210a0 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53    }.      case S
210b0 48 45 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44 42 3a  HELL_OPEN_HEXDB:
210c0 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c  .      case SHEL
210d0 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c 49  L_OPEN_DESERIALI
210e0 5a 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  ZE: {.        sq
210f0 6c 69 74 65 33 5f 6f 70 65 6e 28 30 2c 20 26 70  lite3_open(0, &p
21100 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62  ->db);.        b
21110 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
21120 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f      case SHELL_O
21130 50 45 4e 5f 5a 49 50 46 49 4c 45 3a 20 7b 0a 20  PEN_ZIPFILE: {. 
21140 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f         sqlite3_o
21150 70 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20  pen(":memory:", 
21160 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  &p->db);.       
21170 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
21180 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c        case SHELL
21190 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3a 20  _OPEN_READONLY: 
211a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
211b0 33 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a 44 62  3_open_v2(p->zDb
211c0 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62  Filename, &p->db
211d0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  , SQLITE_OPEN_RE
211e0 41 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20  ADONLY, 0);.    
211f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
21200 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48   }.      case SH
21210 45 4c 4c 5f 4f 50 45 4e 5f 53 48 41 52 45 44 53  ELL_OPEN_SHAREDS
21220 43 48 45 4d 41 3a 20 7b 0a 20 20 20 20 20 20 20  CHEMA: {.       
21230 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
21240 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c  (p->zDbFilename,
21250 20 26 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20   &p->db,.       
21260 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
21270 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
21280 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49  OPEN_CREATE|SQLI
21290 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 5f 53  TE_OPEN_SHARED_S
212a0 43 48 45 4d 41 2c 30 29 3b 0a 20 20 20 20 20 20  CHEMA,0);.      
212b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
212c0 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c  .      case SHEL
212d0 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3a 0a 20  L_OPEN_UNSPEC:. 
212e0 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f       case SHELL_
212f0 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3a 20 7b 0a 20  OPEN_NORMAL: {. 
21300 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f         sqlite3_o
21310 70 65 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61  pen(p->zDbFilena
21320 6d 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20  me, &p->db);.   
21330 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21340 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 67 6c    }.    }.    gl
21350 6f 62 61 6c 44 62 20 3d 20 70 2d 3e 64 62 3b 0a  obalDb = p->db;.
21360 20 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30      if( p->db==0
21370 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73   || SQLITE_OK!=s
21380 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70  qlite3_errcode(p
21390 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 75  ->db) ){.      u
213a0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
213b0 72 2c 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c 65  r,"Error: unable
213c0 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
213d0 65 20 5c 22 25 73 5c 22 3a 20 25 73 5c 6e 22 2c  e \"%s\": %s\n",
213e0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 44  .          p->zD
213f0 62 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74  bFilename, sqlit
21400 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
21410 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 65  );.      if( ope
21420 6e 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f 44 42  nFlags & OPEN_DB
21430 5f 4b 45 45 50 41 4c 49 56 45 20 29 7b 0a 20 20  _KEEPALIVE ){.  
21440 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70        sqlite3_op
21450 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 26  en(":memory:", &
21460 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  p->db);.        
21470 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
21480 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
21490 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
214a0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
214b0 54 45 4e 53 49 4f 4e 0a 20 20 20 20 73 71 6c 69  TENSION.    sqli
214c0 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
214d0 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c  extension(p->db,
214e0 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   1);.#endif.    
214f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69  sqlite3_fileio_i
21500 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29  nit(p->db, 0, 0)
21510 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 68  ;.    sqlite3_sh
21520 61 74 68 72 65 65 5f 69 6e 69 74 28 70 2d 3e 64  athree_init(p->d
21530 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  b, 0, 0);.    sq
21540 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 69 6f 6e  lite3_completion
21550 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20  _init(p->db, 0, 
21560 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0);.#ifdef SQLIT
21570 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20  E_HAVE_ZLIB.    
21580 73 71 6c 69 74 65 33 5f 7a 69 70 66 69 6c 65 5f  sqlite3_zipfile_
21590 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30  init(p->db, 0, 0
215a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
215b0 71 6c 61 72 5f 69 6e 69 74 28 70 2d 3e 64 62 2c  qlar_init(p->db,
215c0 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
215d0 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
215e0 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
215f0 2c 20 22 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68  , "shell_add_sch
21600 65 6d 61 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f  ema", 3, SQLITE_
21610 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
21620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21630 20 20 20 20 20 73 68 65 6c 6c 41 64 64 53 63 68       shellAddSch
21640 65 6d 61 4e 61 6d 65 2c 20 30 2c 20 30 29 3b 0a  emaName, 0, 0);.
21650 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
21660 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64  te_function(p->d
21670 62 2c 20 22 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65  b, "shell_module
21680 5f 73 63 68 65 6d 61 22 2c 20 31 2c 20 53 51 4c  _schema", 1, SQL
21690 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
216a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216b0 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 4d 6f           shellMo
216c0 64 75 6c 65 53 63 68 65 6d 61 2c 20 30 2c 20 30  duleSchema, 0, 0
216d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
216e0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
216f0 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74  ->db, "shell_put
21700 73 6e 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  snl", 1, SQLITE_
21710 55 54 46 38 2c 20 70 2c 0a 20 20 20 20 20 20 20  UTF8, p,.       
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21730 20 20 20 20 20 73 68 65 6c 6c 50 75 74 73 46 75       shellPutsFu
21740 6e 63 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64  nc, 0, 0);.#ifnd
21750 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  ef SQLITE_NOHAVE
21760 5f 53 59 53 54 45 4d 0a 20 20 20 20 73 71 6c 69  _SYSTEM.    sqli
21770 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
21780 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 65 64 69 74  ion(p->db, "edit
21790 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
217a0 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217c0 20 20 65 64 69 74 46 75 6e 63 2c 20 30 2c 20 30    editFunc, 0, 0
217d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
217e0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
217f0 2d 3e 64 62 2c 20 22 65 64 69 74 22 2c 20 32 2c  ->db, "edit", 2,
21800 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
21810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69               edi
21830 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 23 65  tFunc, 0, 0);.#e
21840 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e  ndif.    if( p->
21850 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f  openMode==SHELL_
21860 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 20 29 7b 0a  OPEN_ZIPFILE ){.
21870 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c        char *zSql
21880 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
21890 74 66 28 0a 20 20 20 20 20 20 20 20 20 22 43 52  tf(.         "CR
218a0 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
218b0 4c 45 20 7a 69 70 20 55 53 49 4e 47 20 7a 69 70  LE zip USING zip
218c0 66 69 6c 65 28 25 51 29 3b 22 2c 20 70 2d 3e 7a  file(%Q);", p->z
218d0 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  DbFilename);.   
218e0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
218f0 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20  p->db, zSql, 0, 
21900 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
21910 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
21920 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
21930 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45  LITE_ENABLE_DESE
21940 52 49 41 4c 49 5a 45 0a 20 20 20 20 65 6c 73 65  RIALIZE.    else
21950 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e  .    if( p->open
21960 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Mode==SHELL_OPEN
21970 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 7c 7c 20  _DESERIALIZE || 
21980 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45  p->openMode==SHE
21990 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44 42 20 29 7b  LL_OPEN_HEXDB ){
219a0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
219b0 20 20 20 20 20 69 6e 74 20 6e 44 61 74 61 20 3d       int nData =
219c0 20 30 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e   0;.      unsign
219d0 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a  ed char *aData;.
219e0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65        if( p->ope
219f0 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45  nMode==SHELL_OPE
21a00 4e 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 29 7b  N_DESERIALIZE ){
21a10 0a 20 20 20 20 20 20 20 20 61 44 61 74 61 20 3d  .        aData =
21a20 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
21a30 29 72 65 61 64 46 69 6c 65 28 70 2d 3e 7a 44 62  )readFile(p->zDb
21a40 46 69 6c 65 6e 61 6d 65 2c 20 26 6e 44 61 74 61  Filename, &nData
21a50 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
21a60 20 20 20 20 20 20 20 20 61 44 61 74 61 20 3d 20          aData = 
21a70 72 65 61 64 48 65 78 44 62 28 70 2c 20 26 6e 44  readHexDb(p, &nD
21a80 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ata);.        if
21a90 28 20 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20  ( aData==0 ){.  
21aa0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
21ab0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
21ac0 6f 72 20 69 6e 20 68 65 78 64 62 20 69 6e 70 75  or in hexdb inpu
21ad0 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  t\n");.         
21ae0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
21af0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
21b00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65   rc = sqlite3_de
21b10 73 65 72 69 61 6c 69 7a 65 28 70 2d 3e 64 62 2c  serialize(p->db,
21b20 20 22 6d 61 69 6e 22 2c 20 61 44 61 74 61 2c 20   "main", aData, 
21b30 6e 44 61 74 61 2c 20 6e 44 61 74 61 2c 0a 20 20  nData, nData,.  
21b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b50 20 53 51 4c 49 54 45 5f 44 45 53 45 52 49 41 4c   SQLITE_DESERIAL
21b60 49 5a 45 5f 52 45 53 49 5a 45 41 42 4c 45 20 7c  IZE_RESIZEABLE |
21b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21b80 20 20 20 20 53 51 4c 49 54 45 5f 44 45 53 45 52      SQLITE_DESER
21b90 49 41 4c 49 5a 45 5f 46 52 45 45 4f 4e 43 4c 4f  IALIZE_FREEONCLO
21ba0 53 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  SE);.      if( r
21bb0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  c ){.        utf
21bc0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
21bd0 20 22 45 72 72 6f 72 3a 20 73 71 6c 69 74 65 33   "Error: sqlite3
21be0 5f 64 65 73 65 72 69 61 6c 69 7a 65 28 29 20 72  _deserialize() r
21bf0 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63  eturns %d\n", rc
21c00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21c10 20 69 66 28 20 70 2d 3e 73 7a 4d 61 78 3e 30 20   if( p->szMax>0 
21c20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
21c30 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
21c40 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53  p->db, "main", S
21c50 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
21c60 5f 4c 49 4d 49 54 2c 20 26 70 2d 3e 73 7a 4d 61  _LIMIT, &p->szMa
21c70 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
21c80 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
21c90 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
21ca0 20 63 6c 6f 73 65 20 74 68 65 20 64 61 74 61 62   close the datab
21cb0 61 65 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  aes connection. 
21cc0 20 52 65 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a   Report errors..
21cd0 2a 2f 0a 76 6f 69 64 20 63 6c 6f 73 65 5f 64 62  */.void close_db
21ce0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
21cf0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
21d00 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 69  3_close(db);.  i
21d10 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66  f( rc ){.    utf
21d20 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
21d30 20 22 45 72 72 6f 72 3a 20 73 71 6c 69 74 65 33   "Error: sqlite3
21d40 5f 63 6c 6f 73 65 28 29 20 72 65 74 75 72 6e 73  _close() returns
21d50 20 25 64 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20   %d: %s\n",.    
21d60 20 20 20 20 72 63 2c 20 73 71 6c 69 74 65 33 5f      rc, sqlite3_
21d70 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d  errmsg(db));.  }
21d80 20 0a 7d 0a 0a 23 69 66 20 48 41 56 45 5f 52 45   .}..#if HAVE_RE
21d90 41 44 4c 49 4e 45 20 7c 7c 20 48 41 56 45 5f 45  ADLINE || HAVE_E
21da0 44 49 54 4c 49 4e 45 0a 2f 2a 0a 2a 2a 20 52 65  DITLINE./*.** Re
21db0 61 64 6c 69 6e 65 20 63 6f 6d 70 6c 65 74 69 6f  adline completio
21dc0 6e 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2f 0a 73  n callbacks.*/.s
21dd0 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 61 64  tatic char *read
21de0 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f  line_completion_
21df0 67 65 6e 65 72 61 74 6f 72 28 63 6f 6e 73 74 20  generator(const 
21e00 63 68 61 72 20 2a 74 65 78 74 2c 20 69 6e 74 20  char *text, int 
21e10 73 74 61 74 65 29 7b 0a 20 20 73 74 61 74 69 63  state){.  static
21e20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
21e30 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
21e40 20 2a 7a 52 65 74 3b 0a 20 20 69 66 28 20 73 74   *zRet;.  if( st
21e50 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  ate==0 ){.    ch
21e60 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 73 71  ar *zSql;.    sq
21e70 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
21e80 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20  Stmt);.    zSql 
21e90 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
21ea0 66 28 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e  f("SELECT DISTIN
21eb0 43 54 20 63 61 6e 64 69 64 61 74 65 20 43 4f 4c  CT candidate COL
21ec0 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20 20 20  LATE nocase".   
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ee0 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20          "  FROM 
21ef0 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 29 20 4f  completion(%Q) O
21f00 52 44 45 52 20 42 59 20 31 22 2c 20 74 65 78 74  RDER BY 1", text
21f10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 70  );.    sqlite3_p
21f20 72 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c  repare_v2(global
21f30 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  Db, zSql, -1, &p
21f40 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
21f50 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
21f60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
21f70 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
21f80 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
21f90 20 20 20 7a 52 65 74 20 3d 20 73 74 72 64 75 70     zRet = strdup
21fa0 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71  ((const char*)sq
21fb0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
21fc0 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20  t(pStmt, 0));.  
21fd0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
21fe0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
21ff0 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20  t);.    pStmt = 
22000 30 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20 30 3b  0;.    zRet = 0;
22010 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
22020 65 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63 68 61  et;.}.static cha
22030 72 20 2a 2a 72 65 61 64 6c 69 6e 65 5f 63 6f 6d  r **readline_com
22040 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68  pletion(const ch
22050 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 69  ar *zText, int i
22060 53 74 61 72 74 2c 20 69 6e 74 20 69 45 6e 64 29  Start, int iEnd)
22070 7b 0a 20 20 72 6c 5f 61 74 74 65 6d 70 74 65 64  {.  rl_attempted
22080 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6f 76 65 72  _completion_over
22090 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 1;.  return r
220a0 6c 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6d 61 74  l_completion_mat
220b0 63 68 65 73 28 7a 54 65 78 74 2c 20 72 65 61 64  ches(zText, read
220c0 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f  line_completion_
220d0 67 65 6e 65 72 61 74 6f 72 29 3b 0a 7d 0a 0a 23  generator);.}..#
220e0 65 6c 69 66 20 48 41 56 45 5f 4c 49 4e 45 4e 4f  elif HAVE_LINENO
220f0 49 53 45 0a 2f 2a 0a 2a 2a 20 4c 69 6e 65 6e 6f  ISE./*.** Lineno
22100 69 73 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 63  ise completion c
22110 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74 61 74 69  allback.*/.stati
22120 63 20 76 6f 69 64 20 6c 69 6e 65 6e 6f 69 73 65  c void linenoise
22130 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73  _completion(cons
22140 74 20 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 6c  t char *zLine, l
22150 69 6e 65 6e 6f 69 73 65 43 6f 6d 70 6c 65 74 69  inenoiseCompleti
22160 6f 6e 73 20 2a 6c 63 29 7b 0a 20 20 69 6e 74 20  ons *lc){.  int 
22170 6e 4c 69 6e 65 20 3d 20 73 74 72 6c 65 6e 33 30  nLine = strlen30
22180 28 7a 4c 69 6e 65 29 3b 0a 20 20 69 6e 74 20 69  (zLine);.  int i
22190 2c 20 69 53 74 61 72 74 3b 0a 20 20 73 71 6c 69  , iStart;.  sqli
221a0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
221b0 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71  = 0;.  char *zSq
221c0 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  l;.  char zBuf[1
221d0 30 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6e 4c 69  000];..  if( nLi
221e0 6e 65 3e 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d  ne>sizeof(zBuf)-
221f0 33 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  30 ) return;.  i
22200 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27  f( zLine[0]=='.'
22210 20 7c 7c 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 23   || zLine[0]=='#
22220 27 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72  ') return;.  for
22230 28 69 3d 6e 4c 69 6e 65 2d 31 3b 20 69 3e 3d 30  (i=nLine-1; i>=0
22240 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 7a 4c 69   && (isalnum(zLi
22250 6e 65 5b 69 5d 29 20 7c 7c 20 7a 4c 69 6e 65 5b  ne[i]) || zLine[
22260 69 5d 3d 3d 27 5f 27 29 3b 20 69 2d 2d 29 7b 7d  i]=='_'); i--){}
22270 0a 20 20 69 66 28 20 69 3d 3d 6e 4c 69 6e 65 2d  .  if( i==nLine-
22280 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 53  1 ) return;.  iS
22290 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20 6d 65  tart = i+1;.  me
222a0 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65  mcpy(zBuf, zLine
222b0 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 7a 53 71  , iStart);.  zSq
222c0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
222d0 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49 53 54  ntf("SELECT DIST
222e0 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20 43  INCT candidate C
222f0 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20  OLLATE nocase". 
22300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22310 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20          "  FROM 
22320 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 2c 25 51  completion(%Q,%Q
22330 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c 0a 20  ) ORDER BY 1",. 
22340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22350 20 20 20 20 20 20 20 20 26 7a 4c 69 6e 65 5b 69          &zLine[i
22360 53 74 61 72 74 5d 2c 20 7a 4c 69 6e 65 29 3b 0a  Start], zLine);.
22370 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
22380 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a  e_v2(globalDb, z
22390 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
223a0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
223b0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 71 6c  ree(zSql);.  sql
223c0 69 74 65 33 5f 65 78 65 63 28 67 6c 6f 62 61 6c  ite3_exec(global
223d0 44 62 2c 20 22 50 52 41 47 4d 41 20 70 61 67 65  Db, "PRAGMA page
223e0 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 30 2c 20 30  _count", 0, 0, 0
223f0 29 3b 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 73  ); /* Load the s
22400 63 68 65 6d 61 20 2a 2f 0a 20 20 77 68 69 6c 65  chema */.  while
22410 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
22420 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
22430 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  W ){.    const c
22440 68 61 72 20 2a 7a 43 6f 6d 70 6c 65 74 69 6f 6e  har *zCompletion
22450 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
22460 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
22470 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  ext(pStmt, 0);. 
22480 20 20 20 69 6e 74 20 6e 43 6f 6d 70 6c 65 74 69     int nCompleti
22490 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  on = sqlite3_col
224a0 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
224b0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 53 74   0);.    if( iSt
224c0 61 72 74 2b 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20  art+nCompletion 
224d0 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31  < sizeof(zBuf)-1
224e0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
224f0 28 7a 42 75 66 2b 69 53 74 61 72 74 2c 20 7a 43  (zBuf+iStart, zC
22500 6f 6d 70 6c 65 74 69 6f 6e 2c 20 6e 43 6f 6d 70  ompletion, nComp
22510 6c 65 74 69 6f 6e 2b 31 29 3b 0a 20 20 20 20 20  letion+1);.     
22520 20 6c 69 6e 65 6e 6f 69 73 65 41 64 64 43 6f 6d   linenoiseAddCom
22530 70 6c 65 74 69 6f 6e 28 6c 63 2c 20 7a 42 75 66  pletion(lc, zBuf
22540 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
22550 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
22560 70 53 74 6d 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  pStmt);.}.#endif
22570 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d 6c 61 6e  ../*.** Do C-lan
22580 67 75 61 67 65 20 73 74 79 6c 65 20 64 65 71 75  guage style dequ
22590 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  oting..**.**    
225a0 5c 61 20 20 20 20 2d 3e 20 61 6c 61 72 6d 0a 2a  \a    -> alarm.*
225b0 2a 20 20 20 20 5c 62 20 20 20 20 2d 3e 20 62 61  *    \b    -> ba
225c0 63 6b 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c 74  ckspace.**    \t
225d0 20 20 20 20 2d 3e 20 74 61 62 0a 2a 2a 20 20 20      -> tab.**   
225e0 20 5c 6e 20 20 20 20 2d 3e 20 6e 65 77 6c 69 6e   \n    -> newlin
225f0 65 0a 2a 2a 20 20 20 20 5c 76 20 20 20 20 2d 3e  e.**    \v    ->
22600 20 76 65 72 74 69 63 61 6c 20 74 61 62 0a 2a 2a   vertical tab.**
22610 20 20 20 20 5c 66 20 20 20 20 2d 3e 20 66 6f 72      \f    -> for
22620 6d 20 66 65 65 64 0a 2a 2a 20 20 20 20 5c 72 20  m feed.**    \r 
22630 20 20 20 2d 3e 20 63 61 72 72 69 61 67 65 20 72     -> carriage r
22640 65 74 75 72 6e 0a 2a 2a 20 20 20 20 5c 73 20 20  eturn.**    \s  
22650 20 20 2d 3e 20 73 70 61 63 65 0a 2a 2a 20 20 20    -> space.**   
22660 20 5c 22 20 20 20 20 2d 3e 20 22 0a 2a 2a 20 20   \"    -> ".**  
22670 20 20 5c 27 20 20 20 20 2d 3e 20 27 0a 2a 2a 20    \'    -> '.** 
22680 20 20 20 5c 5c 20 20 20 20 2d 3e 20 62 61 63 6b     \\    -> back
22690 73 6c 61 73 68 0a 2a 2a 20 20 20 20 5c 4e 4e 4e  slash.**    \NNN
226a0 20 20 2d 3e 20 61 73 63 69 69 20 63 68 61 72 61    -> ascii chara
226b0 63 74 65 72 20 4e 4e 4e 20 69 6e 20 6f 63 74 61  cter NNN in octa
226c0 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  l.*/.static void
226d0 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
226e0 73 68 65 73 28 63 68 61 72 20 2a 7a 29 7b 0a 20  shes(char *z){. 
226f0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61   int i, j;.  cha
22700 72 20 63 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  r c;.  while( *z
22710 20 26 26 20 2a 7a 21 3d 27 5c 5c 27 20 29 20 7a   && *z!='\\' ) z
22720 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  ++;.  for(i=j=0;
22730 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20   (c = z[i])!=0; 
22740 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  i++, j++){.    i
22750 66 28 20 63 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b  f( c=='\\' && z[
22760 69 2b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20  i+1]!=0 ){.     
22770 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20   c = z[++i];.   
22780 20 20 20 69 66 28 20 63 3d 3d 27 61 27 20 29 7b     if( c=='a' ){
22790 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 61  .        c = '\a
227a0 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
227b0 66 28 20 63 3d 3d 27 62 27 20 29 7b 0a 20 20 20  f( c=='b' ){.   
227c0 20 20 20 20 20 63 20 3d 20 27 5c 62 27 3b 0a 20       c = '\b';. 
227d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
227e0 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20 20  =='t' ){.       
227f0 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20 20 20 20   c = '\t';.     
22800 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 6e   }else if( c=='n
22810 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
22820 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\n';.      }el
22830 73 65 20 69 66 28 20 63 3d 3d 27 76 27 20 29 7b  se if( c=='v' ){
22840 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 76  .        c = '\v
22850 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
22860 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20  f( c=='f' ){.   
22870 20 20 20 20 20 63 20 3d 20 27 5c 66 27 3b 0a 20       c = '\f';. 
22880 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
22890 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20 20 20  =='r' ){.       
228a0 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20 20 20   c = '\r';.     
228b0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22   }else if( c=='"
228c0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
228d0 20 27 22 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73   '"';.      }els
228e0 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b  e if( c=='\'' ){
228f0 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 27  .        c = '\'
22900 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
22910 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20  f( c=='\\' ){.  
22920 20 20 20 20 20 20 63 20 3d 20 27 5c 5c 27 3b 0a        c = '\\';.
22930 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
22940 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 37 27  c>='0' && c<='7'
22950 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 2d 3d   ){.        c -=
22960 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66   '0';.        if
22970 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26  ( z[i+1]>='0' &&
22980 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a   z[i+1]<='7' ){.
22990 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
229a0 20 20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c           c = (c<
229b0 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27  <3) + z[i] - '0'
229c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
229d0 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a  z[i+1]>='0' && z
229e0 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20  [i+1]<='7' ){.  
229f0 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
22a00 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 28             c = (
22a10 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27  c<<3) + z[i] - '
22a20 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0';.          }.
22a30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22a40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
22a50 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = c;.  }.  if( 
22a60 6a 3c 69 20 29 20 7a 5b 6a 5d 20 3d 20 30 3b 0a  j<i ) z[j] = 0;.
22a70 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  }../*.** Interpr
22a80 65 74 20 7a 41 72 67 20 61 73 20 65 69 74 68 65  et zArg as eithe
22a90 72 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  r an integer or 
22aa0 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e  a boolean value.
22ab0 20 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30 0a    Return 1 or 0.
22ac0 2a 2a 20 66 6f 72 20 54 52 55 45 20 61 6e 64 20  ** for TRUE and 
22ad0 46 41 4c 53 45 2e 20 20 52 65 74 75 72 6e 20 74  FALSE.  Return t
22ae0 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
22af0 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e   if appropriate.
22b00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
22b10 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 63 6f 6e 73  ooleanValue(cons
22b20 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20  t char *zArg){. 
22b30 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 41   int i;.  if( zA
22b40 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41  rg[0]=='0' && zA
22b50 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20  rg[1]=='x' ){.  
22b60 20 20 66 6f 72 28 69 3d 32 3b 20 68 65 78 44 69    for(i=2; hexDi
22b70 67 69 74 56 61 6c 75 65 28 7a 41 72 67 5b 69 5d  gitValue(zArg[i]
22b80 29 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d  )>=0; i++){}.  }
22b90 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
22ba0 30 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27 30 27 20  0; zArg[i]>='0' 
22bb0 26 26 20 7a 41 72 67 5b 69 5d 3c 3d 27 39 27 3b  && zArg[i]<='9';
22bc0 20 69 2b 2b 29 7b 7d 0a 20 20 7d 0a 20 20 69 66   i++){}.  }.  if
22bd0 28 20 69 3e 30 20 26 26 20 7a 41 72 67 5b 69 5d  ( i>0 && zArg[i]
22be0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28 69 6e  ==0 ) return (in
22bf0 74 29 28 69 6e 74 65 67 65 72 56 61 6c 75 65 28  t)(integerValue(
22c00 7a 41 72 67 29 20 26 20 30 78 66 66 66 66 66 66  zArg) & 0xffffff
22c10 66 66 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ff);.  if( sqlit
22c20 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c  e3_stricmp(zArg,
22c30 20 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20 73 71 6c   "on")==0 || sql
22c40 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
22c50 67 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a 20  g,"yes")==0 ){. 
22c60 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
22c70 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
22c80 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 66  tricmp(zArg, "of
22c90 66 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  f")==0 || sqlite
22ca0 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22  3_stricmp(zArg,"
22cb0 6e 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  no")==0 ){.    r
22cc0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 75  eturn 0;.  }.  u
22cd0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
22ce0 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 74 20 61  r, "ERROR: Not a
22cf0 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20   boolean value: 
22d00 5c 22 25 73 5c 22 2e 20 41 73 73 75 6d 69 6e 67  \"%s\". Assuming
22d10 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20 20 20   \"no\".\n",.   
22d20 20 20 20 20 20 20 20 7a 41 72 67 29 3b 0a 20 20         zArg);.  
22d30 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
22d40 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20  ** Set or clear 
22d50 61 20 73 68 65 6c 6c 20 66 6c 61 67 20 61 63 63  a shell flag acc
22d60 6f 72 64 69 6e 67 20 74 6f 20 61 20 62 6f 6f 6c  ording to a bool
22d70 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  ean value..*/.st
22d80 61 74 69 63 20 76 6f 69 64 20 73 65 74 4f 72 43  atic void setOrC
22d90 6c 65 61 72 46 6c 61 67 28 53 68 65 6c 6c 53 74  learFlag(ShellSt
22da0 61 74 65 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64  ate *p, unsigned
22db0 20 6d 46 6c 61 67 2c 20 63 6f 6e 73 74 20 63 68   mFlag, const ch
22dc0 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 66 28  ar *zArg){.  if(
22dd0 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 7a 41   booleanValue(zA
22de0 72 67 29 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  rg) ){.    Shell
22df0 53 65 74 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67  SetFlag(p, mFlag
22e00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
22e10 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70  ShellClearFlag(p
22e20 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 0a 7d 0a  , mFlag);.  }.}.
22e30 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
22e40 6f 75 74 70 75 74 20 66 69 6c 65 2c 20 61 73 73  output file, ass
22e50 75 6d 69 6e 67 20 69 74 20 69 73 20 6e 6f 74 20  uming it is not 
22e60 73 74 64 65 72 72 20 6f 72 20 73 74 64 6f 75 74  stderr or stdout
22e70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22e80 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73  output_file_clos
22e90 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 69 66  e(FILE *f){.  if
22ea0 28 20 66 20 26 26 20 66 21 3d 73 74 64 6f 75 74  ( f && f!=stdout
22eb0 20 26 26 20 66 21 3d 73 74 64 65 72 72 20 29 20   && f!=stderr ) 
22ec0 66 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a 2f 2a  fclose(f);.}../*
22ed0 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 70 65 6e 20  .** Try to open 
22ee0 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20  an output file. 
22ef0 20 20 54 68 65 20 6e 61 6d 65 73 20 22 73 74 64    The names "std
22f00 6f 75 74 22 20 61 6e 64 20 22 73 74 64 65 72 72  out" and "stderr
22f10 22 20 61 72 65 0a 2a 2a 20 72 65 63 6f 67 6e 69  " are.** recogni
22f20 7a 65 64 20 61 6e 64 20 64 6f 20 74 68 65 20 72  zed and do the r
22f30 69 67 68 74 20 74 68 69 6e 67 2e 20 20 4e 55 4c  ight thing.  NUL
22f40 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  L is returned if
22f50 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 66   the output.** f
22f60 69 6c 65 6e 61 6d 65 20 69 73 20 22 6f 66 66 22  ilename is "off"
22f70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 49 4c 45  ..*/.static FILE
22f80 20 2a 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70   *output_file_op
22f90 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
22fa0 46 69 6c 65 2c 20 69 6e 74 20 62 54 65 78 74 4d  File, int bTextM
22fb0 6f 64 65 29 7b 0a 20 20 46 49 4c 45 20 2a 66 3b  ode){.  FILE *f;
22fc0 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46  .  if( strcmp(zF
22fd0 69 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30  ile,"stdout")==0
22fe0 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 6f   ){.    f = stdo
22ff0 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ut;.  }else if( 
23000 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 73  strcmp(zFile, "s
23010 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20 20  tderr")==0 ){.  
23020 20 20 66 20 3d 20 73 74 64 65 72 72 3b 0a 20 20    f = stderr;.  
23030 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
23040 28 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29 3d 3d  (zFile, "off")==
23050 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 30 3b 0a  0 ){.    f = 0;.
23060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 20 3d    }else{.    f =
23070 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 62 54   fopen(zFile, bT
23080 65 78 74 4d 6f 64 65 20 3f 20 22 77 22 20 3a 20  extMode ? "w" : 
23090 22 77 62 22 29 3b 0a 20 20 20 20 69 66 28 20 66  "wb");.    if( f
230a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
230b0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
230c0 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
230d0 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
230e0 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zFile);.    }.  
230f0 7d 0a 20 20 72 65 74 75 72 6e 20 66 3b 0a 7d 0a  }.  return f;.}.
23100 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23110 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  OMIT_TRACE./*.**
23120 20 41 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 68   A routine for h
23130 61 6e 64 6c 69 6e 67 20 6f 75 74 70 75 74 20 66  andling output f
23140 72 6f 6d 20 73 71 6c 69 74 65 33 5f 74 72 61 63  rom sqlite3_trac
23150 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
23160 6e 74 20 73 71 6c 5f 74 72 61 63 65 5f 63 61 6c  nt sql_trace_cal
23170 6c 62 61 63 6b 28 0a 20 20 75 6e 73 69 67 6e 65  lback(.  unsigne
23180 64 20 6d 54 79 70 65 2c 20 20 20 20 20 20 20 20  d mType,        
23190 20 2f 2a 20 54 68 65 20 74 72 61 63 65 20 74 79   /* The trace ty
231a0 70 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  pe */.  void *pA
231b0 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
231c0 2f 2a 20 54 68 65 20 53 68 65 6c 6c 53 74 61 74  /* The ShellStat
231d0 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 76  e pointer */.  v
231e0 6f 69 64 20 2a 70 50 2c 20 20 20 20 20 20 20 20  oid *pP,        
231f0 20 20 20 20 20 20 20 2f 2a 20 55 73 75 61 6c 6c         /* Usuall
23200 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 73  y a pointer to s
23210 71 6c 69 74 65 5f 73 74 6d 74 20 2a 2f 0a 20 20  qlite_stmt */.  
23220 76 6f 69 64 20 2a 70 58 20 20 20 20 20 20 20 20  void *pX        
23230 20 20 20 20 20 20 20 20 2f 2a 20 41 75 78 69 6c          /* Auxil
23240 69 61 72 79 20 6f 75 74 70 75 74 20 2a 2f 0a 29  iary output */.)
23250 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  {.  ShellState *
23260 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a  p = (ShellState*
23270 29 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  )pArg;.  sqlite3
23280 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
23290 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
232a0 3b 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 0a 20 20  ;.  int nSql;.  
232b0 69 66 28 20 70 2d 3e 74 72 61 63 65 4f 75 74 3d  if( p->traceOut=
232c0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
232d0 20 69 66 28 20 6d 54 79 70 65 3d 3d 53 51 4c 49   if( mType==SQLI
232e0 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 20 29  TE_TRACE_CLOSE )
232f0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
23300 66 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20 22  f(p->traceOut, "
23310 2d 2d 20 63 6c 6f 73 69 6e 67 20 64 61 74 61 62  -- closing datab
23320 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 5c 6e  ase connection\n
23330 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ");.    return 0
23340 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 54 79 70  ;.  }.  if( mTyp
23350 65 21 3d 53 51 4c 49 54 45 5f 54 52 41 43 45 5f  e!=SQLITE_TRACE_
23360 52 4f 57 20 26 26 20 28 28 63 6f 6e 73 74 20 63  ROW && ((const c
23370 68 61 72 2a 29 70 58 29 5b 30 5d 3d 3d 27 2d 27  har*)pX)[0]=='-'
23380 20 29 7b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 28   ){.    zSql = (
23390 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 58 3b 0a  const char*)pX;.
233a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74    }else{.    pSt
233b0 6d 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74  mt = (sqlite3_st
233c0 6d 74 2a 29 70 50 3b 0a 20 20 20 20 73 77 69 74  mt*)pP;.    swit
233d0 63 68 28 20 70 2d 3e 65 54 72 61 63 65 54 79 70  ch( p->eTraceTyp
233e0 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
233f0 53 48 45 4c 4c 5f 54 52 41 43 45 5f 45 58 50 41  SHELL_TRACE_EXPA
23400 4e 44 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  NDED: {.        
23410 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65  zSql = sqlite3_e
23420 78 70 61 6e 64 65 64 5f 73 71 6c 28 70 53 74 6d  xpanded_sql(pStm
23430 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
23440 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65  k;.      }.#ifde
23450 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
23460 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 20 20 20 20  NORMALIZE.      
23470 63 61 73 65 20 53 48 45 4c 4c 5f 54 52 41 43 45  case SHELL_TRACE
23480 5f 4e 4f 52 4d 41 4c 49 5a 45 44 3a 20 7b 0a 20  _NORMALIZED: {. 
23490 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71         zSql = sq
234a0 6c 69 74 65 33 5f 6e 6f 72 6d 61 6c 69 7a 65 64  lite3_normalized
234b0 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20  _sql(pStmt);.   
234c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
234d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
234e0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
234f0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
23500 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20  e3_sql(pStmt);. 
23510 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
23520 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
23530 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
23540 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 53 71 6c  return 0;.  nSql
23550 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c   = strlen30(zSql
23560 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 71 6c  );.  while( nSql
23570 3e 30 20 26 26 20 7a 53 71 6c 5b 6e 53 71 6c 2d  >0 && zSql[nSql-
23580 31 5d 3d 3d 27 3b 27 20 29 7b 20 6e 53 71 6c 2d  1]==';' ){ nSql-
23590 2d 3b 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6d  -; }.  switch( m
235a0 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  Type ){.    case
235b0 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f   SQLITE_TRACE_RO
235c0 57 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  W:.    case SQLI
235d0 54 45 5f 54 52 41 43 45 5f 53 54 4d 54 3a 20 7b  TE_TRACE_STMT: {
235e0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
235f0 74 66 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20  tf(p->traceOut, 
23600 22 25 2e 2a 73 3b 5c 6e 22 2c 20 6e 53 71 6c 2c  "%.*s;\n", nSql,
23610 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 62 72   zSql);.      br
23620 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
23630 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 43 45  ase SQLITE_TRACE
23640 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20  _PROFILE: {.    
23650 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
23660 6e 4e 61 6e 6f 73 65 63 20 3d 20 2a 28 73 71 6c  nNanosec = *(sql
23670 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 58 3b 0a  ite3_int64*)pX;.
23680 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
23690 66 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20 22  f(p->traceOut, "
236a0 25 2e 2a 73 3b 20 2d 2d 20 25 6c 6c 64 20 6e 73  %.*s; -- %lld ns
236b0 5c 6e 22 2c 20 6e 53 71 6c 2c 20 7a 53 71 6c 2c  \n", nSql, zSql,
236c0 20 6e 4e 61 6e 6f 73 65 63 29 3b 0a 20 20 20 20   nNanosec);.    
236d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
236e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
236f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
23700 20 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74   no-op routine t
23710 68 61 74 20 72 75 6e 73 20 77 69 74 68 20 74 68  hat runs with th
23720 65 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20  e ".breakpoint" 
23730 64 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68  doc-command.  Th
23740 69 73 20 69 73 0a 2a 2a 20 61 20 75 73 65 66 75  is is.** a usefu
23750 6c 20 73 70 6f 74 20 74 6f 20 73 65 74 20 61 20  l spot to set a 
23760 64 65 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f  debugger breakpo
23770 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  int..*/.static v
23780 6f 69 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f  oid test_breakpo
23790 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  int(void){.  sta
237a0 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20  tic int nCall = 
237b0 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a  0;.  nCall++;.}.
237c0 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74  ./*.** An object
237d0 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 61 20   used to read a 
237e0 43 53 56 20 61 6e 64 20 6f 74 68 65 72 20 66 69  CSV and other fi
237f0 6c 65 73 20 66 6f 72 20 69 6d 70 6f 72 74 2e 0a  les for import..
23800 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
23810 74 20 49 6d 70 6f 72 74 43 74 78 20 49 6d 70 6f  t ImportCtx Impo
23820 72 74 43 74 78 3b 0a 73 74 72 75 63 74 20 49 6d  rtCtx;.struct Im
23830 70 6f 72 74 43 74 78 20 7b 0a 20 20 63 6f 6e 73  portCtx {.  cons
23840 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20  t char *zFile;  
23850 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
23860 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 46  nput file */.  F
23870 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20  ILE *in;        
23880 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 43     /* Read the C
23890 53 56 20 74 65 78 74 20 66 72 6f 6d 20 74 68 69  SV text from thi
238a0 73 20 69 6e 70 75 74 20 73 74 72 65 61 6d 20 2a  s input stream *
238b0 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
238c0 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63 75 6d          /* Accum
238d0 75 6c 61 74 65 64 20 74 65 78 74 20 66 6f 72 20  ulated text for 
238e0 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  a field */.  int
238f0 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
23900 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
23910 74 65 73 20 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e  tes in z */.  in
23920 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20  t nAlloc;       
23930 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63    /* Space alloc
23940 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a  ated for z[] */.
23950 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20    int nLine;    
23960 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
23970 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
23980 20 20 69 6e 74 20 62 4e 6f 74 46 69 72 73 74 3b    int bNotFirst;
23990 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
239a0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62 79 74   one or more byt
239b0 65 73 20 61 6c 72 65 61 64 79 20 72 65 61 64 20  es already read 
239c0 2a 2f 0a 20 20 69 6e 74 20 63 54 65 72 6d 3b 20  */.  int cTerm; 
239d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 72           /* Char
239e0 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d 69  acter that termi
239f0 6e 61 74 65 64 20 74 68 65 20 6d 6f 73 74 20 72  nated the most r
23a00 65 63 65 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20  ecent field */. 
23a10 20 69 6e 74 20 63 43 6f 6c 53 65 70 3b 20 20 20   int cColSep;   
23a20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75       /* The colu
23a30 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  mn separator cha
23a40 72 61 63 74 65 72 2e 20 20 28 55 73 75 61 6c 6c  racter.  (Usuall
23a50 79 20 22 2c 22 29 20 2a 2f 0a 20 20 69 6e 74 20  y ",") */.  int 
23a60 63 52 6f 77 53 65 70 3b 20 20 20 20 20 20 20 20  cRowSep;        
23a70 2f 2a 20 54 68 65 20 72 6f 77 20 73 65 70 61 72  /* The row separ
23a80 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 2e 20  ator character. 
23a90 20 28 55 73 75 61 6c 6c 79 20 22 5c 6e 22 29 20   (Usually "\n") 
23aa0 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64  */.};../* Append
23ab0 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74   a single byte t
23ac0 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74 69 63 20  o z[] */.static 
23ad0 76 6f 69 64 20 69 6d 70 6f 72 74 5f 61 70 70 65  void import_appe
23ae0 6e 64 5f 63 68 61 72 28 49 6d 70 6f 72 74 43 74  nd_char(ImportCt
23af0 78 20 2a 70 2c 20 69 6e 74 20 63 29 7b 0a 20 20  x *p, int c){.  
23b00 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e  if( p->n+1>=p->n
23b10 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e  Alloc ){.    p->
23b20 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c  nAlloc += p->nAl
23b30 6c 6f 63 20 2b 20 31 30 30 3b 0a 20 20 20 20 70  loc + 100;.    p
23b40 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  ->z = sqlite3_re
23b50 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c 20 70 2d  alloc64(p->z, p-
23b60 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66  >nAlloc);.    if
23b70 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73 68 65 6c  ( p->z==0 ) shel
23b80 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28  l_out_of_memory(
23b90 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a 5b 70 2d  );.  }.  p->z[p-
23ba0 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61 72 29 63 3b  >n++] = (char)c;
23bb0 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73 69  .}../* Read a si
23bc0 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66 20 43 53  ngle field of CS
23bd0 56 20 74 65 78 74 2e 20 20 43 6f 6d 70 61 74 69  V text.  Compati
23be0 62 6c 65 20 77 69 74 68 20 72 66 63 34 31 38 30  ble with rfc4180
23bf0 20 61 6e 64 20 65 78 74 65 6e 64 65 64 0a 2a 2a   and extended.**
23c00 20 77 69 74 68 20 74 68 65 20 6f 70 74 69 6f 6e   with the option
23c10 20 6f 66 20 68 61 76 69 6e 67 20 61 20 73 65 70   of having a sep
23c20 61 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61  arator other tha
23c30 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b  n ","..**.**   +
23c40 20 20 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72    Input comes fr
23c50 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b  om p->in..**   +
23c60 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
23c70 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74  in p->z of lengt
23c80 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74  h p->n.  Space t
23c90 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65  o hold p->z come
23ca0 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73  s.**      from s
23cb0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
23cc0 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70  )..**   +  Use p
23cd0 2d 3e 63 53 65 70 20 61 73 20 74 68 65 20 63 6f  ->cSep as the co
23ce0 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20  lumn separator. 
23cf0 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
23d00 22 2c 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65  ","..**   +  Use
23d10 20 70 2d 3e 72 53 65 70 20 61 73 20 74 68 65 20   p->rSep as the 
23d20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20  row separator.  
23d30 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22  The default is "
23d40 5c 6e 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65  \n"..**   +  Kee
23d50 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6c  p track of the l
23d60 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d  ine number in p-
23d70 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20  >nLine..**   +  
23d80 53 74 6f 72 65 20 74 68 65 20 63 68 61 72 61 63  Store the charac
23d90 74 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ter that termina
23da0 74 65 73 20 74 68 65 20 66 69 65 6c 64 20 69 6e  tes the field in
23db0 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72   p->cTerm.  Stor
23dc0 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e  e.**      EOF on
23dd0 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a   end-of-file..**
23de0 20 20 20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e     +  Report syn
23df0 74 61 78 20 65 72 72 6f 72 73 20 6f 6e 20 73 74  tax errors on st
23e00 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63  derr.*/.static c
23e10 68 61 72 20 2a 53 51 4c 49 54 45 5f 43 44 45 43  har *SQLITE_CDEC
23e20 4c 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66  L csv_read_one_f
23e30 69 65 6c 64 28 49 6d 70 6f 72 74 43 74 78 20 2a  ield(ImportCtx *
23e40 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69  p){.  int c;.  i
23e50 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f  nt cSep = p->cCo
23e60 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72 53 65 70  lSep;.  int rSep
23e70 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20   = p->cRowSep;. 
23e80 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d   p->n = 0;.  c =
23e90 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20   fgetc(p->in);. 
23ea0 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73   if( c==EOF || s
23eb0 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b 0a  eenInterrupt ){.
23ec0 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45      p->cTerm = E
23ed0 4f 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  OF;.    return 0
23ee0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 27  ;.  }.  if( c=='
23ef0 22 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 63  "' ){.    int pc
23f00 2c 20 70 70 63 3b 0a 20 20 20 20 69 6e 74 20 73  , ppc;.    int s
23f10 74 61 72 74 4c 69 6e 65 20 3d 20 70 2d 3e 6e 4c  tartLine = p->nL
23f20 69 6e 65 3b 0a 20 20 20 20 69 6e 74 20 63 51 75  ine;.    int cQu
23f30 6f 74 65 20 3d 20 63 3b 0a 20 20 20 20 70 63 20  ote = c;.    pc 
23f40 3d 20 70 70 63 20 3d 20 30 3b 0a 20 20 20 20 77  = ppc = 0;.    w
23f50 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20  hile( 1 ){.     
23f60 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
23f70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  );.      if( c==
23f80 72 53 65 70 20 29 20 70 2d 3e 6e 4c 69 6e 65 2b  rSep ) p->nLine+
23f90 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  +;.      if( c==
23fa0 63 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20  cQuote ){.      
23fb0 20 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65    if( pc==cQuote
23fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63   ){.          pc
23fd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
23fe0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
23ff0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24000 20 20 69 66 28 20 28 63 3d 3d 63 53 65 70 20 26    if( (c==cSep &
24010 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20  & pc==cQuote).  
24020 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70       || (c==rSep
24030 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a   && pc==cQuote).
24040 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53         || (c==rS
24050 65 70 20 26 26 20 70 63 3d 3d 27 5c 72 27 20 26  ep && pc=='\r' &
24060 26 20 70 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20  & ppc==cQuote). 
24070 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 45 4f 46        || (c==EOF
24080 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a   && pc==cQuote).
24090 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
240a0 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d 77 68   do{ p->n--; }wh
240b0 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21  ile( p->z[p->n]!
240c0 3d 63 51 75 6f 74 65 20 29 3b 0a 20 20 20 20 20  =cQuote );.     
240d0 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b     p->cTerm = c;
240e0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
240f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
24100 28 20 70 63 3d 3d 63 51 75 6f 74 65 20 26 26 20  ( pc==cQuote && 
24110 63 21 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20  c!='\r' ){.     
24120 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
24130 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 75  tderr, "%s:%d: u
24140 6e 65 73 63 61 70 65 64 20 25 63 20 63 68 61 72  nescaped %c char
24150 61 63 74 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20  acter\n",.      
24160 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 69            p->zFi
24170 6c 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c 20 63 51  le, p->nLine, cQ
24180 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  uote);.      }. 
24190 20 20 20 20 20 69 66 28 20 63 3d 3d 45 4f 46 20       if( c==EOF 
241a0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
241b0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
241c0 25 73 3a 25 64 3a 20 75 6e 74 65 72 6d 69 6e 61  %s:%d: untermina
241d0 74 65 64 20 25 63 2d 71 75 6f 74 65 64 20 66 69  ted %c-quoted fi
241e0 65 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  eld\n",.        
241f0 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65          p->zFile
24200 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 63 51 75  , startLine, cQu
24210 6f 74 65 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  ote);.        p-
24220 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20  >cTerm = c;.    
24230 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
24240 20 7d 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f   }.      import_
24250 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
24260 29 3b 0a 20 20 20 20 20 20 70 70 63 20 3d 20 70  );.      ppc = p
24270 63 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 63 3b  c;.      pc = c;
24280 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
24290 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
242a0 73 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  s the first fiel
242b0 64 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 61  d being parsed a
242c0 6e 64 20 69 74 20 62 65 67 69 6e 73 20 77 69 74  nd it begins wit
242d0 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 55 54 46  h the.    ** UTF
242e0 2d 38 20 42 4f 4d 20 20 28 30 78 45 46 20 42 42  -8 BOM  (0xEF BB
242f0 20 42 46 29 20 74 68 65 6e 20 73 6b 69 70 20 74   BF) then skip t
24300 68 65 20 42 4f 4d 20 2a 2f 0a 20 20 20 20 69 66  he BOM */.    if
24310 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78 65 66  ( (c&0xff)==0xef
24320 20 26 26 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74   && p->bNotFirst
24330 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6d 70  ==0 ){.      imp
24340 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28  ort_append_char(
24350 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 63 20 3d  p, c);.      c =
24360 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20   fgetc(p->in);. 
24370 20 20 20 20 20 69 66 28 20 28 63 26 30 78 66 66       if( (c&0xff
24380 29 3d 3d 30 78 62 62 20 29 7b 0a 20 20 20 20 20  )==0xbb ){.     
24390 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64     import_append
243a0 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20  _char(p, c);.   
243b0 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70       c = fgetc(p
243c0 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  ->in);.        i
243d0 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78 62  f( (c&0xff)==0xb
243e0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  f ){.          p
243f0 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b  ->bNotFirst = 1;
24400 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 20  .          p->n 
24410 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
24420 65 74 75 72 6e 20 63 73 76 5f 72 65 61 64 5f 6f  eturn csv_read_o
24430 6e 65 5f 66 69 65 6c 64 28 70 29 3b 0a 20 20 20  ne_field(p);.   
24440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
24450 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
24460 63 21 3d 45 4f 46 20 26 26 20 63 21 3d 63 53 65  c!=EOF && c!=cSe
24470 70 20 26 26 20 63 21 3d 72 53 65 70 20 29 7b 0a  p && c!=rSep ){.
24480 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70        import_app
24490 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a  end_char(p, c);.
244a0 20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28        c = fgetc(
244b0 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  p->in);.    }.  
244c0 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29 7b    if( c==rSep ){
244d0 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b  .      p->nLine+
244e0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
244f0 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b 70 2d 3e 6e  n>0 && p->z[p->n
24500 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 70 2d 3e 6e  -1]=='\r' ) p->n
24510 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  --;.    }.    p-
24520 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 7d 0a  >cTerm = c;.  }.
24530 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e    if( p->z ) p->
24540 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 70  z[p->n] = 0;.  p
24550 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b  ->bNotFirst = 1;
24560 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a  .  return p->z;.
24570 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73 69 6e  }../* Read a sin
24580 67 6c 65 20 66 69 65 6c 64 20 6f 66 20 41 53 43  gle field of ASC
24590 49 49 20 64 65 6c 69 6d 69 74 65 64 20 74 65 78  II delimited tex
245a0 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e  t..**.**   +  In
245b0 70 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70  put comes from p
245c0 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74  ->in..**   +  St
245d0 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 70  ore results in p
245e0 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d  ->z of length p-
245f0 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  >n.  Space to ho
24600 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a  ld p->z comes.**
24610 20 20 20 20 20 20 66 72 6f 6d 20 73 71 6c 69 74        from sqlit
24620 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a  e3_malloc64()..*
24630 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 63 53  *   +  Use p->cS
24640 65 70 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e  ep as the column
24650 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65   separator.  The
24660 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c 78 31   default is "\x1
24670 46 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20  F"..**   +  Use 
24680 70 2d 3e 72 53 65 70 20 61 73 20 74 68 65 20 72  p->rSep as the r
24690 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54  ow separator.  T
246a0 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c  he default is "\
246b0 78 31 45 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65  x1E"..**   +  Ke
246c0 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ep track of the 
246d0 72 6f 77 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d  row number in p-
246e0 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20  >nLine..**   +  
246f0 53 74 6f 72 65 20 74 68 65 20 63 68 61 72 61 63  Store the charac
24700 74 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ter that termina
24710 74 65 73 20 74 68 65 20 66 69 65 6c 64 20 69 6e  tes the field in
24720 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72   p->cTerm.  Stor
24730 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e  e.**      EOF on
24740 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a   end-of-file..**
24750 20 20 20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e     +  Report syn
24760 74 61 78 20 65 72 72 6f 72 73 20 6f 6e 20 73 74  tax errors on st
24770 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63  derr.*/.static c
24780 68 61 72 20 2a 53 51 4c 49 54 45 5f 43 44 45 43  har *SQLITE_CDEC
24790 4c 20 61 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65  L ascii_read_one
247a0 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43 74 78  _field(ImportCtx
247b0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20   *p){.  int c;. 
247c0 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e 63   int cSep = p->c
247d0 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72 53  ColSep;.  int rS
247e0 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b  ep = p->cRowSep;
247f0 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63  .  p->n = 0;.  c
24800 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b   = fgetc(p->in);
24810 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c  .  if( c==EOF ||
24820 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29   seenInterrupt )
24830 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d  {.    p->cTerm =
24840 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 72 6e   EOF;.    return
24850 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   0;.  }.  while(
24860 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d 63 53   c!=EOF && c!=cS
24870 65 70 20 26 26 20 63 21 3d 72 53 65 70 20 29 7b  ep && c!=rSep ){
24880 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65  .    import_appe
24890 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20  nd_char(p, c);. 
248a0 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e     c = fgetc(p->
248b0 69 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  in);.  }.  if( c
248c0 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 70 2d  ==rSep ){.    p-
248d0 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 7d 0a 20 20  >nLine++;.  }.  
248e0 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20  p->cTerm = c;.  
248f0 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b  if( p->z ) p->z[
24900 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 72 65 74  p->n] = 0;.  ret
24910 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a  urn p->z;.}../*.
24920 2a 2a 20 54 72 79 20 74 6f 20 74 72 61 6e 73 66  ** Try to transf
24930 65 72 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c  er data for tabl
24940 65 20 7a 54 61 62 6c 65 2e 20 20 49 66 20 61 6e  e zTable.  If an
24950 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 77   error is seen w
24960 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e 67 20 66  hile.** moving f
24970 6f 72 77 61 72 64 2c 20 74 72 79 20 74 6f 20 67  orward, try to g
24980 6f 20 62 61 63 6b 77 61 72 64 73 2e 20 20 54 68  o backwards.  Th
24990 65 20 62 61 63 6b 77 61 72 64 73 20 6d 6f 76 65  e backwards move
249a0 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a 20 77 6f  ment won't.** wo
249b0 72 6b 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  rk for WITHOUT R
249c0 4f 57 49 44 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  OWID tables..*/.
249d0 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54  static void tryT
249e0 6f 43 6c 6f 6e 65 44 61 74 61 28 0a 20 20 53 68  oCloneData(.  Sh
249f0 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 73  ellState *p,.  s
24a00 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20  qlite3 *newDb,. 
24a10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
24a20 62 6c 65 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  ble.){.  sqlite3
24a30 5f 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20  _stmt *pQuery = 
24a40 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
24a50 74 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a  t *pInsert = 0;.
24a60 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20 3d    char *zQuery =
24a70 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 49 6e 73   0;.  char *zIns
24a80 65 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ert = 0;.  int r
24a90 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e  c;.  int i, j, n
24aa0 3b 0a 20 20 69 6e 74 20 6e 54 61 62 6c 65 20 3d  ;.  int nTable =
24ab0 20 73 74 72 6c 65 6e 33 30 28 7a 54 61 62 6c 65   strlen30(zTable
24ac0 29 3b 0a 20 20 69 6e 74 20 6b 20 3d 20 30 3b 0a  );.  int k = 0;.
24ad0 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
24ae0 20 63 6f 6e 73 74 20 69 6e 74 20 73 70 69 6e 52   const int spinR
24af0 61 74 65 20 3d 20 31 30 30 30 30 3b 0a 0a 20 20  ate = 10000;..  
24b00 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33  zQuery = sqlite3
24b10 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
24b20 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 22 2c   * FROM \"%w\"",
24b30 20 7a 54 61 62 6c 65 29 3b 0a 20 20 72 63 20 3d   zTable);.  rc =
24b40 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
24b50 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  _v2(p->db, zQuer
24b60 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20  y, -1, &pQuery, 
24b70 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
24b80 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
24b90 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25  stderr, "Error %
24ba0 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22  d: %s on [%s]\n"
24bb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ,.            sq
24bc0 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
24bd0 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73  rrcode(p->db), s
24be0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
24bf0 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20  >db),.          
24c00 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 67    zQuery);.    g
24c10 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78 66 65  oto end_data_xfe
24c20 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73 71 6c  r;.  }.  n = sql
24c30 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
24c40 74 28 70 51 75 65 72 79 29 3b 0a 20 20 7a 49 6e  t(pQuery);.  zIn
24c50 73 65 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  sert = sqlite3_m
24c60 61 6c 6c 6f 63 36 34 28 32 30 30 20 2b 20 6e 54  alloc64(200 + nT
24c70 61 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a 20 20 69  able + n*3);.  i
24c80 66 28 20 7a 49 6e 73 65 72 74 3d 3d 30 20 29 20  f( zInsert==0 ) 
24c90 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d  shell_out_of_mem
24ca0 6f 72 79 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  ory();.  sqlite3
24cb0 5f 73 6e 70 72 69 6e 74 66 28 32 30 30 2b 6e 54  _snprintf(200+nT
24cc0 61 62 6c 65 2c 7a 49 6e 73 65 72 74 2c 0a 20 20  able,zInsert,.  
24cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ce0 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f   "INSERT OR IGNO
24cf0 52 45 20 49 4e 54 4f 20 5c 22 25 73 5c 22 20 56  RE INTO \"%s\" V
24d00 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65  ALUES(?", zTable
24d10 29 3b 0a 20 20 69 20 3d 20 73 74 72 6c 65 6e 33  );.  i = strlen3
24d20 30 28 7a 49 6e 73 65 72 74 29 3b 0a 20 20 66 6f  0(zInsert);.  fo
24d30 72 28 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29  r(j=1; j<n; j++)
24d40 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 49 6e  {.    memcpy(zIn
24d50 73 65 72 74 2b 69 2c 20 22 2c 3f 22 2c 20 32 29  sert+i, ",?", 2)
24d60 3b 0a 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20  ;.    i += 2;.  
24d70 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65  }.  memcpy(zInse
24d80 72 74 2b 69 2c 20 22 29 3b 22 2c 20 33 29 3b 0a  rt+i, ");", 3);.
24d90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
24da0 72 65 70 61 72 65 5f 76 32 28 6e 65 77 44 62 2c  repare_v2(newDb,
24db0 20 7a 49 6e 73 65 72 74 2c 20 2d 31 2c 20 26 70   zInsert, -1, &p
24dc0 49 6e 73 65 72 74 2c 20 30 29 3b 0a 20 20 69 66  Insert, 0);.  if
24dd0 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38  ( rc ){.    utf8
24de0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
24df0 22 45 72 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e  "Error %d: %s on
24e00 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20   [%s]\n",.      
24e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
24e20 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 6e  tended_errcode(n
24e30 65 77 44 62 29 2c 20 73 71 6c 69 74 65 33 5f 65  ewDb), sqlite3_e
24e40 72 72 6d 73 67 28 6e 65 77 44 62 29 2c 0a 20 20  rrmsg(newDb),.  
24e50 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72 79            zQuery
24e60 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
24e70 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20  data_xfer;.  }. 
24e80 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b   for(k=0; k<2; k
24e90 2b 2b 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  ++){.    while( 
24ea0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  (rc = sqlite3_st
24eb0 65 70 28 70 51 75 65 72 79 29 29 3d 3d 53 51 4c  ep(pQuery))==SQL
24ec0 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
24ed0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
24ee0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 77 69  ++){.        swi
24ef0 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c  tch( sqlite3_col
24f00 75 6d 6e 5f 74 79 70 65 28 70 51 75 65 72 79 2c  umn_type(pQuery,
24f10 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   i) ){.         
24f20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
24f30 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L: {.           
24f40 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
24f50 6c 6c 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 29  ll(pInsert, i+1)
24f60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
24f70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
24f80 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
24f90 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
24fa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
24fb0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
24fc0 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73  (pInsert, i+1, s
24fd0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
24fe0 74 36 34 28 70 51 75 65 72 79 2c 69 29 29 3b 0a  t64(pQuery,i));.
24ff0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
25000 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
25010 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
25020 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  LITE_FLOAT: {.  
25030 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25040 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 49  3_bind_double(pI
25050 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69  nsert, i+1, sqli
25060 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
25070 65 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20  e(pQuery,i));.  
25080 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
25090 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
250a0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
250b0 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20  TE_TEXT: {.     
250c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
250d0 69 6e 64 5f 74 65 78 74 28 70 49 6e 73 65 72 74  ind_text(pInsert
250e0 2c 20 69 2b 31 2c 0a 20 20 20 20 20 20 20 20 20  , i+1,.         
250f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25100 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a      (const char*
25110 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
25120 74 65 78 74 28 70 51 75 65 72 79 2c 69 29 2c 0a  text(pQuery,i),.
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25140 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
25150 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
25160 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
25170 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
25180 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
25190 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
251a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
251b0 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49 6e 73  3_bind_blob(pIns
251c0 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65  ert, i+1, sqlite
251d0 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51  3_column_blob(pQ
251e0 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20  uery,i),.       
251f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25210 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
25220 75 6d 6e 5f 62 79 74 65 73 28 70 51 75 65 72 79  umn_bytes(pQuery
25230 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,i),.           
25240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25260 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
25270 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
25280 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
25290 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
252a0 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 20 2a 2f 0a  } /* End for */.
252b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
252c0 65 33 5f 73 74 65 70 28 70 49 6e 73 65 72 74 29  e3_step(pInsert)
252d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
252e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
252f0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26 26 20 72  =SQLITE_ROW && r
25300 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
25310 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
25320 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
25330 72 72 6f 72 20 25 64 3a 20 25 73 5c 6e 22 2c 20  rror %d: %s\n", 
25340 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
25350 5f 65 72 72 63 6f 64 65 28 6e 65 77 44 62 29 2c  _errcode(newDb),
25360 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25370 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25380 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b  _errmsg(newDb));
25390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
253a0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49 6e  qlite3_reset(pIn
253b0 73 65 72 74 29 3b 0a 20 20 20 20 20 20 63 6e 74  sert);.      cnt
253c0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63  ++;.      if( (c
253d0 6e 74 25 73 70 69 6e 52 61 74 65 29 3d 3d 30 20  nt%spinRate)==0 
253e0 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ){.        print
253f0 66 28 22 25 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c  f("%c\b", "|/-\\
25400 22 5b 28 63 6e 74 2f 73 70 69 6e 52 61 74 65 29  "[(cnt/spinRate)
25410 25 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 66  %4]);.        ff
25420 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
25430 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 45      }.    } /* E
25440 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20  nd while */.    
25450 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
25460 4f 4e 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ONE ) break;.   
25470 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
25480 65 28 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73  e(pQuery);.    s
25490 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65  qlite3_free(zQue
254a0 72 79 29 3b 0a 20 20 20 20 7a 51 75 65 72 79 20  ry);.    zQuery 
254b0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
254c0 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
254d0 20 5c 22 25 77 5c 22 20 4f 52 44 45 52 20 42 59   \"%w\" ORDER BY
254e0 20 72 6f 77 69 64 20 44 45 53 43 3b 22 2c 0a 20   rowid DESC;",. 
254f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25500 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
25510 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  le);.    rc = sq
25520 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
25530 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20  (p->db, zQuery, 
25540 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b  -1, &pQuery, 0);
25550 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
25560 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
25570 28 73 74 64 65 72 72 2c 20 22 57 61 72 6e 69 6e  (stderr, "Warnin
25580 67 3a 20 63 61 6e 6e 6f 74 20 73 74 65 70 20 5c  g: cannot step \
25590 22 25 73 5c 22 20 62 61 63 6b 77 61 72 64 73 22  "%s\" backwards"
255a0 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  , zTable);.     
255b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
255c0 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 28 6b 3d 30  } /* End for(k=0
255d0 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74  ...) */..end_dat
255e0 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65  a_xfer:.  sqlite
255f0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72  3_finalize(pQuer
25600 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  y);.  sqlite3_fi
25610 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72 74 29 3b  nalize(pInsert);
25620 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
25630 7a 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74  zQuery);.  sqlit
25640 65 33 5f 66 72 65 65 28 7a 49 6e 73 65 72 74 29  e3_free(zInsert)
25650 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  ;.}.../*.** Try 
25660 74 6f 20 74 72 61 6e 73 66 65 72 20 61 6c 6c 20  to transfer all 
25670 72 6f 77 73 20 6f 66 20 74 68 65 20 73 63 68 65  rows of the sche
25680 6d 61 20 74 68 61 74 20 6d 61 74 63 68 20 7a 57  ma that match zW
25690 68 65 72 65 2e 20 20 46 6f 72 0a 2a 2a 20 65 61  here.  For.** ea
256a0 63 68 20 72 6f 77 2c 20 69 6e 76 6f 6b 65 20 78  ch row, invoke x
256b0 46 6f 72 45 61 63 68 28 29 20 6f 6e 20 74 68 65  ForEach() on the
256c0 20 6f 62 6a 65 63 74 20 64 65 66 69 6e 65 64 20   object defined 
256d0 62 79 20 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20  by that row..** 
256e0 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  If an error is e
256f0 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65  ncountered while
25700 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61 72 64 20   moving forward 
25710 74 68 72 6f 75 67 68 20 74 68 65 0a 2a 2a 20 73  through the.** s
25720 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
25730 6c 65 2c 20 74 72 79 20 61 67 61 69 6e 20 6d 6f  le, try again mo
25740 76 69 6e 67 20 62 61 63 6b 77 61 72 64 73 2e 0a  ving backwards..
25750 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
25760 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28  ryToCloneSchema(
25770 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
25780 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77  ,.  sqlite3 *new
25790 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
257a0 20 2a 7a 57 68 65 72 65 2c 0a 20 20 76 6f 69 64   *zWhere,.  void
257b0 20 28 2a 78 46 6f 72 45 61 63 68 29 28 53 68 65   (*xForEach)(She
257c0 6c 6c 53 74 61 74 65 2a 2c 73 71 6c 69 74 65 33  llState*,sqlite3
257d0 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29  *,const char*).)
257e0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
257f0 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a 20 20   *pQuery = 0;.  
25800 63 68 61 72 20 2a 7a 51 75 65 72 79 20 3d 20 30  char *zQuery = 0
25810 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f  ;.  int rc;.  co
25820 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
25830 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  r *zName;.  cons
25840 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
25850 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a  *zSql;.  char *z
25860 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 7a  ErrMsg = 0;..  z
25870 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f  Query = sqlite3_
25880 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
25890 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73  name, sql FROM s
258a0 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20  qlite_master".  
258b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258c0 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
258d0 20 25 73 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20   %s", zWhere);. 
258e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
258f0 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
25900 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75  zQuery, -1, &pQu
25910 65 72 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ery, 0);.  if( r
25920 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  c ){.    utf8_pr
25930 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
25940 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f 6e 20  ror: (%d) %s on 
25950 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20  [%s]\n",.       
25960 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
25970 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
25980 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71  rcode(p->db), sq
25990 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
259a0 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  db),.           
259b0 20 20 20 20 20 20 20 20 20 7a 51 75 65 72 79 29           zQuery)
259c0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73  ;.    goto end_s
259d0 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20 7d 0a  chema_xfer;.  }.
259e0 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73    while( (rc = s
259f0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75 65  qlite3_step(pQue
25a00 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ry))==SQLITE_ROW
25a10 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
25a20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
25a30 65 78 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a  ext(pQuery, 0);.
25a40 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
25a50 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
25a60 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 70  Query, 1);.    p
25a70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20  rintf("%s... ", 
25a80 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68 28 73  zName); fflush(s
25a90 74 64 6f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  tdout);.    sqli
25aa0 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20  te3_exec(newDb, 
25ab0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53 71  (const char*)zSq
25ac0 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73  l, 0, 0, &zErrMs
25ad0 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72  g);.    if( zErr
25ae0 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66  Msg ){.      utf
25af0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
25b00 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c   "Error: %s\nSQL
25b10 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d  : [%s]\n", zErrM
25b20 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  sg, zSql);.     
25b30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
25b40 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 7a 45  rrMsg);.      zE
25b50 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d  rrMsg = 0;.    }
25b60 0a 20 20 20 20 69 66 28 20 78 46 6f 72 45 61 63  .    if( xForEac
25b70 68 20 29 7b 0a 20 20 20 20 20 20 78 46 6f 72 45  h ){.      xForE
25b80 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20 28 63  ach(p, newDb, (c
25b90 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65  onst char*)zName
25ba0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  );.    }.    pri
25bb0 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20  ntf("done\n");. 
25bc0 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
25bd0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
25be0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
25bf0 28 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71  (pQuery);.    sq
25c00 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72  lite3_free(zQuer
25c10 79 29 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d  y);.    zQuery =
25c20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
25c30 28 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73  ("SELECT name, s
25c40 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
25c50 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20  aster".         
25c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c70 20 20 20 20 22 20 57 48 45 52 45 20 25 73 20 4f      " WHERE %s O
25c80 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45  RDER BY rowid DE
25c90 53 43 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20  SC", zWhere);.  
25ca0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
25cb0 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
25cc0 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51   zQuery, -1, &pQ
25cd0 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 69 66  uery, 0);.    if
25ce0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74  ( rc ){.      ut
25cf0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
25d00 2c 20 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25  , "Error: (%d) %
25d10 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20  s on [%s]\n",.  
25d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d30 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65      sqlite3_exte
25d40 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e  nded_errcode(p->
25d50 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  db), sqlite3_err
25d60 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20  msg(p->db),.    
25d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d80 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 20    zQuery);.     
25d90 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61   goto end_schema
25da0 5f 78 66 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  _xfer;.    }.   
25db0 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71   while( (rc = sq
25dc0 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75 65 72  lite3_step(pQuer
25dd0 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  y))==SQLITE_ROW 
25de0 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ){.      zName =
25df0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
25e00 74 65 78 74 28 70 51 75 65 72 79 2c 20 30 29 3b  text(pQuery, 0);
25e10 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  .      zSql = sq
25e20 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
25e30 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20  t(pQuery, 1);.  
25e40 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e      printf("%s..
25e50 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c  . ", zName); ffl
25e60 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20  ush(stdout);.   
25e70 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
25e80 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68  newDb, (const ch
25e90 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20  ar*)zSql, 0, 0, 
25ea0 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
25eb0 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
25ec0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
25ed0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
25ee0 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73  or: %s\nSQL: [%s
25ef0 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a  ]\n", zErrMsg, z
25f00 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Sql);.        sq
25f10 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
25f20 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 45 72  sg);.        zEr
25f30 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
25f40 7d 0a 20 20 20 20 20 20 69 66 28 20 78 46 6f 72  }.      if( xFor
25f50 45 61 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Each ){.        
25f60 78 46 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44  xForEach(p, newD
25f70 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  b, (const char*)
25f80 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
25f90 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 64 6f        printf("do
25fa0 6e 65 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ne\n");.    }.  
25fb0 7d 0a 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65  }.end_schema_xfe
25fc0 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  r:.  sqlite3_fin
25fd0 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20  alize(pQuery);. 
25fe0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
25ff0 75 65 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  uery);.}../*.** 
26000 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
26010 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22  ase file named "
26020 7a 4e 65 77 44 62 22 2e 20 20 54 72 79 20 74 6f  zNewDb".  Try to
26030 20 72 65 63 6f 76 65 72 20 61 73 20 6d 75 63 68   recover as much
26040 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
26050 61 73 20 70 6f 73 73 69 62 6c 65 20 6f 75 74 20  as possible out 
26060 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  of the main data
26070 62 61 73 65 20 28 77 68 69 63 68 20 6d 69 67 68  base (which migh
26080 74 20 62 65 20 63 6f 72 72 75 70 74 29 20 61 6e  t be corrupt) an
26090 64 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 69 6e  d write it.** in
260a0 74 6f 20 7a 4e 65 77 44 62 2e 0a 2a 2f 0a 73 74  to zNewDb..*/.st
260b0 61 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43  atic void tryToC
260c0 6c 6f 6e 65 28 53 68 65 6c 6c 53 74 61 74 65 20  lone(ShellState 
260d0 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
260e0 7a 4e 65 77 44 62 29 7b 0a 20 20 69 6e 74 20 72  zNewDb){.  int r
260f0 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65  c;.  sqlite3 *ne
26100 77 44 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  wDb = 0;.  if( a
26110 63 63 65 73 73 28 7a 4e 65 77 44 62 2c 30 29 3d  ccess(zNewDb,0)=
26120 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
26130 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 46  rintf(stderr, "F
26140 69 6c 65 20 5c 22 25 73 5c 22 20 61 6c 72 65 61  ile \"%s\" alrea
26150 64 79 20 65 78 69 73 74 73 2e 5c 6e 22 2c 20 7a  dy exists.\n", z
26160 4e 65 77 44 62 29 3b 0a 20 20 20 20 72 65 74 75  NewDb);.    retu
26170 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  rn;.  }.  rc = s
26180 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 4e 65 77  qlite3_open(zNew
26190 44 62 2c 20 26 6e 65 77 44 62 29 3b 0a 20 20 69  Db, &newDb);.  i
261a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66  f( rc ){.    utf
261b0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
261c0 20 22 43 61 6e 6e 6f 74 20 63 72 65 61 74 65 20   "Cannot create 
261d0 6f 75 74 70 75 74 20 64 61 74 61 62 61 73 65 3a  output database:
261e0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
261f0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
26200 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20 7d 65  sg(newDb));.  }e
26210 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
26220 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52  _exec(p->db, "PR
26230 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
26240 68 65 6d 61 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c  hema=ON;", 0, 0,
26250 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
26260 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 22 42 45  _exec(newDb, "BE
26270 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 22 2c  GIN EXCLUSIVE;",
26280 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 74   0, 0, 0);.    t
26290 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28  ryToCloneSchema(
262a0 70 2c 20 6e 65 77 44 62 2c 20 22 74 79 70 65 3d  p, newDb, "type=
262b0 27 74 61 62 6c 65 27 22 2c 20 74 72 79 54 6f 43  'table'", tryToC
262c0 6c 6f 6e 65 44 61 74 61 29 3b 0a 20 20 20 20 74  loneData);.    t
262d0 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28  ryToCloneSchema(
262e0 70 2c 20 6e 65 77 44 62 2c 20 22 74 79 70 65 21  p, newDb, "type!
262f0 3d 27 74 61 62 6c 65 27 22 2c 20 30 29 3b 0a 20  ='table'", 0);. 
26300 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
26310 6e 65 77 44 62 2c 20 22 43 4f 4d 4d 49 54 3b 22  newDb, "COMMIT;"
26320 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
26330 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
26340 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74  db, "PRAGMA writ
26350 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b  able_schema=OFF;
26360 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
26370 0a 20 20 63 6c 6f 73 65 5f 64 62 28 6e 65 77 44  .  close_db(newD
26380 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  b);.}../*.** Cha
26390 6e 67 65 20 74 68 65 20 6f 75 74 70 75 74 20 66  nge the output f
263a0 69 6c 65 20 62 61 63 6b 20 74 6f 20 73 74 64 6f  ile back to stdo
263b0 75 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ut..**.** If the
263c0 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 66 6c   p->doXdgOpen fl
263d0 61 67 20 69 73 20 73 65 74 2c 20 74 68 61 74 20  ag is set, that 
263e0 6d 65 61 6e 73 20 74 68 65 20 6f 75 74 70 75 74  means the output
263f0 20 77 61 73 20 62 65 69 6e 67 0a 2a 2a 20 72 65   was being.** re
26400 64 69 72 65 63 74 65 64 20 74 6f 20 61 20 74 65  directed to a te
26410 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
26420 65 64 20 62 79 20 70 2d 3e 7a 54 65 6d 70 46 69  ed by p->zTempFi
26430 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  le.  In that cas
26440 65 2c 0a 2a 2a 20 6c 61 75 6e 63 68 20 73 74 61  e,.** launch sta
26450 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70 65 6e  rt/open/xdg-open
26460 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
26470 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ry file..*/.stat
26480 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 72  ic void output_r
26490 65 73 65 74 28 53 68 65 6c 6c 53 74 61 74 65 20  eset(ShellState 
264a0 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 75  *p){.  if( p->ou
264b0 74 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b  tfile[0]=='|' ){
264c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
264d0 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 70  OMIT_POPEN.    p
264e0 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23  close(p->out);.#
264f0 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
26500 20 20 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63     output_file_c
26510 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 69  lose(p->out);.#i
26520 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48  fndef SQLITE_NOH
26530 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20 69  AVE_SYSTEM.    i
26540 66 28 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20  f( p->doXdgOpen 
26550 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
26560 68 61 72 20 2a 7a 58 64 67 4f 70 65 6e 43 6d 64  har *zXdgOpenCmd
26570 20 3d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f   =.#if defined(_
26580 57 49 4e 33 32 29 0a 20 20 20 20 20 20 22 73 74  WIN32).      "st
26590 61 72 74 22 3b 0a 23 65 6c 69 66 20 64 65 66 69  art";.#elif defi
265a0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
265b0 20 20 20 20 20 22 6f 70 65 6e 22 3b 0a 23 65 6c       "open";.#el
265c0 73 65 0a 20 20 20 20 20 20 22 78 64 67 2d 6f 70  se.      "xdg-op
265d0 65 6e 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  en";.#endif.    
265e0 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20    char *zCmd;.  
265f0 20 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74      zCmd = sqlit
26600 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 25  e3_mprintf("%s %
26610 73 22 2c 20 7a 58 64 67 4f 70 65 6e 43 6d 64 2c  s", zXdgOpenCmd,
26620 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a   p->zTempFile);.
26630 20 20 20 20 20 20 69 66 28 20 73 79 73 74 65 6d        if( system
26640 28 7a 43 6d 64 29 20 29 7b 0a 20 20 20 20 20 20  (zCmd) ){.      
26650 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
26660 64 65 72 72 2c 20 22 46 61 69 6c 65 64 3a 20 5b  derr, "Failed: [
26670 25 73 5d 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20  %s]\n", zCmd);. 
26680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
26690 69 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b  ite3_free(zCmd);
266a0 0a 20 20 20 20 20 20 6f 75 74 70 75 74 4d 6f 64  .      outputMod
266b0 65 50 6f 70 28 70 29 3b 0a 20 20 20 20 20 20 70  ePop(p);.      p
266c0 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 3d 20 30 3b  ->doXdgOpen = 0;
266d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
266e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
266f0 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 29 20  _NOHAVE_SYSTEM) 
26700 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 6f 75 74 66  */.  }.  p->outf
26710 69 6c 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 2d  ile[0] = 0;.  p-
26720 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 7d  >out = stdout;.}
26730 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 6e 20 53  ../*.** Run an S
26740 51 4c 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72  QL command and r
26750 65 74 75 72 6e 20 74 68 65 20 73 69 6e 67 6c 65  eturn the single
26760 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 2e   integer result.
26770 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
26780 62 5f 69 6e 74 28 53 68 65 6c 6c 53 74 61 74 65  b_int(ShellState
26790 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
267a0 2a 7a 53 71 6c 29 7b 0a 20 20 73 71 6c 69 74 65  *zSql){.  sqlite
267b0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
267c0 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20   int res = 0;.  
267d0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
267e0 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
267f0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
26800 20 20 69 66 28 20 70 53 74 6d 74 20 26 26 20 73    if( pStmt && s
26810 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
26820 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
26830 7b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  {.    res = sqli
26840 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
26850 53 74 6d 74 2c 30 29 3b 0a 20 20 7d 0a 20 20 73  Stmt,0);.  }.  s
26860 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
26870 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e  pStmt);.  return
26880 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   res;.}../*.** C
26890 6f 6e 76 65 72 74 20 61 20 32 2d 62 79 74 65 20  onvert a 2-byte 
268a0 6f 72 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e  or 4-byte big-en
268b0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74  dian integer int
268c0 6f 20 61 20 6e 61 74 69 76 65 20 69 6e 74 65 67  o a native integ
268d0 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73  er.*/.static uns
268e0 69 67 6e 65 64 20 69 6e 74 20 67 65 74 32 62 79  igned int get2by
268f0 74 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63  teInt(unsigned c
26900 68 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72  har *a){.  retur
26910 6e 20 28 61 5b 30 5d 3c 3c 38 29 20 2b 20 61 5b  n (a[0]<<8) + a[
26920 31 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 6e 73  1];.}.static uns
26930 69 67 6e 65 64 20 69 6e 74 20 67 65 74 34 62 79  igned int get4by
26940 74 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63  teInt(unsigned c
26950 68 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72  har *a){.  retur
26960 6e 20 28 61 5b 30 5d 3c 3c 32 34 29 20 2b 20 28  n (a[0]<<24) + (
26970 61 5b 31 5d 3c 3c 31 36 29 20 2b 20 28 61 5b 32  a[1]<<16) + (a[2
26980 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b 0a 7d 0a  ]<<8) + a[3];.}.
26990 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
269a0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 2e 69  ation of the ".i
269b0 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  nfo" command..**
269c0 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20  .** Return 1 on 
269d0 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74  error, 2 to exit
269e0 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73  , and 0 otherwis
269f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
26a00 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f   shell_dbinfo_co
26a10 6d 6d 61 6e 64 28 53 68 65 6c 6c 53 74 61 74 65  mmand(ShellState
26a20 20 2a 70 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63   *p, int nArg, c
26a30 68 61 72 20 2a 2a 61 7a 41 72 67 29 7b 0a 20 20  har **azArg){.  
26a40 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
26a50 75 63 74 20 7b 20 63 6f 6e 73 74 20 63 68 61 72  uct { const char
26a60 20 2a 7a 4e 61 6d 65 3b 20 69 6e 74 20 6f 66 73   *zName; int ofs
26a70 74 3b 20 7d 20 61 46 69 65 6c 64 5b 5d 20 3d 20  t; } aField[] = 
26a80 7b 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 20 63  {.     { "file c
26a90 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 3a 22 2c  hange counter:",
26aa0 20 20 32 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20    24  },.     { 
26ab0 22 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63  "database page c
26ac0 6f 75 6e 74 3a 22 2c 20 20 32 38 20 20 7d 2c 0a  ount:",  28  },.
26ad0 20 20 20 20 20 7b 20 22 66 72 65 65 6c 69 73 74       { "freelist
26ae0 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20   page count:",  
26af0 33 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  36  },.     { "s
26b00 63 68 65 6d 61 20 63 6f 6f 6b 69 65 3a 22 2c 20  chema cookie:", 
26b10 20 20 20 20 20 20 20 34 30 20 20 7d 2c 0a 20 20         40  },.  
26b20 20 20 20 7b 20 22 73 63 68 65 6d 61 20 66 6f 72     { "schema for
26b30 6d 61 74 3a 22 2c 20 20 20 20 20 20 20 20 34 34  mat:",        44
26b40 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 65 66    },.     { "def
26b50 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65 3a  ault cache size:
26b60 22 2c 20 20 20 34 38 20 20 7d 2c 0a 20 20 20 20  ",   48  },.    
26b70 20 7b 20 22 61 75 74 6f 76 61 63 75 75 6d 20 74   { "autovacuum t
26b80 6f 70 20 72 6f 6f 74 3a 22 2c 20 20 35 32 20 20  op root:",  52  
26b90 7d 2c 0a 20 20 20 20 20 7b 20 22 69 6e 63 72 65  },.     { "incre
26ba0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 3a 22 2c  mental vacuum:",
26bb0 20 20 20 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b     64  },.     {
26bc0 20 22 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 3a   "text encoding:
26bd0 22 2c 20 20 20 20 20 20 20 20 35 36 20 20 7d 2c  ",        56  },
26be0 0a 20 20 20 20 20 7b 20 22 75 73 65 72 20 76 65  .     { "user ve
26bf0 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20 20 20 20  rsion:",        
26c00 20 36 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   60  },.     { "
26c10 61 70 70 6c 69 63 61 74 69 6f 6e 20 69 64 3a 22  application id:"
26c20 2c 20 20 20 20 20 20 20 36 38 20 20 7d 2c 0a 20  ,       68  },. 
26c30 20 20 20 20 7b 20 22 73 6f 66 74 77 61 72 65 20      { "software 
26c40 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20 39  version:",     9
26c50 36 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61  6  },.  };.  sta
26c60 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
26c70 20 7b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a   { const char *z
26c80 4e 61 6d 65 3b 20 63 6f 6e 73 74 20 63 68 61 72  Name; const char
26c90 20 2a 7a 53 71 6c 3b 20 7d 20 61 51 75 65 72 79   *zSql; } aQuery
26ca0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 6e  [] = {.     { "n
26cb0 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 3a  umber of tables:
26cc0 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  ",.       "SELEC
26cd0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
26ce0 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 74  %s WHERE type='t
26cf0 61 62 6c 65 27 22 20 7d 2c 0a 20 20 20 20 20 7b  able'" },.     {
26d00 20 22 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65   "number of inde
26d10 78 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53  xes:",.       "S
26d20 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
26d30 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70  ROM %s WHERE typ
26d40 65 3d 27 69 6e 64 65 78 27 22 20 7d 2c 0a 20 20  e='index'" },.  
26d50 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20     { "number of 
26d60 74 72 69 67 67 65 72 73 3a 22 2c 0a 20 20 20 20  triggers:",.    
26d70 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74     "SELECT count
26d80 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52  (*) FROM %s WHER
26d90 45 20 74 79 70 65 3d 27 74 72 69 67 67 65 72 27  E type='trigger'
26da0 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d  " },.     { "num
26db0 62 65 72 20 6f 66 20 76 69 65 77 73 3a 22 2c 0a  ber of views:",.
26dc0 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
26dd0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20  ount(*) FROM %s 
26de0 57 48 45 52 45 20 74 79 70 65 3d 27 76 69 65 77  WHERE type='view
26df0 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63  '" },.     { "sc
26e00 68 65 6d 61 20 73 69 7a 65 3a 22 2c 0a 20 20 20  hema size:",.   
26e10 20 20 20 20 22 53 45 4c 45 43 54 20 74 6f 74 61      "SELECT tota
26e20 6c 28 6c 65 6e 67 74 68 28 73 71 6c 29 29 20 46  l(length(sql)) F
26e30 52 4f 4d 20 25 73 22 20 7d 2c 0a 20 20 7d 3b 0a  ROM %s" },.  };.
26e40 20 20 69 6e 74 20 69 2c 20 72 63 3b 0a 20 20 75    int i, rc;.  u
26e50 6e 73 69 67 6e 65 64 20 69 44 61 74 61 56 65 72  nsigned iDataVer
26e60 73 69 6f 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53  sion;.  char *zS
26e70 63 68 65 6d 61 54 61 62 3b 0a 20 20 63 68 61 72  chemaTab;.  char
26e80 20 2a 7a 44 62 20 3d 20 6e 41 72 67 3e 3d 32 20   *zDb = nArg>=2 
26e90 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 6d 61  ? azArg[1] : "ma
26ea0 69 6e 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  in";.  sqlite3_s
26eb0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
26ec0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
26ed0 61 48 64 72 5b 31 30 30 5d 3b 0a 20 20 6f 70 65  aHdr[100];.  ope
26ee0 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 69 66  n_db(p, 0);.  if
26ef0 28 20 70 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74  ( p->db==0 ) ret
26f00 75 72 6e 20 31 3b 0a 20 20 72 63 20 3d 20 73 71  urn 1;.  rc = sq
26f10 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
26f20 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  (p->db,.        
26f30 20 20 20 20 20 22 53 45 4c 45 43 54 20 64 61 74       "SELECT dat
26f40 61 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62  a FROM sqlite_db
26f50 70 61 67 65 28 3f 31 29 20 57 48 45 52 45 20 70  page(?1) WHERE p
26f60 67 6e 6f 3d 31 22 2c 0a 20 20 20 20 20 20 20 20  gno=1",.        
26f70 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c       -1, &pStmt,
26f80 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
26f90 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
26fa0 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  3_compileoption_
26fb0 75 73 65 64 28 22 45 4e 41 42 4c 45 5f 44 42 50  used("ENABLE_DBP
26fc0 41 47 45 5f 56 54 41 42 22 29 20 29 7b 0a 20 20  AGE_VTAB") ){.  
26fd0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
26fe0 73 74 64 65 72 72 2c 20 22 74 68 65 20 5c 22 2e  stderr, "the \".
26ff0 64 62 69 6e 66 6f 5c 22 20 63 6f 6d 6d 61 6e 64  dbinfo\" command
27000 20 72 65 71 75 69 72 65 73 20 74 68 65 20 22 0a   requires the ".
27010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27020 20 20 20 20 20 20 20 20 20 20 22 2d 44 53 51 4c            "-DSQL
27030 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47  ITE_ENABLE_DBPAG
27040 45 5f 56 54 41 42 20 63 6f 6d 70 69 6c 65 2d 74  E_VTAB compile-t
27050 69 6d 65 20 6f 70 74 69 6f 6e 73 5c 6e 22 29 3b  ime options\n");
27060 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27070 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
27080 64 65 72 72 2c 20 22 65 72 72 6f 72 3a 20 25 73  derr, "error: %s
27090 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
270a0 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
270b0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
270c0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
270d0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
270e0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  }.  sqlite3_bind
270f0 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20  _text(pStmt, 1, 
27100 7a 44 62 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  zDb, -1, SQLITE_
27110 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 73  STATIC);.  if( s
27120 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
27130 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 0a 20  t)==SQLITE_ROW. 
27140 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c    && sqlite3_col
27150 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
27160 30 29 3e 31 30 30 0a 20 20 29 7b 0a 20 20 20 20  0)>100.  ){.    
27170 6d 65 6d 63 70 79 28 61 48 64 72 2c 20 73 71 6c  memcpy(aHdr, sql
27180 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
27190 28 70 53 74 6d 74 2c 30 29 2c 20 31 30 30 29 3b  (pStmt,0), 100);
271a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
271b0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
271c0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70  }else{.    raw_p
271d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
271e0 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 64 61  nable to read da
271f0 74 61 62 61 73 65 20 68 65 61 64 65 72 5c 6e 22  tabase header\n"
27200 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
27210 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
27220 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
27230 7d 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74 65  }.  i = get2byte
27240 49 6e 74 28 61 48 64 72 2b 31 36 29 3b 0a 20 20  Int(aHdr+16);.  
27250 69 66 28 20 69 3d 3d 31 20 29 20 69 20 3d 20 36  if( i==1 ) i = 6
27260 35 35 33 36 3b 0a 20 20 75 74 66 38 5f 70 72 69  5536;.  utf8_pri
27270 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32  ntf(p->out, "%-2
27280 30 73 20 25 64 5c 6e 22 2c 20 22 64 61 74 61 62  0s %d\n", "datab
27290 61 73 65 20 70 61 67 65 20 73 69 7a 65 3a 22 2c  ase page size:",
272a0 20 69 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e   i);.  utf8_prin
272b0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
272c0 73 20 25 64 5c 6e 22 2c 20 22 77 72 69 74 65 20  s %d\n", "write 
272d0 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31  format:", aHdr[1
272e0 38 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  8]);.  utf8_prin
272f0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
27300 73 20 25 64 5c 6e 22 2c 20 22 72 65 61 64 20 66  s %d\n", "read f
27310 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31 39  ormat:", aHdr[19
27320 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  ]);.  utf8_print
27330 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73  f(p->out, "%-20s
27340 20 25 64 5c 6e 22 2c 20 22 72 65 73 65 72 76 65   %d\n", "reserve
27350 64 20 62 79 74 65 73 3a 22 2c 20 61 48 64 72 5b  d bytes:", aHdr[
27360 32 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  20]);.  for(i=0;
27370 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 69   i<ArraySize(aFi
27380 65 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  eld); i++){.    
27390 69 6e 74 20 6f 66 73 74 20 3d 20 61 46 69 65 6c  int ofst = aFiel
273a0 64 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20 20 20 75  d[i].ofst;.    u
273b0 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 61 6c 20  nsigned int val 
273c0 3d 20 67 65 74 34 62 79 74 65 49 6e 74 28 61 48  = get4byteInt(aH
273d0 64 72 20 2b 20 6f 66 73 74 29 3b 0a 20 20 20 20  dr + ofst);.    
273e0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
273f0 75 74 2c 20 22 25 2d 32 30 73 20 25 75 22 2c 20  ut, "%-20s %u", 
27400 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 2c  aField[i].zName,
27410 20 76 61 6c 29 3b 0a 20 20 20 20 73 77 69 74 63   val);.    switc
27420 68 28 20 6f 66 73 74 20 29 7b 0a 20 20 20 20 20  h( ofst ){.     
27430 20 63 61 73 65 20 35 36 3a 20 7b 0a 20 20 20 20   case 56: {.    
27440 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20 29      if( val==1 )
27450 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
27460 75 74 2c 20 22 20 28 75 74 66 38 29 22 29 3b 0a  ut, " (utf8)");.
27470 20 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d          if( val=
27480 3d 32 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  =2 ) raw_printf(
27490 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 31 36  p->out, " (utf16
274a0 6c 65 29 22 29 3b 0a 20 20 20 20 20 20 20 20 69  le)");.        i
274b0 66 28 20 76 61 6c 3d 3d 33 20 29 20 72 61 77 5f  f( val==3 ) raw_
274c0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
274d0 20 28 75 74 66 31 36 62 65 29 22 29 3b 0a 20 20   (utf16be)");.  
274e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
274f0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
27500 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  t, "\n");.  }.  
27510 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20  if( zDb==0 ){.  
27520 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73    zSchemaTab = s
27530 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
27540 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74  main.sqlite_mast
27550 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  er");.  }else if
27560 28 20 73 74 72 63 6d 70 28 7a 44 62 2c 22 74 65  ( strcmp(zDb,"te
27570 6d 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  mp")==0 ){.    z
27580 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69  SchemaTab = sqli
27590 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
275a0 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  , "sqlite_temp_m
275b0 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65  aster");.  }else
275c0 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62  {.    zSchemaTab
275d0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
275e0 74 66 28 22 5c 22 25 77 5c 22 2e 73 71 6c 69 74  tf("\"%w\".sqlit
275f0 65 5f 6d 61 73 74 65 72 22 2c 20 7a 44 62 29 3b  e_master", zDb);
27600 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
27610 69 3c 41 72 72 61 79 53 69 7a 65 28 61 51 75 65  i<ArraySize(aQue
27620 72 79 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  ry); i++){.    c
27630 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69  har *zSql = sqli
27640 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 51 75 65  te3_mprintf(aQue
27650 72 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a 53 63 68  ry[i].zSql, zSch
27660 65 6d 61 54 61 62 29 3b 0a 20 20 20 20 69 6e 74  emaTab);.    int
27670 20 76 61 6c 20 3d 20 64 62 5f 69 6e 74 28 70 2c   val = db_int(p,
27680 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69   zSql);.    sqli
27690 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
276a0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
276b0 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
276c0 64 5c 6e 22 2c 20 61 51 75 65 72 79 5b 69 5d 2e  d\n", aQuery[i].
276d0 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 7d  zName, val);.  }
276e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
276f0 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 73  zSchemaTab);.  s
27700 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
27710 72 6f 6c 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20  rol(p->db, zDb, 
27720 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 41 54  SQLITE_FCNTL_DAT
27730 41 5f 56 45 52 53 49 4f 4e 2c 20 26 69 44 61 74  A_VERSION, &iDat
27740 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 75 74 66  aVersion);.  utf
27750 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
27760 20 22 25 2d 32 30 73 20 25 75 5c 6e 22 2c 20 22   "%-20s %u\n", "
27770 64 61 74 61 20 76 65 72 73 69 6f 6e 22 2c 20 69  data version", i
27780 44 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20  DataVersion);.  
27790 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
277a0 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 75 72  ** Print the cur
277b0 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72  rent sqlite3_err
277c0 6d 73 67 28 29 20 76 61 6c 75 65 20 74 6f 20 73  msg() value to s
277d0 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e  tderr and return
277e0 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   1..*/.static in
277f0 74 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45  t shellDatabaseE
27800 72 72 6f 72 28 73 71 6c 69 74 65 33 20 2a 64 62  rror(sqlite3 *db
27810 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
27820 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  *zErr = sqlite3_
27830 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 75 74  errmsg(db);.  ut
27840 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
27850 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
27860 20 7a 45 72 72 29 3b 0a 20 20 72 65 74 75 72 6e   zErr);.  return
27870 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   1;.}../*.** Com
27880 70 61 72 65 20 74 68 65 20 70 61 74 74 65 72 6e  pare the pattern
27890 20 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61 67 61 69   in zGlob[] agai
278a0 6e 73 74 20 74 68 65 20 74 65 78 74 20 69 6e 20  nst the text in 
278b0 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 54 52 55  z[].  Return TRU
278c0 45 0a 2a 2a 20 69 66 20 74 68 65 79 20 6d 61 74  E.** if they mat
278d0 63 68 20 61 6e 64 20 46 41 4c 53 45 20 28 30 29  ch and FALSE (0)
278e0 20 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   if they do not 
278f0 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f  match..**.** Glo
27900 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a  bbing rules:.**.
27910 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20 20  **      '*'     
27920 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65    Matches any se
27930 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f  quence of zero o
27940 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72  r more character
27950 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f  s..**.**      '?
27960 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20  '       Matches 
27970 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61 72  exactly one char
27980 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  acter..**.**    
27990 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63   [...]      Matc
279a0 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65  hes one characte
279b0 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f  r from the enclo
279c0 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20  sed list of.**  
279d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68                ch
279e0 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  aracters..**.** 
279f0 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d      [^...]     M
27a00 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61  atches one chara
27a10 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65 20  cter not in the 
27a20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a  enclosed list..*
27a30 2a 0a 2a 2a 20 20 20 20 20 20 27 23 27 20 20 20  *.**      '#'   
27a40 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20      Matches any 
27a50 73 65 71 75 65 6e 63 65 20 6f 66 20 6f 6e 65 20  sequence of one 
27a60 6f 72 20 6d 6f 72 65 20 64 69 67 69 74 73 20 77  or more digits w
27a70 69 74 68 20 61 6e 0a 2a 2a 20 20 20 20 20 20 20  ith an.**       
27a80 20 20 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 61           optiona
27a90 6c 20 2b 20 6f 72 20 2d 20 73 69 67 6e 20 69 6e  l + or - sign in
27aa0 20 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20   front.**.**    
27ab0 20 20 27 20 27 20 20 20 20 20 20 20 41 6e 79 20    ' '       Any 
27ac0 73 70 61 6e 20 6f 66 20 77 68 69 74 65 73 70 61  span of whitespa
27ad0 63 65 20 6d 61 74 63 68 65 73 20 61 6e 79 20 6f  ce matches any o
27ae0 74 68 65 72 20 73 70 61 6e 20 6f 66 0a 2a 2a 20  ther span of.** 
27af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
27b00 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a  hitespace..**.**
27b10 20 45 78 74 72 61 20 77 68 69 74 65 73 70 61 63   Extra whitespac
27b20 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
27b30 7a 5b 5d 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  z[] is ignored..
27b40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
27b50 73 74 63 61 73 65 5f 67 6c 6f 62 28 63 6f 6e 73  stcase_glob(cons
27b60 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c 20 63  t char *zGlob, c
27b70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
27b80 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20 69 6e   int c, c2;.  in
27b90 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20  t invert;.  int 
27ba0 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65 28 20  seen;..  while( 
27bb0 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29  (c = (*(zGlob++)
27bc0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ))!=0 ){.    if(
27bd0 20 49 73 53 70 61 63 65 28 63 29 20 29 7b 0a 20   IsSpace(c) ){. 
27be0 20 20 20 20 20 69 66 28 20 21 49 73 53 70 61 63       if( !IsSpac
27bf0 65 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30  e(*z) ) return 0
27c00 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49  ;.      while( I
27c10 73 53 70 61 63 65 28 2a 7a 47 6c 6f 62 29 20 29  sSpace(*zGlob) )
27c20 20 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20 20 20 20   zGlob++;.      
27c30 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a  while( IsSpace(*
27c40 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65  z) ) z++;.    }e
27c50 6c 73 65 20 69 66 28 20 63 3d 3d 27 2a 27 20 29  lse if( c=='*' )
27c60 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  {.      while( (
27c70 63 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 20  c=(*(zGlob++))) 
27c80 3d 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27  == '*' || c=='?'
27c90 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
27ca0 63 3d 3d 27 3f 27 20 26 26 20 28 2a 28 7a 2b 2b  c=='?' && (*(z++
27cb0 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ))==0 ) return 0
27cc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27cd0 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
27ce0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
27cf0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
27d00 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='[' ){.        
27d10 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 74 65 73  while( *z && tes
27d20 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62  tcase_glob(zGlob
27d30 2d 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20  -1,z)==0 ){.    
27d40 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20        z++;.     
27d50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
27d60 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20 20 20  urn (*z)!=0;.   
27d70 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65     }.      while
27d80 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b 29 29  ( (c2 = (*(z++))
27d90 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
27da0 77 68 69 6c 65 28 20 63 32 21 3d 63 20 29 7b 0a  while( c2!=c ){.
27db0 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a            c2 = *
27dc0 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20  (z++);.         
27dd0 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65 74   if( c2==0 ) ret
27de0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
27df0 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73  .        if( tes
27e00 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62  tcase_glob(zGlob
27e10 2c 7a 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ,z) ) return 1;.
27e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
27e30 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
27e40 65 20 69 66 28 20 63 3d 3d 27 3f 27 20 29 7b 0a  e if( c=='?' ){.
27e50 20 20 20 20 20 20 69 66 28 20 28 2a 28 7a 2b 2b        if( (*(z++
27e60 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ))==0 ) return 0
27e70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
27e80 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  c=='[' ){.      
27e90 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b  int prior_c = 0;
27ea0 0a 20 20 20 20 20 20 73 65 65 6e 20 3d 20 30 3b  .      seen = 0;
27eb0 0a 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20  .      invert = 
27ec0 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 28 7a  0;.      c = *(z
27ed0 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ++);.      if( c
27ee0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
27ef0 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c        c2 = *(zGl
27f00 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28  ob++);.      if(
27f10 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20   c2=='^' ){.    
27f20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a      invert = 1;.
27f30 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a          c2 = *(z
27f40 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d  Glob++);.      }
27f50 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27  .      if( c2=='
27f60 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]' ){.        if
27f70 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20  ( c==']' ) seen 
27f80 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20  = 1;.        c2 
27f90 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20  = *(zGlob++);.  
27fa0 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
27fb0 65 28 20 63 32 20 26 26 20 63 32 21 3d 27 5d 27  e( c2 && c2!=']'
27fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
27fd0 63 32 3d 3d 27 2d 27 20 26 26 20 7a 47 6c 6f 62  c2=='-' && zGlob
27fe0 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a 47 6c 6f  [0]!=']' && zGlo
27ff0 62 5b 30 5d 21 3d 30 20 26 26 20 70 72 69 6f 72  b[0]!=0 && prior
28000 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  _c>0 ){.        
28010 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b    c2 = *(zGlob++
28020 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
28030 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63   c>=prior_c && c
28040 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b  <=c2 ) seen = 1;
28050 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72  .          prior
28060 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  _c = 0;.        
28070 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
28080 20 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20   if( c==c2 ){.  
28090 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d            seen =
280a0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
280b0 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f            prior_
280c0 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20  c = c2;.        
280d0 7d 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a  }.        c2 = *
280e0 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20  (zGlob++);.     
280f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d   }.      if( c2=
28100 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e  =0 || (seen ^ in
28110 76 65 72 74 29 3d 3d 30 20 29 20 72 65 74 75 72  vert)==0 ) retur
28120 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 0;.    }else i
28130 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20  f( c=='#' ){.   
28140 20 20 20 69 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d     if( (z[0]=='-
28150 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20  ' || z[0]=='+') 
28160 26 26 20 49 73 44 69 67 69 74 28 7a 5b 31 5d 29  && IsDigit(z[1])
28170 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66   ) z++;.      if
28180 28 20 21 49 73 44 69 67 69 74 28 7a 5b 30 5d 29  ( !IsDigit(z[0])
28190 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
281a0 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 77 68     z++;.      wh
281b0 69 6c 65 28 20 49 73 44 69 67 69 74 28 7a 5b 30  ile( IsDigit(z[0
281c0 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ z++; }.   
281d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
281e0 28 20 63 21 3d 28 2a 28 7a 2b 2b 29 29 20 29 20  ( c!=(*(z++)) ) 
281f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
28200 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 49 73 53    }.  while( IsS
28210 70 61 63 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b  pace(*z) ){ z++;
28220 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d   }.  return *z==
28230 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  0;.}.../*.** Com
28240 70 61 72 65 20 74 68 65 20 73 74 72 69 6e 67 20  pare the string 
28250 61 73 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  as a command-lin
28260 65 20 6f 70 74 69 6f 6e 20 77 69 74 68 20 65 69  e option with ei
28270 74 68 65 72 20 6f 6e 65 20 6f 72 20 74 77 6f 0a  ther one or two.
28280 2a 2a 20 69 6e 69 74 69 61 6c 20 22 2d 22 20 63  ** initial "-" c
28290 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74  haracters..*/.st
282a0 61 74 69 63 20 69 6e 74 20 6f 70 74 69 6f 6e 4d  atic int optionM
282b0 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20  atch(const char 
282c0 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61  *zStr, const cha
282d0 72 20 2a 7a 4f 70 74 29 7b 0a 20 20 69 66 28 20  r *zOpt){.  if( 
282e0 7a 53 74 72 5b 30 5d 21 3d 27 2d 27 20 29 20 72  zStr[0]!='-' ) r
282f0 65 74 75 72 6e 20 30 3b 0a 20 20 7a 53 74 72 2b  eturn 0;.  zStr+
28300 2b 3b 0a 20 20 69 66 28 20 7a 53 74 72 5b 30 5d  +;.  if( zStr[0]
28310 3d 3d 27 2d 27 20 29 20 7a 53 74 72 2b 2b 3b 0a  =='-' ) zStr++;.
28320 20 20 72 65 74 75 72 6e 20 73 74 72 63 6d 70 28    return strcmp(
28330 7a 53 74 72 2c 20 7a 4f 70 74 29 3d 3d 30 3b 0a  zStr, zOpt)==0;.
28340 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
28350 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  a file..*/.int s
28360 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 63  hellDeleteFile(c
28370 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
28380 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  name){.  int rc;
28390 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 20  .#ifdef _WIN32. 
283a0 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71   wchar_t *z = sq
283b0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
283c0 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46 69 6c  _to_unicode(zFil
283d0 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20 5f  ename);.  rc = _
283e0 77 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20 20 73 71  wunlink(z);.  sq
283f0 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23  lite3_free(z);.#
28400 65 6c 73 65 0a 20 20 72 63 20 3d 20 75 6e 6c 69  else.  rc = unli
28410 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23  nk(zFilename);.#
28420 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
28430 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  c;.}../*.** Try 
28440 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
28450 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 28 69 66  mporary file (if
28460 20 74 68 65 72 65 20 69 73 20 6f 6e 65 29 20 61   there is one) a
28470 6e 64 20 66 72 65 65 20 74 68 65 0a 2a 2a 20 6d  nd free the.** m
28480 65 6d 6f 72 79 20 75 73 65 64 20 74 6f 20 68 6f  emory used to ho
28490 6c 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ld the name of t
284a0 68 65 20 74 65 6d 70 20 66 69 6c 65 2e 0a 2a 2f  he temp file..*/
284b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65  .static void cle
284c0 61 72 54 65 6d 70 46 69 6c 65 28 53 68 65 6c 6c  arTempFile(Shell
284d0 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 66 28  State *p){.  if(
284e0 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30   p->zTempFile==0
284f0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
28500 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 29 20   p->doXdgOpen ) 
28510 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 68  return;.  if( sh
28520 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 70 2d  ellDeleteFile(p-
28530 3e 7a 54 65 6d 70 46 69 6c 65 29 20 29 20 72 65  >zTempFile) ) re
28540 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f  turn;.  sqlite3_
28550 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c  free(p->zTempFil
28560 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46 69  e);.  p->zTempFi
28570 6c 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  le = 0;.}../*.**
28580 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 74 65   Create a new te
28590 6d 70 20 66 69 6c 65 20 6e 61 6d 65 20 77 69 74  mp file name wit
285a0 68 20 74 68 65 20 67 69 76 65 6e 20 73 75 66 66  h the given suff
285b0 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ix..*/.static vo
285c0 69 64 20 6e 65 77 54 65 6d 70 46 69 6c 65 28 53  id newTempFile(S
285d0 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f  hellState *p, co
285e0 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 66 66 69  nst char *zSuffi
285f0 78 29 7b 0a 20 20 63 6c 65 61 72 54 65 6d 70 46  x){.  clearTempF
28600 69 6c 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ile(p);.  sqlite
28610 33 5f 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46  3_free(p->zTempF
28620 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70  ile);.  p->zTemp
28630 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  File = 0;.  if( 
28640 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c  p->db ){.    sql
28650 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
28660 6c 28 70 2d 3e 64 62 2c 20 30 2c 20 53 51 4c 49  l(p->db, 0, SQLI
28670 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c  TE_FCNTL_TEMPFIL
28680 45 4e 41 4d 45 2c 20 26 70 2d 3e 7a 54 65 6d 70  ENAME, &p->zTemp
28690 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  File);.  }.  if(
286a0 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30   p->zTempFile==0
286b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
286c0 75 69 6e 74 36 34 20 72 3b 0a 20 20 20 20 73 71  uint64 r;.    sq
286d0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
286e0 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b  (sizeof(r), &r);
286f0 0a 20 20 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  .    p->zTempFil
28700 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
28710 6e 74 66 28 22 74 65 6d 70 25 6c 6c 78 2e 25 73  ntf("temp%llx.%s
28720 22 2c 20 72 2c 20 7a 53 75 66 66 69 78 29 3b 0a  ", r, zSuffix);.
28730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
28740 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69  zTempFile = sqli
28750 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2e  te3_mprintf("%z.
28760 25 73 22 2c 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  %s", p->zTempFil
28770 65 2c 20 7a 53 75 66 66 69 78 29 3b 0a 20 20 7d  e, zSuffix);.  }
28780 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46  .  if( p->zTempF
28790 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61  ile==0 ){.    ra
287a0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
287b0 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c   "out of memory\
287c0 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
287d0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
287e0 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
287f0 6f 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c 61 72  on of SQL scalar
28800 20 66 75 6e 63 74 69 6f 6e 20 66 6b 65 79 5f 63   function fkey_c
28810 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 2c  ollate_clause(),
28820 20 75 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20   used.** by the 
28830 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65  ".lint fkey-inde
28840 78 65 73 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68  xes" command. Th
28850 69 73 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  is scalar functi
28860 6f 6e 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  on is always.** 
28870 63 61 6c 6c 65 64 20 77 69 74 68 20 66 6f 75 72  called with four
28880 20 61 72 67 75 6d 65 6e 74 73 20 2d 20 74 68 65   arguments - the
28890 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6e 61   parent table na
288a0 6d 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20 63  me, the parent c
288b0 6f 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74  olumn name,.** t
288c0 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 6e  he child table n
288d0 61 6d 65 20 61 6e 64 20 74 68 65 20 63 68 69 6c  ame and the chil
288e0 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
288f0 2a 0a 2a 2a 20 20 20 66 6b 65 79 5f 63 6f 6c 6c  *.**   fkey_coll
28900 61 74 65 5f 63 6c 61 75 73 65 28 27 70 61 72 65  ate_clause('pare
28910 6e 74 2d 74 61 62 27 2c 20 27 70 61 72 65 6e 74  nt-tab', 'parent
28920 2d 63 6f 6c 27 2c 20 27 63 68 69 6c 64 2d 74 61  -col', 'child-ta
28930 62 27 2c 20 27 63 68 69 6c 64 2d 63 6f 6c 27 29  b', 'child-col')
28940 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
28950 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   of the named ta
28960 62 6c 65 73 20 6f 72 20 63 6f 6c 75 6d 6e 73 20  bles or columns 
28970 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  do not exist, th
28980 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72  is function.** r
28990 65 74 75 72 6e 73 20 61 6e 20 65 6d 70 74 79 20  eturns an empty 
289a0 73 74 72 69 6e 67 2e 20 41 6e 20 65 6d 70 74 79  string. An empty
289b0 20 73 74 72 69 6e 67 20 69 73 20 61 6c 73 6f 20   string is also 
289c0 72 65 74 75 72 6e 65 64 20 69 66 20 62 6f 74 68  returned if both
289d0 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 63   tables.** and c
289e0 6f 6c 75 6d 6e 73 20 65 78 69 73 74 20 62 75 74  olumns exist but
289f0 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 64   have the same d
28a00 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
28a10 20 73 65 71 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a   sequence. Or,.*
28a20 2a 20 69 66 20 62 6f 74 68 20 65 78 69 73 74 20  * if both exist 
28a30 62 75 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  but the default 
28a40 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
28a50 63 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  ces are differen
28a60 74 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  t, this.** funct
28a70 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
28a80 73 74 72 69 6e 67 20 22 20 43 4f 4c 4c 41 54 45  string " COLLATE
28a90 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69   <parent-collati
28aa0 6f 6e 3e 22 2c 20 77 68 65 72 65 0a 2a 2a 20 3c  on>", where.** <
28ab0 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e  parent-collation
28ac0 3e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  > is the default
28ad0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
28ae0 6e 63 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e  nce of the paren
28af0 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61  t column..*/.sta
28b00 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 46 6b  tic void shellFk
28b10 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65 28  eyCollateClause(
28b20 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
28b30 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
28b40 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
28b50 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
28b60 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
28b70 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
28b80 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29  _db_handle(pCtx)
28b90 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
28ba0 7a 50 61 72 65 6e 74 3b 0a 20 20 63 6f 6e 73 74  zParent;.  const
28bb0 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f   char *zParentCo
28bc0 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
28bd0 2a 7a 50 61 72 65 6e 74 53 65 71 3b 0a 20 20 63  *zParentSeq;.  c
28be0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c  onst char *zChil
28bf0 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d;.  const char 
28c00 2a 7a 43 68 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f  *zChildCol;.  co
28c10 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64  nst char *zChild
28c20 53 65 71 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 69  Seq = 0;  /* Ini
28c30 74 69 61 6c 69 7a 65 20 74 6f 20 61 76 6f 69 64  tialize to avoid
28c40 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20   false-positive 
28c50 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  warning */.  int
28c60 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
28c70 6e 56 61 6c 3d 3d 34 20 29 3b 0a 20 20 7a 50 61  nVal==4 );.  zPa
28c80 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  rent = (const ch
28c90 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
28ca0 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
28cb0 3b 0a 20 20 7a 50 61 72 65 6e 74 43 6f 6c 20 3d  ;.  zParentCol =
28cc0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
28cd0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
28ce0 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43  (apVal[1]);.  zC
28cf0 68 69 6c 64 20 3d 20 28 63 6f 6e 73 74 20 63 68  hild = (const ch
28d00 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
28d10 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d 29  e_text(apVal[2])
28d20 3b 0a 20 20 7a 43 68 69 6c 64 43 6f 6c 20 3d 20  ;.  zChildCol = 
28d30 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
28d40 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
28d50 61 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71  apVal[3]);..  sq
28d60 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
28d70 74 28 70 43 74 78 2c 20 22 22 2c 20 2d 31 2c 20  t(pCtx, "", -1, 
28d80 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
28d90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74    rc = sqlite3_t
28da0 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
28db0 64 61 74 61 28 0a 20 20 20 20 20 20 64 62 2c 20  data(.      db, 
28dc0 22 6d 61 69 6e 22 2c 20 7a 50 61 72 65 6e 74 2c  "main", zParent,
28dd0 20 7a 50 61 72 65 6e 74 43 6f 6c 2c 20 30 2c 20   zParentCol, 0, 
28de0 26 7a 50 61 72 65 6e 74 53 65 71 2c 20 30 2c 20  &zParentSeq, 0, 
28df0 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20  0, 0.  );.  if( 
28e00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28e10 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
28e20 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
28e30 65 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 20  etadata(.       
28e40 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 43 68   db, "main", zCh
28e50 69 6c 64 2c 20 7a 43 68 69 6c 64 43 6f 6c 2c 20  ild, zChildCol, 
28e60 30 2c 20 26 7a 43 68 69 6c 64 53 65 71 2c 20 30  0, &zChildSeq, 0
28e70 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
28e80 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
28e90 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65  ITE_OK && sqlite
28ea0 33 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e  3_stricmp(zParen
28eb0 74 53 65 71 2c 20 7a 43 68 69 6c 64 53 65 71 29  tSeq, zChildSeq)
28ec0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   ){.    char *z 
28ed0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
28ee0 66 28 22 20 43 4f 4c 4c 41 54 45 20 25 73 22 2c  f(" COLLATE %s",
28ef0 20 7a 50 61 72 65 6e 74 53 65 71 29 3b 0a 20 20   zParentSeq);.  
28f00 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
28f10 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d  _text(pCtx, z, -
28f20 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
28f30 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
28f40 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d  3_free(z);.  }.}
28f50 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  .../*.** The imp
28f60 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 64  lementation of d
28f70 6f 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e  ot-command ".lin
28f80 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2e  t fkey-indexes".
28f90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
28fa0 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28 0a  intFkeyIndexes(.
28fb0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
28fc0 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  tate,           
28fd0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65    /* Current she
28fe0 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f  ll tool state */
28ff0 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
29000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29010 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
29020 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
29030 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a  to dot command *
29040 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20  /.  int nArg    
29050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29060 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
29070 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72   entries in azAr
29080 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  g[] */.){.  sqli
29090 74 65 33 20 2a 64 62 20 3d 20 70 53 74 61 74 65  te3 *db = pState
290a0 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44  ->db;       /* D
290b0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
290c0 6f 20 71 75 65 72 79 20 22 6d 61 69 6e 22 20 64  o query "main" d
290d0 62 20 6f 66 20 2a 2f 0a 20 20 46 49 4c 45 20 2a  b of */.  FILE *
290e0 6f 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75  out = pState->ou
290f0 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72  t;        /* Str
29100 65 61 6d 20 74 6f 20 77 72 69 74 65 20 6e 6f 6e  eam to write non
29110 2d 65 72 72 6f 72 20 6f 75 74 70 75 74 20 74 6f  -error output to
29120 20 2a 2f 0a 20 20 69 6e 74 20 62 56 65 72 62 6f   */.  int bVerbo
29130 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  se = 0;         
29140 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 76 65 72        /* If -ver
29150 62 6f 73 65 20 69 73 20 70 72 65 73 65 6e 74 20  bose is present 
29160 2a 2f 0a 20 20 69 6e 74 20 62 47 72 6f 75 70 42  */.  int bGroupB
29170 79 50 61 72 65 6e 74 20 3d 20 30 3b 20 20 20 20  yParent = 0;    
29180 20 20 20 20 20 2f 2a 20 49 66 20 2d 67 72 6f 75       /* If -grou
29190 70 62 79 70 61 72 65 6e 74 20 69 73 20 70 72 65  pbyparent is pre
291a0 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  sent */.  int i;
291b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20            /* To 
291d0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
291e0 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e  azArg[] */.  con
291f0 73 74 20 63 68 61 72 20 2a 7a 49 6e 64 65 6e 74  st char *zIndent
29200 20 3d 20 22 22 3b 20 20 20 20 20 20 20 2f 2a 20   = "";       /* 
29210 48 6f 77 20 6d 75 63 68 20 74 6f 20 69 6e 64 65  How much to inde
29220 6e 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  nt CREATE INDEX 
29230 62 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  by */.  int rc; 
29240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29250 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
29260 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
29270 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d  te3_stmt *pSql =
29280 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43   0;         /* C
29290 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20  ompiled version 
292a0 6f 66 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  of SQL statement
292b0 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a   below */..  /*.
292c0 20 20 2a 2a 20 54 68 69 73 20 53 45 4c 45 43 54    ** This SELECT
292d0 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
292e0 6e 73 20 6f 6e 65 20 72 6f 77 20 66 6f 72 20 65  ns one row for e
292f0 61 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ach foreign key 
29300 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20  constraint.  ** 
29310 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66  in the schema of
29320 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
29330 73 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 20 76  se. The column v
29340 61 6c 75 65 73 20 61 72 65 3a 0a 20 20 2a 2a 0a  alues are:.  **.
29350 20 20 2a 2a 20 30 2e 20 54 68 65 20 74 65 78 74    ** 0. The text
29360 20 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65   of an SQL state
29370 6d 65 6e 74 20 73 69 6d 69 6c 61 72 20 74 6f 3a  ment similar to:
29380 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
29390 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
293a0 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f  LAN SELECT 1 FRO
293b0 4d 20 63 68 69 6c 64 5f 74 61 62 6c 65 20 57 48  M child_table WH
293c0 45 52 45 20 63 68 69 6c 64 5f 6b 65 79 3d 3f 22  ERE child_key=?"
293d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 54 68  .  **.  **    Th
293e0 69 73 20 53 45 4c 45 43 54 20 69 73 20 73 69 6d  is SELECT is sim
293f0 69 6c 61 72 20 74 6f 20 74 68 65 20 6f 6e 65 20  ilar to the one 
29400 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e  that the foreign
29410 20 6b 65 79 73 20 69 6d 70 6c 65 6d 65 6e 74 61   keys implementa
29420 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 6e 65 65  tion.  **    nee
29430 64 73 20 74 6f 20 72 75 6e 20 69 6e 74 65 72 6e  ds to run intern
29440 61 6c 6c 79 20 6f 6e 20 63 68 69 6c 64 20 74 61  ally on child ta
29450 62 6c 65 73 2e 20 49 66 20 74 68 65 72 65 20 69  bles. If there i
29460 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
29470 63 61 6e 0a 20 20 2a 2a 20 20 20 20 62 65 20 75  can.  **    be u
29480 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
29490 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e  this query, then
294a0 20 69 74 20 63 61 6e 20 61 6c 73 6f 20 62 65 20   it can also be 
294b0 75 73 65 64 20 62 79 20 74 68 65 20 46 4b 0a 20  used by the FK. 
294c0 20 2a 2a 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74   **    implement
294d0 61 74 69 6f 6e 20 74 6f 20 6f 70 74 69 6d 69 7a  ation to optimiz
294e0 65 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41  e DELETE or UPDA
294f0 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  TE statements on
29500 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a   the parent.  **
29510 20 20 20 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a      table..  **.
29520 20 20 2a 2a 20 31 2e 20 41 20 47 4c 4f 42 20 70    ** 1. A GLOB p
29530 61 74 74 65 72 6e 20 73 75 69 74 61 62 6c 65 20  attern suitable 
29540 66 6f 72 20 73 71 6c 69 74 65 33 5f 73 74 72 67  for sqlite3_strg
29550 6c 6f 62 28 29 2e 20 49 66 20 74 68 65 20 70 6c  lob(). If the pl
29560 61 6e 20 6f 75 74 70 75 74 20 62 79 0a 20 20 2a  an output by.  *
29570 2a 20 20 20 20 74 68 65 20 45 58 50 4c 41 49 4e  *    the EXPLAIN
29580 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d   QUERY PLAN comm
29590 61 6e 64 20 6d 61 74 63 68 65 73 20 74 68 69 73  and matches this
295a0 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 74   pattern, then t
295b0 68 65 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 20  he schema.  **  
295c0 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e    contains an in
295d0 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65 20  dex that can be 
295e0 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65  used to optimize
295f0 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a   the query..  **
29600 0a 20 20 2a 2a 20 32 2e 20 48 75 6d 61 6e 20 72  .  ** 2. Human r
29610 65 61 64 61 62 6c 65 20 74 65 78 74 20 74 68 61  eadable text tha
29620 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
29630 63 68 69 6c 64 20 74 61 62 6c 65 20 61 6e 64 20  child table and 
29640 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20  columns. e.g..  
29650 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 63  **.  **       "c
29660 68 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64  hild_table(child
29670 5f 6b 65 79 31 2c 20 63 68 69 6c 64 5f 6b 65 79  _key1, child_key
29680 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e  2)".  **.  ** 3.
29690 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   Human readable 
296a0 74 65 78 74 20 74 68 61 74 20 64 65 73 63 72 69  text that descri
296b0 62 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 74  bes the parent t
296c0 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73  able and columns
296d0 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  . e.g..  **.  **
296e0 20 20 20 20 20 20 20 22 70 61 72 65 6e 74 5f 74         "parent_t
296f0 61 62 6c 65 28 70 61 72 65 6e 74 5f 6b 65 79 31  able(parent_key1
29700 2c 20 70 61 72 65 6e 74 5f 6b 65 79 32 29 22 0a  , parent_key2)".
29710 20 20 2a 2a 0a 20 20 2a 2a 20 34 2e 20 41 20 66    **.  ** 4. A f
29720 75 6c 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58  ull CREATE INDEX
29730 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 61   statement for a
29740 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 75  n index that cou
29750 6c 64 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20  ld be used to.  
29760 2a 2a 20 20 20 20 6f 70 74 69 6d 69 7a 65 20 44  **    optimize D
29770 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20  ELETE or UPDATE 
29780 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68  statements on th
29790 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 20  e parent table. 
297a0 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  e.g..  **.  **  
297b0 20 20 20 20 20 22 43 52 45 41 54 45 20 49 4e 44       "CREATE IND
297c0 45 58 20 63 68 69 6c 64 5f 74 61 62 6c 65 5f 63  EX child_table_c
297d0 68 69 6c 64 5f 6b 65 79 20 4f 4e 20 63 68 69 6c  hild_key ON chil
297e0 64 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65  d_table(child_ke
297f0 79 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e  y)".  **.  ** 5.
29800 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
29810 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20   parent table.. 
29820 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 73 65 20 73   **.  ** These s
29830 69 78 20 76 61 6c 75 65 73 20 61 72 65 20 75 73  ix values are us
29840 65 64 20 62 79 20 74 68 65 20 43 20 6c 6f 67 69  ed by the C logi
29850 63 20 62 65 6c 6f 77 20 74 6f 20 67 65 6e 65 72  c below to gener
29860 61 74 65 20 74 68 65 20 72 65 70 6f 72 74 2e 0a  ate the report..
29870 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61    */.  const cha
29880 72 20 2a 7a 53 71 6c 20 3d 0a 20 20 22 53 45 4c  r *zSql =.  "SEL
29890 45 43 54 20 22 0a 20 20 20 20 22 20 20 20 20 20  ECT ".    "     
298a0 27 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  'EXPLAIN QUERY P
298b0 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f  LAN SELECT 1 FRO
298c0 4d 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e  M ' || quote(s.n
298d0 61 6d 65 29 20 7c 7c 20 27 20 57 48 45 52 45 20  ame) || ' WHERE 
298e0 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f  '".    "  || gro
298f0 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28  up_concat(quote(
29900 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 2e 27 20 7c  s.name) || '.' |
29910 7c 20 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d  | quote(f.[from]
29920 29 20 7c 7c 20 27 3d 3f 27 20 22 0a 20 20 20 20  ) || '=?' ".    
29930 22 20 20 7c 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61  "  || fkey_colla
29940 74 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20  te_clause(".    
29950 22 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65  "       f.[table
29960 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74  ], COALESCE(f.[t
29970 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73  o], p.[name]), s
29980 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29  .name, f.[from])
29990 2c 27 20 41 4e 44 20 27 29 22 0a 20 20 20 20 22  ,' AND ')".    "
299a0 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 53  , ".    "     'S
299b0 45 41 52 43 48 20 54 41 42 4c 45 20 27 20 7c 7c  EARCH TABLE ' ||
299c0 20 73 2e 6e 61 6d 65 20 7c 7c 20 27 20 55 53 49   s.name || ' USI
299d0 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
299e0 58 2a 28 27 22 0a 20 20 20 20 22 20 20 7c 7c 20  X*('".    "  || 
299f0 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 27 2a 3d  group_concat('*=
29a00 3f 27 2c 20 27 20 41 4e 44 20 27 29 20 7c 7c 20  ?', ' AND ') || 
29a10 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20  ')'".    ", ".  
29a20 20 20 22 20 20 20 20 20 73 2e 6e 61 6d 65 20 20    "     s.name  
29a30 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f  || '(' || group_
29a40 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c  concat(f.[from],
29a50 20 20 27 2c 20 27 29 20 7c 7c 20 27 29 27 22 0a    ', ') || ')'".
29a60 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20      ", ".    "  
29a70 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20     f.[table] || 
29a80 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e  '(' || group_con
29a90 63 61 74 28 43 4f 41 4c 45 53 43 45 28 66 2e 5b  cat(COALESCE(f.[
29aa0 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 29 20  to], p.[name])) 
29ab0 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22  || ')'".    ", "
29ac0 0a 20 20 20 20 22 20 20 20 20 20 27 43 52 45 41  .    "     'CREA
29ad0 54 45 20 49 4e 44 45 58 20 27 20 7c 7c 20 71 75  TE INDEX ' || qu
29ae0 6f 74 65 28 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27  ote(s.name ||'_'
29af0 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
29b00 66 2e 5b 66 72 6f 6d 5d 2c 20 27 5f 27 29 29 22  f.[from], '_'))"
29b10 0a 20 20 20 20 22 20 20 7c 7c 20 27 20 4f 4e 20  .    "  || ' ON 
29b20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d  ' || quote(s.nam
29b30 65 29 20 7c 7c 20 27 28 27 22 0a 20 20 20 20 22  e) || '('".    "
29b40 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61    || group_conca
29b50 74 28 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d  t(quote(f.[from]
29b60 29 20 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20  ) ||".    "     
29b70 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f     fkey_collate_
29b80 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20  clause(".    "  
29b90 20 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65          f.[table
29ba0 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74  ], COALESCE(f.[t
29bb0 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73  o], p.[name]), s
29bc0 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29  .name, f.[from])
29bd0 2c 20 27 2c 20 27 29 22 0a 20 20 20 20 22 20 20  , ', ')".    "  
29be0 7c 7c 20 27 29 3b 27 22 0a 20 20 20 20 22 2c 20  || ');'".    ", 
29bf0 22 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74  ".    "     f.[t
29c00 61 62 6c 65 5d 20 22 0a 20 20 20 20 22 46 52 4f  able] ".    "FRO
29c10 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
29c20 41 53 20 73 2c 20 70 72 61 67 6d 61 5f 66 6f 72  AS s, pragma_for
29c30 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 28 73 2e  eign_key_list(s.
29c40 6e 61 6d 65 29 20 41 53 20 66 20 22 0a 20 20 20  name) AS f ".   
29c50 20 22 4c 45 46 54 20 4a 4f 49 4e 20 70 72 61 67   "LEFT JOIN prag
29c60 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 20 41 53  ma_table_info AS
29c70 20 70 20 4f 4e 20 28 70 6b 2d 31 3d 73 65 71 20   p ON (pk-1=seq 
29c80 41 4e 44 20 70 2e 61 72 67 3d 66 2e 5b 74 61 62  AND p.arg=f.[tab
29c90 6c 65 5d 29 20 22 0a 20 20 20 20 22 47 52 4f 55  le]) ".    "GROU
29ca0 50 20 42 59 20 73 2e 6e 61 6d 65 2c 20 66 2e 69  P BY s.name, f.i
29cb0 64 20 22 0a 20 20 20 20 22 4f 52 44 45 52 20 42  d ".    "ORDER B
29cc0 59 20 28 43 41 53 45 20 57 48 45 4e 20 3f 20 54  Y (CASE WHEN ? T
29cd0 48 45 4e 20 66 2e 5b 74 61 62 6c 65 5d 20 45 4c  HEN f.[table] EL
29ce0 53 45 20 73 2e 6e 61 6d 65 20 45 4e 44 29 22 0a  SE s.name END)".
29cf0 20 20 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72    ;.  const char
29d00 20 2a 7a 47 6c 6f 62 49 50 4b 20 3d 20 22 53 45   *zGlobIPK = "SE
29d10 41 52 43 48 20 54 41 42 4c 45 20 2a 20 55 53 49  ARCH TABLE * USI
29d20 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  NG INTEGER PRIMA
29d30 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29  RY KEY (rowid=?)
29d40 22 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69  ";..  for(i=2; i
29d50 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
29d60 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33   int n = strlen3
29d70 30 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  0(azArg[i]);.   
29d80 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69   if( n>1 && sqli
29d90 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 76  te3_strnicmp("-v
29da0 65 72 62 6f 73 65 22 2c 20 61 7a 41 72 67 5b 69  erbose", azArg[i
29db0 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ], n)==0 ){.    
29dc0 20 20 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a    bVerbose = 1;.
29dd0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
29de0 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65  f( n>1 && sqlite
29df0 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 67 72 6f  3_strnicmp("-gro
29e00 75 70 62 79 70 61 72 65 6e 74 22 2c 20 61 7a 41  upbyparent", azA
29e10 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a  rg[i], n)==0 ){.
29e20 20 20 20 20 20 20 62 47 72 6f 75 70 42 79 50 61        bGroupByPa
29e30 72 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  rent = 1;.      
29e40 7a 49 6e 64 65 6e 74 20 3d 20 22 20 20 20 20 22  zIndent = "    "
29e50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
29e60 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
29e70 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
29e80 65 3a 20 25 73 20 25 73 20 3f 2d 76 65 72 62 6f  e: %s %s ?-verbo
29e90 73 65 3f 20 3f 2d 67 72 6f 75 70 62 79 70 61 72  se? ?-groupbypar
29ea0 65 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ent?\n",.       
29eb0 20 20 20 61 7a 41 72 67 5b 30 5d 2c 20 61 7a 41     azArg[0], azA
29ec0 72 67 5b 31 5d 0a 20 20 20 20 20 20 29 3b 0a 20  rg[1].      );. 
29ed0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
29ee0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
29ef0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74    }..  /* Regist
29f00 65 72 20 74 68 65 20 66 6b 65 79 5f 63 6f 6c 6c  er the fkey_coll
29f10 61 74 65 5f 63 6c 61 75 73 65 28 29 20 53 51 4c  ate_clause() SQL
29f20 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 72   function */.  r
29f30 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
29f40 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
29f50 22 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c  "fkey_collate_cl
29f60 61 75 73 65 22 2c 20 34 2c 20 53 51 4c 49 54 45  ause", 4, SQLITE
29f70 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 30 2c 20  _UTF8,.      0, 
29f80 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74 65  shellFkeyCollate
29f90 43 6c 61 75 73 65 2c 20 30 2c 20 30 0a 20 20 29  Clause, 0, 0.  )
29fa0 3b 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ;...  if( rc==SQ
29fb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
29fc0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
29fd0 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
29fe0 20 2d 31 2c 20 26 70 53 71 6c 2c 20 30 29 3b 0a   -1, &pSql, 0);.
29ff0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2a000 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
2a010 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
2a020 70 53 71 6c 2c 20 31 2c 20 62 47 72 6f 75 70 42  pSql, 1, bGroupB
2a030 79 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20  yParent);.  }.. 
2a040 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a050 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  OK ){.    int rc
2a060 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72  2;.    char *zPr
2a070 65 76 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  ev = 0;.    whil
2a080 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  e( SQLITE_ROW==s
2a090 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c  qlite3_step(pSql
2a0a0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  ) ){.      int r
2a0b0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73  es = -1;.      s
2a0c0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78  qlite3_stmt *pEx
2a0d0 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20  plain = 0;.     
2a0e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 51   const char *zEQ
2a0f0 50 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  P = (const char*
2a100 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2a110 74 65 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20  text(pSql, 0);. 
2a120 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2a130 2a 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20  *zGlob = (const 
2a140 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
2a150 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
2a160 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  1);.      const 
2a170 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 28 63  char *zFrom = (c
2a180 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
2a190 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
2a1a0 53 71 6c 2c 20 32 29 3b 0a 20 20 20 20 20 20 63  Sql, 2);.      c
2a1b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67  onst char *zTarg
2a1c0 65 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  et = (const char
2a1d0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
2a1e0 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29 3b 0a  _text(pSql, 3);.
2a1f0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2a200 20 2a 7a 43 49 20 3d 20 28 63 6f 6e 73 74 20 63   *zCI = (const c
2a210 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
2a220 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 34  umn_text(pSql, 4
2a230 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
2a240 68 61 72 20 2a 7a 50 61 72 65 6e 74 20 3d 20 28  har *zParent = (
2a250 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
2a260 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
2a270 70 53 71 6c 2c 20 35 29 3b 0a 0a 20 20 20 20 20  pSql, 5);..     
2a280 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
2a290 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51  epare_v2(db, zEQ
2a2a0 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e  P, -1, &pExplain
2a2b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2a2c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2a2d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
2a2e0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
2a2f0 69 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61  ite3_step(pExpla
2a300 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  in) ){.        c
2a310 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6c 61 6e  onst char *zPlan
2a320 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
2a330 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2a340 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29  ext(pExplain, 3)
2a350 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  ;.        res = 
2a360 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
2a370 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  0==sqlite3_strgl
2a380 6f 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c 61 6e 29  ob(zGlob, zPlan)
2a390 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 30  .           || 0
2a3a0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ==sqlite3_strglo
2a3b0 62 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a 50 6c 61  b(zGlobIPK, zPla
2a3c0 6e 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  n).        );.  
2a3d0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
2a3e0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
2a3f0 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20  e(pExplain);.   
2a400 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2a410 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 0a 20  E_OK ) break;.. 
2a420 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29       if( res<0 )
2a430 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
2a440 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
2a450 72 6f 72 3a 20 69 6e 74 65 72 6e 61 6c 20 65 72  ror: internal er
2a460 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 20 20 62  ror");.        b
2a470 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
2a480 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  e{.        if( b
2a490 47 72 6f 75 70 42 79 50 61 72 65 6e 74 0a 20 20  GroupByParent.  
2a4a0 20 20 20 20 20 20 26 26 20 28 62 56 65 72 62 6f        && (bVerbo
2a4b0 73 65 20 7c 7c 20 72 65 73 3d 3d 30 29 0a 20 20  se || res==0).  
2a4c0 20 20 20 20 20 20 26 26 20 28 7a 50 72 65 76 3d        && (zPrev=
2a4d0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  =0 || sqlite3_st
2a4e0 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 2c 20 7a  ricmp(zParent, z
2a4f0 50 72 65 76 29 29 0a 20 20 20 20 20 20 20 20 29  Prev)).        )
2a500 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
2a510 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20  printf(out, "-- 
2a520 50 61 72 65 6e 74 20 74 61 62 6c 65 20 25 73 5c  Parent table %s\
2a530 6e 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20  n", zParent);.  
2a540 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2a550 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 20 20 20  free(zPrev);.   
2a560 20 20 20 20 20 20 20 7a 50 72 65 76 20 3d 20 73         zPrev = s
2a570 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2a580 25 73 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20  %s", zParent);. 
2a590 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2a5a0 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
2a5b0 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
2a5c0 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73 20  intf(out, "%s%s 
2a5d0 2d 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49 6e 64 65  --> %s\n", zInde
2a5e0 6e 74 2c 20 7a 43 49 2c 20 7a 54 61 72 67 65 74  nt, zCI, zTarget
2a5f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2a600 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b   if( bVerbose ){
2a610 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
2a620 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 2f 2a  rintf(out, "%s/*
2a630 20 6e 6f 20 65 78 74 72 61 20 69 6e 64 65 78 65   no extra indexe
2a640 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 25  s required for %
2a650 73 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20  s -> %s */\n",. 
2a660 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 49 6e               zIn
2a670 64 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20 7a 54 61  dent, zFrom, zTa
2a680 72 67 65 74 0a 20 20 20 20 20 20 20 20 20 20 29  rget.          )
2a690 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a6a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
2a6b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72 65 76  lite3_free(zPrev
2a6c0 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d  );..    if( rc!=
2a6d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a6e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2a6f0 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71  derr, "%s\n", sq
2a700 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
2a710 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  );.    }..    rc
2a720 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  2 = sqlite3_fina
2a730 6c 69 7a 65 28 70 53 71 6c 29 3b 0a 20 20 20 20  lize(pSql);.    
2a740 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a750 4b 20 26 26 20 72 63 32 21 3d 53 51 4c 49 54 45  K && rc2!=SQLITE
2a760 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2a770 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 72 61 77  = rc2;.      raw
2a780 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2a790 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
2a7a0 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
2a7b0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2a7c0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2a7d0 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  r, "%s\n", sqlit
2a7e0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
2a7f0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2a800 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
2a810 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 6c  mentation of ".l
2a820 69 6e 74 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  int" dot command
2a830 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a840 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a  lintDotCommand(.
2a850 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
2a860 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  tate,           
2a870 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65    /* Current she
2a880 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f  ll tool state */
2a890 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
2a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8b0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
2a8c0 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
2a8d0 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a  to dot command *
2a8e0 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20  /.  int nArg    
2a8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a900 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2a910 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72   entries in azAr
2a920 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  g[] */.){.  int 
2a930 6e 3b 0a 20 20 6e 20 3d 20 28 6e 41 72 67 3e 3d  n;.  n = (nArg>=
2a940 32 20 3f 20 73 74 72 6c 65 6e 33 30 28 61 7a 41  2 ? strlen30(azA
2a950 72 67 5b 31 5d 29 20 3a 20 30 29 3b 0a 20 20 69  rg[1]) : 0);.  i
2a960 66 28 20 6e 3c 31 20 7c 7c 20 73 71 6c 69 74 65  f( n<1 || sqlite
2a970 33 5f 73 74 72 6e 69 63 6d 70 28 61 7a 41 72 67  3_strnicmp(azArg
2a980 5b 31 5d 2c 20 22 66 6b 65 79 2d 69 6e 64 65 78  [1], "fkey-index
2a990 65 73 22 2c 20 6e 29 20 29 20 67 6f 74 6f 20 75  es", n) ) goto u
2a9a0 73 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 6c  sage;.  return l
2a9b0 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28 70  intFkeyIndexes(p
2a9c0 53 74 61 74 65 2c 20 61 7a 41 72 67 2c 20 6e 41  State, azArg, nA
2a9d0 72 67 29 3b 0a 0a 20 75 73 61 67 65 3a 0a 20 20  rg);.. usage:.  
2a9e0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2a9f0 72 2c 20 22 55 73 61 67 65 20 25 73 20 73 75 62  r, "Usage %s sub
2aa00 2d 63 6f 6d 6d 61 6e 64 20 3f 73 77 69 74 63 68  -command ?switch
2aa10 65 73 2e 2e 2e 3f 5c 6e 22 2c 20 61 7a 41 72 67  es...?\n", azArg
2aa20 5b 30 5d 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e  [0]);.  raw_prin
2aa30 74 66 28 73 74 64 65 72 72 2c 20 22 57 68 65 72  tf(stderr, "Wher
2aa40 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 20 61  e sub-commands a
2aa50 72 65 3a 5c 6e 22 29 3b 0a 20 20 72 61 77 5f 70  re:\n");.  raw_p
2aa60 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20  rintf(stderr, " 
2aa70 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 5c     fkey-indexes\
2aa80 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  n");.  return SQ
2aa90 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 23  LITE_ERROR;.}..#
2aaa0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2aab0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2aac0 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
2aad0 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49  (SQLITE_HAVE_ZLI
2aae0 42 29 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  B)./************
2aaf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab30 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 22 2e 61  *****.** The ".a
2ab40 72 63 68 69 76 65 22 20 6f 72 20 22 2e 61 72 22  rchive" or ".ar"
2ab50 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 0a 2f 2a   command..*/../*
2ab60 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 72 65  .** Structure re
2ab70 70 72 65 73 65 6e 74 69 6e 67 20 61 20 73 69 6e  presenting a sin
2ab80 67 6c 65 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e  gle ".ar" comman
2ab90 64 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  d..*/.typedef st
2aba0 72 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20 41  ruct ArCommand A
2abb0 72 43 6f 6d 6d 61 6e 64 3b 0a 73 74 72 75 63 74  rCommand;.struct
2abc0 20 41 72 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20 75   ArCommand {.  u
2abd0 38 20 65 43 6d 64 3b 20 20 20 20 20 20 20 20 20  8 eCmd;         
2abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2abf0 2a 20 41 6e 20 41 52 5f 43 4d 44 5f 2a 20 76 61  * An AR_CMD_* va
2ac00 6c 75 65 20 2a 2f 0a 20 20 75 38 20 62 56 65 72  lue */.  u8 bVer
2ac10 62 6f 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  bose;           
2ac20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2ac30 20 69 66 20 2d 2d 76 65 72 62 6f 73 65 20 2a 2f   if --verbose */
2ac40 0a 20 20 75 38 20 62 5a 69 70 3b 20 20 20 20 20  .  u8 bZip;     
2ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac60 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2ac70 65 20 61 72 63 68 69 76 65 20 69 73 20 61 20 5a  e archive is a Z
2ac80 49 50 20 2a 2f 0a 20 20 75 38 20 62 44 72 79 52  IP */.  u8 bDryR
2ac90 75 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  un;             
2aca0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2acb0 69 66 20 2d 2d 64 72 79 2d 72 75 6e 20 2a 2f 0a  if --dry-run */.
2acc0 20 20 75 38 20 62 41 70 70 65 6e 64 3b 20 20 20    u8 bAppend;   
2acd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ace0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 61    /* True if --a
2acf0 70 70 65 6e 64 20 2a 2f 0a 20 20 75 38 20 66 72  ppend */.  u8 fr
2ad00 6f 6d 43 6d 64 4c 69 6e 65 3b 20 20 20 20 20 20  omCmdLine;      
2ad10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75             /* Ru
2ad20 6e 20 66 72 6f 6d 20 2d 41 20 69 6e 73 74 65 61  n from -A instea
2ad30 64 20 6f 66 20 2e 61 72 63 68 69 76 65 20 2a 2f  d of .archive */
2ad40 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20  .  int nArg;    
2ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ad70 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  command argument
2ad80 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 72  s */.  char *zSr
2ad90 63 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  cTable;         
2ada0 20 20 20 20 20 20 20 2f 2a 20 22 73 71 6c 61 72         /* "sqlar
2adb0 22 2c 20 22 7a 69 70 66 69 6c 65 28 24 66 69 6c  ", "zipfile($fil
2adc0 65 29 22 20 6f 72 20 22 7a 69 70 22 20 2a 2f 0a  e)" or "zip" */.
2add0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
2ade0 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2adf0 20 20 2f 2a 20 2d 2d 66 69 6c 65 20 61 72 67 75    /* --file argu
2ae00 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ment, or NULL */
2ae10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2ae20 44 69 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Dir;            
2ae30 20 20 20 2f 2a 20 2d 2d 64 69 72 65 63 74 6f 72     /* --director
2ae40 79 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e  y argument, or N
2ae50 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ULL */.  char **
2ae60 61 7a 41 72 67 3b 20 20 20 20 20 20 20 20 20 20  azArg;          
2ae70 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
2ae80 79 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67  y of command arg
2ae90 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 53 68 65 6c  uments */.  Shel
2aea0 6c 53 74 61 74 65 20 2a 70 3b 20 20 20 20 20 20  lState *p;      
2aeb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2aec0 68 65 6c 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  hell state */.  
2aed0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
2aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aef0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 74  /* Database cont
2af00 61 69 6e 69 6e 67 20 74 68 65 20 61 72 63 68 69  aining the archi
2af10 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ve */.};../*.** 
2af20 50 72 69 6e 74 20 61 20 75 73 61 67 65 20 6d 65  Print a usage me
2af30 73 73 61 67 65 20 66 6f 72 20 74 68 65 20 2e 61  ssage for the .a
2af40 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64  r command to std
2af50 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20 53  err and return S
2af60 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a  QLITE_ERROR..*/.
2af70 73 74 61 74 69 63 20 69 6e 74 20 61 72 55 73 61  static int arUsa
2af80 67 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 73  ge(FILE *f){.  s
2af90 68 6f 77 48 65 6c 70 28 66 2c 22 61 72 63 68 69  howHelp(f,"archi
2afa0 76 65 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ve");.  return S
2afb0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
2afc0 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65  /*.** Print an e
2afd0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72  rror message for
2afe0 20 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64   the .ar command
2aff0 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72   to stderr and r
2b000 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
2b010 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69  _ERROR..*/.stati
2b020 63 20 69 6e 74 20 61 72 45 72 72 6f 72 4d 73 67  c int arErrorMsg
2b030 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c  (ArCommand *pAr,
2b040 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
2b050 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
2b060 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
2b070 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
2b080 20 7a 46 6d 74 29 3b 0a 20 20 7a 20 3d 20 73 71   zFmt);.  z = sq
2b090 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
2b0a0 46 6d 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  Fmt, ap);.  va_e
2b0b0 6e 64 28 61 70 29 3b 0a 20 20 75 74 66 38 5f 70  nd(ap);.  utf8_p
2b0c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2b0d0 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b  rror: %s\n", z);
2b0e0 0a 20 20 69 66 28 20 70 41 72 2d 3e 66 72 6f 6d  .  if( pAr->from
2b0f0 43 6d 64 4c 69 6e 65 20 29 7b 0a 20 20 20 20 75  CmdLine ){.    u
2b100 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2b110 72 2c 20 22 55 73 65 20 5c 22 2d 41 5c 22 20 66  r, "Use \"-A\" f
2b120 6f 72 20 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 29  or more help\n")
2b130 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
2b140 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2b150 72 2c 20 22 55 73 65 20 5c 22 2e 61 72 63 68 69  r, "Use \".archi
2b160 76 65 20 2d 2d 68 65 6c 70 5c 22 20 66 6f 72 20  ve --help\" for 
2b170 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 29 3b 0a 20  more help\n");. 
2b180 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
2b190 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(z);.  return S
2b1a0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
2b1b0 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f 72  /*.** Values for
2b1c0 20 41 72 43 6f 6d 6d 61 6e 64 2e 65 43 6d 64 2e   ArCommand.eCmd.
2b1d0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 43  .*/.#define AR_C
2b1e0 4d 44 5f 43 52 45 41 54 45 20 20 20 20 20 20 20  MD_CREATE       
2b1f0 31 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44  1.#define AR_CMD
2b200 5f 55 50 44 41 54 45 20 20 20 20 20 20 20 32 0a  _UPDATE       2.
2b210 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 49  #define AR_CMD_I
2b220 4e 53 45 52 54 20 20 20 20 20 20 20 33 0a 23 64  NSERT       3.#d
2b230 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 45 58 54  efine AR_CMD_EXT
2b240 52 41 43 54 20 20 20 20 20 20 34 0a 23 64 65 66  RACT      4.#def
2b250 69 6e 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 20  ine AR_CMD_LIST 
2b260 20 20 20 20 20 20 20 20 35 0a 23 64 65 66 69 6e          5.#defin
2b270 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 20 20 20  e AR_CMD_HELP   
2b280 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 4f        6../*.** O
2b290 74 68 65 72 20 28 6e 6f 6e 2d 63 6f 6d 6d 61 6e  ther (non-comman
2b2a0 64 29 20 73 77 69 74 63 68 65 73 2e 0a 2a 2f 0a  d) switches..*/.
2b2b0 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43  #define AR_SWITC
2b2c0 48 5f 56 45 52 42 4f 53 45 20 20 20 20 20 37 0a  H_VERBOSE     7.
2b2d0 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43  #define AR_SWITC
2b2e0 48 5f 46 49 4c 45 20 20 20 20 20 20 20 20 38 0a  H_FILE        8.
2b2f0 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43  #define AR_SWITC
2b300 48 5f 44 49 52 45 43 54 4f 52 59 20 20 20 39 0a  H_DIRECTORY   9.
2b310 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43  #define AR_SWITC
2b320 48 5f 41 50 50 45 4e 44 20 20 20 20 20 31 30 0a  H_APPEND     10.
2b330 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43  #define AR_SWITC
2b340 48 5f 44 52 59 52 55 4e 20 20 20 20 20 31 31 0a  H_DRYRUN     11.
2b350 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 50 72  .static int arPr
2b360 6f 63 65 73 73 53 77 69 74 63 68 28 41 72 43 6f  ocessSwitch(ArCo
2b370 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 69 6e 74 20  mmand *pAr, int 
2b380 65 53 77 69 74 63 68 2c 20 63 6f 6e 73 74 20 63  eSwitch, const c
2b390 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73 77  har *zArg){.  sw
2b3a0 69 74 63 68 28 20 65 53 77 69 74 63 68 20 29 7b  itch( eSwitch ){
2b3b0 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44  .    case AR_CMD
2b3c0 5f 43 52 45 41 54 45 3a 0a 20 20 20 20 63 61 73  _CREATE:.    cas
2b3d0 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54  e AR_CMD_EXTRACT
2b3e0 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d  :.    case AR_CM
2b3f0 44 5f 4c 49 53 54 3a 0a 20 20 20 20 63 61 73 65  D_LIST:.    case
2b400 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 3a 0a   AR_CMD_UPDATE:.
2b410 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
2b420 49 4e 53 45 52 54 3a 0a 20 20 20 20 63 61 73 65  INSERT:.    case
2b430 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20   AR_CMD_HELP:.  
2b440 20 20 20 20 69 66 28 20 70 41 72 2d 3e 65 43 6d      if( pAr->eCm
2b450 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  d ){.        ret
2b460 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70  urn arErrorMsg(p
2b470 41 72 2c 20 22 6d 75 6c 74 69 70 6c 65 20 63 6f  Ar, "multiple co
2b480 6d 6d 61 6e 64 20 6f 70 74 69 6f 6e 73 22 29 3b  mmand options");
2b490 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2b4a0 41 72 2d 3e 65 43 6d 64 20 3d 20 65 53 77 69 74  Ar->eCmd = eSwit
2b4b0 63 68 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ch;.      break;
2b4c0 0a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57  ..    case AR_SW
2b4d0 49 54 43 48 5f 44 52 59 52 55 4e 3a 0a 20 20 20  ITCH_DRYRUN:.   
2b4e0 20 20 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20     pAr->bDryRun 
2b4f0 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
2b500 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57  ;.    case AR_SW
2b510 49 54 43 48 5f 56 45 52 42 4f 53 45 3a 0a 20 20  ITCH_VERBOSE:.  
2b520 20 20 20 20 70 41 72 2d 3e 62 56 65 72 62 6f 73      pAr->bVerbos
2b530 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  e = 1;.      bre
2b540 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f  ak;.    case AR_
2b550 53 57 49 54 43 48 5f 41 50 50 45 4e 44 3a 0a 20  SWITCH_APPEND:. 
2b560 20 20 20 20 20 70 41 72 2d 3e 62 41 70 70 65 6e       pAr->bAppen
2b570 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20  d = 1;.      /* 
2b580 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 2d  Fall thru into -
2b590 2d 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73  -file */.    cas
2b5a0 65 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45  e AR_SWITCH_FILE
2b5b0 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a 46 69  :.      pAr->zFi
2b5c0 6c 65 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20  le = zArg;.     
2b5d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2b5e0 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43   AR_SWITCH_DIREC
2b5f0 54 4f 52 59 3a 0a 20 20 20 20 20 20 70 41 72 2d  TORY:.      pAr-
2b600 3e 7a 44 69 72 20 3d 20 7a 41 72 67 3b 0a 20 20  >zDir = zArg;.  
2b610 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
2b620 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b630 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  OK;.}../*.** Par
2b640 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  se the command l
2b650 69 6e 65 20 66 6f 72 20 61 6e 20 22 2e 61 72 22  ine for an ".ar"
2b660 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 65 20 72 65   command. The re
2b670 73 75 6c 74 73 20 61 72 65 20 77 72 69 74 74 65  sults are writte
2b680 6e 20 69 6e 74 6f 0a 2a 2a 20 73 74 72 75 63 74  n into.** struct
2b690 75 72 65 20 28 2a 70 41 72 29 2e 20 53 51 4c 49  ure (*pAr). SQLI
2b6a0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2b6b0 64 20 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64  d if the command
2b6c0 20 6c 69 6e 65 20 69 73 20 70 61 72 73 65 64 0a   line is parsed.
2b6d0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ** successfully,
2b6e0 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
2b6f0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77  ror message is w
2b700 72 69 74 74 65 6e 20 74 6f 20 73 74 64 65 72 72  ritten to stderr
2b710 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f   and .** SQLITE_
2b720 45 52 52 4f 52 20 72 65 74 75 72 6e 65 64 2e 0a  ERROR returned..
2b730 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
2b740 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28 0a 20 20  ParseCommand(.  
2b750 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20  char **azArg,   
2b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b770 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75  /* Array of argu
2b780 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
2b790 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  dot command */. 
2b7a0 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
2b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
2b7d0 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d  tries in azArg[]
2b7e0 20 2a 2f 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20   */.  ArCommand 
2b7f0 2a 70 41 72 20 20 20 20 20 20 20 20 20 20 20 20  *pAr            
2b800 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74        /* Populat
2b810 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  e this object */
2b820 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 41 72 53  .){.  struct ArS
2b830 77 69 74 63 68 20 7b 0a 20 20 20 20 63 6f 6e 73  witch {.    cons
2b840 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 3b 0a 20  t char *zLong;. 
2b850 20 20 20 63 68 61 72 20 63 53 68 6f 72 74 3b 0a     char cShort;.
2b860 20 20 20 20 75 38 20 65 53 77 69 74 63 68 3b 0a      u8 eSwitch;.
2b870 20 20 20 20 75 38 20 62 41 72 67 3b 0a 20 20 7d      u8 bArg;.  }
2b880 20 61 53 77 69 74 63 68 5b 5d 20 3d 20 7b 0a 20   aSwitch[] = {. 
2b890 20 20 20 7b 20 22 63 72 65 61 74 65 22 2c 20 20     { "create",  
2b8a0 20 20 27 63 27 2c 20 41 52 5f 43 4d 44 5f 43 52    'c', AR_CMD_CR
2b8b0 45 41 54 45 2c 20 20 20 20 20 20 20 30 20 7d 2c  EATE,       0 },
2b8c0 0a 20 20 20 20 7b 20 22 65 78 74 72 61 63 74 22  .    { "extract"
2b8d0 2c 20 20 20 27 78 27 2c 20 41 52 5f 43 4d 44 5f  ,   'x', AR_CMD_
2b8e0 45 58 54 52 41 43 54 2c 20 20 20 20 20 20 30 20  EXTRACT,      0 
2b8f0 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 73 65 72 74  },.    { "insert
2b900 22 2c 20 20 20 20 27 69 27 2c 20 41 52 5f 43 4d  ",    'i', AR_CM
2b910 44 5f 49 4e 53 45 52 54 2c 20 20 20 20 20 20 20  D_INSERT,       
2b920 30 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 69 73 74  0 },.    { "list
2b930 22 2c 20 20 20 20 20 20 27 74 27 2c 20 41 52 5f  ",      't', AR_
2b940 43 4d 44 5f 4c 49 53 54 2c 20 20 20 20 20 20 20  CMD_LIST,       
2b950 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 75 70    0 },.    { "up
2b960 64 61 74 65 22 2c 20 20 20 20 27 75 27 2c 20 41  date",    'u', A
2b970 52 5f 43 4d 44 5f 55 50 44 41 54 45 2c 20 20 20  R_CMD_UPDATE,   
2b980 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22      0 },.    { "
2b990 68 65 6c 70 22 2c 20 20 20 20 20 20 27 68 27 2c  help",      'h',
2b9a0 20 41 52 5f 43 4d 44 5f 48 45 4c 50 2c 20 20 20   AR_CMD_HELP,   
2b9b0 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b        0 },.    {
2b9c0 20 22 76 65 72 62 6f 73 65 22 2c 20 20 20 27 76   "verbose",   'v
2b9d0 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52  ', AR_SWITCH_VER
2b9e0 42 4f 53 45 2c 20 20 20 30 20 7d 2c 0a 20 20 20  BOSE,   0 },.   
2b9f0 20 7b 20 22 66 69 6c 65 22 2c 20 20 20 20 20 20   { "file",      
2ba00 27 66 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 46  'f', AR_SWITCH_F
2ba10 49 4c 45 2c 20 20 20 20 20 20 31 20 7d 2c 0a 20  ILE,      1 },. 
2ba20 20 20 20 7b 20 22 61 70 70 65 6e 64 22 2c 20 20     { "append",  
2ba30 20 20 27 61 27 2c 20 41 52 5f 53 57 49 54 43 48    'a', AR_SWITCH
2ba40 5f 41 50 50 45 4e 44 2c 20 20 20 20 31 20 7d 2c  _APPEND,    1 },
2ba50 0a 20 20 20 20 7b 20 22 64 69 72 65 63 74 6f 72  .    { "director
2ba60 79 22 2c 20 27 43 27 2c 20 41 52 5f 53 57 49 54  y", 'C', AR_SWIT
2ba70 43 48 5f 44 49 52 45 43 54 4f 52 59 2c 20 31 20  CH_DIRECTORY, 1 
2ba80 7d 2c 0a 20 20 20 20 7b 20 22 64 72 79 72 75 6e  },.    { "dryrun
2ba90 22 2c 20 20 20 20 27 6e 27 2c 20 41 52 5f 53 57  ",    'n', AR_SW
2baa0 49 54 43 48 5f 44 52 59 52 55 4e 2c 20 20 20 20  ITCH_DRYRUN,    
2bab0 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  0 },.  };.  int 
2bac0 6e 53 77 69 74 63 68 20 3d 20 73 69 7a 65 6f 66  nSwitch = sizeof
2bad0 28 61 53 77 69 74 63 68 29 20 2f 20 73 69 7a 65  (aSwitch) / size
2bae0 6f 66 28 73 74 72 75 63 74 20 41 72 53 77 69 74  of(struct ArSwit
2baf0 63 68 29 3b 0a 20 20 73 74 72 75 63 74 20 41 72  ch);.  struct Ar
2bb00 53 77 69 74 63 68 20 2a 70 45 6e 64 20 3d 20 26  Switch *pEnd = &
2bb10 61 53 77 69 74 63 68 5b 6e 53 77 69 74 63 68 5d  aSwitch[nSwitch]
2bb20 3b 0a 0a 20 20 69 66 28 20 6e 41 72 67 3c 3d 31  ;..  if( nArg<=1
2bb30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
2bb40 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 72 6f  ntf(stderr, "Wro
2bb50 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
2bb60 75 6d 65 6e 74 73 2e 20 20 55 73 61 67 65 3a 5c  uments.  Usage:\
2bb70 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n");.    return 
2bb80 61 72 55 73 61 67 65 28 73 74 64 65 72 72 29 3b  arUsage(stderr);
2bb90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
2bba0 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 31 5d  ar *z = azArg[1]
2bbb0 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d  ;.    if( z[0]!=
2bbc0 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  '-' ){.      /* 
2bbd0 54 72 61 64 69 74 69 6f 6e 61 6c 20 73 74 79 6c  Traditional styl
2bbe0 65 20 5b 74 61 72 5d 20 69 6e 76 6f 63 61 74 69  e [tar] invocati
2bbf0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
2bc00 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 72  i;.      int iAr
2bc10 67 20 3d 20 32 3b 0a 20 20 20 20 20 20 66 6f 72  g = 2;.      for
2bc20 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  (i=0; z[i]; i++)
2bc30 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
2bc40 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a  char *zArg = 0;.
2bc50 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2bc60 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20  rSwitch *pOpt;. 
2bc70 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d         for(pOpt=
2bc80 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70  &aSwitch[0]; pOp
2bc90 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b  t<pEnd; pOpt++){
2bca0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
2bcb0 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72  [i]==pOpt->cShor
2bcc0 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  t ) break;.     
2bcd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2bce0 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20   pOpt==pEnd ){. 
2bcf0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2bd00 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20  arErrorMsg(pAr, 
2bd10 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70  "unrecognized op
2bd20 74 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29  tion: %c", z[i])
2bd30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2bd40 20 20 20 20 69 66 28 20 70 4f 70 74 2d 3e 62 41      if( pOpt->bA
2bd50 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rg ){.          
2bd60 69 66 28 20 69 41 72 67 3e 3d 6e 41 72 67 20 29  if( iArg>=nArg )
2bd70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
2bd80 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28  turn arErrorMsg(
2bd90 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71  pAr, "option req
2bda0 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e  uires an argumen
2bdb0 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20  t: %c",z[i]);.  
2bdc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bdd0 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67      zArg = azArg
2bde0 5b 69 41 72 67 2b 2b 5d 3b 0a 20 20 20 20 20 20  [iArg++];.      
2bdf0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2be00 61 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28  arProcessSwitch(
2be10 70 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74  pAr, pOpt->eSwit
2be20 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75  ch, zArg) ) retu
2be30 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
2be40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2be50 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d  Ar->nArg = nArg-
2be60 69 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20  iArg;.      if( 
2be70 70 41 72 2d 3e 6e 41 72 67 3e 30 20 29 7b 0a 20  pAr->nArg>0 ){. 
2be80 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72         pAr->azAr
2be90 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 5d  g = &azArg[iArg]
2bea0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2beb0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  lse{.      /* No
2bec0 6e 2d 74 72 61 64 69 74 69 6f 6e 61 6c 20 69 6e  n-traditional in
2bed0 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  vocation */.    
2bee0 20 20 69 6e 74 20 69 41 72 67 3b 0a 20 20 20 20    int iArg;.    
2bef0 20 20 66 6f 72 28 69 41 72 67 3d 31 3b 20 69 41    for(iArg=1; iA
2bf00 72 67 3c 6e 41 72 67 3b 20 69 41 72 67 2b 2b 29  rg<nArg; iArg++)
2bf10 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b  {.        int n;
2bf20 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 61 7a 41  .        z = azA
2bf30 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20  rg[iArg];.      
2bf40 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20    if( z[0]!='-' 
2bf50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2bf60 41 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f  All remaining co
2bf70 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73  mmand line words
2bf80 20 61 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67   are command arg
2bf90 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 20  uments. */.     
2bfa0 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20       pAr->azArg 
2bfb0 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a  = &azArg[iArg];.
2bfc0 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e            pAr->n
2bfd0 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b  Arg = nArg-iArg;
2bfe0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2bff0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c000 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30      n = strlen30
2c010 28 7a 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  (z);..        if
2c020 28 20 7a 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20  ( z[1]!='-' ){. 
2c030 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
2c040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
2c050 20 6f 72 20 6d 6f 72 65 20 73 68 6f 72 74 20 6f   or more short o
2c060 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ptions */.      
2c070 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
2c080 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2c090 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2c0a0 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  zArg = 0;.      
2c0b0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53        struct ArS
2c0c0 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20  witch *pOpt;.   
2c0d0 20 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70           for(pOp
2c0e0 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70  t=&aSwitch[0]; p
2c0f0 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b  Opt<pEnd; pOpt++
2c100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2c110 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d   if( z[i]==pOpt-
2c120 3e 63 53 68 6f 72 74 20 29 20 62 72 65 61 6b 3b  >cShort ) break;
2c130 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2c140 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2c150 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20  Opt==pEnd ){.   
2c160 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2c170 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72  n arErrorMsg(pAr
2c180 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20  , "unrecognized 
2c190 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69  option: %c", z[i
2c1a0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
2c1b0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
2c1c0 28 20 70 4f 70 74 2d 3e 62 41 72 67 20 29 7b 0a  ( pOpt->bArg ){.
2c1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2c1e0 28 20 69 3c 28 6e 2d 31 29 20 29 7b 0a 20 20 20  ( i<(n-1) ){.   
2c1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 41 72               zAr
2c200 67 20 3d 20 26 7a 5b 69 2b 31 5d 3b 0a 20 20 20  g = &z[i+1];.   
2c210 20 20 20 20 20 20 20 20 20 20 20 20 20 69 20 3d               i =
2c220 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
2c230 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c240 20 20 20 20 20 20 20 20 20 69 66 28 20 69 41 72           if( iAr
2c250 67 3e 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20  g>=(nArg-1) ){. 
2c260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c270 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
2c280 73 67 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20  sg(pAr, "option 
2c290 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75  requires an argu
2c2a0 6d 65 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b  ment: %c",z[i]);
2c2b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c2c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2c2d0 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b     zArg = azArg[
2c2e0 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20  ++iArg];.       
2c2f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c310 20 20 20 69 66 28 20 61 72 50 72 6f 63 65 73 73     if( arProcess
2c320 53 77 69 74 63 68 28 70 41 72 2c 20 70 4f 70 74  Switch(pAr, pOpt
2c330 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29  ->eSwitch, zArg)
2c340 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2c350 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
2c360 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
2c370 65 20 69 66 28 20 7a 5b 32 5d 3d 3d 27 5c 30 27  e if( z[2]=='\0'
2c380 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2c390 20 41 20 2d 2d 20 6f 70 74 69 6f 6e 2c 20 69 6e   A -- option, in
2c3a0 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 6c  dicating that al
2c3b0 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d  l remaining comm
2c3c0 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 0a 20  and line words. 
2c3d0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20           ** are 
2c3e0 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  command argument
2c3f0 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  s.  */.         
2c400 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61   pAr->azArg = &a
2c410 7a 41 72 67 5b 69 41 72 67 2b 31 5d 3b 0a 20 20  zArg[iArg+1];.  
2c420 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72          pAr->nAr
2c430 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 2d 31 3b  g = nArg-iArg-1;
2c440 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2c450 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2c460 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  .          /* A 
2c470 6c 6f 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  long option */. 
2c480 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
2c490 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 20 20  har *zArg = 0;  
2c4a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
2c4b0 67 75 6d 65 6e 74 20 66 6f 72 20 6f 70 74 69 6f  gument for optio
2c4c0 6e 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20  n, if any */.   
2c4d0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72         struct Ar
2c4e0 53 77 69 74 63 68 20 2a 70 4d 61 74 63 68 20 3d  Switch *pMatch =
2c4f0 20 30 3b 20 20 20 20 20 20 2f 2a 20 4d 61 74 63   0;      /* Matc
2c500 68 69 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  hing option */. 
2c510 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2c520 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 20  ArSwitch *pOpt; 
2c530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
2c540 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
2c550 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26 61 53      for(pOpt=&aS
2c560 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70  witch[0]; pOpt<p
2c570 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20  End; pOpt++){.  
2c580 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
2c590 63 68 61 72 20 2a 7a 4c 6f 6e 67 20 3d 20 70 4f  char *zLong = pO
2c5a0 70 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20 20 20 20  pt->zLong;.     
2c5b0 20 20 20 20 20 20 20 69 66 28 20 28 6e 2d 32 29         if( (n-2)
2c5c0 3c 3d 73 74 72 6c 65 6e 33 30 28 7a 4c 6f 6e 67  <=strlen30(zLong
2c5d0 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 26  ) && 0==memcmp(&
2c5e0 7a 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c 20 6e 2d 32  z[2], zLong, n-2
2c5f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2c600 20 20 20 69 66 28 20 70 4d 61 74 63 68 20 29 7b     if( pMatch ){
2c610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c620 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
2c630 73 67 28 70 41 72 2c 20 22 61 6d 62 69 67 75 6f  sg(pAr, "ambiguo
2c640 75 73 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 7a  us option: %s",z
2c650 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2c660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c670 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d          pMatch =
2c680 20 70 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20   pOpt;.         
2c690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c6a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2c6b0 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ..          if( 
2c6c0 70 4d 61 74 63 68 3d 3d 30 20 29 7b 0a 20 20 20  pMatch==0 ){.   
2c6d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2c6e0 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20  arErrorMsg(pAr, 
2c6f0 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70  "unrecognized op
2c700 74 69 6f 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a 20  tion: %s", z);. 
2c710 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c720 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 2d       if( pMatch-
2c730 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20  >bArg ){.       
2c740 20 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d 28       if( iArg>=(
2c750 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20  nArg-1) ){.     
2c760 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2c770 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20  arErrorMsg(pAr, 
2c780 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73  "option requires
2c790 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 73   an argument: %s
2c7a0 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  ", z);.         
2c7b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c7c0 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 2b 2b   zArg = azArg[++
2c7d0 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 20  iArg];.         
2c7e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
2c7f0 20 61 72 50 72 6f 63 65 73 73 53 77 69 74 63 68   arProcessSwitch
2c800 28 70 41 72 2c 20 70 4d 61 74 63 68 2d 3e 65 53  (pAr, pMatch->eS
2c810 77 69 74 63 68 2c 20 7a 41 72 67 29 20 29 20 72  witch, zArg) ) r
2c820 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2c830 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
2c840 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2c850 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2c860 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
2c870 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
2c880 6d 65 73 20 74 68 61 74 20 61 6c 6c 20 61 72 67  mes that all arg
2c890 75 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 68  uments within th
2c8a0 65 20 41 72 43 6f 6d 6d 61 6e 64 2e 61 7a 41 72  e ArCommand.azAr
2c8b0 67 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 72 65 66  g[].** array ref
2c8c0 65 72 20 74 6f 20 61 72 63 68 69 76 65 20 6d 65  er to archive me
2c8d0 6d 62 65 72 73 2c 20 61 73 20 66 6f 72 20 74 68  mbers, as for th
2c8e0 65 20 2d 2d 65 78 74 72 61 63 74 20 6f 72 20 2d  e --extract or -
2c8f0 2d 6c 69 73 74 20 63 6f 6d 6d 61 6e 64 73 2e 20  -list commands. 
2c900 0a 2a 2a 20 49 74 20 63 68 65 63 6b 73 20 74 68  .** It checks th
2c910 61 74 20 65 61 63 68 20 6f 66 20 74 68 65 6d 20  at each of them 
2c920 61 72 65 20 70 72 65 73 65 6e 74 2e 20 49 66 20  are present. If 
2c930 61 6e 79 20 73 70 65 63 69 66 69 65 64 20 66 69  any specified fi
2c940 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 70 72 65  le is not.** pre
2c950 73 65 6e 74 20 69 6e 20 74 68 65 20 61 72 63 68  sent in the arch
2c960 69 76 65 2c 20 61 6e 20 65 72 72 6f 72 20 69 73  ive, an error is
2c970 20 70 72 69 6e 74 65 64 20 74 6f 20 73 74 64 65   printed to stde
2c980 72 72 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 0a  rr and an error.
2c990 2a 2a 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  ** code returned
2c9a0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
2c9b0 61 6c 6c 20 73 70 65 63 69 66 69 65 64 20 61 72  all specified ar
2c9c0 67 75 6d 65 6e 74 73 20 61 72 65 20 70 72 65 73  guments are pres
2c9d0 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72  ent in.** the ar
2c9e0 63 68 69 76 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  chive, SQLITE_OK
2c9f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
2ca00 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2ca10 6e 20 73 74 72 69 70 73 20 61 6e 79 20 74 72 61  n strips any tra
2ca20 69 6c 69 6e 67 20 27 2f 27 20 63 68 61 72 61 63  iling '/' charac
2ca30 74 65 72 73 20 66 72 6f 6d 20 65 61 63 68 20 61  ters from each a
2ca40 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73  rgument..** This
2ca50 20 69 73 20 63 6f 6e 73 69 73 74 65 6e 74 20 77   is consistent w
2ca60 69 74 68 20 74 68 65 20 77 61 79 20 74 68 65 20  ith the way the 
2ca70 5b 74 61 72 5d 20 63 6f 6d 6d 61 6e 64 20 73 65  [tar] command se
2ca80 65 6d 73 20 74 6f 20 77 6f 72 6b 20 6f 6e 0a 2a  ems to work on.*
2ca90 2a 20 4c 69 6e 75 78 2e 0a 2a 2f 0a 73 74 61 74  * Linux..*/.stat
2caa0 69 63 20 69 6e 74 20 61 72 43 68 65 63 6b 45 6e  ic int arCheckEn
2cab0 74 72 69 65 73 28 41 72 43 6f 6d 6d 61 6e 64 20  tries(ArCommand 
2cac0 2a 70 41 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pAr){.  int rc 
2cad0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
2cae0 66 28 20 70 41 72 2d 3e 6e 41 72 67 20 29 7b 0a  f( pAr->nArg ){.
2caf0 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
2cb00 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2cb10 70 54 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20  pTest = 0;..    
2cb20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e  shellPreparePrin
2cb30 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c  tf(pAr->db, &rc,
2cb40 20 26 70 54 65 73 74 2c 0a 20 20 20 20 20 20 20   &pTest,.       
2cb50 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52   "SELECT name FR
2cb60 4f 4d 20 25 73 20 57 48 45 52 45 20 6e 61 6d 65  OM %s WHERE name
2cb70 3d 24 6e 61 6d 65 22 2c 20 0a 20 20 20 20 20 20  =$name", .      
2cb80 20 20 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65    pAr->zSrcTable
2cb90 0a 20 20 20 20 29 3b 0a 20 20 20 20 6a 20 3d 20  .    );.    j = 
2cba0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
2cbb0 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 54 65  ameter_index(pTe
2cbc0 73 74 2c 20 22 24 6e 61 6d 65 22 29 3b 0a 20 20  st, "$name");.  
2cbd0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72    for(i=0; i<pAr
2cbe0 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51  ->nArg && rc==SQ
2cbf0 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
2cc00 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 70       char *z = p
2cc10 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20  Ar->azArg[i];.  
2cc20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
2cc30 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 69  en30(z);.      i
2cc40 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20  nt bOk = 0;.    
2cc50 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
2cc60 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 20 6e 2d  z[n-1]=='/' ) n-
2cc70 2d 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20  -;.      z[n] = 
2cc80 27 5c 30 27 3b 0a 20 20 20 20 20 20 73 71 6c 69  '\0';.      sqli
2cc90 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 54  te3_bind_text(pT
2cca0 65 73 74 2c 20 6a 2c 20 7a 2c 20 2d 31 2c 20 53  est, j, z, -1, S
2ccb0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
2ccc0 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
2ccd0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
2cce0 70 28 70 54 65 73 74 29 20 29 7b 0a 20 20 20 20  p(pTest) ){.    
2ccf0 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20      bOk = 1;.   
2cd00 20 20 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c     }.      shell
2cd10 52 65 73 65 74 28 26 72 63 2c 20 70 54 65 73 74  Reset(&rc, pTest
2cd20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2cd30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f  =SQLITE_OK && bO
2cd40 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
2cd50 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2cd60 72 72 2c 20 22 6e 6f 74 20 66 6f 75 6e 64 20 69  rr, "not found i
2cd70 6e 20 61 72 63 68 69 76 65 3a 20 25 73 5c 6e 22  n archive: %s\n"
2cd80 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 63  , z);.        rc
2cd90 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2cda0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2cdb0 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65     shellFinalize
2cdc0 28 26 72 63 2c 20 70 54 65 73 74 29 3b 0a 20 20  (&rc, pTest);.  
2cdd0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2cde0 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 61  ../*.** Format a
2cdf0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
2ce00 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 61  at can be used a
2ce10 67 61 69 6e 73 74 20 74 68 65 20 22 73 71 6c 61  gainst the "sqla
2ce20 72 22 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 69  r" table to.** i
2ce30 64 65 6e 74 69 66 79 20 61 6c 6c 20 61 72 63 68  dentify all arch
2ce40 69 76 65 20 6d 65 6d 62 65 72 73 20 74 68 61 74  ive members that
2ce50 20 6d 61 74 63 68 20 74 68 65 20 63 6f 6d 6d 61   match the comma
2ce60 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 68 65 6c  nd arguments hel
2ce70 64 0a 2a 2a 20 69 6e 20 28 2a 70 41 72 29 2e 20  d.** in (*pAr). 
2ce80 4c 65 61 76 65 20 74 68 69 73 20 57 48 45 52 45  Leave this WHERE
2ce90 20 63 6c 61 75 73 65 20 69 6e 20 28 2a 70 7a 57   clause in (*pzW
2cea0 68 65 72 65 29 20 62 65 66 6f 72 65 20 72 65 74  here) before ret
2ceb0 75 72 6e 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63  urning..** The c
2cec0 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
2ced0 69 62 6c 65 20 66 6f 72 20 65 76 65 6e 74 75 61  ible for eventua
2cee0 6c 6c 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  lly calling sqli
2cef0 74 65 33 5f 66 72 65 65 28 29 20 6f 6e 0a 2a 2a  te3_free() on.**
2cf00 20 61 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c 20 28 2a   any non-NULL (*
2cf10 70 7a 57 68 65 72 65 29 20 76 61 6c 75 65 2e 0a  pzWhere) value..
2cf20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
2cf30 72 57 68 65 72 65 43 6c 61 75 73 65 28 0a 20 20  rWhereClause(.  
2cf40 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 41 72 43  int *pRc, .  ArC
2cf50 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 0a 20 20  ommand *pAr, .  
2cf60 63 68 61 72 20 2a 2a 70 7a 57 68 65 72 65 20 20  char **pzWhere  
2cf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf80 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 57 48 45 52  /* OUT: New WHER
2cf90 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a 20  E clause */.){. 
2cfa0 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
2cfb0 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  0;.  if( *pRc==S
2cfc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2cfd0 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 3d 3d 30  if( pAr->nArg==0
2cfe0 20 29 7b 0a 20 20 20 20 20 20 7a 57 68 65 72 65   ){.      zWhere
2cff0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2d000 74 66 28 22 31 22 29 3b 0a 20 20 20 20 7d 65 6c  tf("1");.    }el
2d010 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
2d020 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2d030 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20  r *zSep = "";.  
2d040 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2d050 41 72 2d 3e 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  Ar->nArg; i++){.
2d060 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2d070 61 72 20 2a 7a 20 3d 20 70 41 72 2d 3e 61 7a 41  ar *z = pAr->azA
2d080 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a  rg[i];.        z
2d090 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f  Where = sqlite3_
2d0a0 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
2d0b0 20 20 20 22 25 7a 25 73 20 6e 61 6d 65 20 3d 20     "%z%s name = 
2d0c0 27 25 71 27 20 4f 52 20 73 75 62 73 74 72 28 6e  '%q' OR substr(n
2d0d0 61 6d 65 2c 31 2c 25 64 29 20 3d 20 27 25 71 2f  ame,1,%d) = '%q/
2d0e0 27 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 7a  '", .          z
2d0f0 57 68 65 72 65 2c 20 7a 53 65 70 2c 20 7a 2c 20  Where, zSep, z, 
2d100 73 74 72 6c 65 6e 33 30 28 7a 29 2b 31 2c 20 7a  strlen30(z)+1, z
2d110 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2d120 20 20 20 20 69 66 28 20 7a 57 68 65 72 65 3d 3d      if( zWhere==
2d130 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  0 ){.          *
2d140 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRc = SQLITE_NOM
2d150 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  EM;.          br
2d160 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
2d170 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20         zSep = " 
2d180 4f 52 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OR ";.      }.  
2d190 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 57 68 65    }.  }.  *pzWhe
2d1a0 72 65 20 3d 20 7a 57 68 65 72 65 3b 0a 7d 0a 0a  re = zWhere;.}..
2d1b0 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
2d1c0 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 6c 69 73  tion of .ar "lis
2d1d0 54 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a  T" command. .*/.
2d1e0 73 74 61 74 69 63 20 69 6e 74 20 61 72 4c 69 73  static int arLis
2d1f0 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61  tCommand(ArComma
2d200 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73  nd *pAr){.  cons
2d210 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 22  t char *zSql = "
2d220 53 45 4c 45 43 54 20 25 73 20 46 52 4f 4d 20 25  SELECT %s FROM %
2d230 73 20 57 48 45 52 45 20 25 73 22 3b 20 0a 20 20  s WHERE %s"; .  
2d240 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 43 6f  const char *azCo
2d250 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 6e 61  ls[] = {.    "na
2d260 6d 65 22 2c 0a 20 20 20 20 22 6c 73 6d 6f 64 65  me",.    "lsmode
2d270 28 6d 6f 64 65 29 2c 20 73 7a 2c 20 64 61 74 65  (mode), sz, date
2d280 74 69 6d 65 28 6d 74 69 6d 65 2c 20 27 75 6e 69  time(mtime, 'uni
2d290 78 65 70 6f 63 68 27 29 2c 20 6e 61 6d 65 22 0a  xepoch'), name".
2d2a0 20 20 7d 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 57    };..  char *zW
2d2b0 68 65 72 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  here = 0;.  sqli
2d2c0 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d  te3_stmt *pSql =
2d2d0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   0;.  int rc;.. 
2d2e0 20 72 63 20 3d 20 61 72 43 68 65 63 6b 45 6e 74   rc = arCheckEnt
2d2f0 72 69 65 73 28 70 41 72 29 3b 0a 20 20 61 72 57  ries(pAr);.  arW
2d300 68 65 72 65 43 6c 61 75 73 65 28 26 72 63 2c 20  hereClause(&rc, 
2d310 70 41 72 2c 20 26 7a 57 68 65 72 65 29 3b 0a 0a  pAr, &zWhere);..
2d320 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72    shellPreparePr
2d330 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72  intf(pAr->db, &r
2d340 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71 6c 2c 20  c, &pSql, zSql, 
2d350 61 7a 43 6f 6c 73 5b 70 41 72 2d 3e 62 56 65 72  azCols[pAr->bVer
2d360 62 6f 73 65 5d 2c 0a 20 20 20 20 20 20 20 20 20  bose],.         
2d370 20 20 20 20 20 20 20 20 20 20 20 20 70 41 72 2d              pAr-
2d380 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a 57 68 65  >zSrcTable, zWhe
2d390 72 65 29 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e  re);.  if( pAr->
2d3a0 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 75  bDryRun ){.    u
2d3b0 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e  tf8_printf(pAr->
2d3c0 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
2d3d0 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c  sqlite3_sql(pSql
2d3e0 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
2d3f0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
2d400 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
2d410 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
2d420 70 28 70 53 71 6c 29 20 29 7b 0a 20 20 20 20 20  p(pSql) ){.     
2d430 20 69 66 28 20 70 41 72 2d 3e 62 56 65 72 62 6f   if( pAr->bVerbo
2d440 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  se ){.        ut
2d450 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70  f8_printf(pAr->p
2d460 2d 3e 6f 75 74 2c 20 22 25 73 20 25 20 31 30 64  ->out, "%s % 10d
2d470 20 20 25 73 20 20 25 73 5c 6e 22 2c 0a 20 20 20    %s  %s\n",.   
2d480 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2d490 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
2d4a0 6c 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  l, 0),.         
2d4b0 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
2d4c0 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 31 29 2c 20  n_int(pSql, 1), 
2d4d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2d4e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
2d4f0 28 70 53 71 6c 2c 20 32 29 2c 0a 20 20 20 20 20  (pSql, 2),.     
2d500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
2d510 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
2d520 20 33 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20   3).        );. 
2d530 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d540 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2d550 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73  pAr->p->out, "%s
2d560 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  \n", sqlite3_col
2d570 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30  umn_text(pSql, 0
2d580 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
2d590 7d 0a 20 20 7d 0a 20 20 73 68 65 6c 6c 46 69 6e  }.  }.  shellFin
2d5a0 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 71 6c 29  alize(&rc, pSql)
2d5b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
2d5c0 28 7a 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75  (zWhere);.  retu
2d5d0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2d5e0 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
2d5f0 6f 66 20 2e 61 72 20 22 65 58 74 72 61 63 74 22  of .ar "eXtract"
2d600 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74   command. .*/.st
2d610 61 74 69 63 20 69 6e 74 20 61 72 45 78 74 72 61  atic int arExtra
2d620 63 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d  ctCommand(ArComm
2d630 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e  and *pAr){.  con
2d640 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 31 20 3d  st char *zSql1 =
2d650 20 0a 20 20 20 20 22 53 45 4c 45 43 54 20 22 0a   .    "SELECT ".
2d660 20 20 20 20 22 20 28 24 64 69 72 20 7c 7c 20 6e      " ($dir || n
2d670 61 6d 65 29 2c 22 0a 20 20 20 20 22 20 77 72 69  ame),".    " wri
2d680 74 65 66 69 6c 65 28 28 24 64 69 72 20 7c 7c 20  tefile(($dir || 
2d690 6e 61 6d 65 29 2c 20 25 73 2c 20 6d 6f 64 65 2c  name), %s, mode,
2d6a0 20 6d 74 69 6d 65 29 20 22 0a 20 20 20 20 22 46   mtime) ".    "F
2d6b0 52 4f 4d 20 25 73 20 57 48 45 52 45 20 28 25 73  ROM %s WHERE (%s
2d6c0 29 20 41 4e 44 20 28 64 61 74 61 20 49 53 20 4e  ) AND (data IS N
2d6d0 55 4c 4c 20 4f 52 20 24 64 69 72 4f 6e 6c 79 20  ULL OR $dirOnly 
2d6e0 3d 20 30 29 22 0a 20 20 20 20 22 20 41 4e 44 20  = 0)".    " AND 
2d6f0 6e 61 6d 65 20 4e 4f 54 20 47 4c 4f 42 20 27 2a  name NOT GLOB '*
2d700 2e 2e 5b 2f 5c 5c 5d 2a 27 22 3b 0a 0a 20 20 63  ..[/\\]*'";..  c
2d710 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 78 74  onst char *azExt
2d720 72 61 41 72 67 5b 5d 20 3d 20 7b 20 0a 20 20 20  raArg[] = { .   
2d730 20 22 73 71 6c 61 72 5f 75 6e 63 6f 6d 70 72 65   "sqlar_uncompre
2d740 73 73 28 64 61 74 61 2c 20 73 7a 29 22 2c 0a 20  ss(data, sz)",. 
2d750 20 20 20 22 64 61 74 61 22 0a 20 20 7d 3b 0a 0a     "data".  };..
2d760 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2d770 70 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pSql = 0;.  int 
2d780 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2d790 20 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30    char *zDir = 0
2d7a0 3b 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65  ;.  char *zWhere
2d7b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   = 0;.  int i, j
2d7c0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
2d7d0 65 6e 74 73 20 61 72 65 20 73 70 65 63 69 66 69  ents are specifi
2d7e0 65 64 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  ed, check that t
2d7f0 68 65 79 20 61 63 74 75 61 6c 6c 79 20 65 78 69  hey actually exi
2d800 73 74 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74  st within.  ** t
2d810 68 65 20 61 72 63 68 69 76 65 20 62 65 66 6f 72  he archive befor
2d820 65 20 70 72 6f 63 65 65 64 69 6e 67 2e 20 41 6e  e proceeding. An
2d830 64 20 66 6f 72 6d 75 6c 61 74 65 20 61 20 57 48  d formulate a WH
2d840 45 52 45 20 63 6c 61 75 73 65 20 74 6f 0a 20 20  ERE clause to.  
2d850 2a 2a 20 6d 61 74 63 68 20 74 68 65 6d 2e 20 20  ** match them.  
2d860 2a 2f 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63  */.  rc = arChec
2d870 6b 45 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20  kEntries(pAr);. 
2d880 20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 26   arWhereClause(&
2d890 72 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65  rc, pAr, &zWhere
2d8a0 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
2d8b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2d8c0 66 28 20 70 41 72 2d 3e 7a 44 69 72 20 29 7b 0a  f( pAr->zDir ){.
2d8d0 20 20 20 20 20 20 7a 44 69 72 20 3d 20 73 71 6c        zDir = sql
2d8e0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
2d8f0 2f 22 2c 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a  /", pAr->zDir);.
2d900 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d910 20 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f   zDir = sqlite3_
2d920 6d 70 72 69 6e 74 66 28 22 22 29 3b 0a 20 20 20  mprintf("");.   
2d930 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d   }.    if( zDir=
2d940 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  =0 ) rc = SQLITE
2d950 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 73  _NOMEM;.  }..  s
2d960 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74  hellPreparePrint
2d970 66 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20  f(pAr->db, &rc, 
2d980 26 70 53 71 6c 2c 20 7a 53 71 6c 31 2c 20 0a 20  &pSql, zSql1, . 
2d990 20 20 20 20 20 61 7a 45 78 74 72 61 41 72 67 5b       azExtraArg[
2d9a0 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 70 41 72 2d  pAr->bZip], pAr-
2d9b0 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a 57 68 65  >zSrcTable, zWhe
2d9c0 72 65 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72  re.  );..  if( r
2d9d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d9e0 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f      j = sqlite3_
2d9f0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
2da00 6e 64 65 78 28 70 53 71 6c 2c 20 22 24 64 69 72  ndex(pSql, "$dir
2da10 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ");.    sqlite3_
2da20 62 69 6e 64 5f 74 65 78 74 28 70 53 71 6c 2c 20  bind_text(pSql, 
2da30 6a 2c 20 7a 44 69 72 2c 20 2d 31 2c 20 53 51 4c  j, zDir, -1, SQL
2da40 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 0a 20 20  ITE_STATIC);..  
2da50 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 53 45 4c    /* Run the SEL
2da60 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 77  ECT statement tw
2da70 69 63 65 2e 20 54 68 65 20 66 69 72 73 74 20 74  ice. The first t
2da80 69 6d 65 2c 20 77 72 69 74 65 66 69 6c 65 28 29  ime, writefile()
2da90 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a   is called.    *
2daa0 2a 20 66 6f 72 20 61 6c 6c 20 61 72 63 68 69 76  * for all archiv
2dab0 65 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 73  e members that s
2dac0 68 6f 75 6c 64 20 62 65 20 65 78 74 72 61 63 74  hould be extract
2dad0 65 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 74  ed. The second t
2dae0 69 6d 65 2c 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79  ime,.    ** only
2daf0 20 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f   for the directo
2db00 72 69 65 73 2e 20 54 68 69 73 20 69 73 20 62 65  ries. This is be
2db10 63 61 75 73 65 20 74 68 65 20 74 69 6d 65 73 74  cause the timest
2db20 61 6d 70 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20  amps for.    ** 
2db30 65 78 74 72 61 63 74 65 64 20 64 69 72 65 63 74  extracted direct
2db40 6f 72 69 65 73 20 6d 75 73 74 20 62 65 20 72 65  ories must be re
2db50 73 65 74 20 61 66 74 65 72 20 74 68 65 79 20 61  set after they a
2db60 72 65 20 70 6f 70 75 6c 61 74 65 64 20 28 61 73  re populated (as
2db70 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 69  .    ** populati
2db80 6e 67 20 74 68 65 6d 20 63 68 61 6e 67 65 73 20  ng them changes 
2db90 74 68 65 20 74 69 6d 65 73 74 61 6d 70 29 2e 20  the timestamp). 
2dba0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
2dbb0 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
2dbc0 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69    j = sqlite3_bi
2dbd0 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
2dbe0 65 78 28 70 53 71 6c 2c 20 22 24 64 69 72 4f 6e  ex(pSql, "$dirOn
2dbf0 6c 79 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ly");.      sqli
2dc00 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71  te3_bind_int(pSq
2dc10 6c 2c 20 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20  l, j, i);.      
2dc20 69 66 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e  if( pAr->bDryRun
2dc30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
2dc40 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e  _printf(pAr->p->
2dc50 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  out, "%s\n", sql
2dc60 69 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b  ite3_sql(pSql));
2dc70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2dc80 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d        while( rc=
2dc90 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
2dca0 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
2dcb0 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a  3_step(pSql) ){.
2dcc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3d            if( i=
2dcd0 3d 30 20 26 26 20 70 41 72 2d 3e 62 56 65 72 62  =0 && pAr->bVerb
2dce0 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ose ){.         
2dcf0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2dd00 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c  Ar->p->out, "%s\
2dd10 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n", sqlite3_colu
2dd20 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29  mn_text(pSql, 0)
2dd30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2dd40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2dd50 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65  .      shellRese
2dd60 74 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20  t(&rc, pSql);.  
2dd70 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e    }.    shellFin
2dd80 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 71 6c 29  alize(&rc, pSql)
2dd90 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
2dda0 5f 66 72 65 65 28 7a 44 69 72 29 3b 0a 20 20 73  _free(zDir);.  s
2ddb0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65  qlite3_free(zWhe
2ddc0 72 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  re);.  return rc
2ddd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74  ;.}../*.** Run t
2dde0 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
2ddf0 20 69 6e 20 7a 53 71 6c 2e 20 20 4f 72 20 69 66   in zSql.  Or if
2de00 20 64 6f 69 6e 67 20 61 20 2d 2d 64 72 79 72 75   doing a --dryru
2de10 6e 2c 20 6d 65 72 65 6c 79 20 70 72 69 6e 74 20  n, merely print 
2de20 69 74 20 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69  it out..*/.stati
2de30 63 20 69 6e 74 20 61 72 45 78 65 63 53 71 6c 28  c int arExecSql(
2de40 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20  ArCommand *pAr, 
2de50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
2de60 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
2de70 66 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20  f( pAr->bDryRun 
2de80 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
2de90 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20  tf(pAr->p->out, 
2dea0 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20  "%s\n", zSql);. 
2deb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2dec0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2ded0 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
2dee0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2def0 5f 65 78 65 63 28 70 41 72 2d 3e 64 62 2c 20 7a  _exec(pAr->db, z
2df00 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72  Sql, 0, 0, &zErr
2df10 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 20  );.    if( zErr 
2df20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
2df30 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 45 52  intf(stdout, "ER
2df40 52 4f 52 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ROR: %s\n", zErr
2df50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2df60 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20  _free(zErr);.   
2df70 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2df80 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d  rc;.}.../*.** Im
2df90 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
2dfa0 2e 61 72 20 22 63 72 65 61 74 65 22 2c 20 22 69  .ar "create", "i
2dfb0 6e 73 65 72 74 22 2c 20 61 6e 64 20 22 75 70 64  nsert", and "upd
2dfc0 61 74 65 22 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2a  ate" commands..*
2dfd0 2a 0a 2a 2a 20 20 20 20 20 63 72 65 61 74 65 20  *.**     create 
2dfe0 20 20 20 2d 3e 20 20 20 20 20 43 72 65 61 74 65     ->     Create
2dff0 20 61 20 6e 65 77 20 53 51 4c 20 61 72 63 68 69   a new SQL archi
2e000 76 65 0a 2a 2a 20 20 20 20 20 69 6e 73 65 72 74  ve.**     insert
2e010 20 20 20 20 2d 3e 20 20 20 20 20 49 6e 73 65 72      ->     Inser
2e020 74 20 6f 72 20 72 65 69 6e 73 65 72 74 20 61 6c  t or reinsert al
2e030 6c 20 66 69 6c 65 73 20 6c 69 73 74 65 64 0a 2a  l files listed.*
2e040 2a 20 20 20 20 20 75 70 64 61 74 65 20 20 20 20  *     update    
2e050 2d 3e 20 20 20 20 20 49 6e 73 65 72 74 20 66 69  ->     Insert fi
2e060 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 63 68  les that have ch
2e070 61 6e 67 65 64 20 6f 72 20 74 68 61 74 20 77 65  anged or that we
2e080 72 65 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  re not.**       
2e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2e0a0 72 65 76 69 6f 75 73 6c 79 20 69 6e 20 74 68 65  reviously in the
2e0b0 20 61 72 63 68 69 76 65 0a 2a 2a 0a 2a 2a 20 43   archive.**.** C
2e0c0 72 65 61 74 65 20 74 68 65 20 22 73 71 6c 61 72  reate the "sqlar
2e0d0 22 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  " table in the d
2e0e0 61 74 61 62 61 73 65 20 69 66 20 69 74 20 64 6f  atabase if it do
2e0f0 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
2e100 78 69 73 74 2e 0a 2a 2a 20 54 68 65 6e 20 61 64  xist..** Then ad
2e110 64 20 65 61 63 68 20 66 69 6c 65 20 69 6e 20 74  d each file in t
2e120 68 65 20 61 7a 46 69 6c 65 5b 5d 20 61 72 72 61  he azFile[] arra
2e130 79 20 74 6f 20 74 68 65 20 61 72 63 68 69 76 65  y to the archive
2e140 2e 20 44 69 72 65 63 74 6f 72 69 65 73 0a 2a 2a  . Directories.**
2e150 20 61 72 65 20 61 64 64 65 64 20 72 65 63 75 72   are added recur
2e160 73 69 76 65 6c 79 2e 20 49 66 20 61 72 67 75 6d  sively. If argum
2e170 65 6e 74 20 62 56 65 72 62 6f 73 65 20 69 73 20  ent bVerbose is 
2e180 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d 65 73 73  non-zero, a mess
2e190 61 67 65 20 69 73 0a 2a 2a 20 70 72 69 6e 74 65  age is.** printe
2e1a0 64 20 6f 6e 20 73 74 64 6f 75 74 20 66 6f 72 20  d on stdout for 
2e1b0 65 61 63 68 20 66 69 6c 65 20 61 72 63 68 69 76  each file archiv
2e1c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 72  ed..**.** The cr
2e1d0 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20  eate command is 
2e1e0 74 68 65 20 73 61 6d 65 20 61 73 20 75 70 64 61  the same as upda
2e1f0 74 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  te, except that 
2e200 69 74 20 64 72 6f 70 73 0a 2a 2a 20 61 6e 79 20  it drops.** any 
2e210 65 78 69 73 74 69 6e 67 20 22 73 71 6c 61 72 22  existing "sqlar"
2e220 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 62 65   table before be
2e230 67 69 6e 6e 69 6e 67 2e 20 20 54 68 65 20 22 69  ginning.  The "i
2e240 6e 73 65 72 74 22 20 63 6f 6d 6d 61 6e 64 0a 2a  nsert" command.*
2e250 2a 20 61 6c 77 61 79 73 20 6f 76 65 72 77 72 69  * always overwri
2e260 74 65 73 20 65 76 65 72 79 20 66 69 6c 65 20 6e  tes every file n
2e270 61 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  amed on the comm
2e280 61 6e 64 2d 6c 69 6e 65 2c 20 77 68 65 72 65 20  and-line, where 
2e290 61 73 0a 2a 2a 20 22 75 70 64 61 74 65 22 20 6f  as.** "update" o
2e2a0 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20 69  nly overwrites i
2e2b0 66 20 74 68 65 20 73 69 7a 65 20 6f 72 20 6d 74  f the size or mt
2e2c0 69 6d 65 20 6f 72 20 6d 6f 64 65 20 68 61 73 20  ime or mode has 
2e2d0 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74  changed..*/.stat
2e2e0 69 63 20 69 6e 74 20 61 72 43 72 65 61 74 65 4f  ic int arCreateO
2e2f0 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28 0a  rUpdateCommand(.
2e300 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72    ArCommand *pAr
2e310 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2e320 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
2e330 75 6d 65 6e 74 73 20 61 6e 64 20 6f 70 74 69 6f  uments and optio
2e340 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 55 70 64  ns */.  int bUpd
2e350 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
2e360 20 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20          /* true 
2e370 66 6f 72 20 61 20 2d 2d 63 72 65 61 74 65 2e 20  for a --create. 
2e380 2a 2f 0a 20 20 69 6e 74 20 62 4f 6e 6c 79 49 66  */.  int bOnlyIf
2e390 43 68 61 6e 67 65 64 20 20 20 20 20 20 20 20 20  Changed         
2e3a0 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 75 70 64       /* Only upd
2e3b0 61 74 65 20 69 66 20 66 69 6c 65 20 68 61 73 20  ate if file has 
2e3c0 63 68 61 6e 67 65 64 20 2a 2f 0a 29 7b 0a 20 20  changed */.){.  
2e3d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 72 65  const char *zCre
2e3e0 61 74 65 20 3d 20 0a 20 20 20 20 20 20 22 43 52  ate = .      "CR
2e3f0 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
2e400 54 20 45 58 49 53 54 53 20 73 71 6c 61 72 28 5c  T EXISTS sqlar(\
2e410 6e 22 0a 20 20 20 20 20 20 22 20 20 6e 61 6d 65  n".      "  name
2e420 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45   TEXT PRIMARY KE
2e430 59 2c 20 20 2d 2d 20 6e 61 6d 65 20 6f 66 20 74  Y,  -- name of t
2e440 68 65 20 66 69 6c 65 5c 6e 22 0a 20 20 20 20 20  he file\n".     
2e450 20 22 20 20 6d 6f 64 65 20 49 4e 54 2c 20 20 20   "  mode INT,   
2e460 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 61              -- a
2e470 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
2e480 73 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 6d 74  s\n".      "  mt
2e490 69 6d 65 20 49 4e 54 2c 20 20 20 20 20 20 20 20  ime INT,        
2e4a0 20 20 20 20 20 20 2d 2d 20 6c 61 73 74 20 6d 6f        -- last mo
2e4b0 64 69 66 69 63 61 74 69 6f 6e 20 74 69 6d 65 5c  dification time\
2e4c0 6e 22 0a 20 20 20 20 20 20 22 20 20 73 7a 20 49  n".      "  sz I
2e4d0 4e 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  NT,             
2e4e0 20 20 20 20 2d 2d 20 6f 72 69 67 69 6e 61 6c 20      -- original 
2e4f0 66 69 6c 65 20 73 69 7a 65 5c 6e 22 0a 20 20 20  file size\n".   
2e500 20 20 20 22 20 20 64 61 74 61 20 42 4c 4f 42 20     "  data BLOB 
2e510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
2e520 20 63 6f 6d 70 72 65 73 73 65 64 20 63 6f 6e 74   compressed cont
2e530 65 6e 74 5c 6e 22 0a 20 20 20 20 20 20 22 29 22  ent\n".      ")"
2e540 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2e550 7a 44 72 6f 70 20 3d 20 22 44 52 4f 50 20 54 41  zDrop = "DROP TA
2e560 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 73 71  BLE IF EXISTS sq
2e570 6c 61 72 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68  lar";.  const ch
2e580 61 72 20 2a 7a 49 6e 73 65 72 74 46 6d 74 5b 32  ar *zInsertFmt[2
2e590 5d 20 3d 20 7b 0a 20 20 20 20 20 22 52 45 50 4c  ] = {.     "REPL
2e5a0 41 43 45 20 49 4e 54 4f 20 25 73 28 6e 61 6d 65  ACE INTO %s(name
2e5b0 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c 73 7a 2c 64  ,mode,mtime,sz,d
2e5c0 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20  ata)\n".     "  
2e5d0 53 45 4c 45 43 54 5c 6e 22 0a 20 20 20 20 20 22  SELECT\n".     "
2e5e0 20 20 20 20 25 73 2c 5c 6e 22 0a 20 20 20 20 20      %s,\n".     
2e5f0 22 20 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20  "    mode,\n".  
2e600 20 20 20 22 20 20 20 20 6d 74 69 6d 65 2c 5c 6e     "    mtime,\n
2e610 22 0a 20 20 20 20 20 22 20 20 20 20 43 41 53 45  ".     "    CASE
2e620 20 73 75 62 73 74 72 28 6c 73 6d 6f 64 65 28 6d   substr(lsmode(m
2e630 6f 64 65 29 2c 31 2c 31 29 5c 6e 22 0a 20 20 20  ode),1,1)\n".   
2e640 20 20 22 20 20 20 20 20 20 57 48 45 4e 20 27 2d    "      WHEN '-
2e650 27 20 54 48 45 4e 20 6c 65 6e 67 74 68 28 64 61  ' THEN length(da
2e660 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  ta)\n".     "   
2e670 20 20 20 57 48 45 4e 20 27 64 27 20 54 48 45 4e     WHEN 'd' THEN
2e680 20 30 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20   0\n".     "    
2e690 20 20 45 4c 53 45 20 2d 31 20 45 4e 44 2c 5c 6e    ELSE -1 END,\n
2e6a0 22 0a 20 20 20 20 20 22 20 20 20 20 73 71 6c 61  ".     "    sqla
2e6b0 72 5f 63 6f 6d 70 72 65 73 73 28 64 61 74 61 29  r_compress(data)
2e6c0 5c 6e 22 0a 20 20 20 20 20 22 20 20 46 52 4f 4d  \n".     "  FROM
2e6d0 20 66 73 64 69 72 28 25 51 2c 25 51 29 20 41 53   fsdir(%Q,%Q) AS
2e6e0 20 64 69 73 6b 5c 6e 22 0a 20 20 20 20 20 22 20   disk\n".     " 
2e6f0 20 57 48 45 52 45 20 6c 73 6d 6f 64 65 28 6d 6f   WHERE lsmode(mo
2e700 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20 27 3f 25  de) NOT LIKE '?%
2e710 25 27 25 73 3b 22 0a 20 20 20 20 20 2c 0a 20 20  %'%s;".     ,.  
2e720 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f     "REPLACE INTO
2e730 20 25 73 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74   %s(name,mode,mt
2e740 69 6d 65 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20  ime,data)\n".   
2e750 20 20 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20    "  SELECT\n". 
2e760 20 20 20 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a      "    %s,\n".
2e770 20 20 20 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c       "    mode,\
2e780 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d 74 69  n".     "    mti
2e790 6d 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  me,\n".     "   
2e7a0 20 64 61 74 61 5c 6e 22 0a 20 20 20 20 20 22 20   data\n".     " 
2e7b0 20 46 52 4f 4d 20 66 73 64 69 72 28 25 51 2c 25   FROM fsdir(%Q,%
2e7c0 51 29 20 41 53 20 64 69 73 6b 5c 6e 22 0a 20 20  Q) AS disk\n".  
2e7d0 20 20 20 22 20 20 57 48 45 52 45 20 6c 73 6d 6f     "  WHERE lsmo
2e7e0 64 65 28 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b  de(mode) NOT LIK
2e7f0 45 20 27 3f 25 25 27 25 73 3b 22 0a 20 20 7d 3b  E '?%%'%s;".  };
2e800 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
2e810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e820 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74     /* For iterat
2e830 69 6e 67 20 74 68 72 6f 75 67 68 20 61 7a 46 69  ing through azFi
2e840 6c 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  le[] */.  int rc
2e850 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2e870 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  urn code */.  co
2e880 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
2e890 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2e8a0 20 53 51 4c 20 74 61 62 6c 65 20 69 6e 74 6f 20   SQL table into 
2e8b0 77 68 69 63 68 20 74 6f 20 69 6e 73 65 72 74 20  which to insert 
2e8c0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  */.  char *zSql;
2e8d0 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 35 30  .  char zTemp[50
2e8e0 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78 69 73  ];.  char *zExis
2e8f0 74 73 20 3d 20 30 3b 0a 0a 20 20 61 72 45 78 65  ts = 0;..  arExe
2e900 63 53 71 6c 28 70 41 72 2c 20 22 50 52 41 47 4d  cSql(pAr, "PRAGM
2e910 41 20 70 61 67 65 5f 73 69 7a 65 3d 35 31 32 22  A page_size=512"
2e920 29 3b 0a 20 20 72 63 20 3d 20 61 72 45 78 65 63  );.  rc = arExec
2e930 53 71 6c 28 70 41 72 2c 20 22 53 41 56 45 50 4f  Sql(pAr, "SAVEPO
2e940 49 4e 54 20 61 72 3b 22 29 3b 0a 20 20 69 66 28  INT ar;");.  if(
2e950 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e960 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7a 54   return rc;.  zT
2e970 65 6d 70 5b 30 5d 20 3d 20 30 3b 20 0a 20 20 69  emp[0] = 0; .  i
2e980 66 28 20 70 41 72 2d 3e 62 5a 69 70 20 29 7b 0a  f( pAr->bZip ){.
2e990 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
2e9a0 65 20 74 68 65 20 7a 69 70 66 69 6c 65 20 76 69  e the zipfile vi
2e9b0 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 69 66 20  rtual table, if 
2e9c0 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
2e9d0 20 69 66 28 20 70 41 72 2d 3e 7a 46 69 6c 65 20   if( pAr->zFile 
2e9e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2e9f0 5f 75 69 6e 74 36 34 20 72 3b 0a 20 20 20 20 20  _uint64 r;.     
2ea00 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
2ea10 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 26 72  ess(sizeof(r),&r
2ea20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2ea30 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2ea40 28 7a 54 65 6d 70 29 2c 7a 54 65 6d 70 2c 22 7a  (zTemp),zTemp,"z
2ea50 69 70 25 30 31 36 6c 6c 78 22 2c 72 29 3b 0a 20  ip%016llx",r);. 
2ea60 20 20 20 20 20 7a 54 61 62 20 3d 20 7a 54 65 6d       zTab = zTem
2ea70 70 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  p;.      zSql = 
2ea80 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2ea90 0a 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  .         "CREAT
2eaa0 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
2eab0 74 65 6d 70 2e 25 73 20 55 53 49 4e 47 20 7a 69  temp.%s USING zi
2eac0 70 66 69 6c 65 28 25 51 29 22 2c 0a 20 20 20 20  pfile(%Q)",.    
2ead0 20 20 20 20 20 7a 54 61 62 2c 20 70 41 72 2d 3e       zTab, pAr->
2eae0 7a 46 69 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20  zFile.      );. 
2eaf0 20 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63       rc = arExec
2eb00 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a  Sql(pAr, zSql);.
2eb10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2eb20 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65  ee(zSql);.    }e
2eb30 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54 61 62 20  lse{.      zTab 
2eb40 3d 20 22 7a 69 70 22 3b 0a 20 20 20 20 7d 0a 20  = "zip";.    }. 
2eb50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
2eb60 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61  nitialize the ta
2eb70 62 6c 65 20 66 6f 72 20 61 6e 20 53 51 4c 41 52  ble for an SQLAR
2eb80 20 2a 2f 0a 20 20 20 20 7a 54 61 62 20 3d 20 22   */.    zTab = "
2eb90 73 71 6c 61 72 22 3b 0a 20 20 20 20 69 66 28 20  sqlar";.    if( 
2eba0 62 55 70 64 61 74 65 3d 3d 30 20 29 7b 0a 20 20  bUpdate==0 ){.  
2ebb0 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53      rc = arExecS
2ebc0 71 6c 28 70 41 72 2c 20 7a 44 72 6f 70 29 3b 0a  ql(pAr, zDrop);.
2ebd0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2ebe0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
2ebf0 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63 74 69 6f  nd_ar_transactio
2ec00 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  n;.    }.    rc 
2ec10 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c  = arExecSql(pAr,
2ec20 20 7a 43 72 65 61 74 65 29 3b 0a 20 20 7d 0a 20   zCreate);.  }. 
2ec30 20 69 66 28 20 62 4f 6e 6c 79 49 66 43 68 61 6e   if( bOnlyIfChan
2ec40 67 65 64 20 29 7b 0a 20 20 20 20 7a 45 78 69 73  ged ){.    zExis
2ec50 74 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ts = sqlite3_mpr
2ec60 69 6e 74 66 28 0a 20 20 20 20 20 20 22 20 41 4e  intf(.      " AN
2ec70 44 20 4e 4f 54 20 45 58 49 53 54 53 28 22 0a 20  D NOT EXISTS(". 
2ec80 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
2ec90 20 31 20 46 52 4f 4d 20 25 73 20 41 53 20 6d 65   1 FROM %s AS me
2eca0 6d 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 57  m".          " W
2ecb0 48 45 52 45 20 6d 65 6d 2e 6e 61 6d 65 3d 64 69  HERE mem.name=di
2ecc0 73 6b 2e 6e 61 6d 65 22 0a 20 20 20 20 20 20 20  sk.name".       
2ecd0 20 20 20 22 20 41 4e 44 20 6d 65 6d 2e 6d 74 69     " AND mem.mti
2ece0 6d 65 3d 64 69 73 6b 2e 6d 74 69 6d 65 22 0a 20  me=disk.mtime". 
2ecf0 20 20 20 20 20 20 20 20 20 22 20 41 4e 44 20 6d           " AND m
2ed00 65 6d 2e 6d 6f 64 65 3d 64 69 73 6b 2e 6d 6f 64  em.mode=disk.mod
2ed10 65 29 22 2c 20 7a 54 61 62 29 3b 0a 20 20 7d 65  e)", zTab);.  }e
2ed20 6c 73 65 7b 0a 20 20 20 20 7a 45 78 69 73 74 73  lse{.    zExists
2ed30 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2ed40 74 66 28 22 22 29 3b 0a 20 20 7d 0a 20 20 69 66  tf("");.  }.  if
2ed50 28 20 7a 45 78 69 73 74 73 3d 3d 30 20 29 20 72  ( zExists==0 ) r
2ed60 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2ed70 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
2ed80 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d  Ar->nArg && rc==
2ed90 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
2eda0 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 32  .    char *zSql2
2edb0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2edc0 74 66 28 7a 49 6e 73 65 72 74 46 6d 74 5b 70 41  tf(zInsertFmt[pA
2edd0 72 2d 3e 62 5a 69 70 5d 2c 20 7a 54 61 62 2c 0a  r->bZip], zTab,.
2ede0 20 20 20 20 20 20 20 20 70 41 72 2d 3e 62 56 65          pAr->bVe
2edf0 72 62 6f 73 65 20 3f 20 22 73 68 65 6c 6c 5f 70  rbose ? "shell_p
2ee00 75 74 73 6e 6c 28 6e 61 6d 65 29 22 20 3a 20 22  utsnl(name)" : "
2ee10 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 70  name",.        p
2ee20 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 2c 20 70 41  Ar->azArg[i], pA
2ee30 72 2d 3e 7a 44 69 72 2c 20 7a 45 78 69 73 74 73  r->zDir, zExists
2ee40 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 72 45 78  );.    rc = arEx
2ee50 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c 32  ecSql(pAr, zSql2
2ee60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2ee70 72 65 65 28 7a 53 71 6c 32 29 3b 0a 20 20 7d 0a  ree(zSql2);.  }.
2ee80 65 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63 74 69  end_ar_transacti
2ee90 6f 6e 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  on:.  if( rc!=SQ
2eea0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
2eeb0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 41 72 2d  qlite3_exec(pAr-
2eec0 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54  >db, "ROLLBACK T
2eed0 4f 20 61 72 3b 20 52 45 4c 45 41 53 45 20 61 72  O ar; RELEASE ar
2eee0 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
2eef0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
2ef00 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22  arExecSql(pAr, "
2ef10 52 45 4c 45 41 53 45 20 61 72 3b 22 29 3b 0a 20  RELEASE ar;");. 
2ef20 20 20 20 69 66 28 20 70 41 72 2d 3e 62 5a 69 70     if( pAr->bZip
2ef30 20 26 26 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29   && pAr->zFile )
2ef40 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  {.      zSql = s
2ef50 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2ef60 44 52 4f 50 20 54 41 42 4c 45 20 25 73 22 2c 20  DROP TABLE %s", 
2ef70 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 61 72  zTemp);.      ar
2ef80 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71  ExecSql(pAr, zSq
2ef90 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
2efa0 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
2efb0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2efc0 33 5f 66 72 65 65 28 7a 45 78 69 73 74 73 29 3b  3_free(zExists);
2efd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2efe0 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2eff0 61 74 69 6f 6e 20 6f 66 20 22 2e 61 72 22 20 64  ation of ".ar" d
2f000 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  ot command..*/.s
2f010 74 61 74 69 63 20 69 6e 74 20 61 72 44 6f 74 43  tatic int arDotC
2f020 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53  ommand(.  ShellS
2f030 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20  tate *pState,   
2f040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
2f050 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20  rent shell tool 
2f060 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 66  state */.  int f
2f070 72 6f 6d 43 6d 64 4c 69 6e 65 2c 20 20 20 20 20  romCmdLine,     
2f080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2f090 75 65 20 69 66 20 2d 41 20 63 6f 6d 6d 61 6e 64  ue if -A command
2f0a0 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2c 20 6e 6f  -line option, no
2f0b0 74 20 2e 61 72 20 63 6d 64 20 2a 2f 0a 20 20 63  t .ar cmd */.  c
2f0c0 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
2f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f0e0 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
2f0f0 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
2f100 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
2f110 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20  int nArg        
2f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f130 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
2f140 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
2f150 2a 2f 0a 29 7b 0a 20 20 41 72 43 6f 6d 6d 61 6e  */.){.  ArComman
2f160 64 20 63 6d 64 3b 0a 20 20 69 6e 74 20 72 63 3b  d cmd;.  int rc;
2f170 0a 20 20 6d 65 6d 73 65 74 28 26 63 6d 64 2c 20  .  memset(&cmd, 
2f180 30 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 29 3b  0, sizeof(cmd));
2f190 0a 20 20 63 6d 64 2e 66 72 6f 6d 43 6d 64 4c 69  .  cmd.fromCmdLi
2f1a0 6e 65 20 3d 20 66 72 6f 6d 43 6d 64 4c 69 6e 65  ne = fromCmdLine
2f1b0 3b 0a 20 20 72 63 20 3d 20 61 72 50 61 72 73 65  ;.  rc = arParse
2f1c0 43 6f 6d 6d 61 6e 64 28 61 7a 41 72 67 2c 20 6e  Command(azArg, n
2f1d0 41 72 67 2c 20 26 63 6d 64 29 3b 0a 20 20 69 66  Arg, &cmd);.  if
2f1e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f1f0 29 7b 0a 20 20 20 20 69 6e 74 20 65 44 62 54 79  ){.    int eDbTy
2f200 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  pe = SHELL_OPEN_
2f210 55 4e 53 50 45 43 3b 0a 20 20 20 20 63 6d 64 2e  UNSPEC;.    cmd.
2f220 70 20 3d 20 70 53 74 61 74 65 3b 0a 20 20 20 20  p = pState;.    
2f230 63 6d 64 2e 64 62 20 3d 20 70 53 74 61 74 65 2d  cmd.db = pState-
2f240 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 63 6d 64  >db;.    if( cmd
2f250 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  .zFile ){.      
2f260 65 44 62 54 79 70 65 20 3d 20 64 65 64 75 63 65  eDbType = deduce
2f270 44 61 74 61 62 61 73 65 54 79 70 65 28 63 6d 64  DatabaseType(cmd
2f280 2e 7a 46 69 6c 65 2c 20 31 29 3b 0a 20 20 20 20  .zFile, 1);.    
2f290 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 44 62  }else{.      eDb
2f2a0 54 79 70 65 20 3d 20 70 53 74 61 74 65 2d 3e 6f  Type = pState->o
2f2b0 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 7d 0a 20  penMode;.    }. 
2f2c0 20 20 20 69 66 28 20 65 44 62 54 79 70 65 3d 3d     if( eDbType==
2f2d0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49  SHELL_OPEN_ZIPFI
2f2e0 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  LE ){.      if( 
2f2f0 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44  cmd.eCmd==AR_CMD
2f300 5f 45 58 54 52 41 43 54 20 7c 7c 20 63 6d 64 2e  _EXTRACT || cmd.
2f310 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 4c 49 53  eCmd==AR_CMD_LIS
2f320 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T ){.        if(
2f330 20 63 6d 64 2e 7a 46 69 6c 65 3d 3d 30 20 29 7b   cmd.zFile==0 ){
2f340 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a  .          cmd.z
2f350 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  SrcTable = sqlit
2f360 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70 22  e3_mprintf("zip"
2f370 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2f380 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e  {.          cmd.
2f390 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69  zSrcTable = sqli
2f3a0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70  te3_mprintf("zip
2f3b0 66 69 6c 65 28 25 51 29 22 2c 20 63 6d 64 2e 7a  file(%Q)", cmd.z
2f3c0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  File);.        }
2f3d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
2f3e0 6d 64 2e 62 5a 69 70 20 3d 20 31 3b 0a 20 20 20  md.bZip = 1;.   
2f3f0 20 7d 65 6c 73 65 20 69 66 28 20 63 6d 64 2e 7a   }else if( cmd.z
2f400 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  File ){.      in
2f410 74 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 69  t flags;.      i
2f420 66 28 20 63 6d 64 2e 62 41 70 70 65 6e 64 20 29  f( cmd.bAppend )
2f430 20 65 44 62 54 79 70 65 20 3d 20 53 48 45 4c 4c   eDbType = SHELL
2f440 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b  _OPEN_APPENDVFS;
2f450 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65  .      if( cmd.e
2f460 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43 52 45 41  Cmd==AR_CMD_CREA
2f470 54 45 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d  TE || cmd.eCmd==
2f480 41 52 5f 43 4d 44 5f 49 4e 53 45 52 54 20 0a 20  AR_CMD_INSERT . 
2f490 20 20 20 20 20 20 20 20 20 20 7c 7c 20 63 6d 64            || cmd
2f4a0 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50  .eCmd==AR_CMD_UP
2f4b0 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DATE ){.        
2f4c0 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  flags = SQLITE_O
2f4d0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
2f4e0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
2f4f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2f500 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 53         flags = S
2f510 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2f520 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NLY;.      }.   
2f530 20 20 20 63 6d 64 2e 64 62 20 3d 20 30 3b 0a 20     cmd.db = 0;. 
2f540 20 20 20 20 20 69 66 28 20 63 6d 64 2e 62 44 72       if( cmd.bDr
2f550 79 52 75 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  yRun ){.        
2f560 75 74 66 38 5f 70 72 69 6e 74 66 28 70 53 74 61  utf8_printf(pSta
2f570 74 65 2d 3e 6f 75 74 2c 20 22 2d 2d 20 6f 70 65  te->out, "-- ope
2f580 6e 20 64 61 74 61 62 61 73 65 20 27 25 73 27 25  n database '%s'%
2f590 73 5c 6e 22 2c 20 63 6d 64 2e 7a 46 69 6c 65 2c  s\n", cmd.zFile,
2f5a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 65 44  .             eD
2f5b0 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45  bType==SHELL_OPE
2f5c0 4e 5f 41 50 50 45 4e 44 56 46 53 20 3f 20 22 20  N_APPENDVFS ? " 
2f5d0 75 73 69 6e 67 20 27 61 70 6e 64 76 66 73 27 22  using 'apndvfs'"
2f5e0 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 0a   : "");.      }.
2f5f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f600 65 33 5f 6f 70 65 6e 5f 76 32 28 63 6d 64 2e 7a  e3_open_v2(cmd.z
2f610 46 69 6c 65 2c 20 26 63 6d 64 2e 64 62 2c 20 66  File, &cmd.db, f
2f620 6c 61 67 73 2c 20 0a 20 20 20 20 20 20 20 20 20  lags, .         
2f630 20 20 20 20 65 44 62 54 79 70 65 3d 3d 53 48 45      eDbType==SHE
2f640 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46  LL_OPEN_APPENDVF
2f650 53 20 3f 20 22 61 70 6e 64 76 66 73 22 20 3a 20  S ? "apndvfs" : 
2f660 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
2f670 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f680 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2f690 74 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e  tf(stderr, "cann
2f6a0 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 25 73  ot open file: %s
2f6b0 20 28 25 73 29 5c 6e 22 2c 20 0a 20 20 20 20 20   (%s)\n", .     
2f6c0 20 20 20 20 20 20 20 63 6d 64 2e 7a 46 69 6c 65         cmd.zFile
2f6d0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
2f6e0 28 63 6d 64 2e 64 62 29 0a 20 20 20 20 20 20 20  (cmd.db).       
2f6f0 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   );.        goto
2f700 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b   end_ar_command;
2f710 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2f720 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e  qlite3_fileio_in
2f730 69 74 28 63 6d 64 2e 64 62 2c 20 30 2c 20 30 29  it(cmd.db, 0, 0)
2f740 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2f750 73 71 6c 61 72 5f 69 6e 69 74 28 63 6d 64 2e 64  sqlar_init(cmd.d
2f760 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
2f770 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
2f780 75 6e 63 74 69 6f 6e 28 63 6d 64 2e 64 62 2c 20  unction(cmd.db, 
2f790 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20  "shell_putsnl", 
2f7a0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
2f7b0 63 6d 64 2e 70 2c 0a 20 20 20 20 20 20 20 20 20  cmd.p,.         
2f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7d0 20 20 20 20 20 73 68 65 6c 6c 50 75 74 73 46 75       shellPutsFu
2f7e0 6e 63 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  nc, 0, 0);..    
2f7f0 7d 0a 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 53  }.    if( cmd.zS
2f800 72 63 54 61 62 6c 65 3d 3d 30 20 26 26 20 63 6d  rcTable==0 && cm
2f810 64 2e 62 5a 69 70 3d 3d 30 20 26 26 20 63 6d 64  d.bZip==0 && cmd
2f820 2e 65 43 6d 64 21 3d 41 52 5f 43 4d 44 5f 48 45  .eCmd!=AR_CMD_HE
2f830 4c 50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  LP ){.      if( 
2f840 63 6d 64 2e 65 43 6d 64 21 3d 41 52 5f 43 4d 44  cmd.eCmd!=AR_CMD
2f850 5f 43 52 45 41 54 45 0a 20 20 20 20 20 20 20 26  _CREATE.       &
2f860 26 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  & sqlite3_table_
2f870 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28  column_metadata(
2f880 63 6d 64 2e 64 62 2c 30 2c 22 73 71 6c 61 72 22  cmd.db,0,"sqlar"
2f890 2c 22 6e 61 6d 65 22 2c 30 2c 30 2c 30 2c 30 2c  ,"name",0,0,0,0,
2f8a0 30 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  0).      ){.    
2f8b0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2f8c0 73 74 64 65 72 72 2c 20 22 64 61 74 61 62 61 73  stderr, "databas
2f8d0 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  e does not conta
2f8e0 69 6e 20 61 6e 20 27 73 71 6c 61 72 27 20 74 61  in an 'sqlar' ta
2f8f0 62 6c 65 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ble\n");.       
2f900 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
2f910 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  OR;.        goto
2f920 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b   end_ar_command;
2f930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
2f940 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73  md.zSrcTable = s
2f950 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2f960 73 71 6c 61 72 22 29 3b 0a 20 20 20 20 7d 0a 0a  sqlar");.    }..
2f970 20 20 20 20 73 77 69 74 63 68 28 20 63 6d 64 2e      switch( cmd.
2f980 65 43 6d 64 20 29 7b 0a 20 20 20 20 20 20 63 61  eCmd ){.      ca
2f990 73 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45  se AR_CMD_CREATE
2f9a0 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  :.        rc = a
2f9b0 72 43 72 65 61 74 65 4f 72 55 70 64 61 74 65 43  rCreateOrUpdateC
2f9c0 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c 20 30 2c 20  ommand(&cmd, 0, 
2f9d0 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  0);.        brea
2f9e0 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41  k;..      case A
2f9f0 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20  R_CMD_EXTRACT:. 
2fa00 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 45 78         rc = arEx
2fa10 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 26 63 6d  tractCommand(&cm
2fa20 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
2fa30 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41  k;..      case A
2fa40 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20  R_CMD_LIST:.    
2fa50 20 20 20 20 72 63 20 3d 20 61 72 4c 69 73 74 43      rc = arListC
2fa60 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20  ommand(&cmd);.  
2fa70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
2fa80 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
2fa90 48 45 4c 50 3a 0a 20 20 20 20 20 20 20 20 61 72  HELP:.        ar
2faa0 55 73 61 67 65 28 70 53 74 61 74 65 2d 3e 6f 75  Usage(pState->ou
2fab0 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
2fac0 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41  k;..      case A
2fad0 52 5f 43 4d 44 5f 49 4e 53 45 52 54 3a 0a 20 20  R_CMD_INSERT:.  
2fae0 20 20 20 20 20 20 72 63 20 3d 20 61 72 43 72 65        rc = arCre
2faf0 61 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61  ateOrUpdateComma
2fb00 6e 64 28 26 63 6d 64 2c 20 31 2c 20 30 29 3b 0a  nd(&cmd, 1, 0);.
2fb10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
2fb20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
2fb30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
2fb40 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f  md.eCmd==AR_CMD_
2fb50 55 50 44 41 54 45 20 29 3b 0a 20 20 20 20 20 20  UPDATE );.      
2fb60 20 20 72 63 20 3d 20 61 72 43 72 65 61 74 65 4f    rc = arCreateO
2fb70 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28 26  rUpdateCommand(&
2fb80 63 6d 64 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  cmd, 1, 1);.    
2fb90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2fba0 0a 20 20 7d 0a 65 6e 64 5f 61 72 5f 63 6f 6d 6d  .  }.end_ar_comm
2fbb0 61 6e 64 3a 0a 20 20 69 66 28 20 63 6d 64 2e 64  and:.  if( cmd.d
2fbc0 62 21 3d 70 53 74 61 74 65 2d 3e 64 62 20 29 7b  b!=pState->db ){
2fbd0 0a 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 63 6d  .    close_db(cm
2fbe0 64 2e 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  d.db);.  }.  sql
2fbf0 69 74 65 33 5f 66 72 65 65 28 63 6d 64 2e 7a 53  ite3_free(cmd.zS
2fc00 72 63 54 61 62 6c 65 29 3b 0a 0a 20 20 72 65 74  rcTable);..  ret
2fc10 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45 6e 64  urn rc;.}./* End
2fc20 20 6f 66 20 74 68 65 20 22 2e 61 72 63 68 69 76   of the ".archiv
2fc30 65 22 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d  e" or ".ar" comm
2fc40 61 6e 64 20 6c 6f 67 69 63 0a 2a 2a 2a 2a 2a 2a  and logic.******
2fc50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fc60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fc70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fc80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fc90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
2fca0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
2fcb0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
2fcc0 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65  TUALTABLE) && de
2fcd0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56  fined(SQLITE_HAV
2fce0 45 5f 5a 4c 49 42 29 20 2a 2f 0a 0a 0a 2f 2a 0a  E_ZLIB) */.../*.
2fcf0 2a 2a 20 49 66 20 61 6e 20 69 6e 70 75 74 20 6c  ** If an input l
2fd00 69 6e 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  ine begins with 
2fd10 22 2e 22 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  "." then invoke 
2fd20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a  this routine to.
2fd30 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  ** process that 
2fd40 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  line..**.** Retu
2fd50 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32  rn 1 on error, 2
2fd60 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20   to exit, and 0 
2fd70 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
2fd80 61 74 69 63 20 69 6e 74 20 64 6f 5f 6d 65 74 61  atic int do_meta
2fd90 5f 63 6f 6d 6d 61 6e 64 28 63 68 61 72 20 2a 7a  _command(char *z
2fda0 4c 69 6e 65 2c 20 53 68 65 6c 6c 53 74 61 74 65  Line, ShellState
2fdb0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 68 20 3d 20   *p){.  int h = 
2fdc0 31 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20  1;.  int nArg = 
2fdd0 30 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 3b 0a 20  0;.  int n, c;. 
2fde0 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
2fdf0 68 61 72 20 2a 61 7a 41 72 67 5b 35 30 5d 3b 0a  har *azArg[50];.
2fe00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2fe10 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2fe20 45 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 65 72  E.  if( p->exper
2fe30 74 2e 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20  t.pExpert ){.   
2fe40 20 65 78 70 65 72 74 46 69 6e 69 73 68 28 70 2c   expertFinish(p,
2fe50 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   1, 0);.  }.#end
2fe60 69 66 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74  if..  /* Parse t
2fe70 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e  he input line in
2fe80 74 6f 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a  to tokens..  */.
2fe90 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68    while( zLine[h
2fea0 5d 20 26 26 20 6e 41 72 67 3c 41 72 72 61 79 53  ] && nArg<ArrayS
2feb0 69 7a 65 28 61 7a 41 72 67 29 20 29 7b 0a 20 20  ize(azArg) ){.  
2fec0 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
2fed0 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b  (zLine[h]) ){ h+
2fee0 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69  +; }.    if( zLi
2fef0 6e 65 5b 68 5d 3d 3d 30 20 29 20 62 72 65 61 6b  ne[h]==0 ) break
2ff00 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b  ;.    if( zLine[
2ff10 68 5d 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e  h]=='\'' || zLin
2ff20 65 5b 68 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20  e[h]=='"' ){.   
2ff30 20 20 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a     int delim = z
2ff40 4c 69 6e 65 5b 68 2b 2b 5d 3b 0a 20 20 20 20 20  Line[h++];.     
2ff50 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d   azArg[nArg++] =
2ff60 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20   &zLine[h];.    
2ff70 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68    while( zLine[h
2ff80 5d 20 26 26 20 7a 4c 69 6e 65 5b 68 5d 21 3d 64  ] && zLine[h]!=d
2ff90 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  elim ){.        
2ffa0 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c  if( zLine[h]=='\
2ffb0 5c 27 20 26 26 20 64 65 6c 69 6d 3d 3d 27 22 27  \' && delim=='"'
2ffc0 20 26 26 20 7a 4c 69 6e 65 5b 68 2b 31 5d 21 3d   && zLine[h+1]!=
2ffd0 30 20 29 20 68 2b 2b 3b 0a 20 20 20 20 20 20 20  0 ) h++;.       
2ffe0 20 68 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   h++;.      }.  
2fff0 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d      if( zLine[h]
30000 3d 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20  ==delim ){.     
30010 20 20 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20     zLine[h++] = 
30020 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
30030 20 69 66 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20   if( delim=='"' 
30040 29 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c  ) resolve_backsl
30050 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67  ashes(azArg[nArg
30060 2d 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  -1]);.    }else{
30070 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72  .      azArg[nAr
30080 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d  g++] = &zLine[h]
30090 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  ;.      while( z
300a0 4c 69 6e 65 5b 68 5d 20 26 26 20 21 49 73 53 70  Line[h] && !IsSp
300b0 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b  ace(zLine[h]) ){
300c0 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66   h++; }.      if
300d0 28 20 7a 4c 69 6e 65 5b 68 5d 20 29 20 7a 4c 69  ( zLine[h] ) zLi
300e0 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20  ne[h++] = 0;.   
300f0 20 20 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73     resolve_backs
30100 6c 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72  lashes(azArg[nAr
30110 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  g-1]);.    }.  }
30120 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..  /* Process t
30130 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20  he input line.. 
30140 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d   */.  if( nArg==
30150 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a  0 ) return 0; /*
30160 20 6e 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65   no tokens, no e
30170 72 72 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74  rror */.  n = st
30180 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29  rlen30(azArg[0])
30190 3b 0a 20 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d  ;.  c = azArg[0]
301a0 5b 30 5d 3b 0a 20 20 63 6c 65 61 72 54 65 6d 70  [0];.  clearTemp
301b0 46 69 6c 65 28 70 29 3b 0a 0a 23 69 66 6e 64 65  File(p);..#ifnde
301c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
301d0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66  THORIZATION.  if
301e0 28 20 63 3d 3d 27 61 27 20 26 26 20 73 74 72 6e  ( c=='a' && strn
301f0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61  cmp(azArg[0], "a
30200 75 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  uth", n)==0 ){. 
30210 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29     if( nArg!=2 )
30220 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
30230 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
30240 65 3a 20 2e 61 75 74 68 20 4f 4e 7c 4f 46 46 5c  e: .auth ON|OFF\
30250 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
30260 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
30270 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
30280 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
30290 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66  db(p, 0);.    if
302a0 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  ( booleanValue(a
302b0 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20  zArg[1]) ){.    
302c0 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75    sqlite3_set_au
302d0 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20  thorizer(p->db, 
302e0 73 68 65 6c 6c 41 75 74 68 2c 20 70 29 3b 0a 20  shellAuth, p);. 
302f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30300 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68  sqlite3_set_auth
30310 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 30 2c  orizer(p->db, 0,
30320 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
30330 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  se.#endif..#if !
30340 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
30350 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
30360 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
30370 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 20  ITE_HAVE_ZLIB). 
30380 20 69 66 28 20 63 3d 3d 27 61 27 20 26 26 20 73   if( c=='a' && s
30390 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
303a0 20 22 61 72 63 68 69 76 65 22 2c 20 6e 29 3d 3d   "archive", n)==
303b0 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  0 ){.    open_db
303c0 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  (p, 0);.    rc =
303d0 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c   arDotCommand(p,
303e0 20 30 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29   0, azArg, nArg)
303f0 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
30400 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27 62 27 20  ..  if( (c=='b' 
30410 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
30420 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61  mp(azArg[0], "ba
30430 63 6b 75 70 22 2c 20 6e 29 3d 3d 30 29 0a 20 20  ckup", n)==0).  
30440 20 7c 7c 20 28 63 3d 3d 27 73 27 20 26 26 20 6e   || (c=='s' && n
30450 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
30460 7a 41 72 67 5b 30 5d 2c 20 22 73 61 76 65 22 2c  zArg[0], "save",
30470 20 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20   n)==0).  ){.   
30480 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
30490 73 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20  stFile = 0;.    
304a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
304b0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
304c0 20 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c   *pDest;.    sql
304d0 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61  ite3_backup *pBa
304e0 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6a 3b  ckup;.    int j;
304f0 0a 20 20 20 20 69 6e 74 20 62 41 73 79 6e 63 20  .    int bAsync 
30500 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
30510 68 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20  har *zVfs = 0;. 
30520 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41     for(j=1; j<nA
30530 72 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; j++){.      
30540 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
30550 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20  azArg[j];.      
30560 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b  if( z[0]=='-' ){
30570 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 31  .        if( z[1
30580 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]=='-' ) z++;.  
30590 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
305a0 28 7a 2c 20 22 2d 61 70 70 65 6e 64 22 29 3d 3d  (z, "-append")==
305b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
305c0 56 66 73 20 3d 20 22 61 70 6e 64 76 66 73 22 3b  Vfs = "apndvfs";
305d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  .        }else. 
305e0 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
305f0 70 28 7a 2c 20 22 2d 61 73 79 6e 63 22 29 3d 3d  p(z, "-async")==
30600 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  0 ){.          b
30610 41 73 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  Async = 1;.     
30620 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20     }else.       
30630 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66   {.          utf
30640 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
30650 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "unknown option
30660 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a  : %s\n", azArg[j
30670 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ]);.          re
30680 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
30690 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
306a0 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29  ( zDestFile==0 )
306b0 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46  {.        zDestF
306c0 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a  ile = azArg[j];.
306d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
306e0 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  zDb==0 ){.      
306f0 20 20 7a 44 62 20 3d 20 7a 44 65 73 74 46 69 6c    zDb = zDestFil
30700 65 3b 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74  e;.        zDest
30710 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b  File = azArg[j];
30720 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
30730 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
30740 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
30750 20 2e 62 61 63 6b 75 70 20 3f 44 42 3f 20 3f 4f   .backup ?DB? ?O
30760 50 54 49 4f 4e 53 3f 20 46 49 4c 45 4e 41 4d 45  PTIONS? FILENAME
30770 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  \n");.        re
30780 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
30790 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44      }.    if( zD
307a0 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  estFile==0 ){.  
307b0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
307c0 74 64 65 72 72 2c 20 22 6d 69 73 73 69 6e 67 20  tderr, "missing 
307d0 46 49 4c 45 4e 41 4d 45 20 61 72 67 75 6d 65 6e  FILENAME argumen
307e0 74 20 6f 6e 20 2e 62 61 63 6b 75 70 5c 6e 22 29  t on .backup\n")
307f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
30800 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30810 7a 44 62 3d 3d 30 20 29 20 7a 44 62 20 3d 20 22  zDb==0 ) zDb = "
30820 6d 61 69 6e 22 3b 0a 20 20 20 20 72 63 20 3d 20  main";.    rc = 
30830 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
30840 7a 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73  zDestFile, &pDes
30850 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
30860 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
30870 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
30880 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
30890 7a 56 66 73 29 3b 0a 20 20 20 20 69 66 28 20 72  zVfs);.    if( r
308a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
308b0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
308c0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
308d0 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
308e0 25 73 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46 69  %s\"\n", zDestFi
308f0 6c 65 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  le);.      close
30900 5f 64 62 28 70 44 65 73 74 29 3b 0a 20 20 20 20  _db(pDest);.    
30910 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
30920 7d 0a 20 20 20 20 69 66 28 20 62 41 73 79 6e 63  }.    if( bAsync
30930 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
30940 33 5f 65 78 65 63 28 70 44 65 73 74 2c 20 22 50  3_exec(pDest, "P
30950 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
30960 73 3d 4f 46 46 3b 20 50 52 41 47 4d 41 20 6a 6f  s=OFF; PRAGMA jo
30970 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 3b 22  urnal_mode=OFF;"
30980 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30990 20 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a 20       0, 0, 0);. 
309a0 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62     }.    open_db
309b0 28 70 2c 20 30 29 3b 0a 20 20 20 20 70 42 61 63  (p, 0);.    pBac
309c0 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  kup = sqlite3_ba
309d0 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74 2c  ckup_init(pDest,
309e0 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62 2c 20   "main", p->db, 
309f0 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42  zDb);.    if( pB
30a00 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ackup==0 ){.    
30a10 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
30a20 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
30a30 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
30a40 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20  msg(pDest));.   
30a50 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 44 65 73     close_db(pDes
30a60 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
30a70 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68   1;.    }.    wh
30a80 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69  ile(  (rc = sqli
30a90 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
30aa0 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53  pBackup,100))==S
30ab0 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20  QLITE_OK ){}.   
30ac0 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
30ad0 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b  finish(pBackup);
30ae0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
30af0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
30b00 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65    rc = 0;.    }e
30b10 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  lse{.      utf8_
30b20 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
30b30 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
30b40 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65  lite3_errmsg(pDe
30b50 73 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  st));.      rc =
30b60 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c   1;.    }.    cl
30b70 6f 73 65 5f 64 62 28 70 44 65 73 74 29 3b 0a 20  ose_db(pDest);. 
30b80 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
30b90 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='b' && n>=3 && 
30ba0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
30bb0 2c 20 22 62 61 69 6c 22 2c 20 6e 29 3d 3d 30 20  , "bail", n)==0 
30bc0 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
30bd0 3d 32 20 29 7b 0a 20 20 20 20 20 20 62 61 69 6c  =2 ){.      bail
30be0 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 62 6f 6f 6c  _on_error = bool
30bf0 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  eanValue(azArg[1
30c00 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
30c10 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
30c20 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
30c30 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66 5c 6e 22 29  .bail on|off\n")
30c40 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
30c50 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
30c60 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e   if( c=='b' && n
30c70 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
30c80 7a 41 72 67 5b 30 5d 2c 20 22 62 69 6e 61 72 79  zArg[0], "binary
30c90 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
30ca0 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
30cb0 20 20 20 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e       if( boolean
30cc0 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20  Value(azArg[1]) 
30cd0 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 42 69  ){.        setBi
30ce0 6e 61 72 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c  naryMode(p->out,
30cf0 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
30d00 7b 0a 20 20 20 20 20 20 20 20 73 65 74 54 65 78  {.        setTex
30d10 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  tMode(p->out, 1)
30d20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
30d30 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
30d40 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
30d50 73 61 67 65 3a 20 2e 62 69 6e 61 72 79 20 6f 6e  sage: .binary on
30d60 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |off\n");.      
30d70 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
30d80 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
30d90 27 63 27 20 26 26 20 73 74 72 63 6d 70 28 61 7a  'c' && strcmp(az
30da0 41 72 67 5b 30 5d 2c 22 63 64 22 29 3d 3d 30 20  Arg[0],"cd")==0 
30db0 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
30dc0 3d 32 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  =2 ){.#if define
30dd0 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
30de0 69 6e 65 64 28 57 49 4e 33 32 29 0a 20 20 20 20  ined(WIN32).    
30df0 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73    wchar_t *z = s
30e00 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
30e10 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 61 7a 41  8_to_unicode(azA
30e20 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63  rg[1]);.      rc
30e30 20 3d 20 21 53 65 74 43 75 72 72 65 6e 74 44 69   = !SetCurrentDi
30e40 72 65 63 74 6f 72 79 57 28 7a 29 3b 0a 20 20 20  rectoryW(z);.   
30e50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
30e60 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  z);.#else.      
30e70 72 63 20 3d 20 63 68 64 69 72 28 61 7a 41 72 67  rc = chdir(azArg
30e80 5b 31 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  [1]);.#endif.   
30e90 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
30ea0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
30eb0 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74  (stderr, "Cannot
30ec0 20 63 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63   change to direc
30ed0 74 6f 72 79 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  tory \"%s\"\n", 
30ee0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
30ef0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
30f00 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
30f10 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
30f20 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
30f30 63 64 20 44 49 52 45 43 54 4f 52 59 5c 6e 22 29  cd DIRECTORY\n")
30f40 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
30f50 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
30f60 20 2f 2a 20 54 68 65 20 75 6e 64 6f 63 75 6d 65   /* The undocume
30f70 6e 74 65 64 20 22 2e 62 72 65 61 6b 70 6f 69 6e  nted ".breakpoin
30f80 74 22 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65  t" command cause
30f90 73 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20  s a call to the 
30fa0 6e 6f 2d 6f 70 0a 20 20 2a 2a 20 72 6f 75 74 69  no-op.  ** routi
30fb0 6e 65 20 6e 61 6d 65 64 20 74 65 73 74 5f 62 72  ne named test_br
30fc0 65 61 6b 70 6f 69 6e 74 28 29 2e 0a 20 20 2a 2f  eakpoint()..  */
30fd0 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26  .  if( c=='b' &&
30fe0 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
30ff0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 72 65 61  (azArg[0], "brea
31000 6b 70 6f 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29  kpoint", n)==0 )
31010 7b 0a 20 20 20 20 74 65 73 74 5f 62 72 65 61 6b  {.    test_break
31020 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 65 6c 73 65  point();.  }else
31030 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26  ..  if( c=='c' &
31040 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
31050 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68 61  p(azArg[0], "cha
31060 6e 67 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  nges", n)==0 ){.
31070 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
31080 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43 6c  ){.      setOrCl
31090 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  earFlag(p, SHFLG
310a0 5f 43 6f 75 6e 74 43 68 61 6e 67 65 73 2c 20 61  _CountChanges, a
310b0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
310c0 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
310d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
310e0 73 61 67 65 3a 20 2e 63 68 61 6e 67 65 73 20 6f  sage: .changes o
310f0 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20  n|off\n");.     
31100 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
31110 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 43 61 6e   }else..  /* Can
31120 63 65 6c 20 6f 75 74 70 75 74 20 72 65 64 69 72  cel output redir
31130 65 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 69 73  ection, if it is
31140 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 28   currently set (
31150 62 79 20 2e 74 65 73 74 63 61 73 65 29 0a 20 20  by .testcase).  
31160 2a 2a 20 54 68 65 6e 20 72 65 61 64 20 74 68 65  ** Then read the
31170 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
31180 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74  testcase-out.txt
31190 20 66 69 6c 65 20 61 6e 64 20 63 6f 6d 70 61 72   file and compar
311a0 65 20 61 67 61 69 6e 73 74 0a 20 20 2a 2a 20 61  e against.  ** a
311b0 7a 41 72 67 5b 31 5d 2e 20 20 49 66 20 74 68 65  zArg[1].  If the
311c0 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 63  re are differenc
311d0 65 73 2c 20 72 65 70 6f 72 74 20 61 6e 20 65 72  es, report an er
311e0 72 6f 72 20 61 6e 64 20 65 78 69 74 2e 0a 20 20  ror and exit..  
311f0 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20  */.  if( c=='c' 
31200 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
31210 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68  mp(azArg[0], "ch
31220 65 63 6b 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  eck", n)==0 ){. 
31230 20 20 20 63 68 61 72 20 2a 7a 52 65 73 20 3d 20     char *zRes = 
31240 30 3b 0a 20 20 20 20 6f 75 74 70 75 74 5f 72 65  0;.    output_re
31250 73 65 74 28 70 29 3b 0a 20 20 20 20 69 66 28 20  set(p);.    if( 
31260 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20  nArg!=2 ){.     
31270 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
31280 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 68 65  rr, "Usage: .che
31290 63 6b 20 47 4c 4f 42 2d 50 41 54 54 45 52 4e 5c  ck GLOB-PATTERN\
312a0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
312b0 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
312c0 20 28 7a 52 65 73 20 3d 20 72 65 61 64 46 69 6c   (zRes = readFil
312d0 65 28 22 74 65 73 74 63 61 73 65 2d 6f 75 74 2e  e("testcase-out.
312e0 74 78 74 22 2c 20 30 29 29 3d 3d 30 20 29 7b 0a  txt", 0))==0 ){.
312f0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
31300 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
31310 20 63 61 6e 6e 6f 74 20 72 65 61 64 20 27 74 65   cannot read 'te
31320 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c  stcase-out.txt'\
31330 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
31340 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
31350 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 61   testcase_glob(a
31360 7a 41 72 67 5b 31 5d 2c 7a 52 65 73 29 3d 3d 30  zArg[1],zRes)==0
31370 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
31380 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20  rintf(stderr,.  
31390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
313a0 74 65 73 74 63 61 73 65 2d 25 73 20 46 41 49 4c  testcase-%s FAIL
313b0 45 44 5c 6e 20 45 78 70 65 63 74 65 64 3a 20 5b  ED\n Expected: [
313c0 25 73 5d 5c 6e 20 20 20 20 20 20 47 6f 74 3a 20  %s]\n      Got: 
313d0 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20  [%s]\n",.       
313e0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 54 65            p->zTe
313f0 73 74 63 61 73 65 2c 20 61 7a 41 72 67 5b 31 5d  stcase, azArg[1]
31400 2c 20 7a 52 65 73 29 3b 0a 20 20 20 20 20 20 72  , zRes);.      r
31410 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
31420 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
31430 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 74 65 73  ntf(stdout, "tes
31440 74 63 61 73 65 2d 25 73 20 6f 6b 5c 6e 22 2c 20  tcase-%s ok\n", 
31450 70 2d 3e 7a 54 65 73 74 63 61 73 65 29 3b 0a 20  p->zTestcase);. 
31460 20 20 20 20 20 70 2d 3e 6e 43 68 65 63 6b 2b 2b       p->nCheck++
31470 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
31480 74 65 33 5f 66 72 65 65 28 7a 52 65 73 29 3b 0a  te3_free(zRes);.
31490 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
314a0 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70  =='c' && strncmp
314b0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 6c 6f 6e  (azArg[0], "clon
314c0 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
314d0 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
314e0 20 20 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65        tryToClone
314f0 28 70 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  (p, azArg[1]);. 
31500 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31510 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
31520 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 6c 6f 6e  r, "Usage: .clon
31530 65 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a  e FILENAME\n");.
31540 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
31550 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
31560 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 31  f( c=='d' && n>1
31570 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
31580 67 5b 30 5d 2c 20 22 64 61 74 61 62 61 73 65 73  g[0], "databases
31590 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
315a0 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b  ShellState data;
315b0 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  .    char *zErrM
315c0 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e  sg = 0;.    open
315d0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d  _db(p, 0);.    m
315e0 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20  emcpy(&data, p, 
315f0 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20  sizeof(data));. 
31600 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64     data.showHead
31610 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61  er = 0;.    data
31620 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f  .cMode = data.mo
31630 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a  de = MODE_List;.
31640 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
31650 69 6e 74 66 28 73 69 7a 65 6f 66 28 64 61 74 61  intf(sizeof(data
31660 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 64  .colSeparator),d
31670 61 74 61 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72  ata.colSeparator
31680 2c 22 3a 20 22 29 3b 0a 20 20 20 20 64 61 74 61  ,": ");.    data
31690 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 71  .cnt = 0;.    sq
316a0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
316b0 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20  , "SELECT name, 
316c0 66 69 6c 65 20 46 52 4f 4d 20 70 72 61 67 6d 61  file FROM pragma
316d0 5f 64 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c  _database_list",
316e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
316f0 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74    callback, &dat
31700 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  a, &zErrMsg);.  
31710 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
31720 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
31730 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
31740 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
31750 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
31760 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
31770 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
31780 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
31790 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 3d  f( c=='d' && n>=
317a0 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
317b0 72 67 5b 30 5d 2c 20 22 64 62 63 6f 6e 66 69 67  rg[0], "dbconfig
317c0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
317d0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
317e0 75 63 74 20 44 62 43 6f 6e 66 69 67 43 68 6f 69  uct DbConfigChoi
317f0 63 65 73 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ces {.      cons
31800 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
31810 20 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20       int op;.   
31820 20 7d 20 61 44 62 43 6f 6e 66 69 67 5b 5d 20 3d   } aDbConfig[] =
31830 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 22 65 6e   {.        { "en
31840 61 62 6c 65 5f 66 6b 65 79 22 2c 20 20 20 20 20  able_fkey",     
31850 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
31860 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 20 20 20 20  _ENABLE_FKEY    
31870 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
31880 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 74 72 69     { "enable_tri
31890 67 67 65 72 22 2c 20 20 20 53 51 4c 49 54 45 5f  gger",   SQLITE_
318a0 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
318b0 54 52 49 47 47 45 52 20 20 20 20 20 20 20 20 20  TRIGGER         
318c0 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 66 74  },.        { "ft
318d0 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 22 2c 20 20  s3_tokenizer",  
318e0 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
318f0 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b  _ENABLE_FTS3_TOK
31900 45 4e 49 5a 45 52 20 20 7d 2c 0a 20 20 20 20 20  ENIZER  },.     
31910 20 20 20 7b 20 22 6c 6f 61 64 5f 65 78 74 65 6e     { "load_exten
31920 73 69 6f 6e 22 2c 20 20 20 53 51 4c 49 54 45 5f  sion",   SQLITE_
31930 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
31940 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 20  LOAD_EXTENSION  
31950 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 6e 6f  },.        { "no
31960 5f 63 6b 70 74 5f 6f 6e 5f 63 6c 6f 73 65 22 2c  _ckpt_on_close",
31970 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
31980 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53  _NO_CKPT_ON_CLOS
31990 45 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  E       },.     
319a0 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 71 70 73     { "enable_qps
319b0 67 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f  g",      SQLITE_
319c0 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
319d0 51 50 53 47 20 20 20 20 20 20 20 20 20 20 20 20  QPSG            
319e0 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 74 72  },.        { "tr
319f0 69 67 67 65 72 5f 65 71 70 22 2c 20 20 20 20 20  igger_eqp",     
31a00 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
31a10 5f 54 52 49 47 47 45 52 5f 45 51 50 20 20 20 20  _TRIGGER_EQP    
31a20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
31a30 20 20 20 7b 20 22 72 65 73 65 74 5f 64 61 74 61     { "reset_data
31a40 62 61 73 65 22 2c 20 20 20 53 51 4c 49 54 45 5f  base",   SQLITE_
31a50 44 42 43 4f 4e 46 49 47 5f 52 45 53 45 54 5f 44  DBCONFIG_RESET_D
31a60 41 54 41 42 41 53 45 20 20 20 20 20 20 20 20 20  ATABASE         
31a70 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 64 65  },.        { "de
31a80 66 65 6e 73 69 76 65 22 2c 20 20 20 20 20 20 20  fensive",       
31a90 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
31aa0 5f 44 45 46 45 4e 53 49 56 45 20 20 20 20 20 20  _DEFENSIVE      
31ab0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7d          },.    }
31ac0 3b 0a 20 20 20 20 69 6e 74 20 69 69 2c 20 76 3b  ;.    int ii, v;
31ad0 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
31ae0 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  0);.    for(ii=0
31af0 3b 20 69 69 3c 41 72 72 61 79 53 69 7a 65 28 61  ; ii<ArraySize(a
31b00 44 62 43 6f 6e 66 69 67 29 3b 20 69 69 2b 2b 29  DbConfig); ii++)
31b10 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  {.      if( nArg
31b20 3e 31 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41  >1 && strcmp(azA
31b30 72 67 5b 31 5d 2c 20 61 44 62 43 6f 6e 66 69 67  rg[1], aDbConfig
31b40 5b 69 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29  [ii].zName)!=0 )
31b50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
31b60 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a   if( nArg>=3 ){.
31b70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
31b80 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c  db_config(p->db,
31b90 20 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 6f   aDbConfig[ii].o
31ba0 70 2c 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28  p, booleanValue(
31bb0 61 7a 41 72 67 5b 32 5d 29 2c 20 30 29 3b 0a 20  azArg[2]), 0);. 
31bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
31bd0 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70  ite3_db_config(p
31be0 2d 3e 64 62 2c 20 61 44 62 43 6f 6e 66 69 67 5b  ->db, aDbConfig[
31bf0 69 69 5d 2e 6f 70 2c 20 2d 31 2c 20 26 76 29 3b  ii].op, -1, &v);
31c00 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
31c10 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 38 73  tf(p->out, "%18s
31c20 20 25 73 5c 6e 22 2c 20 61 44 62 43 6f 6e 66 69   %s\n", aDbConfi
31c30 67 5b 69 69 5d 2e 7a 4e 61 6d 65 2c 20 76 20 3f  g[ii].zName, v ?
31c40 20 22 6f 6e 22 20 3a 20 22 6f 66 66 22 29 3b 0a   "on" : "off");.
31c50 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31        if( nArg>1
31c60 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
31c70 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26      if( nArg>1 &
31c80 26 20 69 69 3d 3d 41 72 72 61 79 53 69 7a 65 28  & ii==ArraySize(
31c90 61 44 62 43 6f 6e 66 69 67 29 20 29 7b 0a 20 20  aDbConfig) ){.  
31ca0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
31cb0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
31cc0 75 6e 6b 6e 6f 77 6e 20 64 62 63 6f 6e 66 69 67  unknown dbconfig
31cd0 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
31ce0 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 75 74 66  g[1]);.      utf
31cf0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
31d00 20 22 45 6e 74 65 72 20 5c 22 2e 64 62 63 6f 6e   "Enter \".dbcon
31d10 66 69 67 5c 22 20 77 69 74 68 20 6e 6f 20 61 72  fig\" with no ar
31d20 67 75 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c 69  guments for a li
31d30 73 74 5c 6e 22 29 3b 0a 20 20 20 20 7d 20 20 20  st\n");.    }   
31d40 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
31d50 63 3d 3d 27 64 27 20 26 26 20 6e 3e 3d 33 20 26  c=='d' && n>=3 &
31d60 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
31d70 30 5d 2c 20 22 64 62 69 6e 66 6f 22 2c 20 6e 29  0], "dbinfo", n)
31d80 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
31d90 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d  shell_dbinfo_com
31da0 6d 61 6e 64 28 70 2c 20 6e 41 72 67 2c 20 61 7a  mand(p, nArg, az
31db0 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  Arg);.  }else.. 
31dc0 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73   if( c=='d' && s
31dd0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
31de0 20 22 64 75 6d 70 22 2c 20 6e 29 3d 3d 30 20 29   "dump", n)==0 )
31df0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
31e00 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 0a 20 20 20   *zLike = 0;.   
31e10 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
31e20 73 61 76 65 64 53 68 6f 77 48 65 61 64 65 72 20  savedShowHeader 
31e30 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b  = p->showHeader;
31e40 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64 53 68  .    int savedSh
31e50 65 6c 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 68  ellFlags = p->sh
31e60 65 6c 6c 46 6c 67 73 3b 0a 20 20 20 20 53 68 65  ellFlgs;.    She
31e70 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53  llClearFlag(p, S
31e80 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77  HFLG_PreserveRow
31e90 69 64 7c 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65  id|SHFLG_Newline
31ea0 73 7c 53 48 46 4c 47 5f 45 63 68 6f 29 3b 0a 20  s|SHFLG_Echo);. 
31eb0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41     for(i=1; i<nA
31ec0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
31ed0 69 66 28 20 61 7a 41 72 67 5b 69 5d 5b 30 5d 3d  if( azArg[i][0]=
31ee0 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
31ef0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
31f00 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20 20 20 20  azArg[i]+1;.    
31f10 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
31f20 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) z++;.       
31f30 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 70   if( strcmp(z,"p
31f40 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 22 29  reserve-rowids")
31f50 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ==0 ){.#ifdef SQ
31f60 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
31f70 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 20  LTABLE.         
31f80 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
31f90 72 72 2c 20 22 54 68 65 20 2d 2d 70 72 65 73 65  rr, "The --prese
31fa0 72 76 65 2d 72 6f 77 69 64 73 20 6f 70 74 69 6f  rve-rowids optio
31fb0 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69  n is not compati
31fc0 62 6c 65 22 0a 20 20 20 20 20 20 20 20 20 20 20  ble".           
31fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31fe0 20 20 22 20 77 69 74 68 20 53 51 4c 49 54 45 5f    " with SQLITE_
31ff0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
32000 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  E\n");.         
32010 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
32020 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
32030 6d 61 6e 64 5f 65 78 69 74 3b 0a 23 65 6c 73 65  mand_exit;.#else
32040 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c  .          Shell
32050 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  SetFlag(p, SHFLG
32060 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 29 3b  _PreserveRowid);
32070 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
32080 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  }else.        if
32090 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e 65 77 6c  ( strcmp(z,"newl
320a0 69 6e 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ines")==0 ){.   
320b0 20 20 20 20 20 20 20 53 68 65 6c 6c 53 65 74 46         ShellSetF
320c0 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77  lag(p, SHFLG_New
320d0 6c 69 6e 65 73 29 3b 0a 20 20 20 20 20 20 20 20  lines);.        
320e0 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a  }else.        {.
320f0 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
32100 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e  intf(stderr, "Un
32110 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25  known option \"%
32120 73 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d 70 5c 22  s\" on \".dump\"
32130 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  \n", azArg[i]);.
32140 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
32150 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
32160 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
32170 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  it;.        }.  
32180 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c      }else if( zL
32190 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ike ){.        r
321a0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
321b0 2c 20 22 55 73 61 67 65 3a 20 2e 64 75 6d 70 20  , "Usage: .dump 
321c0 3f 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f 77 69  ?--preserve-rowi
321d0 64 73 3f 20 22 0a 20 20 20 20 20 20 20 20 20 20  ds? ".          
321e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321f0 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f 20 3f   "?--newlines? ?
32200 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22  LIKE-PATTERN?\n"
32210 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
32220 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
32230 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
32240 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
32250 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d 20          zLike = 
32260 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
32270 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  }.    }.    open
32280 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 2f  _db(p, 0);.    /
32290 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62  * When playing b
322a0 61 63 6b 20 61 20 22 64 75 6d 70 22 2c 20 74 68  ack a "dump", th
322b0 65 20 63 6f 6e 74 65 6e 74 20 6d 69 67 68 74 20  e content might 
322c0 61 70 70 65 61 72 20 69 6e 20 61 6e 20 6f 72 64  appear in an ord
322d0 65 72 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20  er.    ** which 
322e0 63 61 75 73 65 73 20 69 6d 6d 65 64 69 61 74 65  causes immediate
322f0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
32300 73 74 72 61 69 6e 74 73 20 74 6f 20 62 65 20 76  straints to be v
32310 69 6f 6c 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  iolated..    ** 
32320 53 6f 20 64 69 73 61 62 6c 65 20 66 6f 72 65 69  So disable forei
32330 67 6e 2d 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn-key constrain
32340 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 74 6f  t enforcement to
32350 20 70 72 65 76 65 6e 74 20 70 72 6f 62 6c 65 6d   prevent problem
32360 73 2e 20 2a 2f 0a 20 20 20 20 72 61 77 5f 70 72  s. */.    raw_pr
32370 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52  intf(p->out, "PR
32380 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
32390 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20  s=OFF;\n");.    
323a0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
323b0 74 2c 20 22 42 45 47 49 4e 20 54 52 41 4e 53 41  t, "BEGIN TRANSA
323c0 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20  CTION;\n");.    
323d0 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d  p->writableSchem
323e0 61 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 68  a = 0;.    p->sh
323f0 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  owHeader = 0;.  
32400 20 20 2f 2a 20 53 65 74 20 77 72 69 74 61 62 6c    /* Set writabl
32410 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 73 69 6e 63  e_schema=ON sinc
32420 65 20 64 6f 69 6e 67 20 73 6f 20 66 6f 72 63 65  e doing so force
32430 73 20 53 51 4c 69 74 65 20 74 6f 20 69 6e 69 74  s SQLite to init
32440 69 61 6c 69 7a 65 0a 20 20 20 20 2a 2a 20 61 73  ialize.    ** as
32450 20 6d 75 63 68 20 6f 66 20 74 68 65 20 73 63 68   much of the sch
32460 65 6d 61 20 61 73 20 69 74 20 63 61 6e 20 65 76  ema as it can ev
32470 65 6e 20 69 66 20 74 68 65 20 73 71 6c 69 74 65  en if the sqlite
32480 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 69 73  _master table is
32490 0a 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 2e  .    ** corrupt.
324a0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
324b0 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56  exec(p->db, "SAV
324c0 45 50 4f 49 4e 54 20 64 75 6d 70 3b 20 50 52 41  EPOINT dump; PRA
324d0 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
324e0 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20 30  ema=ON", 0, 0, 0
324f0 29 3b 0a 20 20 20 20 70 2d 3e 6e 45 72 72 20 3d  );.    p->nErr =
32500 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6b   0;.    if( zLik
32510 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 75  e==0 ){.      ru
32520 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75  n_schema_dump_qu
32530 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22  ery(p,.        "
32540 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70  SELECT name, typ
32550 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
32560 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
32570 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
32580 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65  OT NULL AND type
32590 3d 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61  =='table' AND na
325a0 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73 65 71 75  me!='sqlite_sequ
325b0 65 6e 63 65 27 22 0a 20 20 20 20 20 20 29 3b 0a  ence'".      );.
325c0 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61        run_schema
325d0 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20  _dump_query(p,. 
325e0 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
325f0 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46  ame, type, sql F
32600 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
32610 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
32620 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c 69 74 65  RE name=='sqlite
32630 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20  _sequence'".    
32640 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74    );.      run_t
32650 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28  able_dump_query(
32660 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  p,.        "SELE
32670 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  CT sql FROM sqli
32680 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
32690 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
326a0 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65  OT NULL AND type
326b0 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72   IN ('index','tr
326c0 69 67 67 65 72 27 2c 27 76 69 65 77 27 29 22 2c  igger','view')",
326d0 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
326e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
326f0 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20 20 7a  r *zSql;.      z
32700 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
32710 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22  rintf(.        "
32720 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70  SELECT name, typ
32730 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
32740 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
32750 20 20 20 20 22 57 48 45 52 45 20 74 62 6c 5f 6e      "WHERE tbl_n
32760 61 6d 65 20 4c 49 4b 45 20 25 51 20 41 4e 44 20  ame LIKE %Q AND 
32770 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 22 0a 20  type=='table'". 
32780 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 73 71         "  AND sq
32790 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 7a 4c 69  l NOT NULL", zLi
327a0 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73  ke);.      run_s
327b0 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79  chema_dump_query
327c0 28 70 2c 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  (p,zSql);.      
327d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
327e0 6c 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  l);.      zSql =
327f0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
32800 28 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  (.        "SELEC
32810 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  T sql FROM sqlit
32820 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
32830 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f     "WHERE sql NO
32840 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20  T NULL".        
32850 22 20 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28  "  AND type IN (
32860 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65 72  'index','trigger
32870 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20 20  ','view')".     
32880 20 20 20 22 20 20 41 4e 44 20 74 62 6c 5f 6e 61     "  AND tbl_na
32890 6d 65 20 4c 49 4b 45 20 25 51 22 2c 20 7a 4c 69  me LIKE %Q", zLi
328a0 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74  ke);.      run_t
328b0 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28  able_dump_query(
328c0 70 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 20  p, zSql, 0);.   
328d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
328e0 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
328f0 20 69 66 28 20 70 2d 3e 77 72 69 74 61 62 6c 65   if( p->writable
32900 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
32910 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
32920 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  t, "PRAGMA writa
32930 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 5c  ble_schema=OFF;\
32940 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72  n");.      p->wr
32950 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30  itableSchema = 0
32960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
32970 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
32980 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
32990 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30  _schema=OFF;", 0
329a0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
329b0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
329c0 20 22 52 45 4c 45 41 53 45 20 64 75 6d 70 3b 22   "RELEASE dump;"
329d0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
329e0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
329f0 74 2c 20 70 2d 3e 6e 45 72 72 20 3f 20 22 52 4f  t, p->nErr ? "RO
32a00 4c 4c 42 41 43 4b 3b 20 2d 2d 20 64 75 65 20 74  LLBACK; -- due t
32a10 6f 20 65 72 72 6f 72 73 5c 6e 22 20 3a 20 22 43  o errors\n" : "C
32a20 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 20 20  OMMIT;\n");.    
32a30 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  p->showHeader = 
32a40 73 61 76 65 64 53 68 6f 77 48 65 61 64 65 72 3b  savedShowHeader;
32a50 0a 20 20 20 20 70 2d 3e 73 68 65 6c 6c 46 6c 67  .    p->shellFlg
32a60 73 20 3d 20 73 61 76 65 64 53 68 65 6c 6c 46 6c  s = savedShellFl
32a70 61 67 73 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  ags;.  }else..  
32a80 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
32a90 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
32aa0 22 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b  "echo", n)==0 ){
32ab0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
32ac0 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43   ){.      setOrC
32ad0 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c  learFlag(p, SHFL
32ae0 47 5f 45 63 68 6f 2c 20 61 7a 41 72 67 5b 31 5d  G_Echo, azArg[1]
32af0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
32b00 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
32b10 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
32b20 65 63 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  echo on|off\n");
32b30 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
32b40 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
32b50 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
32b60 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
32b70 22 65 71 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  "eqp", n)==0 ){.
32b80 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
32b90 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  ){.      p->auto
32ba0 45 51 50 74 65 73 74 20 3d 20 30 3b 0a 20 20 20  EQPtest = 0;.   
32bb0 20 20 20 69 66 28 20 70 2d 3e 61 75 74 6f 45 51     if( p->autoEQ
32bc0 50 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  Ptrace ){.      
32bd0 20 20 69 66 28 20 70 2d 3e 64 62 20 29 20 73 71    if( p->db ) sq
32be0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
32bf0 2c 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 74  , "PRAGMA vdbe_t
32c00 72 61 63 65 3d 4f 46 46 3b 22 2c 20 30 2c 20 30  race=OFF;", 0, 0
32c10 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  , 0);.        p-
32c20 3e 61 75 74 6f 45 51 50 74 72 61 63 65 20 3d 20  >autoEQPtrace = 
32c30 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
32c40 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72   if( strcmp(azAr
32c50 67 5b 31 5d 2c 22 66 75 6c 6c 22 29 3d 3d 30 20  g[1],"full")==0 
32c60 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75  ){.        p->au
32c70 74 6f 45 51 50 20 3d 20 41 55 54 4f 45 51 50 5f  toEQP = AUTOEQP_
32c80 66 75 6c 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  full;.      }els
32c90 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41  e if( strcmp(azA
32ca0 72 67 5b 31 5d 2c 22 74 72 69 67 67 65 72 22 29  rg[1],"trigger")
32cb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
32cc0 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41 55 54 4f  ->autoEQP = AUTO
32cd0 45 51 50 5f 74 72 69 67 67 65 72 3b 0a 23 69 66  EQP_trigger;.#if
32ce0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
32cf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
32d00 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
32d10 2c 22 74 65 73 74 22 29 3d 3d 30 20 29 7b 0a 20  ,"test")==0 ){. 
32d20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51         p->autoEQ
32d30 50 20 3d 20 41 55 54 4f 45 51 50 5f 6f 6e 3b 0a  P = AUTOEQP_on;.
32d40 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45          p->autoE
32d50 51 50 74 65 73 74 20 3d 20 31 3b 0a 20 20 20 20  QPtest = 1;.    
32d60 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
32d70 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 72 61  mp(azArg[1],"tra
32d80 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ce")==0 ){.     
32d90 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20     p->autoEQP = 
32da0 41 55 54 4f 45 51 50 5f 66 75 6c 6c 3b 0a 20 20  AUTOEQP_full;.  
32db0 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50        p->autoEQP
32dc0 74 72 61 63 65 20 3d 20 31 3b 0a 20 20 20 20 20  trace = 1;.     
32dd0 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
32de0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
32df0 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53  3_exec(p->db, "S
32e00 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
32e10 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4c 49  sqlite_master LI
32e20 4d 49 54 20 31 22 2c 20 30 2c 20 30 2c 20 30 29  MIT 1", 0, 0, 0)
32e30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
32e40 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50  3_exec(p->db, "P
32e50 52 41 47 4d 41 20 76 64 62 65 5f 74 72 61 63 65  RAGMA vdbe_trace
32e60 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b  =ON;", 0, 0, 0);
32e70 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
32e80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  lse{.        p->
32e90 61 75 74 6f 45 51 50 20 3d 20 28 75 38 29 62 6f  autoEQP = (u8)bo
32ea0 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
32eb0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [1]);.      }.  
32ec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
32ed0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
32ee0 2c 20 22 55 73 61 67 65 3a 20 2e 65 71 70 20 6f  , "Usage: .eqp o
32ef0 66 66 7c 6f 6e 7c 74 72 61 63 65 7c 74 72 69 67  ff|on|trace|trig
32f00 67 65 72 7c 66 75 6c 6c 5c 6e 22 29 3b 0a 20 20  ger|full\n");.  
32f10 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
32f20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
32f30 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63   c=='e' && strnc
32f40 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78  mp(azArg[0], "ex
32f50 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  it", n)==0 ){.  
32f60 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20    if( nArg>1 && 
32f70 28 72 63 20 3d 20 28 69 6e 74 29 69 6e 74 65 67  (rc = (int)integ
32f80 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  erValue(azArg[1]
32f90 29 29 21 3d 30 20 29 20 65 78 69 74 28 72 63 29  ))!=0 ) exit(rc)
32fa0 3b 0a 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20  ;.    rc = 2;.  
32fb0 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20  }else..  /* The 
32fc0 22 2e 65 78 70 6c 61 69 6e 22 20 63 6f 6d 6d 61  ".explain" comma
32fd0 6e 64 20 69 73 20 61 75 74 6f 6d 61 74 69 63 20  nd is automatic 
32fe0 6e 6f 77 2e 20 20 49 74 20 69 73 20 6c 61 72 67  now.  It is larg
32ff0 65 6c 79 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20  ely pointless.  
33000 49 74 0a 20 20 2a 2a 20 72 65 74 61 69 6e 65 64  It.  ** retained
33010 20 70 75 72 65 6c 79 20 66 6f 72 20 62 61 63 6b   purely for back
33020 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
33030 69 74 79 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d  ity */.  if( c==
33040 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'e' && strncmp(a
33050 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70 6c 61 69  zArg[0], "explai
33060 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  n", n)==0 ){.   
33070 20 69 6e 74 20 76 61 6c 20 3d 20 31 3b 0a 20 20   int val = 1;.  
33080 20 20 69 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b    if( nArg>=2 ){
33090 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
330a0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61 75 74 6f  p(azArg[1],"auto
330b0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
330c0 20 76 61 6c 20 3d 20 39 39 3b 0a 20 20 20 20 20   val = 99;.     
330d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
330e0 76 61 6c 20 3d 20 20 62 6f 6f 6c 65 61 6e 56 61  val =  booleanVa
330f0 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
33100 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
33110 20 69 66 28 20 76 61 6c 3d 3d 31 20 26 26 20 70   if( val==1 && p
33120 2d 3e 6d 6f 64 65 21 3d 4d 4f 44 45 5f 45 78 70  ->mode!=MODE_Exp
33130 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d  lain ){.      p-
33140 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 20 3d 20 70 2d  >normalMode = p-
33150 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e  >mode;.      p->
33160 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c  mode = MODE_Expl
33170 61 69 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75  ain;.      p->au
33180 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20  toExplain = 0;. 
33190 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76 61 6c     }else if( val
331a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
331b0 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45   p->mode==MODE_E
331c0 78 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65  xplain ) p->mode
331d0 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65   = p->normalMode
331e0 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45  ;.      p->autoE
331f0 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20  xplain = 0;.    
33200 7d 65 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d 39  }else if( val==9
33210 39 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  9 ){.      if( p
33220 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70  ->mode==MODE_Exp
33230 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d  lain ) p->mode =
33240 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a   p->normalMode;.
33250 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70        p->autoExp
33260 6c 61 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  lain = 1;.    }.
33270 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66    }else..#ifndef
33280 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
33290 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
332a0 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d  c=='e' && strncm
332b0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70  p(azArg[0], "exp
332c0 65 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ert", n)==0 ){. 
332d0 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
332e0 3b 0a 20 20 20 20 65 78 70 65 72 74 44 6f 74 43  ;.    expertDotC
332f0 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c  ommand(p, azArg,
33300 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a   nArg);.  }else.
33310 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d  #endif..  if( c=
33320 3d 27 66 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='f' && strncmp(
33330 61 7a 41 72 67 5b 30 5d 2c 20 22 66 75 6c 6c 73  azArg[0], "fulls
33340 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29 7b  chema", n)==0 ){
33350 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74 65 20  .    ShellState 
33360 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a  data;.    char *
33370 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
33380 20 69 6e 74 20 64 6f 53 74 61 74 73 20 3d 20 30   int doStats = 0
33390 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
333a0 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61  ta, p, sizeof(da
333b0 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73  ta));.    data.s
333c0 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
333d0 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20     data.cMode = 
333e0 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
333f0 5f 53 65 6d 69 3b 0a 20 20 20 20 69 66 28 20 6e  _Semi;.    if( n
33400 41 72 67 3d 3d 32 20 26 26 20 6f 70 74 69 6f 6e  Arg==2 && option
33410 4d 61 74 63 68 28 61 7a 41 72 67 5b 31 5d 2c 20  Match(azArg[1], 
33420 22 69 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20 20  "indent") ){.   
33430 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20     data.cMode = 
33440 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
33450 5f 50 72 65 74 74 79 3b 0a 20 20 20 20 20 20 6e  _Pretty;.      n
33460 41 72 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Arg = 1;.    }. 
33470 20 20 20 69 66 28 20 6e 41 72 67 21 3d 31 20 29     if( nArg!=1 )
33480 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
33490 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
334a0 65 3a 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20 3f  e: .fullschema ?
334b0 2d 2d 69 6e 64 65 6e 74 3f 5c 6e 22 29 3b 0a 20  --indent?\n");. 
334c0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
334d0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
334e0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
334f0 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
33500 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0);.    rc = sql
33510 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
33520 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  .       "SELECT 
33530 73 71 6c 20 46 52 4f 4d 22 0a 20 20 20 20 20 20  sql FROM".      
33540 20 22 20 20 28 53 45 4c 45 43 54 20 73 71 6c 20   "  (SELECT sql 
33550 73 71 6c 2c 20 74 79 70 65 20 74 79 70 65 2c 20  sql, type type, 
33560 74 62 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d  tbl_name tbl_nam
33570 65 2c 20 6e 61 6d 65 20 6e 61 6d 65 2c 20 72 6f  e, name name, ro
33580 77 69 64 20 78 22 0a 20 20 20 20 20 20 20 22 20  wid x".       " 
33590 20 20 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f      FROM sqlite_
335a0 6d 61 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c 4c  master UNION ALL
335b0 22 0a 20 20 20 20 20 20 20 22 20 20 20 53 45 4c  ".       "   SEL
335c0 45 43 54 20 73 71 6c 2c 20 74 79 70 65 2c 20 74  ECT sql, type, t
335d0 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72  bl_name, name, r
335e0 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c 69 74 65  owid FROM sqlite
335f0 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 22 0a  _temp_master) ".
33600 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79         "WHERE ty
33610 70 65 21 3d 27 6d 65 74 61 27 20 41 4e 44 20 73  pe!='meta' AND s
33620 71 6c 20 4e 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e  ql NOTNULL AND n
33630 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71  ame NOT LIKE 'sq
33640 6c 69 74 65 5f 25 27 20 22 0a 20 20 20 20 20 20  lite_%' ".      
33650 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64   "ORDER BY rowid
33660 22 2c 0a 20 20 20 20 20 20 20 63 61 6c 6c 62 61  ",.       callba
33670 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
33680 4d 73 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  Msg.    );.    i
33690 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
336a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
336b0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
336c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
336d0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
336e0 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
336f0 20 20 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64     "SELECT rowid
33700 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
33710 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20  ter".           
33720 20 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65      " WHERE name
33730 20 47 4c 4f 42 20 27 73 71 6c 69 74 65 5f 73 74   GLOB 'sqlite_st
33740 61 74 5b 31 33 34 5d 27 22 2c 0a 20 20 20 20 20  at[134]'",.     
33750 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70            -1, &p
33760 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
33770 64 6f 53 74 61 74 73 20 3d 20 73 71 6c 69 74 65  doStats = sqlite
33780 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
33790 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 20  QLITE_ROW;.     
337a0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
337b0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  e(pStmt);.    }.
337c0 20 20 20 20 69 66 28 20 64 6f 53 74 61 74 73 3d      if( doStats=
337d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =0 ){.      raw_
337e0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
337f0 2f 2a 20 4e 6f 20 53 54 41 54 20 74 61 62 6c 65  /* No STAT table
33800 73 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 5c 6e  s available */\n
33810 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
33820 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
33830 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45  p->out, "ANALYZE
33840 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c   sqlite_master;\
33850 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n");.      sqlit
33860 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
33870 53 45 4c 45 43 54 20 27 41 4e 41 4c 59 5a 45 20  SELECT 'ANALYZE 
33880 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 27 22 2c  sqlite_master'",
33890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
338a0 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64      callback, &d
338b0 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  ata, &zErrMsg);.
338c0 20 20 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65        data.cMode
338d0 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d   = data.mode = M
338e0 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20  ODE_Insert;.    
338f0 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c    data.zDestTabl
33900 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74  e = "sqlite_stat
33910 31 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f  1";.      shell_
33920 65 78 65 63 28 26 64 61 74 61 2c 20 22 53 45 4c  exec(&data, "SEL
33930 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
33940 65 5f 73 74 61 74 31 22 2c 20 26 7a 45 72 72 4d  e_stat1", &zErrM
33950 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e  sg);.      data.
33960 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71  zDestTable = "sq
33970 6c 69 74 65 5f 73 74 61 74 33 22 3b 0a 20 20 20  lite_stat3";.   
33980 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 26 64     shell_exec(&d
33990 61 74 61 2c 20 22 53 45 4c 45 43 54 20 2a 20 46  ata, "SELECT * F
339a0 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 33  ROM sqlite_stat3
339b0 22 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ", &zErrMsg);.  
339c0 20 20 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61      data.zDestTa
339d0 62 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74  ble = "sqlite_st
339e0 61 74 34 22 3b 0a 20 20 20 20 20 20 73 68 65 6c  at4";.      shel
339f0 6c 5f 65 78 65 63 28 26 64 61 74 61 2c 20 22 53  l_exec(&data, "S
33a00 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
33a10 69 74 65 5f 73 74 61 74 34 22 2c 20 26 7a 45 72  ite_stat4", &zEr
33a20 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 61 77  rMsg);.      raw
33a30 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
33a40 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f  "ANALYZE sqlite_
33a50 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20  master;\n");.   
33a60 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
33a70 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72 6e  ( c=='h' && strn
33a80 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68  cmp(azArg[0], "h
33a90 65 61 64 65 72 73 22 2c 20 6e 29 3d 3d 30 20 29  eaders", n)==0 )
33aa0 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
33ab0 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  2 ){.      p->sh
33ac0 6f 77 48 65 61 64 65 72 20 3d 20 62 6f 6f 6c 65  owHeader = boole
33ad0 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
33ae0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
33af0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
33b00 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
33b10 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66 5c 6e  headers on|off\n
33b20 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
33b30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
33b40 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26 26  .  if( c=='h' &&
33b50 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
33b60 5d 2c 20 22 68 65 6c 70 22 2c 20 6e 29 3d 3d 30  ], "help", n)==0
33b70 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
33b80 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  >=2 ){.      n =
33b90 20 73 68 6f 77 48 65 6c 70 28 70 2d 3e 6f 75 74   showHelp(p->out
33ba0 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
33bb0 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
33bc0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
33bd0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 4e 6f 74 68  tf(p->out, "Noth
33be0 69 6e 67 20 6d 61 74 63 68 65 73 20 27 25 73 27  ing matches '%s'
33bf0 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  \n", azArg[1]);.
33c00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
33c10 65 7b 0a 20 20 20 20 20 20 73 68 6f 77 48 65 6c  e{.      showHel
33c20 70 28 70 2d 3e 6f 75 74 2c 20 30 29 3b 0a 20 20  p(p->out, 0);.  
33c30 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
33c40 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72  f( c=='i' && str
33c50 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
33c60 69 6d 70 6f 72 74 22 2c 20 6e 29 3d 3d 30 20 29  import", n)==0 )
33c70 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62  {.    char *zTab
33c80 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
33c90 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61    /* Insert data
33ca0 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65   into this table
33cb0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46   */.    char *zF
33cc0 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
33cd0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66      /* Name of f
33ce0 69 6c 65 20 74 6f 20 65 78 74 72 61 20 63 6f 6e  ile to extra con
33cf0 74 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  tent from */.   
33d00 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
33d10 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 2f 2a 20  Stmt = NULL; /* 
33d20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  A statement */. 
33d30 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
33d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33d50 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
33d60 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
33d70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
33d80 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
33d90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
33da0 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c   bytes in an SQL
33db0 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69   string */.    i
33dc0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
33dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
33de0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
33df0 20 20 20 69 6e 74 20 6e 65 65 64 43 6f 6d 6d 69     int needCommi
33e00 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
33e10 2a 20 54 72 75 65 20 74 6f 20 43 4f 4d 4d 49 54  * True to COMMIT
33e20 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 61 74 20   or ROLLBACK at 
33e30 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  end */.    int n
33e40 53 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sep;            
33e50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
33e60 20 6f 66 20 62 79 74 65 73 20 69 6e 20 70 2d 3e   of bytes in p->
33e70 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 5d 20 2a  colSeparator[] *
33e80 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  /.    char *zSql
33e90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33ea0 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74    /* An SQL stat
33eb0 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 49 6d 70  ement */.    Imp
33ec0 6f 72 74 43 74 78 20 73 43 74 78 3b 20 20 20 20  ortCtx sCtx;    
33ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
33ee0 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
33ef0 20 20 63 68 61 72 20 2a 28 53 51 4c 49 54 45 5f    char *(SQLITE_
33f00 43 44 45 43 4c 20 2a 78 52 65 61 64 29 28 49 6d  CDECL *xRead)(Im
33f10 70 6f 72 74 43 74 78 2a 29 3b 20 2f 2a 20 46 75  portCtx*); /* Fu
33f20 6e 63 20 74 6f 20 72 65 61 64 20 6f 6e 65 20 76  nc to read one v
33f30 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  alue */.    int 
33f40 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 78  (SQLITE_CDECL *x
33f50 43 6c 6f 73 65 72 29 28 46 49 4c 45 2a 29 3b 20  Closer)(FILE*); 
33f60 20 20 20 20 20 2f 2a 20 46 75 6e 63 20 74 6f 20       /* Func to 
33f70 63 6c 6f 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  close file */.. 
33f80 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29     if( nArg!=3 )
33f90 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
33fa0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
33fb0 65 3a 20 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20  e: .import FILE 
33fc0 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20  TABLE\n");.     
33fd0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
33fe0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
33ff0 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67     zFile = azArg
34000 5b 31 5d 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20  [1];.    zTable 
34010 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20  = azArg[2];.    
34020 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20  seenInterrupt = 
34030 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  0;.    memset(&s
34040 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Ctx, 0, sizeof(s
34050 43 74 78 29 29 3b 0a 20 20 20 20 6f 70 65 6e 5f  Ctx));.    open_
34060 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6e 53  db(p, 0);.    nS
34070 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d  ep = strlen30(p-
34080 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
34090 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20      if( nSep==0 
340a0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
340b0 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20  ntf(stderr,.    
340c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45 72               "Er
340d0 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 63 6f  ror: non-null co
340e0 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 72  lumn separator r
340f0 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d 70 6f  equired for impo
34100 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  rt\n");.      re
34110 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
34120 20 20 69 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a    if( nSep>1 ){.
34130 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
34140 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
34150 20 6d 75 6c 74 69 2d 63 68 61 72 61 63 74 65 72   multi-character
34160 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
34170 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a  rs not allowed".
34180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34190 20 20 20 20 20 20 22 20 66 6f 72 20 69 6d 70 6f        " for impo
341a0 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  rt\n");.      re
341b0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
341c0 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33    nSep = strlen3
341d0 30 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  0(p->rowSeparato
341e0 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70  r);.    if( nSep
341f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
34200 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
34210 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c  "Error: non-null
34220 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20 72   row separator r
34230 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d 70 6f  equired for impo
34240 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  rt\n");.      re
34250 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
34260 20 20 69 66 28 20 6e 53 65 70 3d 3d 32 20 26 26    if( nSep==2 &&
34270 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 43   p->mode==MODE_C
34280 73 76 20 26 26 20 73 74 72 63 6d 70 28 70 2d 3e  sv && strcmp(p->
34290 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45  rowSeparator, SE
342a0 50 5f 43 72 4c 66 29 3d 3d 30 20 29 7b 0a 20 20  P_CrLf)==0 ){.  
342b0 20 20 20 20 2f 2a 20 57 68 65 6e 20 69 6d 70 6f      /* When impo
342c0 72 74 69 6e 67 20 43 53 56 20 28 6f 6e 6c 79 29  rting CSV (only)
342d0 2c 20 69 66 20 74 68 65 20 72 6f 77 20 73 65 70  , if the row sep
342e0 61 72 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f  arator is set to
342f0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 65   the.      ** de
34300 66 61 75 6c 74 20 6f 75 74 70 75 74 20 72 6f 77  fault output row
34310 20 73 65 70 61 72 61 74 6f 72 2c 20 63 68 61 6e   separator, chan
34320 67 65 20 69 74 20 74 6f 20 74 68 65 20 64 65 66  ge it to the def
34330 61 75 6c 74 20 69 6e 70 75 74 0a 20 20 20 20 20  ault input.     
34340 20 2a 2a 20 72 6f 77 20 73 65 70 61 72 61 74 6f   ** row separato
34350 72 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73 20  r.  This avoids 
34360 68 61 76 69 6e 67 20 74 6f 20 6d 61 69 6e 74 61  having to mainta
34370 69 6e 20 64 69 66 66 65 72 65 6e 74 20 69 6e 70  in different inp
34380 75 74 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ut.      ** and 
34390 6f 75 74 70 75 74 20 72 6f 77 20 73 65 70 61 72  output row separ
343a0 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20  ators. */.      
343b0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
343c0 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65  (sizeof(p->rowSe
343d0 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77  parator), p->row
343e0 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52  Separator, SEP_R
343f0 6f 77 29 3b 0a 20 20 20 20 20 20 6e 53 65 70 20  ow);.      nSep 
34400 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 72 6f  = strlen30(p->ro
34410 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  wSeparator);.   
34420 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3e   }.    if( nSep>
34430 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  1 ){.      raw_p
34440 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
34450 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63 68 61 72  rror: multi-char
34460 61 63 74 65 72 20 72 6f 77 20 73 65 70 61 72 61  acter row separa
34470 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  tors not allowed
34480 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
34490 20 20 20 20 20 20 20 20 22 20 66 6f 72 20 69 6d          " for im
344a0 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20  port\n");.      
344b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
344c0 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 20 3d      sCtx.zFile =
344d0 20 7a 46 69 6c 65 3b 0a 20 20 20 20 73 43 74 78   zFile;.    sCtx
344e0 2e 6e 4c 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20  .nLine = 1;.    
344f0 69 66 28 20 73 43 74 78 2e 7a 46 69 6c 65 5b 30  if( sCtx.zFile[0
34500 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 64 65 66  ]=='|' ){.#ifdef
34510 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50   SQLITE_OMIT_POP
34520 45 4e 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  EN.      raw_pri
34530 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
34540 6f 72 3a 20 70 69 70 65 73 20 61 72 65 20 6e 6f  or: pipes are no
34550 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 74  t supported in t
34560 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20 20 20 20  his OS\n");.    
34570 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73    return 1;.#els
34580 65 0a 20 20 20 20 20 20 73 43 74 78 2e 69 6e 20  e.      sCtx.in 
34590 3d 20 70 6f 70 65 6e 28 73 43 74 78 2e 7a 46 69  = popen(sCtx.zFi
345a0 6c 65 2b 31 2c 20 22 72 22 29 3b 0a 20 20 20 20  le+1, "r");.    
345b0 20 20 73 43 74 78 2e 7a 46 69 6c 65 20 3d 20 22    sCtx.zFile = "
345c0 3c 70 69 70 65 3e 22 3b 0a 20 20 20 20 20 20 78  <pipe>";.      x
345d0 43 6c 6f 73 65 72 20 3d 20 70 63 6c 6f 73 65 3b  Closer = pclose;
345e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
345f0 65 7b 0a 20 20 20 20 20 20 73 43 74 78 2e 69 6e  e{.      sCtx.in
34600 20 3d 20 66 6f 70 65 6e 28 73 43 74 78 2e 7a 46   = fopen(sCtx.zF
34610 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20  ile, "rb");.    
34620 20 20 78 43 6c 6f 73 65 72 20 3d 20 66 63 6c 6f    xCloser = fclo
34630 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  se;.    }.    if
34640 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f  ( p->mode==MODE_
34650 41 73 63 69 69 20 29 7b 0a 20 20 20 20 20 20 78  Ascii ){.      x
34660 52 65 61 64 20 3d 20 61 73 63 69 69 5f 72 65 61  Read = ascii_rea
34670 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20  d_one_field;.   
34680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 78 52   }else{.      xR
34690 65 61 64 20 3d 20 63 73 76 5f 72 65 61 64 5f 6f  ead = csv_read_o
346a0 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20 20 7d 0a  ne_field;.    }.
346b0 20 20 20 20 69 66 28 20 73 43 74 78 2e 69 6e 3d      if( sCtx.in=
346c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =0 ){.      utf8
346d0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
346e0 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
346f0 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a  pen \"%s\"\n", z
34700 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 74  File);.      ret
34710 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
34720 20 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 3d 20   sCtx.cColSep = 
34730 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b  p->colSeparator[
34740 30 5d 3b 0a 20 20 20 20 73 43 74 78 2e 63 52 6f  0];.    sCtx.cRo
34750 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77 53 65 70  wSep = p->rowSep
34760 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20 20 20 7a  arator[0];.    z
34770 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
34780 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20  rintf("SELECT * 
34790 46 52 4f 4d 20 25 73 22 2c 20 7a 54 61 62 6c 65  FROM %s", zTable
347a0 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
347b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 78 43 6c 6f  =0 ){.      xClo
347c0 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20  ser(sCtx.in);.  
347d0 20 20 20 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66      shell_out_of
347e0 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d  _memory();.    }
347f0 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72  .    nByte = str
34800 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20  len30(zSql);.   
34810 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
34820 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
34830 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
34840 2c 20 30 29 3b 0a 20 20 20 20 69 6d 70 6f 72 74  , 0);.    import
34850 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 26 73 43  _append_char(&sC
34860 74 78 2c 20 30 29 3b 20 20 20 20 2f 2a 20 54 6f  tx, 0);    /* To
34870 20 65 6e 73 75 72 65 20 73 43 74 78 2e 7a 20 69   ensure sCtx.z i
34880 73 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  s allocated */. 
34890 20 20 20 69 66 28 20 72 63 20 26 26 20 73 71 6c     if( rc && sql
348a0 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 6e 6f  ite3_strglob("no
348b0 20 73 75 63 68 20 74 61 62 6c 65 3a 20 2a 22 2c   such table: *",
348c0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
348d0 70 2d 3e 64 62 29 29 3d 3d 30 20 29 7b 0a 20 20  p->db))==0 ){.  
348e0 20 20 20 20 63 68 61 72 20 2a 7a 43 72 65 61 74      char *zCreat
348f0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
34900 6e 74 66 28 22 43 52 45 41 54 45 20 54 41 42 4c  ntf("CREATE TABL
34910 45 20 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  E %s", zTable);.
34920 20 20 20 20 20 20 63 68 61 72 20 63 53 65 70 20        char cSep 
34930 3d 20 27 28 27 3b 0a 20 20 20 20 20 20 77 68 69  = '(';.      whi
34940 6c 65 28 20 78 52 65 61 64 28 26 73 43 74 78 29  le( xRead(&sCtx)
34950 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 72 65   ){.        zCre
34960 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ate = sqlite3_mp
34970 72 69 6e 74 66 28 22 25 7a 25 63 5c 6e 20 20 5c  rintf("%z%c\n  \
34980 22 25 77 5c 22 20 54 45 58 54 22 2c 20 7a 43 72  "%w\" TEXT", zCr
34990 65 61 74 65 2c 20 63 53 65 70 2c 20 73 43 74 78  eate, cSep, sCtx
349a0 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 63 53 65  .z);.        cSe
349b0 70 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20  p = ',';.       
349c0 20 69 66 28 20 73 43 74 78 2e 63 54 65 72 6d 21   if( sCtx.cTerm!
349d0 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 20  =sCtx.cColSep ) 
349e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
349f0 20 20 20 20 20 69 66 28 20 63 53 65 70 3d 3d 27       if( cSep=='
34a00 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  (' ){.        sq
34a10 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61  lite3_free(zCrea
34a20 74 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  te);.        sql
34a30 69 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a  ite3_free(sCtx.z
34a40 29 3b 0a 20 20 20 20 20 20 20 20 78 43 6c 6f 73  );.        xClos
34a50 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20  er(sCtx.in);.   
34a60 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
34a70 28 73 74 64 65 72 72 2c 22 25 73 3a 20 65 6d 70  (stderr,"%s: emp
34a80 74 79 20 66 69 6c 65 5c 6e 22 2c 20 73 43 74 78  ty file\n", sCtx
34a90 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  .zFile);.       
34aa0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
34ab0 20 7d 0a 20 20 20 20 20 20 7a 43 72 65 61 74 65   }.      zCreate
34ac0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
34ad0 74 66 28 22 25 7a 5c 6e 29 22 2c 20 7a 43 72 65  tf("%z\n)", zCre
34ae0 61 74 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ate);.      rc =
34af0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
34b00 3e 64 62 2c 20 7a 43 72 65 61 74 65 2c 20 30 2c  >db, zCreate, 0,
34b10 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
34b20 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61  lite3_free(zCrea
34b30 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  te);.      if( r
34b40 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  c ){.        utf
34b50 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
34b60 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
34b70 73 28 2e 2e 2e 29 20 66 61 69 6c 65 64 3a 20 25  s(...) failed: %
34b80 73 5c 6e 22 2c 20 7a 54 61 62 6c 65 2c 0a 20 20  s\n", zTable,.  
34b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
34ba0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
34bb0 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  db));.        sq
34bc0 6c 69 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e  lite3_free(sCtx.
34bd0 7a 29 3b 0a 20 20 20 20 20 20 20 20 78 43 6c 6f  z);.        xClo
34be0 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20  ser(sCtx.in);.  
34bf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
34c00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
34c10 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
34c20 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
34c30 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
34c40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
34c50 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
34c60 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
34c70 20 20 20 20 20 69 66 20 28 70 53 74 6d 74 29 20       if (pStmt) 
34c80 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
34c90 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 75  (pStmt);.      u
34ca0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
34cb0 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  r,"Error: %s\n",
34cc0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
34cd0 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 78  p->db));.      x
34ce0 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b  Closer(sCtx.in);
34cf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
34d00 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20  .    }.    nCol 
34d10 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
34d20 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
34d30 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
34d40 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
34d50 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69  pStmt = 0;.    i
34d60 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74  f( nCol==0 ) ret
34d70 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 63 6f 6c  urn 0; /* no col
34d80 75 6d 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a  umns, no error *
34d90 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  /.    zSql = sql
34da0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e  ite3_malloc64( n
34db0 42 79 74 65 2a 32 20 2b 20 32 30 20 2b 20 6e 43  Byte*2 + 20 + nC
34dc0 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ol*2 );.    if( 
34dd0 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
34de0 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e   xCloser(sCtx.in
34df0 29 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 6f  );.      shell_o
34e00 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a  ut_of_memory();.
34e10 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
34e20 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65  3_snprintf(nByte
34e30 2b 32 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45  +20, zSql, "INSE
34e40 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c 22 20 56  RT INTO \"%w\" V
34e50 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65  ALUES(?", zTable
34e60 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65  );.    j = strle
34e70 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66  n30(zSql);.    f
34e80 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=1; i<nCol; 
34e90 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c  i++){.      zSql
34ea0 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20  [j++] = ',';.   
34eb0 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
34ec0 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53  ?';.    }.    zS
34ed0 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20  ql[j++] = ')';. 
34ee0 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a     zSql[j] = 0;.
34ef0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34f00 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
34f10 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
34f20 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  tmt, 0);.    sql
34f30 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
34f40 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
34f50 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
34f60 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
34f70 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
34f80 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
34f90 20 20 20 20 20 20 69 66 20 28 70 53 74 6d 74 29        if (pStmt)
34fa0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
34fb0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
34fc0 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29  xCloser(sCtx.in)
34fd0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
34fe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 65 64  ;.    }.    need
34ff0 43 6f 6d 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  Commit = sqlite3
35000 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
35010 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20  p->db);.    if( 
35020 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c  needCommit ) sql
35030 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
35040 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20   "BEGIN", 0, 0, 
35050 30 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  0);.    do{.    
35060 20 20 69 6e 74 20 73 74 61 72 74 4c 69 6e 65 20    int startLine 
35070 3d 20 73 43 74 78 2e 6e 4c 69 6e 65 3b 0a 20 20  = sCtx.nLine;.  
35080 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
35090 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
350a0 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 78 52 65     char *z = xRe
350b0 61 64 28 26 73 43 74 78 29 3b 0a 20 20 20 20 20  ad(&sCtx);.     
350c0 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a     /*.        **
350d0 20 44 69 64 20 77 65 20 72 65 61 63 68 20 65 6e   Did we reach en
350e0 64 2d 6f 66 2d 66 69 6c 65 20 62 65 66 6f 72 65  d-of-file before
350f0 20 66 69 6e 64 69 6e 67 20 61 6e 79 20 63 6f 6c   finding any col
35100 75 6d 6e 73 3f 0a 20 20 20 20 20 20 20 20 2a 2a  umns?.        **
35110 20 49 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e 73   If so, stop ins
35120 74 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69 6c  tead of NULL fil
35130 6c 69 6e 67 20 74 68 65 20 72 65 6d 61 69 6e 69  ling the remaini
35140 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20  ng columns..    
35150 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
35160 66 28 20 7a 3d 3d 30 20 26 26 20 69 3d 3d 30 20  f( z==0 && i==0 
35170 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
35180 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44   /*.        ** D
35190 69 64 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d  id we reach end-
351a0 6f 66 2d 66 69 6c 65 20 4f 52 20 65 6e 64 2d 6f  of-file OR end-o
351b0 66 2d 6c 69 6e 65 20 62 65 66 6f 72 65 20 66 69  f-line before fi
351c0 6e 64 69 6e 67 20 61 6e 79 0a 20 20 20 20 20 20  nding any.      
351d0 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20    ** columns in 
351e0 41 53 43 49 49 20 6d 6f 64 65 3f 20 20 49 66 20  ASCII mode?  If 
351f0 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65 61 64  so, stop instead
35200 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67   of NULL filling
35210 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
35220 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  remaining column
35230 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
35240 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64        if( p->mod
35250 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20 26 26  e==MODE_Ascii &&
35260 20 28 7a 3d 3d 30 20 7c 7c 20 7a 5b 30 5d 3d 3d   (z==0 || z[0]==
35270 30 29 20 26 26 20 69 3d 3d 30 20 29 20 62 72 65  0) && i==0 ) bre
35280 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ak;.        sqli
35290 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
352a0 74 6d 74 2c 20 69 2b 31 2c 20 7a 2c 20 2d 31 2c  tmt, i+1, z, -1,
352b0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
352c0 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
352d0 69 3c 6e 43 6f 6c 2d 31 20 26 26 20 73 43 74 78  i<nCol-1 && sCtx
352e0 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e 63 43 6f  .cTerm!=sCtx.cCo
352f0 6c 53 65 70 20 29 7b 0a 20 20 20 20 20 20 20 20  lSep ){.        
35300 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
35310 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 65 78  derr, "%s:%d: ex
35320 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e  pected %d column
35330 73 20 62 75 74 20 66 6f 75 6e 64 20 25 64 20 2d  s but found %d -
35340 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
35350 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66 69               "fi
35360 6c 6c 69 6e 67 20 74 68 65 20 72 65 73 74 20 77  lling the rest w
35370 69 74 68 20 4e 55 4c 4c 5c 6e 22 2c 0a 20 20 20  ith NULL\n",.   
35380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35390 20 20 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c         sCtx.zFil
353a0 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e 43  e, startLine, nC
353b0 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  ol, i+1);.      
353c0 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20      i += 2;.    
353d0 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c 3d        while( i<=
353e0 6e 43 6f 6c 20 29 7b 20 73 71 6c 69 74 65 33 5f  nCol ){ sqlite3_
353f0 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
35400 20 69 29 3b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20   i); i++; }.    
35410 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35420 20 20 20 20 69 66 28 20 73 43 74 78 2e 63 54 65      if( sCtx.cTe
35430 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70  rm==sCtx.cColSep
35440 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
35450 20 20 20 20 20 20 20 20 20 20 78 52 65 61 64 28            xRead(
35460 26 73 43 74 78 29 3b 0a 20 20 20 20 20 20 20 20  &sCtx);.        
35470 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d    i++;.        }
35480 77 68 69 6c 65 28 20 73 43 74 78 2e 63 54 65 72  while( sCtx.cTer
35490 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20  m==sCtx.cColSep 
354a0 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  );.        utf8_
354b0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
354c0 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65 64 20  %s:%d: expected 
354d0 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 66  %d columns but f
354e0 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20 20 20  ound %d - ".    
354f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35500 20 20 20 20 22 65 78 74 72 61 73 20 69 67 6e 6f      "extras igno
35510 72 65 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  red\n",.        
35520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35530 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61 72  sCtx.zFile, star
35540 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 29 3b  tLine, nCol, i);
35550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
35560 66 28 20 69 3e 3d 6e 43 6f 6c 20 29 7b 0a 20 20  f( i>=nCol ){.  
35570 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
35580 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ep(pStmt);.     
35590 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
355a0 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
355b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
355c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
355d0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
355e0 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
355f0 20 49 4e 53 45 52 54 20 66 61 69 6c 65 64 3a 20   INSERT failed: 
35600 25 73 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69 6c  %s\n", sCtx.zFil
35610 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
35620 20 20 20 20 20 20 20 20 20 73 74 61 72 74 4c 69           startLi
35630 6e 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  ne, sqlite3_errm
35640 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
35650 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35660 20 20 7d 77 68 69 6c 65 28 20 73 43 74 78 2e 63    }while( sCtx.c
35670 54 65 72 6d 21 3d 45 4f 46 20 29 3b 0a 0a 20 20  Term!=EOF );..  
35680 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69    xCloser(sCtx.i
35690 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  n);.    sqlite3_
356a0 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20  free(sCtx.z);.  
356b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
356c0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  ze(pStmt);.    i
356d0 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20  f( needCommit ) 
356e0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
356f0 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  db, "COMMIT", 0,
35700 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 0a   0, 0);.  }else.
35710 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
35720 55 4e 54 45 53 54 41 42 4c 45 0a 20 20 69 66 28  UNTESTABLE.  if(
35730 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63   c=='i' && strnc
35740 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d  mp(azArg[0], "im
35750 70 6f 73 74 65 72 22 2c 20 6e 29 3d 3d 30 20 29  poster", n)==0 )
35760 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  {.    char *zSql
35770 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c  ;.    char *zCol
35780 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 73 71  list = 0;.    sq
35790 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
357a0 74 3b 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d 20  t;.    int tnum 
357b0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  = 0;.    int i;.
357c0 20 20 20 20 69 66 28 20 21 28 6e 41 72 67 3d 3d      if( !(nArg==
357d0 33 20 7c 7c 20 28 6e 41 72 67 3d 3d 32 20 26 26  3 || (nArg==2 &&
357e0 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
357f0 28 61 7a 41 72 67 5b 31 5d 2c 22 6f 66 66 22 29  (azArg[1],"off")
35800 3d 3d 30 29 29 20 29 7b 0a 20 20 20 20 20 20 75  ==0)) ){.      u
35810 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
35820 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f  r, "Usage: .impo
35830 73 74 65 72 20 49 4e 44 45 58 20 49 4d 50 4f 53  ster INDEX IMPOS
35840 54 45 52 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  TER\n".         
35850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35860 20 22 20 20 20 20 20 20 20 2e 69 6d 70 6f 73 74   "       .impost
35870 65 72 20 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20  er off\n");.    
35880 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
35890 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
358a0 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
358b0 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
358c0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
358d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
358e0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
358f0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
35900 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20  MPOSTER, p->db, 
35910 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29 3b 0a 20  "main", 0, 1);. 
35920 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
35930 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
35940 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71   }.    zSql = sq
35950 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
35960 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46  ELECT rootpage F
35970 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
35980 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
35990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
359a0 57 48 45 52 45 20 6e 61 6d 65 3d 27 25 71 27 20  WHERE name='%q' 
359b0 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27  AND type='index'
359c0 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
359d0 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
359e0 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
359f0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
35a00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
35a10 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
35a20 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
35a30 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
35a40 57 20 29 7b 0a 20 20 20 20 20 20 74 6e 75 6d 20  W ){.      tnum 
35a50 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
35a60 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
35a70 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
35a80 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
35a90 29 3b 0a 20 20 20 20 69 66 28 20 74 6e 75 6d 3d  );.    if( tnum=
35aa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =0 ){.      utf8
35ab0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
35ac0 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
35ad0 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67  \"%s\"\n", azArg
35ae0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  [1]);.      rc =
35af0 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
35b00 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
35b10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c  ;.    }.    zSql
35b20 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
35b30 74 66 28 22 50 52 41 47 4d 41 20 69 6e 64 65 78  tf("PRAGMA index
35b40 5f 78 69 6e 66 6f 3d 27 25 71 27 22 2c 20 61 7a  _xinfo='%q'", az
35b50 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 72 63 20  Arg[1]);.    rc 
35b60 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
35b70 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
35b80 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
35b90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
35ba0 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 20  ee(zSql);.    i 
35bb0 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
35bc0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
35bd0 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
35be0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4c  ){.      char zL
35bf0 61 62 65 6c 5b 32 30 5d 3b 0a 20 20 20 20 20 20  abel[20];.      
35c00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
35c10 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
35c20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
35c30 65 78 74 28 70 53 74 6d 74 2c 32 29 3b 0a 20 20  ext(pStmt,2);.  
35c40 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69      i++;.      i
35c50 66 28 20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  f( zCol==0 ){.  
35c60 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
35c70 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
35c80 6d 74 2c 31 29 3d 3d 2d 31 20 29 7b 0a 20 20 20  mt,1)==-1 ){.   
35c90 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f         zCol = "_
35ca0 52 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20 20 20  ROWID_";.       
35cb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35cc0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
35cd0 74 66 28 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c  tf(sizeof(zLabel
35ce0 29 2c 7a 4c 61 62 65 6c 2c 22 65 78 70 72 25 64  ),zLabel,"expr%d
35cf0 22 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",i);.          
35d00 7a 43 6f 6c 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20  zCol = zLabel;. 
35d10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35d20 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c  .      if( zColl
35d30 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
35d40 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c    zCollist = sql
35d50 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22  ite3_mprintf("\"
35d60 25 77 5c 22 22 2c 20 7a 43 6f 6c 29 3b 0a 20 20  %w\"", zCol);.  
35d70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35d80 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71     zCollist = sq
35d90 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
35da0 7a 2c 5c 22 25 77 5c 22 22 2c 20 7a 43 6f 6c 6c  z,\"%w\"", zColl
35db0 69 73 74 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  ist, zCol);.    
35dc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
35dd0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
35de0 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20  Stmt);.    zSql 
35df0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
35e00 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  f(.          "CR
35e10 45 41 54 45 20 54 41 42 4c 45 20 5c 22 25 77 5c  EATE TABLE \"%w\
35e20 22 28 25 73 2c 50 52 49 4d 41 52 59 20 4b 45 59  "(%s,PRIMARY KEY
35e30 28 25 73 29 29 57 49 54 48 4f 55 54 20 52 4f 57  (%s))WITHOUT ROW
35e40 49 44 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61  ID",.          a
35e50 7a 41 72 67 5b 32 5d 2c 20 7a 43 6f 6c 6c 69 73  zArg[2], zCollis
35e60 74 2c 20 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20  t, zCollist);.  
35e70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
35e80 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 72 63  Collist);.    rc
35e90 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f   = sqlite3_test_
35ea0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
35eb0 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
35ec0 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c  , p->db, "main",
35ed0 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 69   1, tnum);.    i
35ee0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35ef0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
35f00 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
35f10 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30  b, zSql, 0, 0, 0
35f20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
35f30 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
35f40 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
35f50 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22  POSTER, p->db, "
35f60 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20  main", 0, 0);.  
35f70 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
35f80 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
35f90 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
35fa0 20 69 6e 20 5b 25 73 5d 3a 20 25 73 5c 6e 22 2c   in [%s]: %s\n",
35fb0 20 7a 53 71 6c 2c 20 73 71 6c 69 74 65 33 5f 65   zSql, sqlite3_e
35fc0 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
35fd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
35fe0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
35ff0 73 74 64 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c  stdout, "%s;\n",
36000 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20   zSql);.        
36010 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 6f 75  raw_printf(stdou
36020 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 57  t,.           "W
36030 41 52 4e 49 4e 47 3a 20 77 72 69 74 69 6e 67 20  ARNING: writing 
36040 74 6f 20 61 6e 20 69 6d 70 6f 73 74 65 72 20 74  to an imposter t
36050 61 62 6c 65 20 77 69 6c 6c 20 63 6f 72 72 75 70  able will corrup
36060 74 20 74 68 65 20 69 6e 64 65 78 21 5c 6e 22 0a  t the index!\n".
36070 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
36080 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
36090 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
360a0 74 64 65 72 72 2c 20 22 53 51 4c 49 54 45 5f 54  tderr, "SQLITE_T
360b0 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
360c0 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20   returns %d\n", 
360d0 72 63 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rc);.      rc = 
360e0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  1;.    }.    sql
360f0 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
36100 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
36110 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
36120 54 45 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e  TE_OMIT_TEST_CON
36130 54 52 4f 4c 29 20 2a 2f 0a 0a 23 69 66 64 65 66  TROL) */..#ifdef
36140 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
36150 4f 54 52 41 43 45 0a 20 20 69 66 28 20 63 3d 3d  OTRACE.  if( c==
36160 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'i' && strncmp(a
36170 7a 41 72 67 5b 30 5d 2c 20 22 69 6f 74 72 61 63  zArg[0], "iotrac
36180 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
36190 20 53 51 4c 49 54 45 5f 41 50 49 20 65 78 74 65   SQLITE_API exte
361a0 72 6e 20 76 6f 69 64 20 28 53 51 4c 49 54 45 5f  rn void (SQLITE_
361b0 43 44 45 43 4c 20 2a 73 71 6c 69 74 65 33 49 6f  CDECL *sqlite3Io
361c0 54 72 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61  Trace)(const cha
361d0 72 2a 2c 20 2e 2e 2e 29 3b 0a 20 20 20 20 69 66  r*, ...);.    if
361e0 28 20 69 6f 74 72 61 63 65 20 26 26 20 69 6f 74  ( iotrace && iot
361f0 72 61 63 65 21 3d 73 74 64 6f 75 74 20 29 20 66  race!=stdout ) f
36200 63 6c 6f 73 65 28 69 6f 74 72 61 63 65 29 3b 0a  close(iotrace);.
36210 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20 30 3b      iotrace = 0;
36220 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20  .    if( nArg<2 
36230 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
36240 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  IoTrace = 0;.   
36250 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
36260 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22 2d 22 29  p(azArg[1], "-")
36270 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
36280 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f  ite3IoTrace = io
36290 74 72 61 63 65 50 72 69 6e 74 66 3b 0a 20 20 20  tracePrintf;.   
362a0 20 20 20 69 6f 74 72 61 63 65 20 3d 20 73 74 64     iotrace = std
362b0 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  out;.    }else{.
362c0 20 20 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20        iotrace = 
362d0 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20  fopen(azArg[1], 
362e0 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  "w");.      if( 
362f0 69 6f 74 72 61 63 65 3d 3d 30 20 29 7b 0a 20 20  iotrace==0 ){.  
36300 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
36310 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
36320 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
36330 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31  %s\"\n", azArg[1
36340 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ]);.        sqli
36350 74 65 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a  te3IoTrace = 0;.
36360 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
36370 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
36380 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72       sqlite3IoTr
36390 61 63 65 20 3d 20 69 6f 74 72 61 63 65 50 72 69  ace = iotracePri
363a0 6e 74 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ntf;.      }.   
363b0 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
363c0 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20  f..  if( c=='l' 
363d0 26 26 20 6e 3e 3d 35 20 26 26 20 73 74 72 6e 63  && n>=5 && strnc
363e0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69  mp(azArg[0], "li
363f0 6d 69 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  mits", n)==0 ){.
36400 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
36410 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20   struct {.      
36420 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69   const char *zLi
36430 6d 69 74 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61  mitName;   /* Na
36440 6d 65 20 6f 66 20 61 20 6c 69 6d 69 74 20 2a 2f  me of a limit */
36450 0a 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69  .       int limi
36460 74 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  tCode;          
36470 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 63 6f 64    /* Integer cod
36480 65 20 66 6f 72 20 74 68 61 74 20 6c 69 6d 69 74  e for that limit
36490 20 2a 2f 0a 20 20 20 20 7d 20 61 4c 69 6d 69 74   */.    } aLimit
364a0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22  [] = {.      { "
364b0 6c 65 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20  length",        
364c0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
364d0 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20 20 20  IMIT_LENGTH     
364e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
364f0 2c 0a 20 20 20 20 20 20 7b 20 22 73 71 6c 5f 6c  ,.      { "sql_l
36500 65 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20 20  ength",         
36510 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
36520 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20 20  SQL_LENGTH      
36530 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
36540 20 20 20 7b 20 22 63 6f 6c 75 6d 6e 22 2c 20 20     { "column",  
36550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
36560 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
36570 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
36580 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
36590 22 65 78 70 72 5f 64 65 70 74 68 22 2c 20 20 20  "expr_depth",   
365a0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
365b0 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48  LIMIT_EXPR_DEPTH
365c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
365d0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 6f 6d 70  },.      { "comp
365e0 6f 75 6e 64 5f 73 65 6c 65 63 74 22 2c 20 20 20  ound_select",   
365f0 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
36600 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
36610 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
36620 20 20 20 20 7b 20 22 76 64 62 65 5f 6f 70 22 2c      { "vdbe_op",
36630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
36640 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45  QLITE_LIMIT_VDBE
36650 5f 4f 50 20 20 20 20 20 20 20 20 20 20 20 20 20  _OP             
36660 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
36670 20 22 66 75 6e 63 74 69 6f 6e 5f 61 72 67 22 2c   "function_arg",
36680 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
36690 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f  _LIMIT_FUNCTION_
366a0 41 52 47 20 20 20 20 20 20 20 20 20 20 20 20 20  ARG             
366b0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 61 74 74   },.      { "att
366c0 61 63 68 65 64 22 2c 20 20 20 20 20 20 20 20 20  ached",         
366d0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
366e0 54 5f 41 54 54 41 43 48 45 44 20 20 20 20 20 20  T_ATTACHED      
366f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
36700 20 20 20 20 20 7b 20 22 6c 69 6b 65 5f 70 61 74       { "like_pat
36710 74 65 72 6e 5f 6c 65 6e 67 74 68 22 2c 20 20 20  tern_length",   
36720 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b  SQLITE_LIMIT_LIK
36730 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
36740 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
36750 7b 20 22 76 61 72 69 61 62 6c 65 5f 6e 75 6d 62  { "variable_numb
36760 65 72 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54  er",       SQLIT
36770 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
36780 5f 4e 55 4d 42 45 52 20 20 20 20 20 20 20 20 20  _NUMBER         
36790 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 74 72    },.      { "tr
367a0 69 67 67 65 72 5f 64 65 70 74 68 22 2c 20 20 20  igger_depth",   
367b0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
367c0 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
367d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
367e0 20 20 20 20 20 20 7b 20 22 77 6f 72 6b 65 72 5f        { "worker_
367f0 74 68 72 65 61 64 73 22 2c 20 20 20 20 20 20 20  threads",       
36800 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f   SQLITE_LIMIT_WO
36810 52 4b 45 52 5f 54 48 52 45 41 44 53 20 20 20 20  RKER_THREADS    
36820 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7d          },.    }
36830 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 32 3b  ;.    int i, n2;
36840 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
36850 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  0);.    if( nArg
36860 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==1 ){.      for
36870 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
36880 65 28 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29 7b  e(aLimit); i++){
36890 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  .        printf(
368a0 22 25 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c 69  "%20s %d\n", aLi
368b0 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d  mit[i].zLimitNam
368c0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
368d0 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28    sqlite3_limit(
368e0 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 5d  p->db, aLimit[i]
368f0 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29  .limitCode, -1))
36900 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
36910 6c 73 65 20 69 66 28 20 6e 41 72 67 3e 33 20 29  lse if( nArg>3 )
36920 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
36930 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
36940 65 3a 20 2e 6c 69 6d 69 74 20 4e 41 4d 45 20 3f  e: .limit NAME ?
36950 4e 45 57 2d 56 41 4c 55 45 3f 5c 6e 22 29 3b 0a  NEW-VALUE?\n");.
36960 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
36970 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
36980 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
36990 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
369a0 20 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20   iLimit = -1;.  
369b0 20 20 20 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33      n2 = strlen3
369c0 30 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  0(azArg[1]);.   
369d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
369e0 72 61 79 53 69 7a 65 28 61 4c 69 6d 69 74 29 3b  raySize(aLimit);
369f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
36a00 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  f( sqlite3_strni
36a10 63 6d 70 28 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c  cmp(aLimit[i].zL
36a20 69 6d 69 74 4e 61 6d 65 2c 20 61 7a 41 72 67 5b  imitName, azArg[
36a30 31 5d 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  1], n2)==0 ){.  
36a40 20 20 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d          if( iLim
36a50 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  it<0 ){.        
36a60 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 69 3b 0a      iLimit = i;.
36a70 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
36a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
36a90 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
36aa0 20 22 61 6d 62 69 67 75 6f 75 73 20 6c 69 6d 69   "ambiguous limi
36ab0 74 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  t: \"%s\"\n", az
36ac0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
36ad0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
36ae0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65           goto me
36af0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
36b00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
36b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
36b20 20 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c       if( iLimit<
36b30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
36b40 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
36b50 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 3a   "unknown limit:
36b60 20 5c 22 25 73 5c 22 5c 6e 22 0a 20 20 20 20 20   \"%s\"\n".     
36b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b80 20 20 20 22 65 6e 74 65 72 20 5c 22 2e 6c 69 6d     "enter \".lim
36b90 69 74 73 5c 22 20 77 69 74 68 20 6e 6f 20 61 72  its\" with no ar
36ba0 67 75 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c 69  guments for a li
36bb0 73 74 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  st.\n",.        
36bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36bd0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
36be0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
36bf0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
36c00 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
36c10 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 41    }.      if( nA
36c20 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  rg==3 ){.       
36c30 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70   sqlite3_limit(p
36c40 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69  ->db, aLimit[iLi
36c50 6d 69 74 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 0a  mit].limitCode,.
36c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c70 20 20 20 20 20 20 28 69 6e 74 29 69 6e 74 65 67        (int)integ
36c80 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d  erValue(azArg[2]
36c90 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
36ca0 20 20 70 72 69 6e 74 66 28 22 25 32 30 73 20 25    printf("%20s %
36cb0 64 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b 69 4c 69  d\n", aLimit[iLi
36cc0 6d 69 74 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c  mit].zLimitName,
36cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
36ce0 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64  lite3_limit(p->d
36cf0 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74  b, aLimit[iLimit
36d00 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29  ].limitCode, -1)
36d10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
36d20 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26  ..  if( c=='l' &
36d30 26 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d 70  & n>2 && strncmp
36d40 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6e 74  (azArg[0], "lint
36d50 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
36d60 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
36d70 20 20 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e     lintDotComman
36d80 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67  d(p, azArg, nArg
36d90 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  );.  }else..#ifn
36da0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36db0 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
36dc0 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 73   if( c=='l' && s
36dd0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
36de0 20 22 6c 6f 61 64 22 2c 20 6e 29 3d 3d 30 20 29   "load", n)==0 )
36df0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
36e00 20 2a 7a 46 69 6c 65 2c 20 2a 7a 50 72 6f 63 3b   *zFile, *zProc;
36e10 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  .    char *zErrM
36e20 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  sg = 0;.    if( 
36e30 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20  nArg<2 ){.      
36e40 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
36e50 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f 61 64  r, "Usage: .load
36e60 20 46 49 4c 45 20 3f 45 4e 54 52 59 50 4f 49 4e   FILE ?ENTRYPOIN
36e70 54 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  T?\n");.      rc
36e80 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
36e90 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
36ea0 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46  it;.    }.    zF
36eb0 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  ile = azArg[1];.
36ec0 20 20 20 20 7a 50 72 6f 63 20 3d 20 6e 41 72 67      zProc = nArg
36ed0 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a  >=3 ? azArg[2] :
36ee0 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   0;.    open_db(
36ef0 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  p, 0);.    rc = 
36f00 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74  sqlite3_load_ext
36f10 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 7a 46  ension(p->db, zF
36f20 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72  ile, zProc, &zEr
36f30 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72  rMsg);.    if( r
36f40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
36f50 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
36f60 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
36f70 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
36f80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
36f90 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
36fa0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
36fb0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
36fc0 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27  if..  if( c=='l'
36fd0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
36fe0 67 5b 30 5d 2c 20 22 6c 6f 67 22 2c 20 6e 29 3d  g[0], "log", n)=
36ff0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
37000 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72  rg!=2 ){.      r
37010 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
37020 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f 67 20 46  , "Usage: .log F
37030 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20  ILENAME\n");.   
37040 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
37050 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73  else{.      cons
37060 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20  t char *zFile = 
37070 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20  azArg[1];.      
37080 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73  output_file_clos
37090 65 28 70 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20 20  e(p->pLog);.    
370a0 20 20 70 2d 3e 70 4c 6f 67 20 3d 20 6f 75 74 70    p->pLog = outp
370b0 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a 46 69  ut_file_open(zFi
370c0 6c 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  le, 0);.    }.  
370d0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
370e0 27 6d 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'm' && strncmp(a
370f0 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f 64 65 22 2c  zArg[0], "mode",
37100 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f   n)==0 ){.    co
37110 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20  nst char *zMode 
37120 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72  = nArg>=2 ? azAr
37130 67 5b 31 5d 20 3a 20 22 22 3b 0a 20 20 20 20 69  g[1] : "";.    i
37140 6e 74 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30  nt n2 = strlen30
37150 28 7a 4d 6f 64 65 29 3b 0a 20 20 20 20 69 6e 74  (zMode);.    int
37160 20 63 32 20 3d 20 7a 4d 6f 64 65 5b 30 5d 3b 0a   c2 = zMode[0];.
37170 20 20 20 20 69 66 28 20 63 32 3d 3d 27 6c 27 20      if( c2=='l' 
37180 26 26 20 6e 32 3e 32 20 26 26 20 73 74 72 6e 63  && n2>2 && strnc
37190 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e  mp(azArg[1],"lin
371a0 65 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  es",n2)==0 ){.  
371b0 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
371c0 44 45 5f 4c 69 6e 65 3b 0a 20 20 20 20 20 20 73  DE_Line;.      s
371d0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
371e0 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
371f0 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
37200 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f  eparator, SEP_Ro
37210 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  w);.    }else if
37220 28 20 63 32 3d 3d 27 63 27 20 26 26 20 73 74 72  ( c2=='c' && str
37230 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63  ncmp(azArg[1],"c
37240 6f 6c 75 6d 6e 73 22 2c 6e 32 29 3d 3d 30 20 29  olumns",n2)==0 )
37250 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
37260 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20  = MODE_Column;. 
37270 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
37280 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
37290 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70  rowSeparator), p
372a0 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
372b0 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65  SEP_Row);.    }e
372c0 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 6c 27 20  lse if( c2=='l' 
372d0 26 26 20 6e 32 3e 32 20 26 26 20 73 74 72 6e 63  && n2>2 && strnc
372e0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 73  mp(azArg[1],"lis
372f0 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  t",n2)==0 ){.   
37300 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
37310 45 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71  E_List;.      sq
37320 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
37330 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61  izeof(p->colSepa
37340 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65  rator), p->colSe
37350 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6c  parator, SEP_Col
37360 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  umn);.      sqli
37370 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
37380 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
37390 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61  tor), p->rowSepa
373a0 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b  rator, SEP_Row);
373b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
373c0 32 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d  2=='h' && strncm
373d0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 68 74 6d 6c  p(azArg[1],"html
373e0 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
373f0 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
37400 5f 48 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  _Html;.    }else
37410 20 69 66 28 20 63 32 3d 3d 27 74 27 20 26 26 20   if( c2=='t' && 
37420 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
37430 2c 22 74 63 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b  ,"tcl",n2)==0 ){
37440 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
37450 20 4d 4f 44 45 5f 54 63 6c 3b 0a 20 20 20 20 20   MODE_Tcl;.     
37460 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
37470 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53  f(sizeof(p->colS
37480 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f  eparator), p->co
37490 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  lSeparator, SEP_
374a0 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 73 71  Space);.      sq
374b0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
374c0 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
374d0 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65  rator), p->rowSe
374e0 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77  parator, SEP_Row
374f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
37500 20 63 32 3d 3d 27 63 27 20 26 26 20 73 74 72 6e   c2=='c' && strn
37510 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 73  cmp(azArg[1],"cs
37520 76 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  v",n2)==0 ){.   
37530 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
37540 45 5f 43 73 76 3b 0a 20 20 20 20 20 20 73 71 6c  E_Csv;.      sql
37550 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
37560 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72  zeof(p->colSepar
37570 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70  ator), p->colSep
37580 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6d 6d  arator, SEP_Comm
37590 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
375a0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
375b0 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
375c0 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
375d0 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29 3b 0a  tor, SEP_CrLf);.
375e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
375f0 3d 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d 70  =='t' && strncmp
37600 28 61 7a 41 72 67 5b 31 5d 2c 22 74 61 62 73 22  (azArg[1],"tabs"
37610 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
37620 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
37630 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  List;.      sqli
37640 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
37650 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  eof(p->colSepara
37660 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  tor), p->colSepa
37670 72 61 74 6f 72 2c 20 53 45 50 5f 54 61 62 29 3b  rator, SEP_Tab);
37680 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
37690 32 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d  2=='i' && strncm
376a0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 69 6e 73 65  p(azArg[1],"inse
376b0 72 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  rt",n2)==0 ){.  
376c0 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
376d0 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 20  DE_Insert;.     
376e0 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28   set_table_name(
376f0 70 2c 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41  p, nArg>=3 ? azA
37700 72 67 5b 32 5d 20 3a 20 22 74 61 62 6c 65 22 29  rg[2] : "table")
37710 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
37720 63 32 3d 3d 27 71 27 20 26 26 20 73 74 72 6e 63  c2=='q' && strnc
37730 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 71 75 6f  mp(azArg[1],"quo
37740 74 65 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  te",n2)==0 ){.  
37750 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
37760 44 45 5f 51 75 6f 74 65 3b 0a 20 20 20 20 7d 65  DE_Quote;.    }e
37770 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 61 27 20  lse if( c2=='a' 
37780 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
37790 5b 31 5d 2c 22 61 73 63 69 69 22 2c 6e 32 29 3d  [1],"ascii",n2)=
377a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
377b0 6f 64 65 20 3d 20 4d 4f 44 45 5f 41 73 63 69 69  ode = MODE_Ascii
377c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
377d0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
377e0 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
377f0 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
37800 72 2c 20 53 45 50 5f 55 6e 69 74 29 3b 0a 20 20  r, SEP_Unit);.  
37810 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
37820 69 6e 74 66 28 73 69