/ Hex Artifact Content
Login

Artifact 652ba411c798b64a0c71079e16b022b6cd530a4c1161e220e4cd8a0a127dba60:


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 30 20 20 20 20 20  SPEC      0     
7960: 20 2f 2a 20 4e 6f 20 6f 70 65 6e 2d 6d 6f 64 65   /* No open-mode
7970: 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 23 64   specified */.#d
7980: 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e  efine SHELL_OPEN
7990: 5f 4e 4f 52 4d 41 4c 20 20 20 20 20 20 31 20 20  _NORMAL      1  
79a0: 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 64 61      /* Normal da
79b0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
79c0: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45  define SHELL_OPE
79d0: 4e 5f 41 50 50 45 4e 44 56 46 53 20 20 20 32 20  N_APPENDVFS   2 
79e0: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 70 70 65       /* Use appe
79f0: 6e 64 76 66 73 20 2a 2f 0a 23 64 65 66 69 6e 65  ndvfs */.#define
7a00: 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46   SHELL_OPEN_ZIPF
7a10: 49 4c 45 20 20 20 20 20 33 20 20 20 20 20 20 2f  ILE     3      /
7a20: 2a 20 55 73 65 20 74 68 65 20 7a 69 70 66 69 6c  * Use the zipfil
7a30: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
7a40: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c  */.#define SHELL
7a50: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20  _OPEN_READONLY  
7a60: 20 20 34 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e    4      /* Open
7a70: 20 61 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61   a normal databa
7a80: 73 65 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a  se read-only */.
7a90: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50  #define SHELL_OP
7aa0: 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 35  EN_DESERIALIZE 5
7ab0: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 75 73        /* Open us
7ac0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 65 73 65  ing sqlite3_dese
7ad0: 72 69 61 6c 69 7a 65 28 29 20 2a 2f 0a 23 64 65  rialize() */.#de
7ae0: 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  fine SHELL_OPEN_
7af0: 48 45 58 44 42 20 20 20 20 20 20 20 36 20 20 20  HEXDB       6   
7b00: 20 20 20 2f 2a 20 55 73 65 20 22 64 62 74 6f 74     /* Use "dbtot
7b10: 78 74 22 20 6f 75 74 70 75 74 20 61 73 20 64 61  xt" output as da
7b20: 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 0a 2f 2a  ta source */../*
7b30: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
7b40: 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65 2e 65  for ShellState.e
7b50: 54 72 61 63 65 54 79 70 65 0a 2a 2f 0a 23 64 65  TraceType.*/.#de
7b60: 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52 41 43 45  fine SHELL_TRACE
7b70: 5f 50 4c 41 49 4e 20 20 20 20 20 20 30 20 20 20  _PLAIN      0   
7b80: 20 20 20 2f 2a 20 53 68 6f 77 20 69 6e 70 75 74     /* Show input
7b90: 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 23 64 65   SQL text */.#de
7ba0: 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52 41 43 45  fine SHELL_TRACE
7bb0: 5f 45 58 50 41 4e 44 45 44 20 20 20 31 20 20 20  _EXPANDED   1   
7bc0: 20 20 20 2f 2a 20 53 68 6f 77 20 65 78 70 61 6e     /* Show expan
7bd0: 64 65 64 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a  ded SQL text */.
7be0: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52  #define SHELL_TR
7bf0: 41 43 45 5f 4e 4f 52 4d 41 4c 49 5a 45 44 20 32  ACE_NORMALIZED 2
7c00: 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 6e 6f        /* Show no
7c10: 72 6d 61 6c 69 7a 65 64 20 53 51 4c 20 74 65 78  rmalized SQL tex
7c20: 74 20 2a 2f 0a 0a 2f 2a 20 42 69 74 73 20 69 6e  t */../* Bits in
7c30: 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74 65 2e   the ShellState.
7c40: 66 6c 67 50 72 6f 67 72 65 73 73 20 76 61 72 69  flgProgress vari
7c50: 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  able */.#define 
7c60: 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 51  SHELL_PROGRESS_Q
7c70: 55 49 45 54 20 30 78 30 31 20 20 2f 2a 20 4f 6d  UIET 0x01  /* Om
7c80: 69 74 20 61 6e 6e 6f 75 6e 63 69 6e 67 20 65 76  it announcing ev
7c90: 65 72 79 20 70 72 6f 67 72 65 73 73 20 63 61 6c  ery progress cal
7ca0: 6c 62 61 63 6b 20 2a 2f 0a 23 64 65 66 69 6e 65  lback */.#define
7cb0: 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f   SHELL_PROGRESS_
7cc0: 52 45 53 45 54 20 30 78 30 32 20 20 2f 2a 20 52  RESET 0x02  /* R
7cd0: 65 73 65 74 20 74 68 65 20 63 6f 75 6e 74 20 77  eset the count w
7ce0: 68 65 6e 20 74 68 65 20 70 72 6f 67 72 65 73 0a  hen the progres.
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 6c     ** callback l
7d20: 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c  imit is reached,
7d30: 20 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 20 20   and for each.  
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d60: 20 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c 20 53 51   ** top-level SQ
7d70: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 23  L statement */.#
7d80: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 50 52 4f  define SHELL_PRO
7d90: 47 52 45 53 53 5f 4f 4e 43 45 20 20 30 78 30 34  GRESS_ONCE  0x04
7da0: 20 20 2f 2a 20 43 61 6e 63 65 6c 20 74 68 65 20    /* Cancel the 
7db0: 2d 2d 6c 69 6d 69 74 20 61 66 74 65 72 20 66 69  --limit after fi
7dc0: 72 69 6e 67 20 6f 6e 63 65 20 2a 2f 0a 0a 2f 2a  ring once */../*
7dd0: 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68  .** These are th
7de0: 65 20 61 6c 6c 6f 77 65 64 20 73 68 65 6c 6c 46  e allowed shellF
7df0: 6c 67 73 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 64  lgs values.*/.#d
7e00: 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 61 67 65  efine SHFLG_Page
7e10: 63 61 63 68 65 20 20 20 20 20 20 30 78 30 30 30  cache      0x000
7e20: 30 30 30 30 31 20 2f 2a 20 54 68 65 20 2d 2d 70  00001 /* The --p
7e30: 61 67 65 63 61 63 68 65 20 6f 70 74 69 6f 6e 20  agecache option 
7e40: 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65 66 69  is used */.#defi
7e50: 6e 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69  ne SHFLG_Lookasi
7e60: 64 65 20 20 20 20 20 20 30 78 30 30 30 30 30 30  de      0x000000
7e70: 30 32 20 2f 2a 20 4c 6f 6f 6b 61 73 69 64 65 20  02 /* Lookaside 
7e80: 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64 20 2a  memory is used *
7e90: 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f  /.#define SHFLG_
7ea0: 42 61 63 6b 73 6c 61 73 68 20 20 20 20 20 20 30  Backslash      0
7eb0: 78 30 30 30 30 30 30 30 34 20 2f 2a 20 54 68 65  x00000004 /* The
7ec0: 20 2d 2d 62 61 63 6b 73 6c 61 73 68 20 6f 70 74   --backslash opt
7ed0: 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23  ion is used */.#
7ee0: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 72 65  define SHFLG_Pre
7ef0: 73 65 72 76 65 52 6f 77 69 64 20 20 30 78 30 30  serveRowid  0x00
7f00: 30 30 30 30 30 38 20 2f 2a 20 2e 64 75 6d 70 20  000008 /* .dump 
7f10: 70 72 65 73 65 72 76 65 73 20 72 6f 77 69 64 20  preserves rowid 
7f20: 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e  values */.#defin
7f30: 65 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73  e SHFLG_Newlines
7f40: 20 20 20 20 20 20 20 30 78 30 30 30 30 30 30 31         0x0000001
7f50: 30 20 2f 2a 20 2e 64 75 6d 70 20 2d 2d 6e 65 77  0 /* .dump --new
7f60: 6c 69 6e 65 20 66 6c 61 67 20 2a 2f 0a 23 64 65  line flag */.#de
7f70: 66 69 6e 65 20 53 48 46 4c 47 5f 43 6f 75 6e 74  fine SHFLG_Count
7f80: 43 68 61 6e 67 65 73 20 20 20 30 78 30 30 30 30  Changes   0x0000
7f90: 30 30 32 30 20 2f 2a 20 2e 63 68 61 6e 67 65 73  0020 /* .changes
7fa0: 20 73 65 74 74 69 6e 67 20 2a 2f 0a 23 64 65 66   setting */.#def
7fb0: 69 6e 65 20 53 48 46 4c 47 5f 45 63 68 6f 20 20  ine SHFLG_Echo  
7fc0: 20 20 20 20 20 20 20 20 20 30 78 30 30 30 30 30           0x00000
7fd0: 30 34 30 20 2f 2a 20 2e 65 63 68 6f 20 6f 72 20  040 /* .echo or 
7fe0: 2d 2d 65 63 68 6f 20 73 65 74 74 69 6e 67 20 2a  --echo setting *
7ff0: 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20  /../*.** Macros 
8000: 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
8010: 73 65 74 74 69 6e 67 20 73 68 65 6c 6c 46 6c 67  setting shellFlg
8020: 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 68 65  s.*/.#define She
8030: 6c 6c 48 61 73 46 6c 61 67 28 50 2c 58 29 20 20  llHasFlag(P,X)  
8040: 20 20 28 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c    (((P)->shellFl
8050: 67 73 20 26 20 28 58 29 29 21 3d 30 29 0a 23 64  gs & (X))!=0).#d
8060: 65 66 69 6e 65 20 53 68 65 6c 6c 53 65 74 46 6c  efine ShellSetFl
8070: 61 67 28 50 2c 58 29 20 20 20 20 28 28 50 29 2d  ag(P,X)    ((P)-
8080: 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d 28 58 29 29  >shellFlgs|=(X))
8090: 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 43 6c  .#define ShellCl
80a0: 65 61 72 46 6c 61 67 28 50 2c 58 29 20 20 28 28  earFlag(P,X)  ((
80b0: 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 26 3d 28  P)->shellFlgs&=(
80c0: 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ~(X)))../*.** Th
80d0: 65 73 65 20 61 72 65 20 74 68 65 20 61 6c 6c 6f  ese are the allo
80e0: 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64  wed modes..*/.#d
80f0: 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e 65 20  efine MODE_Line 
8100: 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20 63 6f      0  /* One co
8110: 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e 20 20  lumn per line.  
8120: 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74 77 65  Blank line betwe
8130: 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a 23 64  en records */.#d
8140: 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d  efine MODE_Colum
8150: 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20 72 65  n   1  /* One re
8160: 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20 69 6e  cord per line in
8170: 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f   neat columns */
8180: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69  .#define MODE_Li
8190: 73 74 20 20 20 20 20 32 20 20 2f 2a 20 4f 6e 65  st     2  /* One
81a0: 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65   record per line
81b0: 20 77 69 74 68 20 61 20 73 65 70 61 72 61 74 6f   with a separato
81c0: 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  r */.#define MOD
81d0: 45 5f 53 65 6d 69 20 20 20 20 20 33 20 20 2f 2a  E_Semi     3  /*
81e0: 20 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f 4c 69   Same as MODE_Li
81f0: 73 74 20 62 75 74 20 61 70 70 65 6e 64 20 22 3b  st but append ";
8200: 22 20 74 6f 20 65 61 63 68 20 6c 69 6e 65 20 2a  " to each line *
8210: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 48  /.#define MODE_H
8220: 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20 47 65  tml     4  /* Ge
8230: 6e 65 72 61 74 65 20 61 6e 20 58 48 54 4d 4c 20  nerate an XHTML 
8240: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
8250: 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20 20 35   MODE_Insert   5
8260: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 53 51    /* Generate SQ
8270: 4c 20 22 69 6e 73 65 72 74 22 20 73 74 61 74 65  L "insert" state
8280: 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65  ments */.#define
8290: 20 4d 4f 44 45 5f 51 75 6f 74 65 20 20 20 20 36   MODE_Quote    6
82a0: 20 20 2f 2a 20 51 75 6f 74 65 20 76 61 6c 75 65    /* Quote value
82b0: 73 20 61 73 20 66 6f 72 20 53 51 4c 20 2a 2f 0a  s as for SQL */.
82c0: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54 63 6c  #define MODE_Tcl
82d0: 20 20 20 20 20 20 37 20 20 2f 2a 20 47 65 6e 65        7  /* Gene
82e0: 72 61 74 65 20 41 4e 53 49 2d 43 20 6f 72 20 54  rate ANSI-C or T
82f0: 43 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d 65 6e  CL quoted elemen
8300: 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  ts */.#define MO
8310: 44 45 5f 43 73 76 20 20 20 20 20 20 38 20 20 2f  DE_Csv      8  /
8320: 2a 20 51 75 6f 74 65 20 73 74 72 69 6e 67 73 2c  * Quote strings,
8330: 20 6e 75 6d 62 65 72 73 20 61 72 65 20 70 6c 61   numbers are pla
8340: 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  in */.#define MO
8350: 44 45 5f 45 78 70 6c 61 69 6e 20 20 39 20 20 2f  DE_Explain  9  /
8360: 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f 6c 75  * Like MODE_Colu
8370: 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 74  mn, but do not t
8380: 72 75 6e 63 61 74 65 20 64 61 74 61 20 2a 2f 0a  runcate data */.
8390: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 41 73 63  #define MODE_Asc
83a0: 69 69 20 20 20 31 30 20 20 2f 2a 20 55 73 65 20  ii   10  /* Use 
83b0: 41 53 43 49 49 20 75 6e 69 74 20 61 6e 64 20 72  ASCII unit and r
83c0: 65 63 6f 72 64 20 73 65 70 61 72 61 74 6f 72 73  ecord separators
83d0: 20 28 30 78 31 46 2f 30 78 31 45 29 20 2a 2f 0a   (0x1F/0x1E) */.
83e0: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 50 72 65  #define MODE_Pre
83f0: 74 74 79 20 20 31 31 20 20 2f 2a 20 50 72 65 74  tty  11  /* Pret
8400: 74 79 2d 70 72 69 6e 74 20 73 63 68 65 6d 61 73  ty-print schemas
8410: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
8420: 5f 45 51 50 20 20 20 20 20 31 32 20 20 2f 2a 20  _EQP     12  /* 
8430: 43 6f 6e 76 65 72 74 73 20 45 58 50 4c 41 49 4e  Converts EXPLAIN
8440: 20 51 55 45 52 59 20 50 4c 41 4e 20 6f 75 74 70   QUERY PLAN outp
8450: 75 74 20 69 6e 74 6f 20 61 20 67 72 61 70 68 20  ut into a graph 
8460: 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  */..static const
8470: 20 63 68 61 72 20 2a 6d 6f 64 65 44 65 73 63 72   char *modeDescr
8480: 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65 22 2c  [] = {.  "line",
8490: 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20 22  .  "column",.  "
84a0: 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d 69 22 2c  list",.  "semi",
84b0: 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22 69 6e  .  "html",.  "in
84c0: 73 65 72 74 22 2c 0a 20 20 22 71 75 6f 74 65 22  sert",.  "quote"
84d0: 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20 22 63 73  ,.  "tcl",.  "cs
84e0: 76 22 2c 0a 20 20 22 65 78 70 6c 61 69 6e 22 2c  v",.  "explain",
84f0: 0a 20 20 22 61 73 63 69 69 22 2c 0a 20 20 22 70  .  "ascii",.  "p
8500: 72 65 74 74 79 70 72 69 6e 74 22 2c 0a 20 20 22  rettyprint",.  "
8510: 65 71 70 22 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  eqp".};../*.** T
8520: 68 65 73 65 20 61 72 65 20 74 68 65 20 63 6f 6c  hese are the col
8530: 75 6d 6e 2f 72 6f 77 2f 6c 69 6e 65 20 73 65 70  umn/row/line sep
8540: 61 72 61 74 6f 72 73 20 75 73 65 64 20 62 79 20  arators used by 
8550: 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 69  the various.** i
8560: 6d 70 6f 72 74 2f 65 78 70 6f 72 74 20 6d 6f 64  mport/export mod
8570: 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  es..*/.#define S
8580: 45 50 5f 43 6f 6c 75 6d 6e 20 20 20 20 22 7c 22  EP_Column    "|"
8590: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 52 6f 77  .#define SEP_Row
85a0: 20 20 20 20 20 20 20 22 5c 6e 22 0a 23 64 65 66         "\n".#def
85b0: 69 6e 65 20 53 45 50 5f 54 61 62 20 20 20 20 20  ine SEP_Tab     
85c0: 20 20 22 5c 74 22 0a 23 64 65 66 69 6e 65 20 53    "\t".#define S
85d0: 45 50 5f 53 70 61 63 65 20 20 20 20 20 22 20 22  EP_Space     " "
85e0: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43 6f 6d  .#define SEP_Com
85f0: 6d 61 20 20 20 20 20 22 2c 22 0a 23 64 65 66 69  ma     ",".#defi
8600: 6e 65 20 53 45 50 5f 43 72 4c 66 20 20 20 20 20  ne SEP_CrLf     
8610: 20 22 5c 72 5c 6e 22 0a 23 64 65 66 69 6e 65 20   "\r\n".#define 
8620: 53 45 50 5f 55 6e 69 74 20 20 20 20 20 20 22 5c  SEP_Unit      "\
8630: 78 31 46 22 0a 23 64 65 66 69 6e 65 20 53 45 50  x1F".#define SEP
8640: 5f 52 65 63 6f 72 64 20 20 20 20 22 5c 78 31 45  _Record    "\x1E
8650: 22 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 62  "../*.** A callb
8660: 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69  ack for the sqli
8670: 74 65 33 5f 6c 6f 67 28 29 20 69 6e 74 65 72 66  te3_log() interf
8680: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ace..*/.static v
8690: 6f 69 64 20 73 68 65 6c 6c 4c 6f 67 28 76 6f 69  oid shellLog(voi
86a0: 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 69 45 72  d *pArg, int iEr
86b0: 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 61  rCode, const cha
86c0: 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 53 68 65 6c  r *zMsg){.  Shel
86d0: 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65  lState *p = (She
86e0: 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a 20  llState*)pArg;. 
86f0: 20 69 66 28 20 70 2d 3e 70 4c 6f 67 3d 3d 30 20   if( p->pLog==0 
8700: 29 20 72 65 74 75 72 6e 3b 0a 20 20 75 74 66 38  ) return;.  utf8
8710: 5f 70 72 69 6e 74 66 28 70 2d 3e 70 4c 6f 67 2c  _printf(p->pLog,
8720: 20 22 28 25 64 29 20 25 73 5c 6e 22 2c 20 69 45   "(%d) %s\n", iE
8730: 72 72 43 6f 64 65 2c 20 7a 4d 73 67 29 3b 0a 20  rrCode, zMsg);. 
8740: 20 66 66 6c 75 73 68 28 70 2d 3e 70 4c 6f 67 29   fflush(p->pLog)
8750: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66  ;.}../*.** SQL f
8760: 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65 6c 6c 5f  unction:  shell_
8770: 70 75 74 73 6e 6c 28 58 29 0a 2a 2a 0a 2a 2a 20  putsnl(X).**.** 
8780: 57 72 69 74 65 20 74 68 65 20 74 65 78 74 20 58  Write the text X
8790: 20 74 6f 20 74 68 65 20 73 63 72 65 65 6e 20 28   to the screen (
87a0: 6f 72 20 77 68 61 74 65 76 65 72 20 6f 75 74 70  or whatever outp
87b0: 75 74 20 69 73 20 62 65 69 6e 67 20 64 69 72 65  ut is being dire
87c0: 63 74 65 64 29 0a 2a 2a 20 61 64 64 69 6e 67 20  cted).** adding 
87d0: 61 20 6e 65 77 6c 69 6e 65 20 61 74 20 74 68 65  a newline at the
87e0: 20 65 6e 64 2c 20 61 6e 64 20 74 68 65 6e 20 72   end, and then r
87f0: 65 74 75 72 6e 20 58 2e 0a 2a 2f 0a 73 74 61 74  eturn X..*/.stat
8800: 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 75 74  ic void shellPut
8810: 73 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  sFunc(.  sqlite3
8820: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a  _context *pCtx,.
8830: 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71    int nVal,.  sq
8840: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
8850: 56 61 6c 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74  Val.){.  ShellSt
8860: 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53  ate *p = (ShellS
8870: 74 61 74 65 2a 29 73 71 6c 69 74 65 33 5f 75 73  tate*)sqlite3_us
8880: 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20  er_data(pCtx);. 
8890: 20 28 76 6f 69 64 29 6e 56 61 6c 3b 0a 20 20 75   (void)nVal;.  u
88a0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
88b0: 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  t, "%s\n", sqlit
88c0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
88d0: 56 61 6c 5b 30 5d 29 29 3b 0a 20 20 73 71 6c 69  Val[0]));.  sqli
88e0: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
88f0: 28 70 43 74 78 2c 20 61 70 56 61 6c 5b 30 5d 29  (pCtx, apVal[0])
8900: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66  ;.}../*.** SQL f
8910: 75 6e 63 74 69 6f 6e 3a 20 20 20 65 64 69 74 28  unction:   edit(
8920: 56 41 4c 55 45 29 0a 2a 2a 20 20 20 20 20 20 20  VALUE).**       
8930: 20 20 20 20 20 20 20 20 20 20 65 64 69 74 28 56            edit(V
8940: 41 4c 55 45 2c 45 44 49 54 4f 52 29 0a 2a 2a 0a  ALUE,EDITOR).**.
8950: 2a 2a 20 54 68 65 73 65 20 73 74 65 70 73 3a 0a  ** These steps:.
8960: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 57 72  **.**     (1) Wr
8970: 69 74 65 20 56 41 4c 55 45 20 69 6e 74 6f 20 61  ite VALUE into a
8980: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
8990: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 75 6e 20  .**     (2) Run 
89a0: 70 72 6f 67 72 61 6d 20 45 44 49 54 4f 52 20 6f  program EDITOR o
89b0: 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
89c0: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 33   file..**     (3
89d0: 29 20 52 65 61 64 20 74 68 65 20 74 65 6d 70 6f  ) Read the tempo
89e0: 72 61 72 79 20 66 69 6c 65 20 62 61 63 6b 20 61  rary file back a
89f0: 6e 64 20 72 65 74 75 72 6e 20 69 74 73 20 63 6f  nd return its co
8a00: 6e 74 65 6e 74 20 61 73 20 74 68 65 20 72 65 73  ntent as the res
8a10: 75 6c 74 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20  ult..**     (4) 
8a20: 44 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  Delete the tempo
8a30: 72 61 72 79 20 66 69 6c 65 0a 2a 2a 0a 2a 2a 20  rary file.**.** 
8a40: 49 66 20 74 68 65 20 45 44 49 54 4f 52 20 61 72  If the EDITOR ar
8a50: 67 75 6d 65 6e 74 20 69 73 20 6f 6d 69 74 74 65  gument is omitte
8a60: 64 2c 20 75 73 65 20 74 68 65 20 76 61 6c 75 65  d, use the value
8a70: 20 69 6e 20 74 68 65 20 56 49 53 55 41 4c 0a 2a   in the VISUAL.*
8a80: 2a 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  * environment va
8a90: 72 69 61 62 6c 65 2e 20 20 49 66 20 73 74 69 6c  riable.  If stil
8aa0: 6c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 45 44  l there is no ED
8ab0: 49 54 4f 52 2c 20 74 68 72 6f 75 67 68 20 61 6e  ITOR, through an
8ac0: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c   error..**.** Al
8ad0: 73 6f 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f  so throw an erro
8ae0: 72 20 69 66 20 74 68 65 20 45 44 49 54 4f 52 20  r if the EDITOR 
8af0: 70 72 6f 67 72 61 6d 20 72 65 74 75 72 6e 73 20  program returns 
8b00: 61 20 6e 6f 6e 2d 7a 65 72 6f 20 65 78 69 74 20  a non-zero exit 
8b10: 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  code..*/.#ifndef
8b20: 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53   SQLITE_NOHAVE_S
8b30: 59 53 54 45 4d 0a 73 74 61 74 69 63 20 76 6f 69  YSTEM.static voi
8b40: 64 20 65 64 69 74 46 75 6e 63 28 0a 20 20 73 71  d editFunc(.  sq
8b50: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
8b60: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
8b70: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
8b80: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
8b90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 64 69  const char *zEdi
8ba0: 74 6f 72 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65  tor;.  char *zTe
8bb0: 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73 71  mpFile = 0;.  sq
8bc0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61  lite3 *db;.  cha
8bd0: 72 20 2a 7a 43 6d 64 20 3d 20 30 3b 0a 20 20 69  r *zCmd = 0;.  i
8be0: 6e 74 20 62 42 69 6e 3b 0a 20 20 69 6e 74 20 72  nt bBin;.  int r
8bf0: 63 3b 0a 20 20 69 6e 74 20 68 61 73 43 52 4e 4c  c;.  int hasCRNL
8c00: 20 3d 20 30 3b 0a 20 20 46 49 4c 45 20 2a 66 20   = 0;.  FILE *f 
8c10: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  = 0;.  sqlite3_i
8c20: 6e 74 36 34 20 73 7a 3b 0a 20 20 73 71 6c 69 74  nt64 sz;.  sqlit
8c30: 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20 75 6e  e3_int64 x;.  un
8c40: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 20 3d  signed char *p =
8c50: 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d   0;..  if( argc=
8c60: 3d 32 20 29 7b 0a 20 20 20 20 7a 45 64 69 74 6f  =2 ){.    zEdito
8c70: 72 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  r = (const char*
8c80: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
8c90: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
8ca0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45 64 69 74  }else{.    zEdit
8cb0: 6f 72 20 3d 20 67 65 74 65 6e 76 28 22 56 49 53  or = getenv("VIS
8cc0: 55 41 4c 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  UAL");.  }.  if(
8cd0: 20 7a 45 64 69 74 6f 72 3d 3d 30 20 29 7b 0a 20   zEditor==0 ){. 
8ce0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8cf0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
8d00: 20 22 6e 6f 20 65 64 69 74 6f 72 20 66 6f 72 20   "no editor for 
8d10: 65 64 69 74 28 29 22 2c 20 2d 31 29 3b 0a 20 20  edit()", -1);.  
8d20: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
8d30: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
8d40: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d  e_type(argv[0])=
8d50: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a  =SQLITE_NULL ){.
8d60: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8d70: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
8d80: 2c 20 22 4e 55 4c 4c 20 69 6e 70 75 74 20 74 6f  , "NULL input to
8d90: 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b 0a 20   edit()", -1);. 
8da0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
8db0: 20 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   db = sqlite3_co
8dc0: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
8dd0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7a 54 65 6d  context);.  zTem
8de0: 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73 71 6c  pFile = 0;.  sql
8df0: 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
8e00: 6c 28 64 62 2c 20 30 2c 20 53 51 4c 49 54 45 5f  l(db, 0, SQLITE_
8e10: 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41  FCNTL_TEMPFILENA
8e20: 4d 45 2c 20 26 7a 54 65 6d 70 46 69 6c 65 29 3b  ME, &zTempFile);
8e30: 0a 20 20 69 66 28 20 7a 54 65 6d 70 46 69 6c 65  .  if( zTempFile
8e40: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
8e50: 65 33 5f 75 69 6e 74 36 34 20 72 20 3d 20 30 3b  e3_uint64 r = 0;
8e60: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
8e70: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72  domness(sizeof(r
8e80: 29 2c 20 26 72 29 3b 0a 20 20 20 20 7a 54 65 6d  ), &r);.    zTem
8e90: 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  pFile = sqlite3_
8ea0: 6d 70 72 69 6e 74 66 28 22 74 65 6d 70 25 6c 6c  mprintf("temp%ll
8eb0: 78 22 2c 20 72 29 3b 0a 20 20 20 20 69 66 28 20  x", r);.    if( 
8ec0: 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a  zTempFile==0 ){.
8ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
8ee0: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
8ef0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
8f00: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
8f10: 20 7d 0a 20 20 62 42 69 6e 20 3d 20 73 71 6c 69   }.  bBin = sqli
8f20: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
8f30: 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[0])==SQLITE_
8f40: 42 4c 4f 42 3b 0a 20 20 2f 2a 20 57 68 65 6e 20  BLOB;.  /* When 
8f50: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 6c 65  writing the file
8f60: 20 74 6f 20 62 65 20 65 64 69 74 65 64 2c 20 64   to be edited, d
8f70: 6f 20 5c 6e 20 74 6f 20 5c 72 5c 6e 20 63 6f 6e  o \n to \r\n con
8f80: 76 65 72 73 69 6f 6e 73 20 6f 6e 20 73 79 73 74  versions on syst
8f90: 65 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 61  ems.  ** that wa
8fa0: 6e 74 20 5c 72 5c 6e 20 6c 69 6e 65 20 65 6e 64  nt \r\n line end
8fb0: 69 6e 67 73 20 2a 2f 0a 20 20 66 20 3d 20 66 6f  ings */.  f = fo
8fc0: 70 65 6e 28 7a 54 65 6d 70 46 69 6c 65 2c 20 62  pen(zTempFile, b
8fd0: 42 69 6e 20 3f 20 22 77 62 22 20 3a 20 22 77 22  Bin ? "wb" : "w"
8fe0: 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20 29 7b  );.  if( f==0 ){
8ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
9000: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
9010: 74 2c 20 22 65 64 69 74 28 29 20 63 61 6e 6e 6f  t, "edit() canno
9020: 74 20 6f 70 65 6e 20 74 65 6d 70 20 66 69 6c 65  t open temp file
9030: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f  ", -1);.    goto
9040: 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a   edit_func_end;.
9050: 20 20 7d 0a 20 20 73 7a 20 3d 20 73 71 6c 69 74    }.  sz = sqlit
9060: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
9070: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 62  rgv[0]);.  if( b
9080: 42 69 6e 20 29 7b 0a 20 20 20 20 78 20 3d 20 66  Bin ){.    x = f
9090: 77 72 69 74 65 28 73 71 6c 69 74 65 33 5f 76 61  write(sqlite3_va
90a0: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
90b0: 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20  ), 1, sz, f);.  
90c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
90d0: 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
90e0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
90f0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
9100: 30 5d 29 3b 0a 20 20 20 20 2f 2a 20 52 65 6d 65  0]);.    /* Reme
9110: 6d 62 65 72 20 77 68 65 74 68 65 72 20 6f 72 20  mber whether or 
9120: 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f 72  not the value or
9130: 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e  iginally contain
9140: 65 64 20 5c 72 5c 6e 20 2a 2f 0a 20 20 20 20 69  ed \r\n */.    i
9150: 66 28 20 7a 20 26 26 20 73 74 72 73 74 72 28 7a  f( z && strstr(z
9160: 2c 22 5c 72 5c 6e 22 29 21 3d 30 20 29 20 68 61  ,"\r\n")!=0 ) ha
9170: 73 43 52 4e 4c 20 3d 20 31 3b 0a 20 20 20 20 78  sCRNL = 1;.    x
9180: 20 3d 20 66 77 72 69 74 65 28 73 71 6c 69 74 65   = fwrite(sqlite
9190: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
91a0: 76 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29  v[0]), 1, sz, f)
91b0: 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66  ;.  }.  fclose(f
91c0: 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20 69 66  );.  f = 0;.  if
91d0: 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20 20 73  ( x!=sz ){.    s
91e0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
91f0: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 65 64  ror(context, "ed
9200: 69 74 28 29 20 63 6f 75 6c 64 20 6e 6f 74 20 77  it() could not w
9210: 72 69 74 65 20 74 68 65 20 77 68 6f 6c 65 20 66  rite the whole f
9220: 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67  ile", -1);.    g
9230: 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e  oto edit_func_en
9240: 64 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20  d;.  }.  zCmd = 
9250: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9260: 22 25 73 20 5c 22 25 73 5c 22 22 2c 20 7a 45 64  "%s \"%s\"", zEd
9270: 69 74 6f 72 2c 20 7a 54 65 6d 70 46 69 6c 65 29  itor, zTempFile)
9280: 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20  ;.  if( zCmd==0 
9290: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
92a0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
92b0: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
92c0: 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65  goto edit_func_e
92d0: 6e 64 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  nd;.  }.  rc = s
92e0: 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20 20 73  ystem(zCmd);.  s
92f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d 64  qlite3_free(zCmd
9300: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
9310: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
9320: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
9330: 20 22 45 44 49 54 4f 52 20 72 65 74 75 72 6e 65   "EDITOR returne
9340: 64 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20 2d 31 29  d non-zero", -1)
9350: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f  ;.    goto edit_
9360: 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  func_end;.  }.  
9370: 66 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46  f = fopen(zTempF
9380: 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 69 66  ile, "rb");.  if
9390: 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ( f==0 ){.    sq
93a0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
93b0: 6f 72 28 63 6f 6e 74 65 78 74 2c 0a 20 20 20 20  or(context,.    
93c0: 20 20 22 65 64 69 74 28 29 20 63 61 6e 6e 6f 74    "edit() cannot
93d0: 20 72 65 6f 70 65 6e 20 74 65 6d 70 20 66 69 6c   reopen temp fil
93e0: 65 20 61 66 74 65 72 20 65 64 69 74 22 2c 20 2d  e after edit", -
93f0: 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69  1);.    goto edi
9400: 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a  t_func_end;.  }.
9410: 20 20 66 73 65 65 6b 28 66 2c 20 30 2c 20 53 45    fseek(f, 0, SE
9420: 45 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a 20 3d 20  EK_END);.  sz = 
9430: 66 74 65 6c 6c 28 66 29 3b 0a 20 20 72 65 77 69  ftell(f);.  rewi
9440: 6e 64 28 66 29 3b 0a 20 20 70 20 3d 20 73 71 6c  nd(f);.  p = sql
9450: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
9460: 7a 2b 28 62 42 69 6e 3d 3d 30 29 20 29 3b 0a 20  z+(bBin==0) );. 
9470: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
9480: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
9490: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
94a0: 65 78 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ext);.    goto e
94b0: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20  dit_func_end;.  
94c0: 7d 0a 20 20 78 20 3d 20 66 72 65 61 64 28 70 2c  }.  x = fread(p,
94d0: 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20 66 63   1, sz, f);.  fc
94e0: 6c 6f 73 65 28 66 29 3b 0a 20 20 66 20 3d 20 30  lose(f);.  f = 0
94f0: 3b 0a 20 20 69 66 28 20 78 21 3d 73 7a 20 29 7b  ;.  if( x!=sz ){
9500: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
9510: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
9520: 74 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 72 65  t, "could not re
9530: 61 64 20 62 61 63 6b 20 74 68 65 20 77 68 6f 6c  ad back the whol
9540: 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20  e file", -1);.  
9550: 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63    goto edit_func
9560: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
9570: 62 42 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  bBin ){.    sqli
9580: 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 36  te3_result_blob6
9590: 34 28 63 6f 6e 74 65 78 74 2c 20 70 2c 20 73 7a  4(context, p, sz
95a0: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
95b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
95c0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 2c 20 6a  lite3_int64 i, j
95d0: 3b 0a 20 20 20 20 69 66 28 20 68 61 73 43 52 4e  ;.    if( hasCRN
95e0: 4c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  L ){.      /* If
95f0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   the original co
9600: 6e 74 61 69 6e 73 20 5c 72 5c 6e 20 74 68 65 6e  ntains \r\n then
9610: 20 64 6f 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f   do no conversio
9620: 6e 73 20 62 61 63 6b 20 74 6f 20 5c 6e 20 2a 2f  ns back to \n */
9630: 0a 20 20 20 20 20 20 6a 20 3d 20 73 7a 3b 0a 20  .      j = sz;. 
9640: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9650: 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 64  /* If the file d
9660: 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 6c 6c  id not originall
9670: 79 20 63 6f 6e 74 61 69 6e 20 5c 72 5c 6e 20 74  y contain \r\n t
9680: 68 65 6e 20 63 6f 6e 76 65 72 74 20 61 6e 79 20  hen convert any 
9690: 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20 5c 72 5c  new.      ** \r\
96a0: 6e 20 62 61 63 6b 20 69 6e 74 6f 20 5c 6e 20 2a  n back into \n *
96b0: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 3d  /.      for(i=j=
96c0: 30 3b 20 69 3c 73 7a 3b 20 69 2b 2b 29 7b 0a 20  0; i<sz; i++){. 
96d0: 20 20 20 20 20 20 20 69 66 28 20 70 5b 69 5d 3d         if( p[i]=
96e0: 3d 27 5c 72 27 20 26 26 20 70 5b 69 2b 31 5d 3d  ='\r' && p[i+1]=
96f0: 3d 27 5c 6e 27 20 29 20 69 2b 2b 3b 0a 20 20 20  ='\n' ) i++;.   
9700: 20 20 20 20 20 70 5b 6a 2b 2b 5d 20 3d 20 70 5b       p[j++] = p[
9710: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
9720: 20 20 73 7a 20 3d 20 6a 3b 0a 20 20 20 20 20 20    sz = j;.      
9730: 70 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  p[sz] = 0;.    }
9740: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65   .    sqlite3_re
9750: 73 75 6c 74 5f 74 65 78 74 36 34 28 63 6f 6e 74  sult_text64(cont
9760: 65 78 74 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ext, (const char
9770: 2a 29 70 2c 20 73 7a 2c 0a 20 20 20 20 20 20 20  *)p, sz,.       
9780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9790: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 2c     sqlite3_free,
97a0: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
97b0: 20 7d 0a 20 20 70 20 3d 20 30 3b 0a 0a 65 64 69   }.  p = 0;..edi
97c0: 74 5f 66 75 6e 63 5f 65 6e 64 3a 0a 20 20 69 66  t_func_end:.  if
97d0: 28 20 66 20 29 20 66 63 6c 6f 73 65 28 66 29 3b  ( f ) fclose(f);
97e0: 0a 20 20 75 6e 6c 69 6e 6b 28 7a 54 65 6d 70 46  .  unlink(zTempF
97f0: 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ile);.  sqlite3_
9800: 66 72 65 65 28 7a 54 65 6d 70 46 69 6c 65 29 3b  free(zTempFile);
9810: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9820: 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  p);.}.#endif /* 
9830: 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59  SQLITE_NOHAVE_SY
9840: 53 54 45 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  STEM */../*.** S
9850: 61 76 65 20 6f 72 20 72 65 73 74 6f 72 65 20 74  ave or restore t
9860: 68 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75  he current outpu
9870: 74 20 6d 6f 64 65 0a 2a 2f 0a 73 74 61 74 69 63  t mode.*/.static
9880: 20 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64 65   void outputMode
9890: 50 75 73 68 28 53 68 65 6c 6c 53 74 61 74 65 20  Push(ShellState 
98a0: 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 50 72  *p){.  p->modePr
98b0: 69 6f 72 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ior = p->mode;. 
98c0: 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65   memcpy(p->colSe
98d0: 70 50 72 69 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65  pPrior, p->colSe
98e0: 70 61 72 61 74 6f 72 2c 20 73 69 7a 65 6f 66 28  parator, sizeof(
98f0: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
9900: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72  );.  memcpy(p->r
9910: 6f 77 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e 72  owSepPrior, p->r
9920: 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 73 69 7a  owSeparator, siz
9930: 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
9940: 74 6f 72 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  tor));.}.static 
9950: 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64 65 50  void outputModeP
9960: 6f 70 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  op(ShellState *p
9970: 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 70  ){.  p->mode = p
9980: 2d 3e 6d 6f 64 65 50 72 69 6f 72 3b 0a 20 20 6d  ->modePrior;.  m
9990: 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65 70 61  emcpy(p->colSepa
99a0: 72 61 74 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65 70  rator, p->colSep
99b0: 50 72 69 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d  Prior, sizeof(p-
99c0: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 29 3b  >colSeparator));
99d0: 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72 6f 77  .  memcpy(p->row
99e0: 53 65 70 61 72 61 74 6f 72 2c 20 70 2d 3e 72 6f  Separator, p->ro
99f0: 77 53 65 70 50 72 69 6f 72 2c 20 73 69 7a 65 6f  wSepPrior, sizeo
9a00: 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
9a10: 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75  r));.}../*.** Ou
9a20: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73  tput the given s
9a30: 74 72 69 6e 67 20 61 73 20 61 20 68 65 78 2d 65  tring as a hex-e
9a40: 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28 65 67 2e  ncoded blob (eg.
9a50: 20 58 27 31 32 33 34 27 20 29 0a 2a 2f 0a 73 74   X'1234' ).*/.st
9a60: 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
9a70: 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c 45 20 2a  _hex_blob(FILE *
9a80: 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  out, const void 
9a90: 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f  *pBlob, int nBlo
9aa0: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  b){.  int i;.  c
9ab0: 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 28 63 68  har *zBlob = (ch
9ac0: 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20 20 72 61  ar *)pBlob;.  ra
9ad0: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 58 27  w_printf(out,"X'
9ae0: 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
9af0: 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20 72 61  <nBlob; i++){ ra
9b00: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 30  w_printf(out,"%0
9b10: 32 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30 78 66  2x",zBlob[i]&0xf
9b20: 66 29 3b 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e  f); }.  raw_prin
9b30: 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a 7d 0a 0a  tf(out,"'");.}..
9b40: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 73 74 72  /*.** Find a str
9b50: 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ing that is not 
9b60: 66 6f 75 6e 64 20 61 6e 79 77 68 65 72 65 20 69  found anywhere i
9b70: 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 61  n z[].  Return a
9b80: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
9b90: 68 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  hat string..**.*
9ba0: 2a 20 54 72 79 20 74 6f 20 75 73 65 20 7a 41 20  * Try to use zA 
9bb0: 61 6e 64 20 7a 42 20 66 69 72 73 74 2e 20 20 49  and zB first.  I
9bc0: 66 20 62 6f 74 68 20 6f 66 20 74 68 6f 73 65 20  f both of those 
9bd0: 61 72 65 20 61 6c 72 65 61 64 79 20 66 6f 75 6e  are already foun
9be0: 64 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68 65 6e  d in z[].** then
9bf0: 20 6d 61 6b 65 20 75 70 20 73 6f 6d 65 20 73 74   make up some st
9c00: 72 69 6e 67 20 61 6e 64 20 73 74 6f 72 65 20 69  ring and store i
9c10: 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  t in the buffer 
9c20: 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
9c30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 75 73  const char *unus
9c40: 65 64 5f 73 74 72 69 6e 67 28 0a 20 20 63 6f 6e  ed_string(.  con
9c50: 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20  st char *z,     
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9c70: 2a 20 52 65 73 75 6c 74 20 6d 75 73 74 20 6e 6f  * Result must no
9c80: 74 20 61 70 70 65 61 72 20 61 6e 79 77 68 65 72  t appear anywher
9c90: 65 20 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f 6e 73  e in z */.  cons
9ca0: 74 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f 6e 73  t char *zA, cons
9cb0: 74 20 63 68 61 72 20 2a 7a 42 2c 20 20 20 2f 2a  t char *zB,   /*
9cc0: 20 54 72 79 20 74 68 65 73 65 20 66 69 72 73 74   Try these first
9cd0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66   */.  char *zBuf
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cf0: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
9d00: 20 74 6f 20 73 74 6f 72 65 20 61 20 67 65 6e 65   to store a gene
9d10: 72 61 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a  rated string */.
9d20: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 20  ){.  unsigned i 
9d30: 3d 20 30 3b 0a 20 20 69 66 28 20 73 74 72 73 74  = 0;.  if( strst
9d40: 72 28 7a 2c 20 7a 41 29 3d 3d 30 20 29 20 72 65  r(z, zA)==0 ) re
9d50: 74 75 72 6e 20 7a 41 3b 0a 20 20 69 66 28 20 73  turn zA;.  if( s
9d60: 74 72 73 74 72 28 7a 2c 20 7a 42 29 3d 3d 30 20  trstr(z, zB)==0 
9d70: 29 20 72 65 74 75 72 6e 20 7a 42 3b 0a 20 20 64  ) return zB;.  d
9d80: 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  o{.    sqlite3_s
9d90: 6e 70 72 69 6e 74 66 28 32 30 2c 7a 42 75 66 2c  nprintf(20,zBuf,
9da0: 22 28 25 73 25 75 29 22 2c 20 7a 41 2c 20 69 2b  "(%s%u)", zA, i+
9db0: 2b 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 73 74  +);.  }while( st
9dc0: 72 73 74 72 28 7a 2c 7a 42 75 66 29 21 3d 30 20  rstr(z,zBuf)!=0 
9dd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42 75 66  );.  return zBuf
9de0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  ;.}../*.** Outpu
9df0: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
9e00: 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73  ng as a quoted s
9e10: 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20  tring using SQL 
9e20: 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69  quoting conventi
9e30: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ons..**.** See a
9e40: 6c 73 6f 3a 20 6f 75 74 70 75 74 5f 71 75 6f 74  lso: output_quot
9e50: 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e  ed_escaped_strin
9e60: 67 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  g().*/.static vo
9e70: 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64  id output_quoted
9e80: 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75  _string(FILE *ou
9e90: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
9ea0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  ){.  int i;.  ch
9eb0: 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e 61 72  ar c;.  setBinar
9ec0: 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 20  yMode(out, 1);. 
9ed0: 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a   for(i=0; (c = z
9ee0: 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c  [i])!=0 && c!='\
9ef0: 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28  ''; i++){}.  if(
9f00: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66   c==0 ){.    utf
9f10: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25  8_printf(out,"'%
9f20: 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  s'",z);.  }else{
9f30: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
9f40: 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77  out, "'");.    w
9f50: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
9f60: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
9f70: 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  z[i])!=0 && c!='
9f80: 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  \''; i++){}.    
9f90: 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20    if( c=='\'' ) 
9fa0: 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  i++;.      if( i
9fb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
9fc0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e  _printf(out, "%.
9fd0: 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20  *s", i, z);.    
9fe0: 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20      z += i;.    
9ff0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
a000: 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\'' ){.       
a010: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a020: 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63   "'");.        c
a030: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
a040: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
a050: 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
a060: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a070: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  z++;.    }.    r
a080: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a090: 27 22 29 3b 0a 20 20 7d 0a 20 20 73 65 74 54 65  '");.  }.  setTe
a0a0: 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a  xtMode(out, 1);.
a0b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  }../*.** Output 
a0c0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
a0d0: 20 61 73 20 61 20 71 75 6f 74 65 64 20 73 74 72   as a quoted str
a0e0: 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75  ing using SQL qu
a0f0: 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  oting convention
a100: 73 2e 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c  s..** Additional
a110: 6c 6c 79 20 2c 20 65 73 63 61 70 65 20 74 68 65  lly , escape the
a120: 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22 20 63   "\n" and "\r" c
a130: 68 61 72 61 63 74 65 72 73 20 73 6f 20 74 68 61  haracters so tha
a140: 74 20 74 68 65 79 20 64 6f 20 6e 6f 74 0a 2a 2a  t they do not.**
a150: 20 67 65 74 20 63 6f 72 72 75 70 74 65 64 20 62   get corrupted b
a160: 79 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 74 72  y end-of-line tr
a170: 61 6e 73 6c 61 74 69 6f 6e 20 66 61 63 69 6c 69  anslation facili
a180: 74 69 65 73 20 69 6e 20 73 6f 6d 65 20 6f 70 65  ties in some ope
a190: 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d  rating.** system
a1a0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  s..**.** This is
a1b0: 20 6c 69 6b 65 20 6f 75 74 70 75 74 5f 71 75 6f   like output_quo
a1c0: 74 65 64 5f 73 74 72 69 6e 67 28 29 20 62 75 74  ted_string() but
a1d0: 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69   with the additi
a1e0: 6f 6e 20 6f 66 20 74 68 65 20 5c 72 5c 6e 0a 2a  on of the \r\n.*
a1f0: 2a 20 65 73 63 61 70 65 20 6d 65 63 68 61 6e 69  * escape mechani
a200: 73 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  sm..*/.static vo
a210: 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64  id output_quoted
a220: 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28  _escaped_string(
a230: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
a240: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
a250: 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20   i;.  char c;.  
a260: 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 6f 75  setBinaryMode(ou
a270: 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30  t, 1);.  for(i=0
a280: 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20  ; (c = z[i])!=0 
a290: 26 26 20 63 21 3d 27 5c 27 27 20 26 26 20 63 21  && c!='\'' && c!
a2a0: 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27  ='\n' && c!='\r'
a2b0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63  ; i++){}.  if( c
a2c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  ==0 ){.    utf8_
a2d0: 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27  printf(out,"'%s'
a2e0: 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ",z);.  }else{. 
a2f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
a300: 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  NL = 0;.    cons
a310: 74 20 63 68 61 72 20 2a 7a 43 52 20 3d 20 30 3b  t char *zCR = 0;
a320: 0a 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d 20 30  .    int nNL = 0
a330: 3b 0a 20 20 20 20 69 6e 74 20 6e 43 52 20 3d 20  ;.    int nCR = 
a340: 30 3b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  0;.    char zBuf
a350: 31 5b 32 30 5d 2c 20 7a 42 75 66 32 5b 32 30 5d  1[20], zBuf2[20]
a360: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  ;.    for(i=0; z
a370: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
a380: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20   if( z[i]=='\n' 
a390: 29 20 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20 20 69  ) nNL++;.      i
a3a0: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20 29 20  f( z[i]=='\r' ) 
a3b0: 6e 43 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  nCR++;.    }.   
a3c0: 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20   if( nNL ){.    
a3d0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a3e0: 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20  , "replace(");. 
a3f0: 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75 73 65       zNL = unuse
a400: 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 6e  d_string(z, "\\n
a410: 22 2c 20 22 5c 5c 30 31 32 22 2c 20 7a 42 75 66  ", "\\012", zBuf
a420: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
a430: 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72  ( nCR ){.      r
a440: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a450: 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20 20 20  replace(");.    
a460: 20 20 7a 43 52 20 3d 20 75 6e 75 73 65 64 5f 73    zCR = unused_s
a470: 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 72 22 2c 20  tring(z, "\\r", 
a480: 22 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32 29 3b  "\\015", zBuf2);
a490: 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70  .    }.    raw_p
a4a0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
a4b0: 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29  .    while( *z )
a4c0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
a4d0: 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26   (c = z[i])!=0 &
a4e0: 26 20 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d  & c!='\n' && c!=
a4f0: 27 5c 72 27 20 26 26 20 63 21 3d 27 5c 27 27 3b  '\r' && c!='\'';
a500: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66   i++){}.      if
a510: 28 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b  ( c=='\'' ) i++;
a520: 0a 20 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a  .      if( i ){.
a530: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
a540: 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c  ntf(out, "%.*s",
a550: 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20   i, z);.        
a560: 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a  z += i;.      }.
a570: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27        if( c=='\'
a580: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  ' ){.        raw
a590: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22  _printf(out, "'"
a5a0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
a5b0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
a5c0: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
a5d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a5e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b      }.      z++;
a5f0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  .      if( c=='\
a600: 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  n' ){.        ra
a610: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
a620: 73 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 20 20  s", zNL);.      
a630: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
a640: 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72    }.      raw_pr
a650: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
a660: 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zCR);.    }.    
a670: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
a680: 22 27 22 29 3b 0a 20 20 20 20 69 66 28 20 6e 43  "'");.    if( nC
a690: 52 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  R ){.      raw_p
a6a0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73  rintf(out, ",'%s
a6b0: 27 2c 63 68 61 72 28 31 33 29 29 22 2c 20 7a 43  ',char(13))", zC
a6c0: 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  R);.    }.    if
a6d0: 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72  ( nNL ){.      r
a6e0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a6f0: 2c 27 25 73 27 2c 63 68 61 72 28 31 30 29 29 22  ,'%s',char(10))"
a700: 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  , zNL);.    }.  
a710: 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28  }.  setTextMode(
a720: 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  out, 1);.}../*.*
a730: 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76  * Output the giv
a740: 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 71  en string as a q
a750: 75 6f 74 65 64 20 61 63 63 6f 72 64 69 6e 67 20  uoted according 
a760: 74 6f 20 43 20 6f 72 20 54 43 4c 20 71 75 6f 74  to C or TCL quot
a770: 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 73 74  ing rules..*/.st
a780: 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
a790: 5f 63 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  _c_string(FILE *
a7a0: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
a7b0: 2a 7a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  *z){.  unsigned 
a7c0: 69 6e 74 20 63 3b 0a 20 20 66 70 75 74 63 28 27  int c;.  fputc('
a7d0: 22 27 2c 20 6f 75 74 29 3b 0a 20 20 77 68 69 6c  "', out);.  whil
a7e0: 65 28 20 28 63 20 3d 20 2a 28 7a 2b 2b 29 29 21  e( (c = *(z++))!
a7f0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d  =0 ){.    if( c=
a800: 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 66  ='\\' ){.      f
a810: 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20  putc(c, out);.  
a820: 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74      fputc(c, out
a830: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
a840: 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20   c=='"' ){.     
a850: 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74   fputc('\\', out
a860: 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  );.      fputc('
a870: 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65  "', out);.    }e
a880: 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 74 27 20  lse if( c=='\t' 
a890: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  ){.      fputc('
a8a0: 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  \\', out);.     
a8b0: 20 66 70 75 74 63 28 27 74 27 2c 20 6f 75 74 29   fputc('t', out)
a8c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a8d0: 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  c=='\n' ){.     
a8e0: 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74   fputc('\\', out
a8f0: 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  );.      fputc('
a900: 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65  n', out);.    }e
a910: 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 72 27 20  lse if( c=='\r' 
a920: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  ){.      fputc('
a930: 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  \\', out);.     
a940: 20 66 70 75 74 63 28 27 72 27 2c 20 6f 75 74 29   fputc('r', out)
a950: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a960: 21 69 73 70 72 69 6e 74 28 63 26 30 78 66 66 29  !isprint(c&0xff)
a970: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
a980: 69 6e 74 66 28 6f 75 74 2c 20 22 5c 5c 25 30 33  intf(out, "\\%03
a990: 6f 22 2c 20 63 26 30 78 66 66 29 3b 0a 20 20 20  o", c&0xff);.   
a9a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70   }else{.      fp
a9b0: 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
a9c0: 20 7d 0a 20 20 7d 0a 20 20 66 70 75 74 63 28 27   }.  }.  fputc('
a9d0: 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  "', out);.}../*.
a9e0: 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69  ** Output the gi
a9f0: 76 65 6e 20 73 74 72 69 6e 67 20 77 69 74 68 20  ven string with 
aa00: 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20  characters that 
aa10: 61 72 65 20 73 70 65 63 69 61 6c 20 74 6f 0a 2a  are special to.*
aa20: 2a 20 48 54 4d 4c 20 65 73 63 61 70 65 64 2e 0a  * HTML escaped..
aa30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
aa40: 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e  utput_html_strin
aa50: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
aa60: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
aa70: 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  nt i;.  if( z==0
aa80: 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 77 68 69   ) z = "";.  whi
aa90: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 66 6f  le( *z ){.    fo
aaa0: 72 28 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a 20 20  r(i=0;   z[i].  
aab0: 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69            && z[i
aac0: 5d 21 3d 27 3c 27 0a 20 20 20 20 20 20 20 20 20  ]!='<'.         
aad0: 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 26 27 0a     && z[i]!='&'.
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a              && z
aaf0: 5b 69 5d 21 3d 27 3e 27 0a 20 20 20 20 20 20 20  [i]!='>'.       
ab00: 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c       && z[i]!='\
ab10: 22 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  "'.            &
ab20: 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a 20 20  & z[i]!='\'';.  
ab30: 20 20 20 20 20 20 69 2b 2b 29 7b 7d 0a 20 20 20        i++){}.   
ab40: 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
ab50: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
ab60: 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b 0a 20  t,"%.*s",i,z);. 
ab70: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69     }.    if( z[i
ab80: 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20 20  ]=='<' ){.      
ab90: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
aba0: 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73  &lt;");.    }els
abb0: 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26 27 20  e if( z[i]=='&' 
abc0: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
abd0: 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29  ntf(out,"&amp;")
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 3e 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 67 74 3b 22 29 3b 0a 20 20 20 20 7d  t,"&gt;");.    }
ac20: 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  else if( z[i]=='
ac30: 5c 22 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 71 75  _printf(out,"&qu
ac50: 6f 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ot;");.    }else
ac60: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20   if( z[i]=='\'' 
ac70: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
ac80: 6e 74 66 28 6f 75 74 2c 22 26 23 33 39 3b 22 29  ntf(out,"&#39;")
ac90: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
aca0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
acb0: 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31 3b 0a      z += i + 1;.
acc0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
acd0: 61 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73  a field contains
ace0: 20 61 6e 79 20 63 68 61 72 61 63 74 65 72 20 69   any character i
acf0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 61 20 31  dentified by a 1
ad00: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
ad10: 67 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68 65 6e  g.** array, then
ad20: 20 74 68 65 20 73 74 72 69 6e 67 20 6d 75 73 74   the string must
ad30: 20 62 65 20 71 75 6f 74 65 64 20 66 6f 72 20 43   be quoted for C
ad40: 53 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  SV..*/.static co
ad50: 6e 73 74 20 63 68 61 72 20 6e 65 65 64 43 73 76  nst char needCsv
ad60: 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20 31 2c  Quote[] = {.  1,
ad70: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ad80: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
ad90: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
ada0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
adb0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
adc0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
add0: 20 31 2c 0a 20 20 31 2c 20 30 2c 20 31 2c 20 30   1,.  1, 0, 1, 0
ade0: 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 20 20  , 0, 0, 0, 1,   
adf0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
ae00: 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20  , 0, 0,.  0, 0, 
ae10: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
ae20: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
ae30: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c  0, 0, 0, 0,.  0,
ae40: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
ae50: 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 0,   0, 0, 0,
ae60: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
ae70: 20 20 30 2c 20 30 2c 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 20 20 30 2c 20 30   0, 0, 0,   0, 0
ae90: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
aea0: 20 30 2c 0a 20 20 30 2c 20 30 2c 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 20 20  , 0, 0, 0, 0,   
aec0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
aed0: 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 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 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
af00: 30 2c 20 30 2c 20 30 2c 20 31 2c 0a 20 20 31 2c  0, 0, 0, 1,.  1,
af10: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
af20: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
af30: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
af40: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
af50: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
af60: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
af70: 20 31 2c 0a 20 20 31 2c 20 31 2c 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 20 20  , 1, 1, 1, 1,   
af90: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
afa0: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 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 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
afd0: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c  1, 1, 1, 1,.  1,
afe0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
aff0: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
b000: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
b010: 20 20 31 2c 20 31 2c 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 20 20 31 2c 20 31   1, 1, 1,   1, 1
b030: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b040: 20 31 2c 0a 20 20 31 2c 20 31 2c 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 20 20  , 1, 1, 1, 1,   
b060: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b070: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 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 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
b0a0: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 7d 3b 0a 0a  1, 1, 1, 1,.};..
b0b0: 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20 73  /*.** Output a s
b0c0: 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 43 53  ingle term of CS
b0d0: 56 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20 70 2d  V.  Actually, p-
b0e0: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 20 69 73  >colSeparator is
b0f0: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65   used for.** the
b100: 20 73 65 70 61 72 61 74 6f 72 2c 20 77 68 69 63   separator, whic
b110: 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
b120: 20 62 65 20 61 20 63 6f 6d 6d 61 2e 20 20 70 2d   be a comma.  p-
b130: 3e 6e 75 6c 6c 56 61 6c 75 65 20 69 73 0a 2a 2a  >nullValue is.**
b140: 20 74 68 65 20 6e 75 6c 6c 20 76 61 6c 75 65 2e   the null value.
b150: 20 20 53 74 72 69 6e 67 73 20 61 72 65 20 71 75    Strings are qu
b160: 6f 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72  oted if necessar
b170: 79 2e 20 20 54 68 65 20 73 65 70 61 72 61 74 6f  y.  The separato
b180: 72 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 69 73 73  r.** is only iss
b190: 75 65 64 20 69 66 20 62 53 65 70 20 69 73 20 74  ued if bSep is t
b1a0: 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rue..*/.static v
b1b0: 6f 69 64 20 6f 75 74 70 75 74 5f 63 73 76 28 53  oid output_csv(S
b1c0: 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f  hellState *p, co
b1d0: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
b1e0: 20 62 53 65 70 29 7b 0a 20 20 46 49 4c 45 20 2a   bSep){.  FILE *
b1f0: 6f 75 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a 20 20  out = p->out;.  
b200: 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
b210: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
b220: 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61 6c 75  "%s",p->nullValu
b230: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
b240: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
b250: 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSep = strlen30(
b260: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
b270: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  ;.    for(i=0; z
b280: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
b290: 20 69 66 28 20 6e 65 65 64 43 73 76 51 75 6f 74   if( needCsvQuot
b2a0: 65 5b 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e[((unsigned cha
b2b0: 72 2a 29 7a 29 5b 69 5d 5d 0a 20 20 20 20 20 20  r*)z)[i]].      
b2c0: 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70 2d 3e     || (z[i]==p->
b2d0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 20  colSeparator[0] 
b2e0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
b2f0: 28 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d 65 6d 63  (nSep==1 || memc
b300: 6d 70 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  mp(z, p->colSepa
b310: 72 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d 30 29  rator, nSep)==0)
b320: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  ) ){.        i =
b330: 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   0;.        brea
b340: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
b350: 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b  .    if( i==0 ){
b360: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51 75  .      char *zQu
b370: 6f 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  oted = sqlite3_m
b380: 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c  printf("\"%w\"",
b390: 20 7a 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f   z);.      utf8_
b3a0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
b3b0: 2c 20 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20  , zQuoted);.    
b3c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
b3d0: 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 7d 65 6c  Quoted);.    }el
b3e0: 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  se{.      utf8_p
b3f0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c  rintf(out, "%s",
b400: 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   z);.    }.  }. 
b410: 20 69 66 28 20 62 53 65 70 20 29 7b 0a 20 20 20   if( bSep ){.   
b420: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
b430: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f  out, "%s", p->co
b440: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 7d  lSeparator);.  }
b450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
b460: 6f 75 74 69 6e 65 20 72 75 6e 73 20 77 68 65 6e  outine runs when
b470: 20 74 68 65 20 75 73 65 72 20 70 72 65 73 73 65   the user presse
b480: 73 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74 61 74  s Ctrl-C.*/.stat
b490: 69 63 20 76 6f 69 64 20 69 6e 74 65 72 72 75 70  ic void interrup
b4a0: 74 5f 68 61 6e 64 6c 65 72 28 69 6e 74 20 4e 6f  t_handler(int No
b4b0: 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
b4c0: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
b4d0: 65 64 29 3b 0a 20 20 73 65 65 6e 49 6e 74 65 72  ed);.  seenInter
b4e0: 72 75 70 74 2b 2b 3b 0a 20 20 69 66 28 20 73 65  rupt++;.  if( se
b4f0: 65 6e 49 6e 74 65 72 72 75 70 74 3e 32 20 29 20  enInterrupt>2 ) 
b500: 65 78 69 74 28 31 29 3b 0a 20 20 69 66 28 20 67  exit(1);.  if( g
b510: 6c 6f 62 61 6c 44 62 20 29 20 73 71 6c 69 74 65  lobalDb ) sqlite
b520: 33 5f 69 6e 74 65 72 72 75 70 74 28 67 6c 6f 62  3_interrupt(glob
b530: 61 6c 44 62 29 3b 0a 7d 0a 0a 23 69 66 20 28 64  alDb);.}..#if (d
b540: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
b550: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
b560: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57  ) && !defined(_W
b570: 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 0a 2a 2a 20  IN32_WCE)./*.** 
b580: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  This routine run
b590: 73 20 66 6f 72 20 63 6f 6e 73 6f 6c 65 20 65 76  s for console ev
b5a0: 65 6e 74 73 20 28 65 2e 67 2e 20 43 74 72 6c 2d  ents (e.g. Ctrl-
b5b0: 43 29 20 6f 6e 20 57 69 6e 33 32 0a 2a 2f 0a 73  C) on Win32.*/.s
b5c0: 74 61 74 69 63 20 42 4f 4f 4c 20 57 49 4e 41 50  tatic BOOL WINAP
b5d0: 49 20 43 6f 6e 73 6f 6c 65 43 74 72 6c 48 61 6e  I ConsoleCtrlHan
b5e0: 64 6c 65 72 28 0a 20 20 44 57 4f 52 44 20 64 77  dler(.  DWORD dw
b5f0: 43 74 72 6c 54 79 70 65 20 2f 2a 20 4f 6e 65 20  CtrlType /* One 
b600: 6f 66 20 74 68 65 20 43 54 52 4c 5f 2a 5f 45 56  of the CTRL_*_EV
b610: 45 4e 54 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  ENT constants */
b620: 0a 29 7b 0a 20 20 69 66 28 20 64 77 43 74 72 6c  .){.  if( dwCtrl
b630: 54 79 70 65 3d 3d 43 54 52 4c 5f 43 5f 45 56 45  Type==CTRL_C_EVE
b640: 4e 54 20 29 7b 0a 20 20 20 20 69 6e 74 65 72 72  NT ){.    interr
b650: 75 70 74 5f 68 61 6e 64 6c 65 72 28 30 29 3b 0a  upt_handler(0);.
b660: 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b      return TRUE;
b670: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 41  .  }.  return FA
b680: 4c 53 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  LSE;.}.#endif..#
b690: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b6a0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
b6b0: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  ./*.** When the 
b6c0: 22 2e 61 75 74 68 20 4f 4e 22 20 69 73 20 73 65  ".auth ON" is se
b6d0: 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  t, the following
b6e0: 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c   authorizer call
b6f0: 62 61 63 6b 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b  back is.** invok
b700: 65 64 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72  ed.  It always r
b710: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
b720: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b730: 73 68 65 6c 6c 41 75 74 68 28 0a 20 20 76 6f 69  shellAuth(.  voi
b740: 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 0a  d *pClientData,.
b750: 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73    int op,.  cons
b760: 74 20 63 68 61 72 20 2a 7a 41 31 2c 0a 20 20 63  t char *zA1,.  c
b770: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 32 2c 0a  onst char *zA2,.
b780: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
b790: 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  3,.  const char 
b7a0: 2a 7a 41 34 0a 29 7b 0a 20 20 53 68 65 6c 6c 53  *zA4.){.  ShellS
b7b0: 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c  tate *p = (Shell
b7c0: 53 74 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61  State*)pClientDa
b7d0: 74 61 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  ta;.  static con
b7e0: 73 74 20 63 68 61 72 20 2a 61 7a 41 63 74 69 6f  st char *azActio
b7f0: 6e 5b 5d 20 3d 20 7b 20 30 2c 0a 20 20 20 20 20  n[] = { 0,.     
b800: 22 43 52 45 41 54 45 5f 49 4e 44 45 58 22 2c 20  "CREATE_INDEX", 
b810: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f          "CREATE_
b820: 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20  TABLE",         
b830: 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  "CREATE_TEMP_IND
b840: 45 58 22 2c 0a 20 20 20 20 20 22 43 52 45 41 54  EX",.     "CREAT
b850: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20  E_TEMP_TABLE",  
b860: 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 54    "CREATE_TEMP_T
b870: 52 49 47 47 45 52 22 2c 20 20 22 43 52 45 41 54  RIGGER",  "CREAT
b880: 45 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20  E_TEMP_VIEW",.  
b890: 20 20 20 22 43 52 45 41 54 45 5f 54 52 49 47 47     "CREATE_TRIGG
b8a0: 45 52 22 2c 20 20 20 20 20 20 20 22 43 52 45 41  ER",       "CREA
b8b0: 54 45 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20  TE_VIEW",       
b8c0: 20 20 20 22 44 45 4c 45 54 45 22 2c 0a 20 20 20     "DELETE",.   
b8d0: 20 20 22 44 52 4f 50 5f 49 4e 44 45 58 22 2c 20    "DROP_INDEX", 
b8e0: 20 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f            "DROP_
b8f0: 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20  TABLE",         
b900: 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44    "DROP_TEMP_IND
b910: 45 58 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f  EX",.     "DROP_
b920: 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20 20  TEMP_TABLE",    
b930: 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49    "DROP_TEMP_TRI
b940: 47 47 45 52 22 2c 20 20 20 20 22 44 52 4f 50 5f  GGER",    "DROP_
b950: 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20 20  TEMP_VIEW",.    
b960: 20 22 44 52 4f 50 5f 54 52 49 47 47 45 52 22 2c   "DROP_TRIGGER",
b970: 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56           "DROP_V
b980: 49 45 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  IEW",           
b990: 20 22 49 4e 53 45 52 54 22 2c 0a 20 20 20 20 20   "INSERT",.     
b9a0: 22 50 52 41 47 4d 41 22 2c 20 20 20 20 20 20 20  "PRAGMA",       
b9b0: 20 20 20 20 20 20 20 20 22 52 45 41 44 22 2c 20          "READ", 
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 22 53 45 4c 45 43 54 22 2c 0a 20 20 20 20 20 22  "SELECT",.     "
b9e0: 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20 20 20  TRANSACTION",   
b9f0: 20 20 20 20 20 20 20 22 55 50 44 41 54 45 22 2c         "UPDATE",
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
ba10: 41 54 54 41 43 48 22 2c 0a 20 20 20 20 20 22 44  ATTACH",.     "D
ba20: 45 54 41 43 48 22 2c 20 20 20 20 20 20 20 20 20  ETACH",         
ba30: 20 20 20 20 20 20 22 41 4c 54 45 52 5f 54 41 42        "ALTER_TAB
ba40: 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20 22 52  LE",          "R
ba50: 45 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 41  EINDEX",.     "A
ba60: 4e 41 4c 59 5a 45 22 2c 20 20 20 20 20 20 20 20  NALYZE",        
ba70: 20 20 20 20 20 20 22 43 52 45 41 54 45 5f 56 54        "CREATE_VT
ba80: 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 22 44  ABLE",        "D
ba90: 52 4f 50 5f 56 54 41 42 4c 45 22 2c 0a 20 20 20  ROP_VTABLE",.   
baa0: 20 20 22 46 55 4e 43 54 49 4f 4e 22 2c 20 20 20    "FUNCTION",   
bab0: 20 20 20 20 20 20 20 20 20 20 22 53 41 56 45 50            "SAVEP
bac0: 4f 49 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20  OINT",          
bad0: 20 20 22 52 45 43 55 52 53 49 56 45 22 0a 20 20    "RECURSIVE".  
bae0: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  };.  int i;.  co
baf0: 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b 34 5d 3b  nst char *az[4];
bb00: 0a 20 20 61 7a 5b 30 5d 20 3d 20 7a 41 31 3b 0a  .  az[0] = zA1;.
bb10: 20 20 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b 0a 20    az[1] = zA2;. 
bb20: 20 61 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a 20 20   az[2] = zA3;.  
bb30: 61 7a 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20 20 75  az[3] = zA4;.  u
bb40: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
bb50: 74 2c 20 22 61 75 74 68 6f 72 69 7a 65 72 3a 20  t, "authorizer: 
bb60: 25 73 22 2c 20 61 7a 41 63 74 69 6f 6e 5b 6f 70  %s", azAction[op
bb70: 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
bb80: 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 61  <4; i++){.    ra
bb90: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
bba0: 20 22 20 22 29 3b 0a 20 20 20 20 69 66 28 20 61   " ");.    if( a
bbb0: 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 6f 75  z[i] ){.      ou
bbc0: 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d  tput_c_string(p-
bbd0: 3e 6f 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20  >out, az[i]);.  
bbe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
bbf0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
bc00: 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d  , "NULL");.    }
bc10: 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74  .  }.  raw_print
bc20: 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b  f(p->out, "\n");
bc30: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
bc40: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
bc50: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 63 68  *.** Print a sch
bc60: 65 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ema statement.  
bc70: 50 61 72 74 20 6f 66 20 4d 4f 44 45 5f 53 65 6d  Part of MODE_Sem
bc80: 69 20 61 6e 64 20 4d 4f 44 45 5f 50 72 65 74 74  i and MODE_Prett
bc90: 79 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20  y output..**.** 
bca0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e  This routine con
bcb0: 76 65 72 74 73 20 73 6f 6d 65 20 43 52 45 41 54  verts some CREAT
bcc0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
bcd0: 74 73 20 66 6f 72 20 73 68 61 64 6f 77 20 74 61  ts for shadow ta
bce0: 62 6c 65 73 0a 2a 2a 20 69 6e 20 46 54 53 33 2f  bles.** in FTS3/
bcf0: 34 2f 35 20 69 6e 74 6f 20 43 52 45 41 54 45 20  4/5 into CREATE 
bd00: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
bd10: 53 54 53 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  STS statements..
bd20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
bd30: 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 46  rintSchemaLine(F
bd40: 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20  ILE *out, const 
bd50: 63 68 61 72 20 2a 7a 2c 20 63 6f 6e 73 74 20 63  char *z, const c
bd60: 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 69  har *zTail){.  i
bd70: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
bd80: 6f 62 28 22 43 52 45 41 54 45 20 54 41 42 4c 45  ob("CREATE TABLE
bd90: 20 5b 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d 30 20   ['\"]*", z)==0 
bda0: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
bdb0: 74 66 28 6f 75 74 2c 20 22 43 52 45 41 54 45 20  tf(out, "CREATE 
bdc0: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
bdd0: 53 54 53 20 25 73 25 73 22 2c 20 7a 2b 31 33 2c  STS %s%s", z+13,
bde0: 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 65 6c 73 65   zTail);.  }else
bdf0: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
be00: 66 28 6f 75 74 2c 20 22 25 73 25 73 22 2c 20 7a  f(out, "%s%s", z
be10: 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a 7d 0a  , zTail);.  }.}.
be20: 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e  static void prin
be30: 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 46 49 4c  tSchemaLineN(FIL
be40: 45 20 2a 6f 75 74 2c 20 63 68 61 72 20 2a 7a 2c  E *out, char *z,
be50: 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63 68   int n, const ch
be60: 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 63 68  ar *zTail){.  ch
be70: 61 72 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20 20 7a  ar c = z[n];.  z
be80: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 70 72 69 6e 74  [n] = 0;.  print
be90: 53 63 68 65 6d 61 4c 69 6e 65 28 6f 75 74 2c 20  SchemaLine(out, 
bea0: 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7a 5b 6e  z, zTail);.  z[n
beb0: 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = c;.}../*.** 
bec0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 73  Return true if s
bed0: 74 72 69 6e 67 20 7a 5b 5d 20 68 61 73 20 6e 6f  tring z[] has no
bee0: 74 68 69 6e 67 20 62 75 74 20 77 68 69 74 65 73  thing but whites
bef0: 70 61 63 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74  pace and comment
bf00: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  s to the.** end 
bf10: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e  of the first lin
bf20: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
bf30: 20 77 73 54 6f 45 6f 6c 28 63 6f 6e 73 74 20 63   wsToEol(const c
bf40: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
bf50: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69  ;.  for(i=0; z[i
bf60: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; i++){.    if(
bf70: 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 72 65   z[i]=='\n' ) re
bf80: 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
bf90: 49 73 53 70 61 63 65 28 7a 5b 69 5d 29 20 29 20  IsSpace(z[i]) ) 
bfa0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
bfb0: 28 20 7a 5b 69 5d 3d 3d 27 2d 27 20 26 26 20 7a  ( z[i]=='-' && z
bfc0: 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 20 72 65 74  [i+1]=='-' ) ret
bfd0: 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72  urn 1;.    retur
bfe0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
bff0: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 1;.}../*.** Ad
c000: 64 20 61 20 6e 65 77 20 65 6e 74 72 79 20 74 6f  d a new entry to
c010: 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45   the EXPLAIN QUE
c020: 52 59 20 50 4c 41 4e 20 64 61 74 61 0a 2a 2f 0a  RY PLAN data.*/.
c030: 73 74 61 74 69 63 20 76 6f 69 64 20 65 71 70 5f  static void eqp_
c040: 61 70 70 65 6e 64 28 53 68 65 6c 6c 53 74 61 74  append(ShellStat
c050: 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70 49 64  e *p, int iEqpId
c060: 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73 74 20  , int p2, const 
c070: 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20  char *zText){.  
c080: 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70 4e 65  EQPGraphRow *pNe
c090: 77 3b 0a 20 20 69 6e 74 20 6e 54 65 78 74 20 3d  w;.  int nText =
c0a0: 20 73 74 72 6c 65 6e 33 30 28 7a 54 65 78 74 29   strlen30(zText)
c0b0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 75 74 6f 45  ;.  if( p->autoE
c0c0: 51 50 74 65 73 74 20 29 7b 0a 20 20 20 20 75 74  QPtest ){.    ut
c0d0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
c0e0: 2c 20 22 25 64 2c 25 64 2c 25 73 5c 6e 22 2c 20  , "%d,%d,%s\n", 
c0f0: 69 45 71 70 49 64 2c 20 70 32 2c 20 7a 54 65 78  iEqpId, p2, zTex
c100: 74 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d  t);.  }.  pNew =
c110: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
c120: 34 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  4( sizeof(*pNew)
c130: 20 2b 20 6e 54 65 78 74 20 29 3b 0a 20 20 69 66   + nText );.  if
c140: 28 20 70 4e 65 77 3d 3d 30 20 29 20 73 68 65 6c  ( pNew==0 ) shel
c150: 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28  l_out_of_memory(
c160: 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 71 70 49  );.  pNew->iEqpI
c170: 64 20 3d 20 69 45 71 70 49 64 3b 0a 20 20 70 4e  d = iEqpId;.  pN
c180: 65 77 2d 3e 69 50 61 72 65 6e 74 49 64 20 3d 20  ew->iParentId = 
c190: 70 32 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65  p2;.  memcpy(pNe
c1a0: 77 2d 3e 7a 54 65 78 74 2c 20 7a 54 65 78 74 2c  w->zText, zText,
c1b0: 20 6e 54 65 78 74 2b 31 29 3b 0a 20 20 70 4e 65   nText+1);.  pNe
c1c0: 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  w->pNext = 0;.  
c1d0: 69 66 28 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c  if( p->sGraph.pL
c1e0: 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 73 47  ast ){.    p->sG
c1f0: 72 61 70 68 2e 70 4c 61 73 74 2d 3e 70 4e 65 78  raph.pLast->pNex
c200: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 65 6c 73  t = pNew;.  }els
c210: 65 7b 0a 20 20 20 20 70 2d 3e 73 47 72 61 70 68  e{.    p->sGraph
c220: 2e 70 52 6f 77 20 3d 20 70 4e 65 77 3b 0a 20 20  .pRow = pNew;.  
c230: 7d 0a 20 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c  }.  p->sGraph.pL
c240: 61 73 74 20 3d 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  ast = pNew;.}../
c250: 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 64 20 72 65  *.** Free and re
c260: 73 65 74 20 74 68 65 20 45 58 50 4c 41 49 4e 20  set the EXPLAIN 
c270: 51 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61 20  QUERY PLAN data 
c280: 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 63 6f  that has been co
c290: 6c 6c 65 63 74 65 64 0a 2a 2a 20 69 6e 20 70 2d  llected.** in p-
c2a0: 3e 73 47 72 61 70 68 2e 0a 2a 2f 0a 73 74 61 74  >sGraph..*/.stat
c2b0: 69 63 20 76 6f 69 64 20 65 71 70 5f 72 65 73 65  ic void eqp_rese
c2c0: 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  t(ShellState *p)
c2d0: 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20  {.  EQPGraphRow 
c2e0: 2a 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a 20  *pRow, *pNext;. 
c2f0: 20 66 6f 72 28 70 52 6f 77 20 3d 20 70 2d 3e 73   for(pRow = p->s
c300: 47 72 61 70 68 2e 70 52 6f 77 3b 20 70 52 6f 77  Graph.pRow; pRow
c310: 3b 20 70 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b  ; pRow = pNext){
c320: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 52 6f  .    pNext = pRo
c330: 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  w->pNext;.    sq
c340: 6c 69 74 65 33 5f 66 72 65 65 28 70 52 6f 77 29  lite3_free(pRow)
c350: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
c360: 70 2d 3e 73 47 72 61 70 68 2c 20 30 2c 20 73 69  p->sGraph, 0, si
c370: 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70 68 29 29  zeof(p->sGraph))
c380: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  ;.}../* Return t
c390: 68 65 20 6e 65 78 74 20 45 58 50 4c 41 49 4e 20  he next EXPLAIN 
c3a0: 51 55 45 52 59 20 50 4c 41 4e 20 6c 69 6e 65 20  QUERY PLAN line 
c3b0: 77 69 74 68 20 69 45 71 70 49 64 20 74 68 61 74  with iEqpId that
c3c0: 20 6f 63 63 75 72 73 20 61 66 74 65 72 0a 2a 2a   occurs after.**
c3d0: 20 70 4f 6c 64 2c 20 6f 72 20 72 65 74 75 72 6e   pOld, or return
c3e0: 20 74 68 65 20 66 69 72 73 74 20 73 75 63 68 20   the first such 
c3f0: 6c 69 6e 65 20 69 66 20 70 4f 6c 64 20 69 73 20  line if pOld is 
c400: 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 45  NULL.*/.static E
c410: 51 50 47 72 61 70 68 52 6f 77 20 2a 65 71 70 5f  QPGraphRow *eqp_
c420: 6e 65 78 74 5f 72 6f 77 28 53 68 65 6c 6c 53 74  next_row(ShellSt
c430: 61 74 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70  ate *p, int iEqp
c440: 49 64 2c 20 45 51 50 47 72 61 70 68 52 6f 77 20  Id, EQPGraphRow 
c450: 2a 70 4f 6c 64 29 7b 0a 20 20 45 51 50 47 72 61  *pOld){.  EQPGra
c460: 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d 20 70 4f  phRow *pRow = pO
c470: 6c 64 20 3f 20 70 4f 6c 64 2d 3e 70 4e 65 78 74  ld ? pOld->pNext
c480: 20 3a 20 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f   : p->sGraph.pRo
c490: 77 3b 0a 20 20 77 68 69 6c 65 28 20 70 52 6f 77  w;.  while( pRow
c4a0: 20 26 26 20 70 52 6f 77 2d 3e 69 50 61 72 65 6e   && pRow->iParen
c4b0: 74 49 64 21 3d 69 45 71 70 49 64 20 29 20 70 52  tId!=iEqpId ) pR
c4c0: 6f 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65 78 74  ow = pRow->pNext
c4d0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 6f 77 3b  ;.  return pRow;
c4e0: 0a 7d 0a 0a 2f 2a 20 52 65 6e 64 65 72 20 61 20  .}../* Render a 
c4f0: 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f 66 20  single level of 
c500: 74 68 65 20 67 72 61 70 68 20 74 68 61 74 20 68  the graph that h
c510: 61 73 20 69 45 71 70 49 64 20 61 73 20 69 74 73  as iEqpId as its
c520: 20 70 61 72 65 6e 74 2e 20 20 43 61 6c 6c 65 64   parent.  Called
c530: 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 6c 79 20  .** recursively 
c540: 74 6f 20 72 65 6e 64 65 72 20 73 75 62 6c 65 76  to render sublev
c550: 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  els..*/.static v
c560: 6f 69 64 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c  oid eqp_render_l
c570: 65 76 65 6c 28 53 68 65 6c 6c 53 74 61 74 65 20  evel(ShellState 
c580: 2a 70 2c 20 69 6e 74 20 69 45 71 70 49 64 29 7b  *p, int iEqpId){
c590: 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a  .  EQPGraphRow *
c5a0: 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  pRow, *pNext;.  
c5b0: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  int n = strlen30
c5c0: 28 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66  (p->sGraph.zPref
c5d0: 69 78 29 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  ix);.  char *z;.
c5e0: 20 20 66 6f 72 28 70 52 6f 77 20 3d 20 65 71 70    for(pRow = eqp
c5f0: 5f 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69 45 71  _next_row(p, iEq
c600: 70 49 64 2c 20 30 29 3b 20 70 52 6f 77 3b 20 70  pId, 0); pRow; p
c610: 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b 0a 20 20  Row = pNext){.  
c620: 20 20 70 4e 65 78 74 20 3d 20 65 71 70 5f 6e 65    pNext = eqp_ne
c630: 78 74 5f 72 6f 77 28 70 2c 20 69 45 71 70 49 64  xt_row(p, iEqpId
c640: 2c 20 70 52 6f 77 29 3b 0a 20 20 20 20 7a 20 3d  , pRow);.    z =
c650: 20 70 52 6f 77 2d 3e 7a 54 65 78 74 3b 0a 20 20   pRow->zText;.  
c660: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
c670: 3e 6f 75 74 2c 20 22 25 73 25 73 25 73 5c 6e 22  >out, "%s%s%s\n"
c680: 2c 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65  , p->sGraph.zPre
c690: 66 69 78 2c 20 70 4e 65 78 74 20 3f 20 22 7c 2d  fix, pNext ? "|-
c6a0: 2d 22 20 3a 20 22 60 2d 2d 22 2c 20 7a 29 3b 0a  -" : "`--", z);.
c6b0: 20 20 20 20 69 66 28 20 6e 3c 28 69 6e 74 29 73      if( n<(int)s
c6c0: 69 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70 68 2e  izeof(p->sGraph.
c6d0: 7a 50 72 65 66 69 78 29 2d 37 20 29 7b 0a 20 20  zPrefix)-7 ){.  
c6e0: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 73      memcpy(&p->s
c6f0: 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 5d  Graph.zPrefix[n]
c700: 2c 20 70 4e 65 78 74 20 3f 20 22 7c 20 20 22 20  , pNext ? "|  " 
c710: 3a 20 22 20 20 20 22 2c 20 34 29 3b 0a 20 20 20  : "   ", 4);.   
c720: 20 20 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c 65     eqp_render_le
c730: 76 65 6c 28 70 2c 20 70 52 6f 77 2d 3e 69 45 71  vel(p, pRow->iEq
c740: 70 49 64 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73  pId);.      p->s
c750: 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 5d  Graph.zPrefix[n]
c760: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
c770: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79  }../*.** Display
c780: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 45   and reset the E
c790: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
c7a0: 4e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63  N data.*/.static
c7b0: 20 76 6f 69 64 20 65 71 70 5f 72 65 6e 64 65 72   void eqp_render
c7c0: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
c7d0: 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a  .  EQPGraphRow *
c7e0: 70 52 6f 77 20 3d 20 70 2d 3e 73 47 72 61 70 68  pRow = p->sGraph
c7f0: 2e 70 52 6f 77 3b 0a 20 20 69 66 28 20 70 52 6f  .pRow;.  if( pRo
c800: 77 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52 6f  w ){.    if( pRo
c810: 77 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 2d 27  w->zText[0]=='-'
c820: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
c830: 6f 77 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 7b 0a  ow->pNext==0 ){.
c840: 20 20 20 20 20 20 20 20 65 71 70 5f 72 65 73 65          eqp_rese
c850: 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  t(p);.        re
c860: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
c870: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
c880: 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
c890: 70 52 6f 77 2d 3e 7a 54 65 78 74 2b 33 29 3b 0a  pRow->zText+3);.
c8a0: 20 20 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e        p->sGraph.
c8b0: 70 52 6f 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65  pRow = pRow->pNe
c8c0: 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
c8d0: 33 5f 66 72 65 65 28 70 52 6f 77 29 3b 0a 20 20  3_free(pRow);.  
c8e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
c8f0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
c900: 74 2c 20 22 51 55 45 52 59 20 50 4c 41 4e 5c 6e  t, "QUERY PLAN\n
c910: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  ");.    }.    p-
c920: 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b  >sGraph.zPrefix[
c930: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 65 71 70 5f  0] = 0;.    eqp_
c940: 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 70 2c 20  render_level(p, 
c950: 30 29 3b 0a 20 20 20 20 65 71 70 5f 72 65 73 65  0);.    eqp_rese
c960: 74 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  t(p);.  }.}..#if
c970: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c980: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
c990: 43 4b 0a 2f 2a 0a 2a 2a 20 50 72 6f 67 72 65 73  CK./*.** Progres
c9a0: 73 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  s handler callba
c9b0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
c9c0: 74 20 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  t progress_handl
c9d0: 65 72 28 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74  er(void *pClient
c9e0: 44 61 74 61 29 20 7b 0a 20 20 53 68 65 6c 6c 53  Data) {.  ShellS
c9f0: 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c  tate *p = (Shell
ca00: 53 74 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61  State*)pClientDa
ca10: 74 61 3b 0a 20 20 70 2d 3e 6e 50 72 6f 67 72 65  ta;.  p->nProgre
ca20: 73 73 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  ss++;.  if( p->n
ca30: 50 72 6f 67 72 65 73 73 3e 3d 70 2d 3e 6d 78 50  Progress>=p->mxP
ca40: 72 6f 67 72 65 73 73 20 26 26 20 70 2d 3e 6d 78  rogress && p->mx
ca50: 50 72 6f 67 72 65 73 73 3e 30 20 29 7b 0a 20 20  Progress>0 ){.  
ca60: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
ca70: 6f 75 74 2c 20 22 50 72 6f 67 72 65 73 73 20 6c  out, "Progress l
ca80: 69 6d 69 74 20 72 65 61 63 68 65 64 20 28 25 75  imit reached (%u
ca90: 29 5c 6e 22 2c 20 70 2d 3e 6e 50 72 6f 67 72 65  )\n", p->nProgre
caa0: 73 73 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ss);.    if( p->
cab0: 66 6c 67 50 72 6f 67 72 65 73 73 20 26 20 53 48  flgProgress & SH
cac0: 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 52 45 53  ELL_PROGRESS_RES
cad0: 45 54 20 29 20 70 2d 3e 6e 50 72 6f 67 72 65 73  ET ) p->nProgres
cae0: 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  s = 0;.    if( p
caf0: 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73 20 26 20  ->flgProgress & 
cb00: 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 4f  SHELL_PROGRESS_O
cb10: 4e 43 45 20 29 20 70 2d 3e 6d 78 50 72 6f 67 72  NCE ) p->mxProgr
cb20: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ess = 0;.    ret
cb30: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
cb40: 20 28 70 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73   (p->flgProgress
cb50: 20 26 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53   & SHELL_PROGRES
cb60: 53 5f 51 55 49 45 54 29 3d 3d 30 20 29 7b 0a 20  S_QUIET)==0 ){. 
cb70: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
cb80: 3e 6f 75 74 2c 20 22 50 72 6f 67 72 65 73 73 20  >out, "Progress 
cb90: 25 75 5c 6e 22 2c 20 70 2d 3e 6e 50 72 6f 67 72  %u\n", p->nProgr
cba0: 65 73 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ess);.  }.  retu
cbb0: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
cbc0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  * SQLITE_OMIT_PR
cbd0: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 20  OGRESS_CALLBACK 
cbe0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  */../*.** This i
cbf0: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  s the callback r
cc00: 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68 65 20  outine that the 
cc10: 73 68 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73  shell.** invokes
cc20: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
cc30: 20 61 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e   a query result.
cc40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
cc50: 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 0a 20  hell_callback(. 
cc60: 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69   void *pArg,.  i
cc70: 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
cc80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
cc90: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
cca0: 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
ccb0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
ccc0: 68 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  h result column 
ccd0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  */.  char **azCo
cce0: 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  l,    /* Column 
ccf0: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  names */.  int *
cd00: 61 69 54 79 70 65 20 20 20 20 20 20 2f 2a 20 43  aiType      /* C
cd10: 6f 6c 75 6d 6e 20 74 79 70 65 73 20 2a 2f 0a 29  olumn types */.)
cd20: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 68 65  {.  int i;.  She
cd30: 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68  llState *p = (Sh
cd40: 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a  ellState*)pArg;.
cd50: 0a 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20  .  if( azArg==0 
cd60: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77  ) return 0;.  sw
cd70: 69 74 63 68 28 20 70 2d 3e 63 4d 6f 64 65 20 29  itch( p->cMode )
cd80: 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  {.    case MODE_
cd90: 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  Line: {.      in
cda0: 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20 20 69  t w = 5;.      i
cdb0: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
cdc0: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  eak;.      for(i
cdd0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
cde0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65  {.        int le
cdf0: 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 43  n = strlen30(azC
ce00: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
ce10: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
ce20: 69 66 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d 20  if( len>w ) w = 
ce30: 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  len;.      }.   
ce40: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e     if( p->cnt++>
ce50: 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  0 ) utf8_printf(
ce60: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
ce70: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
ce80: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ce90: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
cea0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
ceb0: 28 70 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d 20 25  (p->out,"%*s = %
cec0: 73 25 73 22 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69  s%s", w, azCol[i
ced0: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
cee0: 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a     azArg[i] ? az
cef0: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
cf00: 56 61 6c 75 65 2c 20 70 2d 3e 72 6f 77 53 65 70  Value, p->rowSep
cf10: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d  arator);.      }
cf20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
cf30: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
cf40: 45 5f 45 78 70 6c 61 69 6e 3a 0a 20 20 20 20 63  E_Explain:.    c
cf50: 61 73 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a  ase MODE_Column:
cf60: 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20   {.      static 
cf70: 63 6f 6e 73 74 20 69 6e 74 20 61 45 78 70 6c 61  const int aExpla
cf80: 69 6e 57 69 64 74 68 73 5b 5d 20 3d 20 7b 34 2c  inWidths[] = {4,
cf90: 20 31 33 2c 20 34 2c 20 34 2c 20 34 2c 20 31 33   13, 4, 4, 4, 13
cfa0: 2c 20 32 2c 20 31 33 7d 3b 0a 20 20 20 20 20 20  , 2, 13};.      
cfb0: 63 6f 6e 73 74 20 69 6e 74 20 2a 63 6f 6c 57 69  const int *colWi
cfc0: 64 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  dth;.      int s
cfd0: 68 6f 77 48 64 72 3b 0a 20 20 20 20 20 20 63 68  howHdr;.      ch
cfe0: 61 72 20 2a 72 6f 77 53 65 70 3b 0a 20 20 20 20  ar *rowSep;.    
cff0: 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d    if( p->cMode==
d000: 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20  MODE_Column ){. 
d010: 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20         colWidth 
d020: 3d 20 70 2d 3e 63 6f 6c 57 69 64 74 68 3b 0a 20  = p->colWidth;. 
d030: 20 20 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d         showHdr =
d040: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a   p->showHeader;.
d050: 20 20 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d          rowSep =
d060: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
d070: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d080: 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20         colWidth 
d090: 3d 20 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73  = aExplainWidths
d0a0: 3b 0a 20 20 20 20 20 20 20 20 73 68 6f 77 48 64  ;.        showHd
d0b0: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  r = 1;.        r
d0c0: 6f 77 53 65 70 20 3d 20 53 45 50 5f 52 6f 77 3b  owSep = SEP_Row;
d0d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d0e0: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29  f( p->cnt++==0 )
d0f0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
d100: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
d110: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77  .          int w
d120: 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69  , n;.          i
d130: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
d140: 2d 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a 20  ->colWidth) ){. 
d150: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 63             w = c
d160: 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20  olWidth[i];.    
d170: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d180: 20 20 20 20 20 20 20 20 20 77 20 3d 20 30 3b 0a           w = 0;.
d190: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d1a0: 20 20 20 20 20 20 69 66 28 20 77 3d 3d 30 20 29        if( w==0 )
d1b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 20  {.            w 
d1c0: 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 43  = strlenChar(azC
d1d0: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
d1e0: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
d1f0: 20 20 20 20 69 66 28 20 77 3c 31 30 20 29 20 77      if( w<10 ) w
d200: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20   = 10;.         
d210: 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 43 68 61     n = strlenCha
d220: 72 28 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67  r(azArg && azArg
d230: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
d240: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a   p->nullValue);.
d250: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
d260: 77 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20  w<n ) w = n;.   
d270: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d280: 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69     if( i<ArraySi
d290: 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74  ze(p->actualWidt
d2a0: 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  h) ){.          
d2b0: 20 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68    p->actualWidth
d2c0: 5b 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20  [i] = w;.       
d2d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
d2e0: 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20  f( showHdr ){.  
d2f0: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 77            utf8_w
d300: 69 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75  idth_print(p->ou
d310: 74 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b  t, w, azCol[i]);
d320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
d330: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
d340: 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d 31   "%s", i==nArg-1
d350: 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22   ? rowSep : "  "
d360: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
d370: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d380: 20 69 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a   if( showHdr ){.
d390: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
d3a0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
d3b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
d3c0: 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   w;.            
d3d0: 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28  if( i<ArraySize(
d3e0: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20  p->actualWidth) 
d3f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
d400: 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57    w = p->actualW
d410: 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20  idth[i];.       
d420: 20 20 20 20 20 20 20 20 69 66 28 20 77 3c 30 20          if( w<0 
d430: 29 20 77 20 3d 20 2d 77 3b 0a 20 20 20 20 20 20  ) w = -w;.      
d440: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d450: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
d460: 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  10;.            
d470: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  }.            ut
d480: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
d490: 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c  ,"%-*.*s%s",w,w,
d4a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d4b0: 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      "-----------
d4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22  ---------------"
d4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d500: 20 20 20 20 22 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 2d 2d 2d 2d 2d 2d 2d  ----------------
d530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22  ---------------"
d540: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d550: 20 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20        i==nArg-1 
d560: 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29  ? rowSep : "  ")
d570: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d590: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
d5a0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
d5b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
d5c0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
d5d0: 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20   int w;.        
d5e0: 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28  if( i<ArraySize(
d5f0: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20  p->actualWidth) 
d600: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20  ){.           w 
d610: 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  = p->actualWidth
d620: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  [i];.        }el
d630: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77  se{.           w
d640: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d   = 10;.        }
d650: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
d660: 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c  cMode==MODE_Expl
d670: 61 69 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d 20  ain && azArg[i] 
d680: 26 26 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a  && strlenChar(az
d690: 41 72 67 5b 69 5d 29 3e 77 20 29 7b 0a 20 20 20  Arg[i])>w ){.   
d6a0: 20 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65         w = strle
d6b0: 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3b  nChar(azArg[i]);
d6c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d6d0: 20 20 20 69 66 28 20 69 3d 3d 31 20 26 26 20 70     if( i==1 && p
d6e0: 2d 3e 61 69 49 6e 64 65 6e 74 20 26 26 20 70 2d  ->aiIndent && p-
d6f0: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
d700: 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e 64 65      if( p->iInde
d710: 6e 74 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20 29 7b  nt<p->nIndent ){
d720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
d730: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
d740: 20 22 25 2a 2e 73 22 2c 20 70 2d 3e 61 69 49 6e   "%*.s", p->aiIn
d750: 64 65 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e 74 5d  dent[p->iIndent]
d760: 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20  , "");.         
d770: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
d780: 69 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20 20 20  iIndent++;.     
d790: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66     }.        utf
d7a0: 38 5f 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d  8_width_print(p-
d7b0: 3e 6f 75 74 2c 20 77 2c 20 61 7a 41 72 67 5b 69  >out, w, azArg[i
d7c0: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
d7d0: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
d7e0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
d7f0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
d800: 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53  i==nArg-1 ? rowS
d810: 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20  ep : "  ");.    
d820: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
d830: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d840: 4d 4f 44 45 5f 53 65 6d 69 3a 20 7b 20 20 20 2f  MODE_Semi: {   /
d850: 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66  * .schema and .f
d860: 75 6c 6c 73 63 68 65 6d 61 20 6f 75 74 70 75 74  ullschema output
d870: 20 2a 2f 0a 20 20 20 20 20 20 70 72 69 6e 74 53   */.      printS
d880: 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74  chemaLine(p->out
d890: 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 22 3b 5c 6e  , azArg[0], ";\n
d8a0: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
d8b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d8c0: 4d 4f 44 45 5f 50 72 65 74 74 79 3a 20 7b 20 20  MODE_Pretty: {  
d8d0: 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e  /* .schema and .
d8e0: 66 75 6c 6c 73 63 68 65 6d 61 20 77 69 74 68 20  fullschema with 
d8f0: 2d 2d 69 6e 64 65 6e 74 20 2a 2f 0a 20 20 20 20  --indent */.    
d900: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20    char *z;.     
d910: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 6e   int j;.      in
d920: 74 20 6e 50 61 72 65 6e 20 3d 20 30 3b 0a 20 20  t nParen = 0;.  
d930: 20 20 20 20 63 68 61 72 20 63 45 6e 64 20 3d 20      char cEnd = 
d940: 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b  0;.      char c;
d950: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6e 65  .      int nLine
d960: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
d970: 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
d980: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 30       if( azArg[0
d990: 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ]==0 ) break;.  
d9a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
d9b0: 73 74 72 6c 69 6b 65 28 22 43 52 45 41 54 45 20  strlike("CREATE 
d9c0: 56 49 45 57 25 22 2c 20 61 7a 41 72 67 5b 30 5d  VIEW%", azArg[0]
d9d0: 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c  , 0)==0.       |
d9e0: 7c 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 54 52 49 47 25 22  e("CREATE TRIG%"
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 29 7b 0a 20 20 20 20 20  0.      ){.     
da20: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
da30: 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20  ->out, "%s;\n", 
da40: 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20  azArg[0]);.     
da50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
da60: 7d 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  }.      z = sqli
da70: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
da80: 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20  , azArg[0]);.   
da90: 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20     j = 0;.      
daa0: 66 6f 72 28 69 3d 30 3b 20 49 73 53 70 61 63 65  for(i=0; IsSpace
dab0: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
dac0: 20 20 20 20 20 66 6f 72 28 3b 20 28 63 20 3d 20       for(; (c = 
dad0: 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  z[i])!=0; i++){.
dae0: 20 20 20 20 20 20 20 20 69 66 28 20 49 73 53 70          if( IsSp
daf0: 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20  ace(c) ){.      
db00: 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d      if( z[j-1]==
db10: 27 5c 72 27 20 29 20 7a 5b 6a 2d 31 5d 20 3d 20  '\r' ) z[j-1] = 
db20: 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\n';.          
db30: 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d  if( IsSpace(z[j-
db40: 31 5d 29 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d 3d 27  1]) || z[j-1]=='
db50: 28 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  (' ) continue;. 
db60: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
db70: 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d 27   (c=='(' || c=='
db80: 29 27 29 20 26 26 20 6a 3e 30 20 26 26 20 49 73  )') && j>0 && Is
db90: 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b  Space(z[j-1]) ){
dba0: 0a 20 20 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a  .          j--;.
dbb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dbc0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20    z[j++] = c;.  
dbd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
dbe0: 65 28 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63  e( j>0 && IsSpac
dbf0: 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a 2d 2d  e(z[j-1]) ){ j--
dc00: 3b 20 7d 0a 20 20 20 20 20 20 7a 5b 6a 5d 20 3d  ; }.      z[j] =
dc10: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74   0;.      if( st
dc20: 72 6c 65 6e 33 30 28 7a 29 3e 3d 37 39 20 29 7b  rlen30(z)>=79 ){
dc30: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a  .        for(i=j
dc40: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
dc50: 30 3b 20 69 2b 2b 29 7b 20 20 2f 2a 20 43 6f 70  0; i++){  /* Cop
dc60: 79 20 63 68 61 6e 67 65 73 20 66 72 6f 6d 20 7a  y changes from z
dc70: 5b 69 5d 20 62 61 63 6b 20 74 6f 20 7a 5b 6a 5d  [i] back to z[j]
dc80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
dc90: 28 20 63 3d 3d 63 45 6e 64 20 29 7b 0a 20 20 20  ( c==cEnd ){.   
dca0: 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20           cEnd = 
dcb0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
dcc0: 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c  se if( c=='"' ||
dcd0: 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27   c=='\'' || c=='
dce0: 60 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  `' ){.          
dcf0: 20 20 63 45 6e 64 20 3d 20 63 3b 0a 20 20 20 20    cEnd = c;.    
dd00: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
dd10: 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  c=='[' ){.      
dd20: 20 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5d 27        cEnd = ']'
dd30: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
dd40: 65 20 69 66 28 20 63 3d 3d 27 2d 27 20 26 26 20  e if( c=='-' && 
dd50: 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20  z[i+1]=='-' ){. 
dd60: 20 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20             cEnd 
dd70: 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
dd80: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
dd90: 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  (' ){.          
dda0: 20 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20 20 20    nParen++;.    
ddb0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ddc0: 63 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20  c==')' ){.      
ddd0: 20 20 20 20 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a        nParen--;.
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
ddf0: 6e 4c 69 6e 65 3e 30 20 26 26 20 6e 50 61 72 65  nLine>0 && nPare
de00: 6e 3d 3d 30 20 26 26 20 6a 3e 30 20 29 7b 0a 20  n==0 && j>0 ){. 
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
de20: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70 2d  ntSchemaLineN(p-
de30: 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 22  >out, z, j, "\n"
de40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
de50: 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   j = 0;.        
de60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
de70: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  }.          z[j+
de80: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  +] = c;.        
de90: 20 20 69 66 28 20 6e 50 61 72 65 6e 3d 3d 31 20    if( nParen==1 
dea0: 26 26 20 63 45 6e 64 3d 3d 30 0a 20 20 20 20 20  && cEnd==0.     
deb0: 20 20 20 20 20 20 26 26 20 28 63 3d 3d 27 28 27        && (c=='('
dec0: 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20 7c 7c 20 28   || c=='\n' || (
ded0: 63 3d 3d 27 2c 27 20 26 26 20 21 77 73 54 6f 45  c==',' && !wsToE
dee0: 6f 6c 28 7a 2b 69 2b 31 29 29 29 0a 20 20 20 20  ol(z+i+1))).    
def0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
df00: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
df10: 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20   ) j--;.        
df20: 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c      printSchemaL
df30: 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20  ineN(p->out, z, 
df40: 6a 2c 20 22 5c 6e 20 20 22 29 3b 0a 20 20 20 20  j, "\n  ");.    
df50: 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20          j = 0;. 
df60: 20 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65             nLine
df70: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
df80: 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
df90: 5b 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d  [i+1]) ){ i++; }
dfa0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
dfb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
dfc0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [j] = 0;.      }
dfd0: 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65  .      printSche
dfe0: 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a  maLine(p->out, z
dff0: 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  , ";\n");.      
e000: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
e010: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e020: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
e030: 45 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20  E_List: {.      
e040: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
e050: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
e060: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
e070: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
e080: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
e090: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e0a0: 22 25 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c  "%s%s",azCol[i],
e0b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e0c0: 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 70     i==nArg-1 ? p
e0d0: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 20 3a  ->rowSeparator :
e0e0: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
e0f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e100: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
e110: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
e120: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
e130: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
e140: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
e150: 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
e160: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
e170: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20   p->nullValue;. 
e180: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
e190: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
e1a0: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   z);.        if(
e1b0: 20 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20 20   i<nArg-1 ){.   
e1c0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
e1d0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
e1e0: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
e1f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
e200: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
e210: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e220: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
e230: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  rator);.        
e240: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
e250: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e260: 20 63 61 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a   case MODE_Html:
e270: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
e280: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
e290: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
e2a0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
e2b0: 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a  p->out,"<TR>");.
e2c0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
e2d0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
e2e0: 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
e2f0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e  ntf(p->out,"<TH>
e300: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  ");.          ou
e310: 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67  tput_html_string
e320: 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69  (p->out, azCol[i
e330: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61  ]);.          ra
e340: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e350: 22 3c 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20 20  "</TH>\n");.    
e360: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
e370: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e380: 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20  "</TR>\n");.    
e390: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
e3a0: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
e3b0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e3c0: 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b  (p->out,"<TR>");
e3d0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
e3e0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
e3f0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e400: 28 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29 3b  (p->out,"<TD>");
e410: 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f  .        output_
e420: 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  html_string(p->o
e430: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61  ut, azArg[i] ? a
e440: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
e450: 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20  lValue);.       
e460: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e470: 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20  ut,"</TD>\n");. 
e480: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77       }.      raw
e490: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e4a0: 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TR>\n");.     
e4b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e4c0: 20 20 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a    case MODE_Tcl:
e4d0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
e4e0: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
e4f0: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
e500: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
e510: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
e520: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
e530: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43  tring(p->out,azC
e540: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
e550: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
e560: 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75    if(i<nArg-1) u
e570: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e580: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
e590: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
e5a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66     }.        utf
e5b0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e5c0: 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70   "%s", p->rowSep
e5d0: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d  arator);.      }
e5e0: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
e5f0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
e600: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
e610: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
e620: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
e630: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
e640: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
e650: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20  p->nullValue);. 
e660: 20 20 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67         if(i<nArg
e670: 2d 31 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  -1) utf8_printf(
e680: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
e690: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
e6a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74        }.      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 72 6f 77 53 65  , "%s", p->rowSe
e6d0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
e6e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e6f0: 20 63 61 73 65 20 4d 4f 44 45 5f 43 73 76 3a 20   case MODE_Csv: 
e700: 7b 0a 20 20 20 20 20 20 73 65 74 42 69 6e 61 72  {.      setBinar
e710: 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  yMode(p->out, 1)
e720: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  ;.      if( p->c
e730: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
e740: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
e750: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e760: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
e770: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28       output_csv(
e780: 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a  p, azCol[i] ? az
e790: 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c 6e  Col[i] : "", i<n
e7a0: 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Arg-1);.        
e7b0: 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  }.        utf8_p
e7c0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
e7d0: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
e7e0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tor);.      }.  
e7f0: 20 20 20 20 69 66 28 20 6e 41 72 67 3e 30 20 29      if( nArg>0 )
e800: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
e810: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
e820: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
e830: 74 5f 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69  t_csv(p, azArg[i
e840: 5d 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20  ], i<nArg-1);.  
e850: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e860: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
e870: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
e880: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
e890: 20 20 7d 0a 20 20 20 20 20 20 73 65 74 54 65 78    }.      setTex
e8a0: 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  tMode(p->out, 1)
e8b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e8c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
e8d0: 44 45 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20  DE_Insert: {.   
e8e0: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
e8f0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 75  ) break;.      u
e900: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e910: 74 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25  t,"INSERT INTO %
e920: 73 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65  s",p->zDestTable
e930: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
e940: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
e950: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e960: 28 70 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a 20 20  (p->out,"(");.  
e970: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e980: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
e990: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
e9a0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e9b0: 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
e9c0: 20 20 20 20 69 66 28 20 71 75 6f 74 65 43 68 61      if( quoteCha
e9d0: 72 28 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20  r(azCol[i]) ){. 
e9e0: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
e9f0: 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  *z = sqlite3_mpr
ea00: 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 61  intf("\"%w\"", a
ea10: 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zCol[i]);.      
ea20: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
ea30: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
ea40: 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
ea50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
ea60: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
ea70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61  {.            ra
ea80: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
ea90: 20 22 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29   "%s", azCol[i])
eaa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
eab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
eac0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
ead0: 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a  t,")");.      }.
eae0: 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a        p->cnt++;.
eaf0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
eb00: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
eb10: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
eb20: 70 2d 3e 6f 75 74 2c 20 69 3e 30 20 3f 20 22 2c  p->out, i>0 ? ",
eb30: 22 20 3a 20 22 20 56 41 4c 55 45 53 28 22 29 3b  " : " VALUES(");
eb40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 61 7a  .        if( (az
eb50: 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61  Arg[i]==0) || (a
eb60: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
eb70: 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29  i]==SQLITE_NULL)
eb80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
eb90: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
eba0: 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20  ,"NULL");.      
ebb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
ebc0: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
ebd0: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
ebe0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53 68            if( Sh
ebf0: 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48  ellHasFlag(p, SH
ec00: 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b  FLG_Newlines) ){
ec10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74  .            out
ec20: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
ec30: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
ec40: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  i]);.          }
ec50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ec60: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
ec70: 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70  escaped_string(p
ec80: 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29  ->out, azArg[i])
ec90: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
eca0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ecb0: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
ecc0: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  [i]==SQLITE_INTE
ecd0: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20  GER ){.         
ece0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
ecf0: 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b  out,"%s", azArg[
ed00: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
ed10: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
ed20: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
ed30: 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TE_FLOAT ){.    
ed40: 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d        char z[50]
ed50: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  ;.          doub
ed60: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  le r = sqlite3_c
ed70: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e  olumn_double(p->
ed80: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
ed90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e       sqlite3_uin
eda0: 74 36 34 20 75 72 3b 0a 20 20 20 20 20 20 20 20  t64 ur;.        
edb0: 20 20 6d 65 6d 63 70 79 28 26 75 72 2c 26 72 2c    memcpy(&ur,&r,
edc0: 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20 20 20  sizeof(r));.    
edd0: 20 20 20 20 20 20 69 66 28 20 75 72 3d 3d 30 78        if( ur==0x
ede0: 37 66 66 30 30 30 30 30 30 30 30 30 30 30 30 30  7ff0000000000000
edf0: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
ee00: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
ee10: 6f 75 74 2c 20 22 31 65 39 39 39 22 29 3b 0a 20  out, "1e999");. 
ee20: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
ee30: 66 28 20 75 72 3d 3d 30 78 66 66 66 30 30 30 30  f( ur==0xfff0000
ee40: 30 30 30 30 30 30 30 30 30 4c 4c 20 29 7b 0a 20  000000000LL ){. 
ee50: 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70             raw_p
ee60: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2d  rintf(p->out, "-
ee70: 31 65 39 39 39 22 29 3b 0a 20 20 20 20 20 20 20  1e999");.       
ee80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ee90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
eea0: 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e  printf(50,z,"%!.
eeb0: 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20  20g", r);.      
eec0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
eed0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
eee0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
eef0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
ef00: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
ef10: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  e[i]==SQLITE_BLO
ef20: 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b  B && p->pStmt ){
ef30: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
ef40: 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73   void *pBlob = s
ef50: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
ef60: 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b  ob(p->pStmt, i);
ef70: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
ef80: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
ef90: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70  olumn_bytes(p->p
efa0: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
efb0: 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62      output_hex_b
efc0: 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f  lob(p->out, pBlo
efd0: 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20  b, nBlob);.     
efe0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e     }else if( isN
eff0: 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20  umber(azArg[i], 
f000: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
f010: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
f020: 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  ut,"%s", azArg[i
f030: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
f040: 65 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c  e if( ShellHasFl
f050: 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c  ag(p, SHFLG_Newl
f060: 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20  ines) ){.       
f070: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
f080: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
f090: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
f0a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f0b0: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
f0c0: 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67  d_escaped_string
f0d0: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
f0e0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
f0f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f      }.      raw_
f100: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29  printf(p->out,")
f110: 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ;\n");.      bre
f120: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
f130: 73 65 20 4d 4f 44 45 5f 51 75 6f 74 65 3a 20 7b  se MODE_Quote: {
f140: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
f150: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
f160: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 3d 3d 30     if( p->cnt==0
f170: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
f180: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  r ){.        for
f190: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
f1a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
f1b0: 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e  ( i>0 ) raw_prin
f1c0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b  tf(p->out, ",");
f1d0: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
f1e0: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
f1f0: 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d  p->out, azCol[i]
f200: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f210: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
f220: 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20  p->out,"\n");.  
f230: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 63      }.      p->c
f240: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt++;.      for(
f250: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
f260: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
f270: 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  >0 ) raw_printf(
f280: 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20  p->out, ",");.  
f290: 20 20 20 20 20 20 69 66 28 20 28 61 7a 41 72 67        if( (azArg
f2a0: 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79  [i]==0) || (aiTy
f2b0: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
f2c0: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b  =SQLITE_NULL) ){
f2d0: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
f2e0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e  printf(p->out,"N
f2f0: 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  ULL");.        }
f300: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
f310: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
f320: 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20  LITE_TEXT ){.   
f330: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75         output_qu
f340: 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  oted_string(p->o
f350: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  ut, azArg[i]);. 
f360: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
f370: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
f380: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  e[i]==SQLITE_INT
f390: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
f3a0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
f3b0: 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67  >out,"%s", azArg
f3c0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
f3d0: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
f3e0: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
f3f0: 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  ITE_FLOAT ){.   
f400: 20 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30         char z[50
f410: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75  ];.          dou
f420: 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f  ble r = sqlite3_
f430: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d  column_double(p-
f440: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
f450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
f460: 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e  printf(50,z,"%!.
f470: 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20  20g", r);.      
f480: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
f490: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  ->out, "%s", z);
f4a0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
f4b0: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
f4c0: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42  ype[i]==SQLITE_B
f4d0: 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20  LOB && p->pStmt 
f4e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
f4f0: 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d  st void *pBlob =
f500: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
f510: 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69  blob(p->pStmt, i
f520: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
f530: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
f540: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d  _column_bytes(p-
f550: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
f560: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78        output_hex
f570: 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42  _blob(p->out, pB
f580: 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20  lob, nBlob);.   
f590: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
f5a0: 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d  sNumber(azArg[i]
f5b0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
f5c0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
f5d0: 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67  >out,"%s", azArg
f5e0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
f5f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  lse{.          o
f600: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
f610: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
f620: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
f630: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
f640: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
f650: 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72  ,"\n");.      br
f660: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f670: 61 73 65 20 4d 4f 44 45 5f 41 73 63 69 69 3a 20  ase MODE_Ascii: 
f680: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  {.      if( p->c
f690: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
f6a0: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
f6b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
f6c0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
f6d0: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 75       if( i>0 ) u
f6e0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
f6f0: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
f700: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
f710: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
f720: 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 43  (p->out,"%s",azC
f730: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
f740: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
f750: 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  }.        utf8_p
f760: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
f770: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
f780: 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tor);.      }.  
f790: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
f7a0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
f7b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
f7c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
f7d0: 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72  f( i>0 ) utf8_pr
f7e0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
f7f0: 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ", p->colSeparat
f800: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66  or);.        utf
f810: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
f820: 22 25 73 22 2c 61 7a 41 72 67 5b 69 5d 20 3f 20  "%s",azArg[i] ? 
f830: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
f840: 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
f850: 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  }.      utf8_pri
f860: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
f870: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
f880: 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
f890: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f8a0: 4d 4f 44 45 5f 45 51 50 3a 20 7b 0a 20 20 20 20  MODE_EQP: {.    
f8b0: 20 20 65 71 70 5f 61 70 70 65 6e 64 28 70 2c 20    eqp_append(p, 
f8c0: 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29 2c 20  atoi(azArg[0]), 
f8d0: 61 74 6f 69 28 61 7a 41 72 67 5b 31 5d 29 2c 20  atoi(azArg[1]), 
f8e0: 61 7a 41 72 67 5b 33 5d 29 3b 0a 20 20 20 20 20  azArg[3]);.     
f8f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f900: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
f910: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
f920: 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  he callback rout
f930: 69 6e 65 20 74 68 61 74 20 74 68 65 20 53 51 4c  ine that the SQL
f940: 69 74 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 69  ite library.** i
f950: 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20  nvokes for each 
f960: 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79 20 72  row of a query r
f970: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
f980: 20 69 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76 6f   int callback(vo
f990: 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41  id *pArg, int nA
f9a0: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  rg, char **azArg
f9b0: 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b  , char **azCol){
f9c0: 0a 20 20 2f 2a 20 73 69 6e 63 65 20 77 65 20 64  .  /* since we d
f9d0: 6f 6e 27 74 20 68 61 76 65 20 74 79 70 65 20 69  on't have type i
f9e0: 6e 66 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73 68  nfo, call the sh
f9f0: 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69 74  ell_callback wit
fa00: 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a  h a NULL value *
fa10: 2f 0a 20 20 72 65 74 75 72 6e 20 73 68 65 6c 6c  /.  return shell
fa20: 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20  _callback(pArg, 
fa30: 6e 41 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a 43  nArg, azArg, azC
fa40: 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a  ol, NULL);.}../*
fa50: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
fa60: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
fa70: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 78   from sqlite3_ex
fa80: 65 63 28 29 20 74 68 61 74 20 61 70 70 65 6e 64  ec() that append
fa90: 73 20 61 6c 6c 0a 2a 2a 20 6f 75 74 70 75 74 20  s all.** output 
faa0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
fab0: 61 20 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65  a ShellText obje
fac0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct..*/.static in
fad0: 74 20 63 61 70 74 75 72 65 4f 75 74 70 75 74 43  t captureOutputC
fae0: 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41  allback(void *pA
faf0: 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68  rg, int nArg, ch
fb00: 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72  ar **azArg, char
fb10: 20 2a 2a 61 7a 29 7b 0a 20 20 53 68 65 6c 6c 54   **az){.  ShellT
fb20: 65 78 74 20 2a 70 20 3d 20 28 53 68 65 6c 6c 54  ext *p = (ShellT
fb30: 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74  ext*)pArg;.  int
fb40: 20 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   i;.  UNUSED_PAR
fb50: 41 4d 45 54 45 52 28 61 7a 29 3b 0a 20 20 69 66  AMETER(az);.  if
fb60: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74  ( azArg==0 ) ret
fb70: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
fb80: 6e 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 70  n ) appendText(p
fb90: 2c 20 22 7c 22 2c 20 30 29 3b 0a 20 20 66 6f 72  , "|", 0);.  for
fba0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
fbb0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 20 29 20  +){.    if( i ) 
fbc0: 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20 22 2c  appendText(p, ",
fbd0: 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61  ", 0);.    if( a
fbe0: 7a 41 72 67 5b 69 5d 20 29 20 61 70 70 65 6e 64  zArg[i] ) append
fbf0: 54 65 78 74 28 70 2c 20 61 7a 41 72 67 5b 69 5d  Text(p, azArg[i]
fc00: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
fc10: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
fc20: 65 6e 65 72 61 74 65 20 61 6e 20 61 70 70 72 6f  enerate an appro
fc30: 70 72 69 61 74 65 20 53 45 4c 46 54 45 53 54 20  priate SELFTEST 
fc40: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69  table in the mai
fc50: 6e 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  n database..*/.s
fc60: 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74  tatic void creat
fc70: 65 53 65 6c 66 74 65 73 74 54 61 62 6c 65 28 53  eSelftestTable(S
fc80: 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
fc90: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
fca0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78   0;.  sqlite3_ex
fcb0: 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22 53  ec(p->db,.    "S
fcc0: 41 56 45 50 4f 49 4e 54 20 73 65 6c 66 74 65 73  AVEPOINT selftes
fcd0: 74 5f 69 6e 69 74 3b 5c 6e 22 0a 20 20 20 20 22  t_init;\n".    "
fce0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20  CREATE TABLE IF 
fcf0: 4e 4f 54 20 45 58 49 53 54 53 20 73 65 6c 66 74  NOT EXISTS selft
fd00: 65 73 74 28 5c 6e 22 0a 20 20 20 20 22 20 20 74  est(\n".    "  t
fd10: 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  no INTEGER PRIMA
fd20: 52 59 20 4b 45 59 2c 5c 6e 22 20 20 20 2f 2a 20  RY KEY,\n"   /* 
fd30: 54 65 73 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  Test number */. 
fd40: 20 20 20 22 20 20 6f 70 20 54 45 58 54 2c 5c 6e     "  op TEXT,\n
fd50: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
fd60: 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 3a      /* Operator:
fd70: 20 20 6d 65 6d 6f 20 72 75 6e 20 2a 2f 0a 20 20    memo run */.  
fd80: 20 20 22 20 20 63 6d 64 20 54 45 58 54 2c 5c 6e    "  cmd TEXT,\n
fd90: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
fda0: 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 65     /* Command te
fdb0: 78 74 20 2a 2f 0a 20 20 20 20 22 20 20 61 6e 73  xt */.    "  ans
fdc0: 20 54 45 58 54 5c 6e 22 20 20 20 20 20 20 20 20   TEXT\n"        
fdd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
fde0: 73 69 72 65 64 20 61 6e 73 77 65 72 20 2a 2f 0a  sired answer */.
fdf0: 20 20 20 20 22 29 3b 22 0a 20 20 20 20 22 43 52      ");".    "CR
fe00: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
fe10: 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 6f 70  [_shell$self](op
fe20: 2c 63 6d 64 2c 61 6e 73 29 3b 5c 6e 22 0a 20 20  ,cmd,ans);\n".  
fe30: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b    "INSERT INTO [
fe40: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 72 6f 77  _shell$self](row
fe50: 69 64 2c 6f 70 2c 63 6d 64 29 5c 6e 22 0a 20 20  id,op,cmd)\n".  
fe60: 20 20 22 20 20 56 41 4c 55 45 53 28 63 6f 61 6c    "  VALUES(coal
fe70: 65 73 63 65 28 28 53 45 4c 45 43 54 20 28 6d 61  esce((SELECT (ma
fe80: 78 28 74 6e 6f 29 2b 31 30 30 29 2f 31 30 20 46  x(tno)+100)/10 F
fe90: 52 4f 4d 20 73 65 6c 66 74 65 73 74 29 2c 31 30  ROM selftest),10
fea0: 29 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20  ),\n".    "     
feb0: 20 20 20 20 27 6d 65 6d 6f 27 2c 27 54 65 73 74      'memo','Test
fec0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 2d  s generated by -
fed0: 2d 69 6e 69 74 27 29 3b 5c 6e 22 0a 20 20 20 20  -init');\n".    
fee0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73  "INSERT INTO [_s
fef0: 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20  hell$self]\n".  
ff00: 20 20 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e    "  SELECT 'run
ff10: 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 27  ',\n".    "    '
ff20: 53 45 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f  SELECT hex(sha3_
ff30: 71 75 65 72 79 28 27 27 53 45 4c 45 43 54 20 74  query(''SELECT t
ff40: 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d  ype,name,tbl_nam
ff50: 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20  e,sql ".        
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff70: 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73           "FROM s
ff80: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44  qlite_master ORD
ff90: 45 52 20 42 59 20 32 27 27 2c 32 32 34 29 29 27  ER BY 2'',224))'
ffa0: 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65  ,\n".    "    he
ffb0: 78 28 73 68 61 33 5f 71 75 65 72 79 28 27 53 45  x(sha3_query('SE
ffc0: 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74  LECT type,name,t
ffd0: 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20 20  bl_name,sql ".  
ffe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fff0: 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71          "FROM sq
10000 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45  lite_master ORDE
10010 52 20 42 59 20 32 27 2c 32 32 34 29 29 3b 5c 6e  R BY 2',224));\n
10020 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e  ".    "INSERT IN
10030 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d  TO [_shell$self]
10040 5c 6e 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43  \n".    "  SELEC
10050 54 20 27 72 75 6e 27 2c 22 0a 20 20 20 20 22 20  T 'run',".    " 
10060 20 20 20 27 53 45 4c 45 43 54 20 68 65 78 28 73     'SELECT hex(s
10070 68 61 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45  ha3_query(''SELE
10080 43 54 20 2a 20 46 52 4f 4d 20 5c 22 27 20 7c 7c  CT * FROM \"' ||
10090 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 70  ".    "        p
100a0 72 69 6e 74 66 28 27 25 77 27 2c 6e 61 6d 65 29  rintf('%w',name)
100b0 20 7c 7c 20 27 5c 22 20 4e 4f 54 20 49 4e 44 45   || '\" NOT INDE
100c0 58 45 44 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22  XED'',224))',\n"
100d0 0a 20 20 20 20 22 20 20 20 20 68 65 78 28 73 68  .    "    hex(sh
100e0 61 33 5f 71 75 65 72 79 28 70 72 69 6e 74 66 28  a3_query(printf(
100f0 27 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c  'SELECT * FROM \
10100 22 25 77 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45  "%w\" NOT INDEXE
10110 44 27 2c 6e 61 6d 65 29 2c 32 32 34 29 29 5c 6e  D',name),224))\n
10120 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 28 5c  ".    "  FROM (\
10130 6e 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45  n".    "    SELE
10140 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
10150 69 74 65 5f 6d 61 73 74 65 72 5c 6e 22 0a 20 20  ite_master\n".  
10160 20 20 22 20 20 20 20 20 57 48 45 52 45 20 74 79    "     WHERE ty
10170 70 65 3d 27 74 61 62 6c 65 27 5c 6e 22 0a 20 20  pe='table'\n".  
10180 20 20 22 20 20 20 20 20 20 20 41 4e 44 20 6e 61    "       AND na
10190 6d 65 3c 3e 27 73 65 6c 66 74 65 73 74 27 5c 6e  me<>'selftest'\n
101a0 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 41 4e  ".    "       AN
101b0 44 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70  D coalesce(rootp
101c0 61 67 65 2c 30 29 3e 30 5c 6e 22 0a 20 20 20 20  age,0)>0\n".    
101d0 22 20 20 29 5c 6e 22 0a 20 20 20 20 22 20 4f 52  "  )\n".    " OR
101e0 44 45 52 20 42 59 20 6e 61 6d 65 3b 5c 6e 22 0a  DER BY name;\n".
101f0 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
10200 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e   [_shell$self]\n
10210 22 0a 20 20 20 20 22 20 20 56 41 4c 55 45 53 28  ".    "  VALUES(
10220 27 72 75 6e 27 2c 27 50 52 41 47 4d 41 20 69 6e  'run','PRAGMA in
10230 74 65 67 72 69 74 79 5f 63 68 65 63 6b 27 2c 27  tegrity_check','
10240 6f 6b 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e  ok');\n".    "IN
10250 53 45 52 54 20 49 4e 54 4f 20 73 65 6c 66 74 65  SERT INTO selfte
10260 73 74 28 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61 6e  st(tno,op,cmd,an
10270 73 29 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43  s)".    "  SELEC
10280 54 20 72 6f 77 69 64 2a 31 30 2c 6f 70 2c 63 6d  T rowid*10,op,cm
10290 64 2c 61 6e 73 20 46 52 4f 4d 20 5b 5f 73 68 65  d,ans FROM [_she
102a0 6c 6c 24 73 65 6c 66 5d 3b 5c 6e 22 0a 20 20 20  ll$self];\n".   
102b0 20 22 44 52 4f 50 20 54 41 42 4c 45 20 5b 5f 73   "DROP TABLE [_s
102c0 68 65 6c 6c 24 73 65 6c 66 5d 3b 22 0a 20 20 20  hell$self];".   
102d0 20 2c 30 2c 30 2c 26 7a 45 72 72 4d 73 67 29 3b   ,0,0,&zErrMsg);
102e0 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29  .  if( zErrMsg )
102f0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
10300 66 28 73 74 64 65 72 72 2c 20 22 53 45 4c 46 54  f(stderr, "SELFT
10310 45 53 54 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  EST initializati
10320 6f 6e 20 66 61 69 6c 75 72 65 3a 20 25 73 5c 6e  on failure: %s\n
10330 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
10340 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
10350 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71  rrMsg);.  }.  sq
10360 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
10370 2c 20 22 52 45 4c 45 41 53 45 20 73 65 6c 66 74  , "RELEASE selft
10380 65 73 74 5f 69 6e 69 74 22 2c 30 2c 30 2c 30 29  est_init",0,0,0)
10390 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ;.}.../*.** Set 
103a0 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
103b0 74 61 62 6c 65 20 66 69 65 6c 64 20 6f 66 20 74  table field of t
103c0 68 65 20 53 68 65 6c 6c 53 74 61 74 65 20 73 74  he ShellState st
103d0 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 74 68  ructure to.** th
103e0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
103f0 62 6c 65 20 67 69 76 65 6e 2e 20 20 45 73 63 61  ble given.  Esca
10400 70 65 20 61 6e 79 20 71 75 6f 74 65 20 63 68 61  pe any quote cha
10410 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 0a 2a  racters in the.*
10420 2a 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a 2f  * table name..*/
10430 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
10440 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 53 68 65 6c  _table_name(Shel
10450 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74  lState *p, const
10460 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
10470 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 68 61   int i, n;.  cha
10480 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72  r cQuote;.  char
10490 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 7a   *z;..  if( p->z
104a0 44 65 73 74 54 61 62 6c 65 20 29 7b 0a 20 20 20  DestTable ){.   
104b0 20 66 72 65 65 28 70 2d 3e 7a 44 65 73 74 54 61   free(p->zDestTa
104c0 62 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 44 65  ble);.    p->zDe
104d0 73 74 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d  stTable = 0;.  }
104e0 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
104f0 29 20 72 65 74 75 72 6e 3b 0a 20 20 63 51 75 6f  ) return;.  cQuo
10500 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72 28 7a  te = quoteChar(z
10510 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 73 74 72  Name);.  n = str
10520 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
10530 69 66 28 20 63 51 75 6f 74 65 20 29 20 6e 20 2b  if( cQuote ) n +
10540 3d 20 6e 2b 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e  = n+2;.  z = p->
10550 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 6d 61 6c  zDestTable = mal
10560 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66  loc( n+1 );.  if
10570 28 20 7a 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f  ( z==0 ) shell_o
10580 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a  ut_of_memory();.
10590 20 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 63    n = 0;.  if( c
105a0 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d  Quote ) z[n++] =
105b0 20 63 51 75 6f 74 65 3b 0a 20 20 66 6f 72 28 69   cQuote;.  for(i
105c0 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b  =0; zName[i]; i+
105d0 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d  +){.    z[n++] =
105e0 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20 20 69   zName[i];.    i
105f0 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 63 51 75  f( zName[i]==cQu
10600 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63  ote ) z[n++] = c
10610 51 75 6f 74 65 3b 0a 20 20 7d 0a 20 20 69 66 28  Quote;.  }.  if(
10620 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d   cQuote ) z[n++]
10630 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7a 5b 6e   = cQuote;.  z[n
10640 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ] = 0;.}.../*.**
10650 20 45 78 65 63 75 74 65 20 61 20 71 75 65 72 79   Execute a query
10660 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
10670 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 53 51  will generate SQ
10680 4c 20 6f 75 74 70 75 74 2e 20 20 50 72 69 6e 74  L output.  Print
10690 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
106a0 6f 6c 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d 73 65  olumns, comma-se
106b0 70 61 72 61 74 65 64 2c 20 6f 6e 20 61 20 6c 69  parated, on a li
106c0 6e 65 20 61 6e 64 20 74 68 65 6e 20 61 64 64 20  ne and then add 
106d0 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e 20 74  a.** semicolon t
106e0 65 72 6d 69 6e 61 74 6f 72 20 74 6f 20 74 68 65  erminator to the
106f0 20 65 6e 64 20 6f 66 20 74 68 61 74 20 6c 69 6e   end of that lin
10700 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
10710 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
10720 73 20 69 73 20 31 20 61 6e 64 20 74 68 61 74 20  s is 1 and that 
10730 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
10740 74 65 78 74 20 22 2d 2d 22 0a 2a 2a 20 74 68 65  text "--".** the
10750 6e 20 77 72 69 74 65 20 74 68 65 20 73 65 6d 69  n write the semi
10760 63 6f 6c 6f 6e 20 6f 6e 20 61 20 73 65 70 61 72  colon on a separ
10770 61 74 65 20 6c 69 6e 65 2e 20 20 54 68 61 74 20  ate line.  That 
10780 77 61 79 2c 20 69 66 20 61 0a 2a 2a 20 22 2d 2d  way, if a.** "--
10790 22 20 63 6f 6d 6d 65 6e 74 20 6f 63 63 75 72 73  " comment occurs
107a0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
107b0 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
107c0 65 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77 6f 6e  e comment.** won
107d0 27 74 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 73  't consume the s
107e0 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61  emicolon termina
107f0 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
10800 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d  nt run_table_dum
10810 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65 6c 6c  p_query(.  Shell
10820 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20  State *p,       
10830 20 20 20 20 2f 2a 20 51 75 65 72 79 20 63 6f 6e      /* Query con
10840 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  text */.  const 
10850 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 2c 20 20  char *zSelect,  
10860 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
10870 74 65 6d 65 6e 74 20 74 6f 20 65 78 74 72 61 63  tement to extrac
10880 74 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 63  t content */.  c
10890 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 72 73  onst char *zFirs
108a0 74 52 6f 77 20 20 20 20 2f 2a 20 50 72 69 6e 74  tRow    /* Print
108b0 20 62 65 66 6f 72 65 20 66 69 72 73 74 20 72 6f   before first ro
108c0 77 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a  w, if not NULL *
108d0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
108e0 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a 20 20  tmt *pSelect;.  
108f0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 52  int rc;.  int nR
10900 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  esult;.  int i;.
10910 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
10920 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
10930 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
10940 2c 20 7a 53 65 6c 65 63 74 2c 20 2d 31 2c 20 26  , zSelect, -1, &
10950 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69  pSelect, 0);.  i
10960 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10970 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 7b 0a   || !pSelect ){.
10980 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
10990 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45  p->out, "/**** E
109a0 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a  RROR: (%d) %s **
109b0 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20  ***/\n", rc,.   
109c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
109d0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
109e0 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  b));.    if( (rc
109f0 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43  &0xff)!=SQLITE_C
10a00 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72  ORRUPT ) p->nErr
10a10 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ++;.    return r
10a20 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  c;.  }.  rc = sq
10a30 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65  lite3_step(pSele
10a40 63 74 29 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d  ct);.  nResult =
10a50 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
10a60 63 6f 75 6e 74 28 70 53 65 6c 65 63 74 29 3b 0a  count(pSelect);.
10a70 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
10a80 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69  ITE_ROW ){.    i
10a90 66 28 20 7a 46 69 72 73 74 52 6f 77 20 29 7b 0a  f( zFirstRow ){.
10aa0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
10ab0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
10ac0 7a 46 69 72 73 74 52 6f 77 29 3b 0a 20 20 20 20  zFirstRow);.    
10ad0 20 20 7a 46 69 72 73 74 52 6f 77 20 3d 20 30 3b    zFirstRow = 0;
10ae0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 28  .    }.    z = (
10af0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
10b00 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
10b10 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
10b20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
10b30 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
10b40 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 52     for(i=1; i<nR
10b50 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  esult; i++){.   
10b60 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
10b70 2d 3e 6f 75 74 2c 20 22 2c 25 73 22 2c 20 73 71  ->out, ",%s", sq
10b80 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
10b90 74 28 70 53 65 6c 65 63 74 2c 20 69 29 29 3b 0a  t(pSelect, i));.
10ba0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 3d      }.    if( z=
10bb0 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 20  =0 ) z = "";.   
10bc0 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20 26 26 20   while( z[0] && 
10bd0 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20 7a 5b  (z[0]!='-' || z[
10be0 31 5d 21 3d 27 2d 27 29 20 29 20 7a 2b 2b 3b 0a  1]!='-') ) z++;.
10bf0 20 20 20 20 69 66 28 20 7a 5b 30 5d 20 29 7b 0a      if( z[0] ){.
10c00 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
10c10 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c 6e 22  (p->out, "\n;\n"
10c20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10c30 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
10c40 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20  ->out, ";\n");. 
10c50 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
10c60 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65  lite3_step(pSele
10c70 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ct);.  }.  rc = 
10c80 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
10c90 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  (pSelect);.  if(
10ca0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10cb0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
10cc0 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a  f(p->out, "/****
10cd0 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20   ERROR: (%d) %s 
10ce0 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20  *****/\n", rc,. 
10cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
10d00 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
10d10 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28  >db));.    if( (
10d20 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45  rc&0xff)!=SQLITE
10d30 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45  _CORRUPT ) p->nE
10d40 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rr++;.  }.  retu
10d50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10d60 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 61  Allocate space a
10d70 6e 64 20 73 61 76 65 20 6f 66 66 20 63 75 72 72  nd save off curr
10d80 65 6e 74 20 65 72 72 6f 72 20 73 74 72 69 6e 67  ent error string
10d90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
10da0 20 2a 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 0a   *save_err_msg(.
10db0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 20 20    sqlite3 *db   
10dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
10dd0 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f  base to query */
10de0 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 4d 73  .){.  int nErrMs
10df0 67 20 3d 20 31 2b 73 74 72 6c 65 6e 33 30 28 73  g = 1+strlen30(s
10e00 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
10e10 29 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ));.  char *zErr
10e20 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Msg = sqlite3_ma
10e30 6c 6c 6f 63 36 34 28 6e 45 72 72 4d 73 67 29 3b  lloc64(nErrMsg);
10e40 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29  .  if( zErrMsg )
10e50 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 72  {.    memcpy(zEr
10e60 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65 72  rMsg, sqlite3_er
10e70 72 6d 73 67 28 64 62 29 2c 20 6e 45 72 72 4d 73  rmsg(db), nErrMs
10e80 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
10e90 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 23 69 66   zErrMsg;.}..#if
10ea0 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a  def __linux__./*
10eb0 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 64  .** Attempt to d
10ec0 69 73 70 6c 61 79 20 49 2f 4f 20 73 74 61 74 73  isplay I/O stats
10ed0 20 6f 6e 20 4c 69 6e 75 78 20 75 73 69 6e 67 20   on Linux using 
10ee0 2f 70 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a 2f 0a  /proc/PID/io.*/.
10ef0 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70  static void disp
10f00 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28  layLinuxIoStats(
10f10 46 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 46 49  FILE *out){.  FI
10f20 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 7a  LE *in;.  char z
10f30 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  [200];.  sqlite3
10f40 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
10f50 28 7a 29 2c 20 7a 2c 20 22 2f 70 72 6f 63 2f 25  (z), z, "/proc/%
10f60 64 2f 69 6f 22 2c 20 67 65 74 70 69 64 28 29 29  d/io", getpid())
10f70 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a  ;.  in = fopen(z
10f80 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  , "rb");.  if( i
10f90 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
10fa0 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a 2c   while( fgets(z,
10fb0 20 73 69 7a 65 6f 66 28 7a 29 2c 20 69 6e 29 21   sizeof(z), in)!
10fc0 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
10fd0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
10fe0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
10ff0 20 2a 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20 20   *zPattern;.    
11000 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
11010 65 73 63 3b 0a 20 20 20 20 7d 20 61 54 72 61 6e  esc;.    } aTran
11020 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  s[] = {.      { 
11030 22 72 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20  "rchar: ",      
11040 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74              "Byt
11050 65 73 20 72 65 63 65 69 76 65 64 20 62 79 20 72  es received by r
11060 65 61 64 28 29 3a 22 20 7d 2c 0a 20 20 20 20 20  ead():" },.     
11070 20 7b 20 22 77 63 68 61 72 3a 20 22 2c 20 20 20   { "wchar: ",   
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11090 42 79 74 65 73 20 73 65 6e 74 20 74 6f 20 77 72  Bytes sent to wr
110a0 69 74 65 28 29 3a 22 20 20 20 20 7d 2c 0a 20 20  ite():"    },.  
110b0 20 20 20 20 7b 20 22 73 79 73 63 72 3a 20 22 2c      { "syscr: ",
110c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110d0 20 20 22 52 65 61 64 28 29 20 73 79 73 74 65 6d    "Read() system
110e0 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 20 7d 2c   calls:"      },
110f0 0a 20 20 20 20 20 20 7b 20 22 73 79 73 63 77 3a  .      { "syscw:
11100 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   ",             
11110 20 20 20 20 20 22 57 72 69 74 65 28 29 20 73 79       "Write() sy
11120 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20  stem calls:"    
11130 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72 65 61   },.      { "rea
11140 64 5f 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20  d_bytes: ",     
11150 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20 72          "Bytes r
11160 65 61 64 20 66 72 6f 6d 20 73 74 6f 72 61 67 65  ead from storage
11170 3a 22 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  :"  },.      { "
11180 77 72 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20  write_bytes: ", 
11190 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65             "Byte
111a0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 74 6f  s written to sto
111b0 72 61 67 65 3a 22 20 7d 2c 0a 20 20 20 20 20 20  rage:" },.      
111c0 7b 20 22 63 61 6e 63 65 6c 6c 65 64 5f 77 72 69  { "cancelled_wri
111d0 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 22 43  te_bytes: ",  "C
111e0 61 6e 63 65 6c 6c 65 64 20 77 72 69 74 65 20 62  ancelled write b
111f0 79 74 65 73 3a 22 20 20 20 20 7d 2c 0a 20 20 20  ytes:"    },.   
11200 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   };.    int i;. 
11210 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
11220 72 61 79 53 69 7a 65 28 61 54 72 61 6e 73 29 3b  raySize(aTrans);
11230 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
11240 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 54   n = strlen30(aT
11250 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e  rans[i].zPattern
11260 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  );.      if( str
11270 6e 63 6d 70 28 61 54 72 61 6e 73 5b 69 5d 2e 7a  ncmp(aTrans[i].z
11280 50 61 74 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d  Pattern, z, n)==
11290 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
112a0 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
112b0 2d 33 36 73 20 25 73 22 2c 20 61 54 72 61 6e 73  -36s %s", aTrans
112c0 5b 69 5d 2e 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d  [i].zDesc, &z[n]
112d0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
112e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
112f0 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29    }.  fclose(in)
11300 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
11310 2a 20 44 69 73 70 6c 61 79 20 61 20 73 69 6e 67  * Display a sing
11320 6c 65 20 6c 69 6e 65 20 6f 66 20 73 74 61 74 75  le line of statu
11330 73 20 75 73 69 6e 67 20 36 34 2d 62 69 74 20 76  s using 64-bit v
11340 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
11350 20 76 6f 69 64 20 64 69 73 70 6c 61 79 53 74 61   void displaySta
11360 74 4c 69 6e 65 28 0a 20 20 53 68 65 6c 6c 53 74  tLine(.  ShellSt
11370 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ate *p,         
11380 20 20 20 2f 2a 20 54 68 65 20 73 68 65 6c 6c 20     /* The shell 
11390 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 68 61  context */.  cha
113a0 72 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20  r *zLabel,      
113b0 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
113c0 66 6f 72 20 74 68 69 73 20 6f 6e 65 20 6c 69 6e  for this one lin
113d0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 6f  e */.  char *zFo
113e0 72 6d 61 74 2c 20 20 20 20 20 20 20 20 20 20 20  rmat,           
113f0 20 2f 2a 20 46 6f 72 6d 61 74 20 66 6f 72 20 74   /* Format for t
11400 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69  he result */.  i
11410 6e 74 20 69 53 74 61 74 75 73 43 74 72 6c 2c 20  nt iStatusCtrl, 
11420 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
11430 68 20 73 74 61 74 75 73 20 74 6f 20 64 69 73 70  h status to disp
11440 6c 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  lay */.  int bRe
11450 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20  set             
11460 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
11470 73 65 74 20 74 68 65 20 73 74 61 74 73 20 2a 2f  set the stats */
11480 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  .){.  sqlite3_in
11490 74 36 34 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  t64 iCur = -1;. 
114a0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
114b0 48 69 77 74 72 20 3d 20 2d 31 3b 0a 20 20 69 6e  Hiwtr = -1;.  in
114c0 74 20 69 2c 20 6e 50 65 72 63 65 6e 74 3b 0a 20  t i, nPercent;. 
114d0 20 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30 5d   char zLine[200]
114e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74  ;.  sqlite3_stat
114f0 75 73 36 34 28 69 53 74 61 74 75 73 43 74 72 6c  us64(iStatusCtrl
11500 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
11510 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 66 6f 72  , bReset);.  for
11520 28 69 3d 30 2c 20 6e 50 65 72 63 65 6e 74 3d 30  (i=0, nPercent=0
11530 3b 20 7a 46 6f 72 6d 61 74 5b 69 5d 3b 20 69 2b  ; zFormat[i]; i+
11540 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 6f 72  +){.    if( zFor
11550 6d 61 74 5b 69 5d 3d 3d 27 25 27 20 29 20 6e 50  mat[i]=='%' ) nP
11560 65 72 63 65 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20  ercent++;.  }.  
11570 69 66 28 20 6e 50 65 72 63 65 6e 74 3e 31 20 29  if( nPercent>1 )
11580 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
11590 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c  printf(sizeof(zL
115a0 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f  ine), zLine, zFo
115b0 72 6d 61 74 2c 20 69 43 75 72 2c 20 69 48 69 77  rmat, iCur, iHiw
115c0 74 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tr);.  }else{.  
115d0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
115e0 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  tf(sizeof(zLine)
115f0 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74  , zLine, zFormat
11600 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 7d 0a 20  , iHiwtr);.  }. 
11610 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
11620 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22  ut, "%-36s %s\n"
11630 2c 20 7a 4c 61 62 65 6c 2c 20 7a 4c 69 6e 65 29  , zLabel, zLine)
11640 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c  ;.}../*.** Displ
11650 61 79 20 6d 65 6d 6f 72 79 20 73 74 61 74 73 2e  ay memory stats.
11660 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
11670 69 73 70 6c 61 79 5f 73 74 61 74 73 28 0a 20 20  isplay_stats(.  
11680 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
11690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
116a0 61 74 61 62 61 73 65 20 74 6f 20 71 75 65 72 79  atabase to query
116b0 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65   */.  ShellState
116c0 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20   *pArg,         
116d0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
116e0 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20  ShellState */.  
116f0 69 6e 74 20 62 52 65 73 65 74 20 20 20 20 20 20  int bReset      
11700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11710 72 75 65 20 74 6f 20 72 65 73 65 74 20 74 68 65  rue to reset the
11720 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 69   stats */.){.  i
11730 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 69  nt iCur;.  int i
11740 48 69 77 74 72 3b 0a 20 20 46 49 4c 45 20 2a 6f  Hiwtr;.  FILE *o
11750 75 74 3b 0a 20 20 69 66 28 20 70 41 72 67 3d 3d  ut;.  if( pArg==
11760 30 20 7c 7c 20 70 41 72 67 2d 3e 6f 75 74 3d 3d  0 || pArg->out==
11770 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
11780 6f 75 74 20 3d 20 70 41 72 67 2d 3e 6f 75 74 3b  out = pArg->out;
11790 0a 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 70 53  ..  if( pArg->pS
117a0 74 6d 74 20 26 26 20 28 70 41 72 67 2d 3e 73 74  tmt && (pArg->st
117b0 61 74 73 4f 6e 20 26 20 32 29 20 29 7b 0a 20 20  atsOn & 2) ){.  
117c0 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 2c 20 78    int nCol, i, x
117d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
117e0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 41 72 67  mt *pStmt = pArg
117f0 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 63 68 61  ->pStmt;.    cha
11800 72 20 7a 5b 31 30 30 5d 3b 0a 20 20 20 20 6e 43  r z[100];.    nC
11810 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
11820 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
11830 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
11840 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 64 5c  (out, "%-36s %d\
11850 6e 22 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 6f  n", "Number of o
11860 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 3a 22 2c  utput columns:",
11870 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 66 6f 72 28   nCol);.    for(
11880 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
11890 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
118a0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
118b0 28 7a 29 2c 7a 2c 22 43 6f 6c 75 6d 6e 20 25 64  (z),z,"Column %d
118c0 20 25 6e 6e 61 6d 65 3a 22 2c 20 69 2c 20 26 78   %nname:", i, &x
118d0 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
118e0 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
118f0 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74   %s\n", z, sqlit
11900 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70  e3_column_name(p
11910 53 74 6d 74 2c 69 29 29 3b 0a 23 69 66 6e 64 65  Stmt,i));.#ifnde
11920 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
11930 43 4c 54 59 50 45 0a 20 20 20 20 20 20 73 71 6c  CLTYPE.      sql
11940 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30  ite3_snprintf(30
11950 2c 20 7a 2b 78 2c 20 22 64 65 63 6c 61 72 65 64  , z+x, "declared
11960 20 74 79 70 65 3a 22 29 3b 0a 20 20 20 20 20 20   type:");.      
11970 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
11980 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a   "%-36s %s\n", z
11990 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
119a0 5f 64 65 63 6c 74 79 70 65 28 70 53 74 6d 74 2c  _decltype(pStmt,
119b0 20 69 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66   i));.#endif.#if
119c0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
119d0 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
119e0 41 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  A.      sqlite3_
119f0 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78  snprintf(30, z+x
11a00 2c 20 22 64 61 74 61 62 61 73 65 20 6e 61 6d 65  , "database name
11a10 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  :");.      utf8_
11a20 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
11a30 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c  6s %s\n", z, sql
11a40 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61  ite3_column_data
11a50 62 61 73 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  base_name(pStmt,
11a60 69 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  i));.      sqlit
11a70 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20  e3_snprintf(30, 
11a80 7a 2b 78 2c 20 22 74 61 62 6c 65 20 6e 61 6d 65  z+x, "table name
11a90 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  :");.      utf8_
11aa0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
11ab0 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c  6s %s\n", z, sql
11ac0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
11ad0 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29  e_name(pStmt,i))
11ae0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
11af0 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78  snprintf(30, z+x
11b00 2c 20 22 6f 72 69 67 69 6e 20 6e 61 6d 65 3a 22  , "origin name:"
11b10 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
11b20 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
11b30 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74   %s\n", z, sqlit
11b40 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e  e3_column_origin
11b50 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b  _name(pStmt,i));
11b60 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
11b70 7d 0a 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74  }..  displayStat
11b80 4c 69 6e 65 28 70 41 72 67 2c 20 22 4d 65 6d 6f  Line(pArg, "Memo
11b90 72 79 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20  ry Used:",.     
11ba0 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29  "%lld (max %lld)
11bb0 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f   bytes", SQLITE_
11bc0 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53  STATUS_MEMORY_US
11bd0 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64  ED, bReset);.  d
11be0 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
11bf0 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20  Arg, "Number of 
11c00 4f 75 74 73 74 61 6e 64 69 6e 67 20 41 6c 6c 6f  Outstanding Allo
11c10 63 61 74 69 6f 6e 73 3a 22 2c 0a 20 20 20 20 20  cations:",.     
11c20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29  "%lld (max %lld)
11c30 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53  ", SQLITE_STATUS
11c40 5f 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62  _MALLOC_COUNT, b
11c50 52 65 73 65 74 29 3b 0a 20 20 69 66 28 20 70 41  Reset);.  if( pA
11c60 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20  rg->shellFlgs & 
11c70 53 48 46 4c 47 5f 50 61 67 65 63 61 63 68 65 20  SHFLG_Pagecache 
11c80 29 7b 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74  ){.    displaySt
11c90 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75  atLine(pArg, "Nu
11ca0 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65 20 50  mber of Pcache P
11cb0 61 67 65 73 20 55 73 65 64 3a 22 2c 0a 20 20 20  ages Used:",.   
11cc0 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25      "%lld (max %
11cd0 6c 6c 64 29 20 70 61 67 65 73 22 2c 20 53 51 4c  lld) pages", SQL
11ce0 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43  ITE_STATUS_PAGEC
11cf0 41 43 48 45 5f 55 53 45 44 2c 20 62 52 65 73 65  ACHE_USED, bRese
11d00 74 29 3b 0a 20 20 7d 0a 20 20 64 69 73 70 6c 61  t);.  }.  displa
11d10 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20  yStatLine(pArg, 
11d20 22 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68  "Number of Pcach
11d30 65 20 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73  e Overflow Bytes
11d40 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28  :",.     "%lld (
11d50 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73 22  max %lld) bytes"
11d60 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  , SQLITE_STATUS_
11d70 50 41 47 45 43 41 43 48 45 5f 4f 56 45 52 46 4c  PAGECACHE_OVERFL
11d80 4f 57 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64  OW, bReset);.  d
11d90 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
11da0 41 72 67 2c 20 22 4c 61 72 67 65 73 74 20 41 6c  Arg, "Largest Al
11db0 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20  location:",.    
11dc0 20 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53   "%lld bytes", S
11dd0 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c  QLITE_STATUS_MAL
11de0 4c 4f 43 5f 53 49 5a 45 2c 20 62 52 65 73 65 74  LOC_SIZE, bReset
11df0 29 3b 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74  );.  displayStat
11e00 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c 61 72 67  Line(pArg, "Larg
11e10 65 73 74 20 50 63 61 63 68 65 20 41 6c 6c 6f 63  est Pcache Alloc
11e20 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22 25  ation:",.     "%
11e30 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49  lld bytes", SQLI
11e40 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41  TE_STATUS_PAGECA
11e50 43 48 45 5f 53 49 5a 45 2c 20 62 52 65 73 65 74  CHE_SIZE, bReset
11e60 29 3b 0a 23 69 66 64 65 66 20 59 59 54 52 41 43  );.#ifdef YYTRAC
11e70 4b 4d 41 58 53 54 41 43 4b 44 45 50 54 48 0a 20  KMAXSTACKDEPTH. 
11e80 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
11e90 28 70 41 72 67 2c 20 22 44 65 65 70 65 73 74 20  (pArg, "Deepest 
11ea0 50 61 72 73 65 72 20 53 74 61 63 6b 3a 22 2c 0a  Parser Stack:",.
11eb0 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20       "%lld (max 
11ec0 25 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f 53  %lld)", SQLITE_S
11ed0 54 41 54 55 53 5f 50 41 52 53 45 52 5f 53 54 41  TATUS_PARSER_STA
11ee0 43 4b 2c 20 62 52 65 73 65 74 29 3b 0a 23 65 6e  CK, bReset);.#en
11ef0 64 69 66 0a 0a 20 20 69 66 28 20 64 62 20 29 7b  dif..  if( db ){
11f00 0a 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73  .    if( pArg->s
11f10 68 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47  hellFlgs & SHFLG
11f20 5f 4c 6f 6f 6b 61 73 69 64 65 20 29 7b 0a 20 20  _Lookaside ){.  
11f30 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
11f40 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71  r = -1;.      sq
11f50 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
11f60 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
11f70 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53  TUS_LOOKASIDE_US
11f80 45 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ED,.            
11f90 20 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75              &iCu
11fa0 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
11fb0 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  et);.      raw_p
11fc0 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
11fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
11fe0 4c 6f 6f 6b 61 73 69 64 65 20 53 6c 6f 74 73 20  Lookaside Slots 
11ff0 55 73 65 64 3a 20 20 20 20 20 20 20 20 20 20 20  Used:           
12000 20 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29       %d (max %d)
12010 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
12020 20 20 20 69 43 75 72 2c 20 69 48 69 77 74 72 29     iCur, iHiwtr)
12030 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
12040 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
12050 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f  LITE_DBSTATUS_LO
12060 4f 4b 41 53 49 44 45 5f 48 49 54 2c 0a 20 20 20  OKASIDE_HIT,.   
12070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12080 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69       &iCur, &iHi
12090 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
120a0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
120b0 41 72 67 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65  Arg->out, "Succe
120c0 73 73 66 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20  ssful lookaside 
120d0 61 74 74 65 6d 70 74 73 3a 20 20 20 20 20 20 20  attempts:       
120e0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
120f0 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20       iHiwtr);.  
12100 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
12110 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
12120 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53  _DBSTATUS_LOOKAS
12130 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 0a 20  IDE_MISS_SIZE,. 
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12150 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69         &iCur, &i
12160 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
12170 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
12180 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f  (pArg->out, "Loo
12190 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20  kaside failures 
121a0 64 75 65 20 74 6f 20 73 69 7a 65 3a 20 20 20 20  due to size:    
121b0 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20    %d\n",.       
121c0 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a         iHiwtr);.
121d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
121e0 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
121f0 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
12200 41 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c  ASIDE_MISS_FULL,
12210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12220 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20           &iCur, 
12230 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
12240 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
12250 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c  tf(pArg->out, "L
12260 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65  ookaside failure
12270 73 20 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20  s due to OOM:   
12280 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20      %d\n",.     
12290 20 20 20 20 20 20 20 20 20 69 48 69 77 74 72 29           iHiwtr)
122a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77  ;.    }.    iHiw
122b0 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
122c0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
122d0 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
122e0 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
122f0 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48  USED, &iCur, &iH
12300 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
12310 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12320 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 72 20  rg->out, "Pager 
12330 48 65 61 70 20 55 73 61 67 65 3a 20 20 20 20 20  Heap Usage:     
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12350 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20  d bytes\n",.    
12360 20 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20          iCur);. 
12370 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
12380 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
12390 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
123a0 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
123b0 5f 43 41 43 48 45 5f 48 49 54 2c 20 26 69 43 75  _CACHE_HIT, &iCu
123c0 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
123d0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
123e0 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
123f0 63 61 63 68 65 20 68 69 74 73 3a 20 20 20 20 20  cache hits:     
12400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12410 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
12420 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
12430 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
12440 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
12450 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
12460 43 41 43 48 45 5f 4d 49 53 53 2c 20 26 69 43 75  CACHE_MISS, &iCu
12470 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
12480 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
12490 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
124a0 63 61 63 68 65 20 6d 69 73 73 65 73 3a 20 20 20  cache misses:   
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124c0 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
124d0 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
124e0 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
124f0 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
12500 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
12510 43 41 43 48 45 5f 57 52 49 54 45 2c 20 26 69 43  CACHE_WRITE, &iC
12520 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b  ur, &iHiwtr, 1);
12530 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
12540 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65  pArg->out, "Page
12550 20 63 61 63 68 65 20 77 72 69 74 65 73 3a 20 20   cache writes:  
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12570 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12580 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
12590 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
125a0 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
125b0 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
125c0 5f 43 41 43 48 45 5f 53 50 49 4c 4c 2c 20 26 69  _CACHE_SPILL, &i
125d0 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29  Cur, &iHiwtr, 1)
125e0 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
125f0 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67  (pArg->out, "Pag
12600 65 20 63 61 63 68 65 20 73 70 69 6c 6c 73 3a 20  e cache spills: 
12610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12620 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
12630 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
12640 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
12650 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
12660 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
12670 53 5f 53 43 48 45 4d 41 5f 55 53 45 44 2c 20 26  S_SCHEMA_USED, &
12680 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
12690 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
126a0 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
126b0 2c 20 22 53 63 68 65 6d 61 20 48 65 61 70 20 55  , "Schema Heap U
126c0 73 61 67 65 3a 20 20 20 20 20 20 20 20 20 20 20  sage:           
126d0 20 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73          %d bytes
126e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
126f0 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77   iCur);.    iHiw
12700 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
12710 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
12720 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
12730 5f 44 42 53 54 41 54 55 53 5f 53 54 4d 54 5f 55  _DBSTATUS_STMT_U
12740 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69  SED, &iCur, &iHi
12750 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
12760 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12770 67 2d 3e 6f 75 74 2c 20 22 53 74 61 74 65 6d 65  g->out, "Stateme
12780 6e 74 20 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64  nt Heap/Lookasid
12790 65 20 55 73 61 67 65 3a 20 20 20 20 20 20 25 64  e Usage:      %d
127a0 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20   bytes\n",.     
127b0 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20         iCur);.  
127c0 7d 0a 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 70  }..  if( pArg->p
127d0 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 43 75 72  Stmt ){.    iCur
127e0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
127f0 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74  status(pArg->pSt
12800 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  mt, SQLITE_STMTS
12810 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
12820 54 45 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20  TEP,.           
12830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12840 20 20 20 20 62 52 65 73 65 74 29 3b 0a 20 20 20      bReset);.   
12850 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12860 2d 3e 6f 75 74 2c 20 22 46 75 6c 6c 73 63 61 6e  ->out, "Fullscan
12870 20 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20   Steps:         
12880 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
12890 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
128a0 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
128b0 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
128c0 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
128d0 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c 20 62  MTSTATUS_SORT, b
128e0 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
128f0 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12900 2c 20 22 53 6f 72 74 20 4f 70 65 72 61 74 69 6f  , "Sort Operatio
12910 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ns:             
12920 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
12930 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d  Cur);.    iCur =
12940 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
12950 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74  atus(pArg->pStmt
12960 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
12970 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 62 52  TUS_AUTOINDEX,bR
12980 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12990 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
129a0 20 22 41 75 74 6f 69 6e 64 65 78 20 49 6e 73 65   "Autoindex Inse
129b0 72 74 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  rts:            
129c0 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
129d0 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
129e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
129f0 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
12a00 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
12a10 55 53 5f 56 4d 5f 53 54 45 50 2c 20 62 52 65 73  US_VM_STEP, bRes
12a20 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
12a30 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
12a40 56 69 72 74 75 61 6c 20 4d 61 63 68 69 6e 65 20  Virtual Machine 
12a50 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20 20  Steps:          
12a60 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
12a70 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  );.    iCur = sq
12a80 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
12a90 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
12aa0 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
12ab0 5f 52 45 50 52 45 50 41 52 45 2c 20 62 52 65 73  _REPREPARE, bRes
12ac0 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
12ad0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
12ae0 52 65 70 72 65 70 61 72 65 20 6f 70 65 72 61 74  Reprepare operat
12af0 69 6f 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20  ions:           
12b00 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
12b10 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  );.    iCur = sq
12b20 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
12b30 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
12b40 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
12b50 5f 52 55 4e 2c 20 62 52 65 73 65 74 29 3b 0a 20  _RUN, bReset);. 
12b60 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12b70 72 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72  rg->out, "Number
12b80 20 6f 66 20 74 69 6d 65 73 20 72 75 6e 3a 20 20   of times run:  
12b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12ba0 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
12bb0 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
12bc0 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
12bd0 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
12be0 53 54 4d 54 53 54 41 54 55 53 5f 4d 45 4d 55 53  STMTSTATUS_MEMUS
12bf0 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  ED, bReset);.   
12c00 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12c10 2d 3e 6f 75 74 2c 20 22 4d 65 6d 6f 72 79 20 75  ->out, "Memory u
12c20 73 65 64 20 62 79 20 70 72 65 70 61 72 65 64 20  sed by prepared 
12c30 73 74 6d 74 3a 20 20 20 20 20 20 20 20 25 64 5c  stmt:        %d\
12c40 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a  n", iCur);.  }..
12c50 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f  #ifdef __linux__
12c60 0a 20 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49  .  displayLinuxI
12c70 6f 53 74 61 74 73 28 70 41 72 67 2d 3e 6f 75 74  oStats(pArg->out
12c80 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
12c90 44 6f 20 6e 6f 74 20 72 65 6d 6f 76 65 20 74 68  Do not remove th
12ca0 69 73 20 6d 61 63 68 69 6e 65 20 72 65 61 64 61  is machine reada
12cb0 62 6c 65 20 63 6f 6d 6d 65 6e 74 3a 20 65 78 74  ble comment: ext
12cc0 72 61 2d 73 74 61 74 73 2d 6f 75 74 70 75 74 2d  ra-stats-output-
12cd0 68 65 72 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72  here */..  retur
12ce0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  n 0;.}../*.** Di
12cf0 73 70 6c 61 79 20 73 63 61 6e 20 73 74 61 74 73  splay scan stats
12d00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12d10 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73 74 61   display_scansta
12d20 74 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ts(.  sqlite3 *d
12d30 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
12d40 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
12d50 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20  e to query */.  
12d60 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67  ShellState *pArg
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68  /* Pointer to Sh
12d90 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 29 7b 0a 23  ellState */.){.#
12da0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
12db0 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
12dc0 41 54 55 53 0a 20 20 55 4e 55 53 45 44 5f 50 41  ATUS.  UNUSED_PA
12dd0 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55  RAMETER(db);.  U
12de0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12df0 70 41 72 67 29 3b 0a 23 65 6c 73 65 0a 20 20 69  pArg);.#else.  i
12e00 6e 74 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78 3b 0a  nt i, k, n, mx;.
12e10 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12e20 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d  g->out, "-------
12e30 2d 20 73 63 61 6e 73 74 61 74 73 20 2d 2d 2d 2d  - scanstats ----
12e40 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78 20 3d  ----\n");.  mx =
12e50 20 30 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   0;.  for(k=0; k
12e60 3c 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  <=mx; k++){.    
12e70 64 6f 75 62 6c 65 20 72 45 73 74 4c 6f 6f 70 20  double rEstLoop 
12e80 3d 20 31 2e 30 3b 0a 20 20 20 20 66 6f 72 28 69  = 1.0;.    for(i
12e90 3d 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20  =n=0; 1; i++){. 
12ea0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
12eb0 74 20 2a 70 20 3d 20 70 41 72 67 2d 3e 70 53 74  t *p = pArg->pSt
12ec0 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  mt;.      sqlite
12ed0 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c 20 6e  3_int64 nLoop, n
12ee0 56 69 73 69 74 3b 0a 20 20 20 20 20 20 64 6f 75  Visit;.      dou
12ef0 62 6c 65 20 72 45 73 74 3b 0a 20 20 20 20 20 20  ble rEst;.      
12f00 69 6e 74 20 69 53 69 64 3b 0a 20 20 20 20 20 20  int iSid;.      
12f10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70  const char *zExp
12f20 6c 61 69 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  lain;.      if( 
12f30 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
12f40 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
12f50 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 4c  LITE_SCANSTAT_NL
12f60 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e 4c 6f  OOP, (void*)&nLo
12f70 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  op) ){.        b
12f80 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
12f90 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
12fa0 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69  _scanstatus(p, i
12fb0 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
12fc0 54 5f 53 45 4c 45 43 54 49 44 2c 20 28 76 6f 69  T_SELECTID, (voi
12fd0 64 2a 29 26 69 53 69 64 29 3b 0a 20 20 20 20 20  d*)&iSid);.     
12fe0 20 69 66 28 20 69 53 69 64 3e 6d 78 20 29 20 6d   if( iSid>mx ) m
12ff0 78 20 3d 20 69 53 69 64 3b 0a 20 20 20 20 20 20  x = iSid;.      
13000 69 66 28 20 69 53 69 64 21 3d 6b 20 29 20 63 6f  if( iSid!=k ) co
13010 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
13020 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
13030 20 20 72 45 73 74 4c 6f 6f 70 20 3d 20 28 64 6f    rEstLoop = (do
13040 75 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20 20 20  uble)nLoop;.    
13050 20 20 20 20 69 66 28 20 6b 3e 30 20 29 20 72 61      if( k>0 ) ra
13060 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
13070 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75  ut, "-------- su
13080 62 71 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d  bquery %d ------
13090 2d 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20 20 20 20  -\n", k);.      
130a0 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  }.      n++;.   
130b0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
130c0 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c  scanstatus(p, i,
130d0 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54   SQLITE_SCANSTAT
130e0 5f 4e 56 49 53 49 54 2c 20 28 76 6f 69 64 2a 29  _NVISIT, (void*)
130f0 26 6e 56 69 73 69 74 29 3b 0a 20 20 20 20 20 20  &nVisit);.      
13100 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
13110 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
13120 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 53  LITE_SCANSTAT_ES
13130 54 2c 20 28 76 6f 69 64 2a 29 26 72 45 73 74 29  T, (void*)&rEst)
13140 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13150 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
13160 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
13170 4e 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20 28  NSTAT_EXPLAIN, (
13180 76 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e 29  void*)&zExplain)
13190 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
131a0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
131b0 4c 6f 6f 70 20 25 32 64 3a 20 25 73 5c 6e 22 2c  Loop %2d: %s\n",
131c0 20 6e 2c 20 7a 45 78 70 6c 61 69 6e 29 3b 0a 20   n, zExplain);. 
131d0 20 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 2a 3d       rEstLoop *=
131e0 20 72 45 73 74 3b 0a 20 20 20 20 20 20 72 61 77   rEst;.      raw
131f0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
13200 74 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 20  t,.          "  
13210 20 20 20 20 20 20 20 6e 4c 6f 6f 70 3d 25 2d 38         nLoop=%-8
13220 6c 6c 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c 64 20  lld nRow=%-8lld 
13230 65 73 74 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73  estRow=%-8lld es
13240 74 52 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67 5c 6e  tRow/Loop=%-8g\n
13250 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 6f  ",.          nLo
13260 6f 70 2c 20 6e 56 69 73 69 74 2c 20 28 73 71 6c  op, nVisit, (sql
13270 69 74 65 33 5f 69 6e 74 36 34 29 28 72 45 73 74  ite3_int64)(rEst
13280 4c 6f 6f 70 2b 30 2e 35 29 2c 20 72 45 73 74 0a  Loop+0.5), rEst.
13290 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
132a0 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28   }.  raw_printf(
132b0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d  pArg->out, "----
132c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132d0 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23 65 6e  -------\n");.#en
132e0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  dif.}../*.** Par
132f0 61 6d 65 74 65 72 20 61 7a 41 72 72 61 79 20 70  ameter azArray p
13300 6f 69 6e 74 73 20 74 6f 20 61 20 7a 65 72 6f 2d  oints to a zero-
13310 74 65 72 6d 69 6e 61 74 65 64 20 61 72 72 61 79  terminated array
13320 20 6f 66 20 73 74 72 69 6e 67 73 2e 20 7a 53 74   of strings. zSt
13330 72 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61  r.** points to a
13340 20 73 69 6e 67 6c 65 20 6e 75 6c 2d 74 65 72 6d   single nul-term
13350 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 20 52  inated string. R
13360 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
13370 66 20 7a 53 74 72 0a 2a 2a 20 69 73 20 65 71 75  f zStr.** is equ
13380 61 6c 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  al, according to
13390 20 73 74 72 63 6d 70 28 29 2c 20 74 6f 20 61 6e   strcmp(), to an
133a0 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 73  y of the strings
133b0 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 0a 2a   in the array..*
133c0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
133d0 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  urn zero..*/.sta
133e0 74 69 63 20 69 6e 74 20 73 74 72 5f 69 6e 5f 61  tic int str_in_a
133f0 72 72 61 79 28 63 6f 6e 73 74 20 63 68 61 72 20  rray(const char 
13400 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61  *zStr, const cha
13410 72 20 2a 2a 61 7a 41 72 72 61 79 29 7b 0a 20 20  r **azArray){.  
13420 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
13430 3b 20 61 7a 41 72 72 61 79 5b 69 5d 3b 20 69 2b  ; azArray[i]; i+
13440 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73  +){.    if( 0==s
13450 74 72 63 6d 70 28 7a 53 74 72 2c 20 61 7a 41 72  trcmp(zStr, azAr
13460 72 61 79 5b 69 5d 29 20 29 20 72 65 74 75 72 6e  ray[i]) ) return
13470 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
13480 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   0;.}../*.** If 
13490 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
134a0 6e 74 20 70 53 71 6c 20 61 70 70 65 61 72 73 20  nt pSql appears 
134b0 74 6f 20 62 65 20 61 6e 20 45 58 50 4c 41 49 4e  to be an EXPLAIN
134c0 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f   statement, allo
134d0 63 61 74 65 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  cate.** and popu
134e0 6c 61 74 65 20 74 68 65 20 53 68 65 6c 6c 53 74  late the ShellSt
134f0 61 74 65 2e 61 69 49 6e 64 65 6e 74 5b 5d 20 61  ate.aiIndent[] a
13500 72 72 61 79 20 77 69 74 68 20 74 68 65 20 6e 75  rray with the nu
13510 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 70 61 63 65  mber of.** space
13520 73 20 65 61 63 68 20 6f 70 63 6f 64 65 20 73 68  s each opcode sh
13530 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64  ould be indented
13540 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 6f 75   before it is ou
13550 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tput..**.** The 
13560 69 6e 64 65 6e 74 69 6e 67 20 72 75 6c 65 73 20  indenting rules 
13570 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  are:.**.**     *
13580 20 46 6f 72 20 65 61 63 68 20 22 4e 65 78 74 22   For each "Next"
13590 2c 20 22 50 72 65 76 22 2c 20 22 56 4e 65 78 74  , "Prev", "VNext
135a0 22 20 6f 72 20 22 56 50 72 65 76 22 20 69 6e 73  " or "VPrev" ins
135b0 74 72 75 63 74 69 6f 6e 2c 20 69 6e 64 65 6e 74  truction, indent
135c0 0a 2a 2a 20 20 20 20 20 20 20 61 6c 6c 20 6f 70  .**       all op
135d0 63 6f 64 65 73 20 74 68 61 74 20 6f 63 63 75 72  codes that occur
135e0 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 32 20   between the p2 
135f0 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  jump destination
13600 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 0a   and the opcode.
13610 2a 2a 20 20 20 20 20 20 20 69 74 73 65 6c 66 20  **       itself 
13620 62 79 20 32 20 73 70 61 63 65 73 2e 0a 2a 2a 0a  by 2 spaces..**.
13630 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63  **     * For eac
13640 68 20 22 47 6f 74 6f 22 2c 20 69 66 20 74 68 65  h "Goto", if the
13650 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
13660 6e 20 69 73 20 65 61 72 6c 69 65 72 20 69 6e 20  n is earlier in 
13670 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 20  the program.**  
13680 20 20 20 20 20 61 6e 64 20 65 6e 64 73 20 6f 6e       and ends on
13690 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20 20 20   one of:.**     
136a0 20 20 20 20 20 59 69 65 6c 64 20 20 53 65 65 6b       Yield  Seek
136b0 47 74 20 20 53 65 65 6b 4c 74 20 20 52 6f 77 53  Gt  SeekLt  RowS
136c0 65 74 52 65 61 64 20 20 52 65 77 69 6e 64 0a 2a  etRead  Rewind.*
136d0 2a 20 20 20 20 20 20 20 6f 72 20 69 66 20 74 68  *       or if th
136e0 65 20 50 31 20 70 61 72 61 6d 65 74 65 72 20 69  e P1 parameter i
136f0 73 20 6f 6e 65 20 69 6e 73 74 65 61 64 20 6f 66  s one instead of
13700 20 7a 65 72 6f 2c 0a 2a 2a 20 20 20 20 20 20 20   zero,.**       
13710 74 68 65 6e 20 69 6e 64 65 6e 74 20 61 6c 6c 20  then indent all 
13720 6f 70 63 6f 64 65 73 20 62 65 74 77 65 65 6e 20  opcodes between 
13730 74 68 65 20 65 61 72 6c 69 65 72 20 69 6e 73 74  the earlier inst
13740 72 75 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ruction.**      
13750 20 61 6e 64 20 22 47 6f 74 6f 22 20 62 79 20 32   and "Goto" by 2
13760 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74   spaces..*/.stat
13770 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f  ic void explain_
13780 64 61 74 61 5f 70 72 65 70 61 72 65 28 53 68 65  data_prepare(She
13790 6c 6c 53 74 61 74 65 20 2a 70 2c 20 73 71 6c 69  llState *p, sqli
137a0 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 29 7b  te3_stmt *pSql){
137b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
137c0 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
137d0 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 6f     /* The text o
137e0 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
137f0 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ent */.  const c
13800 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
13810 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
13820 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 69   to check if thi
13830 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20  s is an EXPLAIN 
13840 2a 2f 0a 20 20 69 6e 74 20 2a 61 62 59 69 65 6c  */.  int *abYiel
13850 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
13860 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
13870 6f 70 20 69 73 20 61 6e 20 4f 50 5f 59 69 65 6c  op is an OP_Yiel
13880 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f  d */.  int nAllo
13890 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
138a0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
138b0 74 65 64 20 73 69 7a 65 20 6f 66 20 70 2d 3e 61  ted size of p->a
138c0 69 49 6e 64 65 6e 74 5b 5d 2c 20 61 62 59 69 65  iIndent[], abYie
138d0 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 70 3b  ld */.  int iOp;
138e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
13900 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e   of operation in
13910 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 20 2a   p->aiIndent[] *
13920 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  /..  const char 
13930 2a 61 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20 22 4e  *azNext[] = { "N
13940 65 78 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56  ext", "Prev", "V
13950 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22 2c 20  Prev", "VNext", 
13960 22 53 6f 72 74 65 72 4e 65 78 74 22 2c 20 30 20  "SorterNext", 0 
13970 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  };.  const char 
13980 2a 61 7a 59 69 65 6c 64 5b 5d 20 3d 20 7b 20 22  *azYield[] = { "
13990 59 69 65 6c 64 22 2c 20 22 53 65 65 6b 4c 54 22  Yield", "SeekLT"
139a0 2c 20 22 53 65 65 6b 47 54 22 2c 20 22 52 6f 77  , "SeekGT", "Row
139b0 53 65 74 52 65 61 64 22 2c 0a 20 20 20 20 20 20  SetRead",.      
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139d0 20 20 20 20 20 20 22 52 65 77 69 6e 64 22 2c 20        "Rewind", 
139e0 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  0 };.  const cha
139f0 72 20 2a 61 7a 47 6f 74 6f 5b 5d 20 3d 20 7b 20  r *azGoto[] = { 
13a00 22 47 6f 74 6f 22 2c 20 30 20 7d 3b 0a 0a 20 20  "Goto", 0 };..  
13a10 2f 2a 20 54 72 79 20 74 6f 20 66 69 67 75 72 65  /* Try to figure
13a20 20 6f 75 74 20 69 66 20 74 68 69 73 20 69 73 20   out if this is 
13a30 72 65 61 6c 6c 79 20 61 6e 20 45 58 50 4c 41 49  really an EXPLAI
13a40 4e 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20  N statement. If 
13a50 74 68 69 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74  this.  ** cannot
13a60 20 62 65 20 76 65 72 69 66 69 65 64 2c 20 72 65   be verified, re
13a70 74 75 72 6e 20 65 61 72 6c 79 2e 20 20 2a 2f 0a  turn early.  */.
13a80 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f    if( sqlite3_co
13a90 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 71 6c 29  lumn_count(pSql)
13aa0 21 3d 38 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d  !=8 ){.    p->cM
13ab0 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ode = p->mode;. 
13ac0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
13ad0 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
13ae0 73 71 6c 28 70 53 71 6c 29 3b 0a 20 20 69 66 28  sql(pSql);.  if(
13af0 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72   zSql==0 ) retur
13b00 6e 3b 0a 20 20 66 6f 72 28 7a 3d 7a 53 71 6c 3b  n;.  for(z=zSql;
13b10 20 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a 3d 3d   *z==' ' || *z==
13b20 27 5c 74 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27  '\t' || *z=='\n'
13b30 20 7c 7c 20 2a 7a 3d 3d 27 5c 66 27 20 7c 7c 20   || *z=='\f' || 
13b40 2a 7a 3d 3d 27 5c 72 27 3b 20 7a 2b 2b 29 3b 0a  *z=='\r'; z++);.
13b50 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
13b60 72 6e 69 63 6d 70 28 7a 2c 20 22 65 78 70 6c 61  rnicmp(z, "expla
13b70 69 6e 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 70  in", 7) ){.    p
13b80 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64  ->cMode = p->mod
13b90 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  e;.    return;. 
13ba0 20 7d 0a 0a 20 20 66 6f 72 28 69 4f 70 3d 30 3b   }..  for(iOp=0;
13bb0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
13bc0 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3b  ite3_step(pSql);
13bd0 20 69 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74   iOp++){.    int
13be0 20 69 3b 0a 20 20 20 20 69 6e 74 20 69 41 64 64   i;.    int iAdd
13bf0 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r = sqlite3_colu
13c00 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 30 29 3b  mn_int(pSql, 0);
13c10 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
13c20 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20 63 68  *zOp = (const ch
13c30 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
13c40 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29  mn_text(pSql, 1)
13c50 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 32  ;..    /* Set p2
13c60 20 74 6f 20 74 68 65 20 50 32 20 66 69 65 6c 64   to the P2 field
13c70 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
13c80 6f 70 63 6f 64 65 2e 20 54 68 65 6e 2c 20 61 73  opcode. Then, as
13c90 73 75 6d 69 6e 67 20 74 68 61 74 0a 20 20 20 20  suming that.    
13ca0 2a 2a 20 70 32 20 69 73 20 61 6e 20 69 6e 73 74  ** p2 is an inst
13cb0 72 75 63 74 69 6f 6e 20 61 64 64 72 65 73 73 2c  ruction address,
13cc0 20 73 65 74 20 76 61 72 69 61 62 6c 65 20 70 32   set variable p2
13cd0 6f 70 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  op to the index 
13ce0 6f 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  of that.    ** i
13cf0 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
13d00 65 20 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72  e aiIndent[] arr
13d10 61 79 2e 20 70 32 20 61 6e 64 20 70 32 6f 70 20  ay. p2 and p2op 
13d20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74  may be different
13d30 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   if.    ** the c
13d40 75 72 72 65 6e 74 20 69 6e 73 74 72 75 63 74 69  urrent instructi
13d50 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  on is part of a 
13d60 73 75 62 2d 70 72 6f 67 72 61 6d 20 67 65 6e 65  sub-program gene
13d70 72 61 74 65 64 20 62 79 20 61 6e 0a 20 20 20 20  rated by an.    
13d80 2a 2a 20 53 51 4c 20 74 72 69 67 67 65 72 20 6f  ** SQL trigger o
13d90 72 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20  r foreign key.  
13da0 2a 2f 0a 20 20 20 20 69 6e 74 20 70 32 20 3d 20  */.    int p2 = 
13db0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
13dc0 6e 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20  nt(pSql, 3);.   
13dd0 20 69 6e 74 20 70 32 6f 70 20 3d 20 28 70 32 20   int p2op = (p2 
13de0 2b 20 28 69 4f 70 2d 69 41 64 64 72 29 29 3b 0a  + (iOp-iAddr));.
13df0 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
13e00 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 61 72 72   p->aiIndent arr
13e10 61 79 20 61 73 20 72 65 71 75 69 72 65 64 20 2a  ay as required *
13e20 2f 0a 20 20 20 20 69 66 28 20 69 4f 70 3e 3d 6e  /.    if( iOp>=n
13e30 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69  Alloc ){.      i
13e40 66 28 20 69 4f 70 3d 3d 30 20 29 7b 0a 20 20 20  f( iOp==0 ){.   
13e50 20 20 20 20 20 2f 2a 20 44 6f 20 66 75 72 74 68       /* Do furth
13e60 65 72 20 76 65 72 66 69 63 61 74 69 6f 6e 20 74  er verfication t
13e70 68 61 74 20 74 68 69 73 20 69 73 20 65 78 70 6c  hat this is expl
13e80 61 69 6e 20 6f 75 74 70 75 74 2e 20 20 41 62 6f  ain output.  Abo
13e90 72 74 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a  rt if.        **
13ea0 20 69 74 20 69 73 20 6e 6f 74 20 2a 2f 0a 20 20   it is not */.  
13eb0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
13ec0 73 74 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e  st char *explain
13ed0 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Cols[] = {.     
13ee0 20 20 20 20 20 20 22 61 64 64 72 22 2c 20 22 6f        "addr", "o
13ef0 70 63 6f 64 65 22 2c 20 22 70 31 22 2c 20 22 70  pcode", "p1", "p
13f00 32 22 2c 20 22 70 33 22 2c 20 22 70 34 22 2c 20  2", "p3", "p4", 
13f10 22 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74 22 20  "p5", "comment" 
13f20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  };.        int j
13f30 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  j;.        for(j
13f40 6a 3d 30 3b 20 6a 6a 3c 41 72 72 61 79 53 69 7a  j=0; jj<ArraySiz
13f50 65 28 65 78 70 6c 61 69 6e 43 6f 6c 73 29 3b 20  e(explainCols); 
13f60 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  jj++){.         
13f70 20 69 66 28 20 73 74 72 63 6d 70 28 73 71 6c 69   if( strcmp(sqli
13f80 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28  te3_column_name(
13f90 70 53 71 6c 2c 6a 6a 29 2c 65 78 70 6c 61 69 6e  pSql,jj),explain
13fa0 43 6f 6c 73 5b 6a 6a 5d 29 21 3d 30 20 29 7b 0a  Cols[jj])!=0 ){.
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 63              p->c
13fc0 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a  Mode = p->mode;.
13fd0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
13fe0 74 65 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b  te3_reset(pSql);
13ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
14000 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  urn;.          }
14010 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14020 20 7d 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20   }.      nAlloc 
14030 2b 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 70 2d  += 100;.      p-
14040 3e 61 69 49 6e 64 65 6e 74 20 3d 20 28 69 6e 74  >aiIndent = (int
14050 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
14060 63 36 34 28 70 2d 3e 61 69 49 6e 64 65 6e 74 2c  c64(p->aiIndent,
14070 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69   nAlloc*sizeof(i
14080 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nt));.      if( 
14090 70 2d 3e 61 69 49 6e 64 65 6e 74 3d 3d 30 20 29  p->aiIndent==0 )
140a0 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65   shell_out_of_me
140b0 6d 6f 72 79 28 29 3b 0a 20 20 20 20 20 20 61 62  mory();.      ab
140c0 59 69 65 6c 64 20 3d 20 28 69 6e 74 2a 29 73 71  Yield = (int*)sq
140d0 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
140e0 61 62 59 69 65 6c 64 2c 20 6e 41 6c 6c 6f 63 2a  abYield, nAlloc*
140f0 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20  sizeof(int));.  
14100 20 20 20 20 69 66 28 20 61 62 59 69 65 6c 64 3d      if( abYield=
14110 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f  =0 ) shell_out_o
14120 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20  f_memory();.    
14130 7d 0a 20 20 20 20 61 62 59 69 65 6c 64 5b 69 4f  }.    abYield[iO
14140 70 5d 20 3d 20 73 74 72 5f 69 6e 5f 61 72 72 61  p] = str_in_arra
14150 79 28 7a 4f 70 2c 20 61 7a 59 69 65 6c 64 29 3b  y(zOp, azYield);
14160 0a 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74  .    p->aiIndent
14170 5b 69 4f 70 5d 20 3d 20 30 3b 0a 20 20 20 20 70  [iOp] = 0;.    p
14180 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 69 4f 70 2b  ->nIndent = iOp+
14190 31 3b 0a 0a 20 20 20 20 69 66 28 20 73 74 72 5f  1;..    if( str_
141a0 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a  in_array(zOp, az
141b0 4e 65 78 74 29 20 29 7b 0a 20 20 20 20 20 20 66  Next) ){.      f
141c0 6f 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70  or(i=p2op; i<iOp
141d0 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65  ; i++) p->aiInde
141e0 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20  nt[i] += 2;.    
141f0 7d 0a 20 20 20 20 69 66 28 20 73 74 72 5f 69 6e  }.    if( str_in
14200 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 47 6f  _array(zOp, azGo
14210 74 6f 29 20 26 26 20 70 32 6f 70 3c 70 2d 3e 6e  to) && p2op<p->n
14220 49 6e 64 65 6e 74 0a 20 20 20 20 20 26 26 20 28  Indent.     && (
14230 61 62 59 69 65 6c 64 5b 70 32 6f 70 5d 20 7c 7c  abYield[p2op] ||
14240 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
14250 69 6e 74 28 70 53 71 6c 2c 20 32 29 29 0a 20 20  int(pSql, 2)).  
14260 20 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69    ){.      for(i
14270 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b  =p2op; i<iOp; i+
14280 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69  +) p->aiIndent[i
14290 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  ] += 2;.    }.  
142a0 7d 0a 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20  }..  p->iIndent 
142b0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
142c0 72 65 65 28 61 62 59 69 65 6c 64 29 3b 0a 20 20  ree(abYield);.  
142d0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
142e0 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  ql);.}../*.** Fr
142f0 65 65 20 74 68 65 20 61 72 72 61 79 20 61 6c 6c  ee the array all
14300 6f 63 61 74 65 64 20 62 79 20 65 78 70 6c 61 69  ocated by explai
14310 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 29  n_data_prepare()
14320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14330 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65   explain_data_de
14340 6c 65 74 65 28 53 68 65 6c 6c 53 74 61 74 65 20  lete(ShellState 
14350 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  *p){.  sqlite3_f
14360 72 65 65 28 70 2d 3e 61 69 49 6e 64 65 6e 74 29  ree(p->aiIndent)
14370 3b 0a 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20  ;.  p->aiIndent 
14380 3d 20 30 3b 0a 20 20 70 2d 3e 6e 49 6e 64 65 6e  = 0;.  p->nInden
14390 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 49 6e 64  t = 0;.  p->iInd
143a0 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
143b0 2a 20 44 69 73 61 62 6c 65 20 61 6e 64 20 72 65  * Disable and re
143c0 73 74 6f 72 65 20 2e 77 68 65 72 65 74 72 61 63  store .wheretrac
143d0 65 20 61 6e 64 20 2e 73 65 6c 65 63 74 74 72 61  e and .selecttra
143e0 63 65 20 73 65 74 74 69 6e 67 73 2e 0a 2a 2f 0a  ce settings..*/.
143f0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
14400 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66  TE_DEBUG) && def
14410 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
14420 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a  LE_SELECTTRACE).
14430 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
14440 65 33 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 73  e3SelectTrace;.s
14450 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 53  tatic int savedS
14460 65 6c 65 63 74 54 72 61 63 65 3b 0a 23 65 6e 64  electTrace;.#end
14470 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
14480 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
14490 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
144a0 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45  NABLE_WHERETRACE
144b0 29 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ).extern int sql
144c0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a  ite3WhereTrace;.
144d0 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
144e0 57 68 65 72 65 54 72 61 63 65 3b 0a 23 65 6e 64  WhereTrace;.#end
144f0 69 66 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  if.static void d
14500 69 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61  isable_debug_tra
14510 63 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a  ce_modes(void){.
14520 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
14530 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66  TE_DEBUG) && def
14540 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
14550 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a  LE_SELECTTRACE).
14560 20 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61    savedSelectTra
14570 63 65 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ce = sqlite3Sele
14580 63 74 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74  ctTrace;.  sqlit
14590 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20  e3SelectTrace = 
145a0 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
145b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
145c0 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
145d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45  QLITE_ENABLE_WHE
145e0 52 45 54 52 41 43 45 29 0a 20 20 73 61 76 65 64  RETRACE).  saved
145f0 57 68 65 72 65 54 72 61 63 65 20 3d 20 73 71 6c  WhereTrace = sql
14600 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a  ite3WhereTrace;.
14610 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72    sqlite3WhereTr
14620 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ace = 0;.#endif.
14630 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  }.static void re
14640 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63  store_debug_trac
14650 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23  e_modes(void){.#
14660 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
14670 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
14680 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
14690 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20  E_SELECTTRACE). 
146a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
146b0 61 63 65 20 3d 20 73 61 76 65 64 53 65 6c 65 63  ace = savedSelec
146c0 74 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23  tTrace;.#endif.#
146d0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
146e0 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
146f0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
14700 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a 20 20  E_WHERETRACE).  
14710 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
14720 65 20 3d 20 73 61 76 65 64 57 68 65 72 65 54 72  e = savedWhereTr
14730 61 63 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  ace;.#endif.}../
14740 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 54 45  * Name of the TE
14750 4d 50 20 74 61 62 6c 65 20 74 68 61 74 20 68 6f  MP table that ho
14760 6c 64 73 20 62 69 6e 64 20 70 61 72 61 6d 65 74  lds bind paramet
14770 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65  er values */.#de
14780 66 69 6e 65 20 42 49 4e 44 5f 50 41 52 41 4d 5f  fine BIND_PARAM_
14790 54 41 42 4c 45 20 22 24 50 61 72 61 6d 65 74 65  TABLE "$Paramete
147a0 72 73 22 0a 0a 2f 2a 20 43 72 65 61 74 65 20 74  rs"../* Create t
147b0 68 65 20 54 45 4d 50 20 74 61 62 6c 65 20 75 73  he TEMP table us
147c0 65 64 20 74 6f 20 73 74 6f 72 65 20 70 61 72 61  ed to store para
147d0 6d 65 74 65 72 20 62 69 6e 64 69 6e 67 73 20 2a  meter bindings *
147e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 69  /.static void bi
147f0 6e 64 5f 74 61 62 6c 65 5f 69 6e 69 74 28 53 68  nd_table_init(Sh
14800 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
14810 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
14820 64 62 2c 0a 20 20 20 20 22 43 52 45 41 54 45 20  db,.    "CREATE 
14830 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
14840 53 54 53 20 74 65 6d 70 2e 5b 22 20 42 49 4e 44  STS temp.[" BIND
14850 5f 50 41 52 41 4d 5f 54 41 42 4c 45 20 22 5d 28  _PARAM_TABLE "](
14860 5c 6e 22 0a 20 20 20 20 22 20 20 6b 65 79 20 54  \n".    "  key T
14870 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  EXT PRIMARY KEY,
14880 5c 6e 22 0a 20 20 20 20 22 20 20 76 61 6c 75 65  \n".    "  value
14890 20 41 4e 59 5c 6e 22 0a 20 20 20 20 22 29 20 57   ANY\n".    ") W
148a0 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 22 2c 0a  ITHOUT ROWID;",.
148b0 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a      0, 0, 0);.}.
148c0 0a 2f 2a 0a 2a 2a 20 42 69 6e 64 20 70 61 72 61  ./*.** Bind para
148d0 6d 65 74 65 72 73 20 6f 6e 20 61 20 70 72 65 70  meters on a prep
148e0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
148f0 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
14900 62 69 6e 64 69 6e 67 73 20 61 72 65 20 74 61 6b  bindings are tak
14910 65 6e 20 66 72 6f 6d 20 61 20 54 45 4d 50 20 74  en from a TEMP t
14920 61 62 6c 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  able of the form
14930 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  :.**.**    CREAT
14940 45 20 54 45 4d 50 20 54 41 42 4c 45 20 22 24 50  E TEMP TABLE "$P
14950 61 72 61 6d 65 74 65 72 73 22 28 6b 65 79 20 54  arameters"(key T
14960 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  EXT PRIMARY KEY,
14970 20 76 61 6c 75 65 29 0a 2a 2a 20 20 20 20 57 49   value).**    WI
14980 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a  THOUT ROWID;.**.
14990 2a 2a 20 4e 6f 20 62 69 6e 64 69 6e 67 73 20 6f  ** No bindings o
149a0 63 63 75 72 20 69 66 20 74 68 69 73 20 74 61 62  ccur if this tab
149b0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
149c0 74 2e 20 20 54 68 65 20 73 70 65 63 69 61 6c 20  t.  The special 
149d0 63 68 61 72 61 63 74 65 72 20 27 24 27 0a 2a 2a  character '$'.**
149e0 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   is included in 
149f0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  the table name t
14a00 6f 20 68 65 6c 70 20 70 72 65 76 65 6e 74 20 63  o help prevent c
14a10 6f 6c 6c 69 73 69 6f 6e 73 20 77 69 74 68 20 61  ollisions with a
14a20 63 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2a  ctual tables..**
14a30 20 54 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20   The table must 
14a40 62 65 20 69 6e 20 74 68 65 20 54 45 4d 50 20 73  be in the TEMP s
14a50 63 68 65 6d 61 2e 0a 2a 2f 0a 73 74 61 74 69 63  chema..*/.static
14a60 20 76 6f 69 64 20 62 69 6e 64 5f 70 72 65 70 61   void bind_prepa
14a70 72 65 64 5f 73 74 6d 74 28 53 68 65 6c 6c 53 74  red_stmt(ShellSt
14a80 61 74 65 20 2a 70 41 72 67 2c 20 73 71 6c 69 74  ate *pArg, sqlit
14a90 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b  e3_stmt *pStmt){
14aa0 0a 20 20 69 6e 74 20 6e 56 61 72 3b 0a 20 20 69  .  int nVar;.  i
14ab0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
14ac0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
14ad0 70 51 20 3d 20 30 3b 0a 0a 20 20 6e 56 61 72 20  pQ = 0;..  nVar 
14ae0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  = sqlite3_bind_p
14af0 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70  arameter_count(p
14b00 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 6e 56 61  Stmt);.  if( nVa
14b10 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20  r==0 ) return;  
14b20 2f 2a 20 4e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  /* Nothing to do
14b30 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
14b40 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
14b50 65 74 61 64 61 74 61 28 70 41 72 67 2d 3e 64 62  etadata(pArg->db
14b60 2c 20 22 54 45 4d 50 22 2c 20 42 49 4e 44 5f 50  , "TEMP", BIND_P
14b70 41 52 41 4d 5f 54 41 42 4c 45 2c 0a 20 20 20 20  ARAM_TABLE,.    
14b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ba0 22 6b 65 79 22 2c 20 30 2c 20 30 2c 20 30 2c 20  "key", 0, 0, 0, 
14bb0 30 2c 20 30 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  0, 0)!=SQLITE_OK
14bc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20   ){.    return; 
14bd0 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 74 61 62  /* Parameter tab
14be0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
14bf0 74 20 2a 2f 0a 20 20 7d 0a 20 20 72 63 20 3d 20  t */.  }.  rc = 
14c00 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
14c10 76 32 28 70 41 72 67 2d 3e 64 62 2c 0a 20 20 20  v2(pArg->db,.   
14c20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 76         "SELECT v
14c30 61 6c 75 65 20 46 52 4f 4d 20 74 65 6d 70 2e 5c  alue FROM temp.\
14c40 22 22 20 42 49 4e 44 5f 50 41 52 41 4d 5f 54 41  "" BIND_PARAM_TA
14c50 42 4c 45 20 22 5c 22 22 0a 20 20 20 20 20 20 20  BLE "\"".       
14c60 20 20 20 22 20 57 48 45 52 45 20 6b 65 79 3d 3f     " WHERE key=?
14c70 31 22 2c 20 2d 31 2c 20 26 70 51 2c 20 30 29 3b  1", -1, &pQ, 0);
14c80 0a 20 20 69 66 28 20 72 63 20 7c 7c 20 70 51 3d  .  if( rc || pQ=
14c90 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
14ca0 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b  or(i=1; i<=nVar;
14cb0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
14cc0 7a 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20 63 6f  zNum[30];.    co
14cd0 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72 20 3d  nst char *zVar =
14ce0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
14cf0 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74  rameter_name(pSt
14d00 6d 74 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  mt, i);.    if( 
14d10 7a 56 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zVar==0 ){.     
14d20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
14d30 66 28 73 69 7a 65 6f 66 28 7a 4e 75 6d 29 2c 7a  f(sizeof(zNum),z
14d40 4e 75 6d 2c 22 3f 25 64 22 2c 69 29 3b 0a 20 20  Num,"?%d",i);.  
14d50 20 20 20 20 7a 56 61 72 20 3d 20 7a 4e 75 6d 3b      zVar = zNum;
14d60 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
14d70 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 51 2c  e3_bind_text(pQ,
14d80 20 31 2c 20 7a 56 61 72 2c 20 2d 31 2c 20 53 51   1, zVar, -1, SQ
14d90 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
14da0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
14db0 65 70 28 70 51 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(pQ)==SQLITE_R
14dc0 4f 57 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OW ){.      sqli
14dd0 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70  te3_bind_value(p
14de0 53 74 6d 74 2c 20 69 2c 20 73 71 6c 69 74 65 33  Stmt, i, sqlite3
14df0 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 51  _column_value(pQ
14e00 2c 20 30 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , 0));.    }else
14e10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
14e20 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
14e30 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   i);.    }.    s
14e40 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 51 29  qlite3_reset(pQ)
14e50 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
14e60 66 69 6e 61 6c 69 7a 65 28 70 51 29 3b 0a 7d 0a  finalize(pQ);.}.
14e70 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 70 72 65  ./*.** Run a pre
14e80 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a  pared statement.
14e90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
14ea0 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d  xec_prepared_stm
14eb0 74 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  t(.  ShellState 
14ec0 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
14ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ee0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
14ef0 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a   to ShellState *
14f00 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
14f10 20 2a 70 53 74 6d 74 20 20 20 20 20 20 20 20 20   *pStmt         
14f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f30 20 20 20 20 20 2f 2a 20 53 74 61 74 6d 65 6e 74       /* Statment
14f40 20 74 6f 20 72 75 6e 20 2a 2f 0a 29 7b 0a 20 20   to run */.){.  
14f50 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 70 65  int rc;..  /* pe
14f60 72 66 6f 72 6d 20 74 68 65 20 66 69 72 73 74 20  rform the first 
14f70 73 74 65 70 2e 20 20 74 68 69 73 20 77 69 6c 6c  step.  this will
14f80 20 74 65 6c 6c 20 75 73 20 69 66 20 77 65 0a 20   tell us if we. 
14f90 20 2a 2a 20 68 61 76 65 20 61 20 72 65 73 75 6c   ** have a resul
14fa0 74 20 73 65 74 20 6f 72 20 6e 6f 74 20 61 6e 64  t set or not and
14fb0 20 68 6f 77 20 77 69 64 65 20 69 74 20 69 73 2e   how wide it is.
14fc0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
14fd0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
14fe0 3b 0a 20 20 2f 2a 20 69 66 20 77 65 20 68 61 76  ;.  /* if we hav
14ff0 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 2e 2e  e a result set..
15000 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
15010 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a 20  E_ROW == rc ){. 
15020 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73     /* allocate s
15030 70 61 63 65 20 66 6f 72 20 63 6f 6c 20 6e 61 6d  pace for col nam
15040 65 20 70 74 72 2c 20 76 61 6c 75 65 20 70 74 72  e ptr, value ptr
15050 2c 20 61 6e 64 20 74 79 70 65 20 2a 2f 0a 20 20  , and type */.  
15060 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73 71 6c    int nCol = sql
15070 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
15080 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 76 6f  t(pStmt);.    vo
15090 69 64 20 2a 70 44 61 74 61 20 3d 20 73 71 6c 69  id *pData = sqli
150a0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 33 2a 6e  te3_malloc64(3*n
150b0 43 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e 73 74  Col*sizeof(const
150c0 20 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a 20 20   char*) + 1);.  
150d0 20 20 69 66 28 20 21 70 44 61 74 61 20 29 7b 0a    if( !pData ){.
150e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
150f0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
15100 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
15110 2a 61 7a 43 6f 6c 73 20 3d 20 28 63 68 61 72 20  *azCols = (char 
15120 2a 2a 29 70 44 61 74 61 3b 20 20 20 20 20 20 2f  **)pData;      /
15130 2a 20 4e 61 6d 65 73 20 6f 66 20 72 65 73 75 6c  * Names of resul
15140 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  t columns */.   
15150 20 20 20 63 68 61 72 20 2a 2a 61 7a 56 61 6c 73     char **azVals
15160 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e 43 6f 6c 5d   = &azCols[nCol]
15170 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
15180 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
15190 2a 61 69 54 79 70 65 73 20 3d 20 28 69 6e 74 20  *aiTypes = (int 
151a0 2a 29 26 61 7a 56 61 6c 73 5b 6e 43 6f 6c 5d 3b  *)&azVals[nCol];
151b0 20 2f 2a 20 52 65 73 75 6c 74 20 74 79 70 65 73   /* Result types
151c0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   */.      int i,
151d0 20 78 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   x;.      assert
151e0 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 3c 3d 20  (sizeof(int) <= 
151f0 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 29 3b  sizeof(char *));
15200 0a 20 20 20 20 20 20 2f 2a 20 73 61 76 65 20 6f  .      /* save o
15210 66 66 20 70 74 72 73 20 74 6f 20 63 6f 6c 75 6d  ff ptrs to colum
15220 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20  n names */.     
15230 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
15240 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
15250 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28 63 68 61  azCols[i] = (cha
15260 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
15270 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  mn_name(pStmt, i
15280 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15290 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20   do{.        /* 
152a0 65 78 74 72 61 63 74 20 74 68 65 20 64 61 74 61  extract the data
152b0 20 61 6e 64 20 64 61 74 61 20 74 79 70 65 73 20   and data types 
152c0 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
152d0 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
152e0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 69 54 79  {.          aiTy
152f0 70 65 73 5b 69 5d 20 3d 20 78 20 3d 20 73 71 6c  pes[i] = x = sql
15300 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
15310 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
15320 20 20 20 20 20 20 69 66 28 20 78 3d 3d 53 51 4c        if( x==SQL
15330 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 41 72 67  ITE_BLOB && pArg
15340 20 26 26 20 70 41 72 67 2d 3e 63 4d 6f 64 65 3d   && pArg->cMode=
15350 3d 4d 4f 44 45 5f 49 6e 73 65 72 74 20 29 7b 0a  =MODE_Insert ){.
15360 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 56 61              azVa
15370 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a 20 20 20 20  ls[i] = "";.    
15380 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15390 20 20 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b           azVals[
153a0 69 5d 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  i] = (char*)sqli
153b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
153c0 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
153d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
153e0 20 69 66 28 20 21 61 7a 56 61 6c 73 5b 69 5d 20   if( !azVals[i] 
153f0 26 26 20 28 61 69 54 79 70 65 73 5b 69 5d 21 3d  && (aiTypes[i]!=
15400 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a  SQLITE_NULL) ){.
15410 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
15420 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
15430 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
15440 3b 20 2f 2a 20 66 72 6f 6d 20 66 6f 72 20 2a 2f  ; /* from for */
15450 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15460 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 66 6f       } /* end fo
15470 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a  r */..        /*
15480 20 69 66 20 64 61 74 61 20 61 6e 64 20 74 79 70   if data and typ
15490 65 73 20 65 78 74 72 61 63 74 65 64 20 73 75 63  es extracted suc
154a0 63 65 73 73 66 75 6c 6c 79 2e 2e 2e 20 2a 2f 0a  cessfully... */.
154b0 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
154c0 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a  TE_ROW == rc ){.
154d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61 6c            /* cal
154e0 6c 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 63  l the supplied c
154f0 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
15500 20 72 65 73 75 6c 74 20 72 6f 77 20 64 61 74 61   result row data
15510 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
15520 28 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b  ( shell_callback
15530 28 70 41 72 67 2c 20 6e 43 6f 6c 2c 20 61 7a 56  (pArg, nCol, azV
15540 61 6c 73 2c 20 61 7a 43 6f 6c 73 2c 20 61 69 54  als, azCols, aiT
15550 79 70 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20  ypes) ){.       
15560 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15570 5f 41 42 4f 52 54 3b 0a 20 20 20 20 20 20 20 20  _ABORT;.        
15580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15590 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
155a0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
155b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
155c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 77 68 69     }.      } whi
155d0 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d  le( SQLITE_ROW =
155e0 3d 20 72 63 20 29 3b 0a 20 20 20 20 20 20 73 71  = rc );.      sq
155f0 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61  lite3_free(pData
15600 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
15610 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15620 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
15630 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
15640 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
15650 6f 20 70 72 6f 63 65 73 73 20 53 51 4c 20 69 66  o process SQL if
15660 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 68   the previous sh
15670 65 6c 6c 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 77  ell command.** w
15680 61 73 20 22 2e 65 78 70 65 72 74 22 2e 20 49 74  as ".expert". It
15690 20 70 61 73 73 65 73 20 74 68 65 20 53 51 4c 20   passes the SQL 
156a0 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  in the second ar
156b0 67 75 6d 65 6e 74 20 64 69 72 65 63 74 6c 79 20  gument directly 
156c0 74 6f 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  to.** the sqlite
156d0 33 65 78 70 65 72 74 20 6f 62 6a 65 63 74 2e 0a  3expert object..
156e0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
156f0 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
15700 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
15710 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65  rwise, an SQLite
15720 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20   error.** code. 
15730 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 28 2a  In this case, (*
15740 70 7a 45 72 72 29 20 6d 61 79 20 62 65 20 73 65  pzErr) may be se
15750 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
15760 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
15770 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20  g.** an English 
15780 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d  language error m
15790 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
157a0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
157b0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
157c0 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
157d0 66 72 65 65 20 74 68 69 73 20 62 75 66 66 65 72  free this buffer
157e0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66   using sqlite3_f
157f0 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
15800 20 69 6e 74 20 65 78 70 65 72 74 48 61 6e 64 6c   int expertHandl
15810 65 53 51 4c 28 0a 20 20 53 68 65 6c 6c 53 74 61  eSQL(.  ShellSta
15820 74 65 20 2a 70 53 74 61 74 65 2c 20 0a 20 20 63  te *pState, .  c
15830 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
15840 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72   .  char **pzErr
15850 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 53  .){.  assert( pS
15860 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
15870 70 65 72 74 20 29 3b 0a 20 20 61 73 73 65 72 74  pert );.  assert
15880 28 20 70 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a 70  ( pzErr==0 || *p
15890 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20 72 65 74  zErr==0 );.  ret
158a0 75 72 6e 20 73 71 6c 69 74 65 33 5f 65 78 70 65  urn sqlite3_expe
158b0 72 74 5f 73 71 6c 28 70 53 74 61 74 65 2d 3e 65  rt_sql(pState->e
158c0 78 70 65 72 74 2e 70 45 78 70 65 72 74 2c 20 7a  xpert.pExpert, z
158d0 53 71 6c 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a  Sql, pzErr);.}..
158e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
158f0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 65 69  ion is called ei
15900 74 68 65 72 20 74 6f 20 73 69 6c 65 6e 74 6c 79  ther to silently
15910 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 6f 62   clean up the ob
15920 6a 65 63 74 0a 2a 2a 20 63 72 65 61 74 65 64 20  ject.** created 
15930 62 79 20 74 68 65 20 22 2e 65 78 70 65 72 74 22  by the ".expert"
15940 20 63 6f 6d 6d 61 6e 64 20 28 69 66 20 62 43 61   command (if bCa
15950 6e 63 65 6c 3d 3d 31 29 2c 20 6f 72 20 74 6f 20  ncel==1), or to 
15960 67 65 6e 65 72 61 74 65 20 61 20 0a 2a 2a 20 72  generate a .** r
15970 65 70 6f 72 74 20 66 72 6f 6d 20 69 74 20 61 6e  eport from it an
15980 64 20 74 68 65 6e 20 63 6c 65 61 6e 20 69 74 20  d then clean it 
15990 75 70 20 28 69 66 20 62 43 61 6e 63 65 6c 3d 3d  up (if bCancel==
159a0 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  0)..**.** If suc
159b0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
159c0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
159d0 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51  Otherwise, an SQ
159e0 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  Lite error.** co
159f0 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  de. In this case
15a00 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79 20 62  , (*pzErr) may b
15a10 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
15a20 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
15a30 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c  ining.** an Engl
15a40 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72  ish language err
15a50 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  or message. It i
15a60 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
15a70 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63  lity of the.** c
15a80 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
15a90 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 62 75  lly free this bu
15aa0 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ffer using sqlit
15ab0 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
15ac0 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74 46  atic int expertF
15ad0 69 6e 69 73 68 28 0a 20 20 53 68 65 6c 6c 53 74  inish(.  ShellSt
15ae0 61 74 65 20 2a 70 53 74 61 74 65 2c 0a 20 20 69  ate *pState,.  i
15af0 6e 74 20 62 43 61 6e 63 65 6c 2c 0a 20 20 63 68  nt bCancel,.  ch
15b00 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
15b10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15b20 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 65 78 70  OK;.  sqlite3exp
15b30 65 72 74 20 2a 70 20 3d 20 70 53 74 61 74 65 2d  ert *p = pState-
15b40 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 3b  >expert.pExpert;
15b50 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a  .  assert( p );.
15b60 20 20 61 73 73 65 72 74 28 20 62 43 61 6e 63 65    assert( bCance
15b70 6c 20 7c 7c 20 70 7a 45 72 72 3d 3d 30 20 7c 7c  l || pzErr==0 ||
15b80 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20   *pzErr==0 );.  
15b90 69 66 28 20 62 43 61 6e 63 65 6c 3d 3d 30 20 29  if( bCancel==0 )
15ba0 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
15bb0 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b 0a 20  = pState->out;. 
15bc0 20 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20     int bVerbose 
15bd0 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74  = pState->expert
15be0 2e 62 56 65 72 62 6f 73 65 3b 0a 0a 20 20 20 20  .bVerbose;..    
15bf0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  rc = sqlite3_exp
15c00 65 72 74 5f 61 6e 61 6c 79 7a 65 28 70 2c 20 70  ert_analyze(p, p
15c10 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 72  zErr);.    if( r
15c20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15c30 20 20 20 20 20 20 69 6e 74 20 6e 51 75 65 72 79        int nQuery
15c40 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72   = sqlite3_exper
15c50 74 5f 63 6f 75 6e 74 28 70 29 3b 0a 20 20 20 20  t_count(p);.    
15c60 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20    int i;..      
15c70 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a  if( bVerbose ){.
15c80 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
15c90 61 72 20 2a 7a 43 61 6e 64 20 3d 20 73 71 6c 69  ar *zCand = sqli
15ca0 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72  te3_expert_repor
15cb0 74 28 70 2c 30 2c 45 58 50 45 52 54 5f 52 45 50  t(p,0,EXPERT_REP
15cc0 4f 52 54 5f 43 41 4e 44 49 44 41 54 45 53 29 3b  ORT_CANDIDATES);
15cd0 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
15ce0 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 43 61 6e  ntf(out, "-- Can
15cf0 64 69 64 61 74 65 73 20 2d 2d 2d 2d 2d 2d 2d 2d  didates --------
15d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d10 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 20 20 20  -----\n");.     
15d20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
15d30 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 43 61 6e 64  t, "%s\n", zCand
15d40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15d50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 51 75 65   for(i=0; i<nQue
15d60 72 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ry; i++){.      
15d70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
15d80 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  ql = sqlite3_exp
15d90 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c  ert_report(p, i,
15da0 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 53   EXPERT_REPORT_S
15db0 51 4c 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  QL);.        con
15dc0 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20 3d 20  st char *zIdx = 
15dd0 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72  sqlite3_expert_r
15de0 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45  eport(p, i, EXPE
15df0 52 54 5f 52 45 50 4f 52 54 5f 49 4e 44 45 58 45  RT_REPORT_INDEXE
15e00 53 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  S);.        cons
15e10 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d 20 73  t char *zEQP = s
15e20 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65  qlite3_expert_re
15e30 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45 52  port(p, i, EXPER
15e40 54 5f 52 45 50 4f 52 54 5f 50 4c 41 4e 29 3b 0a  T_REPORT_PLAN);.
15e50 20 20 20 20 20 20 20 20 69 66 28 20 7a 49 64 78          if( zIdx
15e60 3d 3d 30 20 29 20 7a 49 64 78 20 3d 20 22 28 6e  ==0 ) zIdx = "(n
15e70 6f 20 6e 65 77 20 69 6e 64 65 78 65 73 29 5c 6e  o new indexes)\n
15e80 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  ";.        if( b
15e90 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20  Verbose ){.     
15ea0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
15eb0 6f 75 74 2c 20 22 2d 2d 20 51 75 65 72 79 20 25  out, "-- Query %
15ec0 64 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  d --------------
15ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ee0 2d 2d 5c 6e 22 2c 69 2b 31 29 3b 0a 20 20 20 20  --\n",i+1);.    
15ef0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
15f00 28 6f 75 74 2c 20 22 25 73 5c 6e 5c 6e 22 2c 20  (out, "%s\n\n", 
15f10 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  zSql);.        }
15f20 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
15f30 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  ntf(out, "%s\n",
15f40 20 7a 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   zIdx);.        
15f50 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
15f60 22 25 73 5c 6e 22 2c 20 7a 45 51 50 29 3b 0a 20  "%s\n", zEQP);. 
15f70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15f80 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72  .  sqlite3_exper
15f90 74 5f 64 65 73 74 72 6f 79 28 70 29 3b 0a 20 20  t_destroy(p);.  
15fa0 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
15fb0 45 78 70 65 72 74 20 3d 20 30 3b 0a 20 20 72 65  Expert = 0;.  re
15fc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15fd0 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
15fe0 20 6f 66 20 22 2e 65 78 70 65 72 74 22 20 64 6f   of ".expert" do
15ff0 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74  t command..*/.st
16000 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74 44  atic int expertD
16010 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65  otCommand(.  She
16020 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16040 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f  Current shell to
16050 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68  ol state */.  ch
16060 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20  ar **azArg,     
16070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16080 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65   Array of argume
16090 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f  nts passed to do
160a0 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  t command */.  i
160b0 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20 20  nt nArg         
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
160d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
160e0 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a  ies in azArg[] *
160f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
16100 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61  SQLITE_OK;.  cha
16110 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69  r *zErr = 0;.  i
16120 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 53 61 6d  nt i;.  int iSam
16130 70 6c 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ple = 0;..  asse
16140 72 74 28 20 70 53 74 61 74 65 2d 3e 65 78 70 65  rt( pState->expe
16150 72 74 2e 70 45 78 70 65 72 74 3d 3d 30 20 29 3b  rt.pExpert==0 );
16160 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 74 61 74  .  memset(&pStat
16170 65 2d 3e 65 78 70 65 72 74 2c 20 30 2c 20 73 69  e->expert, 0, si
16180 7a 65 6f 66 28 45 78 70 65 72 74 49 6e 66 6f 29  zeof(ExpertInfo)
16190 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72  );..  for(i=1; r
161a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
161b0 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
161c0 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72    char *z = azAr
161d0 67 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  g[i];.    int n;
161e0 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
161f0 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20  -' && z[1]=='-' 
16200 29 20 7a 2b 2b 3b 0a 20 20 20 20 6e 20 3d 20 73  ) z++;.    n = s
16210 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
16220 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73  if( n>=2 && 0==s
16230 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 76 65 72 62  trncmp(z, "-verb
16240 6f 73 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20  ose", n) ){.    
16250 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74    pState->expert
16260 2e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20  .bVerbose = 1;. 
16270 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
16280 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73 74 72  ( n>=2 && 0==str
16290 6e 63 6d 70 28 7a 2c 20 22 2d 73 61 6d 70 6c 65  ncmp(z, "-sample
162a0 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20 69  ", n) ){.      i
162b0 66 28 20 69 3d 3d 28 6e 41 72 67 2d 31 29 20 29  f( i==(nArg-1) )
162c0 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
162d0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f 70  intf(stderr, "op
162e0 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e  tion requires an
162f0 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 5c 6e 22   argument: %s\n"
16300 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 63  , z);.        rc
16310 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
16320 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16330 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d 20        iSample = 
16340 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75  (int)integerValu
16350 65 28 61 7a 41 72 67 5b 2b 2b 69 5d 29 3b 0a 20  e(azArg[++i]);. 
16360 20 20 20 20 20 20 20 69 66 28 20 69 53 61 6d 70         if( iSamp
16370 6c 65 3c 30 20 7c 7c 20 69 53 61 6d 70 6c 65 3e  le<0 || iSample>
16380 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  100 ){.         
16390 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
163a0 72 72 2c 20 22 76 61 6c 75 65 20 6f 75 74 20 6f  rr, "value out o
163b0 66 20 72 61 6e 67 65 3a 20 25 73 5c 6e 22 2c 20  f range: %s\n", 
163c0 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
163d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
163e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
163f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
16400 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
16410 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
16420 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  r, "unknown opti
16430 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  on: %s\n", z);. 
16440 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
16450 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
16460 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
16470 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 53  ITE_OK ){.    pS
16480 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
16490 70 65 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 65  pert = sqlite3_e
164a0 78 70 65 72 74 5f 6e 65 77 28 70 53 74 61 74 65  xpert_new(pState
164b0 2d 3e 64 62 2c 20 26 7a 45 72 72 29 3b 0a 20 20  ->db, &zErr);.  
164c0 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e 65 78    if( pState->ex
164d0 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d 30 20  pert.pExpert==0 
164e0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
164f0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 71 6c  ntf(stderr, "sql
16500 69 74 65 33 5f 65 78 70 65 72 74 5f 6e 65 77 3a  ite3_expert_new:
16510 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20   %s\n", zErr);. 
16520 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
16530 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
16540 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
16550 5f 65 78 70 65 72 74 5f 63 6f 6e 66 69 67 28 0a  _expert_config(.
16560 20 20 20 20 20 20 20 20 20 20 70 53 74 61 74 65            pState
16570 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
16580 2c 20 45 58 50 45 52 54 5f 43 4f 4e 46 49 47 5f  , EXPERT_CONFIG_
16590 53 41 4d 50 4c 45 2c 20 69 53 61 6d 70 6c 65 0a  SAMPLE, iSample.
165a0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
165b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
165c0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e  .}.#endif /* ifn
165d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
165e0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
165f0 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
16600 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 65   statement or se
16610 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 2e  t of statements.
16620 20 20 50 72 69 6e 74 0a 2a 2a 20 61 6e 79 20 72    Print.** any r
16630 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f 6c 75 6d  esult rows/colum
16640 6e 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ns depending on 
16650 74 68 65 20 63 75 72 72 65 6e 74 20 6d 6f 64 65  the current mode
16660 0a 2a 2a 20 73 65 74 20 76 69 61 20 74 68 65 20  .** set via the 
16670 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63  supplied callbac
16680 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  k..**.** This is
16690 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20 74 6f   very similar to
166a0 20 53 51 4c 69 74 65 27 73 20 62 75 69 6c 74 2d   SQLite's built-
166b0 69 6e 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  in sqlite3_exec(
166c0 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 65 78  ).** function ex
166d0 63 65 70 74 20 69 74 20 74 61 6b 65 73 20 61 20  cept it takes a 
166e0 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65  slightly differe
166f0 6e 74 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 61  nt callback.** a
16700 6e 64 20 63 61 6c 6c 62 61 63 6b 20 64 61 74 61  nd callback data
16710 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
16720 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 65  atic int shell_e
16730 78 65 63 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  xec(.  ShellStat
16740 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20  e *pArg,        
16750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16760 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
16770 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 63  hellState */.  c
16780 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
167b0 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  to be evaluated 
167c0 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
167d0 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20 20  rMsg            
167e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
167f0 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72 69 74  * Error msg writ
16800 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
16810 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
16820 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 20 20 20  Stmt = NULL;    
16830 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 74 6f   /* Statement to
16840 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20 69   execute. */.  i
16850 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16860 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
16870 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
16880 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 63 6f  .  int rc2;.  co
16890 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66 74 6f  nst char *zLefto
168a0 76 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ver;          /*
168b0 20 54 61 69 6c 20 6f 66 20 75 6e 70 72 6f 63 65   Tail of unproce
168c0 73 73 65 64 20 53 51 4c 20 2a 2f 0a 20 20 73 71  ssed SQL */.  sq
168d0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 41 72 67  lite3 *db = pArg
168e0 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 7a 45  ->db;..  if( pzE
168f0 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 2a 70 7a  rrMsg ){.    *pz
16900 45 72 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20  ErrMsg = NULL;. 
16910 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
16920 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
16930 41 42 4c 45 0a 20 20 69 66 28 20 70 41 72 67 2d  ABLE.  if( pArg-
16940 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20  >expert.pExpert 
16950 29 7b 0a 20 20 20 20 72 63 20 3d 20 65 78 70 65  ){.    rc = expe
16960 72 74 48 61 6e 64 6c 65 53 51 4c 28 70 41 72 67  rtHandleSQL(pArg
16970 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72 4d 73 67  , zSql, pzErrMsg
16980 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 65 78  );.    return ex
16990 70 65 72 74 46 69 6e 69 73 68 28 70 41 72 67 2c  pertFinish(pArg,
169a0 20 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29   (rc!=SQLITE_OK)
169b0 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d  , pzErrMsg);.  }
169c0 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65  .#endif..  while
169d0 28 20 7a 53 71 6c 5b 30 5d 20 26 26 20 28 53 51  ( zSql[0] && (SQ
169e0 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72 63 29 20 29  LITE_OK == rc) )
169f0 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
16a00 73 74 20 63 68 61 72 20 2a 7a 53 74 6d 74 53 71  st char *zStmtSq
16a10 6c 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  l;.    rc = sqli
16a20 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
16a30 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
16a40 74 6d 74 2c 20 26 7a 4c 65 66 74 6f 76 65 72 29  tmt, &zLeftover)
16a50 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
16a60 5f 4f 4b 20 21 3d 20 72 63 20 29 7b 0a 20 20 20  _OK != rc ){.   
16a70 20 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20     if( pzErrMsg 
16a80 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  ){.        *pzEr
16a90 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72 5f  rMsg = save_err_
16aa0 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  msg(db);.      }
16ab0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16ac0 20 20 69 66 28 20 21 70 53 74 6d 74 20 29 7b 0a    if( !pStmt ){.
16ad0 20 20 20 20 20 20 20 20 2f 2a 20 74 68 69 73 20          /* this 
16ae0 68 61 70 70 65 6e 73 20 66 6f 72 20 61 20 63 6f  happens for a co
16af0 6d 6d 65 6e 74 20 6f 72 20 77 68 69 74 65 2d 73  mment or white-s
16b00 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  pace */.        
16b10 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72  zSql = zLeftover
16b20 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
16b30 20 49 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d   IsSpace(zSql[0]
16b40 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20  ) ) zSql++;.    
16b50 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
16b60 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 74 6d      }.      zStm
16b70 74 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73  tSql = sqlite3_s
16b80 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ql(pStmt);.     
16b90 20 69 66 28 20 7a 53 74 6d 74 53 71 6c 3d 3d 30   if( zStmtSql==0
16ba0 20 29 20 7a 53 74 6d 74 53 71 6c 20 3d 20 22 22   ) zStmtSql = ""
16bb0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49  ;.      while( I
16bc0 73 53 70 61 63 65 28 7a 53 74 6d 74 53 71 6c 5b  sSpace(zStmtSql[
16bd0 30 5d 29 20 29 20 7a 53 74 6d 74 53 71 6c 2b 2b  0]) ) zStmtSql++
16be0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 73 61 76 65  ;..      /* save
16bf0 20 6f 66 66 20 74 68 65 20 70 72 65 70 61 72 65   off the prepare
16c00 64 20 73 74 61 74 6d 65 6e 74 20 68 61 6e 64 6c  d statment handl
16c10 65 20 61 6e 64 20 72 65 73 65 74 20 72 6f 77 20  e and reset row 
16c20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69  count */.      i
16c30 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20  f( pArg ){.     
16c40 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d     pArg->pStmt =
16c50 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20   pStmt;.        
16c60 70 41 72 67 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20  pArg->cnt = 0;. 
16c70 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
16c80 20 65 63 68 6f 20 74 68 65 20 73 71 6c 20 73 74   echo the sql st
16c90 61 74 65 6d 65 6e 74 20 69 66 20 65 63 68 6f 20  atement if echo 
16ca0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  on */.      if( 
16cb0 70 41 72 67 20 26 26 20 53 68 65 6c 6c 48 61 73  pArg && ShellHas
16cc0 46 6c 61 67 28 70 41 72 67 2c 20 53 48 46 4c 47  Flag(pArg, SHFLG
16cd0 5f 45 63 68 6f 29 20 29 7b 0a 20 20 20 20 20 20  _Echo) ){.      
16ce0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
16cf0 72 67 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  rg->out, "%s\n",
16d00 20 7a 53 74 6d 74 53 71 6c 20 3f 20 7a 53 74 6d   zStmtSql ? zStm
16d10 74 53 71 6c 20 3a 20 7a 53 71 6c 29 3b 0a 20 20  tSql : zSql);.  
16d20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
16d30 53 68 6f 77 20 74 68 65 20 45 58 50 4c 41 49 4e  Show the EXPLAIN
16d40 20 51 55 45 52 59 20 50 4c 41 4e 20 69 66 20 2e   QUERY PLAN if .
16d50 65 71 70 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 20  eqp is on */.   
16d60 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70     if( pArg && p
16d70 41 72 67 2d 3e 61 75 74 6f 45 51 50 20 26 26 20  Arg->autoEQP && 
16d80 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69 73 65  sqlite3_stmt_ise
16d90 78 70 6c 61 69 6e 28 70 53 74 6d 74 29 3d 3d 30  xplain(pStmt)==0
16da0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16db0 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61  te3_stmt *pExpla
16dc0 69 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  in;.        char
16dd0 20 2a 7a 45 51 50 3b 0a 20 20 20 20 20 20 20 20   *zEQP;.        
16de0 69 6e 74 20 74 72 69 67 67 65 72 45 51 50 20 3d  int triggerEQP =
16df0 20 30 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61   0;.        disa
16e00 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f  ble_debug_trace_
16e10 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20 20  modes();.       
16e20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
16e30 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  ig(db, SQLITE_DB
16e40 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45  CONFIG_TRIGGER_E
16e50 51 50 2c 20 2d 31 2c 20 26 74 72 69 67 67 65 72  QP, -1, &trigger
16e60 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20 69 66  EQP);.        if
16e70 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e  ( pArg->autoEQP>
16e80 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72  =AUTOEQP_trigger
16e90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
16ea0 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
16eb0 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  db, SQLITE_DBCON
16ec0 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c  FIG_TRIGGER_EQP,
16ed0 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
16ee0 7d 0a 20 20 20 20 20 20 20 20 7a 45 51 50 20 3d  }.        zEQP =
16ef0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
16f00 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  ("EXPLAIN QUERY 
16f10 50 4c 41 4e 20 25 73 22 2c 20 7a 53 74 6d 74 53  PLAN %s", zStmtS
16f20 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ql);.        rc 
16f30 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
16f40 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d  e_v2(db, zEQP, -
16f50 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29  1, &pExplain, 0)
16f60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16f70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16f80 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
16f90 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78  sqlite3_step(pEx
16fa0 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45 5f 52  plain)==SQLITE_R
16fb0 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OW ){.          
16fc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
16fd0 51 50 4c 69 6e 65 20 3d 20 28 63 6f 6e 73 74 20  QPLine = (const 
16fe0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
16ff0 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c 61  lumn_text(pExpla
17000 69 6e 2c 33 29 3b 0a 20 20 20 20 20 20 20 20 20  in,3);.         
17010 20 20 20 69 6e 74 20 69 45 71 70 49 64 20 3d 20     int iEqpId = 
17020 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
17030 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b  nt(pExplain, 0);
17040 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
17050 20 69 50 61 72 65 6e 74 49 64 20 3d 20 73 71 6c   iParentId = sql
17060 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
17070 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a 20 20  pExplain, 1);.  
17080 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 45            if( zE
17090 51 50 4c 69 6e 65 5b 30 5d 3d 3d 27 2d 27 20 29  QPLine[0]=='-' )
170a0 20 65 71 70 5f 72 65 6e 64 65 72 28 70 41 72 67   eqp_render(pArg
170b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  );.            e
170c0 71 70 5f 61 70 70 65 6e 64 28 70 41 72 67 2c 20  qp_append(pArg, 
170d0 69 45 71 70 49 64 2c 20 69 50 61 72 65 6e 74 49  iEqpId, iParentI
170e0 64 2c 20 7a 45 51 50 4c 69 6e 65 29 3b 0a 20 20  d, zEQPLine);.  
170f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17100 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72 28 70      eqp_render(p
17110 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Arg);.        }.
17120 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
17130 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69  finalize(pExplai
17140 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
17150 74 65 33 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a  te3_free(zEQP);.
17160 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67          if( pArg
17170 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45  ->autoEQP>=AUTOE
17180 51 50 5f 66 75 6c 6c 20 29 7b 0a 20 20 20 20 20  QP_full ){.     
17190 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 64 6f 20       /* Also do 
171a0 61 6e 20 45 58 50 4c 41 49 4e 20 66 6f 72 20 22  an EXPLAIN for "
171b0 2e 65 71 70 20 66 75 6c 6c 22 20 6d 6f 64 65 20  .eqp full" mode 
171c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45 51  */.          zEQ
171d0 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  P = sqlite3_mpri
171e0 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 25 73 22  ntf("EXPLAIN %s"
171f0 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20 20 20  , zStmtSql);.   
17200 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17210 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
17220 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45  b, zEQP, -1, &pE
17230 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20  xplain, 0);.    
17240 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
17250 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17260 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f         pArg->cMo
17270 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69  de = MODE_Explai
17280 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  n;.            e
17290 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70  xplain_data_prep
172a0 61 72 65 28 70 41 72 67 2c 20 70 45 78 70 6c 61  are(pArg, pExpla
172b0 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  in);.           
172c0 20 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73   exec_prepared_s
172d0 74 6d 74 28 70 41 72 67 2c 20 70 45 78 70 6c 61  tmt(pArg, pExpla
172e0 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  in);.           
172f0 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65   explain_data_de
17300 6c 65 74 65 28 70 41 72 67 29 3b 0a 20 20 20 20  lete(pArg);.    
17310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17320 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
17330 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20  ze(pExplain);.  
17340 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
17350 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20 20 20  free(zEQP);.    
17360 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
17370 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e  ( pArg->autoEQP>
17380 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72  =AUTOEQP_trigger
17390 20 26 26 20 74 72 69 67 67 65 72 45 51 50 3d 3d   && triggerEQP==
173a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
173b0 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
173c0 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f  (db, SQLITE_DBCO
173d0 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50  NFIG_TRIGGER_EQP
173e0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
173f0 20 20 20 2f 2a 20 52 65 70 72 65 70 61 72 65 20     /* Reprepare 
17400 70 53 74 6d 74 20 62 65 66 6f 72 65 20 72 65 61  pStmt before rea
17410 63 74 69 76 69 6e 67 20 74 72 61 63 65 20 6d 6f  ctiving trace mo
17420 64 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  des */.         
17430 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
17440 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
17450 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70      sqlite3_prep
17460 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
17470 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
17480 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
17490 41 72 67 20 29 20 70 41 72 67 2d 3e 70 53 74 6d  Arg ) pArg->pStm
174a0 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20  t = pStmt;.     
174b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 73     }.        res
174c0 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63 65  tore_debug_trace
174d0 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20  _modes();.      
174e0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  }..      if( pAr
174f0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72  g ){.        pAr
17500 67 2d 3e 63 4d 6f 64 65 20 3d 20 70 41 72 67 2d  g->cMode = pArg-
17510 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 69  >mode;.        i
17520 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 78 70  f( pArg->autoExp
17530 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lain ){.        
17540 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
17550 6d 74 5f 69 73 65 78 70 6c 61 69 6e 28 70 53 74  mt_isexplain(pSt
17560 6d 74 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  mt)==1 ){.      
17570 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64        pArg->cMod
17580 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  e = MODE_Explain
17590 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
175a0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
175b0 74 65 33 5f 73 74 6d 74 5f 69 73 65 78 70 6c 61  te3_stmt_isexpla
175c0 69 6e 28 70 53 74 6d 74 29 3d 3d 32 20 29 7b 0a  in(pStmt)==2 ){.
175d0 20 20 20 20 20 20 20 20 20 20 20 20 70 41 72 67              pArg
175e0 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45  ->cMode = MODE_E
175f0 51 50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  QP;.          }.
17600 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
17610 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68 65     /* If the she
17620 6c 6c 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ll is currently 
17630 69 6e 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f  in ".explain" mo
17640 64 65 2c 20 67 61 74 68 65 72 20 74 68 65 20 65  de, gather the e
17650 78 74 72 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  xtra.        ** 
17660 64 61 74 61 20 72 65 71 75 69 72 65 64 20 74 6f  data required to
17670 20 61 64 64 20 69 6e 64 65 6e 74 73 20 74 6f 20   add indents to 
17680 74 68 65 20 6f 75 74 70 75 74 2e 2a 2f 0a 20 20  the output.*/.  
17690 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e        if( pArg->
176a0 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c  cMode==MODE_Expl
176b0 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ain ){.         
176c0 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72   explain_data_pr
176d0 65 70 61 72 65 28 70 41 72 67 2c 20 70 53 74 6d  epare(pArg, pStm
176e0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
176f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 69 6e      }..      bin
17700 64 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28  d_prepared_stmt(
17710 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20 20  pArg, pStmt);.  
17720 20 20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65      exec_prepare
17730 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 53 74  d_stmt(pArg, pSt
17740 6d 74 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  mt);.      expla
17750 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70  in_data_delete(p
17760 41 72 67 29 3b 0a 20 20 20 20 20 20 65 71 70 5f  Arg);.      eqp_
17770 72 65 6e 64 65 72 28 70 41 72 67 29 3b 0a 0a 20  render(pArg);.. 
17780 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 75 73       /* print us
17790 61 67 65 20 73 74 61 74 73 20 69 66 20 73 74 61  age stats if sta
177a0 74 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ts on */.      i
177b0 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
177c0 3e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20  >statsOn ){.    
177d0 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61 74      display_stat
177e0 73 28 64 62 2c 20 70 41 72 67 2c 20 30 29 3b 0a  s(db, pArg, 0);.
177f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
17800 2a 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f 75  * print loop-cou
17810 6e 74 65 72 73 20 69 66 20 72 65 71 75 69 72 65  nters if require
17820 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  d */.      if( p
17830 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73 63 61  Arg && pArg->sca
17840 6e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20  nstatsOn ){.    
17850 20 20 20 20 64 69 73 70 6c 61 79 5f 73 63 61 6e      display_scan
17860 73 74 61 74 73 28 64 62 2c 20 70 41 72 67 29 3b  stats(db, pArg);
17870 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
17880 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  /* Finalize the 
17890 73 74 61 74 65 6d 65 6e 74 20 6a 75 73 74 20 65  statement just e
178a0 78 65 63 75 74 65 64 2e 20 49 66 20 74 68 69 73  xecuted. If this
178b0 20 66 61 69 6c 73 2c 20 73 61 76 65 20 61 0a 20   fails, save a. 
178c0 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20       ** copy of 
178d0 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
178e0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  e. Otherwise, se
178f0 74 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74 20  t zSql to point 
17900 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
17910 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 74  next statement t
17920 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20  o execute. */.  
17930 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
17940 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
17950 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
17960 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20  =SQLITE_NOMEM ) 
17970 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
17980 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17990 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71  K ){.        zSq
179a0 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20  l = zLeftover;. 
179b0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73         while( Is
179c0 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29  Space(zSql[0]) )
179d0 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d   zSql++;.      }
179e0 65 6c 73 65 20 69 66 28 20 70 7a 45 72 72 4d 73  else if( pzErrMs
179f0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a  g ){.        *pz
17a00 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72  ErrMsg = save_er
17a10 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20  r_msg(db);.     
17a20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c 65   }..      /* cle
17a30 61 72 20 73 61 76 65 64 20 73 74 6d 74 20 68 61  ar saved stmt ha
17a40 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  ndle */.      if
17a50 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ( pArg ){.      
17a60 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20    pArg->pStmt = 
17a70 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NULL;.      }.  
17a80 20 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20 77    }.  } /* end w
17a90 68 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72  hile */..  retur
17aa0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
17ab0 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 70 72  elease memory pr
17ac0 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
17ad0 65 64 20 62 79 20 74 61 62 6c 65 43 6f 6c 75 6d  ed by tableColum
17ae0 6e 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74 61 74  nList()..*/.stat
17af0 69 63 20 76 6f 69 64 20 66 72 65 65 43 6f 6c 75  ic void freeColu
17b00 6d 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a 61 7a  mnList(char **az
17b10 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
17b20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b   for(i=1; azCol[
17b30 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  i]; i++){.    sq
17b40 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c  lite3_free(azCol
17b50 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 61  [i]);.  }.  /* a
17b60 7a 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73 74 61  zCol[0] is a sta
17b70 74 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  tic string */.  
17b80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43  sqlite3_free(azC
17b90 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ol);.}../*.** Re
17ba0 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  turn a list of p
17bb0 6f 69 6e 74 65 72 73 20 74 6f 20 73 74 72 69 6e  ointers to strin
17bc0 67 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65  gs which are the
17bd0 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a 2a   names of all.**
17be0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c   columns in tabl
17bf0 65 20 7a 54 61 62 2e 20 20 20 54 68 65 20 6d 65  e zTab.   The me
17c00 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
17c10 20 6e 61 6d 65 73 20 69 73 20 64 79 6e 61 6d 69   names is dynami
17c20 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  cally.** allocat
17c30 65 64 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72  ed and must be r
17c40 65 6c 65 61 73 65 64 20 62 79 20 74 68 65 20 63  eleased by the c
17c50 61 6c 6c 65 72 20 75 73 69 6e 67 20 61 20 73 75  aller using a su
17c60 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
17c70 20 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69   to freeColumnLi
17c80 73 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  st()..**.** The 
17c90 61 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79 20 69  azCol[0] entry i
17ca0 73 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e 20  s usually NULL. 
17cb0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 7a 54 61   However, if zTa
17cc0 62 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77  b contains a row
17cd0 69 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68 61 74  id.** value that
17ce0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72 65   needs to be pre
17cf0 73 65 72 76 65 64 2c 20 74 68 65 6e 20 61 7a 43  served, then azC
17d00 6f 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65 64 20  ol[0] is filled 
17d10 69 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6e  in with the.** n
17d20 61 6d 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ame of the rowid
17d30 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54   column..**.** T
17d40 68 65 20 66 69 72 73 74 20 72 65 67 75 6c 61 72  he first regular
17d50 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74   column in the t
17d60 61 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b 31 5d  able is azCol[1]
17d70 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73 20 74  .  The list is t
17d80 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62 79 20  erminated.** by 
17d90 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 7a  an entry with az
17da0 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73 74  Col[i]==0..*/.st
17db0 61 74 69 63 20 63 68 61 72 20 2a 2a 74 61 62 6c  atic char **tabl
17dc0 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68 65 6c  eColumnList(Shel
17dd0 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74  lState *p, const
17de0 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20   char *zTab){.  
17df0 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20 30  char **azCol = 0
17e00 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
17e10 20 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61 72 20   *pStmt;.  char 
17e20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 43 6f  *zSql;.  int nCo
17e30 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41 6c  l = 0;.  int nAl
17e40 6c 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  loc = 0;.  int n
17e50 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  PK = 0;       /*
17e60 20 4e 75 6d 62 65 72 20 6f 66 20 50 52 49 4d 41   Number of PRIMA
17e70 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 73  RY KEY columns s
17e80 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  een */.  int isI
17e90 50 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  PK = 0;     /* T
17ea0 72 75 65 20 69 66 20 6f 6e 65 20 50 52 49 4d 41  rue if one PRIMA
17eb0 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 66  RY KEY column of
17ec0 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 2a 2f   type INTEGER */
17ed0 0a 20 20 69 6e 74 20 70 72 65 73 65 72 76 65 52  .  int preserveR
17ee0 6f 77 69 64 20 3d 20 53 68 65 6c 6c 48 61 73 46  owid = ShellHasF
17ef0 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72 65  lag(p, SHFLG_Pre
17f00 73 65 72 76 65 52 6f 77 69 64 29 3b 0a 20 20 69  serveRowid);.  i
17f10 6e 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d  nt rc;..  zSql =
17f20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
17f30 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69  ("PRAGMA table_i
17f40 6e 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b 0a  nfo=%Q", zTab);.
17f50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
17f60 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
17f70 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
17f80 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
17f90 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69  _free(zSql);.  i
17fa0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 30  f( rc ) return 0
17fb0 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ;.  while( sqlit
17fc0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
17fd0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
17fe0 20 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c 6c    if( nCol>=nAll
17ff0 6f 63 2d 32 20 29 7b 0a 20 20 20 20 20 20 6e 41  oc-2 ){.      nA
18000 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32 20  lloc = nAlloc*2 
18010 2b 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20 20 20  + nCol + 10;.   
18020 20 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69 74     azCol = sqlit
18030 65 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f 6c  e3_realloc(azCol
18040 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28  , nAlloc*sizeof(
18050 61 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20  azCol[0]));.    
18060 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29    if( azCol==0 )
18070 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65   shell_out_of_me
18080 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20  mory();.    }.  
18090 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d 20    azCol[++nCol] 
180a0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
180b0 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
180c0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
180d0 74 2c 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20  t, 1));.    if( 
180e0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
180f0 6e 74 28 70 53 74 6d 74 2c 20 35 29 20 29 7b 0a  nt(pStmt, 5) ){.
18100 20 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20 20        nPK++;.   
18110 20 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20 20     if( nPK==1.  
18120 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f       && sqlite3_
18130 73 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20 63  stricmp((const c
18140 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
18150 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32  umn_text(pStmt,2
18160 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
18170 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e               "IN
18180 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20  TEGER")==0.     
18190 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50   ){.        isIP
181a0 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  K = 1;.      }el
181b0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50  se{.        isIP
181c0 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  K = 0;.      }. 
181d0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
181e0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
181f0 74 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c 3d  t);.  if( azCol=
18200 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
18210 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a 20   azCol[0] = 0;. 
18220 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20 3d   azCol[nCol+1] =
18230 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65   0;..  /* The de
18240 63 69 73 69 6f 6e 20 6f 66 20 77 68 65 74 68 65  cision of whethe
18250 72 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69 64  r or not a rowid
18260 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 74 6f   really needs to
18270 20 62 65 20 70 72 65 73 65 72 76 65 64 0a 20 20   be preserved.  
18280 2a 2a 20 69 73 20 74 72 69 63 6b 79 2e 20 20 57  ** is tricky.  W
18290 65 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20  e never need to 
182a0 70 72 65 73 65 72 76 65 20 61 20 72 6f 77 69 64  preserve a rowid
182b0 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52   for a WITHOUT R
182c0 4f 57 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a 20  OWID table.  ** 
182d0 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
182e0 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
182f0 52 59 20 4b 45 59 2e 20 20 57 65 20 61 72 65 20  RY KEY.  We are 
18300 75 6e 61 62 6c 65 20 74 6f 20 70 72 65 73 65 72  unable to preser
18310 76 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20 6f  ve.  ** rowids o
18320 6e 20 74 61 62 6c 65 73 20 77 68 65 72 65 20 74  n tables where t
18330 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e 61 63  he rowid is inac
18340 63 65 73 73 69 62 6c 65 20 62 65 63 61 75 73 65  cessible because
18350 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72   there are other
18360 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e  .  ** columns in
18370 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 64   the table named
18380 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69   "rowid", "_rowi
18390 64 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e 0a  d_", and "oid"..
183a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 73 65    */.  if( prese
183b0 72 76 65 52 6f 77 69 64 20 26 26 20 69 73 49 50  rveRowid && isIP
183c0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  K ){.    /* If a
183d0 20 73 69 6e 67 6c 65 20 50 52 49 4d 41 52 59 20   single PRIMARY 
183e0 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20  KEY column with 
183f0 74 79 70 65 20 49 4e 54 45 47 45 52 20 77 61 73  type INTEGER was
18400 20 73 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a 20   seen, then it. 
18410 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 61     ** might be a
18420 6e 20 61 6c 69 73 65 20 66 6f 72 20 74 68 65 20  n alise for the 
18430 52 4f 57 49 44 2e 20 20 42 75 74 20 69 74 20 6d  ROWID.  But it m
18440 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20 57  ight also be a W
18450 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 20  ITHOUT ROWID.   
18460 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61 20 49   ** table or a I
18470 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
18480 45 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c 20  EY DESC column, 
18490 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68  neither of which
184a0 20 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57 49   are.    ** ROWI
184b0 44 20 61 6c 69 61 73 65 73 2e 20 20 54 6f 20 64  D aliases.  To d
184c0 69 73 74 69 6e 67 75 69 73 68 20 74 68 65 73 65  istinguish these
184d0 20 63 61 73 65 73 2c 20 63 68 65 63 6b 20 74 6f   cases, check to
184e0 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 74   see if.    ** t
184f0 68 65 72 65 20 69 73 20 61 20 22 70 6b 22 20 65  here is a "pk" e
18500 6e 74 72 79 20 69 6e 20 22 50 52 41 47 4d 41 20  ntry in "PRAGMA 
18510 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20 54 68  index_list".  Th
18520 65 72 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ere will be.    
18530 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65 78  ** no "pk" index
18540 20 69 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   if the PRIMARY 
18550 4b 45 59 20 72 65 61 6c 6c 79 20 69 73 20 61 6e  KEY really is an
18560 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52   alias for the R
18570 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  OWID..    */.   
18580 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
18590 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
185a0 31 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69 6e  1 FROM pragma_in
185b0 64 65 78 5f 6c 69 73 74 28 25 51 29 22 0a 20 20  dex_list(%Q)".  
185c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185d0 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
185e0 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20 7a   origin='pk'", z
185f0 54 61 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Tab);.    rc = s
18600 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
18610 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
18620 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
18630 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18640 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  zSql);.    if( r
18650 63 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 43  c ){.      freeC
18660 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29  olumnList(azCol)
18670 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
18680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
18690 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
186a0 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tmt);.    sqlite
186b0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
186c0 29 3b 0a 20 20 20 20 70 72 65 73 65 72 76 65 52  );.    preserveR
186d0 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49 54  owid = rc==SQLIT
186e0 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28  E_ROW;.  }.  if(
186f0 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 29   preserveRowid )
18700 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70 72  {.    /* Only pr
18710 65 73 65 72 76 65 20 74 68 65 20 72 6f 77 69 64  eserve the rowid
18720 20 69 66 20 77 65 20 63 61 6e 20 66 69 6e 64 20   if we can find 
18730 61 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 66 6f  a name to use fo
18740 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 77  r the.    ** row
18750 69 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63  id */.    static
18760 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b 5d   char *azRowid[]
18770 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22 5f   = { "rowid", "_
18780 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22 20 7d  rowid_", "oid" }
18790 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ;.    int i, j;.
187a0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33      for(j=0; j<3
187b0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; j++){.      fo
187c0 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b 20  r(i=1; i<=nCol; 
187d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
187e0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
187f0 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a 43  p(azRowid[j],azC
18800 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65 61  ol[i])==0 ) brea
18810 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
18820 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a 20   if( i>nCol ){. 
18830 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69         /* At thi
18840 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77  s point, we know
18850 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a 5d   that azRowid[j]
18860 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65   is not the name
18870 20 6f 66 20 61 6e 79 0a 20 20 20 20 20 20 20 20   of any.        
18880 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c 75  ** ordinary colu
18890 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  mn in the table.
188a0 20 20 56 65 72 69 66 79 20 74 68 61 74 20 61 7a    Verify that az
188b0 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20 76 61  Rowid[j] is a va
188c0 6c 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  lid.        ** n
188d0 61 6d 65 20 66 6f 72 20 74 68 65 20 72 6f 77 69  ame for the rowi
188e0 64 20 62 65 66 6f 72 65 20 61 64 64 69 6e 67 20  d before adding 
188f0 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e 20  it to azCol[0]. 
18900 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20   WITHOUT ROWID. 
18910 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73         ** tables
18920 20 77 69 6c 6c 20 66 61 69 6c 20 74 68 69 73 20   will fail this 
18930 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20 20  last check */.  
18940 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18950 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
18960 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c 30  metadata(p->db,0
18970 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a 5d  ,zTab,azRowid[j]
18980 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20  ,0,0,0,0,0);.   
18990 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
189a0 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b 30  ITE_OK ) azCol[0
189b0 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b 0a  ] = azRowid[j];.
189c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
189d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
189e0 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c 3b  .  return azCol;
189f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c 65  .}../*.** Toggle
18a00 20 74 68 65 20 72 65 76 65 72 73 65 5f 75 6e 6f   the reverse_uno
18a10 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 20 73  rdered_selects s
18a20 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  etting..*/.stati
18a30 63 20 76 6f 69 64 20 74 6f 67 67 6c 65 53 65 6c  c void toggleSel
18a40 65 63 74 4f 72 64 65 72 28 73 71 6c 69 74 65 33  ectOrder(sqlite3
18a50 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74 65 33   *db){.  sqlite3
18a60 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
18a70 3b 0a 20 20 69 6e 74 20 69 53 65 74 74 69 6e 67  ;.  int iSetting
18a80 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 53 74   = 0;.  char zSt
18a90 6d 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74  mt[100];.  sqlit
18aa0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
18ab0 2c 20 22 50 52 41 47 4d 41 20 72 65 76 65 72 73  , "PRAGMA revers
18ac0 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65  e_unordered_sele
18ad0 63 74 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74  cts", -1, &pStmt
18ae0 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  , 0);.  if( sqli
18af0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
18b00 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
18b10 20 20 20 69 53 65 74 74 69 6e 67 20 3d 20 73 71     iSetting = sq
18b20 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
18b30 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  (pStmt, 0);.  }.
18b40 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
18b50 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c  ze(pStmt);.  sql
18b60 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
18b70 7a 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53 74  zeof(zStmt), zSt
18b80 6d 74 2c 0a 20 20 20 20 20 20 20 22 50 52 41 47  mt,.       "PRAG
18b90 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64  MA reverse_unord
18ba0 65 72 65 64 5f 73 65 6c 65 63 74 73 28 25 64 29  ered_selects(%d)
18bb0 22 2c 20 21 69 53 65 74 74 69 6e 67 29 3b 0a 20  ", !iSetting);. 
18bc0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
18bd0 2c 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20 30  , zStmt, 0, 0, 0
18be0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
18bf0 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 74 20   is a different 
18c00 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
18c10 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69 6e   used for dumpin
18c20 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
18c30 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63 65  ** Each row rece
18c40 69 76 65 64 20 62 79 20 74 68 69 73 20 63 61 6c  ived by this cal
18c50 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f  lback consists o
18c60 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c 0a  f a table name,.
18c70 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79 70  ** the table typ
18c80 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22 74  e ("index" or "t
18c90 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20 74  able") and SQL t
18ca0 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62  o create the tab
18cb0 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  le..** This rout
18cc0 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e 74  ine should print
18cd0 20 74 65 78 74 20 73 75 66 66 69 63 69 65 6e 74   text sufficient
18ce0 20 74 6f 20 72 65 63 72 65 61 74 65 20 74 68 65   to recreate the
18cf0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
18d00 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c 62  c int dump_callb
18d10 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ack(void *pArg, 
18d20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a  int nArg, char *
18d30 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  *azArg, char **a
18d40 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e 74  zNotUsed){.  int
18d50 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61   rc;.  const cha
18d60 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f 6e  r *zTable;.  con
18d70 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
18d80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
18d90 71 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ql;.  ShellState
18da0 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74   *p = (ShellStat
18db0 65 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e 55  e *)pArg;..  UNU
18dc0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 7a  SED_PARAMETER(az
18dd0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
18de0 6e 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72 67  nArg!=3 || azArg
18df0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
18e00 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67    zTable = azArg
18e10 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20 61  [0];.  zType = a
18e20 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20  zArg[1];.  zSql 
18e30 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20 69  = azArg[2];..  i
18e40 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c 65  f( strcmp(zTable
18e50 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  , "sqlite_sequen
18e60 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ce")==0 ){.    r
18e70 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
18e80 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73  , "DELETE FROM s
18e90 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c  qlite_sequence;\
18ea0 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n");.  }else if(
18eb0 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
18ec0 28 22 73 71 6c 69 74 65 5f 73 74 61 74 3f 22 2c  ("sqlite_stat?",
18ed0 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a 20   zTable)==0 ){. 
18ee0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
18ef0 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73  >out, "ANALYZE s
18f00 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22  qlite_master;\n"
18f10 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
18f20 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22  trncmp(zTable, "
18f30 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20  sqlite_", 7)==0 
18f40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
18f50 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
18f60 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45 41  ncmp(zSql, "CREA
18f70 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
18f80 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 20)==0 ){.   
18f90 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20 20   char *zIns;.   
18fa0 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62 6c   if( !p->writabl
18fb0 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  eSchema ){.     
18fc0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
18fd0 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74  ut, "PRAGMA writ
18fe0 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c  able_schema=ON;\
18ff0 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72  n");.      p->wr
19000 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 31  itableSchema = 1
19010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e 73  ;.    }.    zIns
19020 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
19030 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53 45  tf(.       "INSE
19040 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d  RT INTO sqlite_m
19050 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65 2c  aster(type,name,
19060 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61 67  tbl_name,rootpag
19070 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20 22  e,sql)".       "
19080 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c 27  VALUES('table','
19090 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27 29  %q','%q',0,'%q')
190a0 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62 6c  ;",.       zTabl
190b0 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c 29  e, zTable, zSql)
190c0 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
190d0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  f(p->out, "%s\n"
190e0 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71 6c  , zIns);.    sql
190f0 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29 3b  ite3_free(zIns);
19100 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
19110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e   }else{.    prin
19120 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f  tSchemaLine(p->o
19130 75 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22 29  ut, zSql, ";\n")
19140 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74 72  ;.  }..  if( str
19150 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62 6c  cmp(zType, "tabl
19160 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68  e")==0 ){.    Sh
19170 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74 3b  ellText sSelect;
19180 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73  .    ShellText s
19190 54 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72 20  Table;.    char 
191a0 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e 74  **azCol;.    int
191b0 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 61   i;.    char *sa
191c0 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20 20  vedDestTable;.  
191d0 20 20 69 6e 74 20 73 61 76 65 64 4d 6f 64 65 3b    int savedMode;
191e0 0a 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74 61  ..    azCol = ta
191f0 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 2c  bleColumnList(p,
19200 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66   zTable);.    if
19210 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  ( azCol==0 ){.  
19220 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20      p->nErr++;. 
19230 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
19240 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 77     }..    /* Alw
19250 61 79 73 20 71 75 6f 74 65 20 74 68 65 20 74 61  ays quote the ta
19260 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20 69  ble name, even i
19270 66 20 69 74 20 61 70 70 65 61 72 73 20 74 6f 20  f it appears to 
19280 62 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a 20  be pure ascii,. 
19290 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69 74     ** in case it
192a0 20 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20 45   is a keyword. E
192b0 78 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  x:  INSERT INTO 
192c0 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a 20  "table" ... */. 
192d0 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 54 61     initText(&sTa
192e0 62 6c 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  ble);.    append
192f0 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 7a 54  Text(&sTable, zT
19300 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28  able, quoteChar(
19310 7a 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f 2a  zTable));.    /*
19320 20 49 66 20 70 72 65 73 65 72 76 69 6e 67 20 74   If preserving t
19330 68 65 20 72 6f 77 69 64 2c 20 61 64 64 20 61 20  he rowid, add a 
19340 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74 65  column list afte
19350 72 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  r the table name
19360 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65  ..    ** In othe
19370 72 20 77 6f 72 64 73 3a 20 20 22 49 4e 53 45 52  r words:  "INSER
19380 54 20 49 4e 54 4f 20 74 61 62 28 72 6f 77 69 64  T INTO tab(rowid
19390 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c 55  ,a,b,c,...) VALU
193a0 45 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20  ES(...)".    ** 
193b0 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
193c0 73 75 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54  sual "INSERT INT
193d0 4f 20 74 61 62 20 56 41 4c 55 45 53 28 2e 2e 2e  O tab VALUES(...
193e0 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  )"..    */.    i
193f0 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20  f( azCol[0] ){. 
19400 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
19410 26 73 54 61 62 6c 65 2c 20 22 28 22 2c 20 30 29  &sTable, "(", 0)
19420 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  ;.      appendTe
19430 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f  xt(&sTable, azCo
19440 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  l[0], 0);.      
19450 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69  for(i=1; azCol[i
19460 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
19470 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61   appendText(&sTa
19480 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20  ble, ",", 0);.  
19490 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
194a0 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b  (&sTable, azCol[
194b0 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a  i], quoteChar(az
194c0 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20  Col[i]));.      
194d0 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  }.      appendTe
194e0 78 74 28 26 73 54 61 62 6c 65 2c 20 22 29 22 2c  xt(&sTable, ")",
194f0 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
19500 2f 2a 20 42 75 69 6c 64 20 61 6e 20 61 70 70 72  /* Build an appr
19510 6f 70 72 69 61 74 65 20 53 45 4c 45 43 54 20 73  opriate SELECT s
19520 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
19530 69 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65 63  initText(&sSelec
19540 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  t);.    appendTe
19550 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45  xt(&sSelect, "SE
19560 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20 20  LECT ", 0);.    
19570 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a  if( azCol[0] ){.
19580 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
19590 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c  (&sSelect, azCol
195a0 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  [0], 0);.      a
195b0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
195c0 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20  ct, ",", 0);.   
195d0 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20   }.    for(i=1; 
195e0 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  azCol[i]; i++){.
195f0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
19600 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c  (&sSelect, azCol
19610 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61  [i], quoteChar(a
19620 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20  zCol[i]));.     
19630 20 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d 20   if( azCol[i+1] 
19640 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ){.        appen
19650 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
19660 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ",", 0);.      }
19670 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 43  .    }.    freeC
19680 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29  olumnList(azCol)
19690 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
196a0 28 26 73 53 65 6c 65 63 74 2c 20 22 20 46 52 4f  (&sSelect, " FRO
196b0 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 61 70 70  M ", 0);.    app
196c0 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
196d0 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43  , zTable, quoteC
196e0 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a 20  har(zTable));.. 
196f0 20 20 20 73 61 76 65 64 44 65 73 74 54 61 62 6c     savedDestTabl
19700 65 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c  e = p->zDestTabl
19710 65 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f 64 65  e;.    savedMode
19720 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20   = p->mode;.    
19730 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  p->zDestTable = 
19740 73 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70 2d  sTable.z;.    p-
19750 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64 65  >mode = p->cMode
19760 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a   = MODE_Insert;.
19770 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65      rc = shell_e
19780 78 65 63 28 70 2c 20 73 53 65 6c 65 63 74 2e 7a  xec(p, sSelect.z
19790 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28 72  , 0);.    if( (r
197a0 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
197b0 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20  CORRUPT ){.     
197c0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
197d0 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52  ut, "/****** COR
197e0 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a  RUPTION ERROR **
197f0 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20  *****/\n");.    
19800 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72    toggleSelectOr
19810 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  der(p->db);.    
19820 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c 20    shell_exec(p, 
19830 73 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a 20  sSelect.z, 0);. 
19840 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63       toggleSelec
19850 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20  tOrder(p->db);. 
19860 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65 73     }.    p->zDes
19870 74 54 61 62 6c 65 20 3d 20 73 61 76 65 64 44 65  tTable = savedDe
19880 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d 3e  stTable;.    p->
19890 6d 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f 64 65  mode = savedMode
198a0 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26  ;.    freeText(&
198b0 73 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 65  sTable);.    fre
198c0 65 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b  eText(&sSelect);
198d0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 70 2d  .    if( rc ) p-
198e0 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72  >nErr++;.  }.  r
198f0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
19900 2a 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55  * Run zQuery.  U
19910 73 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b  se dump_callback
19920 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61  () as the callba
19930 63 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68  ck routine so th
19940 61 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  at.** the conten
19950 74 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  ts of the query 
19960 61 72 65 20 6f 75 74 70 75 74 20 61 73 20 53 51  are output as SQ
19970 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  L statements..**
19980 0a 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61 20  .** If we get a 
19990 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
199a0 72 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20  rror, rerun the 
199b0 71 75 65 72 79 20 61 66 74 65 72 20 61 70 70 65  query after appe
199c0 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20  nding.** "ORDER 
199d0 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 74  BY rowid DESC" t
199e0 6f 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74  o the end..*/.st
199f0 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68  atic int run_sch
19a00 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a  ema_dump_query(.
19a10 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c    ShellState *p,
19a20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
19a30 51 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72  Query.){.  int r
19a40 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  c;.  char *zErr 
19a50 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
19a60 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
19a70 7a 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61 6c  zQuery, dump_cal
19a80 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29  lback, p, &zErr)
19a90 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
19aa0 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20  TE_CORRUPT ){.  
19ab0 20 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20    char *zQ2;.   
19ac0 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65   int len = strle
19ad0 6e 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20 20  n30(zQuery);.   
19ae0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
19af0 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52  ut, "/****** COR
19b00 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a  RUPTION ERROR **
19b10 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20  *****/\n");.    
19b20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
19b30 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
19b40 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 25  >out, "/****** %
19b50 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45  s ******/\n", zE
19b60 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rr);.      sqlit
19b70 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
19b80 20 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a 20       zErr = 0;. 
19b90 20 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20 6d     }.    zQ2 = m
19ba0 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20 29  alloc( len+100 )
19bb0 3b 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d 30  ;.    if( zQ2==0
19bc0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
19bd0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
19be0 74 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32 2c  tf(len+100, zQ2,
19bf0 20 22 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f   "%s ORDER BY ro
19c00 77 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72  wid DESC", zQuer
19c10 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  y);.    rc = sql
19c20 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
19c30 20 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62   zQ2, dump_callb
19c40 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a  ack, p, &zErr);.
19c50 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
19c60 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
19c70 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a  p->out, "/******
19c80 20 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a 2a   ERROR: %s *****
19c90 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20  */\n", zErr);.  
19ca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
19cb0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
19cc0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  PT;.    }.    sq
19cd0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29  lite3_free(zErr)
19ce0 3b 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29 3b  ;.    free(zQ2);
19cf0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19d00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20  ;.}../*.** Text 
19d10 6f 66 20 68 65 6c 70 20 6d 65 73 73 61 67 65 73  of help messages
19d20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 65 6c 70  ..**.** The help
19d30 20 74 65 78 74 20 66 6f 72 20 65 61 63 68 20 69   text for each i
19d40 6e 64 69 76 69 64 75 61 6c 20 63 6f 6d 6d 61 6e  ndividual comman
19d50 64 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20  d begins with a 
19d60 6c 69 6e 65 20 74 68 61 74 20 73 74 61 72 74 73  line that starts
19d70 0a 2a 2a 20 77 69 74 68 20 22 2e 22 2e 20 20 53  .** with ".".  S
19d80 75 62 73 65 71 75 65 6e 74 20 6c 69 6e 65 73 20  ubsequent lines 
19d90 61 72 65 20 73 75 70 70 6c 69 6d 65 6e 74 61 6c  are supplimental
19da0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
19db0 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62  .** There must b
19dc0 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 70  e two or more sp
19dd0 61 63 65 73 20 62 65 74 77 65 65 6e 20 74 68 65  aces between the
19de0 20 65 6e 64 20 6f 66 20 74 68 65 20 63 6f 6d 6d   end of the comm
19df0 61 6e 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 73  and and the.** s
19e00 74 61 72 74 20 6f 66 20 74 68 65 20 64 65 73 63  tart of the desc
19e10 72 69 70 74 69 6f 6e 20 6f 66 20 77 68 61 74 20  ription of what 
19e20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 20 64 6f 65  that command doe
19e30 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
19e40 73 74 20 63 68 61 72 20 2a 28 61 7a 48 65 6c 70  st char *(azHelp
19e50 5b 5d 29 20 3d 20 7b 0a 23 69 66 20 64 65 66 69  []) = {.#if defi
19e60 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f  ned(SQLITE_HAVE_
19e70 5a 4c 49 42 29 20 26 26 20 21 64 65 66 69 6e 65  ZLIB) && !define
19e80 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
19e90 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 22 2e  RTUALTABLE).  ".
19ea0 61 72 63 68 69 76 65 20 2e 2e 2e 20 20 20 20 20  archive ...     
19eb0 20 20 20 20 20 20 20 20 4d 61 6e 61 67 65 20 53          Manage S
19ec0 51 4c 20 61 72 63 68 69 76 65 73 22 2c 0a 20 20  QL archives",.  
19ed0 22 20 20 20 45 61 63 68 20 63 6f 6d 6d 61 6e 64  "   Each command
19ee0 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74   must have exact
19ef0 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  ly one of the fo
19f00 6c 6c 6f 77 69 6e 67 20 6f 70 74 69 6f 6e 73 3a  llowing options:
19f10 22 2c 0a 20 20 22 20 20 20 20 20 2d 63 2c 20 2d  ",.  "     -c, -
19f20 2d 63 72 65 61 74 65 20 20 20 20 20 20 20 20 20  -create         
19f30 20 20 20 20 20 20 43 72 65 61 74 65 20 61 20 6e        Create a n
19f40 65 77 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22  ew archive",.  "
19f50 20 20 20 20 20 2d 75 2c 20 2d 2d 75 70 64 61 74       -u, --updat
19f60 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
19f70 41 64 64 20 66 69 6c 65 73 20 6f 72 20 75 70 64  Add files or upd
19f80 61 74 65 20 66 69 6c 65 73 20 77 69 74 68 20 6e  ate files with n
19f90 65 77 65 72 20 6d 74 69 6d 65 22 2c 0a 20 20 22  ewer mtime",.  "
19fa0 20 20 20 20 20 2d 69 2c 20 2d 2d 69 6e 73 65 72       -i, --inser
19fb0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
19fc0 4c 69 6b 65 20 2d 75 20 62 75 74 20 61 6c 77 61  Like -u but alwa
19fd0 79 73 20 61 64 64 20 65 76 65 6e 20 69 66 20 6d  ys add even if m
19fe0 74 69 6d 65 20 75 6e 63 68 61 6e 67 65 64 22 2c  time unchanged",
19ff0 0a 20 20 22 20 20 20 20 20 2d 74 2c 20 2d 2d 6c  .  "     -t, --l
1a000 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
1a010 20 20 20 20 4c 69 73 74 20 63 6f 6e 74 65 6e 74      List content
1a020 73 20 6f 66 20 61 72 63 68 69 76 65 22 2c 0a 20  s of archive",. 
1a030 20 22 20 20 20 20 20 2d 78 2c 20 2d 2d 65 78 74   "     -x, --ext
1a040 72 61 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ract            
1a050 20 20 45 78 74 72 61 63 74 20 66 69 6c 65 73 20    Extract files 
1a060 66 72 6f 6d 20 61 72 63 68 69 76 65 22 2c 0a 20  from archive",. 
1a070 20 22 20 20 20 4f 70 74 69 6f 6e 61 6c 20 61 72   "   Optional ar
1a080 67 75 6d 65 6e 74 73 3a 22 2c 0a 20 20 22 20 20  guments:",.  "  
1a090 20 20 20 2d 76 2c 20 2d 2d 76 65 72 62 6f 73 65     -v, --verbose
1a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 72                Pr
1a0b0 69 6e 74 20 65 61 63 68 20 66 69 6c 65 6e 61 6d  int each filenam
1a0c0 65 20 61 73 20 69 74 20 69 73 20 70 72 6f 63 65  e as it is proce
1a0d0 73 73 65 64 22 2c 0a 20 20 22 20 20 20 20 20 2d  ssed",.  "     -
1a0e0 66 20 46 49 4c 45 2c 20 2d 2d 66 69 6c 65 20 46  f FILE, --file F
1a0f0 49 4c 45 20 20 20 20 20 20 20 4f 70 65 72 61 74  ILE       Operat
1a100 65 20 6f 6e 20 61 72 63 68 69 76 65 20 46 49 4c  e on archive FIL
1a110 45 20 28 64 65 66 61 75 6c 74 20 69 73 20 63 75  E (default is cu
1a120 72 72 65 6e 74 20 64 62 29 22 2c 0a 20 20 22 20  rrent db)",.  " 
1a130 20 20 20 20 2d 61 20 46 49 4c 45 2c 20 2d 2d 61      -a FILE, --a
1a140 70 70 65 6e 64 20 46 49 4c 45 20 20 20 20 20 4f  ppend FILE     O
1a150 70 65 72 61 74 65 20 6f 6e 20 46 49 4c 45 20 6f  perate on FILE o
1a160 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20  pened using the 
1a170 61 70 6e 64 76 66 73 20 56 46 53 22 2c 0a 20 20  apndvfs VFS",.  
1a180 22 20 20 20 20 20 2d 43 20 44 49 52 2c 20 2d 2d  "     -C DIR, --
1a190 64 69 72 65 63 74 6f 72 79 20 44 49 52 20 20 20  directory DIR   
1a1a0 20 43 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63   Change to direc
1a1b0 74 6f 72 79 20 44 49 52 20 74 6f 20 72 65 61 64  tory DIR to read
1a1c0 2f 65 78 74 72 61 63 74 20 66 69 6c 65 73 22 2c  /extract files",
1a1d0 0a 20 20 22 20 20 20 20 20 2d 6e 2c 20 2d 2d 64  .  "     -n, --d
1a1e0 72 79 72 75 6e 20 20 20 20 20 20 20 20 20 20 20  ryrun           
1a1f0 20 20 20 20 53 68 6f 77 20 74 68 65 20 53 51 4c      Show the SQL
1a200 20 74 68 61 74 20 77 6f 75 6c 64 20 68 61 76 65   that would have
1a210 20 6f 63 63 75 72 72 65 64 22 2c 0a 20 20 22 20   occurred",.  " 
1a220 20 20 45 78 61 6d 70 6c 65 73 3a 22 2c 0a 20 20    Examples:",.  
1a230 22 20 20 20 20 20 2e 61 72 20 2d 63 66 20 61 72  "     .ar -cf ar
1a240 63 68 69 76 65 2e 73 61 72 20 66 6f 6f 20 62 61  chive.sar foo ba
1a250 72 20 20 23 20 43 72 65 61 74 65 20 61 72 63 68  r  # Create arch
1a260 69 76 65 2e 73 61 72 20 66 72 6f 6d 20 66 69 6c  ive.sar from fil
1a270 65 73 20 66 6f 6f 20 61 6e 64 20 62 61 72 22 2c  es foo and bar",
1a280 0a 20 20 22 20 20 20 20 20 2e 61 72 20 2d 74 66  .  "     .ar -tf
1a290 20 61 72 63 68 69 76 65 2e 73 61 72 20 20 20 20   archive.sar    
1a2a0 20 20 20 20 20 20 23 20 4c 69 73 74 20 6d 65 6d        # List mem
1a2b0 62 65 72 73 20 6f 66 20 61 72 63 68 69 76 65 2e  bers of archive.
1a2c0 73 61 72 22 2c 0a 20 20 22 20 20 20 20 20 2e 61  sar",.  "     .a
1a2d0 72 20 2d 78 76 66 20 61 72 63 68 69 76 65 2e 73  r -xvf archive.s
1a2e0 61 72 20 20 20 20 20 20 20 20 20 23 20 56 65 72  ar         # Ver
1a2f0 62 6f 73 65 6c 79 20 65 78 74 72 61 63 74 20 66  bosely extract f
1a300 69 6c 65 73 20 66 72 6f 6d 20 61 72 63 68 69 76  iles from archiv
1a310 65 2e 73 61 72 22 2c 0a 20 20 22 20 20 20 53 65  e.sar",.  "   Se
1a320 65 20 61 6c 73 6f 3a 22 2c 0a 20 20 22 20 20 20  e also:",.  "   
1a330 20 20 20 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65     http://sqlite
1a340 2e 6f 72 67 2f 63 6c 69 2e 68 74 6d 6c 23 73 71  .org/cli.html#sq
1a350 6c 61 72 5f 61 72 63 68 69 76 65 5f 73 75 70 70  lar_archive_supp
1a360 6f 72 74 22 2c 0a 23 65 6e 64 69 66 0a 23 69 66  ort",.#endif.#if
1a370 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a380 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
1a390 20 22 2e 61 75 74 68 20 4f 4e 7c 4f 46 46 20 20   ".auth ON|OFF  
1a3a0 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20             Show 
1a3b0 61 75 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62  authorizer callb
1a3c0 61 63 6b 73 22 2c 0a 23 65 6e 64 69 66 0a 20 20  acks",.#endif.  
1a3d0 22 2e 62 61 63 6b 75 70 20 3f 44 42 3f 20 46 49  ".backup ?DB? FI
1a3e0 4c 45 20 20 20 20 20 20 20 20 42 61 63 6b 75 70  LE        Backup
1a3f0 20 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22 6d   DB (default \"m
1a400 61 69 6e 5c 22 29 20 74 6f 20 46 49 4c 45 22 2c  ain\") to FILE",
1a410 0a 20 20 22 20 20 20 20 20 20 20 2d 2d 61 70 70  .  "       --app
1a420 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 55  end            U
1a430 73 65 20 74 68 65 20 61 70 70 65 6e 64 76 66 73  se the appendvfs
1a440 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 2d 61  ",.  "       --a
1a450 73 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  sync            
1a460 20 57 72 69 74 65 20 74 6f 20 46 49 4c 45 20 77   Write to FILE w
1a470 69 74 68 6f 75 74 20 61 20 6a 6f 75 72 6e 61 6c  ithout a journal
1a480 20 61 6e 64 20 77 69 74 68 6f 75 74 20 66 73 79   and without fsy
1a490 6e 63 28 29 22 2c 0a 20 20 22 2e 62 61 69 6c 20  nc()",.  ".bail 
1a4a0 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20  on|off          
1a4b0 20 20 20 53 74 6f 70 20 61 66 74 65 72 20 68 69     Stop after hi
1a4c0 74 74 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 20  tting an error. 
1a4d0 20 44 65 66 61 75 6c 74 20 4f 46 46 22 2c 0a 20   Default OFF",. 
1a4e0 20 22 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66   ".binary on|off
1a4f0 20 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20             Turn 
1a500 62 69 6e 61 72 79 20 6f 75 74 70 75 74 20 6f 6e  binary output on
1a510 20 6f 72 20 6f 66 66 2e 20 20 44 65 66 61 75 6c   or off.  Defaul
1a520 74 20 4f 46 46 22 2c 0a 20 20 22 2e 63 64 20 44  t OFF",.  ".cd D
1a530 49 52 45 43 54 4f 52 59 20 20 20 20 20 20 20 20  IRECTORY        
1a540 20 20 20 20 43 68 61 6e 67 65 20 74 68 65 20 77      Change the w
1a550 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
1a560 20 74 6f 20 44 49 52 45 43 54 4f 52 59 22 2c 0a   to DIRECTORY",.
1a570 20 20 22 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f    ".changes on|o
1a580 66 66 20 20 20 20 20 20 20 20 20 20 53 68 6f 77  ff          Show
1a590 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1a5a0 63 68 61 6e 67 65 64 20 62 79 20 53 51 4c 22 2c  changed by SQL",
1a5b0 0a 20 20 22 2e 63 68 65 63 6b 20 47 4c 4f 42 20  .  ".check GLOB 
1a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 46 61 69               Fai
1a5d0 6c 20 69 66 20 6f 75 74 70 75 74 20 73 69 6e 63  l if output sinc
1a5e0 65 20 2e 74 65 73 74 63 61 73 65 20 64 6f 65 73  e .testcase does
1a5f0 20 6e 6f 74 20 6d 61 74 63 68 22 2c 0a 20 20 22   not match",.  "
1a600 2e 63 6c 6f 6e 65 20 4e 45 57 44 42 20 20 20 20  .clone NEWDB    
1a610 20 20 20 20 20 20 20 20 20 43 6c 6f 6e 65 20 64           Clone d
1a620 61 74 61 20 69 6e 74 6f 20 4e 45 57 44 42 20 66  ata into NEWDB f
1a630 72 6f 6d 20 74 68 65 20 65 78 69 73 74 69 6e 67  rom the existing
1a640 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 22 2e   database",.  ".
1a650 64 61 74 61 62 61 73 65 73 20 20 20 20 20 20 20  databases       
1a660 20 20 20 20 20 20 20 20 4c 69 73 74 20 6e 61 6d          List nam
1a670 65 73 20 61 6e 64 20 66 69 6c 65 73 20 6f 66 20  es and files of 
1a680 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
1a690 65 73 22 2c 0a 20 20 22 2e 64 62 63 6f 6e 66 69  es",.  ".dbconfi
1a6a0 67 20 3f 6f 70 3f 20 3f 76 61 6c 3f 20 20 20 20  g ?op? ?val?    
1a6b0 20 4c 69 73 74 20 6f 72 20 63 68 61 6e 67 65 20   List or change 
1a6c0 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
1a6d0 67 28 29 20 6f 70 74 69 6f 6e 73 22 2c 0a 20 20  g() options",.  
1a6e0 22 2e 64 62 69 6e 66 6f 20 3f 44 42 3f 20 20 20  ".dbinfo ?DB?   
1a6f0 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 73            Show s
1a700 74 61 74 75 73 20 69 6e 66 6f 72 6d 61 74 69 6f  tatus informatio
1a710 6e 20 61 62 6f 75 74 20 74 68 65 20 64 61 74 61  n about the data
1a720 62 61 73 65 22 2c 0a 20 20 22 2e 64 75 6d 70 20  base",.  ".dump 
1a730 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20 20 20 20 20  ?TABLE? ...     
1a740 20 20 20 52 65 6e 64 65 72 20 61 6c 6c 20 64 61     Render all da
1a750 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 20 61  tabase content a
1a760 73 20 53 51 4c 22 2c 0a 20 20 22 20 20 20 4f 70  s SQL",.  "   Op
1a770 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20  tions:",.  "    
1a780 20 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f 77 69   --preserve-rowi
1a790 64 73 20 20 20 20 20 20 49 6e 63 6c 75 64 65 20  ds      Include 
1a7a0 52 4f 57 49 44 20 76 61 6c 75 65 73 20 69 6e 20  ROWID values in 
1a7b0 74 68 65 20 6f 75 74 70 75 74 22 2c 0a 20 20 22  the output",.  "
1a7c0 20 20 20 20 20 2d 2d 6e 65 77 6c 69 6e 65 73 20       --newlines 
1a7d0 20 20 20 20 20 20 20 20 20 20 20 20 41 6c 6c 6f              Allo
1a7e0 77 20 75 6e 65 73 63 61 70 65 64 20 6e 65 77 6c  w unescaped newl
1a7f0 69 6e 65 20 63 68 61 72 61 63 74 65 72 73 20 69  ine characters i
1a800 6e 20 6f 75 74 70 75 74 22 2c 0a 20 20 22 20 20  n output",.  "  
1a810 20 54 41 42 4c 45 20 69 73 20 4c 49 4b 45 20 70   TABLE is LIKE p
1a820 61 74 74 65 72 6e 20 66 6f 72 20 74 68 65 20 74  attern for the t
1a830 61 62 6c 65 73 20 74 6f 20 64 75 6d 70 22 2c 0a  ables to dump",.
1a840 20 20 22 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 20    ".echo on|off 
1a850 20 20 20 20 20 20 20 20 20 20 20 20 54 75 72 6e              Turn
1a860 20 63 6f 6d 6d 61 6e 64 20 65 63 68 6f 20 6f 6e   command echo on
1a870 20 6f 72 20 6f 66 66 22 2c 0a 20 20 22 2e 65 71   or off",.  ".eq
1a880 70 20 6f 6e 7c 6f 66 66 7c 66 75 6c 6c 7c 2e 2e  p on|off|full|..
1a890 2e 20 20 20 20 20 45 6e 61 62 6c 65 20 6f 72 20  .     Enable or 
1a8a0 64 69 73 61 62 6c 65 20 61 75 74 6f 6d 61 74 69  disable automati
1a8b0 63 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  c EXPLAIN QUERY 
1a8c0 50 4c 41 4e 22 2c 0a 20 20 22 20 20 20 4f 74 68  PLAN",.  "   Oth
1a8d0 65 72 20 4d 6f 64 65 73 3a 22 2c 0a 23 69 66 64  er Modes:",.#ifd
1a8e0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1a8f0 20 20 22 20 20 20 20 20 20 74 65 73 74 20 20 20    "      test   
1a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1a910 68 6f 77 20 72 61 77 20 45 58 50 4c 41 49 4e 20  how raw EXPLAIN 
1a920 51 55 45 52 59 20 50 4c 41 4e 20 6f 75 74 70 75  QUERY PLAN outpu
1a930 74 22 2c 0a 20 20 22 20 20 20 20 20 20 74 72 61  t",.  "      tra
1a940 63 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ce              
1a950 20 20 20 4c 69 6b 65 20 5c 22 66 75 6c 6c 5c 22     Like \"full\"
1a960 20 62 75 74 20 61 6c 73 6f 20 65 6e 61 62 6c 65   but also enable
1a970 20 5c 22 50 52 41 47 4d 41 20 76 64 62 65 5f 74   \"PRAGMA vdbe_t
1a980 72 61 63 65 5c 22 22 2c 0a 23 65 6e 64 69 66 0a  race\"",.#endif.
1a990 20 20 22 20 20 20 20 20 20 74 72 69 67 67 65 72    "      trigger
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
1a9b0 69 6b 65 20 5c 22 66 75 6c 6c 5c 22 20 62 75 74  ike \"full\" but
1a9c0 20 61 6c 73 6f 20 73 68 6f 77 20 74 72 69 67 67   also show trigg
1a9d0 65 72 20 62 79 74 65 63 6f 64 65 22 2c 0a 20 20  er bytecode",.  
1a9e0 22 2e 65 78 63 65 6c 20 20 20 20 20 20 20 20 20  ".excel         
1a9f0 20 20 20 20 20 20 20 20 20 20 44 69 73 70 6c 61            Displa
1aa00 79 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  y the output of 
1aa10 6e 65 78 74 20 63 6f 6d 6d 61 6e 64 20 69 6e 20  next command in 
1aa20 61 20 73 70 72 65 61 64 73 68 65 65 74 22 2c 0a  a spreadsheet",.
1aa30 20 20 22 2e 65 78 69 74 20 3f 43 4f 44 45 3f 20    ".exit ?CODE? 
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 45 78 69 74              Exit
1aa50 20 74 68 69 73 20 70 72 6f 67 72 61 6d 20 77 69   this program wi
1aa60 74 68 20 72 65 74 75 72 6e 2d 63 6f 64 65 20 43  th return-code C
1aa70 4f 44 45 22 2c 0a 20 20 22 2e 65 78 70 65 72 74  ODE",.  ".expert
1aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa90 20 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 2e 20    EXPERIMENTAL. 
1aaa0 53 75 67 67 65 73 74 20 69 6e 64 65 78 65 73 20  Suggest indexes 
1aab0 66 6f 72 20 73 70 65 63 69 66 69 65 64 20 71 75  for specified qu
1aac0 65 72 69 65 73 22 2c 0a 2f 2a 20 42 65 63 61 75  eries",./* Becau
1aad0 73 65 20 65 78 70 6c 61 69 6e 20 6d 6f 64 65 20  se explain mode 
1aae0 63 6f 6d 65 73 20 6f 6e 20 61 75 74 6f 6d 61 74  comes on automat
1aaf0 69 63 61 6c 6c 79 20 6e 6f 77 2c 20 74 68 65 20  ically now, the 
1ab00 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f 64 65 0a  ".explain" mode.
1ab10 2a 2a 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ** is removed fr
1ab20 6f 6d 20 74 68 65 20 68 65 6c 70 20 73 63 72 65  om the help scre
1ab30 65 6e 2e 20 20 49 74 20 69 73 20 73 74 69 6c 6c  en.  It is still
1ab40 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 6c   supported for l
1ab50 65 67 61 63 79 2c 20 68 6f 77 65 76 65 72 20 2a  egacy, however *
1ab60 2f 0a 2f 2a 22 2e 65 78 70 6c 61 69 6e 20 3f 6f  /./*".explain ?o
1ab70 6e 7c 6f 66 66 7c 61 75 74 6f 3f 20 20 20 54 75  n|off|auto?   Tu
1ab80 72 6e 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75  rn EXPLAIN outpu
1ab90 74 20 6d 6f 64 65 20 6f 6e 20 6f 72 20 6f 66 66  t mode on or off
1aba0 20 6f 72 20 74 6f 20 61 75 74 6f 6d 61 74 69 63   or to automatic
1abb0 22 2c 2a 2f 0a 20 20 22 2e 66 75 6c 6c 73 63 68  ",*/.  ".fullsch
1abc0 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20 20  ema ?--indent?  
1abd0 20 53 68 6f 77 20 73 63 68 65 6d 61 20 61 6e 64   Show schema and
1abe0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1abf0 73 71 6c 69 74 65 5f 73 74 61 74 20 74 61 62 6c  sqlite_stat tabl
1ac00 65 73 22 2c 0a 20 20 22 2e 68 65 61 64 65 72 73  es",.  ".headers
1ac10 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20   on|off         
1ac20 20 54 75 72 6e 20 64 69 73 70 6c 61 79 20 6f 66   Turn display of
1ac30 20 68 65 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f   headers on or o
1ac40 66 66 22 2c 0a 20 20 22 2e 68 65 6c 70 20 3f 2d  ff",.  ".help ?-
1ac50 61 6c 6c 3f 20 3f 50 41 54 54 45 52 4e 3f 20 20  all? ?PATTERN?  
1ac60 20 53 68 6f 77 20 68 65 6c 70 20 74 65 78 74 20   Show help text 
1ac70 66 6f 72 20 50 41 54 54 45 52 4e 22 2c 0a 20 20  for PATTERN",.  
1ac80 22 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41  ".import FILE TA
1ac90 42 4c 45 20 20 20 20 20 20 20 49 6d 70 6f 72 74  BLE       Import
1aca0 20 64 61 74 61 20 66 72 6f 6d 20 46 49 4c 45 20   data from FILE 
1acb0 69 6e 74 6f 20 54 41 42 4c 45 22 2c 0a 23 69 66  into TABLE",.#if
1acc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1acd0 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 0a 20 20  _TEST_CONTROL.  
1ace0 22 2e 69 6d 70 6f 73 74 65 72 20 49 4e 44 45 58  ".imposter INDEX
1acf0 20 54 41 42 4c 45 20 20 20 20 43 72 65 61 74 65   TABLE    Create
1ad00 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
1ad10 54 41 42 4c 45 20 6f 6e 20 69 6e 64 65 78 20 49  TABLE on index I
1ad20 4e 44 45 58 22 2c 0a 23 65 6e 64 69 66 0a 20 20  NDEX",.#endif.  
1ad30 22 2e 69 6e 64 65 78 65 73 20 3f 54 41 42 4c 45  ".indexes ?TABLE
1ad40 3f 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 6e  ?         Show n
1ad50 61 6d 65 73 20 6f 66 20 69 6e 64 65 78 65 73 22  ames of indexes"
1ad60 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ,.  "           
1ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad80 49 66 20 54 41 42 4c 45 20 69 73 20 73 70 65 63  If TABLE is spec
1ad90 69 66 69 65 64 2c 20 6f 6e 6c 79 20 73 68 6f 77  ified, only show
1ada0 20 69 6e 64 65 78 65 73 20 66 6f 72 22 2c 0a 20   indexes for",. 
1adb0 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
1adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62               tab
1add0 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 54 41 42  les matching TAB
1ade0 4c 45 20 75 73 69 6e 67 20 74 68 65 20 4c 49 4b  LE using the LIK
1adf0 45 20 6f 70 65 72 61 74 6f 72 2e 22 2c 0a 23 69  E operator.",.#i
1ae00 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1ae10 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 22 2e 69  LE_IOTRACE.  ".i
1ae20 6f 74 72 61 63 65 20 46 49 4c 45 20 20 20 20 20  otrace FILE     
1ae30 20 20 20 20 20 20 20 45 6e 61 62 6c 65 20 49 2f         Enable I/
1ae40 4f 20 64 69 61 67 6e 6f 73 74 69 63 20 6c 6f 67  O diagnostic log
1ae50 67 69 6e 67 20 74 6f 20 46 49 4c 45 22 2c 0a 23  ging to FILE",.#
1ae60 65 6e 64 69 66 0a 20 20 22 2e 6c 69 6d 69 74 20  endif.  ".limit 
1ae70 3f 4c 49 4d 49 54 3f 20 3f 56 41 4c 3f 20 20 20  ?LIMIT? ?VAL?   
1ae80 20 20 44 69 73 70 6c 61 79 20 6f 72 20 63 68 61    Display or cha
1ae90 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
1aea0 20 61 6e 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54   an SQLITE_LIMIT
1aeb0 22 2c 0a 20 20 22 2e 6c 69 6e 74 20 4f 50 54 49  ",.  ".lint OPTI
1aec0 4f 4e 53 20 20 20 20 20 20 20 20 20 20 20 20 52  ONS            R
1aed0 65 70 6f 72 74 20 70 6f 74 65 6e 74 69 61 6c 20  eport potential 
1aee0 73 63 68 65 6d 61 20 69 73 73 75 65 73 2e 22 2c  schema issues.",
1aef0 0a 20 20 22 20 20 20 20 20 4f 70 74 69 6f 6e 73  .  "     Options
1af00 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 66  :",.  "        f
1af10 6b 65 79 2d 69 6e 64 65 78 65 73 20 20 20 20 20  key-indexes     
1af20 46 69 6e 64 20 6d 69 73 73 69 6e 67 20 66 6f 72  Find missing for
1af30 65 69 67 6e 20 6b 65 79 20 69 6e 64 65 78 65 73  eign key indexes
1af40 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ",.#ifndef SQLIT
1af50 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
1af60 4e 53 49 4f 4e 0a 20 20 22 2e 6c 6f 61 64 20 46  NSION.  ".load F
1af70 49 4c 45 20 3f 45 4e 54 52 59 3f 20 20 20 20 20  ILE ?ENTRY?     
1af80 20 20 4c 6f 61 64 20 61 6e 20 65 78 74 65 6e 73    Load an extens
1af90 69 6f 6e 20 6c 69 62 72 61 72 79 22 2c 0a 23 65  ion library",.#e
1afa0 6e 64 69 66 0a 20 20 22 2e 6c 6f 67 20 46 49 4c  ndif.  ".log FIL
1afb0 45 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 20  E|off           
1afc0 20 54 75 72 6e 20 6c 6f 67 67 69 6e 67 20 6f 6e   Turn logging on
1afd0 20 6f 72 20 6f 66 66 2e 20 20 46 49 4c 45 20 63   or off.  FILE c
1afe0 61 6e 20 62 65 20 73 74 64 65 72 72 2f 73 74 64  an be stderr/std
1aff0 6f 75 74 22 2c 0a 20 20 22 2e 6d 6f 64 65 20 4d  out",.  ".mode M
1b000 4f 44 45 20 3f 54 41 42 4c 45 3f 20 20 20 20 20  ODE ?TABLE?     
1b010 20 20 53 65 74 20 6f 75 74 70 75 74 20 6d 6f 64    Set output mod
1b020 65 22 2c 0a 20 20 22 20 20 20 4d 4f 44 45 20 69  e",.  "   MODE i
1b030 73 20 6f 6e 65 20 6f 66 3a 22 2c 0a 20 20 22 20  s one of:",.  " 
1b040 20 20 20 20 61 73 63 69 69 20 20 20 20 43 6f 6c      ascii    Col
1b050 75 6d 6e 73 2f 72 6f 77 73 20 64 65 6c 69 6d 69  umns/rows delimi
1b060 74 65 64 20 62 79 20 30 78 31 46 20 61 6e 64 20  ted by 0x1F and 
1b070 30 78 31 45 22 2c 0a 20 20 22 20 20 20 20 20 63  0x1E",.  "     c
1b080 73 76 20 20 20 20 20 20 43 6f 6d 6d 61 2d 73 65  sv      Comma-se
1b090 70 61 72 61 74 65 64 20 76 61 6c 75 65 73 22 2c  parated values",
1b0a0 0a 20 20 22 20 20 20 20 20 63 6f 6c 75 6d 6e 20  .  "     column 
1b0b0 20 20 4c 65 66 74 2d 61 6c 69 67 6e 65 64 20 63    Left-aligned c
1b0c0 6f 6c 75 6d 6e 73 2e 20 20 28 53 65 65 20 2e 77  olumns.  (See .w
1b0d0 69 64 74 68 29 22 2c 0a 20 20 22 20 20 20 20 20  idth)",.  "     
1b0e0 68 74 6d 6c 20 20 20 20 20 48 54 4d 4c 20 3c 74  html     HTML <t
1b0f0 61 62 6c 65 3e 20 63 6f 64 65 22 2c 0a 20 20 22  able> code",.  "
1b100 20 20 20 20 20 69 6e 73 65 72 74 20 20 20 53 51       insert   SQ
1b110 4c 20 69 6e 73 65 72 74 20 73 74 61 74 65 6d 65  L insert stateme
1b120 6e 74 73 20 66 6f 72 20 54 41 42 4c 45 22 2c 0a  nts for TABLE",.
1b130 20 20 22 20 20 20 20 20 6c 69 6e 65 20 20 20 20    "     line    
1b140 20 4f 6e 65 20 76 61 6c 75 65 20 70 65 72 20 6c   One value per l
1b150 69 6e 65 22 2c 0a 20 20 22 20 20 20 20 20 6c 69  ine",.  "     li
1b160 73 74 20 20 20 20 20 56 61 6c 75 65 73 20 64 65  st     Values de
1b170 6c 69 6d 69 74 65 64 20 62 79 20 5c 22 7c 5c 22  limited by \"|\"
1b180 22 2c 0a 20 20 22 20 20 20 20 20 71 75 6f 74 65  ",.  "     quote
1b190 20 20 20 20 45 73 63 61 70 65 20 61 6e 73 77 65      Escape answe
1b1a0 72 73 20 61 73 20 66 6f 72 20 53 51 4c 22 2c 0a  rs as for SQL",.
1b1b0 20 20 22 20 20 20 20 20 74 61 62 73 20 20 20 20    "     tabs    
1b1c0 20 54 61 62 2d 73 65 70 61 72 61 74 65 64 20 76   Tab-separated v
1b1d0 61 6c 75 65 73 22 2c 0a 20 20 22 20 20 20 20 20  alues",.  "     
1b1e0 74 63 6c 20 20 20 20 20 20 54 43 4c 20 6c 69 73  tcl      TCL lis
1b1f0 74 20 65 6c 65 6d 65 6e 74 73 22 2c 0a 20 20 22  t elements",.  "
1b200 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52 49 4e  .nullvalue STRIN
1b210 47 20 20 20 20 20 20 20 20 55 73 65 20 53 54 52  G        Use STR
1b220 49 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  ING in place of 
1b230 4e 55 4c 4c 20 76 61 6c 75 65 73 22 2c 0a 20 20  NULL values",.  
1b240 22 2e 6f 6e 63 65 20 28 2d 65 7c 2d 78 7c 46 49  ".once (-e|-x|FI
1b250 4c 45 29 20 20 20 20 20 20 20 4f 75 74 70 75 74  LE)       Output
1b260 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 53 51   for the next SQ
1b270 4c 20 63 6f 6d 6d 61 6e 64 20 6f 6e 6c 79 20 74  L command only t
1b280 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 20  o FILE",.  "    
1b290 20 49 66 20 46 49 4c 45 20 62 65 67 69 6e 73 20   If FILE begins 
1b2a0 77 69 74 68 20 27 7c 27 20 74 68 65 6e 20 6f 70  with '|' then op
1b2b0 65 6e 20 61 73 20 61 20 70 69 70 65 22 2c 0a 20  en as a pipe",. 
1b2c0 20 22 20 20 20 20 20 4f 74 68 65 72 20 6f 70 74   "     Other opt
1b2d0 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20  ions:",.  "     
1b2e0 20 20 2d 65 20 20 20 20 49 6e 76 6f 6b 65 20 73    -e    Invoke s
1b2f0 79 73 74 65 6d 20 74 65 78 74 20 65 64 69 74 6f  ystem text edito
1b300 72 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 78  r",.  "       -x
1b310 20 20 20 20 4f 70 65 6e 20 69 6e 20 61 20 73 70      Open in a sp
1b320 72 65 61 64 73 68 65 65 74 22 2c 0a 20 20 22 2e  readsheet",.  ".
1b330 6f 70 65 6e 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f  open ?OPTIONS? ?
1b340 46 49 4c 45 3f 20 20 20 43 6c 6f 73 65 20 65 78  FILE?   Close ex
1b350 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
1b360 61 6e 64 20 72 65 6f 70 65 6e 20 46 49 4c 45 22  and reopen FILE"
1b370 2c 0a 20 20 22 20 20 20 20 20 4f 70 74 69 6f 6e  ,.  "     Option
1b380 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20  s:",.  "        
1b390 2d 2d 61 70 70 65 6e 64 20 20 20 20 20 20 20 20  --append        
1b3a0 55 73 65 20 61 70 70 65 6e 64 76 66 73 20 74 6f  Use appendvfs to
1b3b0 20 61 70 70 65 6e 64 20 64 61 74 61 62 61 73 65   append database
1b3c0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 46   to the end of F
1b3d0 49 4c 45 22 2c 0a 23 69 66 64 65 66 20 53 51 4c  ILE",.#ifdef SQL
1b3e0 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52  ITE_ENABLE_DESER
1b3f0 49 41 4c 49 5a 45 0a 20 20 22 20 20 20 20 20 20  IALIZE.  "      
1b400 20 20 2d 2d 64 65 73 65 72 69 61 6c 69 7a 65 20    --deserialize 
1b410 20 20 4c 6f 61 64 20 69 6e 74 6f 20 6d 65 6d 6f    Load into memo
1b420 72 79 20 75 73 65 69 6e 67 20 73 71 6c 69 74 65  ry useing sqlite
1b430 33 5f 64 65 73 65 72 69 61 6c 69 7a 65 28 29 22  3_deserialize()"
1b440 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d 68  ,.  "        --h
1b450 65 78 64 62 20 20 20 20 20 20 20 20 20 4c 6f 61  exdb         Loa
1b460 64 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  d the output of 
1b470 5c 22 64 62 74 6f 74 78 74 5c 22 20 61 73 20 61  \"dbtotxt\" as a
1b480 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
1b490 62 61 73 65 22 2c 0a 20 20 22 20 20 20 20 20 20  base",.  "      
1b4a0 20 20 2d 2d 6d 61 78 73 69 7a 65 20 4e 20 20 20    --maxsize N   
1b4b0 20 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20 66    Maximum size f
1b4c0 6f 72 20 2d 2d 68 65 78 64 62 20 6f 72 20 2d 2d  or --hexdb or --
1b4d0 64 65 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74  deserialized dat
1b4e0 61 62 61 73 65 22 2c 0a 23 65 6e 64 69 66 0a 20  abase",.#endif. 
1b4f0 20 22 20 20 20 20 20 20 20 20 2d 2d 6e 65 77 20   "        --new 
1b500 20 20 20 20 20 20 20 20 20 20 49 6e 69 74 69 61            Initia
1b510 6c 69 7a 65 20 46 49 4c 45 20 74 6f 20 61 6e 20  lize FILE to an 
1b520 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 22 2c  empty database",
1b530 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d 72 65  .  "        --re
1b540 61 64 6f 6e 6c 79 20 20 20 20 20 20 4f 70 65 6e  adonly      Open
1b550 20 46 49 4c 45 20 72 65 61 64 6f 6e 6c 79 22 2c   FILE readonly",
1b560 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d 7a 69  .  "        --zi
1b570 70 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45  p           FILE
1b580 20 69 73 20 61 20 5a 49 50 20 61 72 63 68 69 76   is a ZIP archiv
1b590 65 22 2c 0a 20 20 22 2e 6f 75 74 70 75 74 20 3f  e",.  ".output ?
1b5a0 46 49 4c 45 3f 20 20 20 20 20 20 20 20 20 20 20  FILE?           
1b5b0 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 46  Send output to F
1b5c0 49 4c 45 20 6f 72 20 73 74 64 6f 75 74 20 69 66  ILE or stdout if
1b5d0 20 46 49 4c 45 20 69 73 20 6f 6d 69 74 74 65 64   FILE is omitted
1b5e0 22 2c 0a 20 20 22 20 20 20 20 20 49 66 20 46 49  ",.  "     If FI
1b5f0 4c 45 20 62 65 67 69 6e 73 20 77 69 74 68 20 27  LE begins with '
1b600 7c 27 20 74 68 65 6e 20 6f 70 65 6e 20 69 74 20  |' then open it 
1b610 61 73 20 61 20 70 69 70 65 2e 22 2c 0a 20 20 22  as a pipe.",.  "
1b620 2e 70 61 72 61 6d 65 74 65 72 20 43 4d 44 20 2e  .parameter CMD .
1b630 2e 2e 20 20 20 20 20 20 20 4d 61 6e 61 67 65 20  ..       Manage 
1b640 53 51 4c 20 70 61 72 61 6d 65 74 65 72 20 62 69  SQL parameter bi
1b650 6e 64 69 6e 67 73 22 2c 0a 20 20 22 20 20 20 63  ndings",.  "   c
1b660 6c 65 61 72 20 20 20 20 20 20 20 20 20 20 20 20  lear            
1b670 20 20 20 20 20 20 20 45 72 61 73 65 20 61 6c 6c         Erase all
1b680 20 62 69 6e 64 69 6e 67 73 22 2c 0a 20 20 22 20   bindings",.  " 
1b690 20 20 69 6e 69 74 20 20 20 20 20 20 20 20 20 20    init          
1b6a0 20 20 20 20 20 20 20 20 20 20 49 6e 69 74 69 61            Initia
1b6b0 6c 69 7a 65 20 74 68 65 20 54 45 4d 50 20 74 61  lize the TEMP ta
1b6c0 62 6c 65 20 74 68 61 74 20 68 6f 6c 64 73 20 62  ble that holds b
1b6d0 69 6e 64 69 6e 67 73 22 2c 0a 20 20 22 20 20 20  indings",.  "   
1b6e0 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
1b6f0 20 20 20 20 20 20 20 20 4c 69 73 74 20 74 68 65          List the
1b700 20 63 75 72 72 65 6e 74 20 70 61 72 61 6d 65 74   current paramet
1b710 65 72 20 62 69 6e 64 69 6e 67 73 22 2c 0a 20 20  er bindings",.  
1b720 22 20 20 20 73 65 74 20 50 41 52 41 4d 45 54 45  "   set PARAMETE
1b730 52 20 56 41 4c 55 45 20 20 20 20 20 47 69 76 65  R VALUE     Give
1b740 6e 20 53 51 4c 20 70 61 72 61 6d 65 74 65 72 20  n SQL parameter 
1b750 50 41 52 41 4d 45 54 45 52 20 61 20 76 61 6c 75  PARAMETER a valu
1b760 65 20 6f 66 20 56 41 4c 55 45 22 2c 0a 20 20 22  e of VALUE",.  "
1b770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b780 20 20 20 20 20 20 20 20 20 20 20 50 41 52 41 4d             PARAM
1b790 45 54 45 52 20 73 68 6f 75 6c 64 20 73 74 61 72  ETER should star
1b7a0 74 20 77 69 74 68 20 27 24 27 2c 20 27 3a 27 2c  t with '$', ':',
1b7b0 20 27 40 27 2c 20 6f 72 20 27 3f 27 22 2c 0a 20   '@', or '?'",. 
1b7c0 20 22 20 20 20 75 6e 73 65 74 20 50 41 52 41 4d   "   unset PARAM
1b7d0 45 54 45 52 20 20 20 20 20 20 20 20 20 52 65 6d  ETER         Rem
1b7e0 6f 76 65 20 50 41 52 41 4d 45 54 45 52 20 66 72  ove PARAMETER fr
1b7f0 6f 6d 20 74 68 65 20 62 69 6e 64 69 6e 67 20 74  om the binding t
1b800 61 62 6c 65 22 2c 0a 20 20 22 2e 70 72 69 6e 74  able",.  ".print
1b810 20 53 54 52 49 4e 47 2e 2e 2e 20 20 20 20 20 20   STRING...      
1b820 20 20 20 50 72 69 6e 74 20 6c 69 74 65 72 61 6c     Print literal
1b830 20 53 54 52 49 4e 47 22 2c 0a 23 69 66 6e 64 65   STRING",.#ifnde
1b840 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
1b850 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
1b860 20 20 22 2e 70 72 6f 67 72 65 73 73 20 4e 20 20    ".progress N  
1b870 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 76 6f              Invo
1b880 6b 65 20 70 72 6f 67 72 65 73 73 20 68 61 6e 64  ke progress hand
1b890 6c 65 72 20 61 66 74 65 72 20 65 76 65 72 79 20  ler after every 
1b8a0 4e 20 6f 70 63 6f 64 65 73 22 2c 0a 20 20 22 20  N opcodes",.  " 
1b8b0 20 20 2d 2d 6c 69 6d 69 74 20 4e 20 20 20 20 20    --limit N     
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
1b8d0 72 72 75 70 74 20 61 66 74 65 72 20 4e 20 70 72  rrupt after N pr
1b8e0 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 73  ogress callbacks
1b8f0 22 2c 0a 20 20 22 20 20 20 2d 2d 6f 6e 63 65 20  ",.  "   --once 
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b910 20 20 20 44 6f 20 6e 6f 20 6d 6f 72 65 20 74 68     Do no more th
1b920 61 6e 20 6f 6e 65 20 70 72 6f 67 72 65 73 73 20  an one progress 
1b930 69 6e 74 65 72 72 75 70 74 22 2c 0a 20 20 22 20  interrupt",.  " 
1b940 20 20 2d 2d 71 75 69 65 74 7c 2d 71 20 20 20 20    --quiet|-q    
1b950 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f 20 6f              No o
1b960 75 74 70 75 74 20 65 78 63 65 70 74 20 61 74 20  utput except at 
1b970 69 6e 74 65 72 72 75 70 74 73 22 2c 0a 20 20 22  interrupts",.  "
1b980 20 20 20 2d 2d 72 65 73 65 74 20 20 20 20 20 20     --reset      
1b990 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73               Res
1b9a0 65 74 20 74 68 65 20 63 6f 75 6e 74 20 66 6f 72  et the count for
1b9b0 20 65 61 63 68 20 69 6e 70 75 74 20 61 6e 64 20   each input and 
1b9c0 69 6e 74 65 72 72 75 70 74 22 2c 0a 23 65 6e 64  interrupt",.#end
1b9d0 69 66 0a 20 20 22 2e 70 72 6f 6d 70 74 20 4d 41  if.  ".prompt MA
1b9e0 49 4e 20 43 4f 4e 54 49 4e 55 45 20 20 20 20 52  IN CONTINUE    R
1b9f0 65 70 6c 61 63 65 20 74 68 65 20 73 74 61 6e 64  eplace the stand
1ba00 61 72 64 20 70 72 6f 6d 70 74 73 22 2c 0a 20 20  ard prompts",.  
1ba10 22 2e 71 75 69 74 20 20 20 20 20 20 20 20 20 20  ".quit          
1ba20 20 20 20 20 20 20 20 20 20 20 45 78 69 74 20 74            Exit t
1ba30 68 69 73 20 70 72 6f 67 72 61 6d 22 2c 0a 20 20  his program",.  
1ba40 22 2e 72 65 61 64 20 46 49 4c 45 20 20 20 20 20  ".read FILE     
1ba50 20 20 20 20 20 20 20 20 20 20 52 65 61 64 20 69            Read i
1ba60 6e 70 75 74 20 66 72 6f 6d 20 46 49 4c 45 22 2c  nput from FILE",
1ba70 0a 20 20 22 2e 72 65 73 74 6f 72 65 20 3f 44 42  .  ".restore ?DB
1ba80 3f 20 46 49 4c 45 20 20 20 20 20 20 20 52 65 73  ? FILE       Res
1ba90 74 6f 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tore content of 
1baa0 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22 6d 61  DB (default \"ma
1bab0 69 6e 5c 22 29 20 66 72 6f 6d 20 46 49 4c 45 22  in\") from FILE"
1bac0 2c 0a 20 20 22 2e 73 61 76 65 20 46 49 4c 45 20  ,.  ".save FILE 
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
1bae0 69 74 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  ite in-memory da
1baf0 74 61 62 61 73 65 20 69 6e 74 6f 20 46 49 4c 45  tabase into FILE
1bb00 22 2c 0a 20 20 22 2e 73 63 61 6e 73 74 61 74 73  ",.  ".scanstats
1bb10 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 54   on|off        T
1bb20 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  urn sqlite3_stmt
1bb30 5f 73 63 61 6e 73 74 61 74 75 73 28 29 20 6d 65  _scanstatus() me
1bb40 74 72 69 63 73 20 6f 6e 20 6f 72 20 6f 66 66 22  trics on or off"
1bb50 2c 0a 20 20 22 2e 73 63 68 65 6d 61 20 3f 50 41  ,.  ".schema ?PA
1bb60 54 54 45 52 4e 3f 20 20 20 20 20 20 20 20 53 68  TTERN?        Sh
1bb70 6f 77 20 74 68 65 20 43 52 45 41 54 45 20 73 74  ow the CREATE st
1bb80 61 74 65 6d 65 6e 74 73 20 6d 61 74 63 68 69 6e  atements matchin
1bb90 67 20 50 41 54 54 45 52 4e 22 2c 0a 20 20 22 20  g PATTERN",.  " 
1bba0 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20      Options:",. 
1bbb0 20 22 20 20 20 20 20 20 20 20 20 2d 2d 69 6e 64   "         --ind
1bbc0 65 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 54  ent            T
1bbd0 72 79 20 74 6f 20 70 72 65 74 74 79 2d 70 72 69  ry to pretty-pri
1bbe0 6e 74 20 74 68 65 20 73 63 68 65 6d 61 22 2c 0a  nt the schema",.
1bbf0 20 20 22 2e 73 65 6c 66 74 65 73 74 20 3f 4f 50    ".selftest ?OP
1bc00 54 49 4f 4e 53 3f 20 20 20 20 20 20 52 75 6e 20  TIONS?      Run 
1bc10 74 65 73 74 73 20 64 65 66 69 6e 65 64 20 69 6e  tests defined in
1bc20 20 74 68 65 20 53 45 4c 46 54 45 53 54 20 74 61   the SELFTEST ta
1bc30 62 6c 65 22 2c 0a 20 20 22 20 20 20 20 4f 70 74  ble",.  "    Opt
1bc40 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20  ions:",.  "     
1bc50 20 20 2d 2d 69 6e 69 74 20 20 20 20 20 20 20 20    --init        
1bc60 20 20 20 20 20 20 20 43 72 65 61 74 65 20 61 20         Create a 
1bc70 6e 65 77 20 53 45 4c 46 54 45 53 54 20 74 61 62  new SELFTEST tab
1bc80 6c 65 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d  le",.  "       -
1bc90 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v               
1bca0 20 20 20 20 56 65 72 62 6f 73 65 20 6f 75 74 70      Verbose outp
1bcb0 75 74 22 2c 0a 20 20 22 2e 73 65 70 61 72 61 74  ut",.  ".separat
1bcc0 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f 20 20 20 20  or COL ?ROW?    
1bcd0 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6c 75   Change the colu
1bce0 6d 6e 20 61 6e 64 20 72 6f 77 20 73 65 70 61 72  mn and row separ
1bcf0 61 74 6f 72 73 22 2c 0a 23 69 66 20 64 65 66 69  ators",.#if defi
1bd00 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1bd10 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 22 2e 73  E_SESSION).  ".s
1bd20 65 73 73 69 6f 6e 20 3f 4e 41 4d 45 3f 20 43 4d  ession ?NAME? CM
1bd30 44 20 2e 2e 2e 20 20 43 72 65 61 74 65 20 6f 72  D ...  Create or
1bd40 20 63 6f 6e 74 72 6f 6c 20 73 65 73 73 69 6f 6e   control session
1bd50 73 22 2c 0a 20 20 22 20 20 20 53 75 62 63 6f 6d  s",.  "   Subcom
1bd60 6d 61 6e 64 73 3a 22 2c 0a 20 20 22 20 20 20 20  mands:",.  "    
1bd70 20 61 74 74 61 63 68 20 54 41 42 4c 45 20 20 20   attach TABLE   
1bd80 20 20 20 20 20 20 20 20 20 20 41 74 74 61 63 68            Attach
1bd90 20 54 41 42 4c 45 22 2c 0a 20 20 22 20 20 20 20   TABLE",.  "    
1bda0 20 63 68 61 6e 67 65 73 65 74 20 46 49 4c 45 20   changeset FILE 
1bdb0 20 20 20 20 20 20 20 20 20 20 57 72 69 74 65 20            Write 
1bdc0 61 20 63 68 61 6e 67 65 73 65 74 20 69 6e 74 6f  a changeset into
1bdd0 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 20 20   FILE",.  "     
1bde0 63 6c 6f 73 65 20 20 20 20 20 20 20 20 20 20 20  close           
1bdf0 20 20 20 20 20 20 20 20 20 43 6c 6f 73 65 20 6f           Close o
1be00 6e 65 20 73 65 73 73 69 6f 6e 22 2c 0a 20 20 22  ne session",.  "
1be10 20 20 20 20 20 65 6e 61 62 6c 65 20 3f 42 4f 4f       enable ?BOO
1be20 4c 45 41 4e 3f 20 20 20 20 20 20 20 20 20 53 65  LEAN?         Se
1be30 74 20 6f 72 20 71 75 65 72 79 20 74 68 65 20 65  t or query the e
1be40 6e 61 62 6c 65 20 62 69 74 22 2c 0a 20 20 22 20  nable bit",.  " 
1be50 20 20 20 20 66 69 6c 74 65 72 20 47 4c 4f 42 2e      filter GLOB.
1be60 2e 2e 20 20 20 20 20 20 20 20 20 20 20 52 65 6a  ..           Rej
1be70 65 63 74 20 74 61 62 6c 65 73 20 6d 61 74 63 68  ect tables match
1be80 69 6e 67 20 47 4c 4f 42 73 22 2c 0a 20 20 22 20  ing GLOBs",.  " 
1be90 20 20 20 20 69 6e 64 69 72 65 63 74 20 3f 42 4f      indirect ?BO
1bea0 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20 4d 61 72  OLEAN?       Mar
1beb0 6b 20 6f 72 20 71 75 65 72 79 20 74 68 65 20 69  k or query the i
1bec0 6e 64 69 72 65 63 74 20 73 74 61 74 75 73 22 2c  ndirect status",
1bed0 0a 20 20 22 20 20 20 20 20 69 73 65 6d 70 74 79  .  "     isempty
1bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bef0 20 20 51 75 65 72 79 20 77 68 65 74 68 65 72 20    Query whether 
1bf00 74 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20 65  the session is e
1bf10 6d 70 74 79 22 2c 0a 20 20 22 20 20 20 20 20 6c  mpty",.  "     l
1bf20 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
1bf30 20 20 20 20 20 20 20 20 4c 69 73 74 20 63 75 72          List cur
1bf40 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73 73  rently open sess
1bf50 69 6f 6e 20 6e 61 6d 65 73 22 2c 0a 20 20 22 20  ion names",.  " 
1bf60 20 20 20 20 6f 70 65 6e 20 44 42 20 4e 41 4d 45      open DB NAME
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 70 65               Ope
1bf80 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20  n a new session 
1bf90 6f 6e 20 44 42 22 2c 0a 20 20 22 20 20 20 20 20  on DB",.  "     
1bfa0 70 61 74 63 68 73 65 74 20 46 49 4c 45 20 20 20  patchset FILE   
1bfb0 20 20 20 20 20 20 20 20 20 57 72 69 74 65 20 61           Write a
1bfc0 20 70 61 74 63 68 73 65 74 20 69 6e 74 6f 20 46   patchset into F
1bfd0 49 4c 45 22 2c 0a 20 20 22 20 20 20 49 66 20 3f  ILE",.  "   If ?
1bfe0 4e 41 4d 45 3f 20 69 73 20 6f 6d 69 74 74 65 64  NAME? is omitted
1bff0 2c 20 74 68 65 20 66 69 72 73 74 20 64 65 66 69  , the first defi
1c000 6e 65 64 20 73 65 73 73 69 6f 6e 20 69 73 20 75  ned session is u
1c010 73 65 64 2e 22 2c 0a 23 65 6e 64 69 66 0a 20 20  sed.",.#endif.  
1c020 22 2e 73 68 61 33 73 75 6d 20 2e 2e 2e 20 20 20  ".sha3sum ...   
1c030 20 20 20 20 20 20 20 20 20 20 43 6f 6d 70 75 74            Comput
1c040 65 20 61 20 53 48 41 33 20 68 61 73 68 20 6f 66  e a SHA3 hash of
1c050 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e   database conten
1c060 74 22 2c 0a 20 20 22 20 20 20 20 4f 70 74 69 6f  t",.  "    Optio
1c070 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 2d  ns:",.  "      -
1c080 2d 73 63 68 65 6d 61 20 20 20 20 20 20 20 20 20  -schema         
1c090 20 20 20 20 20 41 6c 73 6f 20 68 61 73 68 20 74       Also hash t
1c0a0 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
1c0b0 20 74 61 62 6c 65 22 2c 0a 20 20 22 20 20 20 20   table",.  "    
1c0c0 20 20 2d 2d 73 68 61 33 2d 32 32 34 20 20 20 20    --sha3-224    
1c0d0 20 20 20 20 20 20 20 20 55 73 65 20 74 68 65 20          Use the 
1c0e0 73 68 61 33 2d 32 32 34 20 61 6c 67 6f 72 69 74  sha3-224 algorit
1c0f0 68 6d 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d  hm",.  "      --
1c100 73 68 61 33 2d 32 35 36 20 20 20 20 20 20 20 20  sha3-256        
1c110 20 20 20 20 55 73 65 20 74 68 65 20 73 68 61 33      Use the sha3
1c120 2d 32 35 36 20 61 6c 67 6f 72 69 74 68 6d 2e 20  -256 algorithm. 
1c130 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
1c140 61 75 6c 74 2e 22 2c 0a 20 20 22 20 20 20 20 20  ault.",.  "     
1c150 20 2d 2d 73 68 61 33 2d 33 38 34 20 20 20 20 20   --sha3-384     
1c160 20 20 20 20 20 20 20 55 73 65 20 74 68 65 20 73         Use the s
1c170 68 61 33 2d 33 38 34 20 61 6c 67 6f 72 69 74 68  ha3-384 algorith
1c180 6d 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73  m",.  "      --s
1c190 68 61 33 2d 35 31 32 20 20 20 20 20 20 20 20 20  ha3-512         
1c1a0 20 20 20 55 73 65 20 74 68 65 20 73 68 61 33 2d     Use the sha3-
1c1b0 35 31 32 20 61 6c 67 6f 72 69 74 68 6d 22 2c 0a  512 algorithm",.
1c1c0 20 20 22 20 20 20 20 41 6e 79 20 6f 74 68 65 72    "    Any other
1c1d0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 4c   argument is a L
1c1e0 49 4b 45 20 70 61 74 74 65 72 6e 20 66 6f 72 20  IKE pattern for 
1c1f0 74 61 62 6c 65 73 20 74 6f 20 68 61 73 68 22 2c  tables to hash",
1c200 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c210 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20  NOHAVE_SYSTEM.  
1c220 22 2e 73 68 65 6c 6c 20 43 4d 44 20 41 52 47 53  ".shell CMD ARGS
1c230 2e 2e 2e 20 20 20 20 20 20 20 52 75 6e 20 43 4d  ...       Run CM
1c240 44 20 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73  D ARGS... in a s
1c250 79 73 74 65 6d 20 73 68 65 6c 6c 22 2c 0a 23 65  ystem shell",.#e
1c260 6e 64 69 66 0a 20 20 22 2e 73 68 6f 77 20 20 20  ndif.  ".show   
1c270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c280 20 53 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e   Show the curren
1c290 74 20 76 61 6c 75 65 73 20 66 6f 72 20 76 61 72  t values for var
1c2a0 69 6f 75 73 20 73 65 74 74 69 6e 67 73 22 2c 0a  ious settings",.
1c2b0 20 20 22 2e 73 74 61 74 73 20 3f 6f 6e 7c 6f 66    ".stats ?on|of
1c2c0 66 3f 20 20 20 20 20 20 20 20 20 20 53 68 6f 77  f?          Show
1c2d0 20 73 74 61 74 73 20 6f 72 20 74 75 72 6e 20 73   stats or turn s
1c2e0 74 61 74 73 20 6f 6e 20 6f 72 20 6f 66 66 22 2c  tats on or off",
1c2f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c300 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20  NOHAVE_SYSTEM.  
1c310 22 2e 73 79 73 74 65 6d 20 43 4d 44 20 41 52 47  ".system CMD ARG
1c320 53 2e 2e 2e 20 20 20 20 20 20 52 75 6e 20 43 4d  S...      Run CM
1c330 44 20 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73  D ARGS... in a s
1c340 79 73 74 65 6d 20 73 68 65 6c 6c 22 2c 0a 23 65  ystem shell",.#e
1c350 6e 64 69 66 0a 20 20 22 2e 74 61 62 6c 65 73 20  ndif.  ".tables 
1c360 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20 20  ?TABLE?         
1c370 20 4c 69 73 74 20 6e 61 6d 65 73 20 6f 66 20 74   List names of t
1c380 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 4c  ables matching L
1c390 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c  IKE pattern TABL
1c3a0 45 22 2c 0a 20 20 22 2e 74 65 73 74 63 61 73 65  E",.  ".testcase
1c3b0 20 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 20   NAME           
1c3c0 42 65 67 69 6e 20 72 65 64 69 72 65 63 74 69 6e  Begin redirectin
1c3d0 67 20 6f 75 74 70 75 74 20 74 6f 20 27 74 65 73  g output to 'tes
1c3e0 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 27 22 2c  tcase-out.txt'",
1c3f0 0a 20 20 22 2e 74 69 6d 65 6f 75 74 20 4d 53 20  .  ".timeout MS 
1c400 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 79               Try
1c410 20 6f 70 65 6e 69 6e 67 20 6c 6f 63 6b 65 64 20   opening locked 
1c420 74 61 62 6c 65 73 20 66 6f 72 20 4d 53 20 6d 69  tables for MS mi
1c430 6c 6c 69 73 65 63 6f 6e 64 73 22 2c 0a 20 20 22  lliseconds",.  "
1c440 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66 66 20 20 20  .timer on|off   
1c450 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 53 51           Turn SQ
1c460 4c 20 74 69 6d 65 72 20 6f 6e 20 6f 72 20 6f 66  L timer on or of
1c470 66 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f",.#ifndef SQLI
1c480 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20  TE_OMIT_TRACE.  
1c490 22 2e 74 72 61 63 65 20 3f 4f 50 54 49 4f 4e 53  ".trace ?OPTIONS
1c4a0 3f 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74  ?         Output
1c4b0 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
1c4c0 65 6e 74 20 61 73 20 69 74 20 69 73 20 72 75 6e  ent as it is run
1c4d0 22 2c 0a 20 20 22 20 20 20 20 46 49 4c 45 20 20  ",.  "    FILE  
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4f0 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f    Send output to
1c500 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 20 73   FILE",.  "    s
1c510 74 64 6f 75 74 20 20 20 20 20 20 20 20 20 20 20  tdout           
1c520 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70         Send outp
1c530 75 74 20 74 6f 20 73 74 64 6f 75 74 22 2c 0a 20  ut to stdout",. 
1c540 20 22 20 20 20 20 73 74 64 65 72 72 20 20 20 20   "    stderr    
1c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 65                Se
1c560 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 73 74 64  nd output to std
1c570 65 72 72 22 2c 0a 20 20 22 20 20 20 20 6f 66 66  err",.  "    off
1c580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c590 20 20 20 20 20 44 69 73 61 62 6c 65 20 74 72 61       Disable tra
1c5a0 63 69 6e 67 22 2c 0a 20 20 22 20 20 20 20 2d 2d  cing",.  "    --
1c5b0 65 78 70 61 6e 64 65 64 20 20 20 20 20 20 20 20  expanded        
1c5c0 20 20 20 20 20 20 45 78 70 61 6e 64 20 71 75 65        Expand que
1c5d0 72 79 20 70 61 72 61 6d 65 74 65 72 73 22 2c 0a  ry parameters",.
1c5e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1c5f0 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20  ABLE_NORMALIZE. 
1c600 20 22 20 20 20 20 2d 2d 6e 6f 72 6d 61 6c 69 7a   "    --normaliz
1c610 65 64 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f  ed            No
1c620 72 6d 61 6c 20 74 68 65 20 53 51 4c 20 73 74 61  rmal the SQL sta
1c630 74 65 6d 65 6e 74 73 22 2c 0a 23 65 6e 64 69 66  tements",.#endif
1c640 0a 20 20 22 20 20 20 20 2d 2d 70 6c 61 69 6e 20  .  "    --plain 
1c650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c660 53 68 6f 77 20 53 51 4c 20 61 73 20 69 74 20 69  Show SQL as it i
1c670 73 20 69 6e 70 75 74 22 2c 0a 20 20 22 20 20 20  s input",.  "   
1c680 20 2d 2d 73 74 6d 74 20 20 20 20 20 20 20 20 20   --stmt         
1c690 20 20 20 20 20 20 20 20 20 54 72 61 63 65 20 73           Trace s
1c6a0 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 69  tatement executi
1c6b0 6f 6e 20 28 53 51 4c 49 54 45 5f 54 52 41 43 45  on (SQLITE_TRACE
1c6c0 5f 53 54 4d 54 29 22 2c 0a 20 20 22 20 20 20 20  _STMT)",.  "    
1c6d0 2d 2d 70 72 6f 66 69 6c 65 20 20 20 20 20 20 20  --profile       
1c6e0 20 20 20 20 20 20 20 20 50 72 6f 66 69 6c 65 20          Profile 
1c6f0 73 74 61 74 65 6d 65 6e 74 73 20 28 53 51 4c 49  statements (SQLI
1c700 54 45 5f 54 52 41 43 45 5f 50 52 4f 46 49 4c 45  TE_TRACE_PROFILE
1c710 29 22 2c 0a 20 20 22 20 20 20 20 2d 2d 72 6f 77  )",.  "    --row
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c730 20 20 20 54 72 61 63 65 20 65 61 63 68 20 72 6f     Trace each ro
1c740 77 20 28 53 51 4c 49 54 45 5f 54 52 41 43 45 5f  w (SQLITE_TRACE_
1c750 52 4f 57 29 22 2c 0a 20 20 22 20 20 20 20 2d 2d  ROW)",.  "    --
1c760 63 6c 6f 73 65 20 20 20 20 20 20 20 20 20 20 20  close           
1c770 20 20 20 20 20 20 54 72 61 63 65 20 63 6f 6e 6e        Trace conn
1c780 65 63 74 69 6f 6e 20 63 6c 6f 73 65 20 28 53 51  ection close (SQ
1c790 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45  LITE_TRACE_CLOSE
1c7a0 29 22 2c 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  )",.#endif /* SQ
1c7b0 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
1c7c0 2a 2f 0a 20 20 22 2e 76 66 73 69 6e 66 6f 20 3f  */.  ".vfsinfo ?
1c7d0 41 55 58 3f 20 20 20 20 20 20 20 20 20 20 20 49  AUX?           I
1c7e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
1c7f0 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56   the top-level V
1c800 46 53 22 2c 0a 20 20 22 2e 76 66 73 6c 69 73 74  FS",.  ".vfslist
1c810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c820 20 4c 69 73 74 20 61 6c 6c 20 61 76 61 69 6c 61   List all availa
1c830 62 6c 65 20 56 46 53 65 73 22 2c 0a 20 20 22 2e  ble VFSes",.  ".
1c840 76 66 73 6e 61 6d 65 20 3f 41 55 58 3f 20 20 20  vfsname ?AUX?   
1c850 20 20 20 20 20 20 20 20 50 72 69 6e 74 20 74 68          Print th
1c860 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46  e name of the VF
1c870 53 20 73 74 61 63 6b 22 2c 0a 20 20 22 2e 77 69  S stack",.  ".wi
1c880 64 74 68 20 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e  dth NUM1 NUM2 ..
1c890 2e 20 20 20 20 20 53 65 74 20 63 6f 6c 75 6d 6e  .     Set column
1c8a0 20 77 69 64 74 68 73 20 66 6f 72 20 5c 22 63 6f   widths for \"co
1c8b0 6c 75 6d 6e 5c 22 20 6d 6f 64 65 22 2c 0a 20 20  lumn\" mode",.  
1c8c0 22 20 20 20 20 20 4e 65 67 61 74 69 76 65 20 76  "     Negative v
1c8d0 61 6c 75 65 73 20 72 69 67 68 74 2d 6a 75 73 74  alues right-just
1c8e0 69 66 79 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ify",.};../*.** 
1c8f0 4f 75 74 70 75 74 20 68 65 6c 70 20 74 65 78 74  Output help text
1c900 2e 0a 2a 2a 0a 2a 2a 20 7a 50 61 74 74 65 72 6e  ..**.** zPattern
1c910 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 73   describes the s
1c920 65 74 20 6f 66 20 63 6f 6d 6d 61 6e 64 73 20 66  et of commands f
1c930 6f 72 20 77 68 69 63 68 20 68 65 6c 70 20 74 65  or which help te
1c940 78 74 20 69 73 20 70 72 6f 76 69 64 65 64 2e 0a  xt is provided..
1c950 2a 2a 20 49 66 20 7a 50 61 74 74 65 72 6e 20 69  ** If zPattern i
1c960 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 73 68 6f  s NULL, then sho
1c970 77 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73 2c 20  w all commands, 
1c980 62 75 74 20 6f 6e 6c 79 20 67 69 76 65 20 61 20  but only give a 
1c990 6f 6e 65 2d 6c 69 6e 65 0a 2a 2a 20 64 65 73 63  one-line.** desc
1c9a0 72 69 70 74 69 6f 6e 20 6f 66 20 65 61 63 68 2e  ription of each.
1c9b0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1c9c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  e number of matc
1c9d0 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hes..*/.static i
1c9e0 6e 74 20 73 68 6f 77 48 65 6c 70 28 46 49 4c 45  nt showHelp(FILE
1c9f0 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
1ca00 72 20 2a 7a 50 61 74 74 65 72 6e 29 7b 0a 20 20  r *zPattern){.  
1ca10 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
1ca20 20 6a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20   j = 0;.  int n 
1ca30 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61  = 0;.  char *zPa
1ca40 74 3b 0a 20 20 69 66 28 20 7a 50 61 74 74 65 72  t;.  if( zPatter
1ca50 6e 3d 3d 30 0a 20 20 20 7c 7c 20 7a 50 61 74 74  n==0.   || zPatt
1ca60 65 72 6e 5b 30 5d 3d 3d 27 30 27 0a 20 20 20 7c  ern[0]=='0'.   |
1ca70 7c 20 73 74 72 63 6d 70 28 7a 50 61 74 74 65 72  | strcmp(zPatter
1ca80 6e 2c 22 2d 61 22 29 3d 3d 30 0a 20 20 20 7c 7c  n,"-a")==0.   ||
1ca90 20 73 74 72 63 6d 70 28 7a 50 61 74 74 65 72 6e   strcmp(zPattern
1caa0 2c 22 2d 61 6c 6c 22 29 3d 3d 30 0a 20 20 29 7b  ,"-all")==0.  ){
1cab0 0a 20 20 20 20 2f 2a 20 53 68 6f 77 20 61 6c 6c  .    /* Show all
1cac0 20 63 6f 6d 6d 61 6e 64 73 2c 20 62 75 74 20 6f   commands, but o
1cad0 6e 6c 79 20 6f 6e 65 20 6c 69 6e 65 20 70 65 72  nly one line per
1cae0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
1caf0 69 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d 30 20  if( zPattern==0 
1cb00 29 20 7a 50 61 74 74 65 72 6e 20 3d 20 22 22 3b  ) zPattern = "";
1cb10 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1cb20 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70  ArraySize(azHelp
1cb30 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
1cb40 66 28 20 61 7a 48 65 6c 70 5b 69 5d 5b 30 5d 3d  f( azHelp[i][0]=
1cb50 3d 27 2e 27 20 7c 7c 20 7a 50 61 74 74 65 72 6e  ='.' || zPattern
1cb60 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 75  [0] ){.        u
1cb70 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
1cb80 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 69  "%s\n", azHelp[i
1cb90 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b  ]);.        n++;
1cba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cbb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4c   }else{.    /* L
1cbc0 6f 6f 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 73  ook for commands
1cbd0 20 74 68 61 74 20 66 6f 72 20 77 68 69 63 68 20   that for which 
1cbe0 7a 50 61 74 74 65 72 6e 20 69 73 20 61 6e 20 65  zPattern is an e
1cbf0 78 61 63 74 20 70 72 65 66 69 78 20 2a 2f 0a 20  xact prefix */. 
1cc00 20 20 20 7a 50 61 74 20 3d 20 73 71 6c 69 74 65     zPat = sqlite
1cc10 33 5f 6d 70 72 69 6e 74 66 28 22 2e 25 73 2a 22  3_mprintf(".%s*"
1cc20 2c 20 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20  , zPattern);.   
1cc30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
1cc40 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 3b 20 69  ySize(azHelp); i
1cc50 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
1cc60 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a  qlite3_strglob(z
1cc70 50 61 74 2c 20 61 7a 48 65 6c 70 5b 69 5d 29 3d  Pat, azHelp[i])=
1cc80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  =0 ){.        ut
1cc90 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
1cca0 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 69 5d  %s\n", azHelp[i]
1ccb0 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 69  );.        j = i
1ccc0 2b 31 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b  +1;.        n++;
1ccd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cce0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1ccf0 7a 50 61 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  zPat);.    if( n
1cd00 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d   ){.      if( n=
1cd10 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =1 ){.        /*
1cd20 20 77 68 65 6e 20 7a 50 61 74 74 65 72 6e 20 69   when zPattern i
1cd30 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 65 78  s a prefix of ex
1cd40 61 63 74 6c 79 20 6f 6e 65 20 63 6f 6d 6d 61 6e  actly one comman
1cd50 64 2c 20 74 68 65 6e 20 69 6e 63 6c 75 64 65 20  d, then include 
1cd60 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  the.        ** d
1cd70 65 74 61 69 6c 73 20 6f 66 20 74 68 61 74 20 63  etails of that c
1cd80 6f 6d 6d 61 6e 64 2c 20 77 68 69 63 68 20 73 68  ommand, which sh
1cd90 6f 75 6c 64 20 62 65 67 69 6e 20 61 74 20 6f 66  ould begin at of
1cda0 66 73 65 74 20 6a 20 2a 2f 0a 20 20 20 20 20 20  fset j */.      
1cdb0 20 20 77 68 69 6c 65 28 20 6a 3c 41 72 72 61 79    while( j<Array
1cdc0 53 69 7a 65 28 61 7a 48 65 6c 70 29 2d 31 20 26  Size(azHelp)-1 &
1cdd0 26 20 61 7a 48 65 6c 70 5b 6a 5d 5b 30 5d 21 3d  & azHelp[j][0]!=
1cde0 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '.' ){.         
1cdf0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
1ce00 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70  , "%s\n", azHelp
1ce10 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [j]);.          
1ce20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  j++;.        }. 
1ce30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1ce40 75 72 6e 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  urn n;.    }.   
1ce50 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 63 6f 6d   /* Look for com
1ce60 6d 61 6e 64 73 20 74 68 61 74 20 63 6f 6e 74 61  mands that conta
1ce70 69 6e 20 7a 50 61 74 74 65 72 6e 20 61 6e 79 77  in zPattern anyw
1ce80 68 65 72 65 2e 20 20 53 68 6f 77 20 74 68 65 20  here.  Show the 
1ce90 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20  complete.    ** 
1cea0 74 65 78 74 20 6f 66 20 61 6c 6c 20 63 6f 6d 6d  text of all comm
1ceb0 61 6e 64 73 20 74 68 61 74 20 6d 61 74 63 68 2e  ands that match.
1cec0 20 2a 2f 0a 20 20 20 20 7a 50 61 74 20 3d 20 73   */.    zPat = s
1ced0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1cee0 25 25 25 73 25 25 22 2c 20 7a 50 61 74 74 65 72  %%%s%%", zPatter
1cef0 6e 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  n);.    for(i=0;
1cf00 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48   i<ArraySize(azH
1cf10 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  elp); i++){.    
1cf20 20 20 69 66 28 20 61 7a 48 65 6c 70 5b 69 5d 5b    if( azHelp[i][
1cf30 30 5d 3d 3d 27 2e 27 20 29 20 6a 20 3d 20 69 3b  0]=='.' ) j = i;
1cf40 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1cf50 65 33 5f 73 74 72 6c 69 6b 65 28 7a 50 61 74 2c  e3_strlike(zPat,
1cf60 20 61 7a 48 65 6c 70 5b 69 5d 2c 20 30 29 3d 3d   azHelp[i], 0)==
1cf70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
1cf80 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
1cf90 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29  s\n", azHelp[j])
1cfa0 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
1cfb0 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48   j<ArraySize(azH
1cfc0 65 6c 70 29 2d 31 20 26 26 20 61 7a 48 65 6c 70  elp)-1 && azHelp
1cfd0 5b 6a 2b 31 5d 5b 30 5d 21 3d 27 2e 27 20 29 7b  [j+1][0]!='.' ){
1cfe0 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a  .          j++;.
1cff0 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
1d000 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e  rintf(out, "%s\n
1d010 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b 0a 20  ", azHelp[j]);. 
1d020 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d030 20 69 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20   i = j;.        
1d040 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
1d050 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
1d060 72 65 65 28 7a 50 61 74 29 3b 0a 20 20 7d 0a 20  ree(zPat);.  }. 
1d070 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
1d080 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
1d090 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
1d0a0 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 53   process_input(S
1d0b0 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 3b 0a 0a  hellState *p);..
1d0c0 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63  /*.** Read the c
1d0d0 6f 6e 74 65 6e 74 20 6f 66 20 66 69 6c 65 20 7a  ontent of file z
1d0e0 4e 61 6d 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  Name into memory
1d0f0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
1d100 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
1d110 29 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20  ).** and return 
1d120 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1d130 20 62 75 66 66 65 72 2e 20 54 68 65 20 63 61 6c   buffer. The cal
1d140 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
1d150 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67 0a 2a  le for freeing.*
1d160 2a 20 74 68 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2a  * the memory..**
1d170 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
1d180 20 70 6e 42 79 74 65 20 69 73 20 6e 6f 74 20 4e   pnByte is not N
1d190 55 4c 4c 2c 20 28 2a 70 6e 42 79 74 65 29 20 69  ULL, (*pnByte) i
1d1a0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
1d1b0 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20  ber of bytes.** 
1d1c0 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  read..**.** For 
1d1d0 63 6f 6e 76 65 6e 69 65 6e 63 65 2c 20 61 20 6e  convenience, a n
1d1e0 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
1d1f0 74 65 20 69 73 20 61 6c 77 61 79 73 20 61 70 70  te is always app
1d200 65 6e 64 65 64 20 74 6f 20 74 68 65 20 64 61 74  ended to the dat
1d210 61 20 72 65 61 64 0a 2a 2a 20 66 72 6f 6d 20 74  a read.** from t
1d220 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  he file before t
1d230 68 65 20 62 75 66 66 65 72 20 69 73 20 72 65 74  he buffer is ret
1d240 75 72 6e 65 64 2e 20 54 68 69 73 20 62 79 74 65  urned. This byte
1d250 20 69 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 64   is not included
1d260 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c   in.** the final
1d270 20 76 61 6c 75 65 20 6f 66 20 28 2a 70 6e 42 79   value of (*pnBy
1d280 74 65 29 2c 20 69 66 20 61 70 70 6c 69 63 61 62  te), if applicab
1d290 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 55 4c 4c 20 69  le..**.** NULL i
1d2a0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 6e  s returned if an
1d2b0 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  y error is encou
1d2c0 6e 74 65 72 65 64 2e 20 54 68 65 20 66 69 6e 61  ntered. The fina
1d2d0 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70 6e 42 79  l value of *pnBy
1d2e0 74 65 0a 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e  te.** is undefin
1d2f0 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
1d300 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1d310 2a 72 65 61 64 46 69 6c 65 28 63 6f 6e 73 74 20  *readFile(const 
1d320 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
1d330 20 2a 70 6e 42 79 74 65 29 7b 0a 20 20 46 49 4c   *pnByte){.  FIL
1d340 45 20 2a 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 4e  E *in = fopen(zN
1d350 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 6c 6f  ame, "rb");.  lo
1d360 6e 67 20 6e 49 6e 3b 0a 20 20 73 69 7a 65 5f 74  ng nIn;.  size_t
1d370 20 6e 52 65 61 64 3b 0a 20 20 63 68 61 72 20 2a   nRead;.  char *
1d380 70 42 75 66 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  pBuf;.  if( in==
1d390 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1d3a0 66 73 65 65 6b 28 69 6e 2c 20 30 2c 20 53 45 45  fseek(in, 0, SEE
1d3b0 4b 5f 45 4e 44 29 3b 0a 20 20 6e 49 6e 20 3d 20  K_END);.  nIn = 
1d3c0 66 74 65 6c 6c 28 69 6e 29 3b 0a 20 20 72 65 77  ftell(in);.  rew
1d3d0 69 6e 64 28 69 6e 29 3b 0a 20 20 70 42 75 66 20  ind(in);.  pBuf 
1d3e0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1d3f0 36 34 28 20 6e 49 6e 2b 31 20 29 3b 0a 20 20 69  64( nIn+1 );.  i
1d400 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 20 66 63  f( pBuf==0 ){ fc
1d410 6c 6f 73 65 28 69 6e 29 3b 20 72 65 74 75 72 6e  lose(in); return
1d420 20 30 3b 20 7d 0a 20 20 6e 52 65 61 64 20 3d 20   0; }.  nRead = 
1d430 66 72 65 61 64 28 70 42 75 66 2c 20 6e 49 6e 2c  fread(pBuf, nIn,
1d440 20 31 2c 20 69 6e 29 3b 0a 20 20 66 63 6c 6f 73   1, in);.  fclos
1d450 65 28 69 6e 29 3b 0a 20 20 69 66 28 20 6e 52 65  e(in);.  if( nRe
1d460 61 64 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c  ad!=1 ){.    sql
1d470 69 74 65 33 5f 66 72 65 65 28 70 42 75 66 29 3b  ite3_free(pBuf);
1d480 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1d490 20 7d 0a 20 20 70 42 75 66 5b 6e 49 6e 5d 20 3d   }.  pBuf[nIn] =
1d4a0 20 30 3b 0a 20 20 69 66 28 20 70 6e 42 79 74 65   0;.  if( pnByte
1d4b0 20 29 20 2a 70 6e 42 79 74 65 20 3d 20 6e 49 6e   ) *pnByte = nIn
1d4c0 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b  ;.  return pBuf;
1d4d0 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
1d4e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
1d4f0 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 43 6c 6f  SSION)./*.** Clo
1d500 73 65 20 61 20 73 69 6e 67 6c 65 20 4f 70 65 6e  se a single Open
1d510 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61  Session object a
1d520 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 6f  nd release all o
1d530 66 20 69 74 73 20 61 73 73 6f 63 69 61 74 65 64  f its associated
1d540 0a 2a 2a 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a  .** resources..*
1d550 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
1d560 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 4f 70 65 6e  ssion_close(Open
1d570 53 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f  Session *pSessio
1d580 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  n){.  int i;.  s
1d590 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 64 65  qlite3session_de
1d5a0 6c 65 74 65 28 70 53 65 73 73 69 6f 6e 2d 3e 70  lete(pSession->p
1d5b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1d5c0 65 28 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d  e(pSession->zNam
1d5d0 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e);.  for(i=0; i
1d5e0 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74  <pSession->nFilt
1d5f0 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  er; i++){.    sq
1d600 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73  lite3_free(pSess
1d610 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d  ion->azFilter[i]
1d620 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1d630 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e  _free(pSession->
1d640 61 7a 46 69 6c 74 65 72 29 3b 0a 20 20 6d 65 6d  azFilter);.  mem
1d650 73 65 74 28 70 53 65 73 73 69 6f 6e 2c 20 30 2c  set(pSession, 0,
1d660 20 73 69 7a 65 6f 66 28 4f 70 65 6e 53 65 73 73   sizeof(OpenSess
1d670 69 6f 6e 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ion));.}.#endif.
1d680 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
1d690 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a   OpenSession obj
1d6a0 65 63 74 73 20 61 6e 64 20 72 65 6c 65 61 73 65  ects and release
1d6b0 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
1d6c0 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 23 69  resources..*/.#i
1d6d0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1d6e0 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29  _ENABLE_SESSION)
1d6f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 73  .static void ses
1d700 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 53  sion_close_all(S
1d710 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
1d720 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1d730 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e  0; i<p->nSession
1d740 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 65 73 73  ; i++){.    sess
1d750 69 6f 6e 5f 63 6c 6f 73 65 28 26 70 2d 3e 61 53  ion_close(&p->aS
1d760 65 73 73 69 6f 6e 5b 69 5d 29 3b 0a 20 20 7d 0a  ession[i]);.  }.
1d770 20 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 3d 20    p->nSession = 
1d780 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  0;.}.#else.# def
1d790 69 6e 65 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73  ine session_clos
1d7a0 65 5f 61 6c 6c 28 58 29 0a 23 65 6e 64 69 66 0a  e_all(X).#endif.
1d7b0 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1d7c0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 46 69  ation of the xFi
1d7d0 6c 74 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  lter function fo
1d7e0 72 20 61 6e 20 6f 70 65 6e 20 73 65 73 73 69 6f  r an open sessio
1d7f0 6e 2e 20 20 4f 6d 69 74 0a 2a 2a 20 61 6e 79 20  n.  Omit.** any 
1d800 74 61 62 6c 65 73 20 6e 61 6d 65 64 20 62 79 20  tables named by 
1d810 22 2e 73 65 73 73 69 6f 6e 20 66 69 6c 74 65 72  ".session filter
1d820 22 20 62 75 74 20 6c 65 74 20 61 6c 6c 20 6f 74  " but let all ot
1d830 68 65 72 20 74 61 62 6c 65 20 74 68 72 6f 75 67  her table throug
1d840 68 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  h..*/.#if define
1d850 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1d860 53 45 53 53 49 4f 4e 29 0a 73 74 61 74 69 63 20  SESSION).static 
1d870 69 6e 74 20 73 65 73 73 69 6f 6e 5f 66 69 6c 74  int session_filt
1d880 65 72 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 63  er(void *pCtx, c
1d890 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29  onst char *zTab)
1d8a0 7b 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  {.  OpenSession 
1d8b0 2a 70 53 65 73 73 69 6f 6e 20 3d 20 28 4f 70 65  *pSession = (Ope
1d8c0 6e 53 65 73 73 69 6f 6e 2a 29 70 43 74 78 3b 0a  nSession*)pCtx;.
1d8d0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1d8e0 3d 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e  =0; i<pSession->
1d8f0 6e 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20  nFilter; i++){. 
1d900 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
1d910 74 72 67 6c 6f 62 28 70 53 65 73 73 69 6f 6e 2d  trglob(pSession-
1d920 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 2c 20 7a 54  >azFilter[i], zT
1d930 61 62 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ab)==0 ) return 
1d940 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1d950 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  1;.}.#endif../*.
1d960 2a 2a 20 54 72 79 20 74 6f 20 64 65 64 75 63 65  ** Try to deduce
1d970 20 74 68 65 20 74 79 70 65 20 6f 66 20 66 69 6c   the type of fil
1d980 65 20 66 6f 72 20 7a 4e 61 6d 65 20 62 61 73 65  e for zName base
1d990 64 20 6f 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74  d on its content
1d9a0 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 6f 6e 65  .  Return.** one
1d9b0 20 6f 66 20 74 68 65 20 53 48 45 4c 4c 5f 4f 50   of the SHELL_OP
1d9c0 45 4e 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 0a  EN_* constants..
1d9d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
1d9e0 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
1d9f0 20 6f 72 20 69 73 20 65 6d 70 74 79 20 62 75 74   or is empty but
1da00 20 69 74 73 20 6e 61 6d 65 20 6c 6f 6f 6b 73 20   its name looks 
1da10 6c 69 6b 65 20 61 20 5a 49 50 0a 2a 2a 20 61 72  like a ZIP.** ar
1da20 63 68 69 76 65 20 61 6e 64 20 74 68 65 20 64 66  chive and the df
1da30 6c 74 5a 69 70 20 66 6c 61 67 20 69 73 20 74 72  ltZip flag is tr
1da40 75 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65 20  ue, then assume 
1da50 69 74 20 69 73 20 61 20 5a 49 50 20 61 72 63 68  it is a ZIP arch
1da60 69 76 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ive..** Otherwis
1da70 65 2c 20 61 73 73 75 6d 65 20 61 6e 20 6f 72 64  e, assume an ord
1da80 69 6e 61 72 79 20 64 61 74 61 62 61 73 65 20 72  inary database r
1da90 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
1daa0 20 66 69 6c 65 6e 61 6d 65 20 69 66 0a 2a 2a 20   filename if.** 
1dab0 74 68 65 20 74 79 70 65 20 63 61 6e 6e 6f 74 20  the type cannot 
1dac0 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20 66 72  be determined fr
1dad0 6f 6d 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69  om content..*/.i
1dae0 6e 74 20 64 65 64 75 63 65 44 61 74 61 62 61 73  nt deduceDatabas
1daf0 65 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72  eType(const char
1db00 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 64 66 6c   *zName, int dfl
1db10 74 5a 69 70 29 7b 0a 20 20 46 49 4c 45 20 2a 66  tZip){.  FILE *f
1db20 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20   = fopen(zName, 
1db30 22 72 62 22 29 3b 0a 20 20 73 69 7a 65 5f 74 20  "rb");.  size_t 
1db40 6e 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 48  n;.  int rc = SH
1db50 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3b  ELL_OPEN_UNSPEC;
1db60 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
1db70 5d 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20 29 7b  ];.  if( f==0 ){
1db80 0a 20 20 20 20 69 66 28 20 64 66 6c 74 5a 69 70  .    if( dfltZip
1db90 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c   && sqlite3_strl
1dba0 69 6b 65 28 22 25 2e 7a 69 70 22 2c 7a 4e 61 6d  ike("%.zip",zNam
1dbb0 65 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  e,0)==0 ){.     
1dbc0 20 20 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f    return SHELL_O
1dbd0 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20  PEN_ZIPFILE;.   
1dbe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 72   }else{.       r
1dbf0 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e  eturn SHELL_OPEN
1dc00 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20  _NORMAL;.    }. 
1dc10 20 7d 0a 20 20 6e 20 3d 20 66 72 65 61 64 28 7a   }.  n = fread(z
1dc20 42 75 66 2c 20 31 36 2c 20 31 2c 20 66 29 3b 0a  Buf, 16, 1, f);.
1dc30 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 6d 65    if( n==1 && me
1dc40 6d 63 6d 70 28 7a 42 75 66 2c 20 22 53 51 4c 69  mcmp(zBuf, "SQLi
1dc50 74 65 20 66 6f 72 6d 61 74 20 33 22 2c 20 31 36  te format 3", 16
1dc60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 63 6c 6f  )==0 ){.    fclo
1dc70 73 65 28 66 29 3b 0a 20 20 20 20 72 65 74 75 72  se(f);.    retur
1dc80 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52  n SHELL_OPEN_NOR
1dc90 4d 41 4c 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b  MAL;.  }.  fseek
1dca0 28 66 2c 20 2d 32 35 2c 20 53 45 45 4b 5f 45 4e  (f, -25, SEEK_EN
1dcb0 44 29 3b 0a 20 20 6e 20 3d 20 66 72 65 61 64 28  D);.  n = fread(
1dcc0 7a 42 75 66 2c 20 32 35 2c 20 31 2c 20 66 29 3b  zBuf, 25, 1, f);
1dcd0 0a 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 6d  .  if( n==1 && m
1dce0 65 6d 63 6d 70 28 7a 42 75 66 2c 20 22 53 74 61  emcmp(zBuf, "Sta
1dcf0 72 74 2d 4f 66 2d 53 51 4c 69 74 65 33 2d 22 2c  rt-Of-SQLite3-",
1dd00 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72   17)==0 ){.    r
1dd10 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41  c = SHELL_OPEN_A
1dd20 50 50 45 4e 44 56 46 53 3b 0a 20 20 7d 65 6c 73  PPENDVFS;.  }els
1dd30 65 7b 0a 20 20 20 20 66 73 65 65 6b 28 66 2c 20  e{.    fseek(f, 
1dd40 2d 32 32 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a  -22, SEEK_END);.
1dd50 20 20 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42      n = fread(zB
1dd60 75 66 2c 20 32 32 2c 20 31 2c 20 66 29 3b 0a 20  uf, 22, 1, f);. 
1dd70 20 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 7a     if( n==1 && z
1dd80 42 75 66 5b 30 5d 3d 3d 30 78 35 30 20 26 26 20  Buf[0]==0x50 && 
1dd90 7a 42 75 66 5b 31 5d 3d 3d 30 78 34 62 20 26 26  zBuf[1]==0x4b &&
1dda0 20 7a 42 75 66 5b 32 5d 3d 3d 30 78 30 35 0a 20   zBuf[2]==0x05. 
1ddb0 20 20 20 20 20 20 26 26 20 7a 42 75 66 5b 33 5d        && zBuf[3]
1ddc0 3d 3d 30 78 30 36 20 29 7b 0a 20 20 20 20 20 20  ==0x06 ){.      
1ddd0 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  rc = SHELL_OPEN_
1dde0 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d 65 6c  ZIPFILE;.    }el
1ddf0 73 65 20 69 66 28 20 6e 3d 3d 30 20 26 26 20 64  se if( n==0 && d
1de00 66 6c 74 5a 69 70 20 26 26 20 73 71 6c 69 74 65  fltZip && sqlite
1de10 33 5f 73 74 72 6c 69 6b 65 28 22 25 2e 7a 69 70  3_strlike("%.zip
1de20 22 2c 7a 4e 61 6d 65 2c 30 29 3d 3d 30 20 29 7b  ",zName,0)==0 ){
1de30 0a 20 20 20 20 20 20 72 63 20 3d 20 53 48 45 4c  .      rc = SHEL
1de40 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a  L_OPEN_ZIPFILE;.
1de50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f      }.  }.  fclo
1de60 73 65 28 66 29 3b 0a 20 20 72 65 74 75 72 6e 20  se(f);.  return 
1de70 72 63 3b 20 20 0a 7d 0a 0a 23 69 66 64 65 66 20  rc;  .}..#ifdef 
1de80 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
1de90 53 45 52 49 41 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20  SERIALIZE./*.** 
1dea0 52 65 63 6f 6e 73 74 72 75 63 74 20 61 6e 20 69  Reconstruct an i
1deb0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1dec0 65 20 75 73 69 6e 67 20 74 68 65 20 6f 75 74 70  e using the outp
1ded0 75 74 20 66 72 6f 6d 20 74 68 65 20 22 64 62 74  ut from the "dbt
1dee0 6f 74 78 74 22 0a 2a 2a 20 70 72 6f 67 72 61 6d  otxt".** program
1def0 2e 20 20 52 65 61 64 20 63 6f 6e 74 65 6e 74 20  .  Read content 
1df00 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 69 6e  from the file in
1df10 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2e   p->zDbFilename.
1df20 20 20 49 66 20 70 2d 3e 7a 44 62 46 69 6c 65 6e    If p->zDbFilen
1df30 61 6d 65 0a 2a 2a 20 69 73 20 30 2c 20 74 68 65  ame.** is 0, the
1df40 6e 20 72 65 61 64 20 66 72 6f 6d 20 73 74 61 6e  n read from stan
1df50 64 61 72 64 20 69 6e 70 75 74 2e 0a 2a 2f 0a 73  dard input..*/.s
1df60 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63  tatic unsigned c
1df70 68 61 72 20 2a 72 65 61 64 48 65 78 44 62 28 53  har *readHexDb(S
1df80 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e  hellState *p, in
1df90 74 20 2a 70 6e 44 61 74 61 29 7b 0a 20 20 75 6e  t *pnData){.  un
1dfa0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 20 3d  signed char *a =
1dfb0 20 30 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b   0;.  int nLine;
1dfc0 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
1dfd0 69 6e 74 20 70 67 73 7a 20 3d 20 30 3b 0a 20 20  int pgsz = 0;.  
1dfe0 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 30 3b  int iOffset = 0;
1dff0 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20 20 69  .  int j, k;.  i
1e000 6e 74 20 72 63 3b 0a 20 20 46 49 4c 45 20 2a 69  nt rc;.  FILE *i
1e010 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  n;.  unsigned ch
1e020 61 72 20 78 5b 31 36 5d 3b 0a 20 20 63 68 61 72  ar x[16];.  char
1e030 20 7a 4c 69 6e 65 5b 31 30 30 30 5d 3b 0a 20 20   zLine[1000];.  
1e040 69 66 28 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61  if( p->zDbFilena
1e050 6d 65 20 29 7b 0a 20 20 20 20 69 6e 20 3d 20 66  me ){.    in = f
1e060 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e  open(p->zDbFilen
1e070 61 6d 65 2c 20 22 72 22 29 3b 0a 20 20 20 20 69  ame, "r");.    i
1e080 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
1e090 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1e0a0 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20 6f 70  derr, "cannot op
1e0b0 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72 20 72 65  en \"%s\" for re
1e0c0 61 64 69 6e 67 5c 6e 22 2c 20 70 2d 3e 7a 44 62  ading\n", p->zDb
1e0d0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
1e0e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1e0f0 0a 20 20 20 20 6e 4c 69 6e 65 20 3d 20 30 3b 0a  .    nLine = 0;.
1e100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 20    }else{.    in 
1e110 3d 20 70 2d 3e 69 6e 3b 0a 20 20 20 20 6e 4c 69  = p->in;.    nLi
1e120 6e 65 20 3d 20 70 2d 3e 6c 69 6e 65 6e 6f 3b 0a  ne = p->lineno;.
1e130 20 20 7d 0a 20 20 2a 70 6e 44 61 74 61 20 3d 20    }.  *pnData = 
1e140 30 3b 0a 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20  0;.  nLine++;.  
1e150 69 66 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c  if( fgets(zLine,
1e160 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20   sizeof(zLine), 
1e170 69 6e 29 3d 3d 30 20 29 20 67 6f 74 6f 20 72 65  in)==0 ) goto re
1e180 61 64 48 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20  adHexDb_error;. 
1e190 20 72 63 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69   rc = sscanf(zLi
1e1a0 6e 65 2c 20 22 7c 20 73 69 7a 65 20 25 64 20 70  ne, "| size %d p
1e1b0 61 67 65 73 69 7a 65 20 25 64 22 2c 20 26 6e 2c  agesize %d", &n,
1e1c0 20 26 70 67 73 7a 29 3b 0a 20 20 69 66 28 20 72   &pgsz);.  if( r
1e1d0 63 21 3d 32 20 29 20 67 6f 74 6f 20 72 65 61 64  c!=2 ) goto read
1e1e0 48 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 69  HexDb_error;.  i
1e1f0 66 28 20 6e 3c 3d 30 20 29 20 67 6f 74 6f 20 72  f( n<=0 ) goto r
1e200 65 61 64 48 65 78 44 62 5f 65 72 72 6f 72 3b 0a  eadHexDb_error;.
1e210 20 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    a = sqlite3_ma
1e220 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 69 66 28  lloc( n );.  if(
1e230 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66   a==0 ){.    utf
1e240 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1e250 20 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 21   "Out of memory!
1e260 5c 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 72  \n");.    goto r
1e270 65 61 64 48 65 78 44 62 5f 65 72 72 6f 72 3b 0a  eadHexDb_error;.
1e280 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 61 2c 20    }.  memset(a, 
1e290 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 70 67 73  0, n);.  if( pgs
1e2a0 7a 3c 35 31 32 20 7c 7c 20 70 67 73 7a 3e 36 35  z<512 || pgsz>65
1e2b0 35 33 36 20 7c 7c 20 28 70 67 73 7a 20 26 20 28  536 || (pgsz & (
1e2c0 70 67 73 7a 2d 31 29 29 21 3d 30 20 29 7b 0a 20  pgsz-1))!=0 ){. 
1e2d0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1e2e0 74 64 65 72 72 2c 20 22 69 6e 76 61 6c 69 64 20  tderr, "invalid 
1e2f0 70 61 67 65 73 69 7a 65 5c 6e 22 29 3b 0a 20 20  pagesize\n");.  
1e300 20 20 67 6f 74 6f 20 72 65 61 64 48 65 78 44 62    goto readHexDb
1e310 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 66 6f  _error;.  }.  fo
1e320 72 28 6e 4c 69 6e 65 2b 2b 3b 20 66 67 65 74 73  r(nLine++; fgets
1e330 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a  (zLine, sizeof(z
1e340 4c 69 6e 65 29 2c 20 69 6e 29 21 3d 30 3b 20 6e  Line), in)!=0; n
1e350 4c 69 6e 65 2b 2b 29 7b 0a 20 20 20 20 72 63 20  Line++){.    rc 
1e360 3d 20 73 73 63 61 6e 66 28 7a 4c 69 6e 65 2c 20  = sscanf(zLine, 
1e370 22 7c 20 70 61 67 65 20 25 64 20 6f 66 66 73 65  "| page %d offse
1e380 74 20 25 64 22 2c 20 26 6a 2c 20 26 6b 29 3b 0a  t %d", &j, &k);.
1e390 20 20 20 20 69 66 28 20 72 63 3d 3d 32 20 29 7b      if( rc==2 ){
1e3a0 0a 20 20 20 20 20 20 69 4f 66 66 73 65 74 20 3d  .      iOffset =
1e3b0 20 6b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   k;.      contin
1e3c0 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
1e3d0 28 20 73 74 72 6e 63 6d 70 28 7a 4c 69 6e 65 2c  ( strncmp(zLine,
1e3e0 20 22 7c 20 65 6e 64 20 22 2c 20 36 29 3d 3d 30   "| end ", 6)==0
1e3f0 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
1e400 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1e410 73 73 63 61 6e 66 28 7a 4c 69 6e 65 2c 22 7c 20  sscanf(zLine,"| 
1e420 25 64 3a 20 25 68 68 78 20 25 68 68 78 20 25 68  %d: %hhx %hhx %h
1e430 68 78 20 25 68 68 78 20 25 68 68 78 20 25 68 68  hx %hhx %hhx %hh
1e440 78 20 25 68 68 78 20 25 68 68 78 22 0a 20 20 20  x %hhx %hhx".   
1e450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e460 20 20 20 22 20 20 25 68 68 78 20 25 68 68 78 20     "  %hhx %hhx 
1e470 25 68 68 78 20 25 68 68 78 20 25 68 68 78 20 25  %hhx %hhx %hhx %
1e480 68 68 78 20 25 68 68 78 20 25 68 68 78 22 2c 0a  hhx %hhx %hhx",.
1e490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4a0 26 6a 2c 20 26 78 5b 30 5d 2c 20 26 78 5b 31 5d  &j, &x[0], &x[1]
1e4b0 2c 20 26 78 5b 32 5d 2c 20 26 78 5b 33 5d 2c 20  , &x[2], &x[3], 
1e4c0 26 78 5b 34 5d 2c 20 26 78 5b 35 5d 2c 20 26 78  &x[4], &x[5], &x
1e4d0 5b 36 5d 2c 20 26 78 5b 37 5d 2c 0a 20 20 20 20  [6], &x[7],.    
1e4e0 20 20 20 20 20 20 20 20 20 20 20 20 26 78 5b 38              &x[8
1e4f0 5d 2c 20 26 78 5b 39 5d 2c 20 26 78 5b 31 30 5d  ], &x[9], &x[10]
1e500 2c 20 26 78 5b 31 31 5d 2c 20 26 78 5b 31 32 5d  , &x[11], &x[12]
1e510 2c 20 26 78 5b 31 33 5d 2c 20 26 78 5b 31 34 5d  , &x[13], &x[14]
1e520 2c 20 26 78 5b 31 35 5d 29 3b 0a 20 20 20 20 69  , &x[15]);.    i
1e530 66 28 20 72 63 3d 3d 31 37 20 29 7b 0a 20 20 20  f( rc==17 ){.   
1e540 20 20 20 6b 20 3d 20 69 4f 66 66 73 65 74 2b 6a     k = iOffset+j
1e550 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 2b 31 36  ;.      if( k+16
1e560 3c 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  <=n ){.        m
1e570 65 6d 63 70 79 28 61 2b 6b 2c 20 78 2c 20 31 36  emcpy(a+k, x, 16
1e580 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1e590 0a 20 20 7d 0a 20 20 2a 70 6e 44 61 74 61 20 3d  .  }.  *pnData =
1e5a0 20 6e 3b 0a 20 20 69 66 28 20 69 6e 21 3d 70 2d   n;.  if( in!=p-
1e5b0 3e 69 6e 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73  >in ){.    fclos
1e5c0 65 28 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e(in);.  }else{.
1e5d0 20 20 20 20 70 2d 3e 6c 69 6e 65 6e 6f 20 3d 20      p->lineno = 
1e5e0 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74  nLine;.  }.  ret
1e5f0 75 72 6e 20 61 3b 0a 0a 72 65 61 64 48 65 78 44  urn a;..readHexD
1e600 62 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28 20 69  b_error:.  if( i
1e610 6e 21 3d 73 74 64 69 6e 20 29 7b 0a 20 20 20 20  n!=stdin ){.    
1e620 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 65  fclose(in);.  }e
1e630 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
1e640 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a  fgets(zLine, siz
1e650 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 70 2d 3e 69  eof(zLine), p->i
1e660 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  n)!=0 ){.      n
1e670 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Line++;.      if
1e680 28 73 74 72 6e 63 6d 70 28 7a 4c 69 6e 65 2c 20  (strncmp(zLine, 
1e690 22 7c 20 65 6e 64 20 22 2c 20 36 29 3d 3d 30 20  "| end ", 6)==0 
1e6a0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
1e6b0 20 20 20 70 2d 3e 6c 69 6e 65 6e 6f 20 3d 20 6e     p->lineno = n
1e6c0 4c 69 6e 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Line;.  }.  sqli
1e6d0 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 75  te3_free(a);.  u
1e6e0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1e6f0 72 2c 22 45 72 72 6f 72 20 6f 6e 20 6c 69 6e 65  r,"Error on line
1e700 20 25 64 20 6f 66 20 2d 2d 68 65 78 64 62 20 69   %d of --hexdb i
1e710 6e 70 75 74 5c 6e 22 2c 20 6e 4c 69 6e 65 29 3b  nput\n", nLine);
1e720 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1e730 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1e740 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49  ENABLE_DESERIALI
1e750 5a 45 20 2a 2f 0a 0a 2f 2a 20 46 6c 61 67 73 20  ZE */../* Flags 
1e760 66 6f 72 20 6f 70 65 6e 5f 64 62 28 29 2e 0a 2a  for open_db()..*
1e770 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
1e780 20 62 65 68 61 76 69 6f 72 20 6f 66 20 6f 70 65   behavior of ope
1e790 6e 5f 64 62 28 29 20 69 73 20 74 6f 20 65 78 69  n_db() is to exi
1e7a0 74 28 31 29 20 69 66 20 74 68 65 20 64 61 74 61  t(1) if the data
1e7b0 62 61 73 65 20 66 61 69 6c 73 20 74 6f 0a 2a 2a  base fails to.**
1e7c0 20 6f 70 65 6e 2e 20 20 54 68 65 20 4f 50 45 4e   open.  The OPEN
1e7d0 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45 20 66 6c  _DB_KEEPALIVE fl
1e7e0 61 67 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ag changes that 
1e7f0 73 6f 20 74 68 61 74 20 69 74 20 70 72 69 6e 74  so that it print
1e800 73 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 62 75  s an error.** bu
1e810 74 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 73 20  t still returns 
1e820 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20  without calling 
1e830 65 78 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  exit..**.** The 
1e840 4f 50 45 4e 5f 44 42 5f 5a 49 50 46 49 4c 45 20  OPEN_DB_ZIPFILE 
1e850 66 6c 61 67 20 63 61 75 73 65 73 20 6f 70 65 6e  flag causes open
1e860 5f 64 62 28 29 20 74 6f 20 70 72 65 66 65 72 20  _db() to prefer 
1e870 74 6f 20 6f 70 65 6e 20 66 69 6c 65 73 20 61 73  to open files as
1e880 20 61 0a 2a 2a 20 5a 49 50 20 61 72 63 68 69 76   a.** ZIP archiv
1e890 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f  e if the file do
1e8a0 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
1e8b0 69 73 20 65 6d 70 74 79 20 61 6e 64 20 69 74 73  is empty and its
1e8c0 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 0a 2a 2a   name matches.**
1e8d0 20 74 68 65 20 2a 2e 7a 69 70 20 70 61 74 74 65   the *.zip patte
1e8e0 72 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f  rn..*/.#define O
1e8f0 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45  PEN_DB_KEEPALIVE
1e900 20 20 20 30 78 30 30 31 20 20 20 2f 2a 20 52 65     0x001   /* Re
1e910 74 75 72 6e 20 61 66 74 65 72 20 65 72 72 6f 72  turn after error
1e920 20 69 66 20 74 72 75 65 20 2a 2f 0a 23 64 65 66   if true */.#def
1e930 69 6e 65 20 4f 50 45 4e 5f 44 42 5f 5a 49 50 46  ine OPEN_DB_ZIPF
1e940 49 4c 45 20 20 20 20 20 30 78 30 30 32 20 20 20  ILE     0x002   
1e950 2f 2a 20 4f 70 65 6e 20 61 73 20 5a 49 50 20 69  /* Open as ZIP i
1e960 66 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 20 2a  f name matches *
1e970 2e 7a 69 70 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  .zip */../*.** M
1e980 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74  ake sure the dat
1e990 61 62 61 73 65 20 69 73 20 6f 70 65 6e 2e 20 20  abase is open.  
1e9a0 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
1e9b0 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49 66 0a  en open it.  If.
1e9c0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1e9d0 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c 20 70  fails to open, p
1e9e0 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65  rint an error me
1e9f0 73 73 61 67 65 20 61 6e 64 20 65 78 69 74 2e 0a  ssage and exit..
1ea00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
1ea10 70 65 6e 5f 64 62 28 53 68 65 6c 6c 53 74 61 74  pen_db(ShellStat
1ea20 65 20 2a 70 2c 20 69 6e 74 20 6f 70 65 6e 46 6c  e *p, int openFl
1ea30 61 67 73 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64  ags){.  if( p->d
1ea40 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  b==0 ){.    if( 
1ea50 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45  p->openMode==SHE
1ea60 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 20 29  LL_OPEN_UNSPEC )
1ea70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a  {.      if( p->z
1ea80 44 62 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c  DbFilename==0 ||
1ea90 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 5b   p->zDbFilename[
1eaa0 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0]==0 ){.       
1eab0 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53   p->openMode = S
1eac0 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c  HELL_OPEN_NORMAL
1ead0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1eae0 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f         p->openMo
1eaf0 64 65 20 3d 20 28 75 38 29 64 65 64 75 63 65 44  de = (u8)deduceD
1eb00 61 74 61 62 61 73 65 54 79 70 65 28 70 2d 3e 7a  atabaseType(p->z
1eb10 44 62 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20  DbFilename, .   
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb30 20 20 20 20 20 20 20 20 20 20 28 6f 70 65 6e 46            (openF
1eb40 6c 61 67 73 20 26 20 4f 50 45 4e 5f 44 42 5f 5a  lags & OPEN_DB_Z
1eb50 49 50 46 49 4c 45 29 21 3d 30 29 3b 0a 20 20 20  IPFILE)!=0);.   
1eb60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
1eb70 77 69 74 63 68 28 20 70 2d 3e 6f 70 65 6e 4d 6f  witch( p->openMo
1eb80 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  de ){.      case
1eb90 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45   SHELL_OPEN_APPE
1eba0 4e 44 56 46 53 3a 20 7b 0a 20 20 20 20 20 20 20  NDVFS: {.       
1ebb0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
1ebc0 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c  (p->zDbFilename,
1ebd0 20 26 70 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20   &p->db, .      
1ebe0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1ebf0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
1ec00 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 22  E_OPEN_CREATE, "
1ec10 61 70 6e 64 76 66 73 22 29 3b 0a 20 20 20 20 20  apndvfs");.     
1ec20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1ec30 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45  }.      case SHE
1ec40 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44 42 3a 0a 20  LL_OPEN_HEXDB:. 
1ec50 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f       case SHELL_
1ec60 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a 45  OPEN_DESERIALIZE
1ec70 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
1ec80 74 65 33 5f 6f 70 65 6e 28 30 2c 20 26 70 2d 3e  te3_open(0, &p->
1ec90 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  db);.        bre
1eca0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1ecb0 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45    case SHELL_OPE
1ecc0 4e 5f 5a 49 50 46 49 4c 45 3a 20 7b 0a 20 20 20  N_ZIPFILE: {.   
1ecd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65       sqlite3_ope
1ece0 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 26 70  n(":memory:", &p
1ecf0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62  ->db);.        b
1ed00 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1ed10 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f      case SHELL_O
1ed20 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3a 20 7b 0a  PEN_READONLY: {.
1ed30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1ed40 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a 44 62 46 69  open_v2(p->zDbFi
1ed50 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 2c 20  lename, &p->db, 
1ed60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1ed70 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 20 20  ONLY, 0);.      
1ed80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1ed90 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c  .      case SHEL
1eda0 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3a 0a 20  L_OPEN_UNSPEC:. 
1edb0 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f       case SHELL_
1edc0 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3a 20 7b 0a 20  OPEN_NORMAL: {. 
1edd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f         sqlite3_o
1ede0 70 65 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61  pen(p->zDbFilena
1edf0 6d 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20  me, &p->db);.   
1ee00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ee10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 67 6c    }.    }.    gl
1ee20 6f 62 61 6c 44 62 20 3d 20 70 2d 3e 64 62 3b 0a  obalDb = p->db;.
1ee30 20 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30      if( p->db==0
1ee40 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73   || SQLITE_OK!=s
1ee50 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70  qlite3_errcode(p
1ee60 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 75  ->db) ){.      u
1ee70 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1ee80 72 2c 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c 65  r,"Error: unable
1ee90 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
1eea0 65 20 5c 22 25 73 5c 22 3a 20 25 73 5c 6e 22 2c  e \"%s\": %s\n",
1eeb0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 44  .          p->zD
1eec0 62 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74  bFilename, sqlit
1eed0 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
1eee0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 65  );.      if( ope
1eef0 6e 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f 44 42  nFlags & OPEN_DB
1ef00 5f 4b 45 45 50 41 4c 49 56 45 20 29 7b 0a 20 20  _KEEPALIVE ){.  
1ef10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70        sqlite3_op
1ef20 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 26  en(":memory:", &
1ef30 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  p->db);.        
1ef40 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
1ef50 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
1ef60 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1ef70 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
1ef80 54 45 4e 53 49 4f 4e 0a 20 20 20 20 73 71 6c 69  TENSION.    sqli
1ef90 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
1efa0 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c  extension(p->db,
1efb0 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   1);.#endif.    
1efc0 73 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69  sqlite3_fileio_i
1efd0 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29  nit(p->db, 0, 0)
1efe0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 68  ;.    sqlite3_sh
1eff0 61 74 68 72 65 65 5f 69 6e 69 74 28 70 2d 3e 64  athree_init(p->d
1f000 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  b, 0, 0);.    sq
1f010 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 69 6f 6e  lite3_completion
1f020 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20  _init(p->db, 0, 
1f030 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0);.#ifdef SQLIT
1f040 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20  E_HAVE_ZLIB.    
1f050 73 71 6c 69 74 65 33 5f 7a 69 70 66 69 6c 65 5f  sqlite3_zipfile_
1f060 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30  init(p->db, 0, 0
1f070 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
1f080 71 6c 61 72 5f 69 6e 69 74 28 70 2d 3e 64 62 2c  qlar_init(p->db,
1f090 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
1f0a0 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
1f0b0 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
1f0c0 2c 20 22 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68  , "shell_add_sch
1f0d0 65 6d 61 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f  ema", 3, SQLITE_
1f0e0 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f100 20 20 20 20 20 73 68 65 6c 6c 41 64 64 53 63 68       shellAddSch
1f110 65 6d 61 4e 61 6d 65 2c 20 30 2c 20 30 29 3b 0a  emaName, 0, 0);.
1f120 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
1f130 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64  te_function(p->d
1f140 62 2c 20 22 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65  b, "shell_module
1f150 5f 73 63 68 65 6d 61 22 2c 20 31 2c 20 53 51 4c  _schema", 1, SQL
1f160 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
1f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f180 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 4d 6f           shellMo
1f190 64 75 6c 65 53 63 68 65 6d 61 2c 20 30 2c 20 30  duleSchema, 0, 0
1f1a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1f1b0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
1f1c0 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74  ->db, "shell_put
1f1d0 73 6e 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  snl", 1, SQLITE_
1f1e0 55 54 46 38 2c 20 70 2c 0a 20 20 20 20 20 20 20  UTF8, p,.       
1f1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f200 20 20 20 20 20 73 68 65 6c 6c 50 75 74 73 46 75       shellPutsFu
1f210 6e 63 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64  nc, 0, 0);.#ifnd
1f220 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  ef SQLITE_NOHAVE
1f230 5f 53 59 53 54 45 4d 0a 20 20 20 20 73 71 6c 69  _SYSTEM.    sqli
1f240 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1f250 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 65 64 69 74  ion(p->db, "edit
1f260 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
1f270 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f290 20 20 65 64 69 74 46 75 6e 63 2c 20 30 2c 20 30    editFunc, 0, 0
1f2a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1f2b0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
1f2c0 2d 3e 64 62 2c 20 22 65 64 69 74 22 2c 20 32 2c  ->db, "edit", 2,
1f2d0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
1f2e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69               edi
1f300 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 23 65  tFunc, 0, 0);.#e
1f310 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e  ndif.    if( p->
1f320 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f  openMode==SHELL_
1f330 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 20 29 7b 0a  OPEN_ZIPFILE ){.
1f340 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c        char *zSql
1f350 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1f360 74 66 28 0a 20 20 20 20 20 20 20 20 20 22 43 52  tf(.         "CR
1f370 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
1f380 4c 45 20 7a 69 70 20 55 53 49 4e 47 20 7a 69 70  LE zip USING zip
1f390 66 69 6c 65 28 25 51 29 3b 22 2c 20 70 2d 3e 7a  file(%Q);", p->z
1f3a0 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  DbFilename);.   
1f3b0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
1f3c0 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20  p->db, zSql, 0, 
1f3d0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
1f3e0 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
1f3f0 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
1f400 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45  LITE_ENABLE_DESE
1f410 52 49 41 4c 49 5a 45 0a 20 20 20 20 65 6c 73 65  RIALIZE.    else
1f420 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e  .    if( p->open
1f430 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Mode==SHELL_OPEN
1f440 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 7c 7c 20  _DESERIALIZE || 
1f450 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45  p->openMode==SHE
1f460 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44 42 20 29 7b  LL_OPEN_HEXDB ){
1f470 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
1f480 20 20 20 20 20 69 6e 74 20 6e 44 61 74 61 20 3d       int nData =
1f490 20 30 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e   0;.      unsign
1f4a0 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a  ed char *aData;.
1f4b0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65        if( p->ope
1f4c0 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45  nMode==SHELL_OPE
1f4d0 4e 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 29 7b  N_DESERIALIZE ){
1f4e0 0a 20 20 20 20 20 20 20 20 61 44 61 74 61 20 3d  .        aData =
1f4f0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
1f500 29 72 65 61 64 46 69 6c 65 28 70 2d 3e 7a 44 62  )readFile(p->zDb
1f510 46 69 6c 65 6e 61 6d 65 2c 20 26 6e 44 61 74 61  Filename, &nData
1f520 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1f530 20 20 20 20 20 20 20 20 61 44 61 74 61 20 3d 20          aData = 
1f540 72 65 61 64 48 65 78 44 62 28 70 2c 20 26 6e 44  readHexDb(p, &nD
1f550 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ata);.        if
1f560 28 20 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20  ( aData==0 ){.  
1f570 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
1f580 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1f590 6f 72 20 69 6e 20 68 65 78 64 62 20 69 6e 70 75  or in hexdb inpu
1f5a0 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  t\n");.         
1f5b0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
1f5c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1f5d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65   rc = sqlite3_de
1f5e0 73 65 72 69 61 6c 69 7a 65 28 70 2d 3e 64 62 2c  serialize(p->db,
1f5f0 20 22 6d 61 69 6e 22 2c 20 61 44 61 74 61 2c 20   "main", aData, 
1f600 6e 44 61 74 61 2c 20 6e 44 61 74 61 2c 0a 20 20  nData, nData,.  
1f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f620 20 53 51 4c 49 54 45 5f 44 45 53 45 52 49 41 4c   SQLITE_DESERIAL
1f630 49 5a 45 5f 52 45 53 49 5a 45 41 42 4c 45 20 7c  IZE_RESIZEABLE |
1f640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f650 20 20 20 20 53 51 4c 49 54 45 5f 44 45 53 45 52      SQLITE_DESER
1f660 49 41 4c 49 5a 45 5f 46 52 45 45 4f 4e 43 4c 4f  IALIZE_FREEONCLO
1f670 53 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  SE);.      if( r
1f680 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  c ){.        utf
1f690 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1f6a0 20 22 45 72 72 6f 72 3a 20 73 71 6c 69 74 65 33   "Error: sqlite3
1f6b0 5f 64 65 73 65 72 69 61 6c 69 7a 65 28 29 20 72  _deserialize() r
1f6c0 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63  eturns %d\n", rc
1f6d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f6e0 20 69 66 28 20 70 2d 3e 73 7a 4d 61 78 3e 30 20   if( p->szMax>0 
1f6f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1f700 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
1f710 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53  p->db, "main", S
1f720 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
1f730 5f 4c 49 4d 49 54 2c 20 26 70 2d 3e 73 7a 4d 61  _LIMIT, &p->szMa
1f740 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
1f750 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
1f760 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
1f770 20 63 6c 6f 73 65 20 74 68 65 20 64 61 74 61 62   close the datab
1f780 61 65 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  aes connection. 
1f790 20 52 65 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a   Report errors..
1f7a0 2a 2f 0a 76 6f 69 64 20 63 6c 6f 73 65 5f 64 62  */.void close_db
1f7b0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
1f7c0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1f7d0 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 69  3_close(db);.  i
1f7e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66  f( rc ){.    utf
1f7f0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1f800 20 22 45 72 72 6f 72 3a 20 73 71 6c 69 74 65 33   "Error: sqlite3
1f810 5f 63 6c 6f 73 65 28 29 20 72 65 74 75 72 6e 73  _close() returns
1f820 20 25 64 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20   %d: %s\n",.    
1f830 20 20 20 20 72 63 2c 20 73 71 6c 69 74 65 33 5f      rc, sqlite3_
1f840 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d  errmsg(db));.  }
1f850 20 0a 7d 0a 0a 23 69 66 20 48 41 56 45 5f 52 45   .}..#if HAVE_RE
1f860 41 44 4c 49 4e 45 20 7c 7c 20 48 41 56 45 5f 45  ADLINE || HAVE_E
1f870 44 49 54 4c 49 4e 45 0a 2f 2a 0a 2a 2a 20 52 65  DITLINE./*.** Re
1f880 61 64 6c 69 6e 65 20 63 6f 6d 70 6c 65 74 69 6f  adline completio
1f890 6e 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2f 0a 73  n callbacks.*/.s
1f8a0 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 61 64  tatic char *read
1f8b0 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f  line_completion_
1f8c0 67 65 6e 65 72 61 74 6f 72 28 63 6f 6e 73 74 20  generator(const 
1f8d0 63 68 61 72 20 2a 74 65 78 74 2c 20 69 6e 74 20  char *text, int 
1f8e0 73 74 61 74 65 29 7b 0a 20 20 73 74 61 74 69 63  state){.  static
1f8f0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1f900 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
1f910 20 2a 7a 52 65 74 3b 0a 20 20 69 66 28 20 73 74   *zRet;.  if( st
1f920 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  ate==0 ){.    ch
1f930 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 73 71  ar *zSql;.    sq
1f940 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1f950 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20  Stmt);.    zSql 
1f960 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1f970 66 28 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e  f("SELECT DISTIN
1f980 43 54 20 63 61 6e 64 69 64 61 74 65 20 43 4f 4c  CT candidate COL
1f990 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20 20 20  LATE nocase".   
1f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9b0 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20          "  FROM 
1f9c0 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 29 20 4f  completion(%Q) O
1f9d0 52 44 45 52 20 42 59 20 31 22 2c 20 74 65 78 74  RDER BY 1", text
1f9e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 70  );.    sqlite3_p
1f9f0 72 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c  repare_v2(global
1fa00 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  Db, zSql, -1, &p
1fa10 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
1fa20 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
1fa30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
1fa40 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
1fa50 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
1fa60 20 20 20 7a 52 65 74 20 3d 20 73 74 72 64 75 70     zRet = strdup
1fa70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71  ((const char*)sq
1fa80 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1fa90 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20  t(pStmt, 0));.  
1faa0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1fab0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
1fac0 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20  t);.    pStmt = 
1fad0 30 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20 30 3b  0;.    zRet = 0;
1fae0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
1faf0 65 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63 68 61  et;.}.static cha
1fb00 72 20 2a 2a 72 65 61 64 6c 69 6e 65 5f 63 6f 6d  r **readline_com
1fb10 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68  pletion(const ch
1fb20 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 69  ar *zText, int i
1fb30 53 74 61 72 74 2c 20 69 6e 74 20 69 45 6e 64 29  Start, int iEnd)
1fb40 7b 0a 20 20 72 6c 5f 61 74 74 65 6d 70 74 65 64  {.  rl_attempted
1fb50 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6f 76 65 72  _completion_over
1fb60 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 1;.  return r
1fb70 6c 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6d 61 74  l_completion_mat
1fb80 63 68 65 73 28 7a 54 65 78 74 2c 20 72 65 61 64  ches(zText, read
1fb90 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f  line_completion_
1fba0 67 65 6e 65 72 61 74 6f 72 29 3b 0a 7d 0a 0a 23  generator);.}..#
1fbb0 65 6c 69 66 20 48 41 56 45 5f 4c 49 4e 45 4e 4f  elif HAVE_LINENO
1fbc0 49 53 45 0a 2f 2a 0a 2a 2a 20 4c 69 6e 65 6e 6f  ISE./*.** Lineno
1fbd0 69 73 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 63  ise completion c
1fbe0 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74 61 74 69  allback.*/.stati
1fbf0 63 20 76 6f 69 64 20 6c 69 6e 65 6e 6f 69 73 65  c void linenoise
1fc00 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73  _completion(cons
1fc10 74 20 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 6c  t char *zLine, l
1fc20 69 6e 65 6e 6f 69 73 65 43 6f 6d 70 6c 65 74 69  inenoiseCompleti
1fc30 6f 6e 73 20 2a 6c 63 29 7b 0a 20 20 69 6e 74 20  ons *lc){.  int 
1fc40 6e 4c 69 6e 65 20 3d 20 73 74 72 6c 65 6e 33 30  nLine = strlen30
1fc50 28 7a 4c 69 6e 65 29 3b 0a 20 20 69 6e 74 20 69  (zLine);.  int i
1fc60 2c 20 69 53 74 61 72 74 3b 0a 20 20 73 71 6c 69  , iStart;.  sqli
1fc70 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
1fc80 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71  = 0;.  char *zSq
1fc90 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  l;.  char zBuf[1
1fca0 30 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6e 4c 69  000];..  if( nLi
1fcb0 6e 65 3e 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d  ne>sizeof(zBuf)-
1fcc0 33 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  30 ) return;.  i
1fcd0 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27  f( zLine[0]=='.'
1fce0 20 7c 7c 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 23   || zLine[0]=='#
1fcf0 27 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72  ') return;.  for
1fd00 28 69 3d 6e 4c 69 6e 65 2d 31 3b 20 69 3e 3d 30  (i=nLine-1; i>=0
1fd10 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 7a 4c 69   && (isalnum(zLi
1fd20 6e 65 5b 69 5d 29 20 7c 7c 20 7a 4c 69 6e 65 5b  ne[i]) || zLine[
1fd30 69 5d 3d 3d 27 5f 27 29 3b 20 69 2d 2d 29 7b 7d  i]=='_'); i--){}
1fd40 0a 20 20 69 66 28 20 69 3d 3d 6e 4c 69 6e 65 2d  .  if( i==nLine-
1fd50 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 53  1 ) return;.  iS
1fd60 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20 6d 65  tart = i+1;.  me
1fd70 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65  mcpy(zBuf, zLine
1fd80 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 7a 53 71  , iStart);.  zSq
1fd90 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
1fda0 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49 53 54  ntf("SELECT DIST
1fdb0 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20 43  INCT candidate C
1fdc0 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20  OLLATE nocase". 
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fde0 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20          "  FROM 
1fdf0 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 2c 25 51  completion(%Q,%Q
1fe00 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c 0a 20  ) ORDER BY 1",. 
1fe10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe20 20 20 20 20 20 20 20 20 26 7a 4c 69 6e 65 5b 69          &zLine[i
1fe30 53 74 61 72 74 5d 2c 20 7a 4c 69 6e 65 29 3b 0a  Start], zLine);.
1fe40 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
1fe50 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a  e_v2(globalDb, z
1fe60 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
1fe70 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
1fe80 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 71 6c  ree(zSql);.  sql
1fe90 69 74 65 33 5f 65 78 65 63 28 67 6c 6f 62 61 6c  ite3_exec(global
1fea0 44 62 2c 20 22 50 52 41 47 4d 41 20 70 61 67 65  Db, "PRAGMA page
1feb0 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 30 2c 20 30  _count", 0, 0, 0
1fec0 29 3b 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 73  ); /* Load the s
1fed0 63 68 65 6d 61 20 2a 2f 0a 20 20 77 68 69 6c 65  chema */.  while
1fee0 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
1fef0 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
1ff00 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  W ){.    const c
1ff10 68 61 72 20 2a 7a 43 6f 6d 70 6c 65 74 69 6f 6e  har *zCompletion
1ff20 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
1ff30 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1ff40 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  ext(pStmt, 0);. 
1ff50 20 20 20 69 6e 74 20 6e 43 6f 6d 70 6c 65 74 69     int nCompleti
1ff60 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  on = sqlite3_col
1ff70 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
1ff80 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 53 74   0);.    if( iSt
1ff90 61 72 74 2b 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20  art+nCompletion 
1ffa0 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31  < sizeof(zBuf)-1
1ffb0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
1ffc0 28 7a 42 75 66 2b 69 53 74 61 72 74 2c 20 7a 43  (zBuf+iStart, zC
1ffd0 6f 6d 70 6c 65 74 69 6f 6e 2c 20 6e 43 6f 6d 70  ompletion, nComp
1ffe0 6c 65 74 69 6f 6e 2b 31 29 3b 0a 20 20 20 20 20  letion+1);.     
1fff0 20 6c 69 6e 65 6e 6f 69 73 65 41 64 64 43 6f 6d   linenoiseAddCom
20000 70 6c 65 74 69 6f 6e 28 6c 63 2c 20 7a 42 75 66  pletion(lc, zBuf
20010 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
20020 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
20030 70 53 74 6d 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  pStmt);.}.#endif
20040 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d 6c 61 6e  ../*.** Do C-lan
20050 67 75 61 67 65 20 73 74 79 6c 65 20 64 65 71 75  guage style dequ
20060 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  oting..**.**    
20070 5c 61 20 20 20 20 2d 3e 20 61 6c 61 72 6d 0a 2a  \a    -> alarm.*
20080 2a 20 20 20 20 5c 62 20 20 20 20 2d 3e 20 62 61  *    \b    -> ba
20090 63 6b 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c 74  ckspace.**    \t
200a0 20 20 20 20 2d 3e 20 74 61 62 0a 2a 2a 20 20 20      -> tab.**   
200b0 20 5c 6e 20 20 20 20 2d 3e 20 6e 65 77 6c 69 6e   \n    -> newlin
200c0 65 0a 2a 2a 20 20 20 20 5c 76 20 20 20 20 2d 3e  e.**    \v    ->
200d0 20 76 65 72 74 69 63 61 6c 20 74 61 62 0a 2a 2a   vertical tab.**
200e0 20 20 20 20 5c 66 20 20 20 20 2d 3e 20 66 6f 72      \f    -> for
200f0 6d 20 66 65 65 64 0a 2a 2a 20 20 20 20 5c 72 20  m feed.**    \r 
20100 20 20 20 2d 3e 20 63 61 72 72 69 61 67 65 20 72     -> carriage r
20110 65 74 75 72 6e 0a 2a 2a 20 20 20 20 5c 73 20 20  eturn.**    \s  
20120 20 20 2d 3e 20 73 70 61 63 65 0a 2a 2a 20 20 20    -> space.**   
20130 20 5c 22 20 20 20 20 2d 3e 20 22 0a 2a 2a 20 20   \"    -> ".**  
20140 20 20 5c 27 20 20 20 20 2d 3e 20 27 0a 2a 2a 20    \'    -> '.** 
20150 20 20 20 5c 5c 20 20 20 20 2d 3e 20 62 61 63 6b     \\    -> back
20160 73 6c 61 73 68 0a 2a 2a 20 20 20 20 5c 4e 4e 4e  slash.**    \NNN
20170 20 20 2d 3e 20 61 73 63 69 69 20 63 68 61 72 61    -> ascii chara
20180 63 74 65 72 20 4e 4e 4e 20 69 6e 20 6f 63 74 61  cter NNN in octa
20190 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  l.*/.static void
201a0 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
201b0 73 68 65 73 28 63 68 61 72 20 2a 7a 29 7b 0a 20  shes(char *z){. 
201c0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61   int i, j;.  cha
201d0 72 20 63 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  r c;.  while( *z
201e0 20 26 26 20 2a 7a 21 3d 27 5c 5c 27 20 29 20 7a   && *z!='\\' ) z
201f0 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  ++;.  for(i=j=0;
20200 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20   (c = z[i])!=0; 
20210 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  i++, j++){.    i
20220 66 28 20 63 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b  f( c=='\\' && z[
20230 69 2b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20  i+1]!=0 ){.     
20240 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20   c = z[++i];.   
20250 20 20 20 69 66 28 20 63 3d 3d 27 61 27 20 29 7b     if( c=='a' ){
20260 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 61  .        c = '\a
20270 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
20280 66 28 20 63 3d 3d 27 62 27 20 29 7b 0a 20 20 20  f( c=='b' ){.   
20290 20 20 20 20 20 63 20 3d 20 27 5c 62 27 3b 0a 20       c = '\b';. 
202a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
202b0 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20 20  =='t' ){.       
202c0 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20 20 20 20   c = '\t';.     
202d0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 6e   }else if( c=='n
202e0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
202f0 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\n';.      }el
20300 73 65 20 69 66 28 20 63 3d 3d 27 76 27 20 29 7b  se if( c=='v' ){
20310 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 76  .        c = '\v
20320 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
20330 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20  f( c=='f' ){.   
20340 20 20 20 20 20 63 20 3d 20 27 5c 66 27 3b 0a 20       c = '\f';. 
20350 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
20360 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20 20 20  =='r' ){.       
20370 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20 20 20   c = '\r';.     
20380 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22   }else if( c=='"
20390 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
203a0 20 27 22 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73   '"';.      }els
203b0 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b  e if( c=='\'' ){
203c0 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 27  .        c = '\'
203d0 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
203e0 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20  f( c=='\\' ){.  
203f0 20 20 20 20 20 20 63 20 3d 20 27 5c 5c 27 3b 0a        c = '\\';.
20400 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
20410 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 37 27  c>='0' && c<='7'
20420 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 2d 3d   ){.        c -=
20430 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66   '0';.        if
20440 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26  ( z[i+1]>='0' &&
20450 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a   z[i+1]<='7' ){.
20460 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
20470 20 20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c           c = (c<
20480 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27  <3) + z[i] - '0'
20490 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
204a0 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a  z[i+1]>='0' && z
204b0 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20  [i+1]<='7' ){.  
204c0 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
204d0 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 28             c = (
204e0 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27  c<<3) + z[i] - '
204f0 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0';.          }.
20500 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20510 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
20520 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = c;.  }.  if( 
20530 6a 3c 69 20 29 20 7a 5b 6a 5d 20 3d 20 30 3b 0a  j<i ) z[j] = 0;.
20540 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  }../*.** Interpr
20550 65 74 20 7a 41 72 67 20 61 73 20 65 69 74 68 65  et zArg as eithe
20560 72 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  r an integer or 
20570 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e  a boolean value.
20580 20 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30 0a    Return 1 or 0.
20590 2a 2a 20 66 6f 72 20 54 52 55 45 20 61 6e 64 20  ** for TRUE and 
205a0 46 41 4c 53 45 2e 20 20 52 65 74 75 72 6e 20 74  FALSE.  Return t
205b0 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
205c0 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e   if appropriate.
205d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
205e0 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 63 6f 6e 73  ooleanValue(cons
205f0 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20  t char *zArg){. 
20600 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 41   int i;.  if( zA
20610 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41  rg[0]=='0' && zA
20620 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20  rg[1]=='x' ){.  
20630 20 20 66 6f 72 28 69 3d 32 3b 20 68 65 78 44 69    for(i=2; hexDi
20640 67 69 74 56 61 6c 75 65 28 7a 41 72 67 5b 69 5d  gitValue(zArg[i]
20650 29 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d  )>=0; i++){}.  }
20660 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
20670 30 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27 30 27 20  0; zArg[i]>='0' 
20680 26 26 20 7a 41 72 67 5b 69 5d 3c 3d 27 39 27 3b  && zArg[i]<='9';
20690 20 69 2b 2b 29 7b 7d 0a 20 20 7d 0a 20 20 69 66   i++){}.  }.  if
206a0 28 20 69 3e 30 20 26 26 20 7a 41 72 67 5b 69 5d  ( i>0 && zArg[i]
206b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28 69 6e  ==0 ) return (in
206c0 74 29 28 69 6e 74 65 67 65 72 56 61 6c 75 65 28  t)(integerValue(
206d0 7a 41 72 67 29 20 26 20 30 78 66 66 66 66 66 66  zArg) & 0xffffff
206e0 66 66 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ff);.  if( sqlit
206f0 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c  e3_stricmp(zArg,
20700 20 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20 73 71 6c   "on")==0 || sql
20710 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
20720 67 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a 20  g,"yes")==0 ){. 
20730 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
20740 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
20750 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 66  tricmp(zArg, "of
20760 66 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  f")==0 || sqlite
20770 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22  3_stricmp(zArg,"
20780 6e 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  no")==0 ){.    r
20790 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 75  eturn 0;.  }.  u
207a0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
207b0 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 74 20 61  r, "ERROR: Not a
207c0 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20   boolean value: 
207d0 5c 22 25 73 5c 22 2e 20 41 73 73 75 6d 69 6e 67  \"%s\". Assuming
207e0 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20 20 20   \"no\".\n",.   
207f0 20 20 20 20 20 20 20 7a 41 72 67 29 3b 0a 20 20         zArg);.  
20800 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
20810 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20  ** Set or clear 
20820 61 20 73 68 65 6c 6c 20 66 6c 61 67 20 61 63 63  a shell flag acc
20830 6f 72 64 69 6e 67 20 74 6f 20 61 20 62 6f 6f 6c  ording to a bool
20840 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  ean value..*/.st
20850 61 74 69 63 20 76 6f 69 64 20 73 65 74 4f 72 43  atic void setOrC
20860 6c 65 61 72 46 6c 61 67 28 53 68 65 6c 6c 53 74  learFlag(ShellSt
20870 61 74 65 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64  ate *p, unsigned
20880 20 6d 46 6c 61 67 2c 20 63 6f 6e 73 74 20 63 68   mFlag, const ch
20890 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 66 28  ar *zArg){.  if(
208a0 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 7a 41   booleanValue(zA
208b0 72 67 29 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  rg) ){.    Shell
208c0 53 65 74 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67  SetFlag(p, mFlag
208d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
208e0 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70  ShellClearFlag(p
208f0 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 0a 7d 0a  , mFlag);.  }.}.
20900 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
20910 6f 75 74 70 75 74 20 66 69 6c 65 2c 20 61 73 73  output file, ass
20920 75 6d 69 6e 67 20 69 74 20 69 73 20 6e 6f 74 20  uming it is not 
20930 73 74 64 65 72 72 20 6f 72 20 73 74 64 6f 75 74  stderr or stdout
20940 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
20950 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73  output_file_clos
20960 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 69 66  e(FILE *f){.  if
20970 28 20 66 20 26 26 20 66 21 3d 73 74 64 6f 75 74  ( f && f!=stdout
20980 20 26 26 20 66 21 3d 73 74 64 65 72 72 20 29 20   && f!=stderr ) 
20990 66 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a 2f 2a  fclose(f);.}../*
209a0 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 70 65 6e 20  .** Try to open 
209b0 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20  an output file. 
209c0 20 20 54 68 65 20 6e 61 6d 65 73 20 22 73 74 64    The names "std
209d0 6f 75 74 22 20 61 6e 64 20 22 73 74 64 65 72 72  out" and "stderr
209e0 22 20 61 72 65 0a 2a 2a 20 72 65 63 6f 67 6e 69  " are.** recogni
209f0 7a 65 64 20 61 6e 64 20 64 6f 20 74 68 65 20 72  zed and do the r
20a00 69 67 68 74 20 74 68 69 6e 67 2e 20 20 4e 55 4c  ight thing.  NUL
20a10 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  L is returned if
20a20 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 66   the output.** f
20a30 69 6c 65 6e 61 6d 65 20 69 73 20 22 6f 66 66 22  ilename is "off"
20a40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 49 4c 45  ..*/.static FILE
20a50 20 2a 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70   *output_file_op
20a60 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
20a70 46 69 6c 65 2c 20 69 6e 74 20 62 54 65 78 74 4d  File, int bTextM
20a80 6f 64 65 29 7b 0a 20 20 46 49 4c 45 20 2a 66 3b  ode){.  FILE *f;
20a90 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46  .  if( strcmp(zF
20aa0 69 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30  ile,"stdout")==0
20ab0 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 6f   ){.    f = stdo
20ac0 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ut;.  }else if( 
20ad0 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 73  strcmp(zFile, "s
20ae0 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20 20  tderr")==0 ){.  
20af0 20 20 66 20 3d 20 73 74 64 65 72 72 3b 0a 20 20    f = stderr;.  
20b00 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
20b10 28 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29 3d 3d  (zFile, "off")==
20b20 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 30 3b 0a  0 ){.    f = 0;.
20b30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 20 3d    }else{.    f =
20b40 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 62 54   fopen(zFile, bT
20b50 65 78 74 4d 6f 64 65 20 3f 20 22 77 22 20 3a 20  extMode ? "w" : 
20b60 22 77 62 22 29 3b 0a 20 20 20 20 69 66 28 20 66  "wb");.    if( f
20b70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
20b80 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
20b90 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
20ba0 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
20bb0 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zFile);.    }.  
20bc0 7d 0a 20 20 72 65 74 75 72 6e 20 66 3b 0a 7d 0a  }.  return f;.}.
20bd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20be0 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  OMIT_TRACE./*.**
20bf0 20 41 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 68   A routine for h
20c00 61 6e 64 6c 69 6e 67 20 6f 75 74 70 75 74 20 66  andling output f
20c10 72 6f 6d 20 73 71 6c 69 74 65 33 5f 74 72 61 63  rom sqlite3_trac
20c20 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
20c30 6e 74 20 73 71 6c 5f 74 72 61 63 65 5f 63 61 6c  nt sql_trace_cal
20c40 6c 62 61 63 6b 28 0a 20 20 75 6e 73 69 67 6e 65  lback(.  unsigne
20c50 64 20 6d 54 79 70 65 2c 20 20 20 20 20 20 20 20  d mType,        
20c60 20 2f 2a 20 54 68 65 20 74 72 61 63 65 20 74 79   /* The trace ty
20c70 70 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  pe */.  void *pA
20c80 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
20c90 2f 2a 20 54 68 65 20 53 68 65 6c 6c 53 74 61 74  /* The ShellStat
20ca0 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 76  e pointer */.  v
20cb0 6f 69 64 20 2a 70 50 2c 20 20 20 20 20 20 20 20  oid *pP,        
20cc0 20 20 20 20 20 20 20 2f 2a 20 55 73 75 61 6c 6c         /* Usuall
20cd0 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 73  y a pointer to s
20ce0 71 6c 69 74 65 5f 73 74 6d 74 20 2a 2f 0a 20 20  qlite_stmt */.  
20cf0 76 6f 69 64 20 2a 70 58 20 20 20 20 20 20 20 20  void *pX        
20d00 20 20 20 20 20 20 20 20 2f 2a 20 41 75 78 69 6c          /* Auxil
20d10 69 61 72 79 20 6f 75 74 70 75 74 20 2a 2f 0a 29  iary output */.)
20d20 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  {.  ShellState *
20d30 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a  p = (ShellState*
20d40 29 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  )pArg;.  sqlite3
20d50 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
20d60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
20d70 3b 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 0a 20 20  ;.  int nSql;.  
20d80 69 66 28 20 70 2d 3e 74 72 61 63 65 4f 75 74 3d  if( p->traceOut=
20d90 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
20da0 20 69 66 28 20 6d 54 79 70 65 3d 3d 53 51 4c 49   if( mType==SQLI
20db0 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 20 29  TE_TRACE_CLOSE )
20dc0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
20dd0 66 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20 22  f(p->traceOut, "
20de0 2d 2d 20 63 6c 6f 73 69 6e 67 20 64 61 74 61 62  -- closing datab
20df0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 5c 6e  ase connection\n
20e00 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ");.    return 0
20e10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 54 79 70  ;.  }.  if( mTyp
20e20 65 21 3d 53 51 4c 49 54 45 5f 54 52 41 43 45 5f  e!=SQLITE_TRACE_
20e30 52 4f 57 20 26 26 20 28 28 63 6f 6e 73 74 20 63  ROW && ((const c
20e40 68 61 72 2a 29 70 58 29 5b 30 5d 3d 3d 27 2d 27  har*)pX)[0]=='-'
20e50 20 29 7b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 28   ){.    zSql = (
20e60 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 58 3b 0a  const char*)pX;.
20e70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74    }else{.    pSt
20e80 6d 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74  mt = (sqlite3_st
20e90 6d 74 2a 29 70 50 3b 0a 20 20 20 20 73 77 69 74  mt*)pP;.    swit
20ea0 63 68 28 20 70 2d 3e 65 54 72 61 63 65 54 79 70  ch( p->eTraceTyp
20eb0 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
20ec0 53 48 45 4c 4c 5f 54 52 41 43 45 5f 45 58 50 41  SHELL_TRACE_EXPA
20ed0 4e 44 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  NDED: {.        
20ee0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65  zSql = sqlite3_e
20ef0 78 70 61 6e 64 65 64 5f 73 71 6c 28 70 53 74 6d  xpanded_sql(pStm
20f00 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
20f10 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65  k;.      }.#ifde
20f20 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
20f30 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 20 20 20 20  NORMALIZE.      
20f40 63 61 73 65 20 53 48 45 4c 4c 5f 54 52 41 43 45  case SHELL_TRACE
20f50 5f 4e 4f 52 4d 41 4c 49 5a 45 44 3a 20 7b 0a 20  _NORMALIZED: {. 
20f60 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71         zSql = sq
20f70 6c 69 74 65 33 5f 6e 6f 72 6d 61 6c 69 7a 65 64  lite3_normalized
20f80 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20  _sql(pStmt);.   
20f90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20fa0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
20fb0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
20fc0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
20fd0 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20  e3_sql(pStmt);. 
20fe0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20ff0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
21000 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
21010 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 53 71 6c  return 0;.  nSql
21020 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c   = strlen30(zSql
21030 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 71 6c  );.  while( nSql
21040 3e 30 20 26 26 20 7a 53 71 6c 5b 6e 53 71 6c 2d  >0 && zSql[nSql-
21050 31 5d 3d 3d 27 3b 27 20 29 7b 20 6e 53 71 6c 2d  1]==';' ){ nSql-
21060 2d 3b 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6d  -; }.  switch( m
21070 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  Type ){.    case
21080 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f   SQLITE_TRACE_RO
21090 57 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  W:.    case SQLI
210a0 54 45 5f 54 52 41 43 45 5f 53 54 4d 54 3a 20 7b  TE_TRACE_STMT: {
210b0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
210c0 74 66 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20  tf(p->traceOut, 
210d0 22 25 2e 2a 73 3b 5c 6e 22 2c 20 6e 53 71 6c 2c  "%.*s;\n", nSql,
210e0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 62 72   zSql);.      br
210f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
21100 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 43 45  ase SQLITE_TRACE
21110 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20 20 20  _PROFILE: {.    
21120 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
21130 6e 4e 61 6e 6f 73 65 63 20 3d 20 2a 28 73 71 6c  nNanosec = *(sql
21140 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 58 3b 0a  ite3_int64*)pX;.
21150 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
21160 66 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c 20 22  f(p->traceOut, "
21170 25 2e 2a 73 3b 20 2d 2d 20 25 6c 6c 64 20 6e 73  %.*s; -- %lld ns
21180 5c 6e 22 2c 20 6e 53 71 6c 2c 20 7a 53 71 6c 2c  \n", nSql, zSql,
21190 20 6e 4e 61 6e 6f 73 65 63 29 3b 0a 20 20 20 20   nNanosec);.    
211a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
211b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
211c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
211d0 20 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74   no-op routine t
211e0 68 61 74 20 72 75 6e 73 20 77 69 74 68 20 74 68  hat runs with th
211f0 65 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20  e ".breakpoint" 
21200 64 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68  doc-command.  Th
21210 69 73 20 69 73 0a 2a 2a 20 61 20 75 73 65 66 75  is is.** a usefu
21220 6c 20 73 70 6f 74 20 74 6f 20 73 65 74 20 61 20  l spot to set a 
21230 64 65 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f  debugger breakpo
21240 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  int..*/.static v
21250 6f 69 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f  oid test_breakpo
21260 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  int(void){.  sta
21270 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20  tic int nCall = 
21280 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a  0;.  nCall++;.}.
21290 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74  ./*.** An object
212a0 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 61 20   used to read a 
212b0 43 53 56 20 61 6e 64 20 6f 74 68 65 72 20 66 69  CSV and other fi
212c0 6c 65 73 20 66 6f 72 20 69 6d 70 6f 72 74 2e 0a  les for import..
212d0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
212e0 74 20 49 6d 70 6f 72 74 43 74 78 20 49 6d 70 6f  t ImportCtx Impo
212f0 72 74 43 74 78 3b 0a 73 74 72 75 63 74 20 49 6d  rtCtx;.struct Im
21300 70 6f 72 74 43 74 78 20 7b 0a 20 20 63 6f 6e 73  portCtx {.  cons
21310 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20  t char *zFile;  
21320 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
21330 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 46  nput file */.  F
21340 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20  ILE *in;        
21350 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 43     /* Read the C
21360 53 56 20 74 65 78 74 20 66 72 6f 6d 20 74 68 69  SV text from thi
21370 73 20 69 6e 70 75 74 20 73 74 72 65 61 6d 20 2a  s input stream *
21380 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
21390 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63 75 6d          /* Accum
213a0 75 6c 61 74 65 64 20 74 65 78 74 20 66 6f 72 20  ulated text for 
213b0 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  a field */.  int
213c0 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
213d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
213e0 74 65 73 20 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e  tes in z */.  in
213f0 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20  t nAlloc;       
21400 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63    /* Space alloc
21410 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a  ated for z[] */.
21420 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20    int nLine;    
21430 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
21440 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
21450 20 20 69 6e 74 20 62 4e 6f 74 46 69 72 73 74 3b    int bNotFirst;
21460 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
21470 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62 79 74   one or more byt
21480 65 73 20 61 6c 72 65 61 64 79 20 72 65 61 64 20  es already read 
21490 2a 2f 0a 20 20 69 6e 74 20 63 54 65 72 6d 3b 20  */.  int cTerm; 
214a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 72           /* Char
214b0 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d 69  acter that termi
214c0 6e 61 74 65 64 20 74 68 65 20 6d 6f 73 74 20 72  nated the most r
214d0 65 63 65 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20  ecent field */. 
214e0 20 69 6e 74 20 63 43 6f 6c 53 65 70 3b 20 20 20   int cColSep;   
214f0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75       /* The colu
21500 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  mn separator cha
21510 72 61 63 74 65 72 2e 20 20 28 55 73 75 61 6c 6c  racter.  (Usuall
21520 79 20 22 2c 22 29 20 2a 2f 0a 20 20 69 6e 74 20  y ",") */.  int 
21530 63 52 6f 77 53 65 70 3b 20 20 20 20 20 20 20 20  cRowSep;        
21540 2f 2a 20 54 68 65 20 72 6f 77 20 73 65 70 61 72  /* The row separ
21550 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 2e 20  ator character. 
21560 20 28 55 73 75 61 6c 6c 79 20 22 5c 6e 22 29 20   (Usually "\n") 
21570 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64  */.};../* Append
21580 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74   a single byte t
21590 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74 69 63 20  o z[] */.static 
215a0 76 6f 69 64 20 69 6d 70 6f 72 74 5f 61 70 70 65  void import_appe
215b0 6e 64 5f 63 68 61 72 28 49 6d 70 6f 72 74 43 74  nd_char(ImportCt
215c0 78 20 2a 70 2c 20 69 6e 74 20 63 29 7b 0a 20 20  x *p, int c){.  
215d0 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e  if( p->n+1>=p->n
215e0 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e  Alloc ){.    p->
215f0 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c  nAlloc += p->nAl
21600 6c 6f 63 20 2b 20 31 30 30 3b 0a 20 20 20 20 70  loc + 100;.    p
21610 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  ->z = sqlite3_re
21620 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c 20 70 2d  alloc64(p->z, p-
21630 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66  >nAlloc);.    if
21640 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73 68 65 6c  ( p->z==0 ) shel
21650 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28  l_out_of_memory(
21660 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a 5b 70 2d  );.  }.  p->z[p-
21670 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61 72 29 63 3b  >n++] = (char)c;
21680 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73 69  .}../* Read a si
21690 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66 20 43 53  ngle field of CS
216a0 56 20 74 65 78 74 2e 20 20 43 6f 6d 70 61 74 69  V text.  Compati
216b0 62 6c 65 20 77 69 74 68 20 72 66 63 34 31 38 30  ble with rfc4180
216c0 20 61 6e 64 20 65 78 74 65 6e 64 65 64 0a 2a 2a   and extended.**
216d0 20 77 69 74 68 20 74 68 65 20 6f 70 74 69 6f 6e   with the option
216e0 20 6f 66 20 68 61 76 69 6e 67 20 61 20 73 65 70   of having a sep
216f0 61 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61  arator other tha
21700 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b  n ","..**.**   +
21710 20 20 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72    Input comes fr
21720 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b  om p->in..**   +
21730 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
21740 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74  in p->z of lengt
21750 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74  h p->n.  Space t
21760 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65  o hold p->z come
21770 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73  s.**      from s
21780 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
21790 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70  )..**   +  Use p
217a0 2d 3e 63 53 65 70 20 61 73 20 74 68 65 20 63 6f  ->cSep as the co
217b0 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20  lumn separator. 
217c0 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
217d0 22 2c 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65  ","..**   +  Use
217e0 20 70 2d 3e 72 53 65 70 20 61 73 20 74 68 65 20   p->rSep as the 
217f0 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20  row separator.  
21800 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22  The default is "
21810 5c 6e 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65  \n"..**   +  Kee
21820 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6c  p track of the l
21830 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d  ine number in p-
21840 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20  >nLine..**   +  
21850 53 74 6f 72 65 20 74 68 65 20 63 68 61 72 61 63  Store the charac
21860 74 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ter that termina
21870 74 65 73 20 74 68 65 20 66 69 65 6c 64 20 69 6e  tes the field in
21880 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72   p->cTerm.  Stor
21890 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e  e.**      EOF on
218a0 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a   end-of-file..**
218b0 20 20 20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e     +  Report syn
218c0 74 61 78 20 65 72 72 6f 72 73 20 6f 6e 20 73 74  tax errors on st
218d0 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63  derr.*/.static c
218e0 68 61 72 20 2a 53 51 4c 49 54 45 5f 43 44 45 43  har *SQLITE_CDEC
218f0 4c 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66  L csv_read_one_f
21900 69 65 6c 64 28 49 6d 70 6f 72 74 43 74 78 20 2a  ield(ImportCtx *
21910 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69  p){.  int c;.  i
21920 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f  nt cSep = p->cCo
21930 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72 53 65 70  lSep;.  int rSep
21940 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20   = p->cRowSep;. 
21950 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d   p->n = 0;.  c =
21960 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20   fgetc(p->in);. 
21970 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73   if( c==EOF || s
21980 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b 0a  eenInterrupt ){.
21990 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45      p->cTerm = E
219a0 4f 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  OF;.    return 0
219b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 27  ;.  }.  if( c=='
219c0 22 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 63  "' ){.    int pc
219d0 2c 20 70 70 63 3b 0a 20 20 20 20 69 6e 74 20 73  , ppc;.    int s
219e0 74 61 72 74 4c 69 6e 65 20 3d 20 70 2d 3e 6e 4c  tartLine = p->nL
219f0 69 6e 65 3b 0a 20 20 20 20 69 6e 74 20 63 51 75  ine;.    int cQu
21a00 6f 74 65 20 3d 20 63 3b 0a 20 20 20 20 70 63 20  ote = c;.    pc 
21a10 3d 20 70 70 63 20 3d 20 30 3b 0a 20 20 20 20 77  = ppc = 0;.    w
21a20 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20  hile( 1 ){.     
21a30 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
21a40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  );.      if( c==
21a50 72 53 65 70 20 29 20 70 2d 3e 6e 4c 69 6e 65 2b  rSep ) p->nLine+
21a60 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  +;.      if( c==
21a70 63 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20  cQuote ){.      
21a80 20 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65    if( pc==cQuote
21a90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63   ){.          pc
21aa0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
21ab0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
21ac0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
21ad0 20 20 69 66 28 20 28 63 3d 3d 63 53 65 70 20 26    if( (c==cSep &
21ae0 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20  & pc==cQuote).  
21af0 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70       || (c==rSep
21b00 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a   && pc==cQuote).
21b10 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53         || (c==rS
21b20 65 70 20 26 26 20 70 63 3d 3d 27 5c 72 27 20 26  ep && pc=='\r' &
21b30 26 20 70 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20  & ppc==cQuote). 
21b40 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 45 4f 46        || (c==EOF
21b50 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a   && pc==cQuote).
21b60 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
21b70 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d 77 68   do{ p->n--; }wh
21b80 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21  ile( p->z[p->n]!
21b90 3d 63 51 75 6f 74 65 20 29 3b 0a 20 20 20 20 20  =cQuote );.     
21ba0 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b     p->cTerm = c;
21bb0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
21bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
21bd0 28 20 70 63 3d 3d 63 51 75 6f 74 65 20 26 26 20  ( pc==cQuote && 
21be0 63 21 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20  c!='\r' ){.     
21bf0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
21c00 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 75  tderr, "%s:%d: u
21c10 6e 65 73 63 61 70 65 64 20 25 63 20 63 68 61 72  nescaped %c char
21c20 61 63 74 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20  acter\n",.      
21c30 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 69            p->zFi
21c40 6c 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c 20 63 51  le, p->nLine, cQ
21c50 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  uote);.      }. 
21c60 20 20 20 20 20 69 66 28 20 63 3d 3d 45 4f 46 20       if( c==EOF 
21c70 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
21c80 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
21c90 25 73 3a 25 64 3a 20 75 6e 74 65 72 6d 69 6e 61  %s:%d: untermina
21ca0 74 65 64 20 25 63 2d 71 75 6f 74 65 64 20 66 69  ted %c-quoted fi
21cb0 65 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  eld\n",.        
21cc0 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65          p->zFile
21cd0 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 63 51 75  , startLine, cQu
21ce0 6f 74 65 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  ote);.        p-
21cf0 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20  >cTerm = c;.    
21d00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
21d10 20 7d 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f   }.      import_
21d20 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
21d30 29 3b 0a 20 20 20 20 20 20 70 70 63 20 3d 20 70  );.      ppc = p
21d40 63 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 63 3b  c;.      pc = c;
21d50 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
21d60 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
21d70 73 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  s the first fiel
21d80 64 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 61  d being parsed a
21d90 6e 64 20 69 74 20 62 65 67 69 6e 73 20 77 69 74  nd it begins wit
21da0 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 55 54 46  h the.    ** UTF
21db0 2d 38 20 42 4f 4d 20 20 28 30 78 45 46 20 42 42  -8 BOM  (0xEF BB
21dc0 20 42 46 29 20 74 68 65 6e 20 73 6b 69 70 20 74   BF) then skip t
21dd0 68 65 20 42 4f 4d 20 2a 2f 0a 20 20 20 20 69 66  he BOM */.    if
21de0 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78 65 66  ( (c&0xff)==0xef
21df0 20 26 26 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74   && p->bNotFirst
21e00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6d 70  ==0 ){.      imp
21e10 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28  ort_append_char(
21e20 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 63 20 3d  p, c);.      c =
21e30 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20   fgetc(p->in);. 
21e40 20 20 20 20 20 69 66 28 20 28 63 26 30 78 66 66       if( (c&0xff
21e50 29 3d 3d 30 78 62 62 20 29 7b 0a 20 20 20 20 20  )==0xbb ){.     
21e60 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64     import_append
21e70 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20  _char(p, c);.   
21e80 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70       c = fgetc(p
21e90 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  ->in);.        i
21ea0 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78 62  f( (c&0xff)==0xb
21eb0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  f ){.          p
21ec0 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b  ->bNotFirst = 1;
21ed0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 20  .          p->n 
21ee0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
21ef0 65 74 75 72 6e 20 63 73 76 5f 72 65 61 64 5f 6f  eturn csv_read_o
21f00 6e 65 5f 66 69 65 6c 64 28 70 29 3b 0a 20 20 20  ne_field(p);.   
21f10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
21f20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
21f30 63 21 3d 45 4f 46 20 26 26 20 63 21 3d 63 53 65  c!=EOF && c!=cSe
21f40 70 20 26 26 20 63 21 3d 72 53 65 70 20 29 7b 0a  p && c!=rSep ){.
21f50 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70        import_app
21f60 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a  end_char(p, c);.
21f70 20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28        c = fgetc(
21f80 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  p->in);.    }.  
21f90 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29 7b    if( c==rSep ){
21fa0 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b  .      p->nLine+
21fb0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
21fc0 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b 70 2d 3e 6e  n>0 && p->z[p->n
21fd0 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 70 2d 3e 6e  -1]=='\r' ) p->n
21fe0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  --;.    }.    p-
21ff0 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 7d 0a  >cTerm = c;.  }.
22000 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e    if( p->z ) p->
22010 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 70  z[p->n] = 0;.  p
22020 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b  ->bNotFirst = 1;
22030 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a  .  return p->z;.
22040 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73 69 6e  }../* Read a sin
22050 67 6c 65 20 66 69 65 6c 64 20 6f 66 20 41 53 43  gle field of ASC
22060 49 49 20 64 65 6c 69 6d 69 74 65 64 20 74 65 78  II delimited tex
22070 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e  t..**.**   +  In
22080 70 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70  put comes from p
22090 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74  ->in..**   +  St
220a0 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 70  ore results in p
220b0 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d  ->z of length p-
220c0 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  >n.  Space to ho
220d0 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a  ld p->z comes.**
220e0 20 20 20 20 20 20 66 72 6f 6d 20 73 71 6c 69 74        from sqlit
220f0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a  e3_malloc64()..*
22100 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 63 53  *   +  Use p->cS
22110 65 70 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e  ep as the column
22120 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65   separator.  The
22130 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c 78 31   default is "\x1
22140 46 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20  F"..**   +  Use 
22150 70 2d 3e 72 53 65 70 20 61 73 20 74 68 65 20 72  p->rSep as the r
22160 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54  ow separator.  T
22170 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c  he default is "\
22180 78 31 45 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65  x1E"..**   +  Ke
22190 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ep track of the 
221a0 72 6f 77 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d  row number in p-
221b0 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20  >nLine..**   +  
221c0 53 74 6f 72 65 20 74 68 65 20 63 68 61 72 61 63  Store the charac
221d0 74 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ter that termina
221e0 74 65 73 20 74 68 65 20 66 69 65 6c 64 20 69 6e  tes the field in
221f0 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72   p->cTerm.  Stor
22200 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e  e.**      EOF on
22210 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a   end-of-file..**
22220 20 20 20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e     +  Report syn
22230 74 61 78 20 65 72 72 6f 72 73 20 6f 6e 20 73 74  tax errors on st
22240 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63  derr.*/.static c
22250 68 61 72 20 2a 53 51 4c 49 54 45 5f 43 44 45 43  har *SQLITE_CDEC
22260 4c 20 61 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65  L ascii_read_one
22270 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43 74 78  _field(ImportCtx
22280 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20   *p){.  int c;. 
22290 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e 63   int cSep = p->c
222a0 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72 53  ColSep;.  int rS
222b0 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b  ep = p->cRowSep;
222c0 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63  .  p->n = 0;.  c
222d0 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b   = fgetc(p->in);
222e0 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c  .  if( c==EOF ||
222f0 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29   seenInterrupt )
22300 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d  {.    p->cTerm =
22310 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 72 6e   EOF;.    return
22320 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   0;.  }.  while(
22330 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d 63 53   c!=EOF && c!=cS
22340 65 70 20 26 26 20 63 21 3d 72 53 65 70 20 29 7b  ep && c!=rSep ){
22350 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65  .    import_appe
22360 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20  nd_char(p, c);. 
22370 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e     c = fgetc(p->
22380 69 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  in);.  }.  if( c
22390 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 70 2d  ==rSep ){.    p-
223a0 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 7d 0a 20 20  >nLine++;.  }.  
223b0 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20  p->cTerm = c;.  
223c0 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b  if( p->z ) p->z[
223d0 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 72 65 74  p->n] = 0;.  ret
223e0 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a  urn p->z;.}../*.
223f0 2a 2a 20 54 72 79 20 74 6f 20 74 72 61 6e 73 66  ** Try to transf
22400 65 72 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c  er data for tabl
22410 65 20 7a 54 61 62 6c 65 2e 20 20 49 66 20 61 6e  e zTable.  If an
22420 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 77   error is seen w
22430 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e 67 20 66  hile.** moving f
22440 6f 72 77 61 72 64 2c 20 74 72 79 20 74 6f 20 67  orward, try to g
22450 6f 20 62 61 63 6b 77 61 72 64 73 2e 20 20 54 68  o backwards.  Th
22460 65 20 62 61 63 6b 77 61 72 64 73 20 6d 6f 76 65  e backwards move
22470 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a 20 77 6f  ment won't.** wo
22480 72 6b 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  rk for WITHOUT R
22490 4f 57 49 44 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  OWID tables..*/.
224a0 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54  static void tryT
224b0 6f 43 6c 6f 6e 65 44 61 74 61 28 0a 20 20 53 68  oCloneData(.  Sh
224c0 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 73  ellState *p,.  s
224d0 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20  qlite3 *newDb,. 
224e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
224f0 62 6c 65 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  ble.){.  sqlite3
22500 5f 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20  _stmt *pQuery = 
22510 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
22520 74 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a  t *pInsert = 0;.
22530 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20 3d    char *zQuery =
22540 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 49 6e 73   0;.  char *zIns
22550 65 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ert = 0;.  int r
22560 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e  c;.  int i, j, n
22570 3b 0a 20 20 69 6e 74 20 6e 54 61 62 6c 65 20 3d  ;.  int nTable =
22580 20 73 74 72 6c 65 6e 33 30 28 7a 54 61 62 6c 65   strlen30(zTable
22590 29 3b 0a 20 20 69 6e 74 20 6b 20 3d 20 30 3b 0a  );.  int k = 0;.
225a0 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
225b0 20 63 6f 6e 73 74 20 69 6e 74 20 73 70 69 6e 52   const int spinR
225c0 61 74 65 20 3d 20 31 30 30 30 30 3b 0a 0a 20 20  ate = 10000;..  
225d0 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33  zQuery = sqlite3
225e0 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
225f0 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 22 2c   * FROM \"%w\"",
22600 20 7a 54 61 62 6c 65 29 3b 0a 20 20 72 63 20 3d   zTable);.  rc =
22610 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
22620 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  _v2(p->db, zQuer
22630 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20  y, -1, &pQuery, 
22640 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
22650 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
22660 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25  stderr, "Error %
22670 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22  d: %s on [%s]\n"
22680 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ,.            sq
22690 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
226a0 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73  rrcode(p->db), s
226b0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
226c0 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20  >db),.          
226d0 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 67    zQuery);.    g
226e0 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78 66 65  oto end_data_xfe
226f0 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73 71 6c  r;.  }.  n = sql
22700 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
22710 74 28 70 51 75 65 72 79 29 3b 0a 20 20 7a 49 6e  t(pQuery);.  zIn
22720 73 65 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  sert = sqlite3_m
22730 61 6c 6c 6f 63 36 34 28 32 30 30 20 2b 20 6e 54  alloc64(200 + nT
22740 61 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a 20 20 69  able + n*3);.  i
22750 66 28 20 7a 49 6e 73 65 72 74 3d 3d 30 20 29 20  f( zInsert==0 ) 
22760 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d  shell_out_of_mem
22770 6f 72 79 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  ory();.  sqlite3
22780 5f 73 6e 70 72 69 6e 74 66 28 32 30 30 2b 6e 54  _snprintf(200+nT
22790 61 62 6c 65 2c 7a 49 6e 73 65 72 74 2c 0a 20 20  able,zInsert,.  
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f   "INSERT OR IGNO
227c0 52 45 20 49 4e 54 4f 20 5c 22 25 73 5c 22 20 56  RE INTO \"%s\" V
227d0 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65  ALUES(?", zTable
227e0 29 3b 0a 20 20 69 20 3d 20 73 74 72 6c 65 6e 33  );.  i = strlen3
227f0 30 28 7a 49 6e 73 65 72 74 29 3b 0a 20 20 66 6f  0(zInsert);.  fo
22800 72 28 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29  r(j=1; j<n; j++)
22810 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 49 6e  {.    memcpy(zIn
22820 73 65 72 74 2b 69 2c 20 22 2c 3f 22 2c 20 32 29  sert+i, ",?", 2)
22830 3b 0a 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20  ;.    i += 2;.  
22840 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65  }.  memcpy(zInse
22850 72 74 2b 69 2c 20 22 29 3b 22 2c 20 33 29 3b 0a  rt+i, ");", 3);.
22860 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
22870 72 65 70 61 72 65 5f 76 32 28 6e 65 77 44 62 2c  repare_v2(newDb,
22880 20 7a 49 6e 73 65 72 74 2c 20 2d 31 2c 20 26 70   zInsert, -1, &p
22890 49 6e 73 65 72 74 2c 20 30 29 3b 0a 20 20 69 66  Insert, 0);.  if
228a0 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38  ( rc ){.    utf8
228b0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
228c0 22 45 72 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e  "Error %d: %s on
228d0 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20   [%s]\n",.      
228e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
228f0 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 6e  tended_errcode(n
22900 65 77 44 62 29 2c 20 73 71 6c 69 74 65 33 5f 65  ewDb), sqlite3_e
22910 72 72 6d 73 67 28 6e 65 77 44 62 29 2c 0a 20 20  rrmsg(newDb),.  
22920 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72 79            zQuery
22930 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
22940 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20  data_xfer;.  }. 
22950 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b   for(k=0; k<2; k
22960 2b 2b 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  ++){.    while( 
22970 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  (rc = sqlite3_st
22980 65 70 28 70 51 75 65 72 79 29 29 3d 3d 53 51 4c  ep(pQuery))==SQL
22990 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
229a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
229b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 77 69  ++){.        swi
229c0 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c  tch( sqlite3_col
229d0 75 6d 6e 5f 74 79 70 65 28 70 51 75 65 72 79 2c  umn_type(pQuery,
229e0 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   i) ){.         
229f0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
22a00 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L: {.           
22a10 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
22a20 6c 6c 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 29  ll(pInsert, i+1)
22a30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
22a40 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
22a50 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
22a60 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
22a70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
22a80 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
22a90 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73  (pInsert, i+1, s
22aa0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
22ab0 74 36 34 28 70 51 75 65 72 79 2c 69 29 29 3b 0a  t64(pQuery,i));.
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
22ad0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
22ae0 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
22af0 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  LITE_FLOAT: {.  
22b00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22b10 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 49  3_bind_double(pI
22b20 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69  nsert, i+1, sqli
22b30 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
22b40 65 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20  e(pQuery,i));.  
22b50 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
22b60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22b70 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
22b80 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20  TE_TEXT: {.     
22b90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
22ba0 69 6e 64 5f 74 65 78 74 28 70 49 6e 73 65 72 74  ind_text(pInsert
22bb0 2c 20 69 2b 31 2c 0a 20 20 20 20 20 20 20 20 20  , i+1,.         
22bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bd0 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a      (const char*
22be0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
22bf0 74 65 78 74 28 70 51 75 65 72 79 2c 69 29 2c 0a  text(pQuery,i),.
22c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
22c20 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
22c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
22c40 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
22c50 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
22c60 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
22c70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22c80 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49 6e 73  3_bind_blob(pIns
22c90 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65  ert, i+1, sqlite
22ca0 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51  3_column_blob(pQ
22cb0 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20  uery,i),.       
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ce0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
22cf0 75 6d 6e 5f 62 79 74 65 73 28 70 51 75 65 72 79  umn_bytes(pQuery
22d00 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,i),.           
22d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d30 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
22d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
22d50 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
22d60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22d70 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 20 2a 2f 0a  } /* End for */.
22d80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22d90 65 33 5f 73 74 65 70 28 70 49 6e 73 65 72 74 29  e3_step(pInsert)
22da0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
22db0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
22dc0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26 26 20 72  =SQLITE_ROW && r
22dd0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
22de0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
22df0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
22e00 72 72 6f 72 20 25 64 3a 20 25 73 5c 6e 22 2c 20  rror %d: %s\n", 
22e10 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
22e20 5f 65 72 72 63 6f 64 65 28 6e 65 77 44 62 29 2c  _errcode(newDb),
22e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22e40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22e50 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b  _errmsg(newDb));
22e60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
22e70 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49 6e  qlite3_reset(pIn
22e80 73 65 72 74 29 3b 0a 20 20 20 20 20 20 63 6e 74  sert);.      cnt
22e90 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63  ++;.      if( (c
22ea0 6e 74 25 73 70 69 6e 52 61 74 65 29 3d 3d 30 20  nt%spinRate)==0 
22eb0 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ){.        print
22ec0 66 28 22 25 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c  f("%c\b", "|/-\\
22ed0 22 5b 28 63 6e 74 2f 73 70 69 6e 52 61 74 65 29  "[(cnt/spinRate)
22ee0 25 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 66  %4]);.        ff
22ef0 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
22f00 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 45      }.    } /* E
22f10 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20  nd while */.    
22f20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
22f30 4f 4e 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ONE ) break;.   
22f40 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
22f50 65 28 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73  e(pQuery);.    s
22f60 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65  qlite3_free(zQue
22f70 72 79 29 3b 0a 20 20 20 20 7a 51 75 65 72 79 20  ry);.    zQuery 
22f80 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
22f90 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
22fa0 20 5c 22 25 77 5c 22 20 4f 52 44 45 52 20 42 59   \"%w\" ORDER BY
22fb0 20 72 6f 77 69 64 20 44 45 53 43 3b 22 2c 0a 20   rowid DESC;",. 
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
22fe0 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  le);.    rc = sq
22ff0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
23000 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20  (p->db, zQuery, 
23010 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b  -1, &pQuery, 0);
23020 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
23030 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
23040 28 73 74 64 65 72 72 2c 20 22 57 61 72 6e 69 6e  (stderr, "Warnin
23050 67 3a 20 63 61 6e 6e 6f 74 20 73 74 65 70 20 5c  g: cannot step \
23060 22 25 73 5c 22 20 62 61 63 6b 77 61 72 64 73 22  "%s\" backwards"
23070 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  , zTable);.     
23080 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
23090 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 28 6b 3d 30  } /* End for(k=0
230a0 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74  ...) */..end_dat
230b0 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65  a_xfer:.  sqlite
230c0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72  3_finalize(pQuer
230d0 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  y);.  sqlite3_fi
230e0 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72 74 29 3b  nalize(pInsert);
230f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
23100 7a 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74  zQuery);.  sqlit
23110 65 33 5f 66 72 65 65 28 7a 49 6e 73 65 72 74 29  e3_free(zInsert)
23120 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  ;.}.../*.** Try 
23130 74 6f 20 74 72 61 6e 73 66 65 72 20 61 6c 6c 20  to transfer all 
23140 72 6f 77 73 20 6f 66 20 74 68 65 20 73 63 68 65  rows of the sche
23150 6d 61 20 74 68 61 74 20 6d 61 74 63 68 20 7a 57  ma that match zW
23160 68 65 72 65 2e 20 20 46 6f 72 0a 2a 2a 20 65 61  here.  For.** ea
23170 63 68 20 72 6f 77 2c 20 69 6e 76 6f 6b 65 20 78  ch row, invoke x
23180 46 6f 72 45 61 63 68 28 29 20 6f 6e 20 74 68 65  ForEach() on the
23190 20 6f 62 6a 65 63 74 20 64 65 66 69 6e 65 64 20   object defined 
231a0 62 79 20 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20  by that row..** 
231b0 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  If an error is e
231c0 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65  ncountered while
231d0 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61 72 64 20   moving forward 
231e0 74 68 72 6f 75 67 68 20 74 68 65 0a 2a 2a 20 73  through the.** s
231f0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
23200 6c 65 2c 20 74 72 79 20 61 67 61 69 6e 20 6d 6f  le, try again mo
23210 76 69 6e 67 20 62 61 63 6b 77 61 72 64 73 2e 0a  ving backwards..
23220 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
23230 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28  ryToCloneSchema(
23240 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
23250 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77  ,.  sqlite3 *new
23260 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
23270 20 2a 7a 57 68 65 72 65 2c 0a 20 20 76 6f 69 64   *zWhere,.  void
23280 20 28 2a 78 46 6f 72 45 61 63 68 29 28 53 68 65   (*xForEach)(She
23290 6c 6c 53 74 61 74 65 2a 2c 73 71 6c 69 74 65 33  llState*,sqlite3
232a0 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29  *,const char*).)
232b0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
232c0 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a 20 20   *pQuery = 0;.  
232d0 63 68 61 72 20 2a 7a 51 75 65 72 79 20 3d 20 30  char *zQuery = 0
232e0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f  ;.  int rc;.  co
232f0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
23300 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  r *zName;.  cons
23310 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
23320 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a  *zSql;.  char *z
23330 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 7a  ErrMsg = 0;..  z
23340 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f  Query = sqlite3_
23350 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
23360 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73  name, sql FROM s
23370 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20  qlite_master".  
23380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23390 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
233a0 20 25 73 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20   %s", zWhere);. 
233b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
233c0 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
233d0 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75  zQuery, -1, &pQu
233e0 65 72 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ery, 0);.  if( r
233f0 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  c ){.    utf8_pr
23400 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
23410 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f 6e 20  ror: (%d) %s on 
23420 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20  [%s]\n",.       
23430 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
23440 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
23450 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71  rcode(p->db), sq
23460 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
23470 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  db),.           
23480 20 20 20 20 20 20 20 20 20 7a 51 75 65 72 79 29           zQuery)
23490 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73  ;.    goto end_s
234a0 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20 7d 0a  chema_xfer;.  }.
234b0 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73    while( (rc = s
234c0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75 65  qlite3_step(pQue
234d0 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ry))==SQLITE_ROW
234e0 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
234f0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
23500 65 78 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a  ext(pQuery, 0);.
23510 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
23520 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
23530 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 70  Query, 1);.    p
23540 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20  rintf("%s... ", 
23550 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68 28 73  zName); fflush(s
23560 74 64 6f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  tdout);.    sqli
23570 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20  te3_exec(newDb, 
23580 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53 71  (const char*)zSq
23590 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73  l, 0, 0, &zErrMs
235a0 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72  g);.    if( zErr
235b0 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66  Msg ){.      utf
235c0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
235d0 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c   "Error: %s\nSQL
235e0 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d  : [%s]\n", zErrM
235f0 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  sg, zSql);.     
23600 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
23610 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 7a 45  rrMsg);.      zE
23620 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d  rrMsg = 0;.    }
23630 0a 20 20 20 20 69 66 28 20 78 46 6f 72 45 61 63  .    if( xForEac
23640 68 20 29 7b 0a 20 20 20 20 20 20 78 46 6f 72 45  h ){.      xForE
23650 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20 28 63  ach(p, newDb, (c
23660 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65  onst char*)zName
23670 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  );.    }.    pri
23680 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20  ntf("done\n");. 
23690 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
236a0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
236b0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
236c0 28 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71  (pQuery);.    sq
236d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72  lite3_free(zQuer
236e0 79 29 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d  y);.    zQuery =
236f0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
23700 28 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73  ("SELECT name, s
23710 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
23720 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20  aster".         
23730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23740 20 20 20 20 22 20 57 48 45 52 45 20 25 73 20 4f      " WHERE %s O
23750 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45  RDER BY rowid DE
23760 53 43 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20  SC", zWhere);.  
23770 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
23780 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
23790 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51   zQuery, -1, &pQ
237a0 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 69 66  uery, 0);.    if
237b0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74  ( rc ){.      ut
237c0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
237d0 2c 20 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25  , "Error: (%d) %
237e0 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20  s on [%s]\n",.  
237f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23800 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65      sqlite3_exte
23810 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e  nded_errcode(p->
23820 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  db), sqlite3_err
23830 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20  msg(p->db),.    
23840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23850 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 20    zQuery);.     
23860 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61   goto end_schema
23870 5f 78 66 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  _xfer;.    }.   
23880 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71   while( (rc = sq
23890 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75 65 72  lite3_step(pQuer
238a0 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  y))==SQLITE_ROW 
238b0 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ){.      zName =
238c0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
238d0 74 65 78 74 28 70 51 75 65 72 79 2c 20 30 29 3b  text(pQuery, 0);
238e0 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  .      zSql = sq
238f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
23900 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20  t(pQuery, 1);.  
23910 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e      printf("%s..
23920 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c  . ", zName); ffl
23930 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20  ush(stdout);.   
23940 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
23950 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68  newDb, (const ch
23960 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20  ar*)zSql, 0, 0, 
23970 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
23980 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
23990 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
239a0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
239b0 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73  or: %s\nSQL: [%s
239c0 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a  ]\n", zErrMsg, z
239d0 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Sql);.        sq
239e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
239f0 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7a 45 72  sg);.        zEr
23a00 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
23a10 7d 0a 20 20 20 20 20 20 69 66 28 20 78 46 6f 72  }.      if( xFor
23a20 45 61 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Each ){.        
23a30 78 46 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44  xForEach(p, newD
23a40 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  b, (const char*)
23a50 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
23a60 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 64 6f        printf("do
23a70 6e 65 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ne\n");.    }.  
23a80 7d 0a 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65  }.end_schema_xfe
23a90 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  r:.  sqlite3_fin
23aa0 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20  alize(pQuery);. 
23ab0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
23ac0 75 65 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  uery);.}../*.** 
23ad0 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
23ae0 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22  ase file named "
23af0 7a 4e 65 77 44 62 22 2e 20 20 54 72 79 20 74 6f  zNewDb".  Try to
23b00 20 72 65 63 6f 76 65 72 20 61 73 20 6d 75 63 68   recover as much
23b10 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
23b20 61 73 20 70 6f 73 73 69 62 6c 65 20 6f 75 74 20  as possible out 
23b30 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  of the main data
23b40 62 61 73 65 20 28 77 68 69 63 68 20 6d 69 67 68  base (which migh
23b50 74 20 62 65 20 63 6f 72 72 75 70 74 29 20 61 6e  t be corrupt) an
23b60 64 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 69 6e  d write it.** in
23b70 74 6f 20 7a 4e 65 77 44 62 2e 0a 2a 2f 0a 73 74  to zNewDb..*/.st
23b80 61 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43  atic void tryToC
23b90 6c 6f 6e 65 28 53 68 65 6c 6c 53 74 61 74 65 20  lone(ShellState 
23ba0 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
23bb0 7a 4e 65 77 44 62 29 7b 0a 20 20 69 6e 74 20 72  zNewDb){.  int r
23bc0 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65  c;.  sqlite3 *ne
23bd0 77 44 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  wDb = 0;.  if( a
23be0 63 63 65 73 73 28 7a 4e 65 77 44 62 2c 30 29 3d  ccess(zNewDb,0)=
23bf0 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
23c00 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 46  rintf(stderr, "F
23c10 69 6c 65 20 5c 22 25 73 5c 22 20 61 6c 72 65 61  ile \"%s\" alrea
23c20 64 79 20 65 78 69 73 74 73 2e 5c 6e 22 2c 20 7a  dy exists.\n", z
23c30 4e 65 77 44 62 29 3b 0a 20 20 20 20 72 65 74 75  NewDb);.    retu
23c40 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  rn;.  }.  rc = s
23c50 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 4e 65 77  qlite3_open(zNew
23c60 44 62 2c 20 26 6e 65 77 44 62 29 3b 0a 20 20 69  Db, &newDb);.  i
23c70 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66  f( rc ){.    utf
23c80 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
23c90 20 22 43 61 6e 6e 6f 74 20 63 72 65 61 74 65 20   "Cannot create 
23ca0 6f 75 74 70 75 74 20 64 61 74 61 62 61 73 65 3a  output database:
23cb0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
23cc0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
23cd0 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20 7d 65  sg(newDb));.  }e
23ce0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
23cf0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52  _exec(p->db, "PR
23d00 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
23d10 68 65 6d 61 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c  hema=ON;", 0, 0,
23d20 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
23d30 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 22 42 45  _exec(newDb, "BE
23d40 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 22 2c  GIN EXCLUSIVE;",
23d50 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 74   0, 0, 0);.    t
23d60 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28  ryToCloneSchema(
23d70 70 2c 20 6e 65 77 44 62 2c 20 22 74 79 70 65 3d  p, newDb, "type=
23d80 27 74 61 62 6c 65 27 22 2c 20 74 72 79 54 6f 43  'table'", tryToC
23d90 6c 6f 6e 65 44 61 74 61 29 3b 0a 20 20 20 20 74  loneData);.    t
23da0 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28  ryToCloneSchema(
23db0 70 2c 20 6e 65 77 44 62 2c 20 22 74 79 70 65 21  p, newDb, "type!
23dc0 3d 27 74 61 62 6c 65 27 22 2c 20 30 29 3b 0a 20  ='table'", 0);. 
23dd0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
23de0 6e 65 77 44 62 2c 20 22 43 4f 4d 4d 49 54 3b 22  newDb, "COMMIT;"
23df0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
23e00 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
23e10 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74  db, "PRAGMA writ
23e20 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b  able_schema=OFF;
23e30 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
23e40 0a 20 20 63 6c 6f 73 65 5f 64 62 28 6e 65 77 44  .  close_db(newD
23e50 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  b);.}../*.** Cha
23e60 6e 67 65 20 74 68 65 20 6f 75 74 70 75 74 20 66  nge the output f
23e70 69 6c 65 20 62 61 63 6b 20 74 6f 20 73 74 64 6f  ile back to stdo
23e80 75 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ut..**.** If the
23e90 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 66 6c   p->doXdgOpen fl
23ea0 61 67 20 69 73 20 73 65 74 2c 20 74 68 61 74 20  ag is set, that 
23eb0 6d 65 61 6e 73 20 74 68 65 20 6f 75 74 70 75 74  means the output
23ec0 20 77 61 73 20 62 65 69 6e 67 0a 2a 2a 20 72 65   was being.** re
23ed0 64 69 72 65 63 74 65 64 20 74 6f 20 61 20 74 65  directed to a te
23ee0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
23ef0 65 64 20 62 79 20 70 2d 3e 7a 54 65 6d 70 46 69  ed by p->zTempFi
23f00 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  le.  In that cas
23f10 65 2c 0a 2a 2a 20 6c 61 75 6e 63 68 20 73 74 61  e,.** launch sta
23f20 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70 65 6e  rt/open/xdg-open
23f30 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
23f40 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ry file..*/.stat
23f50 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 72  ic void output_r
23f60 65 73 65 74 28 53 68 65 6c 6c 53 74 61 74 65 20  eset(ShellState 
23f70 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 75  *p){.  if( p->ou
23f80 74 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b  tfile[0]=='|' ){
23f90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23fa0 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 70  OMIT_POPEN.    p
23fb0 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23  close(p->out);.#
23fc0 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
23fd0 20 20 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63     output_file_c
23fe0 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 69  lose(p->out);.#i
23ff0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48  fndef SQLITE_NOH
24000 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20 69  AVE_SYSTEM.    i
24010 66 28 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20  f( p->doXdgOpen 
24020 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
24030 68 61 72 20 2a 7a 58 64 67 4f 70 65 6e 43 6d 64  har *zXdgOpenCmd
24040 20 3d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f   =.#if defined(_
24050 57 49 4e 33 32 29 0a 20 20 20 20 20 20 22 73 74  WIN32).      "st
24060 61 72 74 22 3b 0a 23 65 6c 69 66 20 64 65 66 69  art";.#elif defi
24070 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
24080 20 20 20 20 20 22 6f 70 65 6e 22 3b 0a 23 65 6c       "open";.#el
24090 73 65 0a 20 20 20 20 20 20 22 78 64 67 2d 6f 70  se.      "xdg-op
240a0 65 6e 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  en";.#endif.    
240b0 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20    char *zCmd;.  
240c0 20 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74      zCmd = sqlit
240d0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 25  e3_mprintf("%s %
240e0 73 22 2c 20 7a 58 64 67 4f 70 65 6e 43 6d 64 2c  s", zXdgOpenCmd,
240f0 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a   p->zTempFile);.
24100 20 20 20 20 20 20 69 66 28 20 73 79 73 74 65 6d        if( system
24110 28 7a 43 6d 64 29 20 29 7b 0a 20 20 20 20 20 20  (zCmd) ){.      
24120 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
24130 64 65 72 72 2c 20 22 46 61 69 6c 65 64 3a 20 5b  derr, "Failed: [
24140 25 73 5d 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20  %s]\n", zCmd);. 
24150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
24160 69 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b  ite3_free(zCmd);
24170 0a 20 20 20 20 20 20 6f 75 74 70 75 74 4d 6f 64  .      outputMod
24180 65 50 6f 70 28 70 29 3b 0a 20 20 20 20 20 20 70  ePop(p);.      p
24190 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 3d 20 30 3b  ->doXdgOpen = 0;
241a0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
241b0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
241c0 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 29 20  _NOHAVE_SYSTEM) 
241d0 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 6f 75 74 66  */.  }.  p->outf
241e0 69 6c 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 2d  ile[0] = 0;.  p-
241f0 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 7d  >out = stdout;.}
24200 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 6e 20 53  ../*.** Run an S
24210 51 4c 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72  QL command and r
24220 65 74 75 72 6e 20 74 68 65 20 73 69 6e 67 6c 65  eturn the single
24230 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 2e   integer result.
24240 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
24250 62 5f 69 6e 74 28 53 68 65 6c 6c 53 74 61 74 65  b_int(ShellState
24260 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
24270 2a 7a 53 71 6c 29 7b 0a 20 20 73 71 6c 69 74 65  *zSql){.  sqlite
24280 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
24290 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20   int res = 0;.  
242a0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
242b0 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
242c0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
242d0 20 20 69 66 28 20 70 53 74 6d 74 20 26 26 20 73    if( pStmt && s
242e0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
242f0 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
24300 7b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  {.    res = sqli
24310 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
24320 53 74 6d 74 2c 30 29 3b 0a 20 20 7d 0a 20 20 73  Stmt,0);.  }.  s
24330 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
24340 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e  pStmt);.  return
24350 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   res;.}../*.** C
24360 6f 6e 76 65 72 74 20 61 20 32 2d 62 79 74 65 20  onvert a 2-byte 
24370 6f 72 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e  or 4-byte big-en
24380 64 69 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74  dian integer int
24390 6f 20 61 20 6e 61 74 69 76 65 20 69 6e 74 65 67  o a native integ
243a0 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73  er.*/.static uns
243b0 69 67 6e 65 64 20 69 6e 74 20 67 65 74 32 62 79  igned int get2by
243c0 74 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63  teInt(unsigned c
243d0 68 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72  har *a){.  retur
243e0 6e 20 28 61 5b 30 5d 3c 3c 38 29 20 2b 20 61 5b  n (a[0]<<8) + a[
243f0 31 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 6e 73  1];.}.static uns
24400 69 67 6e 65 64 20 69 6e 74 20 67 65 74 34 62 79  igned int get4by
24410 74 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63  teInt(unsigned c
24420 68 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72  har *a){.  retur
24430 6e 20 28 61 5b 30 5d 3c 3c 32 34 29 20 2b 20 28  n (a[0]<<24) + (
24440 61 5b 31 5d 3c 3c 31 36 29 20 2b 20 28 61 5b 32  a[1]<<16) + (a[2
24450 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b 0a 7d 0a  ]<<8) + a[3];.}.
24460 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
24470 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 2e 69  ation of the ".i
24480 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  nfo" command..**
24490 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20  .** Return 1 on 
244a0 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74  error, 2 to exit
244b0 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73  , and 0 otherwis
244c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
244d0 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f   shell_dbinfo_co
244e0 6d 6d 61 6e 64 28 53 68 65 6c 6c 53 74 61 74 65  mmand(ShellState
244f0 20 2a 70 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63   *p, int nArg, c
24500 68 61 72 20 2a 2a 61 7a 41 72 67 29 7b 0a 20 20  har **azArg){.  
24510 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
24520 75 63 74 20 7b 20 63 6f 6e 73 74 20 63 68 61 72  uct { const char
24530 20 2a 7a 4e 61 6d 65 3b 20 69 6e 74 20 6f 66 73   *zName; int ofs
24540 74 3b 20 7d 20 61 46 69 65 6c 64 5b 5d 20 3d 20  t; } aField[] = 
24550 7b 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 20 63  {.     { "file c
24560 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 3a 22 2c  hange counter:",
24570 20 20 32 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20    24  },.     { 
24580 22 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63  "database page c
24590 6f 75 6e 74 3a 22 2c 20 20 32 38 20 20 7d 2c 0a  ount:",  28  },.
245a0 20 20 20 20 20 7b 20 22 66 72 65 65 6c 69 73 74       { "freelist
245b0 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20   page count:",  
245c0 33 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  36  },.     { "s
245d0 63 68 65 6d 61 20 63 6f 6f 6b 69 65 3a 22 2c 20  chema cookie:", 
245e0 20 20 20 20 20 20 20 34 30 20 20 7d 2c 0a 20 20         40  },.  
245f0 20 20 20 7b 20 22 73 63 68 65 6d 61 20 66 6f 72     { "schema for
24600 6d 61 74 3a 22 2c 20 20 20 20 20 20 20 20 34 34  mat:",        44
24610 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 65 66    },.     { "def
24620 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65 3a  ault cache size:
24630 22 2c 20 20 20 34 38 20 20 7d 2c 0a 20 20 20 20  ",   48  },.    
24640 20 7b 20 22 61 75 74 6f 76 61 63 75 75 6d 20 74   { "autovacuum t
24650 6f 70 20 72 6f 6f 74 3a 22 2c 20 20 35 32 20 20  op root:",  52  
24660 7d 2c 0a 20 20 20 20 20 7b 20 22 69 6e 63 72 65  },.     { "incre
24670 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 3a 22 2c  mental vacuum:",
24680 20 20 20 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b     64  },.     {
24690 20 22 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 3a   "text encoding:
246a0 22 2c 20 20 20 20 20 20 20 20 35 36 20 20 7d 2c  ",        56  },
246b0 0a 20 20 20 20 20 7b 20 22 75 73 65 72 20 76 65  .     { "user ve
246c0 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20 20 20 20  rsion:",        
246d0 20 36 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   60  },.     { "
246e0 61 70 70 6c 69 63 61 74 69 6f 6e 20 69 64 3a 22  application id:"
246f0 2c 20 20 20 20 20 20 20 36 38 20 20 7d 2c 0a 20  ,       68  },. 
24700 20 20 20 20 7b 20 22 73 6f 66 74 77 61 72 65 20      { "software 
24710 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20 39  version:",     9
24720 36 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61  6  },.  };.  sta
24730 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
24740 20 7b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a   { const char *z
24750 4e 61 6d 65 3b 20 63 6f 6e 73 74 20 63 68 61 72  Name; const char
24760 20 2a 7a 53 71 6c 3b 20 7d 20 61 51 75 65 72 79   *zSql; } aQuery
24770 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 6e  [] = {.     { "n
24780 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 3a  umber of tables:
24790 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  ",.       "SELEC
247a0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
247b0 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 74  %s WHERE type='t
247c0 61 62 6c 65 27 22 20 7d 2c 0a 20 20 20 20 20 7b  able'" },.     {
247d0 20 22 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65   "number of inde
247e0 78 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53  xes:",.       "S
247f0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
24800 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70  ROM %s WHERE typ
24810 65 3d 27 69 6e 64 65 78 27 22 20 7d 2c 0a 20 20  e='index'" },.  
24820 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20     { "number of 
24830 74 72 69 67 67 65 72 73 3a 22 2c 0a 20 20 20 20  triggers:",.    
24840 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74     "SELECT count
24850 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52  (*) FROM %s WHER
24860 45 20 74 79 70 65 3d 27 74 72 69 67 67 65 72 27  E type='trigger'
24870 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d  " },.     { "num
24880 62 65 72 20 6f 66 20 76 69 65 77 73 3a 22 2c 0a  ber of views:",.
24890 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
248a0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20  ount(*) FROM %s 
248b0 57 48 45 52 45 20 74 79 70 65 3d 27 76 69 65 77  WHERE type='view
248c0 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63  '" },.     { "sc
248d0 68 65 6d 61 20 73 69 7a 65 3a 22 2c 0a 20 20 20  hema size:",.   
248e0 20 20 20 20 22 53 45 4c 45 43 54 20 74 6f 74 61      "SELECT tota
248f0 6c 28 6c 65 6e 67 74 68 28 73 71 6c 29 29 20 46  l(length(sql)) F
24900 52 4f 4d 20 25 73 22 20 7d 2c 0a 20 20 7d 3b 0a  ROM %s" },.  };.
24910 20 20 69 6e 74 20 69 2c 20 72 63 3b 0a 20 20 75    int i, rc;.  u
24920 6e 73 69 67 6e 65 64 20 69 44 61 74 61 56 65 72  nsigned iDataVer
24930 73 69 6f 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53  sion;.  char *zS
24940 63 68 65 6d 61 54 61 62 3b 0a 20 20 63 68 61 72  chemaTab;.  char
24950 20 2a 7a 44 62 20 3d 20 6e 41 72 67 3e 3d 32 20   *zDb = nArg>=2 
24960 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 6d 61  ? azArg[1] : "ma
24970 69 6e 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  in";.  sqlite3_s
24980 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
24990 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
249a0 61 48 64 72 5b 31 30 30 5d 3b 0a 20 20 6f 70 65  aHdr[100];.  ope
249b0 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 69 66  n_db(p, 0);.  if
249c0 28 20 70 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74  ( p->db==0 ) ret
249d0 75 72 6e 20 31 3b 0a 20 20 72 63 20 3d 20 73 71  urn 1;.  rc = sq
249e0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
249f0 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  (p->db,.        
24a00 20 20 20 20 20 22 53 45 4c 45 43 54 20 64 61 74       "SELECT dat
24a10 61 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62  a FROM sqlite_db
24a20 70 61 67 65 28 3f 31 29 20 57 48 45 52 45 20 70  page(?1) WHERE p
24a30 67 6e 6f 3d 31 22 2c 0a 20 20 20 20 20 20 20 20  gno=1",.        
24a40 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c       -1, &pStmt,
24a50 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
24a60 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
24a70 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f  3_compileoption_
24a80 75 73 65 64 28 22 45 4e 41 42 4c 45 5f 44 42 50  used("ENABLE_DBP
24a90 41 47 45 5f 56 54 41 42 22 29 20 29 7b 0a 20 20  AGE_VTAB") ){.  
24aa0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
24ab0 73 74 64 65 72 72 2c 20 22 74 68 65 20 5c 22 2e  stderr, "the \".
24ac0 64 62 69 6e 66 6f 5c 22 20 63 6f 6d 6d 61 6e 64  dbinfo\" command
24ad0 20 72 65 71 75 69 72 65 73 20 74 68 65 20 22 0a   requires the ".
24ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24af0 20 20 20 20 20 20 20 20 20 20 22 2d 44 53 51 4c            "-DSQL
24b00 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47  ITE_ENABLE_DBPAG
24b10 45 5f 56 54 41 42 20 63 6f 6d 70 69 6c 65 2d 74  E_VTAB compile-t
24b20 69 6d 65 20 6f 70 74 69 6f 6e 73 5c 6e 22 29 3b  ime options\n");
24b30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24b40 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
24b50 64 65 72 72 2c 20 22 65 72 72 6f 72 3a 20 25 73  derr, "error: %s
24b60 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
24b70 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
24b80 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
24b90 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
24ba0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
24bb0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  }.  sqlite3_bind
24bc0 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20  _text(pStmt, 1, 
24bd0 7a 44 62 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  zDb, -1, SQLITE_
24be0 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 73  STATIC);.  if( s
24bf0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
24c00 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 0a 20  t)==SQLITE_ROW. 
24c10 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c    && sqlite3_col
24c20 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
24c30 30 29 3e 31 30 30 0a 20 20 29 7b 0a 20 20 20 20  0)>100.  ){.    
24c40 6d 65 6d 63 70 79 28 61 48 64 72 2c 20 73 71 6c  memcpy(aHdr, sql
24c50 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
24c60 28 70 53 74 6d 74 2c 30 29 2c 20 31 30 30 29 3b  (pStmt,0), 100);
24c70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
24c80 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
24c90 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70  }else{.    raw_p
24ca0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
24cb0 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 64 61  nable to read da
24cc0 74 61 62 61 73 65 20 68 65 61 64 65 72 5c 6e 22  tabase header\n"
24cd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
24ce0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
24cf0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
24d00 7d 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74 65  }.  i = get2byte
24d10 49 6e 74 28 61 48 64 72 2b 31 36 29 3b 0a 20 20  Int(aHdr+16);.  
24d20 69 66 28 20 69 3d 3d 31 20 29 20 69 20 3d 20 36  if( i==1 ) i = 6
24d30 35 35 33 36 3b 0a 20 20 75 74 66 38 5f 70 72 69  5536;.  utf8_pri
24d40 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32  ntf(p->out, "%-2
24d50 30 73 20 25 64 5c 6e 22 2c 20 22 64 61 74 61 62  0s %d\n", "datab
24d60 61 73 65 20 70 61 67 65 20 73 69 7a 65 3a 22 2c  ase page size:",
24d70 20 69 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e   i);.  utf8_prin
24d80 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
24d90 73 20 25 64 5c 6e 22 2c 20 22 77 72 69 74 65 20  s %d\n", "write 
24da0 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31  format:", aHdr[1
24db0 38 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  8]);.  utf8_prin
24dc0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
24dd0 73 20 25 64 5c 6e 22 2c 20 22 72 65 61 64 20 66  s %d\n", "read f
24de0 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31 39  ormat:", aHdr[19
24df0 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  ]);.  utf8_print
24e00 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73  f(p->out, "%-20s
24e10 20 25 64 5c 6e 22 2c 20 22 72 65 73 65 72 76 65   %d\n", "reserve
24e20 64 20 62 79 74 65 73 3a 22 2c 20 61 48 64 72 5b  d bytes:", aHdr[
24e30 32 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  20]);.  for(i=0;
24e40 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 69   i<ArraySize(aFi
24e50 65 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  eld); i++){.    
24e60 69 6e 74 20 6f 66 73 74 20 3d 20 61 46 69 65 6c  int ofst = aFiel
24e70 64 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20 20 20 75  d[i].ofst;.    u
24e80 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 61 6c 20  nsigned int val 
24e90 3d 20 67 65 74 34 62 79 74 65 49 6e 74 28 61 48  = get4byteInt(aH
24ea0 64 72 20 2b 20 6f 66 73 74 29 3b 0a 20 20 20 20  dr + ofst);.    
24eb0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
24ec0 75 74 2c 20 22 25 2d 32 30 73 20 25 75 22 2c 20  ut, "%-20s %u", 
24ed0 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 2c  aField[i].zName,
24ee0 20 76 61 6c 29 3b 0a 20 20 20 20 73 77 69 74 63   val);.    switc
24ef0 68 28 20 6f 66 73 74 20 29 7b 0a 20 20 20 20 20  h( ofst ){.     
24f00 20 63 61 73 65 20 35 36 3a 20 7b 0a 20 20 20 20   case 56: {.    
24f10 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20 29      if( val==1 )
24f20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
24f30 75 74 2c 20 22 20 28 75 74 66 38 29 22 29 3b 0a  ut, " (utf8)");.
24f40 20 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d          if( val=
24f50 3d 32 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  =2 ) raw_printf(
24f60 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 31 36  p->out, " (utf16
24f70 6c 65 29 22 29 3b 0a 20 20 20 20 20 20 20 20 69  le)");.        i
24f80 66 28 20 76 61 6c 3d 3d 33 20 29 20 72 61 77 5f  f( val==3 ) raw_
24f90 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
24fa0 20 28 75 74 66 31 36 62 65 29 22 29 3b 0a 20 20   (utf16be)");.  
24fb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
24fc0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
24fd0 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  t, "\n");.  }.  
24fe0 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20  if( zDb==0 ){.  
24ff0 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73    zSchemaTab = s
25000 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
25010 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74  main.sqlite_mast
25020 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  er");.  }else if
25030 28 20 73 74 72 63 6d 70 28 7a 44 62 2c 22 74 65  ( strcmp(zDb,"te
25040 6d 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  mp")==0 ){.    z
25050 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69  SchemaTab = sqli
25060 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
25070 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  , "sqlite_temp_m
25080 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65  aster");.  }else
25090 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62  {.    zSchemaTab
250a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
250b0 74 66 28 22 5c 22 25 77 5c 22 2e 73 71 6c 69 74  tf("\"%w\".sqlit
250c0 65 5f 6d 61 73 74 65 72 22 2c 20 7a 44 62 29 3b  e_master", zDb);
250d0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
250e0 69 3c 41 72 72 61 79 53 69 7a 65 28 61 51 75 65  i<ArraySize(aQue
250f0 72 79 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  ry); i++){.    c
25100 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69  har *zSql = sqli
25110 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 51 75 65  te3_mprintf(aQue
25120 72 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a 53 63 68  ry[i].zSql, zSch
25130 65 6d 61 54 61 62 29 3b 0a 20 20 20 20 69 6e 74  emaTab);.    int
25140 20 76 61 6c 20 3d 20 64 62 5f 69 6e 74 28 70 2c   val = db_int(p,
25150 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69   zSql);.    sqli
25160 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
25170 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
25180 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
25190 64 5c 6e 22 2c 20 61 51 75 65 72 79 5b 69 5d 2e  d\n", aQuery[i].
251a0 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 7d  zName, val);.  }
251b0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
251c0 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 73  zSchemaTab);.  s
251d0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
251e0 72 6f 6c 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20  rol(p->db, zDb, 
251f0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 41 54  SQLITE_FCNTL_DAT
25200 41 5f 56 45 52 53 49 4f 4e 2c 20 26 69 44 61 74  A_VERSION, &iDat
25210 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 75 74 66  aVersion);.  utf
25220 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
25230 20 22 25 2d 32 30 73 20 25 75 5c 6e 22 2c 20 22   "%-20s %u\n", "
25240 64 61 74 61 20 76 65 72 73 69 6f 6e 22 2c 20 69  data version", i
25250 44 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20  DataVersion);.  
25260 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
25270 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 75 72  ** Print the cur
25280 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72  rent sqlite3_err
25290 6d 73 67 28 29 20 76 61 6c 75 65 20 74 6f 20 73  msg() value to s
252a0 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e  tderr and return
252b0 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   1..*/.static in
252c0 74 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45  t shellDatabaseE
252d0 72 72 6f 72 28 73 71 6c 69 74 65 33 20 2a 64 62  rror(sqlite3 *db
252e0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
252f0 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  *zErr = sqlite3_
25300 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 75 74  errmsg(db);.  ut
25310 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
25320 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
25330 20 7a 45 72 72 29 3b 0a 20 20 72 65 74 75 72 6e   zErr);.  return
25340 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   1;.}../*.** Com
25350 70 61 72 65 20 74 68 65 20 70 61 74 74 65 72 6e  pare the pattern
25360 20 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61 67 61 69   in zGlob[] agai
25370 6e 73 74 20 74 68 65 20 74 65 78 74 20 69 6e 20  nst the text in 
25380 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 54 52 55  z[].  Return TRU
25390 45 0a 2a 2a 20 69 66 20 74 68 65 79 20 6d 61 74  E.** if they mat
253a0 63 68 20 61 6e 64 20 46 41 4c 53 45 20 28 30 29  ch and FALSE (0)
253b0 20 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   if they do not 
253c0 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f  match..**.** Glo
253d0 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a  bbing rules:.**.
253e0 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20 20  **      '*'     
253f0 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65    Matches any se
25400 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f  quence of zero o
25410 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72  r more character
25420 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f  s..**.**      '?
25430 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20  '       Matches 
25440 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61 72  exactly one char
25450 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  acter..**.**    
25460 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63   [...]      Matc
25470 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65  hes one characte
25480 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f  r from the enclo
25490 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20  sed list of.**  
254a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68                ch
254b0 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  aracters..**.** 
254c0 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d      [^...]     M
254d0 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61  atches one chara
254e0 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65 20  cter not in the 
254f0 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a  enclosed list..*
25500 2a 0a 2a 2a 20 20 20 20 20 20 27 23 27 20 20 20  *.**      '#'   
25510 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20      Matches any 
25520 73 65 71 75 65 6e 63 65 20 6f 66 20 6f 6e 65 20  sequence of one 
25530 6f 72 20 6d 6f 72 65 20 64 69 67 69 74 73 20 77  or more digits w
25540 69 74 68 20 61 6e 0a 2a 2a 20 20 20 20 20 20 20  ith an.**       
25550 20 20 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 61           optiona
25560 6c 20 2b 20 6f 72 20 2d 20 73 69 67 6e 20 69 6e  l + or - sign in
25570 20 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20   front.**.**    
25580 20 20 27 20 27 20 20 20 20 20 20 20 41 6e 79 20    ' '       Any 
25590 73 70 61 6e 20 6f 66 20 77 68 69 74 65 73 70 61  span of whitespa
255a0 63 65 20 6d 61 74 63 68 65 73 20 61 6e 79 20 6f  ce matches any o
255b0 74 68 65 72 20 73 70 61 6e 20 6f 66 0a 2a 2a 20  ther span of.** 
255c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
255d0 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a  hitespace..**.**
255e0 20 45 78 74 72 61 20 77 68 69 74 65 73 70 61 63   Extra whitespac
255f0 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
25600 7a 5b 5d 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  z[] is ignored..
25610 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
25620 73 74 63 61 73 65 5f 67 6c 6f 62 28 63 6f 6e 73  stcase_glob(cons
25630 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c 20 63  t char *zGlob, c
25640 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
25650 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20 69 6e   int c, c2;.  in
25660 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20  t invert;.  int 
25670 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65 28 20  seen;..  while( 
25680 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29  (c = (*(zGlob++)
25690 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ))!=0 ){.    if(
256a0 20 49 73 53 70 61 63 65 28 63 29 20 29 7b 0a 20   IsSpace(c) ){. 
256b0 20 20 20 20 20 69 66 28 20 21 49 73 53 70 61 63       if( !IsSpac
256c0 65 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30  e(*z) ) return 0
256d0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49  ;.      while( I
256e0 73 53 70 61 63 65 28 2a 7a 47 6c 6f 62 29 20 29  sSpace(*zGlob) )
256f0 20 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20 20 20 20   zGlob++;.      
25700 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a  while( IsSpace(*
25710 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65  z) ) z++;.    }e
25720 6c 73 65 20 69 66 28 20 63 3d 3d 27 2a 27 20 29  lse if( c=='*' )
25730 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  {.      while( (
25740 63 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 20  c=(*(zGlob++))) 
25750 3d 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27  == '*' || c=='?'
25760 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
25770 63 3d 3d 27 3f 27 20 26 26 20 28 2a 28 7a 2b 2b  c=='?' && (*(z++
25780 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ))==0 ) return 0
25790 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
257a0 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
257b0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
257c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
257d0 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='[' ){.        
257e0 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 74 65 73  while( *z && tes
257f0 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62  tcase_glob(zGlob
25800 2d 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20  -1,z)==0 ){.    
25810 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20        z++;.     
25820 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
25830 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20 20 20  urn (*z)!=0;.   
25840 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65     }.      while
25850 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b 29 29  ( (c2 = (*(z++))
25860 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
25870 77 68 69 6c 65 28 20 63 32 21 3d 63 20 29 7b 0a  while( c2!=c ){.
25880 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a            c2 = *
25890 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20  (z++);.         
258a0 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65 74   if( c2==0 ) ret
258b0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
258c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73  .        if( tes
258d0 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62  tcase_glob(zGlob
258e0 2c 7a 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ,z) ) return 1;.
258f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
25900 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
25910 65 20 69 66 28 20 63 3d 3d 27 3f 27 20 29 7b 0a  e if( c=='?' ){.
25920 20 20 20 20 20 20 69 66 28 20 28 2a 28 7a 2b 2b        if( (*(z++
25930 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ))==0 ) return 0
25940 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
25950 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  c=='[' ){.      
25960 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b  int prior_c = 0;
25970 0a 20 20 20 20 20 20 73 65 65 6e 20 3d 20 30 3b  .      seen = 0;
25980 0a 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20  .      invert = 
25990 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 28 7a  0;.      c = *(z
259a0 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ++);.      if( c
259b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
259c0 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c        c2 = *(zGl
259d0 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28  ob++);.      if(
259e0 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20   c2=='^' ){.    
259f0 20 20 20 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a      invert = 1;.
25a00 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a          c2 = *(z
25a10 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d  Glob++);.      }
25a20 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27  .      if( c2=='
25a30 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]' ){.        if
25a40 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20  ( c==']' ) seen 
25a50 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20  = 1;.        c2 
25a60 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20  = *(zGlob++);.  
25a70 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
25a80 65 28 20 63 32 20 26 26 20 63 32 21 3d 27 5d 27  e( c2 && c2!=']'
25a90 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
25aa0 63 32 3d 3d 27 2d 27 20 26 26 20 7a 47 6c 6f 62  c2=='-' && zGlob
25ab0 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a 47 6c 6f  [0]!=']' && zGlo
25ac0 62 5b 30 5d 21 3d 30 20 26 26 20 70 72 69 6f 72  b[0]!=0 && prior
25ad0 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  _c>0 ){.        
25ae0 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b    c2 = *(zGlob++
25af0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
25b00 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63   c>=prior_c && c
25b10 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b  <=c2 ) seen = 1;
25b20 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72  .          prior
25b30 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  _c = 0;.        
25b40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
25b50 20 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20   if( c==c2 ){.  
25b60 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d            seen =
25b70 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
25b80 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f            prior_
25b90 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20  c = c2;.        
25ba0 7d 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a  }.        c2 = *
25bb0 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20  (zGlob++);.     
25bc0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d   }.      if( c2=
25bd0 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e  =0 || (seen ^ in
25be0 76 65 72 74 29 3d 3d 30 20 29 20 72 65 74 75 72  vert)==0 ) retur
25bf0 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 0;.    }else i
25c00 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20  f( c=='#' ){.   
25c10 20 20 20 69 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d     if( (z[0]=='-
25c20 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20  ' || z[0]=='+') 
25c30 26 26 20 49 73 44 69 67 69 74 28 7a 5b 31 5d 29  && IsDigit(z[1])
25c40 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66   ) z++;.      if
25c50 28 20 21 49 73 44 69 67 69 74 28 7a 5b 30 5d 29  ( !IsDigit(z[0])
25c60 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
25c70 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 77 68     z++;.      wh
25c80 69 6c 65 28 20 49 73 44 69 67 69 74 28 7a 5b 30  ile( IsDigit(z[0
25c90 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ z++; }.   
25ca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
25cb0 28 20 63 21 3d 28 2a 28 7a 2b 2b 29 29 20 29 20  ( c!=(*(z++)) ) 
25cc0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
25cd0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 49 73 53    }.  while( IsS
25ce0 70 61 63 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b  pace(*z) ){ z++;
25cf0 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d   }.  return *z==
25d00 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  0;.}.../*.** Com
25d10 70 61 72 65 20 74 68 65 20 73 74 72 69 6e 67 20  pare the string 
25d20 61 73 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  as a command-lin
25d30 65 20 6f 70 74 69 6f 6e 20 77 69 74 68 20 65 69  e option with ei
25d40 74 68 65 72 20 6f 6e 65 20 6f 72 20 74 77 6f 0a  ther one or two.
25d50 2a 2a 20 69 6e 69 74 69 61 6c 20 22 2d 22 20 63  ** initial "-" c
25d60 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74  haracters..*/.st
25d70 61 74 69 63 20 69 6e 74 20 6f 70 74 69 6f 6e 4d  atic int optionM
25d80 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20  atch(const char 
25d90 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61  *zStr, const cha
25da0 72 20 2a 7a 4f 70 74 29 7b 0a 20 20 69 66 28 20  r *zOpt){.  if( 
25db0 7a 53 74 72 5b 30 5d 21 3d 27 2d 27 20 29 20 72  zStr[0]!='-' ) r
25dc0 65 74 75 72 6e 20 30 3b 0a 20 20 7a 53 74 72 2b  eturn 0;.  zStr+
25dd0 2b 3b 0a 20 20 69 66 28 20 7a 53 74 72 5b 30 5d  +;.  if( zStr[0]
25de0 3d 3d 27 2d 27 20 29 20 7a 53 74 72 2b 2b 3b 0a  =='-' ) zStr++;.
25df0 20 20 72 65 74 75 72 6e 20 73 74 72 63 6d 70 28    return strcmp(
25e00 7a 53 74 72 2c 20 7a 4f 70 74 29 3d 3d 30 3b 0a  zStr, zOpt)==0;.
25e10 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
25e20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  a file..*/.int s
25e30 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 63  hellDeleteFile(c
25e40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
25e50 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  name){.  int rc;
25e60 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 20  .#ifdef _WIN32. 
25e70 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71   wchar_t *z = sq
25e80 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
25e90 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46 69 6c  _to_unicode(zFil
25ea0 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20 5f  ename);.  rc = _
25eb0 77 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20 20 73 71  wunlink(z);.  sq
25ec0 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23  lite3_free(z);.#
25ed0 65 6c 73 65 0a 20 20 72 63 20 3d 20 75 6e 6c 69  else.  rc = unli
25ee0 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23  nk(zFilename);.#
25ef0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
25f00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  c;.}../*.** Try 
25f10 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
25f20 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 28 69 66  mporary file (if
25f30 20 74 68 65 72 65 20 69 73 20 6f 6e 65 29 20 61   there is one) a
25f40 6e 64 20 66 72 65 65 20 74 68 65 0a 2a 2a 20 6d  nd free the.** m
25f50 65 6d 6f 72 79 20 75 73 65 64 20 74 6f 20 68 6f  emory used to ho
25f60 6c 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ld the name of t
25f70 68 65 20 74 65 6d 70 20 66 69 6c 65 2e 0a 2a 2f  he temp file..*/
25f80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65  .static void cle
25f90 61 72 54 65 6d 70 46 69 6c 65 28 53 68 65 6c 6c  arTempFile(Shell
25fa0 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 66 28  State *p){.  if(
25fb0 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30   p->zTempFile==0
25fc0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
25fd0 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 29 20   p->doXdgOpen ) 
25fe0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 68  return;.  if( sh
25ff0 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 70 2d  ellDeleteFile(p-
26000 3e 7a 54 65 6d 70 46 69 6c 65 29 20 29 20 72 65  >zTempFile) ) re
26010 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f  turn;.  sqlite3_
26020 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c  free(p->zTempFil
26030 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46 69  e);.  p->zTempFi
26040 6c 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  le = 0;.}../*.**
26050 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 74 65   Create a new te
26060 6d 70 20 66 69 6c 65 20 6e 61 6d 65 20 77 69 74  mp file name wit
26070 68 20 74 68 65 20 67 69 76 65 6e 20 73 75 66 66  h the given suff
26080 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ix..*/.static vo
26090 69 64 20 6e 65 77 54 65 6d 70 46 69 6c 65 28 53  id newTempFile(S
260a0 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f  hellState *p, co
260b0 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 66 66 69  nst char *zSuffi
260c0 78 29 7b 0a 20 20 63 6c 65 61 72 54 65 6d 70 46  x){.  clearTempF
260d0 69 6c 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ile(p);.  sqlite
260e0 33 5f 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46  3_free(p->zTempF
260f0 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70  ile);.  p->zTemp
26100 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  File = 0;.  if( 
26110 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c  p->db ){.    sql
26120 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
26130 6c 28 70 2d 3e 64 62 2c 20 30 2c 20 53 51 4c 49  l(p->db, 0, SQLI
26140 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c  TE_FCNTL_TEMPFIL
26150 45 4e 41 4d 45 2c 20 26 70 2d 3e 7a 54 65 6d 70  ENAME, &p->zTemp
26160 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  File);.  }.  if(
26170 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30   p->zTempFile==0
26180 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
26190 75 69 6e 74 36 34 20 72 3b 0a 20 20 20 20 73 71  uint64 r;.    sq
261a0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
261b0 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b  (sizeof(r), &r);
261c0 0a 20 20 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  .    p->zTempFil
261d0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
261e0 6e 74 66 28 22 74 65 6d 70 25 6c 6c 78 2e 25 73  ntf("temp%llx.%s
261f0 22 2c 20 72 2c 20 7a 53 75 66 66 69 78 29 3b 0a  ", r, zSuffix);.
26200 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
26210 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69  zTempFile = sqli
26220 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2e  te3_mprintf("%z.
26230 25 73 22 2c 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  %s", p->zTempFil
26240 65 2c 20 7a 53 75 66 66 69 78 29 3b 0a 20 20 7d  e, zSuffix);.  }
26250 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46  .  if( p->zTempF
26260 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61  ile==0 ){.    ra
26270 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
26280 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c   "out of memory\
26290 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
262a0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
262b0 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
262c0 6f 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c 61 72  on of SQL scalar
262d0 20 66 75 6e 63 74 69 6f 6e 20 66 6b 65 79 5f 63   function fkey_c
262e0 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 2c  ollate_clause(),
262f0 20 75 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20   used.** by the 
26300 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65  ".lint fkey-inde
26310 78 65 73 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68  xes" command. Th
26320 69 73 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  is scalar functi
26330 6f 6e 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  on is always.** 
26340 63 61 6c 6c 65 64 20 77 69 74 68 20 66 6f 75 72  called with four
26350 20 61 72 67 75 6d 65 6e 74 73 20 2d 20 74 68 65   arguments - the
26360 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6e 61   parent table na
26370 6d 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20 63  me, the parent c
26380 6f 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74  olumn name,.** t
26390 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 6e  he child table n
263a0 61 6d 65 20 61 6e 64 20 74 68 65 20 63 68 69 6c  ame and the chil
263b0 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
263c0 2a 0a 2a 2a 20 20 20 66 6b 65 79 5f 63 6f 6c 6c  *.**   fkey_coll
263d0 61 74 65 5f 63 6c 61 75 73 65 28 27 70 61 72 65  ate_clause('pare
263e0 6e 74 2d 74 61 62 27 2c 20 27 70 61 72 65 6e 74  nt-tab', 'parent
263f0 2d 63 6f 6c 27 2c 20 27 63 68 69 6c 64 2d 74 61  -col', 'child-ta
26400 62 27 2c 20 27 63 68 69 6c 64 2d 63 6f 6c 27 29  b', 'child-col')
26410 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
26420 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   of the named ta
26430 62 6c 65 73 20 6f 72 20 63 6f 6c 75 6d 6e 73 20  bles or columns 
26440 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  do not exist, th
26450 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72  is function.** r
26460 65 74 75 72 6e 73 20 61 6e 20 65 6d 70 74 79 20  eturns an empty 
26470 73 74 72 69 6e 67 2e 20 41 6e 20 65 6d 70 74 79  string. An empty
26480 20 73 74 72 69 6e 67 20 69 73 20 61 6c 73 6f 20   string is also 
26490 72 65 74 75 72 6e 65 64 20 69 66 20 62 6f 74 68  returned if both
264a0 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 63   tables.** and c
264b0 6f 6c 75 6d 6e 73 20 65 78 69 73 74 20 62 75 74  olumns exist but
264c0 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 64   have the same d
264d0 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
264e0 20 73 65 71 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a   sequence. Or,.*
264f0 2a 20 69 66 20 62 6f 74 68 20 65 78 69 73 74 20  * if both exist 
26500 62 75 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  but the default 
26510 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
26520 63 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  ces are differen
26530 74 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  t, this.** funct
26540 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
26550 73 74 72 69 6e 67 20 22 20 43 4f 4c 4c 41 54 45  string " COLLATE
26560 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69   <parent-collati
26570 6f 6e 3e 22 2c 20 77 68 65 72 65 0a 2a 2a 20 3c  on>", where.** <
26580 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e  parent-collation
26590 3e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  > is the default
265a0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
265b0 6e 63 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e  nce of the paren
265c0 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61  t column..*/.sta
265d0 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 46 6b  tic void shellFk
265e0 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65 28  eyCollateClause(
265f0 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
26600 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
26610 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
26620 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
26630 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
26640 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
26650 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29  _db_handle(pCtx)
26660 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
26670 7a 50 61 72 65 6e 74 3b 0a 20 20 63 6f 6e 73 74  zParent;.  const
26680 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f   char *zParentCo
26690 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
266a0 2a 7a 50 61 72 65 6e 74 53 65 71 3b 0a 20 20 63  *zParentSeq;.  c
266b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c  onst char *zChil
266c0 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d;.  const char 
266d0 2a 7a 43 68 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f  *zChildCol;.  co
266e0 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64  nst char *zChild
266f0 53 65 71 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 69  Seq = 0;  /* Ini
26700 74 69 61 6c 69 7a 65 20 74 6f 20 61 76 6f 69 64  tialize to avoid
26710 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20   false-positive 
26720 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  warning */.  int
26730 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
26740 6e 56 61 6c 3d 3d 34 20 29 3b 0a 20 20 7a 50 61  nVal==4 );.  zPa
26750 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  rent = (const ch
26760 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
26770 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
26780 3b 0a 20 20 7a 50 61 72 65 6e 74 43 6f 6c 20 3d  ;.  zParentCol =
26790 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
267a0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
267b0 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43  (apVal[1]);.  zC
267c0 68 69 6c 64 20 3d 20 28 63 6f 6e 73 74 20 63 68  hild = (const ch
267d0 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
267e0 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d 29  e_text(apVal[2])
267f0 3b 0a 20 20 7a 43 68 69 6c 64 43 6f 6c 20 3d 20  ;.  zChildCol = 
26800 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
26810 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
26820 61 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71  apVal[3]);..  sq
26830 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
26840 74 28 70 43 74 78 2c 20 22 22 2c 20 2d 31 2c 20  t(pCtx, "", -1, 
26850 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
26860 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74    rc = sqlite3_t
26870 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
26880 64 61 74 61 28 0a 20 20 20 20 20 20 64 62 2c 20  data(.      db, 
26890 22 6d 61 69 6e 22 2c 20 7a 50 61 72 65 6e 74 2c  "main", zParent,
268a0 20 7a 50 61 72 65 6e 74 43 6f 6c 2c 20 30 2c 20   zParentCol, 0, 
268b0 26 7a 50 61 72 65 6e 74 53 65 71 2c 20 30 2c 20  &zParentSeq, 0, 
268c0 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20  0, 0.  );.  if( 
268d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
268e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
268f0 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
26900 65 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 20  etadata(.       
26910 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 43 68   db, "main", zCh
26920 69 6c 64 2c 20 7a 43 68 69 6c 64 43 6f 6c 2c 20  ild, zChildCol, 
26930 30 2c 20 26 7a 43 68 69 6c 64 53 65 71 2c 20 30  0, &zChildSeq, 0
26940 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
26950 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
26960 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65  ITE_OK && sqlite
26970 33 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e  3_stricmp(zParen
26980 74 53 65 71 2c 20 7a 43 68 69 6c 64 53 65 71 29  tSeq, zChildSeq)
26990 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   ){.    char *z 
269a0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
269b0 66 28 22 20 43 4f 4c 4c 41 54 45 20 25 73 22 2c  f(" COLLATE %s",
269c0 20 7a 50 61 72 65 6e 74 53 65 71 29 3b 0a 20 20   zParentSeq);.  
269d0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
269e0 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d  _text(pCtx, z, -
269f0 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
26a00 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
26a10 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d  3_free(z);.  }.}
26a20 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  .../*.** The imp
26a30 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 64  lementation of d
26a40 6f 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e  ot-command ".lin
26a50 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2e  t fkey-indexes".
26a60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
26a70 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28 0a  intFkeyIndexes(.
26a80 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
26a90 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  tate,           
26aa0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65    /* Current she
26ab0 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f  ll tool state */
26ac0 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
26ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ae0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
26af0 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
26b00 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a  to dot command *
26b10 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20  /.  int nArg    
26b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b30 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
26b40 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72   entries in azAr
26b50 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  g[] */.){.  sqli
26b60 74 65 33 20 2a 64 62 20 3d 20 70 53 74 61 74 65  te3 *db = pState
26b70 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44  ->db;       /* D
26b80 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
26b90 6f 20 71 75 65 72 79 20 22 6d 61 69 6e 22 20 64  o query "main" d
26ba0 62 20 6f 66 20 2a 2f 0a 20 20 46 49 4c 45 20 2a  b of */.  FILE *
26bb0 6f 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75  out = pState->ou
26bc0 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72  t;        /* Str
26bd0 65 61 6d 20 74 6f 20 77 72 69 74 65 20 6e 6f 6e  eam to write non
26be0 2d 65 72 72 6f 72 20 6f 75 74 70 75 74 20 74 6f  -error output to
26bf0 20 2a 2f 0a 20 20 69 6e 74 20 62 56 65 72 62 6f   */.  int bVerbo
26c00 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  se = 0;         
26c10 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 76 65 72        /* If -ver
26c20 62 6f 73 65 20 69 73 20 70 72 65 73 65 6e 74 20  bose is present 
26c30 2a 2f 0a 20 20 69 6e 74 20 62 47 72 6f 75 70 42  */.  int bGroupB
26c40 79 50 61 72 65 6e 74 20 3d 20 30 3b 20 20 20 20  yParent = 0;    
26c50 20 20 20 20 20 2f 2a 20 49 66 20 2d 67 72 6f 75       /* If -grou
26c60 70 62 79 70 61 72 65 6e 74 20 69 73 20 70 72 65  pbyparent is pre
26c70 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  sent */.  int i;
26c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20            /* To 
26ca0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
26cb0 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e  azArg[] */.  con
26cc0 73 74 20 63 68 61 72 20 2a 7a 49 6e 64 65 6e 74  st char *zIndent
26cd0 20 3d 20 22 22 3b 20 20 20 20 20 20 20 2f 2a 20   = "";       /* 
26ce0 48 6f 77 20 6d 75 63 68 20 74 6f 20 69 6e 64 65  How much to inde
26cf0 6e 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  nt CREATE INDEX 
26d00 62 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  by */.  int rc; 
26d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
26d30 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
26d40 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d  te3_stmt *pSql =
26d50 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43   0;         /* C
26d60 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20  ompiled version 
26d70 6f 66 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  of SQL statement
26d80 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a   below */..  /*.
26d90 20 20 2a 2a 20 54 68 69 73 20 53 45 4c 45 43 54    ** This SELECT
26da0 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
26db0 6e 73 20 6f 6e 65 20 72 6f 77 20 66 6f 72 20 65  ns one row for e
26dc0 61 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ach foreign key 
26dd0 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20  constraint.  ** 
26de0 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66  in the schema of
26df0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
26e00 73 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 20 76  se. The column v
26e10 61 6c 75 65 73 20 61 72 65 3a 0a 20 20 2a 2a 0a  alues are:.  **.
26e20 20 20 2a 2a 20 30 2e 20 54 68 65 20 74 65 78 74    ** 0. The text
26e30 20 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65   of an SQL state
26e40 6d 65 6e 74 20 73 69 6d 69 6c 61 72 20 74 6f 3a  ment similar to:
26e50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
26e60 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
26e70 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f  LAN SELECT 1 FRO
26e80 4d 20 63 68 69 6c 64 5f 74 61 62 6c 65 20 57 48  M child_table WH
26e90 45 52 45 20 63 68 69 6c 64 5f 6b 65 79 3d 3f 22  ERE child_key=?"
26ea0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 54 68  .  **.  **    Th
26eb0 69 73 20 53 45 4c 45 43 54 20 69 73 20 73 69 6d  is SELECT is sim
26ec0 69 6c 61 72 20 74 6f 20 74 68 65 20 6f 6e 65 20  ilar to the one 
26ed0 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e  that the foreign
26ee0 20 6b 65 79 73 20 69 6d 70 6c 65 6d 65 6e 74 61   keys implementa
26ef0 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 6e 65 65  tion.  **    nee
26f00 64 73 20 74 6f 20 72 75 6e 20 69 6e 74 65 72 6e  ds to run intern
26f10 61 6c 6c 79 20 6f 6e 20 63 68 69 6c 64 20 74 61  ally on child ta
26f20 62 6c 65 73 2e 20 49 66 20 74 68 65 72 65 20 69  bles. If there i
26f30 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
26f40 63 61 6e 0a 20 20 2a 2a 20 20 20 20 62 65 20 75  can.  **    be u
26f50 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
26f60 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e  this query, then
26f70 20 69 74 20 63 61 6e 20 61 6c 73 6f 20 62 65 20   it can also be 
26f80 75 73 65 64 20 62 79 20 74 68 65 20 46 4b 0a 20  used by the FK. 
26f90 20 2a 2a 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74   **    implement
26fa0 61 74 69 6f 6e 20 74 6f 20 6f 70 74 69 6d 69 7a  ation to optimiz
26fb0 65 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41  e DELETE or UPDA
26fc0 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  TE statements on
26fd0 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a   the parent.  **
26fe0 20 20 20 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a      table..  **.
26ff0 20 20 2a 2a 20 31 2e 20 41 20 47 4c 4f 42 20 70    ** 1. A GLOB p
27000 61 74 74 65 72 6e 20 73 75 69 74 61 62 6c 65 20  attern suitable 
27010 66 6f 72 20 73 71 6c 69 74 65 33 5f 73 74 72 67  for sqlite3_strg
27020 6c 6f 62 28 29 2e 20 49 66 20 74 68 65 20 70 6c  lob(). If the pl
27030 61 6e 20 6f 75 74 70 75 74 20 62 79 0a 20 20 2a  an output by.  *
27040 2a 20 20 20 20 74 68 65 20 45 58 50 4c 41 49 4e  *    the EXPLAIN
27050 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d   QUERY PLAN comm
27060 61 6e 64 20 6d 61 74 63 68 65 73 20 74 68 69 73  and matches this
27070 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 74   pattern, then t
27080 68 65 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 20  he schema.  **  
27090 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e    contains an in
270a0 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65 20  dex that can be 
270b0 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65  used to optimize
270c0 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a   the query..  **
270d0 0a 20 20 2a 2a 20 32 2e 20 48 75 6d 61 6e 20 72  .  ** 2. Human r
270e0 65 61 64 61 62 6c 65 20 74 65 78 74 20 74 68 61  eadable text tha
270f0 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
27100 63 68 69 6c 64 20 74 61 62 6c 65 20 61 6e 64 20  child table and 
27110 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20  columns. e.g..  
27120 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 63  **.  **       "c
27130 68 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64  hild_table(child
27140 5f 6b 65 79 31 2c 20 63 68 69 6c 64 5f 6b 65 79  _key1, child_key
27150 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e  2)".  **.  ** 3.
27160 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   Human readable 
27170 74 65 78 74 20 74 68 61 74 20 64 65 73 63 72 69  text that descri
27180 62 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 74  bes the parent t
27190 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73  able and columns
271a0 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  . e.g..  **.  **
271b0 20 20 20 20 20 20 20 22 70 61 72 65 6e 74 5f 74         "parent_t
271c0 61 62 6c 65 28 70 61 72 65 6e 74 5f 6b 65 79 31  able(parent_key1
271d0 2c 20 70 61 72 65 6e 74 5f 6b 65 79 32 29 22 0a  , parent_key2)".
271e0 20 20 2a 2a 0a 20 20 2a 2a 20 34 2e 20 41 20 66    **.  ** 4. A f
271f0 75 6c 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58  ull CREATE INDEX
27200 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 61   statement for a
27210 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 75  n index that cou
27220 6c 64 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20  ld be used to.  
27230 2a 2a 20 20 20 20 6f 70 74 69 6d 69 7a 65 20 44  **    optimize D
27240 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20  ELETE or UPDATE 
27250 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68  statements on th
27260 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 20  e parent table. 
27270 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  e.g..  **.  **  
27280 20 20 20 20 20 22 43 52 45 41 54 45 20 49 4e 44       "CREATE IND
27290 45 58 20 63 68 69 6c 64 5f 74 61 62 6c 65 5f 63  EX child_table_c
272a0 68 69 6c 64 5f 6b 65 79 20 4f 4e 20 63 68 69 6c  hild_key ON chil
272b0 64 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65  d_table(child_ke
272c0 79 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e  y)".  **.  ** 5.
272d0 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
272e0 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20   parent table.. 
272f0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 73 65 20 73   **.  ** These s
27300 69 78 20 76 61 6c 75 65 73 20 61 72 65 20 75 73  ix values are us
27310 65 64 20 62 79 20 74 68 65 20 43 20 6c 6f 67 69  ed by the C logi
27320 63 20 62 65 6c 6f 77 20 74 6f 20 67 65 6e 65 72  c below to gener
27330 61 74 65 20 74 68 65 20 72 65 70 6f 72 74 2e 0a  ate the report..
27340 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61    */.  const cha
27350 72 20 2a 7a 53 71 6c 20 3d 0a 20 20 22 53 45 4c  r *zSql =.  "SEL
27360 45 43 54 20 22 0a 20 20 20 20 22 20 20 20 20 20  ECT ".    "     
27370 27 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  'EXPLAIN QUERY P
27380 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f  LAN SELECT 1 FRO
27390 4d 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e  M ' || quote(s.n
273a0 61 6d 65 29 20 7c 7c 20 27 20 57 48 45 52 45 20  ame) || ' WHERE 
273b0 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f  '".    "  || gro
273c0 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28  up_concat(quote(
273d0 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 2e 27 20 7c  s.name) || '.' |
273e0 7c 20 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d  | quote(f.[from]
273f0 29 20 7c 7c 20 27 3d 3f 27 20 22 0a 20 20 20 20  ) || '=?' ".    
27400 22 20 20 7c 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61  "  || fkey_colla
27410 74 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20  te_clause(".    
27420 22 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65  "       f.[table
27430 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74  ], COALESCE(f.[t
27440 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73  o], p.[name]), s
27450 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29  .name, f.[from])
27460 2c 27 20 41 4e 44 20 27 29 22 0a 20 20 20 20 22  ,' AND ')".    "
27470 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 53  , ".    "     'S
27480 45 41 52 43 48 20 54 41 42 4c 45 20 27 20 7c 7c  EARCH TABLE ' ||
27490 20 73 2e 6e 61 6d 65 20 7c 7c 20 27 20 55 53 49   s.name || ' USI
274a0 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
274b0 58 2a 28 27 22 0a 20 20 20 20 22 20 20 7c 7c 20  X*('".    "  || 
274c0 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 27 2a 3d  group_concat('*=
274d0 3f 27 2c 20 27 20 41 4e 44 20 27 29 20 7c 7c 20  ?', ' AND ') || 
274e0 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20  ')'".    ", ".  
274f0 20 20 22 20 20 20 20 20 73 2e 6e 61 6d 65 20 20    "     s.name  
27500 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f  || '(' || group_
27510 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c  concat(f.[from],
27520 20 20 27 2c 20 27 29 20 7c 7c 20 27 29 27 22 0a    ', ') || ')'".
27530 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20      ", ".    "  
27540 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20     f.[table] || 
27550 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e  '(' || group_con
27560 63 61 74 28 43 4f 41 4c 45 53 43 45 28 66 2e 5b  cat(COALESCE(f.[
27570 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 29 20  to], p.[name])) 
27580 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22  || ')'".    ", "
27590 0a 20 20 20 20 22 20 20 20 20 20 27 43 52 45 41  .    "     'CREA
275a0 54 45 20 49 4e 44 45 58 20 27 20 7c 7c 20 71 75  TE INDEX ' || qu
275b0 6f 74 65 28 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27  ote(s.name ||'_'
275c0 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
275d0 66 2e 5b 66 72 6f 6d 5d 2c 20 27 5f 27 29 29 22  f.[from], '_'))"
275e0 0a 20 20 20 20 22 20 20 7c 7c 20 27 20 4f 4e 20  .    "  || ' ON 
275f0 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d  ' || quote(s.nam
27600 65 29 20 7c 7c 20 27 28 27 22 0a 20 20 20 20 22  e) || '('".    "
27610 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61    || group_conca
27620 74 28 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d  t(quote(f.[from]
27630 29 20 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20  ) ||".    "     
27640 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f     fkey_collate_
27650 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20  clause(".    "  
27660 20 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65          f.[table
27670 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74  ], COALESCE(f.[t
27680 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73  o], p.[name]), s
27690 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29  .name, f.[from])
276a0 2c 20 27 2c 20 27 29 22 0a 20 20 20 20 22 20 20  , ', ')".    "  
276b0 7c 7c 20 27 29 3b 27 22 0a 20 20 20 20 22 2c 20  || ');'".    ", 
276c0 22 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74  ".    "     f.[t
276d0 61 62 6c 65 5d 20 22 0a 20 20 20 20 22 46 52 4f  able] ".    "FRO
276e0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
276f0 41 53 20 73 2c 20 70 72 61 67 6d 61 5f 66 6f 72  AS s, pragma_for
27700 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 28 73 2e  eign_key_list(s.
27710 6e 61 6d 65 29 20 41 53 20 66 20 22 0a 20 20 20  name) AS f ".   
27720 20 22 4c 45 46 54 20 4a 4f 49 4e 20 70 72 61 67   "LEFT JOIN prag
27730 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 20 41 53  ma_table_info AS
27740 20 70 20 4f 4e 20 28 70 6b 2d 31 3d 73 65 71 20   p ON (pk-1=seq 
27750 41 4e 44 20 70 2e 61 72 67 3d 66 2e 5b 74 61 62  AND p.arg=f.[tab
27760 6c 65 5d 29 20 22 0a 20 20 20 20 22 47 52 4f 55  le]) ".    "GROU
27770 50 20 42 59 20 73 2e 6e 61 6d 65 2c 20 66 2e 69  P BY s.name, f.i
27780 64 20 22 0a 20 20 20 20 22 4f 52 44 45 52 20 42  d ".    "ORDER B
27790 59 20 28 43 41 53 45 20 57 48 45 4e 20 3f 20 54  Y (CASE WHEN ? T
277a0 48 45 4e 20 66 2e 5b 74 61 62 6c 65 5d 20 45 4c  HEN f.[table] EL
277b0 53 45 20 73 2e 6e 61 6d 65 20 45 4e 44 29 22 0a  SE s.name END)".
277c0 20 20 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72    ;.  const char
277d0 20 2a 7a 47 6c 6f 62 49 50 4b 20 3d 20 22 53 45   *zGlobIPK = "SE
277e0 41 52 43 48 20 54 41 42 4c 45 20 2a 20 55 53 49  ARCH TABLE * USI
277f0 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  NG INTEGER PRIMA
27800 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29  RY KEY (rowid=?)
27810 22 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69  ";..  for(i=2; i
27820 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
27830 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33   int n = strlen3
27840 30 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  0(azArg[i]);.   
27850 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69   if( n>1 && sqli
27860 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 76  te3_strnicmp("-v
27870 65 72 62 6f 73 65 22 2c 20 61 7a 41 72 67 5b 69  erbose", azArg[i
27880 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ], n)==0 ){.    
27890 20 20 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a    bVerbose = 1;.
278a0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
278b0 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65  f( n>1 && sqlite
278c0 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 67 72 6f  3_strnicmp("-gro
278d0 75 70 62 79 70 61 72 65 6e 74 22 2c 20 61 7a 41  upbyparent", azA
278e0 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a  rg[i], n)==0 ){.
278f0 20 20 20 20 20 20 62 47 72 6f 75 70 42 79 50 61        bGroupByPa
27900 72 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  rent = 1;.      
27910 7a 49 6e 64 65 6e 74 20 3d 20 22 20 20 20 20 22  zIndent = "    "
27920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
27930 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
27940 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
27950 65 3a 20 25 73 20 25 73 20 3f 2d 76 65 72 62 6f  e: %s %s ?-verbo
27960 73 65 3f 20 3f 2d 67 72 6f 75 70 62 79 70 61 72  se? ?-groupbypar
27970 65 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ent?\n",.       
27980 20 20 20 61 7a 41 72 67 5b 30 5d 2c 20 61 7a 41     azArg[0], azA
27990 72 67 5b 31 5d 0a 20 20 20 20 20 20 29 3b 0a 20  rg[1].      );. 
279a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
279b0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
279c0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74    }..  /* Regist
279d0 65 72 20 74 68 65 20 66 6b 65 79 5f 63 6f 6c 6c  er the fkey_coll
279e0 61 74 65 5f 63 6c 61 75 73 65 28 29 20 53 51 4c  ate_clause() SQL
279f0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 72   function */.  r
27a00 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
27a10 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
27a20 22 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c  "fkey_collate_cl
27a30 61 75 73 65 22 2c 20 34 2c 20 53 51 4c 49 54 45  ause", 4, SQLITE
27a40 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 30 2c 20  _UTF8,.      0, 
27a50 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74 65  shellFkeyCollate
27a60 43 6c 61 75 73 65 2c 20 30 2c 20 30 0a 20 20 29  Clause, 0, 0.  )
27a70 3b 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ;...  if( rc==SQ
27a80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
27a90 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
27aa0 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
27ab0 20 2d 31 2c 20 26 70 53 71 6c 2c 20 30 29 3b 0a   -1, &pSql, 0);.
27ac0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
27ad0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
27ae0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
27af0 70 53 71 6c 2c 20 31 2c 20 62 47 72 6f 75 70 42  pSql, 1, bGroupB
27b00 79 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20  yParent);.  }.. 
27b10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27b20 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  OK ){.    int rc
27b30 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72  2;.    char *zPr
27b40 65 76 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  ev = 0;.    whil
27b50 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  e( SQLITE_ROW==s
27b60 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c  qlite3_step(pSql
27b70 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  ) ){.      int r
27b80 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73  es = -1;.      s
27b90 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78  qlite3_stmt *pEx
27ba0 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20  plain = 0;.     
27bb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 51   const char *zEQ
27bc0 50 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  P = (const char*
27bd0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
27be0 74 65 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20  text(pSql, 0);. 
27bf0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
27c00 2a 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20  *zGlob = (const 
27c10 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
27c20 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
27c30 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  1);.      const 
27c40 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 28 63  char *zFrom = (c
27c50 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
27c60 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
27c70 53 71 6c 2c 20 32 29 3b 0a 20 20 20 20 20 20 63  Sql, 2);.      c
27c80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67  onst char *zTarg
27c90 65 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  et = (const char
27ca0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
27cb0 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29 3b 0a  _text(pSql, 3);.
27cc0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
27cd0 20 2a 7a 43 49 20 3d 20 28 63 6f 6e 73 74 20 63   *zCI = (const c
27ce0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
27cf0 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 34  umn_text(pSql, 4
27d00 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
27d10 68 61 72 20 2a 7a 50 61 72 65 6e 74 20 3d 20 28  har *zParent = (
27d20 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
27d30 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
27d40 70 53 71 6c 2c 20 35 29 3b 0a 0a 20 20 20 20 20  pSql, 5);..     
27d50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
27d60 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51  epare_v2(db, zEQ
27d70 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e  P, -1, &pExplain
27d80 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
27d90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
27da0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
27db0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
27dc0 69 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61  ite3_step(pExpla
27dd0 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  in) ){.        c
27de0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6c 61 6e  onst char *zPlan
27df0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
27e00 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
27e10 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29  ext(pExplain, 3)
27e20 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  ;.        res = 
27e30 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
27e40 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  0==sqlite3_strgl
27e50 6f 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c 61 6e 29  ob(zGlob, zPlan)
27e60 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 30  .           || 0
27e70 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ==sqlite3_strglo
27e80 62 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a 50 6c 61  b(zGlobIPK, zPla
27e90 6e 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  n).        );.  
27ea0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
27eb0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
27ec0 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20  e(pExplain);.   
27ed0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27ee0 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 0a 20  E_OK ) break;.. 
27ef0 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29       if( res<0 )
27f00 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
27f10 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
27f20 72 6f 72 3a 20 69 6e 74 65 72 6e 61 6c 20 65 72  ror: internal er
27f30 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 20 20 62  ror");.        b
27f40 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
27f50 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  e{.        if( b
27f60 47 72 6f 75 70 42 79 50 61 72 65 6e 74 0a 20 20  GroupByParent.  
27f70 20 20 20 20 20 20 26 26 20 28 62 56 65 72 62 6f        && (bVerbo
27f80 73 65 20 7c 7c 20 72 65 73 3d 3d 30 29 0a 20 20  se || res==0).  
27f90 20 20 20 20 20 20 26 26 20 28 7a 50 72 65 76 3d        && (zPrev=
27fa0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  =0 || sqlite3_st
27fb0 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 2c 20 7a  ricmp(zParent, z
27fc0 50 72 65 76 29 29 0a 20 20 20 20 20 20 20 20 29  Prev)).        )
27fd0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
27fe0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20  printf(out, "-- 
27ff0 50 61 72 65 6e 74 20 74 61 62 6c 65 20 25 73 5c  Parent table %s\
28000 6e 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20  n", zParent);.  
28010 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
28020 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 20 20 20  free(zPrev);.   
28030 20 20 20 20 20 20 20 7a 50 72 65 76 20 3d 20 73         zPrev = s
28040 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
28050 25 73 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20  %s", zParent);. 
28060 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
28070 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
28080 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
28090 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73 20  intf(out, "%s%s 
280a0 2d 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49 6e 64 65  --> %s\n", zInde
280b0 6e 74 2c 20 7a 43 49 2c 20 7a 54 61 72 67 65 74  nt, zCI, zTarget
280c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
280d0 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b   if( bVerbose ){
280e0 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
280f0 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 2f 2a  rintf(out, "%s/*
28100 20 6e 6f 20 65 78 74 72 61 20 69 6e 64 65 78 65   no extra indexe
28110 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 25  s required for %
28120 73 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20  s -> %s */\n",. 
28130 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 49 6e               zIn
28140 64 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20 7a 54 61  dent, zFrom, zTa
28150 72 67 65 74 0a 20 20 20 20 20 20 20 20 20 20 29  rget.          )
28160 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28170 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
28180 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72 65 76  lite3_free(zPrev
28190 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d  );..    if( rc!=
281a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
281b0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
281c0 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71  derr, "%s\n", sq
281d0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
281e0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  );.    }..    rc
281f0 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  2 = sqlite3_fina
28200 6c 69 7a 65 28 70 53 71 6c 29 3b 0a 20 20 20 20  lize(pSql);.    
28210 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28220 4b 20 26 26 20 72 63 32 21 3d 53 51 4c 49 54 45  K && rc2!=SQLITE
28230 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
28240 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 72 61 77  = rc2;.      raw
28250 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
28260 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
28270 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
28280 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
28290 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
282a0 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  r, "%s\n", sqlit
282b0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
282c0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
282d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
282e0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 6c  mentation of ".l
282f0 69 6e 74 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  int" dot command
28300 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28310 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a  lintDotCommand(.
28320 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
28330 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  tate,           
28340 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65    /* Current she
28350 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f  ll tool state */
28360 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
28370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28380 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
28390 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
283a0 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a  to dot command *
283b0 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20  /.  int nArg    
283c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
283e0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72   entries in azAr
283f0 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  g[] */.){.  int 
28400 6e 3b 0a 20 20 6e 20 3d 20 28 6e 41 72 67 3e 3d  n;.  n = (nArg>=
28410 32 20 3f 20 73 74 72 6c 65 6e 33 30 28 61 7a 41  2 ? strlen30(azA
28420 72 67 5b 31 5d 29 20 3a 20 30 29 3b 0a 20 20 69  rg[1]) : 0);.  i
28430 66 28 20 6e 3c 31 20 7c 7c 20 73 71 6c 69 74 65  f( n<1 || sqlite
28440 33 5f 73 74 72 6e 69 63 6d 70 28 61 7a 41 72 67  3_strnicmp(azArg
28450 5b 31 5d 2c 20 22 66 6b 65 79 2d 69 6e 64 65 78  [1], "fkey-index
28460 65 73 22 2c 20 6e 29 20 29 20 67 6f 74 6f 20 75  es", n) ) goto u
28470 73 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 6c  sage;.  return l
28480 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28 70  intFkeyIndexes(p
28490 53 74 61 74 65 2c 20 61 7a 41 72 67 2c 20 6e 41  State, azArg, nA
284a0 72 67 29 3b 0a 0a 20 75 73 61 67 65 3a 0a 20 20  rg);.. usage:.  
284b0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
284c0 72 2c 20 22 55 73 61 67 65 20 25 73 20 73 75 62  r, "Usage %s sub
284d0 2d 63 6f 6d 6d 61 6e 64 20 3f 73 77 69 74 63 68  -command ?switch
284e0 65 73 2e 2e 2e 3f 5c 6e 22 2c 20 61 7a 41 72 67  es...?\n", azArg
284f0 5b 30 5d 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e  [0]);.  raw_prin
28500 74 66 28 73 74 64 65 72 72 2c 20 22 57 68 65 72  tf(stderr, "Wher
28510 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 20 61  e sub-commands a
28520 72 65 3a 5c 6e 22 29 3b 0a 20 20 72 61 77 5f 70  re:\n");.  raw_p
28530 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20  rintf(stderr, " 
28540 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 5c     fkey-indexes\
28550 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  n");.  return SQ
28560 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 23  LITE_ERROR;.}..#
28570 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
28580 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
28590 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
285a0 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49  (SQLITE_HAVE_ZLI
285b0 42 29 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  B)./************
285c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
285d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
285e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
285f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28600 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 22 2e 61  *****.** The ".a
28610 72 63 68 69 76 65 22 20 6f 72 20 22 2e 61 72 22  rchive" or ".ar"
28620 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61   command..*/.sta
28630 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 72  tic void shellPr
28640 65 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33  epare(.  sqlite3
28650 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52   *db, .  int *pR
28660 63 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  c, .  const char
28670 20 2a 7a 53 71 6c 2c 20 0a 20 20 73 71 6c 69 74   *zSql, .  sqlit
28680 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
28690 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20  .){.  *ppStmt = 
286a0 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  0;.  if( *pRc==S
286b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
286c0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
286d0 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
286e0 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74  zSql, -1, ppStmt
286f0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
28700 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28710 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
28720 73 74 64 65 72 72 2c 20 22 73 71 6c 20 65 72 72  stderr, "sql err
28730 6f 72 3a 20 25 73 20 28 25 64 29 5c 6e 22 2c 20  or: %s (%d)\n", 
28740 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
28750 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 73  e3_errmsg(db), s
28760 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
28770 62 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  b).      );.    
28780 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20    *pRc = rc;.   
28790 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63   }.  }.}..static
287a0 20 76 6f 69 64 20 73 68 65 6c 6c 50 72 65 70 61   void shellPrepa
287b0 72 65 50 72 69 6e 74 66 28 0a 20 20 73 71 6c 69  rePrintf(.  sqli
287c0 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20  te3 *db, .  int 
287d0 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33  *pRc, .  sqlite3
287e0 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a  _stmt **ppStmt,.
287f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
28800 6d 74 2c 20 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20  mt, .  ....){.  
28810 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69  *ppStmt = 0;.  i
28820 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
28830 4f 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73  OK ){.    va_lis
28840 74 20 61 70 3b 0a 20 20 20 20 63 68 61 72 20 2a  t ap;.    char *
28850 7a 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  z;.    va_start(
28860 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a  ap, zFmt);.    z
28870 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
28880 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20  ntf(zFmt, ap);. 
28890 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
288a0 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
288b0 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
288c0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
288d0 6c 73 65 7b 0a 20 20 20 20 20 20 73 68 65 6c 6c  lse{.      shell
288e0 50 72 65 70 61 72 65 28 64 62 2c 20 70 52 63 2c  Prepare(db, pRc,
288f0 20 7a 2c 20 70 70 53 74 6d 74 29 3b 0a 20 20 20   z, ppStmt);.   
28900 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28910 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  z);.    }.  }.}.
28920 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
28930 6c 6c 46 69 6e 61 6c 69 7a 65 28 0a 20 20 69 6e  llFinalize(.  in
28940 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74  t *pRc, .  sqlit
28950 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29  e3_stmt *pStmt.)
28960 7b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  {.  if( pStmt ){
28970 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
28980 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61   = sqlite3_db_ha
28990 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  ndle(pStmt);.   
289a0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
289b0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
289c0 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 52 63 3d  );.    if( *pRc=
289d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
289e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
289f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28a00 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
28a10 72 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a 20  rr, "SQL error: 
28a20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
28a30 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
28a40 20 20 7d 0a 20 20 20 20 20 20 2a 70 52 63 20 3d    }.      *pRc =
28a50 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   rc;.    }.  }.}
28a60 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  ..static void sh
28a70 65 6c 6c 52 65 73 65 74 28 0a 20 20 69 6e 74 20  ellReset(.  int 
28a80 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33  *pRc, .  sqlite3
28a90 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a  _stmt *pStmt.){.
28aa0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
28ab0 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
28ac0 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
28ad0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
28ae0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28af0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
28b00 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64   *db = sqlite3_d
28b10 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b  b_handle(pStmt);
28b20 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
28b30 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 20 65  f(stderr, "SQL e
28b40 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
28b50 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
28b60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 63  ;.    }.    *pRc
28b70 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 2f 2a 0a   = rc;.  }.}./*.
28b80 2a 2a 20 53 74 72 75 63 74 75 72 65 20 72 65 70  ** Structure rep
28b90 72 65 73 65 6e 74 69 6e 67 20 61 20 73 69 6e 67  resenting a sing
28ba0 6c 65 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64  le ".ar" command
28bb0 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
28bc0 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20 41 72  uct ArCommand Ar
28bd0 43 6f 6d 6d 61 6e 64 3b 0a 73 74 72 75 63 74 20  Command;.struct 
28be0 41 72 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20 75 38  ArCommand {.  u8
28bf0 20 65 43 6d 64 3b 20 20 20 20 20 20 20 20 20 20   eCmd;          
28c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28c10 20 41 6e 20 41 52 5f 43 4d 44 5f 2a 20 76 61 6c   An AR_CMD_* val
28c20 75 65 20 2a 2f 0a 20 20 75 38 20 62 56 65 72 62  ue */.  u8 bVerb
28c30 6f 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ose;            
28c40 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
28c50 69 66 20 2d 2d 76 65 72 62 6f 73 65 20 2a 2f 0a  if --verbose */.
28c60 20 20 75 38 20 62 5a 69 70 3b 20 20 20 20 20 20    u8 bZip;      
28c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c80 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
28c90 20 61 72 63 68 69 76 65 20 69 73 20 61 20 5a 49   archive is a ZI
28ca0 50 20 2a 2f 0a 20 20 75 38 20 62 44 72 79 52 75  P */.  u8 bDryRu
28cb0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
28cc0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
28cd0 66 20 2d 2d 64 72 79 2d 72 75 6e 20 2a 2f 0a 20  f --dry-run */. 
28ce0 20 75 38 20 62 41 70 70 65 6e 64 3b 20 20 20 20   u8 bAppend;    
28cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d00 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 61 70   /* True if --ap
28d10 70 65 6e 64 20 2a 2f 0a 20 20 75 38 20 66 72 6f  pend */.  u8 fro
28d20 6d 43 6d 64 4c 69 6e 65 3b 20 20 20 20 20 20 20  mCmdLine;       
28d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
28d40 20 66 72 6f 6d 20 2d 41 20 69 6e 73 74 65 61 64   from -A instead
28d50 20 6f 66 20 2e 61 72 63 68 69 76 65 20 2a 2f 0a   of .archive */.
28d60 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20    int nArg;     
28d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
28d90 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
28da0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 72 63   */.  char *zSrc
28db0 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
28dc0 20 20 20 20 20 20 2f 2a 20 22 73 71 6c 61 72 22        /* "sqlar"
28dd0 2c 20 22 7a 69 70 66 69 6c 65 28 24 66 69 6c 65  , "zipfile($file
28de0 29 22 20 6f 72 20 22 7a 69 70 22 20 2a 2f 0a 20  )" or "zip" */. 
28df0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
28e00 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
28e10 20 2f 2a 20 2d 2d 66 69 6c 65 20 61 72 67 75 6d   /* --file argum
28e20 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ent, or NULL */.
28e30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
28e40 69 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ir;             
28e50 20 20 2f 2a 20 2d 2d 64 69 72 65 63 74 6f 72 79    /* --directory
28e60 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55   argument, or NU
28e70 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  LL */.  char **a
28e80 7a 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  zArg;           
28e90 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
28ea0 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75   of command argu
28eb0 6d 65 6e 74 73 20 2a 2f 0a 20 20 53 68 65 6c 6c  ments */.  Shell
28ec0 53 74 61 74 65 20 2a 70 3b 20 20 20 20 20 20 20  State *p;       
28ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
28ee0 65 6c 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 73  ell state */.  s
28ef0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
28f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28f10 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 74 61  * Database conta
28f20 69 6e 69 6e 67 20 74 68 65 20 61 72 63 68 69 76  ining the archiv
28f30 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50  e */.};../*.** P
28f40 72 69 6e 74 20 61 20 75 73 61 67 65 20 6d 65 73  rint a usage mes
28f50 73 61 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72  sage for the .ar
28f60 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65   command to stde
28f70 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  rr and return SQ
28f80 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73  LITE_ERROR..*/.s
28f90 74 61 74 69 63 20 69 6e 74 20 61 72 55 73 61 67  tatic int arUsag
28fa0 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 73 68  e(FILE *f){.  sh
28fb0 6f 77 48 65 6c 70 28 66 2c 22 61 72 63 68 69 76  owHelp(f,"archiv
28fc0 65 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  e");.  return SQ
28fd0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f  LITE_ERROR;.}../
28fe0 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72  *.** Print an er
28ff0 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20  ror message for 
29000 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20  the .ar command 
29010 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65  to stderr and re
29020 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
29030 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63  ERROR..*/.static
29040 20 69 6e 74 20 61 72 45 72 72 6f 72 4d 73 67 28   int arErrorMsg(
29050 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20  ArCommand *pAr, 
29060 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
29070 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
29080 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  t ap;.  char *z;
29090 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
290a0 7a 46 6d 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c  zFmt);.  z = sql
290b0 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
290c0 6d 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  mt, ap);.  va_en
290d0 64 28 61 70 29 3b 0a 20 20 75 74 66 38 5f 70 72  d(ap);.  utf8_pr
290e0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
290f0 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  ror: %s\n", z);.
29100 20 20 69 66 28 20 70 41 72 2d 3e 66 72 6f 6d 43    if( pAr->fromC
29110 6d 64 4c 69 6e 65 20 29 7b 0a 20 20 20 20 75 74  mdLine ){.    ut
29120 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
29130 2c 20 22 55 73 65 20 5c 22 2d 41 5c 22 20 66 6f  , "Use \"-A\" fo
29140 72 20 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 29 3b  r more help\n");
29150 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 74  .  }else{.    ut
29160 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
29170 2c 20 22 55 73 65 20 5c 22 2e 61 72 63 68 69 76  , "Use \".archiv
29180 65 20 2d 2d 68 65 6c 70 5c 22 20 66 6f 72 20 6d  e --help\" for m
29190 6f 72 65 20 68 65 6c 70 5c 6e 22 29 3b 0a 20 20  ore help\n");.  
291a0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
291b0 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (z);.  return SQ
291c0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f  LITE_ERROR;.}../
291d0 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f 72 20  *.** Values for 
291e0 41 72 43 6f 6d 6d 61 6e 64 2e 65 43 6d 64 2e 0a  ArCommand.eCmd..
291f0 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d  */.#define AR_CM
29200 44 5f 43 52 45 41 54 45 20 20 20 20 20 20 20 31  D_CREATE       1
29210 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f  .#define AR_CMD_
29220 55 50 44 41 54 45 20 20 20 20 20 20 20 32 0a 23  UPDATE       2.#
29230 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 49 4e  define AR_CMD_IN
29240 53 45 52 54 20 20 20 20 20 20 20 33 0a 23 64 65  SERT       3.#de
29250 66 69 6e 65 20 41 52 5f 43 4d 44 5f 45 58 54 52  fine AR_CMD_EXTR
29260 41 43 54 20 20 20 20 20 20 34 0a 23 64 65 66 69  ACT      4.#defi
29270 6e 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 20 20  ne AR_CMD_LIST  
29280 20 20 20 20 20 20 20 35 0a 23 64 65 66 69 6e 65         5.#define
29290 20 41 52 5f 43 4d 44 5f 48 45 4c 50 20 20 20 20   AR_CMD_HELP    
292a0 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 4f 74       6../*.** Ot
292b0 68 65 72 20 28 6e 6f 6e 2d 63 6f 6d 6d 61 6e 64  her (non-command
292c0 29 20 73 77 69 74 63 68 65 73 2e 0a 2a 2f 0a 23  ) switches..*/.#
292d0 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48  define AR_SWITCH
292e0 5f 56 45 52 42 4f 53 45 20 20 20 20 20 37 0a 23  _VERBOSE     7.#
292f0 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48  define AR_SWITCH
29300 5f 46 49 4c 45 20 20 20 20 20 20 20 20 38 0a 23  _FILE        8.#
29310 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48  define AR_SWITCH
29320 5f 44 49 52 45 43 54 4f 52 59 20 20 20 39 0a 23  _DIRECTORY   9.#
29330 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48  define AR_SWITCH
29340 5f 41 50 50 45 4e 44 20 20 20 20 20 31 30 0a 23  _APPEND     10.#
29350 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48  define AR_SWITCH
29360 5f 44 52 59 52 55 4e 20 20 20 20 20 31 31 0a 0a  _DRYRUN     11..
29370 73 74 61 74 69 63 20 69 6e 74 20 61 72 50 72 6f  static int arPro
29380 63 65 73 73 53 77 69 74 63 68 28 41 72 43 6f 6d  cessSwitch(ArCom
29390 6d 61 6e 64 20 2a 70 41 72 2c 20 69 6e 74 20 65  mand *pAr, int e
293a0 53 77 69 74 63 68 2c 20 63 6f 6e 73 74 20 63 68  Switch, const ch
293b0 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73 77 69  ar *zArg){.  swi
293c0 74 63 68 28 20 65 53 77 69 74 63 68 20 29 7b 0a  tch( eSwitch ){.
293d0 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
293e0 43 52 45 41 54 45 3a 0a 20 20 20 20 63 61 73 65  CREATE:.    case
293f0 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a   AR_CMD_EXTRACT:
29400 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44  .    case AR_CMD
29410 5f 4c 49 53 54 3a 0a 20 20 20 20 63 61 73 65 20  _LIST:.    case 
29420 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 3a 0a 20  AR_CMD_UPDATE:. 
29430 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 49     case AR_CMD_I
29440 4e 53 45 52 54 3a 0a 20 20 20 20 63 61 73 65 20  NSERT:.    case 
29450 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20 20  AR_CMD_HELP:.   
29460 20 20 20 69 66 28 20 70 41 72 2d 3e 65 43 6d 64     if( pAr->eCmd
29470 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
29480 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41  rn arErrorMsg(pA
29490 72 2c 20 22 6d 75 6c 74 69 70 6c 65 20 63 6f 6d  r, "multiple com
294a0 6d 61 6e 64 20 6f 70 74 69 6f 6e 73 22 29 3b 0a  mand options");.
294b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
294c0 72 2d 3e 65 43 6d 64 20 3d 20 65 53 77 69 74 63  r->eCmd = eSwitc
294d0 68 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  h;.      break;.
294e0 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49  .    case AR_SWI
294f0 54 43 48 5f 44 52 59 52 55 4e 3a 0a 20 20 20 20  TCH_DRYRUN:.    
29500 20 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 3d    pAr->bDryRun =
29510 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
29520 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49  .    case AR_SWI
29530 54 43 48 5f 56 45 52 42 4f 53 45 3a 0a 20 20 20  TCH_VERBOSE:.   
29540 20 20 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65     pAr->bVerbose
29550 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
29560 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53  k;.    case AR_S
29570 57 49 54 43 48 5f 41 50 50 45 4e 44 3a 0a 20 20  WITCH_APPEND:.  
29580 20 20 20 20 70 41 72 2d 3e 62 41 70 70 65 6e 64      pAr->bAppend
29590 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46   = 1;.      /* F
295a0 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 2d 2d  all thru into --
295b0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65  file */.    case
295c0 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 3a   AR_SWITCH_FILE:
295d0 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a 46 69 6c  .      pAr->zFil
295e0 65 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20  e = zArg;.      
295f0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
29600 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54  AR_SWITCH_DIRECT
29610 4f 52 59 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e  ORY:.      pAr->
29620 7a 44 69 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20  zDir = zArg;.   
29630 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
29640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29650 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73  K;.}../*.** Pars
29660 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  e the command li
29670 6e 65 20 66 6f 72 20 61 6e 20 22 2e 61 72 22 20  ne for an ".ar" 
29680 63 6f 6d 6d 61 6e 64 2e 20 54 68 65 20 72 65 73  command. The res
29690 75 6c 74 73 20 61 72 65 20 77 72 69 74 74 65 6e  ults are written
296a0 20 69 6e 74 6f 0a 2a 2a 20 73 74 72 75 63 74 75   into.** structu
296b0 72 65 20 28 2a 70 41 72 29 2e 20 53 51 4c 49 54  re (*pAr). SQLIT
296c0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
296d0 20 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   if the command 
296e0 6c 69 6e 65 20 69 73 20 70 61 72 73 65 64 0a 2a  line is parsed.*
296f0 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  * successfully, 
29700 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
29710 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72  or message is wr
29720 69 74 74 65 6e 20 74 6f 20 73 74 64 65 72 72 20  itten to stderr 
29730 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  and .** SQLITE_E
29740 52 52 4f 52 20 72 65 74 75 72 6e 65 64 2e 0a 2a  RROR returned..*
29750 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 50  /.static int arP
29760 61 72 73 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 63  arseCommand(.  c
29770 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
29780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29790 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
297a0 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
297b0 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
297c0 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
297d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
297f0 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
29800 2a 2f 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a  */.  ArCommand *
29810 70 41 72 20 20 20 20 20 20 20 20 20 20 20 20 20  pAr             
29820 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65       /* Populate
29830 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
29840 29 7b 0a 20 20 73 74 72 75 63 74 20 41 72 53 77  ){.  struct ArSw
29850 69 74 63 68 20 7b 0a 20 20 20 20 63 6f 6e 73 74  itch {.    const
29860 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 3b 0a 20 20   char *zLong;.  
29870 20 20 63 68 61 72 20 63 53 68 6f 72 74 3b 0a 20    char cShort;. 
29880 20 20 20 75 38 20 65 53 77 69 74 63 68 3b 0a 20     u8 eSwitch;. 
29890 20 20 20 75 38 20 62 41 72 67 3b 0a 20 20 7d 20     u8 bArg;.  } 
298a0 61 53 77 69 74 63 68 5b 5d 20 3d 20 7b 0a 20 20  aSwitch[] = {.  
298b0 20 20 7b 20 22 63 72 65 61 74 65 22 2c 20 20 20    { "create",   
298c0 20 27 63 27 2c 20 41 52 5f 43 4d 44 5f 43 52 45   'c', AR_CMD_CRE
298d0 41 54 45 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ATE,       0 },.
298e0 20 20 20 20 7b 20 22 65 78 74 72 61 63 74 22 2c      { "extract",
298f0 20 20 20 27 78 27 2c 20 41 52 5f 43 4d 44 5f 45     'x', AR_CMD_E
29900 58 54 52 41 43 54 2c 20 20 20 20 20 20 30 20 7d  XTRACT,      0 }
29910 2c 0a 20 20 20 20 7b 20 22 69 6e 73 65 72 74 22  ,.    { "insert"
29920 2c 20 20 20 20 27 69 27 2c 20 41 52 5f 43 4d 44  ,    'i', AR_CMD
29930 5f 49 4e 53 45 52 54 2c 20 20 20 20 20 20 20 30  _INSERT,       0
29940 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 69 73 74 22   },.    { "list"
29950 2c 20 20 20 20 20 20 27 74 27 2c 20 41 52 5f 43  ,      't', AR_C
29960 4d 44 5f 4c 49 53 54 2c 20 20 20 20 20 20 20 20  MD_LIST,        
29970 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 75 70 64   0 },.    { "upd
29980 61 74 65 22 2c 20 20 20 20 27 75 27 2c 20 41 52  ate",    'u', AR
29990 5f 43 4d 44 5f 55 50 44 41 54 45 2c 20 20 20 20  _CMD_UPDATE,    
299a0 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 68     0 },.    { "h
299b0 65 6c 70 22 2c 20 20 20 20 20 20 27 68 27 2c 20  elp",      'h', 
299c0 41 52 5f 43 4d 44 5f 48 45 4c 50 2c 20 20 20 20  AR_CMD_HELP,    
299d0 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20       0 },.    { 
299e0 22 76 65 72 62 6f 73 65 22 2c 20 20 20 27 76 27  "verbose",   'v'
299f0 2c 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42  , AR_SWITCH_VERB
29a00 4f 53 45 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20  OSE,   0 },.    
29a10 7b 20 22 66 69 6c 65 22 2c 20 20 20 20 20 20 27  { "file",      '
29a20 66 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 46 49  f', AR_SWITCH_FI
29a30 4c 45 2c 20 20 20 20 20 20 31 20 7d 2c 0a 20 20  LE,      1 },.  
29a40 20 20 7b 20 22 61 70 70 65 6e 64 22 2c 20 20 20    { "append",   
29a50 20 27 61 27 2c 20 41 52 5f 53 57 49 54 43 48 5f   'a', AR_SWITCH_
29a60 41 50 50 45 4e 44 2c 20 20 20 20 31 20 7d 2c 0a  APPEND,    1 },.
29a70 20 20 20 20 7b 20 22 64 69 72 65 63 74 6f 72 79      { "directory
29a80 22 2c 20 27 43 27 2c 20 41 52 5f 53 57 49 54 43  ", 'C', AR_SWITC
29a90 48 5f 44 49 52 45 43 54 4f 52 59 2c 20 31 20 7d  H_DIRECTORY, 1 }
29aa0 2c 0a 20 20 20 20 7b 20 22 64 72 79 72 75 6e 22  ,.    { "dryrun"
29ab0 2c 20 20 20 20 27 6e 27 2c 20 41 52 5f 53 57 49  ,    'n', AR_SWI
29ac0 54 43 48 5f 44 52 59 52 55 4e 2c 20 20 20 20 30  TCH_DRYRUN,    0
29ad0 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 6e   },.  };.  int n
29ae0 53 77 69 74 63 68 20 3d 20 73 69 7a 65 6f 66 28  Switch = sizeof(
29af0 61 53 77 69 74 63 68 29 20 2f 20 73 69 7a 65 6f  aSwitch) / sizeo
29b00 66 28 73 74 72 75 63 74 20 41 72 53 77 69 74 63  f(struct ArSwitc
29b10 68 29 3b 0a 20 20 73 74 72 75 63 74 20 41 72 53  h);.  struct ArS
29b20 77 69 74 63 68 20 2a 70 45 6e 64 20 3d 20 26 61  witch *pEnd = &a
29b30 53 77 69 74 63 68 5b 6e 53 77 69 74 63 68 5d 3b  Switch[nSwitch];
29b40 0a 0a 20 20 69 66 28 20 6e 41 72 67 3c 3d 31 20  ..  if( nArg<=1 
29b50 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
29b60 74 66 28 73 74 64 65 72 72 2c 20 22 57 72 6f 6e  tf(stderr, "Wron
29b70 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
29b80 6d 65 6e 74 73 2e 20 20 55 73 61 67 65 3a 5c 6e  ments.  Usage:\n
29b90 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61  ");.    return a
29ba0 72 55 73 61 67 65 28 73 74 64 65 72 72 29 3b 0a  rUsage(stderr);.
29bb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
29bc0 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 31 5d 3b  r *z = azArg[1];
29bd0 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27  .    if( z[0]!='
29be0 2d 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  -' ){.      /* T
29bf0 72 61 64 69 74 69 6f 6e 61 6c 20 73 74 79 6c 65  raditional style
29c00 20 5b 74 61 72 5d 20 69 6e 76 6f 63 61 74 69 6f   [tar] invocatio
29c10 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  n */.      int i
29c20 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 72 67  ;.      int iArg
29c30 20 3d 20 32 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 2;.      for(
29c40 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  i=0; z[i]; i++){
29c50 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
29c60 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20  har *zArg = 0;. 
29c70 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72         struct Ar
29c80 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20  Switch *pOpt;.  
29c90 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26        for(pOpt=&
29ca0 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74  aSwitch[0]; pOpt
29cb0 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a  <pEnd; pOpt++){.
29cc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b            if( z[
29cd0 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74  i]==pOpt->cShort
29ce0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
29cf0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
29d00 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20  pOpt==pEnd ){.  
29d10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
29d20 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22  rErrorMsg(pAr, "
29d30 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74  unrecognized opt
29d40 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b  ion: %c", z[i]);
29d50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29d60 20 20 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72     if( pOpt->bAr
29d70 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  g ){.          i
29d80 66 28 20 69 41 72 67 3e 3d 6e 41 72 67 20 29 7b  f( iArg>=nArg ){
29d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
29da0 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70  urn arErrorMsg(p
29db0 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75  Ar, "option requ
29dc0 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
29dd0 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20  : %c",z[i]);.   
29de0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29df0 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b     zArg = azArg[
29e00 69 41 72 67 2b 2b 5d 3b 0a 20 20 20 20 20 20 20  iArg++];.       
29e10 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 61   }.        if( a
29e20 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70  rProcessSwitch(p
29e30 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63  Ar, pOpt->eSwitc
29e40 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75 72  h, zArg) ) retur
29e50 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
29e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
29e70 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69  r->nArg = nArg-i
29e80 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Arg;.      if( p
29e90 41 72 2d 3e 6e 41 72 67 3e 30 20 29 7b 0a 20 20  Ar->nArg>0 ){.  
29ea0 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67        pAr->azArg
29eb0 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b   = &azArg[iArg];
29ec0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
29ed0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 6e  se{.      /* Non
29ee0 2d 74 72 61 64 69 74 69 6f 6e 61 6c 20 69 6e 76  -traditional inv
29ef0 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ocation */.     
29f00 20 69 6e 74 20 69 41 72 67 3b 0a 20 20 20 20 20   int iArg;.     
29f10 20 66 6f 72 28 69 41 72 67 3d 31 3b 20 69 41 72   for(iArg=1; iAr
29f20 67 3c 6e 41 72 67 3b 20 69 41 72 67 2b 2b 29 7b  g<nArg; iArg++){
29f30 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  .        int n;.
29f40 20 20 20 20 20 20 20 20 7a 20 3d 20 61 7a 41 72          z = azAr
29f50 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20  g[iArg];.       
29f60 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29   if( z[0]!='-' )
29f70 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
29f80 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d  ll remaining com
29f90 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 20  mand line words 
29fa0 61 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75  are command argu
29fb0 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20  ments. */.      
29fc0 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d      pAr->azArg =
29fd0 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20   &azArg[iArg];. 
29fe0 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41           pAr->nA
29ff0 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a  rg = nArg-iArg;.
2a000 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2a010 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a020 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28     n = strlen30(
2a030 7a 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  z);..        if(
2a040 20 7a 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20 20   z[1]!='-' ){.  
2a050 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
2a060 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2a070 6f 72 20 6d 6f 72 65 20 73 68 6f 72 74 20 6f 70  or more short op
2a080 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20  tions */.       
2a090 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b     for(i=1; i<n;
2a0a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2a0b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2a0c0 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Arg = 0;.       
2a0d0 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77       struct ArSw
2a0e0 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20  itch *pOpt;.    
2a0f0 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74          for(pOpt
2a100 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f  =&aSwitch[0]; pO
2a110 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29  pt<pEnd; pOpt++)
2a120 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2a130 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e  if( z[i]==pOpt->
2a140 63 53 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a  cShort ) break;.
2a150 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2a160 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
2a170 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  pt==pEnd ){.    
2a180 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2a190 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c   arErrorMsg(pAr,
2a1a0 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f   "unrecognized o
2a1b0 70 74 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d  ption: %c", z[i]
2a1c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
2a1d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2a1e0 20 70 4f 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20   pOpt->bArg ){. 
2a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2a200 20 69 3c 28 6e 2d 31 29 20 29 7b 0a 20 20 20 20   i<(n-1) ){.    
2a210 20 20 20 20 20 20 20 20 20 20 20 20 7a 41 72 67              zArg
2a220 20 3d 20 26 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20   = &z[i+1];.    
2a230 20 20 20 20 20 20 20 20 20 20 20 20 69 20 3d 20              i = 
2a240 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
2a250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a260 20 20 20 20 20 20 20 20 69 66 28 20 69 41 72 67          if( iArg
2a270 3e 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20  >=(nArg-1) ){.  
2a280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a290 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73  return arErrorMs
2a2a0 67 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72  g(pAr, "option r
2a2b0 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d  equires an argum
2a2c0 65 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a  ent: %c",z[i]);.
2a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2e0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2a2f0 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 2b    zArg = azArg[+
2a300 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20  +iArg];.        
2a310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a320 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a330 20 20 69 66 28 20 61 72 50 72 6f 63 65 73 73 53    if( arProcessS
2a340 77 69 74 63 68 28 70 41 72 2c 20 70 4f 70 74 2d  witch(pAr, pOpt-
2a350 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20  >eSwitch, zArg) 
2a360 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2a370 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
2a380 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2a390 20 69 66 28 20 7a 5b 32 5d 3d 3d 27 5c 30 27 20   if( z[2]=='\0' 
2a3a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2a3b0 41 20 2d 2d 20 6f 70 74 69 6f 6e 2c 20 69 6e 64  A -- option, ind
2a3c0 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 6c 6c  icating that all
2a3d0 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d 61   remaining comma
2a3e0 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 0a 20 20  nd line words.  
2a3f0 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 63          ** are c
2a400 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
2a410 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2a420 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a  pAr->azArg = &az
2a430 41 72 67 5b 69 41 72 67 2b 31 5d 3b 0a 20 20 20  Arg[iArg+1];.   
2a440 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67         pAr->nArg
2a450 20 3d 20 6e 41 72 67 2d 69 41 72 67 2d 31 3b 0a   = nArg-iArg-1;.
2a460 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2a470 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2a480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c            /* A l
2a490 6f 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20  ong option */.  
2a4a0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2a4b0 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 20 20 20  ar *zArg = 0;   
2a4c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
2a4d0 75 6d 65 6e 74 20 66 6f 72 20 6f 70 74 69 6f 6e  ument for option
2a4e0 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20 20  , if any */.    
2a4f0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53        struct ArS
2a500 77 69 74 63 68 20 2a 70 4d 61 74 63 68 20 3d 20  witch *pMatch = 
2a510 30 3b 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68  0;      /* Match
2a520 69 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20  ing option */.  
2a530 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2a540 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 20 20  rSwitch *pOpt;  
2a550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
2a560 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  rator */.       
2a570 20 20 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77     for(pOpt=&aSw
2a580 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45  itch[0]; pOpt<pE
2a590 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20  nd; pOpt++){.   
2a5a0 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
2a5b0 68 61 72 20 2a 7a 4c 6f 6e 67 20 3d 20 70 4f 70  har *zLong = pOp
2a5c0 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20 20 20 20 20  t->zLong;.      
2a5d0 20 20 20 20 20 20 69 66 28 20 28 6e 2d 32 29 3c        if( (n-2)<
2a5e0 3d 73 74 72 6c 65 6e 33 30 28 7a 4c 6f 6e 67 29  =strlen30(zLong)
2a5f0 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 26 7a   && 0==memcmp(&z
2a600 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c 20 6e 2d 32 29  [2], zLong, n-2)
2a610 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a620 20 20 69 66 28 20 70 4d 61 74 63 68 20 29 7b 0a    if( pMatch ){.
2a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a640 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73  return arErrorMs
2a650 67 28 70 41 72 2c 20 22 61 6d 62 69 67 75 6f 75  g(pAr, "ambiguou
2a660 73 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 7a 29  s option: %s",z)
2a670 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a680 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2a690 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20         pMatch = 
2a6a0 70 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20  pOpt;.          
2a6b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a6c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2a6d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2a6e0 4d 61 74 63 68 3d 3d 30 20 29 7b 0a 20 20 20 20  Match==0 ){.    
2a6f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
2a700 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22  rErrorMsg(pAr, "
2a710 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74  unrecognized opt
2a720 69 6f 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ion: %s", z);.  
2a730 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a740 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 2d 3e      if( pMatch->
2a750 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  bArg ){.        
2a760 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d 28 6e      if( iArg>=(n
2a770 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  Arg-1) ){.      
2a780 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
2a790 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22  rErrorMsg(pAr, "
2a7a0 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
2a7b0 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 22  an argument: %s"
2a7c0 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , z);.          
2a7d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2a7e0 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 2b 2b 69  zArg = azArg[++i
2a7f0 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Arg];.          
2a800 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2a810 61 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28  arProcessSwitch(
2a820 70 41 72 2c 20 70 4d 61 74 63 68 2d 3e 65 53 77  pAr, pMatch->eSw
2a830 69 74 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65  itch, zArg) ) re
2a840 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2a850 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
2a860 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2a870 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a880 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
2a890 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2a8a0 65 73 20 74 68 61 74 20 61 6c 6c 20 61 72 67 75  es that all argu
2a8b0 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 68 65  ments within the
2a8c0 20 41 72 43 6f 6d 6d 61 6e 64 2e 61 7a 41 72 67   ArCommand.azArg
2a8d0 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 72 65 66 65  [].** array refe
2a8e0 72 20 74 6f 20 61 72 63 68 69 76 65 20 6d 65 6d  r to archive mem
2a8f0 62 65 72 73 2c 20 61 73 20 66 6f 72 20 74 68 65  bers, as for the
2a900 20 2d 2d 65 78 74 72 61 63 74 20 6f 72 20 2d 2d   --extract or --
2a910 6c 69 73 74 20 63 6f 6d 6d 61 6e 64 73 2e 20 0a  list commands. .
2a920 2a 2a 20 49 74 20 63 68 65 63 6b 73 20 74 68 61  ** It checks tha
2a930 74 20 65 61 63 68 20 6f 66 20 74 68 65 6d 20 61  t each of them a
2a940 72 65 20 70 72 65 73 65 6e 74 2e 20 49 66 20 61  re present. If a
2a950 6e 79 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  ny specified fil
2a960 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 70 72 65 73  e is not.** pres
2a970 65 6e 74 20 69 6e 20 74 68 65 20 61 72 63 68 69  ent in the archi
2a980 76 65 2c 20 61 6e 20 65 72 72 6f 72 20 69 73 20  ve, an error is 
2a990 70 72 69 6e 74 65 64 20 74 6f 20 73 74 64 65 72  printed to stder
2a9a0 72 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 0a 2a  r and an error.*
2a9b0 2a 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e  * code returned.
2a9c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
2a9d0 6c 6c 20 73 70 65 63 69 66 69 65 64 20 61 72 67  ll specified arg
2a9e0 75 6d 65 6e 74 73 20 61 72 65 20 70 72 65 73 65  uments are prese
2a9f0 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72 63  nt in.** the arc
2aa00 68 69 76 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  hive, SQLITE_OK 
2aa10 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
2aa20 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2aa30 20 73 74 72 69 70 73 20 61 6e 79 20 74 72 61 69   strips any trai
2aa40 6c 69 6e 67 20 27 2f 27 20 63 68 61 72 61 63 74  ling '/' charact
2aa50 65 72 73 20 66 72 6f 6d 20 65 61 63 68 20 61 72  ers from each ar
2aa60 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20  gument..** This 
2aa70 69 73 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69  is consistent wi
2aa80 74 68 20 74 68 65 20 77 61 79 20 74 68 65 20 5b  th the way the [
2aa90 74 61 72 5d 20 63 6f 6d 6d 61 6e 64 20 73 65 65  tar] command see
2aaa0 6d 73 20 74 6f 20 77 6f 72 6b 20 6f 6e 0a 2a 2a  ms to work on.**
2aab0 20 4c 69 6e 75 78 2e 0a 2a 2f 0a 73 74 61 74 69   Linux..*/.stati
2aac0 63 20 69 6e 74 20 61 72 43 68 65 63 6b 45 6e 74  c int arCheckEnt
2aad0 72 69 65 73 28 41 72 43 6f 6d 6d 61 6e 64 20 2a  ries(ArCommand *
2aae0 70 41 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pAr){.  int rc =
2aaf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
2ab00 28 20 70 41 72 2d 3e 6e 41 72 67 20 29 7b 0a 20  ( pAr->nArg ){. 
2ab10 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
2ab20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2ab30 54 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 73  Test = 0;..    s
2ab40 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74  hellPreparePrint
2ab50 66 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20  f(pAr->db, &rc, 
2ab60 26 70 54 65 73 74 2c 0a 20 20 20 20 20 20 20 20  &pTest,.        
2ab70 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f  "SELECT name FRO
2ab80 4d 20 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d  M %s WHERE name=
2ab90 24 6e 61 6d 65 22 2c 20 0a 20 20 20 20 20 20 20  $name", .       
2aba0 20 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 0a   pAr->zSrcTable.
2abb0 20 20 20 20 29 3b 0a 20 20 20 20 6a 20 3d 20 73      );.    j = s
2abc0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
2abd0 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 54 65 73  meter_index(pTes
2abe0 74 2c 20 22 24 6e 61 6d 65 22 29 3b 0a 20 20 20  t, "$name");.   
2abf0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d   for(i=0; i<pAr-
2ac00 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c  >nArg && rc==SQL
2ac10 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
2ac20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 70 41      char *z = pA
2ac30 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20  r->azArg[i];.   
2ac40 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65     int n = strle
2ac50 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 69 6e  n30(z);.      in
2ac60 74 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 20  t bOk = 0;.     
2ac70 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a   while( n>0 && z
2ac80 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 20 6e 2d 2d  [n-1]=='/' ) n--
2ac90 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 27  ;.      z[n] = '
2aca0 5c 30 27 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  \0';.      sqlit
2acb0 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 54 65  e3_bind_text(pTe
2acc0 73 74 2c 20 6a 2c 20 7a 2c 20 2d 31 2c 20 53 51  st, j, z, -1, SQ
2acd0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
2ace0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
2acf0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2ad00 28 70 54 65 73 74 29 20 29 7b 0a 20 20 20 20 20  (pTest) ){.     
2ad10 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20     bOk = 1;.    
2ad20 20 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 52    }.      shellR
2ad30 65 73 65 74 28 26 72 63 2c 20 70 54 65 73 74 29  eset(&rc, pTest)
2ad40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2ad50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b  SQLITE_OK && bOk
2ad60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==0 ){.        u
2ad70 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2ad80 72 2c 20 22 6e 6f 74 20 66 6f 75 6e 64 20 69 6e  r, "not found in
2ad90 20 61 72 63 68 69 76 65 3a 20 25 73 5c 6e 22 2c   archive: %s\n",
2ada0 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20   z);.        rc 
2adb0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2adc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2add0 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28    shellFinalize(
2ade0 26 72 63 2c 20 70 54 65 73 74 29 3b 0a 20 20 7d  &rc, pTest);.  }
2adf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ae00 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 61 20  ./*.** Format a 
2ae10 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
2ae20 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 67  t can be used ag
2ae30 61 69 6e 73 74 20 74 68 65 20 22 73 71 6c 61 72  ainst the "sqlar
2ae40 22 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 69 64  " table to.** id
2ae50 65 6e 74 69 66 79 20 61 6c 6c 20 61 72 63 68 69  entify all archi
2ae60 76 65 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20  ve members that 
2ae70 6d 61 74 63 68 20 74 68 65 20 63 6f 6d 6d 61 6e  match the comman
2ae80 64 20 61 72 67 75 6d 65 6e 74 73 20 68 65 6c 64  d arguments held
2ae90 0a 2a 2a 20 69 6e 20 28 2a 70 41 72 29 2e 20 4c  .** in (*pAr). L
2aea0 65 61 76 65 20 74 68 69 73 20 57 48 45 52 45 20  eave this WHERE 
2aeb0 63 6c 61 75 73 65 20 69 6e 20 28 2a 70 7a 57 68  clause in (*pzWh
2aec0 65 72 65 29 20 62 65 66 6f 72 65 20 72 65 74 75  ere) before retu
2aed0 72 6e 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 61  rning..** The ca
2aee0 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
2aef0 62 6c 65 20 66 6f 72 20 65 76 65 6e 74 75 61 6c  ble for eventual
2af00 6c 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  ly calling sqlit
2af10 65 33 5f 66 72 65 65 28 29 20 6f 6e 0a 2a 2a 20  e3_free() on.** 
2af20 61 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c 20 28 2a 70  any non-NULL (*p
2af30 7a 57 68 65 72 65 29 20 76 61 6c 75 65 2e 0a 2a  zWhere) value..*
2af40 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 72  /.static void ar
2af50 57 68 65 72 65 43 6c 61 75 73 65 28 0a 20 20 69  WhereClause(.  i
2af60 6e 74 20 2a 70 52 63 2c 20 0a 20 20 41 72 43 6f  nt *pRc, .  ArCo
2af70 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 0a 20 20 63  mmand *pAr, .  c
2af80 68 61 72 20 2a 2a 70 7a 57 68 65 72 65 20 20 20  har **pzWhere   
2af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2afa0 2a 20 4f 55 54 3a 20 4e 65 77 20 57 48 45 52 45  * OUT: New WHERE
2afb0 20 63 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20   clause */.){.  
2afc0 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30  char *zWhere = 0
2afd0 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  ;.  if( *pRc==SQ
2afe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2aff0 66 28 20 70 41 72 2d 3e 6e 41 72 67 3d 3d 30 20  f( pAr->nArg==0 
2b000 29 7b 0a 20 20 20 20 20 20 7a 57 68 65 72 65 20  ){.      zWhere 
2b010 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2b020 66 28 22 31 22 29 3b 0a 20 20 20 20 7d 65 6c 73  f("1");.    }els
2b030 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
2b040 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2b050 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20   *zSep = "";.   
2b060 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
2b070 72 2d 3e 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20  r->nArg; i++){. 
2b080 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2b090 72 20 2a 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72  r *z = pAr->azAr
2b0a0 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7a 57  g[i];.        zW
2b0b0 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  here = sqlite3_m
2b0c0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
2b0d0 20 20 22 25 7a 25 73 20 6e 61 6d 65 20 3d 20 27    "%z%s name = '
2b0e0 25 71 27 20 4f 52 20 73 75 62 73 74 72 28 6e 61  %q' OR substr(na
2b0f0 6d 65 2c 31 2c 25 64 29 20 3d 20 27 25 71 2f 27  me,1,%d) = '%q/'
2b100 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 7a 57  ", .          zW
2b110 68 65 72 65 2c 20 7a 53 65 70 2c 20 7a 2c 20 73  here, zSep, z, s
2b120 74 72 6c 65 6e 33 30 28 7a 29 2b 31 2c 20 7a 0a  trlen30(z)+1, z.
2b130 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2b140 20 20 20 69 66 28 20 7a 57 68 65 72 65 3d 3d 30     if( zWhere==0
2b150 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
2b160 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
2b170 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  M;.          bre
2b180 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
2b190 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20 4f        zSep = " O
2b1a0 52 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  R ";.      }.   
2b1b0 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 57 68 65 72   }.  }.  *pzWher
2b1c0 65 20 3d 20 7a 57 68 65 72 65 3b 0a 7d 0a 0a 2f  e = zWhere;.}../
2b1d0 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
2b1e0 69 6f 6e 20 6f 66 20 2e 61 72 20 22 6c 69 73 54  ion of .ar "lisT
2b1f0 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73  " command. .*/.s
2b200 74 61 74 69 63 20 69 6e 74 20 61 72 4c 69 73 74  tatic int arList
2b210 43 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e  Command(ArComman
2b220 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74  d *pAr){.  const
2b230 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 22 53   char *zSql = "S
2b240 45 4c 45 43 54 20 25 73 20 46 52 4f 4d 20 25 73  ELECT %s FROM %s
2b250 20 57 48 45 52 45 20 25 73 22 3b 20 0a 20 20 63   WHERE %s"; .  c
2b260 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 43 6f 6c  onst char *azCol
2b270 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 6e 61 6d  s[] = {.    "nam
2b280 65 22 2c 0a 20 20 20 20 22 6c 73 6d 6f 64 65 28  e",.    "lsmode(
2b290 6d 6f 64 65 29 2c 20 73 7a 2c 20 64 61 74 65 74  mode), sz, datet
2b2a0 69 6d 65 28 6d 74 69 6d 65 2c 20 27 75 6e 69 78  ime(mtime, 'unix
2b2b0 65 70 6f 63 68 27 29 2c 20 6e 61 6d 65 22 0a 20  epoch'), name". 
2b2c0 20 7d 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 57 68   };..  char *zWh
2b2d0 65 72 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ere = 0;.  sqlit
2b2e0 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20  e3_stmt *pSql = 
2b2f0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  0;.  int rc;..  
2b300 72 63 20 3d 20 61 72 43 68 65 63 6b 45 6e 74 72  rc = arCheckEntr
2b310 69 65 73 28 70 41 72 29 3b 0a 20 20 61 72 57 68  ies(pAr);.  arWh
2b320 65 72 65 43 6c 61 75 73 65 28 26 72 63 2c 20 70  ereClause(&rc, p
2b330 41 72 2c 20 26 7a 57 68 65 72 65 29 3b 0a 0a 20  Ar, &zWhere);.. 
2b340 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69   shellPreparePri
2b350 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72 63  ntf(pAr->db, &rc
2b360 2c 20 26 70 53 71 6c 2c 20 7a 53 71 6c 2c 20 61  , &pSql, zSql, a
2b370 7a 43 6f 6c 73 5b 70 41 72 2d 3e 62 56 65 72 62  zCols[pAr->bVerb
2b380 6f 73 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  ose],.          
2b390 20 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e             pAr->
2b3a0 7a 53 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72  zSrcTable, zWher
2b3b0 65 29 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 62  e);.  if( pAr->b
2b3c0 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 75 74  DryRun ){.    ut
2b3d0 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70  f8_printf(pAr->p
2b3e0 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73  ->out, "%s\n", s
2b3f0 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c 29  qlite3_sql(pSql)
2b400 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2b410 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
2b420 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
2b430 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2b440 28 70 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20  (pSql) ){.      
2b450 69 66 28 20 70 41 72 2d 3e 62 56 65 72 62 6f 73  if( pAr->bVerbos
2b460 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  e ){.        utf
2b470 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d  8_printf(pAr->p-
2b480 3e 6f 75 74 2c 20 22 25 73 20 25 20 31 30 64 20  >out, "%s % 10d 
2b490 20 25 73 20 20 25 73 5c 6e 22 2c 0a 20 20 20 20   %s  %s\n",.    
2b4a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2b4b0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
2b4c0 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 0),.          
2b4d0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
2b4e0 5f 69 6e 74 28 70 53 71 6c 2c 20 31 29 2c 20 0a  _int(pSql, 1), .
2b4f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2b500 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
2b510 70 53 71 6c 2c 20 32 29 2c 0a 20 20 20 20 20 20  pSql, 2),.      
2b520 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
2b530 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
2b540 33 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  3).        );.  
2b550 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b560 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2b570 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c  Ar->p->out, "%s\
2b580 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n", sqlite3_colu
2b590 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29  mn_text(pSql, 0)
2b5a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2b5b0 0a 20 20 7d 0a 20 20 73 68 65 6c 6c 46 69 6e 61  .  }.  shellFina
2b5c0 6c 69 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b  lize(&rc, pSql);
2b5d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2b5e0 7a 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72  zWhere);.  retur
2b5f0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2b600 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
2b610 66 20 2e 61 72 20 22 65 58 74 72 61 63 74 22 20  f .ar "eXtract" 
2b620 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61  command. .*/.sta
2b630 74 69 63 20 69 6e 74 20 61 72 45 78 74 72 61 63  tic int arExtrac
2b640 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61  tCommand(ArComma
2b650 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73  nd *pAr){.  cons
2b660 74 20 63 68 61 72 20 2a 7a 53 71 6c 31 20 3d 20  t char *zSql1 = 
2b670 0a 20 20 20 20 22 53 45 4c 45 43 54 20 22 0a 20  .    "SELECT ". 
2b680 20 20 20 22 20 28 24 64 69 72 20 7c 7c 20 6e 61     " ($dir || na
2b690 6d 65 29 2c 22 0a 20 20 20 20 22 20 77 72 69 74  me),".    " writ
2b6a0 65 66 69 6c 65 28 28 24 64 69 72 20 7c 7c 20 6e  efile(($dir || n
2b6b0 61 6d 65 29 2c 20 25 73 2c 20 6d 6f 64 65 2c 20  ame), %s, mode, 
2b6c0 6d 74 69 6d 65 29 20 22 0a 20 20 20 20 22 46 52  mtime) ".    "FR
2b6d0 4f 4d 20 25 73 20 57 48 45 52 45 20 28 25 73 29  OM %s WHERE (%s)
2b6e0 20 41 4e 44 20 28 64 61 74 61 20 49 53 20 4e 55   AND (data IS NU
2b6f0 4c 4c 20 4f 52 20 24 64 69 72 4f 6e 6c 79 20 3d  LL OR $dirOnly =
2b700 20 30 29 22 0a 20 20 20 20 22 20 41 4e 44 20 6e   0)".    " AND n
2b710 61 6d 65 20 4e 4f 54 20 47 4c 4f 42 20 27 2a 2e  ame NOT GLOB '*.
2b720 2e 5b 2f 5c 5c 5d 2a 27 22 3b 0a 0a 20 20 63 6f  .[/\\]*'";..  co
2b730 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 78 74 72  nst char *azExtr
2b740 61 41 72 67 5b 5d 20 3d 20 7b 20 0a 20 20 20 20  aArg[] = { .    
2b750 22 73 71 6c 61 72 5f 75 6e 63 6f 6d 70 72 65 73  "sqlar_uncompres
2b760 73 28 64 61 74 61 2c 20 73 7a 29 22 2c 0a 20 20  s(data, sz)",.  
2b770 20 20 22 64 61 74 61 22 0a 20 20 7d 3b 0a 0a 20    "data".  };.. 
2b780 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2b790 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Sql = 0;.  int r
2b7a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2b7b0 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b   char *zDir = 0;
2b7c0 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20  .  char *zWhere 
2b7d0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  = 0;.  int i, j;
2b7e0 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65  ..  /* If argume
2b7f0 6e 74 73 20 61 72 65 20 73 70 65 63 69 66 69 65  nts are specifie
2b800 64 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  d, check that th
2b810 65 79 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73  ey actually exis
2b820 74 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68  t within.  ** th
2b830 65 20 61 72 63 68 69 76 65 20 62 65 66 6f 72 65  e archive before
2b840 20 70 72 6f 63 65 65 64 69 6e 67 2e 20 41 6e 64   proceeding. And
2b850 20 66 6f 72 6d 75 6c 61 74 65 20 61 20 57 48 45   formulate a WHE
2b860 52 45 20 63 6c 61 75 73 65 20 74 6f 0a 20 20 2a  RE clause to.  *
2b870 2a 20 6d 61 74 63 68 20 74 68 65 6d 2e 20 20 2a  * match them.  *
2b880 2f 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b  /.  rc = arCheck
2b890 45 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20  Entries(pAr);.  
2b8a0 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72  arWhereClause(&r
2b8b0 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29  c, pAr, &zWhere)
2b8c0 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
2b8d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
2b8e0 28 20 70 41 72 2d 3e 7a 44 69 72 20 29 7b 0a 20  ( pAr->zDir ){. 
2b8f0 20 20 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69       zDir = sqli
2b900 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f  te3_mprintf("%s/
2b910 22 2c 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20  ", pAr->zDir);. 
2b920 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b930 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zDir = sqlite3_m
2b940 70 72 69 6e 74 66 28 22 22 29 3b 0a 20 20 20 20  printf("");.    
2b950 7d 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d  }.    if( zDir==
2b960 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  0 ) rc = SQLITE_
2b970 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 73 68  NOMEM;.  }..  sh
2b980 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66  ellPreparePrintf
2b990 28 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26  (pAr->db, &rc, &
2b9a0 70 53 71 6c 2c 20 7a 53 71 6c 31 2c 20 0a 20 20  pSql, zSql1, .  
2b9b0 20 20 20 20 61 7a 45 78 74 72 61 41 72 67 5b 70      azExtraArg[p
2b9c0 41 72 2d 3e 62 5a 69 70 5d 2c 20 70 41 72 2d 3e  Ar->bZip], pAr->
2b9d0 7a 53 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72  zSrcTable, zWher
2b9e0 65 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  e.  );..  if( rc
2b9f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2ba00 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62     j = sqlite3_b
2ba10 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
2ba20 64 65 78 28 70 53 71 6c 2c 20 22 24 64 69 72 22  dex(pSql, "$dir"
2ba30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
2ba40 69 6e 64 5f 74 65 78 74 28 70 53 71 6c 2c 20 6a  ind_text(pSql, j
2ba50 2c 20 7a 44 69 72 2c 20 2d 31 2c 20 53 51 4c 49  , zDir, -1, SQLI
2ba60 54 45 5f 53 54 41 54 49 43 29 3b 0a 0a 20 20 20  TE_STATIC);..   
2ba70 20 2f 2a 20 52 75 6e 20 74 68 65 20 53 45 4c 45   /* Run the SELE
2ba80 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 77 69  CT statement twi
2ba90 63 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 69  ce. The first ti
2baa0 6d 65 2c 20 77 72 69 74 65 66 69 6c 65 28 29 20  me, writefile() 
2bab0 69 73 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a  is called.    **
2bac0 20 66 6f 72 20 61 6c 6c 20 61 72 63 68 69 76 65   for all archive
2bad0 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 73 68   members that sh
2bae0 6f 75 6c 64 20 62 65 20 65 78 74 72 61 63 74 65  ould be extracte
2baf0 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 74 69  d. The second ti
2bb00 6d 65 2c 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20  me,.    ** only 
2bb10 66 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72  for the director
2bb20 69 65 73 2e 20 54 68 69 73 20 69 73 20 62 65 63  ies. This is bec
2bb30 61 75 73 65 20 74 68 65 20 74 69 6d 65 73 74 61  ause the timesta
2bb40 6d 70 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65  mps for.    ** e
2bb50 78 74 72 61 63 74 65 64 20 64 69 72 65 63 74 6f  xtracted directo
2bb60 72 69 65 73 20 6d 75 73 74 20 62 65 20 72 65 73  ries must be res
2bb70 65 74 20 61 66 74 65 72 20 74 68 65 79 20 61 72  et after they ar
2bb80 65 20 70 6f 70 75 6c 61 74 65 64 20 28 61 73 0a  e populated (as.
2bb90 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 69 6e      ** populatin
2bba0 67 20 74 68 65 6d 20 63 68 61 6e 67 65 73 20 74  g them changes t
2bbb0 68 65 20 74 69 6d 65 73 74 61 6d 70 29 2e 20 20  he timestamp).  
2bbc0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
2bbd0 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
2bbe0 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e   j = sqlite3_bin
2bbf0 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
2bc00 78 28 70 53 71 6c 2c 20 22 24 64 69 72 4f 6e 6c  x(pSql, "$dirOnl
2bc10 79 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  y");.      sqlit
2bc20 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c  e3_bind_int(pSql
2bc30 2c 20 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , j, i);.      i
2bc40 66 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20  f( pAr->bDryRun 
2bc50 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
2bc60 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f  printf(pAr->p->o
2bc70 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69  ut, "%s\n", sqli
2bc80 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b 0a  te3_sql(pSql));.
2bc90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2bca0 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d       while( rc==
2bcb0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
2bcc0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
2bcd0 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20  _step(pSql) ){. 
2bce0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d           if( i==
2bcf0 30 20 26 26 20 70 41 72 2d 3e 62 56 65 72 62 6f  0 && pAr->bVerbo
2bd00 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
2bd10 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
2bd20 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  r->p->out, "%s\n
2bd30 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
2bd40 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29  n_text(pSql, 0))
2bd50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2bd60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2bd70 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74        shellReset
2bd80 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20 20  (&rc, pSql);.   
2bd90 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61   }.    shellFina
2bda0 6c 69 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b  lize(&rc, pSql);
2bdb0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
2bdc0 66 72 65 65 28 7a 44 69 72 29 3b 0a 20 20 73 71  free(zDir);.  sq
2bdd0 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72  lite3_free(zWher
2bde0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
2bdf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68  .}../*.** Run th
2be00 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2be10 69 6e 20 7a 53 71 6c 2e 20 20 4f 72 20 69 66 20  in zSql.  Or if 
2be20 64 6f 69 6e 67 20 61 20 2d 2d 64 72 79 72 75 6e  doing a --dryrun
2be30 2c 20 6d 65 72 65 6c 79 20 70 72 69 6e 74 20 69  , merely print i
2be40 74 20 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t out..*/.static
2be50 20 69 6e 74 20 61 72 45 78 65 63 53 71 6c 28 41   int arExecSql(A
2be60 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63  rCommand *pAr, c
2be70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29  onst char *zSql)
2be80 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
2be90 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29  ( pAr->bDryRun )
2bea0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
2beb0 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22  f(pAr->p->out, "
2bec0 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20  %s\n", zSql);.  
2bed0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2bee0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
2bef0 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
2bf00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2bf10 65 78 65 63 28 70 41 72 2d 3e 64 62 2c 20 7a 53  exec(pAr->db, zS
2bf20 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29  ql, 0, 0, &zErr)
2bf30 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 20 29  ;.    if( zErr )
2bf40 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
2bf50 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 45 52 52  ntf(stdout, "ERR
2bf60 4f 52 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29  OR: %s\n", zErr)
2bf70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2bf80 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20  free(zErr);.    
2bf90 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
2bfa0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  c;.}.../*.** Imp
2bfb0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e  lementation of .
2bfc0 61 72 20 22 63 72 65 61 74 65 22 2c 20 22 69 6e  ar "create", "in
2bfd0 73 65 72 74 22 2c 20 61 6e 64 20 22 75 70 64 61  sert", and "upda
2bfe0 74 65 22 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a  te" commands..**
2bff0 0a 2a 2a 20 20 20 20 20 63 72 65 61 74 65 20 20  .**     create  
2c000 20 20 2d 3e 20 20 20 20 20 43 72 65 61 74 65 20    ->     Create 
2c010 61 20 6e 65 77 20 53 51 4c 20 61 72 63 68 69 76  a new SQL archiv
2c020 65 0a 2a 2a 20 20 20 20 20 69 6e 73 65 72 74 20  e.**     insert 
2c030 20 20 20 2d 3e 20 20 20 20 20 49 6e 73 65 72 74     ->     Insert
2c040 20 6f 72 20 72 65 69 6e 73 65 72 74 20 61 6c 6c   or reinsert all
2c050 20 66 69 6c 65 73 20 6c 69 73 74 65 64 0a 2a 2a   files listed.**
2c060 20 20 20 20 20 75 70 64 61 74 65 20 20 20 20 2d       update    -
2c070 3e 20 20 20 20 20 49 6e 73 65 72 74 20 66 69 6c  >     Insert fil
2c080 65 73 20 74 68 61 74 20 68 61 76 65 20 63 68 61  es that have cha
2c090 6e 67 65 64 20 6f 72 20 74 68 61 74 20 77 65 72  nged or that wer
2c0a0 65 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  e not.**        
2c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
2c0c0 65 76 69 6f 75 73 6c 79 20 69 6e 20 74 68 65 20  eviously in the 
2c0d0 61 72 63 68 69 76 65 0a 2a 2a 0a 2a 2a 20 43 72  archive.**.** Cr
2c0e0 65 61 74 65 20 74 68 65 20 22 73 71 6c 61 72 22  eate the "sqlar"
2c0f0 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
2c100 74 61 62 61 73 65 20 69 66 20 69 74 20 64 6f 65  tabase if it doe
2c110 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
2c120 69 73 74 2e 0a 2a 2a 20 54 68 65 6e 20 61 64 64  ist..** Then add
2c130 20 65 61 63 68 20 66 69 6c 65 20 69 6e 20 74 68   each file in th
2c140 65 20 61 7a 46 69 6c 65 5b 5d 20 61 72 72 61 79  e azFile[] array
2c150 20 74 6f 20 74 68 65 20 61 72 63 68 69 76 65 2e   to the archive.
2c160 20 44 69 72 65 63 74 6f 72 69 65 73 0a 2a 2a 20   Directories.** 
2c170 61 72 65 20 61 64 64 65 64 20 72 65 63 75 72 73  are added recurs
2c180 69 76 65 6c 79 2e 20 49 66 20 61 72 67 75 6d 65  ively. If argume
2c190 6e 74 20 62 56 65 72 62 6f 73 65 20 69 73 20 6e  nt bVerbose is n
2c1a0 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d 65 73 73 61  on-zero, a messa
2c1b0 67 65 20 69 73 0a 2a 2a 20 70 72 69 6e 74 65 64  ge is.** printed
2c1c0 20 6f 6e 20 73 74 64 6f 75 74 20 66 6f 72 20 65   on stdout for e
2c1d0 61 63 68 20 66 69 6c 65 20 61 72 63 68 69 76 65  ach file archive
2c1e0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 72 65  d..**.** The cre
2c1f0 61 74 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20 74  ate command is t
2c200 68 65 20 73 61 6d 65 20 61 73 20 75 70 64 61 74  he same as updat
2c210 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  e, except that i
2c220 74 20 64 72 6f 70 73 0a 2a 2a 20 61 6e 79 20 65  t drops.** any e
2c230 78 69 73 74 69 6e 67 20 22 73 71 6c 61 72 22 20  xisting "sqlar" 
2c240 74 61 62 6c 65 20 62 65 66 6f 72 65 20 62 65 67  table before beg
2c250 69 6e 6e 69 6e 67 2e 20 20 54 68 65 20 22 69 6e  inning.  The "in
2c260 73 65 72 74 22 20 63 6f 6d 6d 61 6e 64 0a 2a 2a  sert" command.**
2c270 20 61 6c 77 61 79 73 20 6f 76 65 72 77 72 69 74   always overwrit
2c280 65 73 20 65 76 65 72 79 20 66 69 6c 65 20 6e 61  es every file na
2c290 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  med on the comma
2c2a0 6e 64 2d 6c 69 6e 65 2c 20 77 68 65 72 65 20 61  nd-line, where a
2c2b0 73 0a 2a 2a 20 22 75 70 64 61 74 65 22 20 6f 6e  s.** "update" on
2c2c0 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20 69 66  ly overwrites if
2c2d0 20 74 68 65 20 73 69 7a 65 20 6f 72 20 6d 74 69   the size or mti
2c2e0 6d 65 20 6f 72 20 6d 6f 64 65 20 68 61 73 20 63  me or mode has c
2c2f0 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  hanged..*/.stati
2c300 63 20 69 6e 74 20 61 72 43 72 65 61 74 65 4f 72  c int arCreateOr
2c310 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28 0a 20  UpdateCommand(. 
2c320 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c   ArCommand *pAr,
2c330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c340 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
2c350 6d 65 6e 74 73 20 61 6e 64 20 6f 70 74 69 6f 6e  ments and option
2c360 73 20 2a 2f 0a 20 20 69 6e 74 20 62 55 70 64 61  s */.  int bUpda
2c370 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
2c380 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20 66         /* true f
2c390 6f 72 20 61 20 2d 2d 63 72 65 61 74 65 2e 20 2a  or a --create. *
2c3a0 2f 0a 20 20 69 6e 74 20 62 4f 6e 6c 79 49 66 43  /.  int bOnlyIfC
2c3b0 68 61 6e 67 65 64 20 20 20 20 20 20 20 20 20 20  hanged          
2c3c0 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 75 70 64 61      /* Only upda
2c3d0 74 65 20 69 66 20 66 69 6c 65 20 68 61 73 20 63  te if file has c
2c3e0 68 61 6e 67 65 64 20 2a 2f 0a 29 7b 0a 20 20 63  hanged */.){.  c
2c3f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61  onst char *zCrea
2c400 74 65 20 3d 20 0a 20 20 20 20 20 20 22 43 52 45  te = .      "CRE
2c410 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
2c420 20 45 58 49 53 54 53 20 73 71 6c 61 72 28 5c 6e   EXISTS sqlar(\n
2c430 22 0a 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20  ".      "  name 
2c440 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59  TEXT PRIMARY KEY
2c450 2c 20 20 2d 2d 20 6e 61 6d 65 20 6f 66 20 74 68  ,  -- name of th
2c460 65 20 66 69 6c 65 5c 6e 22 0a 20 20 20 20 20 20  e file\n".      
2c470 22 20 20 6d 6f 64 65 20 49 4e 54 2c 20 20 20 20  "  mode INT,    
2c480 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 61 63             -- ac
2c490 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
2c4a0 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 6d 74 69  \n".      "  mti
2c4b0 6d 65 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20  me INT,         
2c4c0 20 20 20 20 20 2d 2d 20 6c 61 73 74 20 6d 6f 64       -- last mod
2c4d0 69 66 69 63 61 74 69 6f 6e 20 74 69 6d 65 5c 6e  ification time\n
2c4e0 22 0a 20 20 20 20 20 20 22 20 20 73 7a 20 49 4e  ".      "  sz IN
2c4f0 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T,              
2c500 20 20 20 2d 2d 20 6f 72 69 67 69 6e 61 6c 20 66     -- original f
2c510 69 6c 65 20 73 69 7a 65 5c 6e 22 0a 20 20 20 20  ile size\n".    
2c520 20 20 22 20 20 64 61 74 61 20 42 4c 4f 42 20 20    "  data BLOB  
2c530 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
2c540 63 6f 6d 70 72 65 73 73 65 64 20 63 6f 6e 74 65  compressed conte
2c550 6e 74 5c 6e 22 0a 20 20 20 20 20 20 22 29 22 3b  nt\n".      ")";
2c560 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2c570 44 72 6f 70 20 3d 20 22 44 52 4f 50 20 54 41 42  Drop = "DROP TAB
2c580 4c 45 20 49 46 20 45 58 49 53 54 53 20 73 71 6c  LE IF EXISTS sql
2c590 61 72 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ar";.  const cha
2c5a0 72 20 2a 7a 49 6e 73 65 72 74 46 6d 74 5b 32 5d  r *zInsertFmt[2]
2c5b0 20 3d 20 7b 0a 20 20 20 20 20 22 52 45 50 4c 41   = {.     "REPLA
2c5c0 43 45 20 49 4e 54 4f 20 25 73 28 6e 61 6d 65 2c  CE INTO %s(name,
2c5d0 6d 6f 64 65 2c 6d 74 69 6d 65 2c 73 7a 2c 64 61  mode,mtime,sz,da
2c5e0 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 53  ta)\n".     "  S
2c5f0 45 4c 45 43 54 5c 6e 22 0a 20 20 20 20 20 22 20  ELECT\n".     " 
2c600 20 20 20 25 73 2c 5c 6e 22 0a 20 20 20 20 20 22     %s,\n".     "
2c610 20 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20      mode,\n".   
2c620 20 20 22 20 20 20 20 6d 74 69 6d 65 2c 5c 6e 22    "    mtime,\n"
2c630 0a 20 20 20 20 20 22 20 20 20 20 43 41 53 45 20  .     "    CASE 
2c640 73 75 62 73 74 72 28 6c 73 6d 6f 64 65 28 6d 6f  substr(lsmode(mo
2c650 64 65 29 2c 31 2c 31 29 5c 6e 22 0a 20 20 20 20  de),1,1)\n".    
2c660 20 22 20 20 20 20 20 20 57 48 45 4e 20 27 2d 27   "      WHEN '-'
2c670 20 54 48 45 4e 20 6c 65 6e 67 74 68 28 64 61 74   THEN length(dat
2c680 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  a)\n".     "    
2c690 20 20 57 48 45 4e 20 27 64 27 20 54 48 45 4e 20    WHEN 'd' THEN 
2c6a0 30 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20  0\n".     "     
2c6b0 20 45 4c 53 45 20 2d 31 20 45 4e 44 2c 5c 6e 22   ELSE -1 END,\n"
2c6c0 0a 20 20 20 20 20 22 20 20 20 20 73 71 6c 61 72  .     "    sqlar
2c6d0 5f 63 6f 6d 70 72 65 73 73 28 64 61 74 61 29 5c  _compress(data)\
2c6e0 6e 22 0a 20 20 20 20 20 22 20 20 46 52 4f 4d 20  n".     "  FROM 
2c6f0 66 73 64 69 72 28 25 51 2c 25 51 29 20 41 53 20  fsdir(%Q,%Q) AS 
2c700 64 69 73 6b 5c 6e 22 0a 20 20 20 20 20 22 20 20  disk\n".     "  
2c710 57 48 45 52 45 20 6c 73 6d 6f 64 65 28 6d 6f 64  WHERE lsmode(mod
2c720 65 29 20 4e 4f 54 20 4c 49 4b 45 20 27 3f 25 25  e) NOT LIKE '?%%
2c730 27 25 73 3b 22 0a 20 20 20 20 20 2c 0a 20 20 20  '%s;".     ,.   
2c740 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20    "REPLACE INTO 
2c750 25 73 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69  %s(name,mode,mti
2c760 6d 65 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20 20  me,data)\n".    
2c770 20 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20   "  SELECT\n".  
2c780 20 20 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a 20     "    %s,\n". 
2c790 20 20 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c 6e      "    mode,\n
2c7a0 22 0a 20 20 20 20 20 22 20 20 20 20 6d 74 69 6d  ".     "    mtim
2c7b0 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  e,\n".     "    
2c7c0 64 61 74 61 5c 6e 22 0a 20 20 20 20 20 22 20 20  data\n".     "  
2c7d0 46 52 4f 4d 20 66 73 64 69 72 28 25 51 2c 25 51  FROM fsdir(%Q,%Q
2c7e0 29 20 41 53 20 64 69 73 6b 5c 6e 22 0a 20 20 20  ) AS disk\n".   
2c7f0 20 20 22 20 20 57 48 45 52 45 20 6c 73 6d 6f 64    "  WHERE lsmod
2c800 65 28 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45  e(mode) NOT LIKE
2c810 20 27 3f 25 25 27 25 73 3b 22 0a 20 20 7d 3b 0a   '?%%'%s;".  };.
2c820 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
2c830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c840 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69    /* For iterati
2c850 6e 67 20 74 68 72 6f 75 67 68 20 61 7a 46 69 6c  ng through azFil
2c860 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  e[] */.  int rc;
2c870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c880 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2c890 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e  rn code */.  con
2c8a0 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
2c8b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
2c8c0 53 51 4c 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  SQL table into w
2c8d0 68 69 63 68 20 74 6f 20 69 6e 73 65 72 74 20 2a  hich to insert *
2c8e0 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  /.  char *zSql;.
2c8f0 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 35 30 5d    char zTemp[50]
2c900 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78 69 73 74  ;.  char *zExist
2c910 73 20 3d 20 30 3b 0a 0a 20 20 61 72 45 78 65 63  s = 0;..  arExec
2c920 53 71 6c 28 70 41 72 2c 20 22 50 52 41 47 4d 41  Sql(pAr, "PRAGMA
2c930 20 70 61 67 65 5f 73 69 7a 65 3d 35 31 32 22 29   page_size=512")
2c940 3b 0a 20 20 72 63 20 3d 20 61 72 45 78 65 63 53  ;.  rc = arExecS
2c950 71 6c 28 70 41 72 2c 20 22 53 41 56 45 50 4f 49  ql(pAr, "SAVEPOI
2c960 4e 54 20 61 72 3b 22 29 3b 0a 20 20 69 66 28 20  NT ar;");.  if( 
2c970 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2c980 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7a 54 65  return rc;.  zTe
2c990 6d 70 5b 30 5d 20 3d 20 30 3b 20 0a 20 20 69 66  mp[0] = 0; .  if
2c9a0 28 20 70 41 72 2d 3e 62 5a 69 70 20 29 7b 0a 20  ( pAr->bZip ){. 
2c9b0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
2c9c0 20 74 68 65 20 7a 69 70 66 69 6c 65 20 76 69 72   the zipfile vir
2c9d0 74 75 61 6c 20 74 61 62 6c 65 2c 20 69 66 20 6e  tual table, if n
2c9e0 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
2c9f0 69 66 28 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29  if( pAr->zFile )
2ca00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2ca10 75 69 6e 74 36 34 20 72 3b 0a 20 20 20 20 20 20  uint64 r;.      
2ca20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
2ca30 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 26 72 29  ss(sizeof(r),&r)
2ca40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2ca50 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2ca60 7a 54 65 6d 70 29 2c 7a 54 65 6d 70 2c 22 7a 69  zTemp),zTemp,"zi
2ca70 70 25 30 31 36 6c 6c 78 22 2c 72 29 3b 0a 20 20  p%016llx",r);.  
2ca80 20 20 20 20 7a 54 61 62 20 3d 20 7a 54 65 6d 70      zTab = zTemp
2ca90 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  ;.      zSql = s
2caa0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
2cab0 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
2cac0 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
2cad0 65 6d 70 2e 25 73 20 55 53 49 4e 47 20 7a 69 70  emp.%s USING zip
2cae0 66 69 6c 65 28 25 51 29 22 2c 0a 20 20 20 20 20  file(%Q)",.     
2caf0 20 20 20 20 7a 54 61 62 2c 20 70 41 72 2d 3e 7a      zTab, pAr->z
2cb00 46 69 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  File.      );.  
2cb10 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53      rc = arExecS
2cb20 71 6c 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a 20  ql(pAr, zSql);. 
2cb30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2cb40 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c  e(zSql);.    }el
2cb50 73 65 7b 0a 20 20 20 20 20 20 7a 54 61 62 20 3d  se{.      zTab =
2cb60 20 22 7a 69 70 22 3b 0a 20 20 20 20 7d 0a 20 20   "zip";.    }.  
2cb70 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
2cb80 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62  itialize the tab
2cb90 6c 65 20 66 6f 72 20 61 6e 20 53 51 4c 41 52 20  le for an SQLAR 
2cba0 2a 2f 0a 20 20 20 20 7a 54 61 62 20 3d 20 22 73  */.    zTab = "s
2cbb0 71 6c 61 72 22 3b 0a 20 20 20 20 69 66 28 20 62  qlar";.    if( b
2cbc0 55 70 64 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20  Update==0 ){.   
2cbd0 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71     rc = arExecSq
2cbe0 6c 28 70 41 72 2c 20 7a 44 72 6f 70 29 3b 0a 20  l(pAr, zDrop);. 
2cbf0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2cc00 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
2cc10 64 5f 61 72 5f 74 72 61 6e 73 61 63 74 69 6f 6e  d_ar_transaction
2cc20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2cc30 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
2cc40 7a 43 72 65 61 74 65 29 3b 0a 20 20 7d 0a 20 20  zCreate);.  }.  
2cc50 69 66 28 20 62 4f 6e 6c 79 49 66 43 68 61 6e 67  if( bOnlyIfChang
2cc60 65 64 20 29 7b 0a 20 20 20 20 7a 45 78 69 73 74  ed ){.    zExist
2cc70 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  s = sqlite3_mpri
2cc80 6e 74 66 28 0a 20 20 20 20 20 20 22 20 41 4e 44  ntf(.      " AND
2cc90 20 4e 4f 54 20 45 58 49 53 54 53 28 22 0a 20 20   NOT EXISTS(".  
2cca0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
2ccb0 31 20 46 52 4f 4d 20 25 73 20 41 53 20 6d 65 6d  1 FROM %s AS mem
2ccc0 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 57 48  ".          " WH
2ccd0 45 52 45 20 6d 65 6d 2e 6e 61 6d 65 3d 64 69 73  ERE mem.name=dis
2cce0 6b 2e 6e 61 6d 65 22 0a 20 20 20 20 20 20 20 20  k.name".        
2ccf0 20 20 22 20 41 4e 44 20 6d 65 6d 2e 6d 74 69 6d    " AND mem.mtim
2cd00 65 3d 64 69 73 6b 2e 6d 74 69 6d 65 22 0a 20 20  e=disk.mtime".  
2cd10 20 20 20 20 20 20 20 20 22 20 41 4e 44 20 6d 65          " AND me
2cd20 6d 2e 6d 6f 64 65 3d 64 69 73 6b 2e 6d 6f 64 65  m.mode=disk.mode
2cd30 29 22 2c 20 7a 54 61 62 29 3b 0a 20 20 7d 65 6c  )", zTab);.  }el
2cd40 73 65 7b 0a 20 20 20 20 7a 45 78 69 73 74 73 20  se{.    zExists 
2cd50 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2cd60 66 28 22 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  f("");.  }.  if(
2cd70 20 7a 45 78 69 73 74 73 3d 3d 30 20 29 20 72 63   zExists==0 ) rc
2cd80 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2cd90 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
2cda0 72 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d 53  r->nArg && rc==S
2cdb0 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
2cdc0 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 32 20      char *zSql2 
2cdd0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2cde0 66 28 7a 49 6e 73 65 72 74 46 6d 74 5b 70 41 72  f(zInsertFmt[pAr
2cdf0 2d 3e 62 5a 69 70 5d 2c 20 7a 54 61 62 2c 0a 20  ->bZip], zTab,. 
2ce00 20 20 20 20 20 20 20 70 41 72 2d 3e 62 56 65 72         pAr->bVer
2ce10 62 6f 73 65 20 3f 20 22 73 68 65 6c 6c 5f 70 75  bose ? "shell_pu
2ce20 74 73 6e 6c 28 6e 61 6d 65 29 22 20 3a 20 22 6e  tsnl(name)" : "n
2ce30 61 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 70 41  ame",.        pA
2ce40 72 2d 3e 61 7a 41 72 67 5b 69 5d 2c 20 70 41 72  r->azArg[i], pAr
2ce50 2d 3e 7a 44 69 72 2c 20 7a 45 78 69 73 74 73 29  ->zDir, zExists)
2ce60 3b 0a 20 20 20 20 72 63 20 3d 20 61 72 45 78 65  ;.    rc = arExe
2ce70 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c 32 29  cSql(pAr, zSql2)
2ce80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2ce90 65 65 28 7a 53 71 6c 32 29 3b 0a 20 20 7d 0a 65  ee(zSql2);.  }.e
2cea0 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63 74 69 6f  nd_ar_transactio
2ceb0 6e 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  n:.  if( rc!=SQL
2cec0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
2ced0 6c 69 74 65 33 5f 65 78 65 63 28 70 41 72 2d 3e  lite3_exec(pAr->
2cee0 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  db, "ROLLBACK TO
2cef0 20 61 72 3b 20 52 45 4c 45 41 53 45 20 61 72 3b   ar; RELEASE ar;
2cf00 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
2cf10 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61  else{.    rc = a
2cf20 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22 52  rExecSql(pAr, "R
2cf30 45 4c 45 41 53 45 20 61 72 3b 22 29 3b 0a 20 20  ELEASE ar;");.  
2cf40 20 20 69 66 28 20 70 41 72 2d 3e 62 5a 69 70 20    if( pAr->bZip 
2cf50 26 26 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29 7b  && pAr->zFile ){
2cf60 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  .      zSql = sq
2cf70 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 44  lite3_mprintf("D
2cf80 52 4f 50 20 54 41 42 4c 45 20 25 73 22 2c 20 7a  ROP TABLE %s", z
2cf90 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 61 72 45  Temp);.      arE
2cfa0 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c  xecSql(pAr, zSql
2cfb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2cfc0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
2cfd0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2cfe0 5f 66 72 65 65 28 7a 45 78 69 73 74 73 29 3b 0a  _free(zExists);.
2cff0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2d000 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
2d010 74 69 6f 6e 20 6f 66 20 22 2e 61 72 22 20 64 6f  tion of ".ar" do
2d020 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74  t command..*/.st
2d030 61 74 69 63 20 69 6e 74 20 61 72 44 6f 74 43 6f  atic int arDotCo
2d040 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74  mmand(.  ShellSt
2d050 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20  ate *pState,    
2d060 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
2d070 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73  ent shell tool s
2d080 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 66 72  tate */.  int fr
2d090 6f 6d 43 6d 64 4c 69 6e 65 2c 20 20 20 20 20 20  omCmdLine,      
2d0a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2d0b0 65 20 69 66 20 2d 41 20 63 6f 6d 6d 61 6e 64 2d  e if -A command-
2d0c0 6c 69 6e 65 20 6f 70 74 69 6f 6e 2c 20 6e 6f 74  line option, not
2d0d0 20 2e 61 72 20 63 6d 64 20 2a 2f 0a 20 20 63 68   .ar cmd */.  ch
2d0e0 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20  ar **azArg,     
2d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d100 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65   Array of argume
2d110 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f  nts passed to do
2d120 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  t command */.  i
2d130 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20 20  nt nArg         
2d140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d150 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
2d160 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a  ies in azArg[] *
2d170 2f 0a 29 7b 0a 20 20 41 72 43 6f 6d 6d 61 6e 64  /.){.  ArCommand
2d180 20 63 6d 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   cmd;.  int rc;.
2d190 20 20 6d 65 6d 73 65 74 28 26 63 6d 64 2c 20 30    memset(&cmd, 0
2d1a0 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 29 3b 0a  , sizeof(cmd));.
2d1b0 20 20 63 6d 64 2e 66 72 6f 6d 43 6d 64 4c 69 6e    cmd.fromCmdLin
2d1c0 65 20 3d 20 66 72 6f 6d 43 6d 64 4c 69 6e 65 3b  e = fromCmdLine;
2d1d0 0a 20 20 72 63 20 3d 20 61 72 50 61 72 73 65 43  .  rc = arParseC
2d1e0 6f 6d 6d 61 6e 64 28 61 7a 41 72 67 2c 20 6e 41  ommand(azArg, nA
2d1f0 72 67 2c 20 26 63 6d 64 29 3b 0a 20 20 69 66 28  rg, &cmd);.  if(
2d200 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2d210 7b 0a 20 20 20 20 69 6e 74 20 65 44 62 54 79 70  {.    int eDbTyp
2d220 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55  e = SHELL_OPEN_U
2d230 4e 53 50 45 43 3b 0a 20 20 20 20 63 6d 64 2e 70  NSPEC;.    cmd.p
2d240 20 3d 20 70 53 74 61 74 65 3b 0a 20 20 20 20 63   = pState;.    c
2d250 6d 64 2e 64 62 20 3d 20 70 53 74 61 74 65 2d 3e  md.db = pState->
2d260 64 62 3b 0a 20 20 20 20 69 66 28 20 63 6d 64 2e  db;.    if( cmd.
2d270 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 65  zFile ){.      e
2d280 44 62 54 79 70 65 20 3d 20 64 65 64 75 63 65 44  DbType = deduceD
2d290 61 74 61 62 61 73 65 54 79 70 65 28 63 6d 64 2e  atabaseType(cmd.
2d2a0 7a 46 69 6c 65 2c 20 31 29 3b 0a 20 20 20 20 7d  zFile, 1);.    }
2d2b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 44 62 54  else{.      eDbT
2d2c0 79 70 65 20 3d 20 70 53 74 61 74 65 2d 3e 6f 70  ype = pState->op
2d2d0 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 7d 0a 20 20  enMode;.    }.  
2d2e0 20 20 69 66 28 20 65 44 62 54 79 70 65 3d 3d 53    if( eDbType==S
2d2f0 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c  HELL_OPEN_ZIPFIL
2d300 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  E ){.      if( c
2d310 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f  md.eCmd==AR_CMD_
2d320 45 58 54 52 41 43 54 20 7c 7c 20 63 6d 64 2e 65  EXTRACT || cmd.e
2d330 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 4c 49 53 54  Cmd==AR_CMD_LIST
2d340 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2d350 63 6d 64 2e 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a  cmd.zFile==0 ){.
2d360 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 53            cmd.zS
2d370 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  rcTable = sqlite
2d380 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70 22 29  3_mprintf("zip")
2d390 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2d3a0 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a  .          cmd.z
2d3b0 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  SrcTable = sqlit
2d3c0 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70 66  e3_mprintf("zipf
2d3d0 69 6c 65 28 25 51 29 22 2c 20 63 6d 64 2e 7a 46  ile(%Q)", cmd.zF
2d3e0 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ile);.        }.
2d3f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d        }.      cm
2d400 64 2e 62 5a 69 70 20 3d 20 31 3b 0a 20 20 20 20  d.bZip = 1;.    
2d410 7d 65 6c 73 65 20 69 66 28 20 63 6d 64 2e 7a 46  }else if( cmd.zF
2d420 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ile ){.      int
2d430 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66   flags;.      if
2d440 28 20 63 6d 64 2e 62 41 70 70 65 6e 64 20 29 20  ( cmd.bAppend ) 
2d450 65 44 62 54 79 70 65 20 3d 20 53 48 45 4c 4c 5f  eDbType = SHELL_
2d460 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a  OPEN_APPENDVFS;.
2d470 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65 43        if( cmd.eC
2d480 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43 52 45 41 54  md==AR_CMD_CREAT
2d490 45 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d 41  E || cmd.eCmd==A
2d4a0 52 5f 43 4d 44 5f 49 4e 53 45 52 54 20 0a 20 20  R_CMD_INSERT .  
2d4b0 20 20 20 20 20 20 20 20 20 7c 7c 20 63 6d 64 2e           || cmd.
2d4c0 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44  eCmd==AR_CMD_UPD
2d4d0 41 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ATE ){.        f
2d4e0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
2d4f0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
2d500 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b  ITE_OPEN_CREATE;
2d510 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2d520 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51        flags = SQ
2d530 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2d540 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LY;.      }.    
2d550 20 20 63 6d 64 2e 64 62 20 3d 20 30 3b 0a 20 20    cmd.db = 0;.  
2d560 20 20 20 20 69 66 28 20 63 6d 64 2e 62 44 72 79      if( cmd.bDry
2d570 52 75 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 75  Run ){.        u
2d580 74 66 38 5f 70 72 69 6e 74 66 28 70 53 74 61 74  tf8_printf(pStat
2d590 65 2d 3e 6f 75 74 2c 20 22 2d 2d 20 6f 70 65 6e  e->out, "-- open
2d5a0 20 64 61 74 61 62 61 73 65 20 27 25 73 27 25 73   database '%s'%s
2d5b0 5c 6e 22 2c 20 63 6d 64 2e 7a 46 69 6c 65 2c 0a  \n", cmd.zFile,.
2d5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 44 62               eDb
2d5d0 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Type==SHELL_OPEN
2d5e0 5f 41 50 50 45 4e 44 56 46 53 20 3f 20 22 20 75  _APPENDVFS ? " u
2d5f0 73 69 6e 67 20 27 61 70 6e 64 76 66 73 27 22 20  sing 'apndvfs'" 
2d600 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  : "");.      }. 
2d610 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2d620 33 5f 6f 70 65 6e 5f 76 32 28 63 6d 64 2e 7a 46  3_open_v2(cmd.zF
2d630 69 6c 65 2c 20 26 63 6d 64 2e 64 62 2c 20 66 6c  ile, &cmd.db, fl
2d640 61 67 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ags, .          
2d650 20 20 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c     eDbType==SHEL
2d660 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53  L_OPEN_APPENDVFS
2d670 20 3f 20 22 61 70 6e 64 76 66 73 22 20 3a 20 30   ? "apndvfs" : 0
2d680 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2d690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d6a0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2d6b0 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f  f(stderr, "canno
2d6c0 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 25 73 20  t open file: %s 
2d6d0 28 25 73 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20  (%s)\n", .      
2d6e0 20 20 20 20 20 20 63 6d 64 2e 7a 46 69 6c 65 2c        cmd.zFile,
2d6f0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2d700 63 6d 64 2e 64 62 29 0a 20 20 20 20 20 20 20 20  cmd.db).        
2d710 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
2d720 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a  end_ar_command;.
2d730 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2d740 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69  lite3_fileio_ini
2d750 74 28 63 6d 64 2e 64 62 2c 20 30 2c 20 30 29 3b  t(cmd.db, 0, 0);
2d760 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2d770 71 6c 61 72 5f 69 6e 69 74 28 63 6d 64 2e 64 62  qlar_init(cmd.db
2d780 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
2d790 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
2d7a0 6e 63 74 69 6f 6e 28 63 6d 64 2e 64 62 2c 20 22  nction(cmd.db, "
2d7b0 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20 31  shell_putsnl", 1
2d7c0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 63  , SQLITE_UTF8, c
2d7d0 6d 64 2e 70 2c 0a 20 20 20 20 20 20 20 20 20 20  md.p,.          
2d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7f0 20 20 20 20 73 68 65 6c 6c 50 75 74 73 46 75 6e      shellPutsFun
2d800 63 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 7d  c, 0, 0);..    }
2d810 0a 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 53 72  .    if( cmd.zSr
2d820 63 54 61 62 6c 65 3d 3d 30 20 26 26 20 63 6d 64  cTable==0 && cmd
2d830 2e 62 5a 69 70 3d 3d 30 20 26 26 20 63 6d 64 2e  .bZip==0 && cmd.
2d840 65 43 6d 64 21 3d 41 52 5f 43 4d 44 5f 48 45 4c  eCmd!=AR_CMD_HEL
2d850 50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  P ){.      if( c
2d860 6d 64 2e 65 43 6d 64 21 3d 41 52 5f 43 4d 44 5f  md.eCmd!=AR_CMD_
2d870 43 52 45 41 54 45 0a 20 20 20 20 20 20 20 26 26  CREATE.       &&
2d880 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
2d890 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 63  olumn_metadata(c
2d8a0 6d 64 2e 64 62 2c 30 2c 22 73 71 6c 61 72 22 2c  md.db,0,"sqlar",
2d8b0 22 6e 61 6d 65 22 2c 30 2c 30 2c 30 2c 30 2c 30  "name",0,0,0,0,0
2d8c0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2d8d0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2d8e0 74 64 65 72 72 2c 20 22 64 61 74 61 62 61 73 65  tderr, "database
2d8f0 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
2d900 6e 20 61 6e 20 27 73 71 6c 61 72 27 20 74 61 62  n an 'sqlar' tab
2d910 6c 65 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  le\n");.        
2d920 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
2d930 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  R;.        goto 
2d940 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a  end_ar_command;.
2d950 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d        }.      cm
2d960 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71  d.zSrcTable = sq
2d970 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 73  lite3_mprintf("s
2d980 71 6c 61 72 22 29 3b 0a 20 20 20 20 7d 0a 0a 20  qlar");.    }.. 
2d990 20 20 20 73 77 69 74 63 68 28 20 63 6d 64 2e 65     switch( cmd.e
2d9a0 43 6d 64 20 29 7b 0a 20 20 20 20 20 20 63 61 73  Cmd ){.      cas
2d9b0 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 3a  e AR_CMD_CREATE:
2d9c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72  .        rc = ar
2d9d0 43 72 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f  CreateOrUpdateCo
2d9e0 6d 6d 61 6e 64 28 26 63 6d 64 2c 20 30 2c 20 30  mmand(&cmd, 0, 0
2d9f0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2da00 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41 52  ;..      case AR
2da10 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20 20  _CMD_EXTRACT:.  
2da20 20 20 20 20 20 20 72 63 20 3d 20 61 72 45 78 74        rc = arExt
2da30 72 61 63 74 43 6f 6d 6d 61 6e 64 28 26 63 6d 64  ractCommand(&cmd
2da40 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2da50 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41 52  ;..      case AR
2da60 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 20  _CMD_LIST:.     
2da70 20 20 20 72 63 20 3d 20 61 72 4c 69 73 74 43 6f     rc = arListCo
2da80 6d 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20 20  mmand(&cmd);.   
2da90 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
2daa0 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 48     case AR_CMD_H
2dab0 45 4c 50 3a 0a 20 20 20 20 20 20 20 20 61 72 55  ELP:.        arU
2dac0 73 61 67 65 28 70 53 74 61 74 65 2d 3e 6f 75 74  sage(pState->out
2dad0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2dae0 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41 52  ;..      case AR
2daf0 5f 43 4d 44 5f 49 4e 53 45 52 54 3a 0a 20 20 20  _CMD_INSERT:.   
2db00 20 20 20 20 20 72 63 20 3d 20 61 72 43 72 65 61       rc = arCrea
2db10 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e  teOrUpdateComman
2db20 64 28 26 63 6d 64 2c 20 31 2c 20 30 29 3b 0a 20  d(&cmd, 1, 0);. 
2db30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
2db40 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
2db50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 6d        assert( cm
2db60 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55  d.eCmd==AR_CMD_U
2db70 50 44 41 54 45 20 29 3b 0a 20 20 20 20 20 20 20  PDATE );.       
2db80 20 72 63 20 3d 20 61 72 43 72 65 61 74 65 4f 72   rc = arCreateOr
2db90 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28 26 63  UpdateCommand(&c
2dba0 6d 64 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  md, 1, 1);.     
2dbb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2dbc0 20 20 7d 0a 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61    }.end_ar_comma
2dbd0 6e 64 3a 0a 20 20 69 66 28 20 63 6d 64 2e 64 62  nd:.  if( cmd.db
2dbe0 21 3d 70 53 74 61 74 65 2d 3e 64 62 20 29 7b 0a  !=pState->db ){.
2dbf0 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 63 6d 64      close_db(cmd
2dc00 2e 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  .db);.  }.  sqli
2dc10 74 65 33 5f 66 72 65 65 28 63 6d 64 2e 7a 53 72  te3_free(cmd.zSr
2dc20 63 54 61 62 6c 65 29 3b 0a 0a 20 20 72 65 74 75  cTable);..  retu
2dc30 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45 6e 64 20  rn rc;.}./* End 
2dc40 6f 66 20 74 68 65 20 22 2e 61 72 63 68 69 76 65  of the ".archive
2dc50 22 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61  " or ".ar" comma
2dc60 6e 64 20 6c 6f 67 69 63 0a 2a 2a 2a 2a 2a 2a 2a  nd logic.*******
2dc70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dc80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dc90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dcb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e  ***********/.#en
2dcc0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
2dcd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2dce0 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
2dcf0 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45  ined(SQLITE_HAVE
2dd00 5f 5a 4c 49 42 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  _ZLIB) */.../*.*
2dd10 2a 20 49 66 20 61 6e 20 69 6e 70 75 74 20 6c 69  * If an input li
2dd20 6e 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22  ne begins with "
2dd30 2e 22 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  ." then invoke t
2dd40 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 2a  his routine to.*
2dd50 2a 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 6c  * process that l
2dd60 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ine..**.** Retur
2dd70 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20  n 1 on error, 2 
2dd80 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20 6f  to exit, and 0 o
2dd90 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
2dda0 74 69 63 20 69 6e 74 20 64 6f 5f 6d 65 74 61 5f  tic int do_meta_
2ddb0 63 6f 6d 6d 61 6e 64 28 63 68 61 72 20 2a 7a 4c  command(char *zL
2ddc0 69 6e 65 2c 20 53 68 65 6c 6c 53 74 61 74 65 20  ine, ShellState 
2ddd0 2a 70 29 7b 0a 20 20 69 6e 74 20 68 20 3d 20 31  *p){.  int h = 1
2dde0 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30  ;.  int nArg = 0
2ddf0 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 3b 0a 20 20  ;.  int n, c;.  
2de00 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 68  int rc = 0;.  ch
2de10 61 72 20 2a 61 7a 41 72 67 5b 35 30 5d 3b 0a 0a  ar *azArg[50];..
2de20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2de30 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2de40 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 65 72 74  .  if( p->expert
2de50 2e 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20 20  .pExpert ){.    
2de60 65 78 70 65 72 74 46 69 6e 69 73 68 28 70 2c 20  expertFinish(p, 
2de70 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  1, 0);.  }.#endi
2de80 66 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68  f..  /* Parse th
2de90 65 20 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e 74  e input line int
2dea0 6f 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20  o tokens..  */. 
2deb0 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d   while( zLine[h]
2dec0 20 26 26 20 6e 41 72 67 3c 41 72 72 61 79 53 69   && nArg<ArraySi
2ded0 7a 65 28 61 7a 41 72 67 29 20 29 7b 0a 20 20 20  ze(azArg) ){.   
2dee0 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28   while( IsSpace(
2def0 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b  zLine[h]) ){ h++
2df00 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e  ; }.    if( zLin
2df10 65 5b 68 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  e[h]==0 ) break;
2df20 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68  .    if( zLine[h
2df30 5d 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65  ]=='\'' || zLine
2df40 5b 68 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20  [h]=='"' ){.    
2df50 20 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c    int delim = zL
2df60 69 6e 65 5b 68 2b 2b 5d 3b 0a 20 20 20 20 20 20  ine[h++];.      
2df70 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20  azArg[nArg++] = 
2df80 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20  &zLine[h];.     
2df90 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d   while( zLine[h]
2dfa0 20 26 26 20 7a 4c 69 6e 65 5b 68 5d 21 3d 64 65   && zLine[h]!=de
2dfb0 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  lim ){.        i
2dfc0 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 5c  f( zLine[h]=='\\
2dfd0 27 20 26 26 20 64 65 6c 69 6d 3d 3d 27 22 27 20  ' && delim=='"' 
2dfe0 26 26 20 7a 4c 69 6e 65 5b 68 2b 31 5d 21 3d 30  && zLine[h+1]!=0
2dff0 20 29 20 68 2b 2b 3b 0a 20 20 20 20 20 20 20 20   ) h++;.        
2e000 68 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  h++;.      }.   
2e010 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d     if( zLine[h]=
2e020 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20  =delim ){.      
2e030 20 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30    zLine[h++] = 0
2e040 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e050 69 66 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29  if( delim=='"' )
2e060 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
2e070 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d  shes(azArg[nArg-
2e080 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
2e090 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67        azArg[nArg
2e0a0 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b  ++] = &zLine[h];
2e0b0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c  .      while( zL
2e0c0 69 6e 65 5b 68 5d 20 26 26 20 21 49 73 53 70 61  ine[h] && !IsSpa
2e0d0 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20  ce(zLine[h]) ){ 
2e0e0 68 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  h++; }.      if(
2e0f0 20 7a 4c 69 6e 65 5b 68 5d 20 29 20 7a 4c 69 6e   zLine[h] ) zLin
2e100 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20  e[h++] = 0;.    
2e110 20 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c    resolve_backsl
2e120 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67  ashes(azArg[nArg
2e130 2d 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  -1]);.    }.  }.
2e140 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
2e150 65 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20 20  e input line..  
2e160 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30  */.  if( nArg==0
2e170 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20   ) return 0; /* 
2e180 6e 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65 72  no tokens, no er
2e190 72 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74 72  ror */.  n = str
2e1a0 6c 65 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29 3b  len30(azArg[0]);
2e1b0 0a 20 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d 5b  .  c = azArg[0][
2e1c0 30 5d 3b 0a 20 20 63 6c 65 61 72 54 65 6d 70 46  0];.  clearTempF
2e1d0 69 6c 65 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66  ile(p);..#ifndef
2e1e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2e1f0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
2e200 20 63 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63   c=='a' && strnc
2e210 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61 75  mp(azArg[0], "au
2e220 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  th", n)==0 ){.  
2e230 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b    if( nArg!=2 ){
2e240 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2e250 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
2e260 3a 20 2e 61 75 74 68 20 4f 4e 7c 4f 46 46 5c 6e  : .auth ON|OFF\n
2e270 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
2e280 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
2e290 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
2e2a0 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64      }.    open_d
2e2b0 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  b(p, 0);.    if(
2e2c0 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
2e2d0 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20  Arg[1]) ){.     
2e2e0 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74   sqlite3_set_aut
2e2f0 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 73  horizer(p->db, s
2e300 68 65 6c 6c 41 75 74 68 2c 20 70 29 3b 0a 20 20  hellAuth, p);.  
2e310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2e320 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f  qlite3_set_autho
2e330 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 30 2c 20  rizer(p->db, 0, 
2e340 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0);.    }.  }els
2e350 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  e.#endif..#if !d
2e360 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2e370 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
2e380 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
2e390 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 20 20  TE_HAVE_ZLIB).  
2e3a0 69 66 28 20 63 3d 3d 27 61 27 20 26 26 20 73 74  if( c=='a' && st
2e3b0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2e3c0 22 61 72 63 68 69 76 65 22 2c 20 6e 29 3d 3d 30  "archive", n)==0
2e3d0 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   ){.    open_db(
2e3e0 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  p, 0);.    rc = 
2e3f0 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20  arDotCommand(p, 
2e400 30 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b  0, azArg, nArg);
2e410 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
2e420 0a 20 20 69 66 28 20 28 63 3d 3d 27 62 27 20 26  .  if( (c=='b' &
2e430 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
2e440 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 63  p(azArg[0], "bac
2e450 6b 75 70 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 20  kup", n)==0).   
2e460 7c 7c 20 28 63 3d 3d 27 73 27 20 26 26 20 6e 3e  || (c=='s' && n>
2e470 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
2e480 41 72 67 5b 30 5d 2c 20 22 73 61 76 65 22 2c 20  Arg[0], "save", 
2e490 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  n)==0).  ){.    
2e4a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73  const char *zDes
2e4b0 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 63  tFile = 0;.    c
2e4c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
2e4d0 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   0;.    sqlite3 
2e4e0 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69  *pDest;.    sqli
2e4f0 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
2e500 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  kup;.    int j;.
2e510 20 20 20 20 69 6e 74 20 62 41 73 79 6e 63 20 3d      int bAsync =
2e520 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
2e530 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20  ar *zVfs = 0;.  
2e540 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41 72    for(j=1; j<nAr
2e550 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63  g; j++){.      c
2e560 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
2e570 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  zArg[j];.      i
2e580 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  f( z[0]=='-' ){.
2e590 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 31 5d          if( z[1]
2e5a0 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20  =='-' ) z++;.   
2e5b0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
2e5c0 7a 2c 20 22 2d 61 70 70 65 6e 64 22 29 3d 3d 30  z, "-append")==0
2e5d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 56   ){.          zV
2e5e0 66 73 20 3d 20 22 61 70 6e 64 76 66 73 22 3b 0a  fs = "apndvfs";.
2e5f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20          }else.  
2e600 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
2e610 28 7a 2c 20 22 2d 61 73 79 6e 63 22 29 3d 3d 30  (z, "-async")==0
2e620 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 41   ){.          bA
2e630 73 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  sync = 1;.      
2e640 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20    }else.        
2e650 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
2e660 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2e670 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a  "unknown option:
2e680 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a 5d   %s\n", azArg[j]
2e690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
2e6a0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
2e6b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2e6c0 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b   zDestFile==0 ){
2e6d0 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46 69  .        zDestFi
2e6e0 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20  le = azArg[j];. 
2e6f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
2e700 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Db==0 ){.       
2e710 20 7a 44 62 20 3d 20 7a 44 65 73 74 46 69 6c 65   zDb = zDestFile
2e720 3b 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46  ;.        zDestF
2e730 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a  ile = azArg[j];.
2e740 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e750 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2e760 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2e770 2e 62 61 63 6b 75 70 20 3f 44 42 3f 20 3f 4f 50  .backup ?DB? ?OP
2e780 54 49 4f 4e 53 3f 20 46 49 4c 45 4e 41 4d 45 5c  TIONS? FILENAME\
2e790 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  n");.        ret
2e7a0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
2e7b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 65     }.    if( zDe
2e7c0 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  stFile==0 ){.   
2e7d0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2e7e0 64 65 72 72 2c 20 22 6d 69 73 73 69 6e 67 20 46  derr, "missing F
2e7f0 49 4c 45 4e 41 4d 45 20 61 72 67 75 6d 65 6e 74  ILENAME argument
2e800 20 6f 6e 20 2e 62 61 63 6b 75 70 5c 6e 22 29 3b   on .backup\n");
2e810 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2e820 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
2e830 44 62 3d 3d 30 20 29 20 7a 44 62 20 3d 20 22 6d  Db==0 ) zDb = "m
2e840 61 69 6e 22 3b 0a 20 20 20 20 72 63 20 3d 20 73  ain";.    rc = s
2e850 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a  qlite3_open_v2(z
2e860 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74  DestFile, &pDest
2e870 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2e880 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
2e890 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
2e8a0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 7a  E_OPEN_CREATE, z
2e8b0 56 66 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Vfs);.    if( rc
2e8c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e8d0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2e8e0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
2e8f0 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
2e900 73 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46 69 6c  s\"\n", zDestFil
2e910 65 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 5f  e);.      close_
2e920 64 62 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  db(pDest);.     
2e930 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2e940 0a 20 20 20 20 69 66 28 20 62 41 73 79 6e 63 20  .    if( bAsync 
2e950 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2e960 5f 65 78 65 63 28 70 44 65 73 74 2c 20 22 50 52  _exec(pDest, "PR
2e970 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
2e980 3d 4f 46 46 3b 20 50 52 41 47 4d 41 20 6a 6f 75  =OFF; PRAGMA jou
2e990 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 3b 22 2c  rnal_mode=OFF;",
2e9a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e9b0 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20      0, 0, 0);.  
2e9c0 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28    }.    open_db(
2e9d0 70 2c 20 30 29 3b 0a 20 20 20 20 70 42 61 63 6b  p, 0);.    pBack
2e9e0 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  up = sqlite3_bac
2e9f0 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74 2c 20  kup_init(pDest, 
2ea00 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62 2c 20 7a  "main", p->db, z
2ea10 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61  Db);.    if( pBa
2ea20 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ckup==0 ){.     
2ea30 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2ea40 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
2ea50 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
2ea60 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20  sg(pDest));.    
2ea70 20 20 63 6c 6f 73 65 5f 64 62 28 70 44 65 73 74    close_db(pDest
2ea80 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2ea90 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  1;.    }.    whi
2eaa0 6c 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69 74  le(  (rc = sqlit
2eab0 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70  e3_backup_step(p
2eac0 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51  Backup,100))==SQ
2ead0 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20 20  LITE_OK ){}.    
2eae0 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66  sqlite3_backup_f
2eaf0 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a  inish(pBackup);.
2eb00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2eb10 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
2eb20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c   rc = 0;.    }el
2eb30 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  se{.      utf8_p
2eb40 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2eb50 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
2eb60 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73  ite3_errmsg(pDes
2eb70 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t));.      rc = 
2eb80 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f  1;.    }.    clo
2eb90 73 65 5f 64 62 28 70 44 65 73 74 29 3b 0a 20 20  se_db(pDest);.  
2eba0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2ebb0 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'b' && n>=3 && s
2ebc0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2ebd0 20 22 62 61 69 6c 22 2c 20 6e 29 3d 3d 30 20 29   "bail", n)==0 )
2ebe0 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
2ebf0 32 20 29 7b 0a 20 20 20 20 20 20 62 61 69 6c 5f  2 ){.      bail_
2ec00 6f 6e 5f 65 72 72 6f 72 20 3d 20 62 6f 6f 6c 65  on_error = boole
2ec10 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
2ec20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2ec30 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2ec40 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2ec50 62 61 69 6c 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  bail on|off\n");
2ec60 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2ec70 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
2ec80 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e  if( c=='b' && n>
2ec90 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
2eca0 41 72 67 5b 30 5d 2c 20 22 62 69 6e 61 72 79 22  Arg[0], "binary"
2ecb0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
2ecc0 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
2ecd0 20 20 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56      if( booleanV
2ece0 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 29  alue(azArg[1]) )
2ecf0 7b 0a 20 20 20 20 20 20 20 20 73 65 74 42 69 6e  {.        setBin
2ed00 61 72 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20  aryMode(p->out, 
2ed10 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
2ed20 0a 20 20 20 20 20 20 20 20 73 65 74 54 65 78 74  .        setText
2ed30 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b  Mode(p->out, 1);
2ed40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2ed50 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
2ed60 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2ed70 61 67 65 3a 20 2e 62 69 6e 61 72 79 20 6f 6e 7c  age: .binary on|
2ed80 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  off\n");.      r
2ed90 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
2eda0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2edb0 63 27 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41  c' && strcmp(azA
2edc0 72 67 5b 30 5d 2c 22 63 64 22 29 3d 3d 30 20 29  rg[0],"cd")==0 )
2edd0 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
2ede0 32 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  2 ){.#if defined
2edf0 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69  (_WIN32) || defi
2ee00 6e 65 64 28 57 49 4e 33 32 29 0a 20 20 20 20 20  ned(WIN32).     
2ee10 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71   wchar_t *z = sq
2ee20 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
2ee30 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 61 7a 41 72  _to_unicode(azAr
2ee40 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20  g[1]);.      rc 
2ee50 3d 20 21 53 65 74 43 75 72 72 65 6e 74 44 69 72  = !SetCurrentDir
2ee60 65 63 74 6f 72 79 57 28 7a 29 3b 0a 20 20 20 20  ectoryW(z);.    
2ee70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2ee80 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72  );.#else.      r
2ee90 63 20 3d 20 63 68 64 69 72 28 61 7a 41 72 67 5b  c = chdir(azArg[
2eea0 31 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1]);.#endif.    
2eeb0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2eec0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2eed0 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20  stderr, "Cannot 
2eee0 63 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63 74  change to direct
2eef0 6f 72 79 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61  ory \"%s\"\n", a
2ef00 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
2ef10 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2ef20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2ef30 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2ef40 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63  derr, "Usage: .c
2ef50 64 20 44 49 52 45 43 54 4f 52 59 5c 6e 22 29 3b  d DIRECTORY\n");
2ef60 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2ef70 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
2ef80 2f 2a 20 54 68 65 20 75 6e 64 6f 63 75 6d 65 6e  /* The undocumen
2ef90 74 65 64 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74  ted ".breakpoint
2efa0 22 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73  " command causes
2efb0 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 6e   a call to the n
2efc0 6f 2d 6f 70 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  o-op.  ** routin
2efd0 65 20 6e 61 6d 65 64 20 74 65 73 74 5f 62 72 65  e named test_bre
2efe0 61 6b 70 6f 69 6e 74 28 29 2e 0a 20 20 2a 2f 0a  akpoint()..  */.
2eff0 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20    if( c=='b' && 
2f000 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
2f010 61 7a 41 72 67 5b 30 5d 2c 20 22 62 72 65 61 6b  azArg[0], "break
2f020 70 6f 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b  point", n)==0 ){
2f030 0a 20 20 20 20 74 65 73 74 5f 62 72 65 61 6b 70  .    test_breakp
2f040 6f 69 6e 74 28 29 3b 0a 20 20 7d 65 6c 73 65 0a  oint();.  }else.
2f050 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26  .  if( c=='c' &&
2f060 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
2f070 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68 61 6e  (azArg[0], "chan
2f080 67 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ges", n)==0 ){. 
2f090 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
2f0a0 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43 6c 65  {.      setOrCle
2f0b0 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  arFlag(p, SHFLG_
2f0c0 43 6f 75 6e 74 43 68 61 6e 67 65 73 2c 20 61 7a  CountChanges, az
2f0d0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  Arg[1]);.    }el
2f0e0 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
2f0f0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2f100 61 67 65 3a 20 2e 63 68 61 6e 67 65 73 20 6f 6e  age: .changes on
2f110 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |off\n");.      
2f120 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
2f130 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 43 61 6e 63  }else..  /* Canc
2f140 65 6c 20 6f 75 74 70 75 74 20 72 65 64 69 72 65  el output redire
2f150 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20  ction, if it is 
2f160 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20 28 62  currently set (b
2f170 79 20 2e 74 65 73 74 63 61 73 65 29 0a 20 20 2a  y .testcase).  *
2f180 2a 20 54 68 65 6e 20 72 65 61 64 20 74 68 65 20  * Then read the 
2f190 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 74  content of the t
2f1a0 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 20  estcase-out.txt 
2f1b0 66 69 6c 65 20 61 6e 64 20 63 6f 6d 70 61 72 65  file and compare
2f1c0 20 61 67 61 69 6e 73 74 0a 20 20 2a 2a 20 61 7a   against.  ** az
2f1d0 41 72 67 5b 31 5d 2e 20 20 49 66 20 74 68 65 72  Arg[1].  If ther
2f1e0 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 63 65  e are difference
2f1f0 73 2c 20 72 65 70 6f 72 74 20 61 6e 20 65 72 72  s, report an err
2f200 6f 72 20 61 6e 64 20 65 78 69 74 2e 0a 20 20 2a  or and exit..  *
2f210 2f 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26  /.  if( c=='c' &
2f220 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
2f230 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68 65  p(azArg[0], "che
2f240 63 6b 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ck", n)==0 ){.  
2f250 20 20 63 68 61 72 20 2a 7a 52 65 73 20 3d 20 30    char *zRes = 0
2f260 3b 0a 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73  ;.    output_res
2f270 65 74 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6e  et(p);.    if( n
2f280 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg!=2 ){.      
2f290 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2f2a0 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 68 65 63  r, "Usage: .chec
2f2b0 6b 20 47 4c 4f 42 2d 50 41 54 54 45 52 4e 5c 6e  k GLOB-PATTERN\n
2f2c0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 32  ");.      rc = 2
2f2d0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2f2e0 28 7a 52 65 73 20 3d 20 72 65 61 64 46 69 6c 65  (zRes = readFile
2f2f0 28 22 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74  ("testcase-out.t
2f300 78 74 22 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20  xt", 0))==0 ){. 
2f310 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2f320 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2f330 63 61 6e 6e 6f 74 20 72 65 61 64 20 27 74 65 73  cannot read 'tes
2f340 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e  tcase-out.txt'\n
2f350 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 32  ");.      rc = 2
2f360 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2f370 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 61 7a  testcase_glob(az
2f380 41 72 67 5b 31 5d 2c 7a 52 65 73 29 3d 3d 30 20  Arg[1],zRes)==0 
2f390 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
2f3a0 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20  intf(stderr,.   
2f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74                "t
2f3c0 65 73 74 63 61 73 65 2d 25 73 20 46 41 49 4c 45  estcase-%s FAILE
2f3d0 44 5c 6e 20 45 78 70 65 63 74 65 64 3a 20 5b 25  D\n Expected: [%
2f3e0 73 5d 5c 6e 20 20 20 20 20 20 47 6f 74 3a 20 5b  s]\n      Got: [
2f3f0 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %s]\n",.        
2f400 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 54 65 73           p->zTes
2f410 74 63 61 73 65 2c 20 61 7a 41 72 67 5b 31 5d 2c  tcase, azArg[1],
2f420 20 7a 52 65 73 29 3b 0a 20 20 20 20 20 20 72 63   zRes);.      rc
2f430 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
2f440 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2f450 74 66 28 73 74 64 6f 75 74 2c 20 22 74 65 73 74  tf(stdout, "test
2f460 63 61 73 65 2d 25 73 20 6f 6b 5c 6e 22 2c 20 70  case-%s ok\n", p
2f470 2d 3e 7a 54 65 73 74 63 61 73 65 29 3b 0a 20 20  ->zTestcase);.  
2f480 20 20 20 20 70 2d 3e 6e 43 68 65 63 6b 2b 2b 3b      p->nCheck++;
2f490 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2f4a0 65 33 5f 66 72 65 65 28 7a 52 65 73 29 3b 0a 20  e3_free(zRes);. 
2f4b0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2f4c0 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='c' && strncmp(
2f4d0 61 7a 41 72 67 5b 30 5d 2c 20 22 63 6c 6f 6e 65  azArg[0], "clone
2f4e0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2f4f0 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
2f500 20 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 28       tryToClone(
2f510 70 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  p, azArg[1]);.  
2f520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2f530 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2f540 2c 20 22 55 73 61 67 65 3a 20 2e 63 6c 6f 6e 65  , "Usage: .clone
2f550 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20   FILENAME\n");. 
2f560 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2f570 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
2f580 28 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 31 20  ( c=='d' && n>1 
2f590 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2f5a0 5b 30 5d 2c 20 22 64 61 74 61 62 61 73 65 73 22  [0], "databases"
2f5b0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53  , n)==0 ){.    S
2f5c0 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a  hellState data;.
2f5d0 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73      char *zErrMs
2f5e0 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f  g = 0;.    open_
2f5f0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65  db(p, 0);.    me
2f600 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73  mcpy(&data, p, s
2f610 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20  izeof(data));.  
2f620 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65    data.showHeade
2f630 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e  r = 0;.    data.
2f640 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64  cMode = data.mod
2f650 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20  e = MODE_List;. 
2f660 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2f670 6e 74 66 28 73 69 7a 65 6f 66 28 64 61 74 61 2e  ntf(sizeof(data.
2f680 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 64 61  colSeparator),da
2f690 74 61 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  ta.colSeparator,
2f6a0 22 3a 20 22 29 3b 0a 20 20 20 20 64 61 74 61 2e  ": ");.    data.
2f6b0 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  cnt = 0;.    sql
2f6c0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
2f6d0 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 66   "SELECT name, f
2f6e0 69 6c 65 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f  ile FROM pragma_
2f6f0 64 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a  database_list",.
2f700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f710 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61   callback, &data
2f720 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
2f730 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
2f740 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2f750 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
2f760 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29   %s\n", zErrMsg)
2f770 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2f780 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
2f790 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2f7a0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
2f7b0 28 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 3d 33  ( c=='d' && n>=3
2f7c0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2f7d0 67 5b 30 5d 2c 20 22 64 62 63 6f 6e 66 69 67 22  g[0], "dbconfig"
2f7e0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  , n)==0 ){.    s
2f7f0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
2f800 63 74 20 44 62 43 6f 6e 66 69 67 43 68 6f 69 63  ct DbConfigChoic
2f810 65 73 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  es {.      const
2f820 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
2f830 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20      int op;.    
2f840 7d 20 61 44 62 43 6f 6e 66 69 67 5b 5d 20 3d 20  } aDbConfig[] = 
2f850 7b 0a 20 20 20 20 20 20 20 20 7b 20 22 65 6e 61  {.        { "ena
2f860 62 6c 65 5f 66 6b 65 79 22 2c 20 20 20 20 20 20  ble_fkey",      
2f870 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
2f880 45 4e 41 42 4c 45 5f 46 4b 45 59 20 20 20 20 20  ENABLE_FKEY     
2f890 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2f8a0 20 20 7b 20 22 65 6e 61 62 6c 65 5f 74 72 69 67    { "enable_trig
2f8b0 67 65 72 22 2c 20 20 20 53 51 4c 49 54 45 5f 44  ger",   SQLITE_D
2f8c0 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54  BCONFIG_ENABLE_T
2f8d0 52 49 47 47 45 52 20 20 20 20 20 20 20 20 20 7d  RIGGER         }
2f8e0 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 66 74 73  ,.        { "fts
2f8f0 33 5f 74 6f 6b 65 6e 69 7a 65 72 22 2c 20 20 20  3_tokenizer",   
2f900 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
2f910 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45  ENABLE_FTS3_TOKE
2f920 4e 49 5a 45 52 20 20 7d 2c 0a 20 20 20 20 20 20  NIZER  },.      
2f930 20 20 7b 20 22 6c 6f 61 64 5f 65 78 74 65 6e 73    { "load_extens
2f940 69 6f 6e 22 2c 20 20 20 53 51 4c 49 54 45 5f 44  ion",   SQLITE_D
2f950 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 4c  BCONFIG_ENABLE_L
2f960 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 20 7d  OAD_EXTENSION  }
2f970 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 6e 6f 5f  ,.        { "no_
2f980 63 6b 70 74 5f 6f 6e 5f 63 6c 6f 73 65 22 2c 20  ckpt_on_close", 
2f990 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
2f9a0 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53 45  NO_CKPT_ON_CLOSE
2f9b0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2f9c0 20 20 7b 20 22 65 6e 61 62 6c 65 5f 71 70 73 67    { "enable_qpsg
2f9d0 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44  ",      SQLITE_D
2f9e0 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 51  BCONFIG_ENABLE_Q
2f9f0 50 53 47 20 20 20 20 20 20 20 20 20 20 20 20 7d  PSG            }
2fa00 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 74 72 69  ,.        { "tri
2fa10 67 67 65 72 5f 65 71 70 22 2c 20 20 20 20 20 20  gger_eqp",      
2fa20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
2fa30 54 52 49 47 47 45 52 5f 45 51 50 20 20 20 20 20  TRIGGER_EQP     
2fa40 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2fa50 20 20 7b 20 22 72 65 73 65 74 5f 64 61 74 61 62    { "reset_datab
2fa60 61 73 65 22 2c 20 20 20 53 51 4c 49 54 45 5f 44  ase",   SQLITE_D
2fa70 42 43 4f 4e 46 49 47 5f 52 45 53 45 54 5f 44 41  BCONFIG_RESET_DA
2fa80 54 41 42 41 53 45 20 20 20 20 20 20 20 20 20 7d  TABASE         }
2fa90 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 64 65 66  ,.        { "def
2faa0 65 6e 73 69 76 65 22 2c 20 20 20 20 20 20 20 20  ensive",        
2fab0 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
2fac0 44 45 46 45 4e 53 49 56 45 20 20 20 20 20 20 20  DEFENSIVE       
2fad0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b         },.    };
2fae0 0a 20 20 20 20 69 6e 74 20 69 69 2c 20 76 3b 0a  .    int ii, v;.
2faf0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
2fb00 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  );.    for(ii=0;
2fb10 20 69 69 3c 41 72 72 61 79 53 69 7a 65 28 61 44   ii<ArraySize(aD
2fb20 62 43 6f 6e 66 69 67 29 3b 20 69 69 2b 2b 29 7b  bConfig); ii++){
2fb30 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e  .      if( nArg>
2fb40 31 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41 72  1 && strcmp(azAr
2fb50 67 5b 31 5d 2c 20 61 44 62 43 6f 6e 66 69 67 5b  g[1], aDbConfig[
2fb60 69 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 20  ii].zName)!=0 ) 
2fb70 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2fb80 69 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a 20  if( nArg>=3 ){. 
2fb90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
2fba0 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20  b_config(p->db, 
2fbb0 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 6f 70  aDbConfig[ii].op
2fbc0 2c 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  , booleanValue(a
2fbd0 7a 41 72 67 5b 32 5d 29 2c 20 30 29 3b 0a 20 20  zArg[2]), 0);.  
2fbe0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2fbf0 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70 2d  te3_db_config(p-
2fc00 3e 64 62 2c 20 61 44 62 43 6f 6e 66 69 67 5b 69  >db, aDbConfig[i
2fc10 69 5d 2e 6f 70 2c 20 2d 31 2c 20 26 76 29 3b 0a  i].op, -1, &v);.
2fc20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2fc30 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 38 73 20  f(p->out, "%18s 
2fc40 25 73 5c 6e 22 2c 20 61 44 62 43 6f 6e 66 69 67  %s\n", aDbConfig
2fc50 5b 69 69 5d 2e 7a 4e 61 6d 65 2c 20 76 20 3f 20  [ii].zName, v ? 
2fc60 22 6f 6e 22 20 3a 20 22 6f 66 66 22 29 3b 0a 20  "on" : "off");. 
2fc70 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20       if( nArg>1 
2fc80 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
2fc90 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26     if( nArg>1 &&
2fca0 20 69 69 3d 3d 41 72 72 61 79 53 69 7a 65 28 61   ii==ArraySize(a
2fcb0 44 62 43 6f 6e 66 69 67 29 20 29 7b 0a 20 20 20  DbConfig) ){.   
2fcc0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2fcd0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 75  tderr, "Error: u
2fce0 6e 6b 6e 6f 77 6e 20 64 62 63 6f 6e 66 69 67 20  nknown dbconfig 
2fcf0 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67  \"%s\"\n", azArg
2fd00 5b 31 5d 29 3b 0a 20 20 20 20 20 20 75 74 66 38  [1]);.      utf8
2fd10 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2fd20 22 45 6e 74 65 72 20 5c 22 2e 64 62 63 6f 6e 66  "Enter \".dbconf
2fd30 69 67 5c 22 20 77 69 74 68 20 6e 6f 20 61 72 67  ig\" with no arg
2fd40 75 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c 69 73  uments for a lis
2fd50 74 5c 6e 22 29 3b 0a 20 20 20 20 7d 20 20 20 0a  t\n");.    }   .
2fd60 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2fd70 3d 3d 27 64 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='d' && n>=3 &&
2fd80 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2fd90 5d 2c 20 22 64 62 69 6e 66 6f 22 2c 20 6e 29 3d  ], "dbinfo", n)=
2fda0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
2fdb0 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d 6d  hell_dbinfo_comm
2fdc0 61 6e 64 28 70 2c 20 6e 41 72 67 2c 20 61 7a 41  and(p, nArg, azA
2fdd0 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  rg);.  }else..  
2fde0 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74  if( c=='d' && st
2fdf0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2fe00 22 64 75 6d 70 22 2c 20 6e 29 3d 3d 30 20 29 7b  "dump", n)==0 ){
2fe10 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2fe20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 0a 20 20 20 20  *zLike = 0;.    
2fe30 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 73  int i;.    int s
2fe40 61 76 65 64 53 68 6f 77 48 65 61 64 65 72 20 3d  avedShowHeader =
2fe50 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a   p->showHeader;.
2fe60 20 20 20 20 69 6e 74 20 73 61 76 65 64 53 68 65      int savedShe
2fe70 6c 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 68 65  llFlags = p->she
2fe80 6c 6c 46 6c 67 73 3b 0a 20 20 20 20 53 68 65 6c  llFlgs;.    Shel
2fe90 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48  lClearFlag(p, SH
2fea0 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69  FLG_PreserveRowi
2feb0 64 7c 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73  d|SHFLG_Newlines
2fec0 7c 53 48 46 4c 47 5f 45 63 68 6f 29 3b 0a 20 20  |SHFLG_Echo);.  
2fed0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72    for(i=1; i<nAr
2fee0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  g; i++){.      i
2fef0 66 28 20 61 7a 41 72 67 5b 69 5d 5b 30 5d 3d 3d  f( azArg[i][0]==
2ff00 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  '-' ){.        c
2ff10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
2ff20 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20 20 20 20 20  zArg[i]+1;.     
2ff30 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27     if( z[0]=='-'
2ff40 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20   ) z++;.        
2ff50 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 70 72  if( strcmp(z,"pr
2ff60 65 73 65 72 76 65 2d 72 6f 77 69 64 73 22 29 3d  eserve-rowids")=
2ff70 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  =0 ){.#ifdef SQL
2ff80 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2ff90 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 20 20  TABLE.          
2ffa0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2ffb0 72 2c 20 22 54 68 65 20 2d 2d 70 72 65 73 65 72  r, "The --preser
2ffc0 76 65 2d 72 6f 77 69 64 73 20 6f 70 74 69 6f 6e  ve-rowids option
2ffd0 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62   is not compatib
2ffe0 6c 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  le".            
2fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30000 20 22 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f   " with SQLITE_O
30010 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
30020 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  \n");.          
30030 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
30040 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
30050 61 6e 64 5f 65 78 69 74 3b 0a 23 65 6c 73 65 0a  and_exit;.#else.
30060 20 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c 53            ShellS
30070 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  etFlag(p, SHFLG_
30080 50 72 65 73 65 72 76 65 52 6f 77 69 64 29 3b 0a  PreserveRowid);.
30090 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
300a0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
300b0 20 73 74 72 63 6d 70 28 7a 2c 22 6e 65 77 6c 69   strcmp(z,"newli
300c0 6e 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nes")==0 ){.    
300d0 20 20 20 20 20 20 53 68 65 6c 6c 53 65 74 46 6c        ShellSetFl
300e0 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c  ag(p, SHFLG_Newl
300f0 69 6e 65 73 29 3b 0a 20 20 20 20 20 20 20 20 7d  ines);.        }
30100 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a 20  else.        {. 
30110 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
30120 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 6b  ntf(stderr, "Unk
30130 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73  nown option \"%s
30140 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d 70 5c 22 5c  \" on \".dump\"\
30150 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  n", azArg[i]);. 
30160 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
30170 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
30180 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
30190 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
301a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 69     }else if( zLi
301b0 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  ke ){.        ra
301c0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
301d0 20 22 55 73 61 67 65 3a 20 2e 64 75 6d 70 20 3f   "Usage: .dump ?
301e0 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64  --preserve-rowid
301f0 73 3f 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  s? ".           
30200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30210 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f 20 3f 4c  "?--newlines? ?L
30220 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29  IKE-PATTERN?\n")
30230 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
30240 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
30250 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
30260 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
30270 20 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d 20 61         zLike = a
30280 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 7d  zArg[i];.      }
30290 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
302a0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 2f 2a  db(p, 0);.    /*
302b0 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61   When playing ba
302c0 63 6b 20 61 20 22 64 75 6d 70 22 2c 20 74 68 65  ck a "dump", the
302d0 20 63 6f 6e 74 65 6e 74 20 6d 69 67 68 74 20 61   content might a
302e0 70 70 65 61 72 20 69 6e 20 61 6e 20 6f 72 64 65  ppear in an orde
302f0 72 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 63  r.    ** which c
30300 61 75 73 65 73 20 69 6d 6d 65 64 69 61 74 65 20  auses immediate 
30310 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
30320 74 72 61 69 6e 74 73 20 74 6f 20 62 65 20 76 69  traints to be vi
30330 6f 6c 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 53  olated..    ** S
30340 6f 20 64 69 73 61 62 6c 65 20 66 6f 72 65 69 67  o disable foreig
30350 6e 2d 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n-key constraint
30360 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 74 6f 20   enforcement to 
30370 70 72 65 76 65 6e 74 20 70 72 6f 62 6c 65 6d 73  prevent problems
30380 2e 20 2a 2f 0a 20 20 20 20 72 61 77 5f 70 72 69  . */.    raw_pri
30390 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52 41  ntf(p->out, "PRA
303a0 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
303b0 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 72  =OFF;\n");.    r
303c0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
303d0 2c 20 22 42 45 47 49 4e 20 54 52 41 4e 53 41 43  , "BEGIN TRANSAC
303e0 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 70  TION;\n");.    p
303f0 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  ->writableSchema
30400 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 68 6f   = 0;.    p->sho
30410 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20  wHeader = 0;.   
30420 20 2f 2a 20 53 65 74 20 77 72 69 74 61 62 6c 65   /* Set writable
30430 5f 73 63 68 65 6d 61 3d 4f 4e 20 73 69 6e 63 65  _schema=ON since
30440 20 64 6f 69 6e 67 20 73 6f 20 66 6f 72 63 65 73   doing so forces
30450 20 53 51 4c 69 74 65 20 74 6f 20 69 6e 69 74 69   SQLite to initi
30460 61 6c 69 7a 65 0a 20 20 20 20 2a 2a 20 61 73 20  alize.    ** as 
30470 6d 75 63 68 20 6f 66 20 74 68 65 20 73 63 68 65  much of the sche
30480 6d 61 20 61 73 20 69 74 20 63 61 6e 20 65 76 65  ma as it can eve
30490 6e 20 69 66 20 74 68 65 20 73 71 6c 69 74 65 5f  n if the sqlite_
304a0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 69 73 0a  master table is.
304b0 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 2e 20      ** corrupt. 
304c0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  */.    sqlite3_e
304d0 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56 45  xec(p->db, "SAVE
304e0 50 4f 49 4e 54 20 64 75 6d 70 3b 20 50 52 41 47  POINT dump; PRAG
304f0 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
30500 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20 30 29  ma=ON", 0, 0, 0)
30510 3b 0a 20 20 20 20 70 2d 3e 6e 45 72 72 20 3d 20  ;.    p->nErr = 
30520 30 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6b 65  0;.    if( zLike
30530 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 75 6e  ==0 ){.      run
30540 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65  _schema_dump_que
30550 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53  ry(p,.        "S
30560 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65  ELECT name, type
30570 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
30580 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
30590 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f     "WHERE sql NO
305a0 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65 3d  T NULL AND type=
305b0 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61 6d  ='table' AND nam
305c0 65 21 3d 27 73 71 6c 69 74 65 5f 73 65 71 75 65  e!='sqlite_seque
305d0 6e 63 65 27 22 0a 20 20 20 20 20 20 29 3b 0a 20  nce'".      );. 
305e0 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f       run_schema_
305f0 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20  dump_query(p,.  
30600 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
30610 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52  me, type, sql FR
30620 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
30630 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52   ".        "WHER
30640 45 20 6e 61 6d 65 3d 3d 27 73 71 6c 69 74 65 5f  E name=='sqlite_
30650 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20  sequence'".     
30660 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74 61   );.      run_ta
30670 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ble_dump_query(p
30680 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  ,.        "SELEC
30690 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  T sql FROM sqlit
306a0 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
306b0 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f     "WHERE sql NO
306c0 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65 20  T NULL AND type 
306d0 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69  IN ('index','tri
306e0 67 67 65 72 27 2c 27 76 69 65 77 27 29 22 2c 20  gger','view')", 
306f0 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  0.      );.    }
30700 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
30710 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20 20 7a 53   *zSql;.      zS
30720 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
30730 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 53  intf(.        "S
30740 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65  ELECT name, type
30750 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
30760 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
30770 20 20 20 22 57 48 45 52 45 20 74 62 6c 5f 6e 61     "WHERE tbl_na
30780 6d 65 20 4c 49 4b 45 20 25 51 20 41 4e 44 20 74  me LIKE %Q AND t
30790 79 70 65 3d 3d 27 74 61 62 6c 65 27 22 0a 20 20  ype=='table'".  
307a0 20 20 20 20 20 20 22 20 20 41 4e 44 20 73 71 6c        "  AND sql
307b0 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 7a 4c 69 6b   NOT NULL", zLik
307c0 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63  e);.      run_sc
307d0 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28  hema_dump_query(
307e0 70 2c 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73  p,zSql);.      s
307f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
30800 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  );.      zSql = 
30810 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
30820 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
30830 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
30840 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
30850 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54    "WHERE sql NOT
30860 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20 22   NULL".        "
30870 20 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28 27    AND type IN ('
30880 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65 72 27  index','trigger'
30890 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20 20 20  ,'view')".      
308a0 20 20 22 20 20 41 4e 44 20 74 62 6c 5f 6e 61 6d    "  AND tbl_nam
308b0 65 20 4c 49 4b 45 20 25 51 22 2c 20 7a 4c 69 6b  e LIKE %Q", zLik
308c0 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74 61  e);.      run_ta
308d0 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ble_dump_query(p
308e0 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20  , zSql, 0);.    
308f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
30900 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
30910 69 66 28 20 70 2d 3e 77 72 69 74 61 62 6c 65 53  if( p->writableS
30920 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 72  chema ){.      r
30930 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
30940 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
30950 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 5c 6e  le_schema=OFF;\n
30960 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69  ");.      p->wri
30970 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b  tableSchema = 0;
30980 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
30990 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
309a0 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
309b0 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c  schema=OFF;", 0,
309c0 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
309d0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
309e0 22 52 45 4c 45 41 53 45 20 64 75 6d 70 3b 22 2c  "RELEASE dump;",
309f0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72   0, 0, 0);.    r
30a00 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
30a10 2c 20 70 2d 3e 6e 45 72 72 20 3f 20 22 52 4f 4c  , p->nErr ? "ROL
30a20 4c 42 41 43 4b 3b 20 2d 2d 20 64 75 65 20 74 6f  LBACK; -- due to
30a30 20 65 72 72 6f 72 73 5c 6e 22 20 3a 20 22 43 4f   errors\n" : "CO
30a40 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 20 20 70  MMIT;\n");.    p
30a50 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 73  ->showHeader = s
30a60 61 76 65 64 53 68 6f 77 48 65 61 64 65 72 3b 0a  avedShowHeader;.
30a70 20 20 20 20 70 2d 3e 73 68 65 6c 6c 46 6c 67 73      p->shellFlgs
30a80 20 3d 20 73 61 76 65 64 53 68 65 6c 6c 46 6c 61   = savedShellFla
30a90 67 73 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  gs;.  }else..  i
30aa0 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72  f( c=='e' && str
30ab0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
30ac0 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  echo", n)==0 ){.
30ad0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
30ae0 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43 6c  ){.      setOrCl
30af0 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  earFlag(p, SHFLG
30b00 5f 45 63 68 6f 2c 20 61 7a 41 72 67 5b 31 5d 29  _Echo, azArg[1])
30b10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30b20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
30b30 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65  derr, "Usage: .e
30b40 63 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a  cho on|off\n");.
30b50 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
30b60 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
30b70 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72  f( c=='e' && str
30b80 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
30b90 65 71 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  eqp", n)==0 ){. 
30ba0 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
30bb0 7b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45  {.      p->autoE
30bc0 51 50 74 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  QPtest = 0;.    
30bd0 20 20 69 66 28 20 70 2d 3e 61 75 74 6f 45 51 50    if( p->autoEQP
30be0 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  trace ){.       
30bf0 20 69 66 28 20 70 2d 3e 64 62 20 29 20 73 71 6c   if( p->db ) sql
30c00 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
30c10 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 74 72   "PRAGMA vdbe_tr
30c20 61 63 65 3d 4f 46 46 3b 22 2c 20 30 2c 20 30 2c  ace=OFF;", 0, 0,
30c30 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e   0);.        p->
30c40 61 75 74 6f 45 51 50 74 72 61 63 65 20 3d 20 30  autoEQPtrace = 0
30c50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30c60 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67  if( strcmp(azArg
30c70 5b 31 5d 2c 22 66 75 6c 6c 22 29 3d 3d 30 20 29  [1],"full")==0 )
30c80 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74  {.        p->aut
30c90 6f 45 51 50 20 3d 20 41 55 54 4f 45 51 50 5f 66  oEQP = AUTOEQP_f
30ca0 75 6c 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ull;.      }else
30cb0 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72   if( strcmp(azAr
30cc0 67 5b 31 5d 2c 22 74 72 69 67 67 65 72 22 29 3d  g[1],"trigger")=
30cd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
30ce0 3e 61 75 74 6f 45 51 50 20 3d 20 41 55 54 4f 45  >autoEQP = AUTOE
30cf0 51 50 5f 74 72 69 67 67 65 72 3b 0a 23 69 66 64  QP_trigger;.#ifd
30d00 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
30d10 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
30d20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  strcmp(azArg[1],
30d30 22 74 65 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20  "test")==0 ){.  
30d40 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50        p->autoEQP
30d50 20 3d 20 41 55 54 4f 45 51 50 5f 6f 6e 3b 0a 20   = AUTOEQP_on;. 
30d60 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51         p->autoEQ
30d70 50 74 65 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  Ptest = 1;.     
30d80 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
30d90 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 72 61 63  p(azArg[1],"trac
30da0 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
30db0 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41    p->autoEQP = A
30dc0 55 54 4f 45 51 50 5f 66 75 6c 6c 3b 0a 20 20 20  UTOEQP_full;.   
30dd0 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 74       p->autoEQPt
30de0 72 61 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  race = 1;.      
30df0 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
30e00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30e10 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45  _exec(p->db, "SE
30e20 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
30e30 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4c 49 4d  qlite_master LIM
30e40 49 54 20 31 22 2c 20 30 2c 20 30 2c 20 30 29 3b  IT 1", 0, 0, 0);
30e50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30e60 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52  _exec(p->db, "PR
30e70 41 47 4d 41 20 76 64 62 65 5f 74 72 61 63 65 3d  AGMA vdbe_trace=
30e80 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ON;", 0, 0, 0);.
30e90 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
30ea0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  se{.        p->a
30eb0 75 74 6f 45 51 50 20 3d 20 28 75 38 29 62 6f 6f  utoEQP = (u8)boo
30ec0 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
30ed0 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  1]);.      }.   
30ee0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
30ef0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
30f00 20 22 55 73 61 67 65 3a 20 2e 65 71 70 20 6f 66   "Usage: .eqp of
30f10 66 7c 6f 6e 7c 74 72 61 63 65 7c 74 72 69 67 67  f|on|trace|trigg
30f20 65 72 7c 66 75 6c 6c 5c 6e 22 29 3b 0a 20 20 20  er|full\n");.   
30f30 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
30f40 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
30f50 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d  c=='e' && strncm
30f60 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 69  p(azArg[0], "exi
30f70 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  t", n)==0 ){.   
30f80 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20 28   if( nArg>1 && (
30f90 72 63 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65  rc = (int)intege
30fa0 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  rValue(azArg[1])
30fb0 29 21 3d 30 20 29 20 65 78 69 74 28 72 63 29 3b  )!=0 ) exit(rc);
30fc0 0a 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d  .    rc = 2;.  }
30fd0 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20 22  else..  /* The "
30fe0 2e 65 78 70 6c 61 69 6e 22 20 63 6f 6d 6d 61 6e  .explain" comman
30ff0 64 20 69 73 20 61 75 74 6f 6d 61 74 69 63 20 6e  d is automatic n
31000 6f 77 2e 20 20 49 74 20 69 73 20 6c 61 72 67 65  ow.  It is large
31010 6c 79 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49  ly pointless.  I
31020 74 0a 20 20 2a 2a 20 72 65 74 61 69 6e 65 64 20  t.  ** retained 
31030 70 75 72 65 6c 79 20 66 6f 72 20 62 61 63 6b 77  purely for backw
31040 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
31050 74 79 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27  ty */.  if( c=='
31060 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  e' && strncmp(az
31070 41 72 67 5b 30 5d 2c 20 22 65 78 70 6c 61 69 6e  Arg[0], "explain
31080 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
31090 69 6e 74 20 76 61 6c 20 3d 20 31 3b 0a 20 20 20  int val = 1;.   
310a0 20 69 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a   if( nArg>=2 ){.
310b0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
310c0 28 61 7a 41 72 67 5b 31 5d 2c 22 61 75 74 6f 22  (azArg[1],"auto"
310d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
310e0 76 61 6c 20 3d 20 39 39 3b 0a 20 20 20 20 20 20  val = 99;.      
310f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 76  }else{.        v
31100 61 6c 20 3d 20 20 62 6f 6f 6c 65 61 6e 56 61 6c  al =  booleanVal
31110 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ue(azArg[1]);.  
31120 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
31130 69 66 28 20 76 61 6c 3d 3d 31 20 26 26 20 70 2d  if( val==1 && p-
31140 3e 6d 6f 64 65 21 3d 4d 4f 44 45 5f 45 78 70 6c  >mode!=MODE_Expl
31150 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ain ){.      p->
31160 6e 6f 72 6d 61 6c 4d 6f 64 65 20 3d 20 70 2d 3e  normalMode = p->
31170 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 6d  mode;.      p->m
31180 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61  ode = MODE_Expla
31190 69 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74  in;.      p->aut
311a0 6f 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20  oExplain = 0;.  
311b0 20 20 7d 65 6c 73 65 20 69 66 28 20 76 61 6c 3d    }else if( val=
311c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
311d0 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78  p->mode==MODE_Ex
311e0 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20  plain ) p->mode 
311f0 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b  = p->normalMode;
31200 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78  .      p->autoEx
31210 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  plain = 0;.    }
31220 65 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d 39 39  else if( val==99
31230 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
31240 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c  >mode==MODE_Expl
31250 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d 20  ain ) p->mode = 
31260 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20  p->normalMode;. 
31270 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c       p->autoExpl
31280 61 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ain = 1;.    }. 
31290 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20   }else..#ifndef 
312a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
312b0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 63  UALTABLE.  if( c
312c0 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70  =='e' && strncmp
312d0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70 65  (azArg[0], "expe
312e0 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  rt", n)==0 ){.  
312f0 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
31300 0a 20 20 20 20 65 78 70 65 72 74 44 6f 74 43 6f  .    expertDotCo
31310 6d 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20  mmand(p, azArg, 
31320 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  nArg);.  }else.#
31330 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d  endif..  if( c==
31340 27 66 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'f' && strncmp(a
31350 7a 41 72 67 5b 30 5d 2c 20 22 66 75 6c 6c 73 63  zArg[0], "fullsc
31360 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  hema", n)==0 ){.
31370 20 20 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64      ShellState d
31380 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ata;.    char *z
31390 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
313a0 69 6e 74 20 64 6f 53 74 61 74 73 20 3d 20 30 3b  int doStats = 0;
313b0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
313c0 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74  a, p, sizeof(dat
313d0 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68  a));.    data.sh
313e0 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  owHeader = 0;.  
313f0 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64    data.cMode = d
31400 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f  ata.mode = MODE_
31410 53 65 6d 69 3b 0a 20 20 20 20 69 66 28 20 6e 41  Semi;.    if( nA
31420 72 67 3d 3d 32 20 26 26 20 6f 70 74 69 6f 6e 4d  rg==2 && optionM
31430 61 74 63 68 28 61 7a 41 72 67 5b 31 5d 2c 20 22  atch(azArg[1], "
31440 69 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20 20 20  indent") ){.    
31450 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64    data.cMode = d
31460 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f  ata.mode = MODE_
31470 50 72 65 74 74 79 3b 0a 20 20 20 20 20 20 6e 41  Pretty;.      nA
31480 72 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rg = 1;.    }.  
31490 20 20 69 66 28 20 6e 41 72 67 21 3d 31 20 29 7b    if( nArg!=1 ){
314a0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
314b0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
314c0 3a 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20 3f 2d  : .fullschema ?-
314d0 2d 69 6e 64 65 6e 74 3f 5c 6e 22 29 3b 0a 20 20  -indent?\n");.  
314e0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
314f0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
31500 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
31510 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
31520 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
31530 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a  te3_exec(p->db,.
31540 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73         "SELECT s
31550 71 6c 20 46 52 4f 4d 22 0a 20 20 20 20 20 20 20  ql FROM".       
31560 22 20 20 28 53 45 4c 45 43 54 20 73 71 6c 20 73  "  (SELECT sql s
31570 71 6c 2c 20 74 79 70 65 20 74 79 70 65 2c 20 74  ql, type type, t
31580 62 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65  bl_name tbl_name
31590 2c 20 6e 61 6d 65 20 6e 61 6d 65 2c 20 72 6f 77  , name name, row
315a0 69 64 20 78 22 0a 20 20 20 20 20 20 20 22 20 20  id x".       "  
315b0 20 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d     FROM sqlite_m
315c0 61 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 22  aster UNION ALL"
315d0 0a 20 20 20 20 20 20 20 22 20 20 20 53 45 4c 45  .       "   SELE
315e0 43 54 20 73 71 6c 2c 20 74 79 70 65 2c 20 74 62  CT sql, type, tb
315f0 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f  l_name, name, ro
31600 77 69 64 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  wid FROM sqlite_
31610 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 22 0a 20  temp_master) ". 
31620 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70        "WHERE typ
31630 65 21 3d 27 6d 65 74 61 27 20 41 4e 44 20 73 71  e!='meta' AND sq
31640 6c 20 4e 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e 61  l NOTNULL AND na
31650 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c  me NOT LIKE 'sql
31660 69 74 65 5f 25 27 20 22 0a 20 20 20 20 20 20 20  ite_%' ".       
31670 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 22  "ORDER BY rowid"
31680 2c 0a 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63  ,.       callbac
31690 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d  k, &data, &zErrM
316a0 73 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  sg.    );.    if
316b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
316c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
316d0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
316e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
316f0 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
31700 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
31710 20 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64 20    "SELECT rowid 
31720 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
31730 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
31740 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65 20     " WHERE name 
31750 47 4c 4f 42 20 27 73 71 6c 69 74 65 5f 73 74 61  GLOB 'sqlite_sta
31760 74 5b 31 33 34 5d 27 22 2c 0a 20 20 20 20 20 20  t[134]'",.      
31770 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53           -1, &pS
31780 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 64  tmt, 0);.      d
31790 6f 53 74 61 74 73 20 3d 20 73 71 6c 69 74 65 33  oStats = sqlite3
317a0 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
317b0 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 20 20  LITE_ROW;.      
317c0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
317d0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
317e0 20 20 20 69 66 28 20 64 6f 53 74 61 74 73 3d 3d     if( doStats==
317f0 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
31800 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f  rintf(p->out, "/
31810 2a 20 4e 6f 20 53 54 41 54 20 74 61 62 6c 65 73  * No STAT tables
31820 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 5c 6e 22   available */\n"
31830 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
31840 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
31850 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20  ->out, "ANALYZE 
31860 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e  sqlite_master;\n
31870 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
31880 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53  3_exec(p->db, "S
31890 45 4c 45 43 54 20 27 41 4e 41 4c 59 5a 45 20 73  ELECT 'ANALYZE s
318a0 71 6c 69 74 65 5f 6d 61 73 74 65 72 27 22 2c 0a  qlite_master'",.
318b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318c0 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61     callback, &da
318d0 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ta, &zErrMsg);. 
318e0 20 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20       data.cMode 
318f0 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f  = data.mode = MO
31900 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 20  DE_Insert;.     
31910 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c 65   data.zDestTable
31920 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31   = "sqlite_stat1
31930 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65  ";.      shell_e
31940 78 65 63 28 26 64 61 74 61 2c 20 22 53 45 4c 45  xec(&data, "SELE
31950 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65  CT * FROM sqlite
31960 5f 73 74 61 74 31 22 2c 20 26 7a 45 72 72 4d 73  _stat1", &zErrMs
31970 67 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a  g);.      data.z
31980 44 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c  DestTable = "sql
31990 69 74 65 5f 73 74 61 74 33 22 3b 0a 20 20 20 20  ite_stat3";.    
319a0 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 26 64 61    shell_exec(&da
319b0 74 61 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52  ta, "SELECT * FR
319c0 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 33 22  OM sqlite_stat3"
319d0 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
319e0 20 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62     data.zDestTab
319f0 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61  le = "sqlite_sta
31a00 74 34 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c  t4";.      shell
31a10 5f 65 78 65 63 28 26 64 61 74 61 2c 20 22 53 45  _exec(&data, "SE
31a20 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
31a30 74 65 5f 73 74 61 74 34 22 2c 20 26 7a 45 72 72  te_stat4", &zErr
31a40 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 61 77 5f  Msg);.      raw_
31a50 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
31a60 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d  ANALYZE sqlite_m
31a70 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20  aster;\n");.    
31a80 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
31a90 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63   c=='h' && strnc
31aa0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65  mp(azArg[0], "he
31ab0 61 64 65 72 73 22 2c 20 6e 29 3d 3d 30 20 29 7b  aders", n)==0 ){
31ac0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
31ad0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f   ){.      p->sho
31ae0 77 48 65 61 64 65 72 20 3d 20 62 6f 6f 6c 65 61  wHeader = boolea
31af0 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
31b00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31b10 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
31b20 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 68  derr, "Usage: .h
31b30 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66 5c 6e 22  eaders on|off\n"
31b40 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
31b50 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
31b60 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20    if( c=='h' && 
31b70 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
31b80 2c 20 22 68 65 6c 70 22 2c 20 6e 29 3d 3d 30 20  , "help", n)==0 
31b90 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e  ){.    if( nArg>
31ba0 3d 32 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  =2 ){.      n = 
31bb0 73 68 6f 77 48 65 6c 70 28 70 2d 3e 6f 75 74 2c  showHelp(p->out,
31bc0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
31bd0 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
31be0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
31bf0 66 28 70 2d 3e 6f 75 74 2c 20 22 4e 6f 74 68 69  f(p->out, "Nothi
31c00 6e 67 20 6d 61 74 63 68 65 73 20 27 25 73 27 5c  ng matches '%s'\
31c10 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  n", azArg[1]);. 
31c20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
31c30 7b 0a 20 20 20 20 20 20 73 68 6f 77 48 65 6c 70  {.      showHelp
31c40 28 70 2d 3e 6f 75 74 2c 20 30 29 3b 0a 20 20 20  (p->out, 0);.   
31c50 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
31c60 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e  ( c=='i' && strn
31c70 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69  cmp(azArg[0], "i
31c80 6d 70 6f 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b  mport", n)==0 ){
31c90 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c  .    char *zTabl
31ca0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
31cb0 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
31cc0 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  into this table 
31cd0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69  */.    char *zFi
31ce0 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
31cf0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
31d00 6c 65 20 74 6f 20 65 78 74 72 61 20 63 6f 6e 74  le to extra cont
31d10 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20  ent from */.    
31d20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
31d30 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 2f 2a 20 41  tmt = NULL; /* A
31d40 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
31d50 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
31d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31d70 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
31d80 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
31d90 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
31da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31db0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
31dc0 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20  bytes in an SQL 
31dd0 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  string */.    in
31de0 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
31df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
31e00 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
31e10 20 20 69 6e 74 20 6e 65 65 64 43 6f 6d 6d 69 74    int needCommit
31e20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
31e30 20 54 72 75 65 20 74 6f 20 43 4f 4d 4d 49 54 20   True to COMMIT 
31e40 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 61 74 20 65  or ROLLBACK at e
31e50 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53  nd */.    int nS
31e60 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ep;             
31e70 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
31e80 6f 66 20 62 79 74 65 73 20 69 6e 20 70 2d 3e 63  of bytes in p->c
31e90 6f 6c 53 65 70 61 72 61 74 6f 72 5b 5d 20 2a 2f  olSeparator[] */
31ea0 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  .    char *zSql;
31eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ec0 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65   /* An SQL state
31ed0 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 49 6d 70 6f  ment */.    Impo
31ee0 72 74 43 74 78 20 73 43 74 78 3b 20 20 20 20 20  rtCtx sCtx;     
31ef0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 65          /* Reade
31f00 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20  r context */.   
31f10 20 63 68 61 72 20 2a 28 53 51 4c 49 54 45 5f 43   char *(SQLITE_C
31f20 44 45 43 4c 20 2a 78 52 65 61 64 29 28 49 6d 70  DECL *xRead)(Imp
31f30 6f 72 74 43 74 78 2a 29 3b 20 2f 2a 20 46 75 6e  ortCtx*); /* Fun
31f40 63 20 74 6f 20 72 65 61 64 20 6f 6e 65 20 76 61  c to read one va
31f50 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28  lue */.    int (
31f60 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 78 43  SQLITE_CDECL *xC
31f70 6c 6f 73 65 72 29 28 46 49 4c 45 2a 29 3b 20 20  loser)(FILE*);  
31f80 20 20 20 20 2f 2a 20 46 75 6e 63 20 74 6f 20 63      /* Func to c
31f90 6c 6f 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  lose file */..  
31fa0 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b    if( nArg!=3 ){
31fb0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
31fc0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
31fd0 3a 20 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54  : .import FILE T
31fe0 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ABLE\n");.      
31ff0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
32000 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
32010 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b    zFile = azArg[
32020 31 5d 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d  1];.    zTable =
32030 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 73   azArg[2];.    s
32040 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 30  eenInterrupt = 0
32050 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 43  ;.    memset(&sC
32060 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43  tx, 0, sizeof(sC
32070 74 78 29 29 3b 0a 20 20 20 20 6f 70 65 6e 5f 64  tx));.    open_d
32080 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65  b(p, 0);.    nSe
32090 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e  p = strlen30(p->
320a0 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
320b0 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29     if( nSep==0 )
320c0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
320d0 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
320e0 20 20 20 20 20 20 20 20 20 20 20 20 22 45 72 72              "Err
320f0 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 63 6f 6c  or: non-null col
32100 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 72 65  umn separator re
32110 71 75 69 72 65 64 20 66 6f 72 20 69 6d 70 6f 72  quired for impor
32120 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  t\n");.      ret
32130 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
32140 20 69 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20   if( nSep>1 ){. 
32150 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
32160 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
32170 6d 75 6c 74 69 2d 63 68 61 72 61 63 74 65 72 20  multi-character 
32180 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
32190 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20  s not allowed". 
321a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321b0 20 20 20 20 20 22 20 66 6f 72 20 69 6d 70 6f 72       " for impor
321c0 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  t\n");.      ret
321d0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
321e0 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30   nSep = strlen30
321f0 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
32200 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d  );.    if( nSep=
32210 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =0 ){.      raw_
32220 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
32230 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20  Error: non-null 
32240 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20 72 65  row separator re
32250 71 75 69 72 65 64 20 66 6f 72 20 69 6d 70 6f 72  quired for impor
32260 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  t\n");.      ret
32270 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
32280 20 69 66 28 20 6e 53 65 70 3d 3d 32 20 26 26 20   if( nSep==2 && 
32290 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 43 73  p->mode==MODE_Cs
322a0 76 20 26 26 20 73 74 72 63 6d 70 28 70 2d 3e 72  v && strcmp(p->r
322b0 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  owSeparator, SEP
322c0 5f 43 72 4c 66 29 3d 3d 30 20 29 7b 0a 20 20 20  _CrLf)==0 ){.   
322d0 20 20 20 2f 2a 20 57 68 65 6e 20 69 6d 70 6f 72     /* When impor
322e0 74 69 6e 67 20 43 53 56 20 28 6f 6e 6c 79 29 2c  ting CSV (only),
322f0 20 69 66 20 74 68 65 20 72 6f 77 20 73 65 70 61   if the row sepa
32300 72 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20  rator is set to 
32310 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 66  the.      ** def
32320 61 75 6c 74 20 6f 75 74 70 75 74 20 72 6f 77 20  ault output row 
32330 73 65 70 61 72 61 74 6f 72 2c 20 63 68 61 6e 67  separator, chang
32340 65 20 69 74 20 74 6f 20 74 68 65 20 64 65 66 61  e it to the defa
32350 75 6c 74 20 69 6e 70 75 74 0a 20 20 20 20 20 20  ult input.      
32360 2a 2a 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  ** row separator
32370 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 68  .  This avoids h
32380 61 76 69 6e 67 20 74 6f 20 6d 61 69 6e 74 61 69  aving to maintai
32390 6e 20 64 69 66 66 65 72 65 6e 74 20 69 6e 70 75  n different inpu
323a0 74 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6f  t.      ** and o
323b0 75 74 70 75 74 20 72 6f 77 20 73 65 70 61 72 61  utput row separa
323c0 74 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73  tors. */.      s
323d0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
323e0 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
323f0 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
32400 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f  eparator, SEP_Ro
32410 77 29 3b 0a 20 20 20 20 20 20 6e 53 65 70 20 3d  w);.      nSep =
32420 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 72 6f 77   strlen30(p->row
32430 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
32440 7d 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3e 31  }.    if( nSep>1
32450 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
32460 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
32470 72 6f 72 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61  ror: multi-chara
32480 63 74 65 72 20 72 6f 77 20 73 65 70 61 72 61 74  cter row separat
32490 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22  ors not allowed"
324a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
324b0 20 20 20 20 20 20 20 22 20 66 6f 72 20 69 6d 70         " for imp
324c0 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ort\n");.      r
324d0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
324e0 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 20 3d 20     sCtx.zFile = 
324f0 7a 46 69 6c 65 3b 0a 20 20 20 20 73 43 74 78 2e  zFile;.    sCtx.
32500 6e 4c 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 69  nLine = 1;.    i
32510 66 28 20 73 43 74 78 2e 7a 46 69 6c 65 5b 30 5d  f( sCtx.zFile[0]
32520 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 64 65 66 20  =='|' ){.#ifdef 
32530 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45  SQLITE_OMIT_POPE
32540 4e 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  N.      raw_prin
32550 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
32560 72 3a 20 70 69 70 65 73 20 61 72 65 20 6e 6f 74  r: pipes are not
32570 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 74 68   supported in th
32580 69 73 20 4f 53 5c 6e 22 29 3b 0a 20 20 20 20 20  is OS\n");.     
32590 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65   return 1;.#else
325a0 0a 20 20 20 20 20 20 73 43 74 78 2e 69 6e 20 3d  .      sCtx.in =
325b0 20 70 6f 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c   popen(sCtx.zFil
325c0 65 2b 31 2c 20 22 72 22 29 3b 0a 20 20 20 20 20  e+1, "r");.     
325d0 20 73 43 74 78 2e 7a 46 69 6c 65 20 3d 20 22 3c   sCtx.zFile = "<
325e0 70 69 70 65 3e 22 3b 0a 20 20 20 20 20 20 78 43  pipe>";.      xC
325f0 6c 6f 73 65 72 20 3d 20 70 63 6c 6f 73 65 3b 0a  loser = pclose;.
32600 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
32610 7b 0a 20 20 20 20 20 20 73 43 74 78 2e 69 6e 20  {.      sCtx.in 
32620 3d 20 66 6f 70 65 6e 28 73 43 74 78 2e 7a 46 69  = fopen(sCtx.zFi
32630 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 20  le, "rb");.     
32640 20 78 43 6c 6f 73 65 72 20 3d 20 66 63 6c 6f 73   xCloser = fclos
32650 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
32660 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 41   p->mode==MODE_A
32670 73 63 69 69 20 29 7b 0a 20 20 20 20 20 20 78 52  scii ){.      xR
32680 65 61 64 20 3d 20 61 73 63 69 69 5f 72 65 61 64  ead = ascii_read
32690 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20 20  _one_field;.    
326a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 78 52 65  }else{.      xRe
326b0 61 64 20 3d 20 63 73 76 5f 72 65 61 64 5f 6f 6e  ad = csv_read_on
326c0 65 5f 66 69 65 6c 64 3b 0a 20 20 20 20 7d 0a 20  e_field;.    }. 
326d0 20 20 20 69 66 28 20 73 43 74 78 2e 69 6e 3d 3d     if( sCtx.in==
326e0 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  0 ){.      utf8_
326f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
32700 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
32710 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46  en \"%s\"\n", zF
32720 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ile);.      retu
32730 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
32740 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 3d 20 70  sCtx.cColSep = p
32750 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30  ->colSeparator[0
32760 5d 3b 0a 20 20 20 20 73 43 74 78 2e 63 52 6f 77  ];.    sCtx.cRow
32770 53 65 70 20 3d 20 70 2d 3e 72 6f 77 53 65 70 61  Sep = p->rowSepa
32780 72 61 74 6f 72 5b 30 5d 3b 0a 20 20 20 20 7a 53  rator[0];.    zS
32790 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
327a0 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46  intf("SELECT * F
327b0 52 4f 4d 20 25 73 22 2c 20 7a 54 61 62 6c 65 29  ROM %s", zTable)
327c0 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d  ;.    if( zSql==
327d0 30 20 29 7b 0a 20 20 20 20 20 20 78 43 6c 6f 73  0 ){.      xClos
327e0 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20  er(sCtx.in);.   
327f0 20 20 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f     shell_out_of_
32800 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a  memory();.    }.
32810 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c      nByte = strl
32820 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20  en30(zSql);.    
32830 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
32840 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
32850 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
32860 20 30 29 3b 0a 20 20 20 20 69 6d 70 6f 72 74 5f   0);.    import_
32870 61 70 70 65 6e 64 5f 63 68 61 72 28 26 73 43 74  append_char(&sCt
32880 78 2c 20 30 29 3b 20 20 20 20 2f 2a 20 54 6f 20  x, 0);    /* To 
32890 65 6e 73 75 72 65 20 73 43 74 78 2e 7a 20 69 73  ensure sCtx.z is
328a0 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
328b0 20 20 69 66 28 20 72 63 20 26 26 20 73 71 6c 69    if( rc && sqli
328c0 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 6e 6f 20  te3_strglob("no 
328d0 73 75 63 68 20 74 61 62 6c 65 3a 20 2a 22 2c 20  such table: *", 
328e0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
328f0 2d 3e 64 62 29 29 3d 3d 30 20 29 7b 0a 20 20 20  ->db))==0 ){.   
32900 20 20 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65     char *zCreate
32910 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
32920 74 66 28 22 43 52 45 41 54 45 20 54 41 42 4c 45  tf("CREATE TABLE
32930 20 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20   %s", zTable);. 
32940 20 20 20 20 20 63 68 61 72 20 63 53 65 70 20 3d       char cSep =
32950 20 27 28 27 3b 0a 20 20 20 20 20 20 77 68 69 6c   '(';.      whil
32960 65 28 20 78 52 65 61 64 28 26 73 43 74 78 29 20  e( xRead(&sCtx) 
32970 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 72 65 61  ){.        zCrea
32980 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  te = sqlite3_mpr
32990 69 6e 74 66 28 22 25 7a 25 63 5c 6e 20 20 5c 22  intf("%z%c\n  \"
329a0 25 77 5c 22 20 54 45 58 54 22 2c 20 7a 43 72 65  %w\" TEXT", zCre
329b0 61 74 65 2c 20 63 53 65 70 2c 20 73 43 74 78 2e  ate, cSep, sCtx.
329c0 7a 29 3b 0a 20 20 20 20 20 20 20 20 63 53 65 70  z);.        cSep
329d0 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20   = ',';.        
329e0 69 66 28 20 73 43 74 78 2e 63 54 65 72 6d 21 3d  if( sCtx.cTerm!=
329f0 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 20 62  sCtx.cColSep ) b
32a00 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
32a10 20 20 20 20 69 66 28 20 63 53 65 70 3d 3d 27 28      if( cSep=='(
32a20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ' ){.        sql
32a30 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61 74  ite3_free(zCreat
32a40 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
32a50 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29  te3_free(sCtx.z)
32a60 3b 0a 20 20 20 20 20 20 20 20 78 43 6c 6f 73 65  ;.        xClose
32a70 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20  r(sCtx.in);.    
32a80 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
32a90 73 74 64 65 72 72 2c 22 25 73 3a 20 65 6d 70 74  stderr,"%s: empt
32aa0 79 20 66 69 6c 65 5c 6e 22 2c 20 73 43 74 78 2e  y file\n", sCtx.
32ab0 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  zFile);.        
32ac0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
32ad0 7d 0a 20 20 20 20 20 20 7a 43 72 65 61 74 65 20  }.      zCreate 
32ae0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
32af0 66 28 22 25 7a 5c 6e 29 22 2c 20 7a 43 72 65 61  f("%z\n)", zCrea
32b00 74 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  te);.      rc = 
32b10 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
32b20 64 62 2c 20 7a 43 72 65 61 74 65 2c 20 30 2c 20  db, zCreate, 0, 
32b30 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
32b40 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61 74  ite3_free(zCreat
32b50 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
32b60 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
32b70 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
32b80 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 73  "CREATE TABLE %s
32b90 28 2e 2e 2e 29 20 66 61 69 6c 65 64 3a 20 25 73  (...) failed: %s
32ba0 5c 6e 22 2c 20 7a 54 61 62 6c 65 2c 0a 20 20 20  \n", zTable,.   
32bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
32bc0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
32bd0 62 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  b));.        sql
32be0 69 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a  ite3_free(sCtx.z
32bf0 29 3b 0a 20 20 20 20 20 20 20 20 78 43 6c 6f 73  );.        xClos
32c00 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20  er(sCtx.in);.   
32c10 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
32c20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
32c30 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
32c40 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
32c50 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
32c60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
32c70 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
32c80 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
32c90 20 20 20 20 69 66 20 28 70 53 74 6d 74 29 20 73      if (pStmt) s
32ca0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
32cb0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 75 74  pStmt);.      ut
32cc0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
32cd0 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20  ,"Error: %s\n", 
32ce0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
32cf0 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 78 43  ->db));.      xC
32d00 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a  loser(sCtx.in);.
32d10 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
32d20 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d      }.    nCol =
32d30 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
32d40 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
32d50 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
32d60 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70  ze(pStmt);.    p
32d70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  Stmt = 0;.    if
32d80 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  ( nCol==0 ) retu
32d90 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 63 6f 6c 75  rn 0; /* no colu
32da0 6d 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f  mns, no error */
32db0 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
32dc0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 42  te3_malloc64( nB
32dd0 79 74 65 2a 32 20 2b 20 32 30 20 2b 20 6e 43 6f  yte*2 + 20 + nCo
32de0 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  l*2 );.    if( z
32df0 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
32e00 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29  xCloser(sCtx.in)
32e10 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 6f 75  ;.      shell_ou
32e20 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20  t_of_memory();. 
32e30 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
32e40 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b  _snprintf(nByte+
32e50 32 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52  20, zSql, "INSER
32e60 54 20 49 4e 54 4f 20 5c 22 25 77 5c 22 20 56 41  T INTO \"%w\" VA
32e70 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29  LUES(?", zTable)
32e80 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e  ;.    j = strlen
32e90 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f  30(zSql);.    fo
32ea0 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=1; i<nCol; i
32eb0 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b  ++){.      zSql[
32ec0 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  j++] = ',';.    
32ed0 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f    zSql[j++] = '?
32ee0 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  ';.    }.    zSq
32ef0 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  l[j++] = ')';.  
32f00 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20    zSql[j] = 0;. 
32f10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
32f20 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
32f30 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
32f40 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mt, 0);.    sqli
32f50 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
32f60 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
32f70 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
32f80 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
32f90 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
32fa0 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
32fb0 20 20 20 20 20 69 66 20 28 70 53 74 6d 74 29 20       if (pStmt) 
32fc0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
32fd0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 78  (pStmt);.      x
32fe0 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b  Closer(sCtx.in);
32ff0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
33000 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 65 64 43  .    }.    needC
33010 6f 6d 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 5f  ommit = sqlite3_
33020 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 70  get_autocommit(p
33030 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20 6e  ->db);.    if( n
33040 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69  eedCommit ) sqli
33050 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
33060 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30  "BEGIN", 0, 0, 0
33070 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  );.    do{.     
33080 20 69 6e 74 20 73 74 61 72 74 4c 69 6e 65 20 3d   int startLine =
33090 20 73 43 74 78 2e 6e 4c 69 6e 65 3b 0a 20 20 20   sCtx.nLine;.   
330a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
330b0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
330c0 20 20 63 68 61 72 20 2a 7a 20 3d 20 78 52 65 61    char *z = xRea
330d0 64 28 26 73 43 74 78 29 3b 0a 20 20 20 20 20 20  d(&sCtx);.      
330e0 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    /*.        ** 
330f0 44 69 64 20 77 65 20 72 65 61 63 68 20 65 6e 64  Did we reach end
33100 2d 6f 66 2d 66 69 6c 65 20 62 65 66 6f 72 65 20  -of-file before 
33110 66 69 6e 64 69 6e 67 20 61 6e 79 20 63 6f 6c 75  finding any colu
33120 6d 6e 73 3f 0a 20 20 20 20 20 20 20 20 2a 2a 20  mns?.        ** 
33130 49 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74  If so, stop inst
33140 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c  ead of NULL fill
33150 69 6e 67 20 74 68 65 20 72 65 6d 61 69 6e 69 6e  ing the remainin
33160 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 20  g columns..     
33170 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
33180 28 20 7a 3d 3d 30 20 26 26 20 69 3d 3d 30 20 29  ( z==0 && i==0 )
33190 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
331a0 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 69  /*.        ** Di
331b0 64 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d 6f  d we reach end-o
331c0 66 2d 66 69 6c 65 20 4f 52 20 65 6e 64 2d 6f 66  f-file OR end-of
331d0 2d 6c 69 6e 65 20 62 65 66 6f 72 65 20 66 69 6e  -line before fin
331e0 64 69 6e 67 20 61 6e 79 0a 20 20 20 20 20 20 20  ding any.       
331f0 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 41   ** columns in A
33200 53 43 49 49 20 6d 6f 64 65 3f 20 20 49 66 20 73  SCII mode?  If s
33210 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65 61 64 20  o, stop instead 
33220 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67 0a  of NULL filling.
33230 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72          ** the r
33240 65 6d 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 73  emaining columns
33250 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
33260 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65       if( p->mode
33270 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20 26 26 20  ==MODE_Ascii && 
33280 28 7a 3d 3d 30 20 7c 7c 20 7a 5b 30 5d 3d 3d 30  (z==0 || z[0]==0
33290 29 20 26 26 20 69 3d 3d 30 20 29 20 62 72 65 61  ) && i==0 ) brea
332a0 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  k;.        sqlit
332b0 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
332c0 6d 74 2c 20 69 2b 31 2c 20 7a 2c 20 2d 31 2c 20  mt, i+1, z, -1, 
332d0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
332e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
332f0 3c 6e 43 6f 6c 2d 31 20 26 26 20 73 43 74 78 2e  <nCol-1 && sCtx.
33300 63 54 65 72 6d 21 3d 73 43 74 78 2e 63 43 6f 6c  cTerm!=sCtx.cCol
33310 53 65 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sep ){.         
33320 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
33330 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 65 78 70  err, "%s:%d: exp
33340 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73  ected %d columns
33350 20 62 75 74 20 66 6f 75 6e 64 20 25 64 20 2d 20   but found %d - 
33360 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
33370 20 20 20 20 20 20 20 20 20 20 20 20 22 66 69 6c              "fil
33380 6c 69 6e 67 20 74 68 65 20 72 65 73 74 20 77 69  ling the rest wi
33390 74 68 20 4e 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20  th NULL\n",.    
333a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
333b0 20 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65        sCtx.zFile
333c0 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e 43 6f  , startLine, nCo
333d0 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20  l, i+1);.       
333e0 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20     i += 2;.     
333f0 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c 3d 6e       while( i<=n
33400 43 6f 6c 20 29 7b 20 73 71 6c 69 74 65 33 5f 62  Col ){ sqlite3_b
33410 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
33420 69 29 3b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20  i); i++; }.     
33430 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33440 20 20 20 69 66 28 20 73 43 74 78 2e 63 54 65 72     if( sCtx.cTer
33450 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20  m==sCtx.cColSep 
33460 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20  ){.        do{. 
33470 20 20 20 20 20 20 20 20 20 78 52 65 61 64 28 26           xRead(&
33480 73 43 74 78 29 3b 0a 20 20 20 20 20 20 20 20 20  sCtx);.         
33490 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 77   i++;.        }w
334a0 68 69 6c 65 28 20 73 43 74 78 2e 63 54 65 72 6d  hile( sCtx.cTerm
334b0 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29  ==sCtx.cColSep )
334c0 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  ;.        utf8_p
334d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
334e0 73 3a 25 64 3a 20 65 78 70 65 63 74 65 64 20 25  s:%d: expected %
334f0 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 66 6f  d columns but fo
33500 75 6e 64 20 25 64 20 2d 20 22 0a 20 20 20 20 20  und %d - ".     
33510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33520 20 20 20 22 65 78 74 72 61 73 20 69 67 6e 6f 72     "extras ignor
33530 65 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ed\n",.         
33540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
33550 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61 72 74  Ctx.zFile, start
33560 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 29 3b 0a  Line, nCol, i);.
33570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
33580 28 20 69 3e 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20  ( i>=nCol ){.   
33590 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65       sqlite3_ste
335a0 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  p(pStmt);.      
335b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
335c0 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
335d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
335e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
335f0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
33600 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20  stderr, "%s:%d: 
33610 49 4e 53 45 52 54 20 66 61 69 6c 65 64 3a 20 25  INSERT failed: %
33620 73 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69 6c 65  s\n", sCtx.zFile
33630 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
33640 20 20 20 20 20 20 20 20 73 74 61 72 74 4c 69 6e          startLin
33650 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  e, sqlite3_errms
33660 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
33670 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33680 20 7d 77 68 69 6c 65 28 20 73 43 74 78 2e 63 54   }while( sCtx.cT
33690 65 72 6d 21 3d 45 4f 46 20 29 3b 0a 0a 20 20 20  erm!=EOF );..   
336a0 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e   xCloser(sCtx.in
336b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
336c0 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20  ree(sCtx.z);.   
336d0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
336e0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  e(pStmt);.    if
336f0 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20 73  ( needCommit ) s
33700 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
33710 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20  b, "COMMIT", 0, 
33720 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  0, 0);.  }else..
33730 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 55  #ifndef SQLITE_U
33740 4e 54 45 53 54 41 42 4c 45 0a 20 20 69 66 28 20  NTESTABLE.  if( 
33750 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d  c=='i' && strncm
33760 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70  p(azArg[0], "imp
33770 6f 73 74 65 72 22 2c 20 6e 29 3d 3d 30 20 29 7b  oster", n)==0 ){
33780 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  .    char *zSql;
33790 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  .    char *zColl
337a0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ist = 0;.    sql
337b0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
337c0 3b 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d 20 3d  ;.    int tnum =
337d0 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   0;.    int i;. 
337e0 20 20 20 69 66 28 20 21 28 6e 41 72 67 3d 3d 33     if( !(nArg==3
337f0 20 7c 7c 20 28 6e 41 72 67 3d 3d 32 20 26 26 20   || (nArg==2 && 
33800 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
33810 61 7a 41 72 67 5b 31 5d 2c 22 6f 66 66 22 29 3d  azArg[1],"off")=
33820 3d 30 29 29 20 29 7b 0a 20 20 20 20 20 20 75 74  =0)) ){.      ut
33830 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
33840 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f 73  , "Usage: .impos
33850 74 65 72 20 49 4e 44 45 58 20 49 4d 50 4f 53 54  ter INDEX IMPOST
33860 45 52 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  ER\n".          
33870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33880 22 20 20 20 20 20 20 20 2e 69 6d 70 6f 73 74 65  "       .imposte
33890 72 20 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20  r off\n");.     
338a0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
338b0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
338c0 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
338d0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
338e0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
338f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
33900 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
33910 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
33920 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22  POSTER, p->db, "
33930 6d 61 69 6e 22 2c 20 30 2c 20 31 29 3b 0a 20 20  main", 0, 1);.  
33940 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
33950 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
33960 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  }.    zSql = sql
33970 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
33980 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52  LECT rootpage FR
33990 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
339a0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
339b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
339c0 48 45 52 45 20 6e 61 6d 65 3d 27 25 71 27 20 41  HERE name='%q' A
339d0 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22  ND type='index'"
339e0 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
339f0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
33a00 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
33a10 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
33a20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
33a30 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(zSql);.    if(
33a40 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
33a50 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
33a60 20 29 7b 0a 20 20 20 20 20 20 74 6e 75 6d 20 3d   ){.      tnum =
33a70 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
33a80 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  int(pStmt, 0);. 
33a90 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
33aa0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
33ab0 3b 0a 20 20 20 20 69 66 28 20 74 6e 75 6d 3d 3d  ;.    if( tnum==
33ac0 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  0 ){.      utf8_
33ad0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
33ae0 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 5c  no such index: \
33af0 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  "%s\"\n", azArg[
33b00 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  1]);.      rc = 
33b10 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
33b20 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
33b30 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
33b40 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
33b50 66 28 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f  f("PRAGMA index_
33b60 78 69 6e 66 6f 3d 27 25 71 27 22 2c 20 61 7a 41  xinfo='%q'", azA
33b70 72 67 5b 31 5d 29 3b 0a 20 20 20 20 72 63 20 3d  rg[1]);.    rc =
33b80 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
33b90 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
33ba0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
33bb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
33bc0 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 20 3d  e(zSql);.    i =
33bd0 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73   0;.    while( s
33be0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
33bf0 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
33c00 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4c 61  {.      char zLa
33c10 62 65 6c 5b 32 30 5d 3b 0a 20 20 20 20 20 20 63  bel[20];.      c
33c20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20  onst char *zCol 
33c30 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
33c40 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
33c50 78 74 28 70 53 74 6d 74 2c 32 29 3b 0a 20 20 20  xt(pStmt,2);.   
33c60 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66     i++;.      if
33c70 28 20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zCol==0 ){.   
33c80 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
33c90 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
33ca0 74 2c 31 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  t,1)==-1 ){.    
33cb0 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52        zCol = "_R
33cc0 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20 20 20 20  OWID_";.        
33cd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
33ce0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
33cf0 66 28 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29  f(sizeof(zLabel)
33d00 2c 7a 4c 61 62 65 6c 2c 22 65 78 70 72 25 64 22  ,zLabel,"expr%d"
33d10 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ,i);.          z
33d20 43 6f 6c 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20  Col = zLabel;.  
33d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33d40 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 69        if( zColli
33d50 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
33d60 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c 69   zCollist = sqli
33d70 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25  te3_mprintf("\"%
33d80 77 5c 22 22 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  w\"", zCol);.   
33d90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33da0 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c    zCollist = sql
33db0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
33dc0 2c 5c 22 25 77 5c 22 22 2c 20 7a 43 6f 6c 6c 69  ,\"%w\"", zColli
33dd0 73 74 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  st, zCol);.     
33de0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
33df0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
33e00 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d  tmt);.    zSql =
33e10 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
33e20 28 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45  (.          "CRE
33e30 41 54 45 20 54 41 42 4c 45 20 5c 22 25 77 5c 22  ATE TABLE \"%w\"
33e40 28 25 73 2c 50 52 49 4d 41 52 59 20 4b 45 59 28  (%s,PRIMARY KEY(
33e50 25 73 29 29 57 49 54 48 4f 55 54 20 52 4f 57 49  %s))WITHOUT ROWI
33e60 44 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61 7a  D",.          az
33e70 41 72 67 5b 32 5d 2c 20 7a 43 6f 6c 6c 69 73 74  Arg[2], zCollist
33e80 2c 20 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20  , zCollist);.   
33e90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
33ea0 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 72 63 20  ollist);.    rc 
33eb0 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  = sqlite3_test_c
33ec0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
33ed0 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c  STCTRL_IMPOSTER,
33ee0 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20   p->db, "main", 
33ef0 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 69 66  1, tnum);.    if
33f00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33f10 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
33f20 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
33f30 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29  , zSql, 0, 0, 0)
33f40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
33f50 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
33f60 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
33f70 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d  OSTER, p->db, "m
33f80 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ain", 0, 0);.   
33f90 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
33fa0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
33fb0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20  (stderr, "Error 
33fc0 69 6e 20 5b 25 73 5d 3a 20 25 73 5c 6e 22 2c 20  in [%s]: %s\n", 
33fd0 7a 53 71 6c 2c 20 73 71 6c 69 74 65 33 5f 65 72  zSql, sqlite3_er
33fe0 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
33ff0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34000 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
34010 74 64 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20  tdout, "%s;\n", 
34020 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72  zSql);.        r
34030 61 77 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74  aw_printf(stdout
34040 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 57 41  ,.           "WA
34050 52 4e 49 4e 47 3a 20 77 72 69 74 69 6e 67 20 74  RNING: writing t
34060 6f 20 61 6e 20 69 6d 70 6f 73 74 65 72 20 74 61  o an imposter ta
34070 62 6c 65 20 77 69 6c 6c 20 63 6f 72 72 75 70 74  ble will corrupt
34080 20 74 68 65 20 69 6e 64 65 78 21 5c 6e 22 0a 20   the index!\n". 
34090 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
340a0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
340b0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
340c0 64 65 72 72 2c 20 22 53 51 4c 49 54 45 5f 54 45  derr, "SQLITE_TE
340d0 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 20  STCTRL_IMPOSTER 
340e0 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72  returns %d\n", r
340f0 63 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  c);.      rc = 1
34100 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
34110 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
34120 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
34130 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
34140 45 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54  E_OMIT_TEST_CONT
34150 52 4f 4c 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ROL) */..#ifdef 
34160 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
34170 54 52 41 43 45 0a 20 20 69 66 28 20 63 3d 3d 27  TRACE.  if( c=='
34180 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  i' && strncmp(az
34190 41 72 67 5b 30 5d 2c 20 22 69 6f 74 72 61 63 65  Arg[0], "iotrace
341a0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
341b0 53 51 4c 49 54 45 5f 41 50 49 20 65 78 74 65 72  SQLITE_API exter
341c0 6e 20 76 6f 69 64 20 28 53 51 4c 49 54 45 5f 43  n void (SQLITE_C
341d0 44 45 43 4c 20 2a 73 71 6c 69 74 65 33 49 6f 54  DECL *sqlite3IoT
341e0 72 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72  race)(const char
341f0 2a 2c 20 2e 2e 2e 29 3b 0a 20 20 20 20 69 66 28  *, ...);.    if(
34200 20 69 6f 74 72 61 63 65 20 26 26 20 69 6f 74 72   iotrace && iotr
34210 61 63 65 21 3d 73 74 64 6f 75 74 20 29 20 66 63  ace!=stdout ) fc
34220 6c 6f 73 65 28 69 6f 74 72 61 63 65 29 3b 0a 20  lose(iotrace);. 
34230 20 20 20 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a     iotrace = 0;.
34240 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29      if( nArg<2 )
34250 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
34260 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  oTrace = 0;.    
34270 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
34280 28 61 7a 41 72 67 5b 31 5d 2c 20 22 2d 22 29 3d  (azArg[1], "-")=
34290 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
342a0 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 74  te3IoTrace = iot
342b0 72 61 63 65 50 72 69 6e 74 66 3b 0a 20 20 20 20  racePrintf;.    
342c0 20 20 69 6f 74 72 61 63 65 20 3d 20 73 74 64 6f    iotrace = stdo
342d0 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ut;.    }else{. 
342e0 20 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20 66       iotrace = f
342f0 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22  open(azArg[1], "
34300 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  w");.      if( i
34310 6f 74 72 61 63 65 3d 3d 30 20 29 7b 0a 20 20 20  otrace==0 ){.   
34320 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
34330 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
34340 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
34350 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d  s\"\n", azArg[1]
34360 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
34370 65 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20  e3IoTrace = 0;. 
34380 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
34390 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
343a0 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
343b0 63 65 20 3d 20 69 6f 74 72 61 63 65 50 72 69 6e  ce = iotracePrin
343c0 74 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  tf;.      }.    
343d0 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
343e0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26  ..  if( c=='l' &
343f0 26 20 6e 3e 3d 35 20 26 26 20 73 74 72 6e 63 6d  & n>=5 && strncm
34400 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6d  p(azArg[0], "lim
34410 69 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  its", n)==0 ){. 
34420 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
34430 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20  struct {.       
34440 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6d  const char *zLim
34450 69 74 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d  itName;   /* Nam
34460 65 20 6f 66 20 61 20 6c 69 6d 69 74 20 2a 2f 0a  e of a limit */.
34470 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74         int limit
34480 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
34490 20 2f 2a 20 49 6e 74 65 67 65 72 20 63 6f 64 65   /* Integer code
344a0 20 66 6f 72 20 74 68 61 74 20 6c 69 6d 69 74 20   for that limit 
344b0 2a 2f 0a 20 20 20 20 7d 20 61 4c 69 6d 69 74 5b  */.    } aLimit[
344c0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 6c  ] = {.      { "l
344d0 65 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20 20  ength",         
344e0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
344f0 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20 20 20 20  MIT_LENGTH      
34500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
34510 0a 20 20 20 20 20 20 7b 20 22 73 71 6c 5f 6c 65  .      { "sql_le
34520 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20 20 20  ngth",          
34530 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53    SQLITE_LIMIT_S
34540 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20  QL_LENGTH       
34550 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
34560 20 20 7b 20 22 63 6f 6c 75 6d 6e 22 2c 20 20 20    { "column",   
34570 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
34580 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
34590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345a0 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
345b0 65 78 70 72 5f 64 65 70 74 68 22 2c 20 20 20 20  expr_depth",    
345c0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
345d0 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 20  IMIT_EXPR_DEPTH 
345e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
345f0 2c 0a 20 20 20 20 20 20 7b 20 22 63 6f 6d 70 6f  ,.      { "compo
34600 75 6e 64 5f 73 65 6c 65 63 74 22 2c 20 20 20 20  und_select",    
34610 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
34620 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
34630 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
34640 20 20 20 7b 20 22 76 64 62 65 5f 6f 70 22 2c 20     { "vdbe_op", 
34650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
34660 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f  LITE_LIMIT_VDBE_
34670 4f 50 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OP              
34680 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
34690 22 66 75 6e 63 74 69 6f 6e 5f 61 72 67 22 2c 20  "function_arg", 
346a0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
346b0 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41  LIMIT_FUNCTION_A
346c0 52 47 20 20 20 20 20 20 20 20 20 20 20 20 20 20  RG              
346d0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 61 74 74 61  },.      { "atta
346e0 63 68 65 64 22 2c 20 20 20 20 20 20 20 20 20 20  ched",          
346f0 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
34700 5f 41 54 54 41 43 48 45 44 20 20 20 20 20 20 20  _ATTACHED       
34710 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
34720 20 20 20 20 7b 20 22 6c 69 6b 65 5f 70 61 74 74      { "like_patt
34730 65 72 6e 5f 6c 65 6e 67 74 68 22 2c 20 20 20 53  ern_length",   S
34740 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
34750 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
34760 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
34770 20 22 76 61 72 69 61 62 6c 65 5f 6e 75 6d 62 65   "variable_numbe
34780 72 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45  r",       SQLITE
34790 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
347a0 4e 55 4d 42 45 52 20 20 20 20 20 20 20 20 20 20  NUMBER          
347b0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 74 72 69   },.      { "tri
347c0 67 67 65 72 5f 64 65 70 74 68 22 2c 20 20 20 20  gger_depth",    
347d0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
347e0 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  T_TRIGGER_DEPTH 
347f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
34800 20 20 20 20 20 7b 20 22 77 6f 72 6b 65 72 5f 74       { "worker_t
34810 68 72 65 61 64 73 22 2c 20 20 20 20 20 20 20 20  hreads",        
34820 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
34830 4b 45 52 5f 54 48 52 45 41 44 53 20 20 20 20 20  KER_THREADS     
34840 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b         },.    };
34850 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 32 3b 0a  .    int i, n2;.
34860 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
34870 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  );.    if( nArg=
34880 3d 31 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =1 ){.      for(
34890 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
348a0 28 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a  (aLimit); i++){.
348b0 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
348c0 25 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c 69 6d  %20s %d\n", aLim
348d0 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65  it[i].zLimitName
348e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
348f0 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70   sqlite3_limit(p
34900 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e  ->db, aLimit[i].
34910 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29 3b  limitCode, -1));
34920 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
34930 73 65 20 69 66 28 20 6e 41 72 67 3e 33 20 29 7b  se if( nArg>3 ){
34940 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
34950 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
34960 3a 20 2e 6c 69 6d 69 74 20 4e 41 4d 45 20 3f 4e  : .limit NAME ?N
34970 45 57 2d 56 41 4c 55 45 3f 5c 6e 22 29 3b 0a 20  EW-VALUE?\n");. 
34980 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
34990 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
349a0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
349b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
349c0 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20  iLimit = -1;.   
349d0 20 20 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30     n2 = strlen30
349e0 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20  (azArg[1]);.    
349f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
34a00 61 79 53 69 7a 65 28 61 4c 69 6d 69 74 29 3b 20  aySize(aLimit); 
34a10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
34a20 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ( sqlite3_strnic
34a30 6d 70 28 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69  mp(aLimit[i].zLi
34a40 6d 69 74 4e 61 6d 65 2c 20 61 7a 41 72 67 5b 31  mitName, azArg[1
34a50 5d 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  ], n2)==0 ){.   
34a60 20 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d 69         if( iLimi
34a70 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  t<0 ){.         
34a80 20 20 20 69 4c 69 6d 69 74 20 3d 20 69 3b 0a 20     iLimit = i;. 
34a90 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
34aa0 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
34ab0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
34ac0 22 61 6d 62 69 67 75 6f 75 73 20 6c 69 6d 69 74  "ambiguous limit
34ad0 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41  : \"%s\"\n", azA
34ae0 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[1]);.        
34af0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
34b00 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
34b10 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
34b20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
34b30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
34b40 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 30      if( iLimit<0
34b50 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
34b60 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
34b70 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 3a 20  "unknown limit: 
34b80 5c 22 25 73 5c 22 5c 6e 22 0a 20 20 20 20 20 20  \"%s\"\n".      
34b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ba0 20 20 22 65 6e 74 65 72 20 5c 22 2e 6c 69 6d 69    "enter \".limi
34bb0 74 73 5c 22 20 77 69 74 68 20 6e 6f 20 61 72 67  ts\" with no arg
34bc0 75 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c 69 73  uments for a lis
34bd0 74 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  t.\n",.         
34be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34bf0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
34c00 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
34c10 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
34c20 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
34c30 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72   }.      if( nAr
34c40 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  g==3 ){.        
34c50 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d  sqlite3_limit(p-
34c60 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d  >db, aLimit[iLim
34c70 69 74 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 0a 20  it].limitCode,. 
34c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c90 20 20 20 20 20 28 69 6e 74 29 69 6e 74 65 67 65       (int)intege
34ca0 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29  rValue(azArg[2])
34cb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
34cc0 20 70 72 69 6e 74 66 28 22 25 32 30 73 20 25 64   printf("%20s %d
34cd0 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d  \n", aLimit[iLim
34ce0 69 74 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a  it].zLimitName,.
34cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
34d00 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62  ite3_limit(p->db
34d10 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d  , aLimit[iLimit]
34d20 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29  .limitCode, -1))
34d30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
34d40 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26  .  if( c=='l' &&
34d50 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28   n>2 && strncmp(
34d60 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6e 74 22  azArg[0], "lint"
34d70 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  , n)==0 ){.    o
34d80 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
34d90 20 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64    lintDotCommand
34da0 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29  (p, azArg, nArg)
34db0 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64  ;.  }else..#ifnd
34dc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
34dd0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
34de0 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 73 74  if( c=='l' && st
34df0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
34e00 22 6c 6f 61 64 22 2c 20 6e 29 3d 3d 30 20 29 7b  "load", n)==0 ){
34e10 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
34e20 2a 7a 46 69 6c 65 2c 20 2a 7a 50 72 6f 63 3b 0a  *zFile, *zProc;.
34e30 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73      char *zErrMs
34e40 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e  g = 0;.    if( n
34e50 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  Arg<2 ){.      r
34e60 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
34e70 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f 61 64 20  , "Usage: .load 
34e80 46 49 4c 45 20 3f 45 4e 54 52 59 50 4f 49 4e 54  FILE ?ENTRYPOINT
34e90 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  ?\n");.      rc 
34ea0 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
34eb0 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
34ec0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69  t;.    }.    zFi
34ed0 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  le = azArg[1];. 
34ee0 20 20 20 7a 50 72 6f 63 20 3d 20 6e 41 72 67 3e     zProc = nArg>
34ef0 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a 20  =3 ? azArg[2] : 
34f00 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  0;.    open_db(p
34f10 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  , 0);.    rc = s
34f20 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65  qlite3_load_exte
34f30 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 7a 46 69  nsion(p->db, zFi
34f40 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72  le, zProc, &zErr
34f50 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Msg);.    if( rc
34f60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34f70 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
34f80 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
34f90 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29   %s\n", zErrMsg)
34fa0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
34fb0 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
34fc0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
34fd0 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
34fe0 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20  f..  if( c=='l' 
34ff0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
35000 5b 30 5d 2c 20 22 6c 6f 67 22 2c 20 6e 29 3d 3d  [0], "log", n)==
35010 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
35020 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=2 ){.      ra
35030 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
35040 20 22 55 73 61 67 65 3a 20 2e 6c 6f 67 20 46 49   "Usage: .log FI
35050 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20  LENAME\n");.    
35060 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65    rc = 1;.    }e
35070 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  lse{.      const
35080 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 61   char *zFile = a
35090 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 6f  zArg[1];.      o
350a0 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65  utput_file_close
350b0 28 70 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20 20 20  (p->pLog);.     
350c0 20 70 2d 3e 70 4c 6f 67 20 3d 20 6f 75 74 70 75   p->pLog = outpu
350d0 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a 46 69 6c  t_file_open(zFil
350e0 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 0);.    }.  }
350f0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
35100 6d 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  m' && strncmp(az
35110 41 72 67 5b 30 5d 2c 20 22 6d 6f 64 65 22 2c 20  Arg[0], "mode", 
35120 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  n)==0 ){.    con
35130 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d  st char *zMode =
35140 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67   nArg>=2 ? azArg
35150 5b 31 5d 20 3a 20 22 22 3b 0a 20 20 20 20 69 6e  [1] : "";.    in
35160 74 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30 28  t n2 = strlen30(
35170 7a 4d 6f 64 65 29 3b 0a 20 20 20 20 69 6e 74 20  zMode);.    int 
35180 63 32 20 3d 20 7a 4d 6f 64 65 5b 30 5d 3b 0a 20  c2 = zMode[0];. 
35190 20 20 20 69 66 28 20 63 32 3d 3d 27 6c 27 20 26     if( c2=='l' &
351a0 26 20 6e 32 3e 32 20 26 26 20 73 74 72 6e 63 6d  & n2>2 && strncm
351b0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e 65  p(azArg[1],"line
351c0 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  s",n2)==0 ){.   
351d0 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
351e0 45 5f 4c 69 6e 65 3b 0a 20 20 20 20 20 20 73 71  E_Line;.      sq
351f0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
35200 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
35210 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65  rator), p->rowSe
35220 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77  parator, SEP_Row
35230 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
35240 20 63 32 3d 3d 27 63 27 20 26 26 20 73 74 72 6e   c2=='c' && strn
35250 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 6f  cmp(azArg[1],"co
35260 6c 75 6d 6e 73 22 2c 6e 32 29 3d 3d 30 20 29 7b  lumns",n2)==0 ){
35270 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
35280 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20   MODE_Column;.  
35290 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
352a0 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
352b0 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
352c0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
352d0 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c  EP_Row);.    }el
352e0 73 65 20 69 66 28 20 63 32 3d 3d 27 6c 27 20 26  se if( c2=='l' &
352f0 26 20 6e 32 3e 32 20 26 26 20 73 74 72 6e 63 6d  & n2>2 && strncm
35300 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 73 74  p(azArg[1],"list
35310 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
35320 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
35330 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  _List;.      sql
35340 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
35350 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72  zeof(p->colSepar
35360 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70  ator), p->colSep
35370 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6c 75  arator, SEP_Colu
35380 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  mn);.      sqlit
35390 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
353a0 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
353b0 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
353c0 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a  ator, SEP_Row);.
353d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
353e0 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70  =='h' && strncmp
353f0 28 61 7a 41 72 67 5b 31 5d 2c 22 68 74 6d 6c 22  (azArg[1],"html"
35400 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
35410 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
35420 48 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Html;.    }else 
35430 69 66 28 20 63 32 3d 3d 27 74 27 20 26 26 20 73  if( c2=='t' && s
35440 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
35450 22 74 63 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  "tcl",n2)==0 ){.
35460 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
35470 4d 4f 44 45 5f 54 63 6c 3b 0a 20 20 20 20 20 20  MODE_Tcl;.      
35480 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
35490 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65  (sizeof(p->colSe
354a0 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c  parator), p->col
354b0 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 53  Separator, SEP_S
354c0 70 61 63 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  pace);.      sql
354d0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
354e0 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
354f0 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70  ator), p->rowSep
35500 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29  arator, SEP_Row)
35510 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
35520 63 32 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63  c2=='c' && strnc
35530 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 73 76  mp(azArg[1],"csv
35540 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
35550 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
35560 5f 43 73 76 3b 0a 20 20 20 20 20 20 73 71 6c 69  _Csv;.      sqli
35570 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
35580 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  eof(p->colSepara
35590 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  tor), p->colSepa
355a0 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6d 6d 61  rator, SEP_Comma
355b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
355c0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
355d0 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
355e0 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ), p->rowSeparat
355f0 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29 3b 0a 20  or, SEP_CrLf);. 
35600 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
35610 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='t' && strncmp(
35620 61 7a 41 72 67 5b 31 5d 2c 22 74 61 62 73 22 2c  azArg[1],"tabs",
35630 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
35640 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c  p->mode = MODE_L
35650 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ist;.      sqlit
35660 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
35670 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  of(p->colSeparat
35680 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  or), p->colSepar
35690 61 74 6f 72 2c 20 53 45 50 5f 54 61 62 29 3b 0a  ator, SEP_Tab);.
356a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
356b0 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70  =='i' && strncmp
356c0 28 61 7a 41 72 67 5b 31 5d 2c 22 69 6e 73 65 72  (azArg[1],"inser
356d0 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  t",n2)==0 ){.   
356e0 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
356f0 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20  E_Insert;.      
35700 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70  set_table_name(p
35710 2c 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72  , nArg>=3 ? azAr
35720 67 5b 32 5d 20 3a 20 22 74 61 62 6c 65 22 29 3b  g[2] : "table");
35730 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
35740 32 3d 3d 27 71 27 20 26 26 20 73 74 72 6e 63 6d  2=='q' && strncm
35750 70 28 61 7a 41 72 67 5b 31 5d 2c 22 71 75 6f 74  p(azArg[1],"quot
35760 65 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  e",n2)==0 ){.   
35770 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
35780 45 5f 51 75 6f 74 65 3b 0a 20 20 20 20 7d 65 6c  E_Quote;.    }el
35790 73 65 20 69 66 28 20 63 32 3d 3d 27 61 27 20 26  se if( c2=='a' &
357a0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
357b0 31 5d 2c 22 61 73 63 69 69 22 2c 6e 32 29 3d 3d  1],"ascii",n2)==
357c0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
357d0 64 65 20 3d 20 4d 4f 44 45 5f 41 73 63 69 69 3b  de = MODE_Ascii;
357e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
357f0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
35800 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c  ->colSeparator),
35810 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
35820 2c 20 53 45 50 5f 55 6e 69 74 29 3b 0a 20 20 20  , SEP_Unit);.   
35830 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
35840 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f  ntf(sizeof(p->ro
35850 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  wSeparator), p->
35860 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45  rowSeparator, SE
35870 50 5f 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 7d  P_Record);.    }
35880 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d 3d 31  else if( nArg==1
35890 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
358a0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 63 75  intf(p->out, "cu
358b0 72 72 65 6e 74 20 6f 75 74 70 75 74 20 6d 6f 64  rrent output mod
358c0 65 3a 20 25 73 5c 6e 22 2c 20 6d 6f 64 65 44 65  e: %s\n", modeDe
358d0 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b 0a 20  scr[p->mode]);. 
358e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
358f0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
35900 72 2c 20 22 45 72 72 6f 72 3a 20 6d 6f 64 65 20  r, "Error: mode 
35910 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66  should be one of
35920 3a 20 22 0a 20 20 20 20 20 20 20 20 20 22 61 73  : ".         "as
35930 63 69 69 20 63 6f 6c 75 6d 6e 20 63 73 76 20 68  cii column csv h
35940 74 6d 6c 20 69 6e 73 65 72 74 20 6c 69 6e 65 20  tml insert line 
35950 6c 69 73 74 20 71 75 6f 74 65 20 74 61 62 73 20  list quote tabs 
35960 74 63 6c 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  tcl\n");.      r
35970 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 1;.    }.   
35980 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d   p->cMode = p->m
35990 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  ode;.  }else..  
359a0 69 66 28 20 63 3d 3d 27 6e 27 20 26 26 20 73 74  if( c=='n' && st
359b0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
359c0 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 6e 29 3d  "nullvalue", n)=
359d0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
359e0 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73  rg==2 ){.      s
359f0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
35a00 73 69 7a 65 6f 66 28 70 2d 3e 6e 75 6c 6c 56 61  sizeof(p->nullVa
35a10 6c 75 65 29 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c  lue), p->nullVal
35a20 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue,.            
35a30 20 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73             "%.*s
35a40 22 2c 20 28 69 6e 74 29 41 72 72 61 79 53 69 7a  ", (int)ArraySiz
35a50 65 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 2d  e(p->nullValue)-
35a60 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  1, azArg[1]);.  
35a70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
35a80 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
35a90 2c 20 22 55 73 61 67 65 3a 20 2e 6e 75 6c 6c 76  , "Usage: .nullv
35aa0 61 6c 75 65 20 53 54 52 49 4e 47 5c 6e 22 29 3b  alue STRING\n");
35ab0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
35ac0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
35ad0 69 66 28 20 63 3d 3d 27 6f 27 20 26 26 20 73 74  if( c=='o' && st
35ae0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
35af0 22 6f 70 65 6e 22 2c 20 6e 29 3d 3d 30 20 26 26  "open", n)==0 &&
35b00 20 6e 3e 3d 32 20 29 7b 0a 20 20 20 20 63 68 61   n>=2 ){.    cha
35b10 72 20 2a 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b  r *zNewFilename;
35b20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
35b30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
35b40 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  o open */.    in
35b50 74 20 69 4e 61 6d 65 20 3d 20 31 3b 20 20 20 20  t iName = 1;    
35b60 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
35b70 7a 41 72 67 5b 5d 20 6f 66 20 74 68 65 20 66 69  zArg[] of the fi
35b80 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 6e  lename */.    in
35b90 74 20 6e 65 77 46 6c 61 67 20 3d 20 30 3b 20 20  t newFlag = 0;  
35ba0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65     /* True to de
35bb0 6c 65 74 65 20 66 69 6c 65 20 62 65 66 6f 72 65  lete file before
35bc0 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 20 20   opening */.    
35bd0 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 65 78 69  /* Close the exi
35be0 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 2a  sting database *
35bf0 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c  /.    session_cl
35c00 6f 73 65 5f 61 6c 6c 28 70 29 3b 0a 20 20 20 20  ose_all(p);.    
35c10 63 6c 6f 73 65 5f 64 62 28 70 2d 3e 64 62 29 3b  close_db(p->db);
35c20 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a  .    p->db = 0;.
35c30 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61      p->zDbFilena
35c40 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  me = 0;.    sqli
35c50 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 46 72 65  te3_free(p->zFre
35c60 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 20 20 70  eOnClose);.    p
35c70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d  ->zFreeOnClose =
35c80 20 30 3b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 4d   0;.    p->openM
35c90 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e  ode = SHELL_OPEN
35ca0 5f 55 4e 53 50 45 43 3b 0a 20 20 20 20 70 2d 3e  _UNSPEC;.    p->
35cb0 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 2f  szMax = 0;.    /
35cc0 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 6d  * Check for comm
35cd0 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e  and-line argumen
35ce0 74 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 4e  ts */.    for(iN
35cf0 61 6d 65 3d 31 3b 20 69 4e 61 6d 65 3c 6e 41 72  ame=1; iName<nAr
35d00 67 20 26 26 20 61 7a 41 72 67 5b 69 4e 61 6d 65  g && azArg[iName
35d10 5d 5b 30 5d 3d 3d 27 2d 27 3b 20 69 4e 61 6d 65  ][0]=='-'; iName
35d20 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ++){.      const
35d30 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67   char *z = azArg
35d40 5b 69 4e 61 6d 65 5d 3b 0a 20 20 20 20 20 20 69  [iName];.      i
35d50 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a  f( optionMatch(z
35d60 2c 22 6e 65 77 22 29 20 29 7b 0a 20 20 20 20 20  ,"new") ){.     
35d70 20 20 20 6e 65 77 46 6c 61 67 20 3d 20 31 3b 0a     newFlag = 1;.
35d80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
35d90 56 45 5f 5a 4c 49 42 0a 20 20 20 20 20 20 7d 65  VE_ZLIB.      }e
35da0 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61  lse if( optionMa
35db0 74 63 68 28 7a 2c 20 22 7a 69 70 22 29 20 29 7b  tch(z, "zip") ){
35dc0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e  .        p->open
35dd0 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45  Mode = SHELL_OPE
35de0 4e 5f 5a 49 50 46 49 4c 45 3b 0a 23 65 6e 64 69  N_ZIPFILE;.#endi
35df0 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
35e00 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c  ( optionMatch(z,
35e10 20 22 61 70 70 65 6e 64 22 29 20 29 7b 0a 20 20   "append") ){.  
35e20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64        p->openMod
35e30 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41  e = SHELL_OPEN_A
35e40 50 50 45 4e 44 56 46 53 3b 0a 20 20 20 20 20 20  PPENDVFS;.      
35e50 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e  }else if( option
35e60 4d 61 74 63 68 28 7a 2c 20 22 72 65 61 64 6f 6e  Match(z, "readon
35e70 6c 79 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ly") ){.        
35e80 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48  p->openMode = SH
35e90 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ELL_OPEN_READONL
35ea0 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  Y;.#ifdef SQLITE
35eb0 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c  _ENABLE_DESERIAL
35ec0 49 5a 45 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  IZE.      }else 
35ed0 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28  if( optionMatch(
35ee0 7a 2c 20 22 64 65 73 65 72 69 61 6c 69 7a 65 22  z, "deserialize"
35ef0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
35f00 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c  openMode = SHELL
35f10 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a  _OPEN_DESERIALIZ
35f20 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
35f30 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a  f( optionMatch(z
35f40 2c 20 22 68 65 78 64 62 22 29 20 29 7b 0a 20 20  , "hexdb") ){.  
35f50 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64        p->openMod
35f60 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 48  e = SHELL_OPEN_H
35f70 45 58 44 42 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EXDB;.      }els
35f80 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63  e if( optionMatc
35f90 68 28 7a 2c 20 22 6d 61 78 73 69 7a 65 22 29 20  h(z, "maxsize") 
35fa0 26 26 20 69 4e 61 6d 65 2b 31 3c 6e 41 72 67 20  && iName+1<nArg 
35fb0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 7a  ){.        p->sz
35fc0 4d 61 78 20 3d 20 69 6e 74 65 67 65 72 56 61 6c  Max = integerVal
35fd0 75 65 28 61 7a 41 72 67 5b 2b 2b 69 4e 61 6d 65  ue(azArg[++iName
35fe0 5d 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ]);.#endif /* SQ
35ff0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45  LITE_ENABLE_DESE
36000 52 49 41 4c 49 5a 45 20 2a 2f 0a 20 20 20 20 20  RIALIZE */.     
36010 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d   }else if( z[0]=
36020 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
36030 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
36040 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74  rr, "unknown opt
36050 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  ion: %s\n", z);.
36060 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
36070 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
36080 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
36090 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
360a0 20 20 2f 2a 20 49 66 20 61 20 66 69 6c 65 6e 61    /* If a filena
360b0 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
360c0 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 69 74 20   try to open it 
360d0 66 69 72 73 74 20 2a 2f 0a 20 20 20 20 7a 4e 65  first */.    zNe
360e0 77 46 69 6c 65 6e 61 6d 65 20 3d 20 6e 41 72 67  wFilename = nArg
360f0 3e 69 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 33  >iName ? sqlite3
36100 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61  _mprintf("%s", a
36110 7a 41 72 67 5b 69 4e 61 6d 65 5d 29 20 3a 20 30  zArg[iName]) : 0
36120 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 46 69  ;.    if( zNewFi
36130 6c 65 6e 61 6d 65 20 7c 7c 20 70 2d 3e 6f 70 65  lename || p->ope
36140 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45  nMode==SHELL_OPE
36150 4e 5f 48 45 58 44 42 20 29 7b 0a 20 20 20 20 20  N_HEXDB ){.     
36160 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20 73   if( newFlag ) s
36170 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 7a  hellDeleteFile(z
36180 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  NewFilename);.  
36190 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61      p->zDbFilena
361a0 6d 65 20 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d  me = zNewFilenam
361b0 65 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64 62  e;.      open_db
361c0 28 70 2c 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50  (p, OPEN_DB_KEEP
361d0 41 4c 49 56 45 29 3b 0a 20 20 20 20 20 20 69 66  ALIVE);.      if
361e0 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20  ( p->db==0 ){.  
361f0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
36200 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
36210 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 27 25  : cannot open '%
36220 73 27 5c 6e 22 2c 20 7a 4e 65 77 46 69 6c 65 6e  s'\n", zNewFilen
36230 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ame);.        sq
36240 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 65 77 46  lite3_free(zNewF
36250 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
36260 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
36270 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d  ->zFreeOnClose =
36280 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 0a 20   zNewFilename;. 
36290 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
362a0 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b   if( p->db==0 ){
362b0 0a 20 20 20 20 20 20 2f 2a 20 41 73 20 61 20 66  .      /* As a f
362c0 61 6c 6c 2d 62 61 63 6b 20 6f 70 65 6e 20 61 20  all-back open a 
362d0 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f  TEMP database */
362e0 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c  .      p->zDbFil
362f0 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  ename = 0;.     
36300 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
36310 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
36320 20 69 66 28 20 28 63 3d 3d 27 6f 27 0a 20 20 20   if( (c=='o'.   
36330 20 20 20 20 20 26 26 20 28 73 74 72 6e 63 6d 70       && (strncmp
36340 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 75 74 70  (azArg[0], "outp
36350 75 74 22 2c 20 6e 29 3d 3d 30 7c 7c 73 74 72 6e  ut", n)==0||strn
36360 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f  cmp(azArg[0], "o
36370 6e 63 65 22 2c 20 6e 29 3d 3d 30 29 29 0a 20 20  nce", n)==0)).  
36380 20 7c 7c 20 28 63 3d 3d 27 65 27 20 26 26 20 6e   || (c=='e' && n
36390 3d 3d 35 20 26 26 20 73 74 72 63 6d 70 28 61 7a  ==5 && strcmp(az
363a0 41 72 67 5b 30 5d 2c 22 65 78 63 65 6c 22 29 3d  Arg[0],"excel")=
363b0 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  =0).  ){.    con
363c0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d  st char *zFile =
363d0 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67   nArg>=2 ? azArg
363e0 5b 31 5d 20 3a 20 22 73 74 64 6f 75 74 22 3b 0a  [1] : "stdout";.
363f0 20 20 20 20 69 6e 74 20 62 54 78 74 4d 6f 64 65      int bTxtMode
36400 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 61 7a   = 0;.    if( az
36410 41 72 67 5b 30 5d 5b 30 5d 3d 3d 27 65 27 20 29  Arg[0][0]=='e' )
36420 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73  {.      /* Trans
36430 66 6f 72 6d 20 74 68 65 20 22 2e 65 78 63 65 6c  form the ".excel
36440 22 20 63 6f 6d 6d 61 6e 64 20 69 6e 74 6f 20 22  " command into "
36450 2e 6f 6e 63 65 20 2d 78 22 20 2a 2f 0a 20 20 20  .once -x" */.   
36460 20 20 20 6e 41 72 67 20 3d 20 32 3b 0a 20 20 20     nArg = 2;.   
36470 20 20 20 61 7a 41 72 67 5b 30 5d 20 3d 20 22 6f     azArg[0] = "o
36480 6e 63 65 22 3b 0a 20 20 20 20 20 20 7a 46 69 6c  nce";.      zFil
36490 65 20 3d 20 61 7a 41 72 67 5b 31 5d 20 3d 20 22  e = azArg[1] = "
364a0 2d 78 22 3b 0a 20 20 20 20 20 20 6e 20 3d 20 34  -x";.      n = 4
364b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
364c0 6e 41 72 67 3e 32 20 29 7b 0a 20 20 20 20 20 20  nArg>2 ){.      
364d0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
364e0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 25 73 20  rr, "Usage: .%s 
364f0 5b 2d 65 7c 2d 78 7c 46 49 4c 45 5d 5c 6e 22 2c  [-e|-x|FILE]\n",
36500 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20   azArg[0]);.    
36510 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
36520 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
36530 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
36540 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73 74 72    if( n>1 && str
36550 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
36560 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  once", n)==0 ){.
36570 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32        if( nArg<2
36580 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
36590 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
365a0 55 73 61 67 65 3a 20 2e 6f 6e 63 65 20 28 2d 65  Usage: .once (-e
365b0 7c 2d 78 7c 46 49 4c 45 29 5c 6e 22 29 3b 0a 20  |-x|FILE)\n");. 
365c0 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
365d0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
365e0 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
365f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
36600 6f 75 74 43 6f 75 6e 74 20 3d 20 32 3b 0a 20 20  outCount = 2;.  
36610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
36620 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20 30 3b 0a  ->outCount = 0;.
36630 20 20 20 20 7d 0a 20 20 20 20 6f 75 74 70 75 74      }.    output
36640 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20 69  _reset(p);.    i
36650 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 27 2d 27  f( zFile[0]=='-'
36660 20 26 26 20 7a 46 69 6c 65 5b 31 5d 3d 3d 27 2d   && zFile[1]=='-
36670 27 20 29 20 7a 46 69 6c 65 2b 2b 3b 0a 23 69 66  ' ) zFile++;.#if
36680 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41  ndef SQLITE_NOHA
36690 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20 69 66  VE_SYSTEM.    if
366a0 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20  ( strcmp(zFile, 
366b0 22 2d 65 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63  "-e")==0 || strc
366c0 6d 70 28 7a 46 69 6c 65 2c 20 22 2d 78 22 29 3d  mp(zFile, "-x")=
366d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 64  =0 ){.      p->d
366e0 6f 58 64 67 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  oXdgOpen = 1;.  
366f0 20 20 20 20 6f 75 74 70 75 74 4d 6f 64 65 50 75      outputModePu
36700 73 68 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  sh(p);.      if(
36710 20 7a 46 69 6c 65 5b 31 5d 3d 3d 27 78 27 20 29   zFile[1]=='x' )
36720 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 54 65 6d  {.        newTem
36730 70 46 69 6c 65 28 70 2c 20 22 63 73 76 22 29 3b  pFile(p, "csv");
36740 0a 20 20 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  .        p->mode
36750 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20   = MODE_Csv;.   
36760 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
36770 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
36780 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70  colSeparator), p
36790 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20  ->colSeparator, 
367a0 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a 20 20 20 20  SEP_Comma);.    
367b0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
367c0 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
367d0 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
367e0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
367f0 45 50 5f 43 72 4c 66 29 3b 0a 20 20 20 20 20 20  EP_CrLf);.      
36800 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
36810 65 77 54 65 6d 70 46 69 6c 65 28 70 2c 20 22 74  ewTempFile(p, "t
36820 78 74 22 29 3b 0a 20 20 20 20 20 20 20 20 62 54  xt");.        bT
36830 78 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  xtMode = 1;.    
36840 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 20    }.      zFile 
36850 3d 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3b 0a  = p->zTempFile;.
36860 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
36870 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59  SQLITE_NOHAVE_SY
36880 53 54 45 4d 20 2a 2f 0a 20 20 20 20 69 66 28 20  STEM */.    if( 
36890 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b  zFile[0]=='|' ){
368a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
368b0 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 20 20  MIT_POPEN.      
368c0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
368d0 72 2c 20 22 45 72 72 6f 72 3a 20 70 69 70 65 73  r, "Error: pipes
368e0 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f 72 74   are not support
368f0 65 64 20 69 6e 20 74 68 69 73 20 4f 53 5c 6e 22  ed in this OS\n"
36900 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
36910 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20  .      p->out = 
36920 73 74 64 6f 75 74 3b 0a 23 65 6c 73 65 0a 20 20  stdout;.#else.  
36930 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 70 6f 70      p->out = pop
36940 65 6e 28 7a 46 69 6c 65 20 2b 20 31 2c 20 22 77  en(zFile + 1, "w
36950 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ");.      if( p-
36960 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >out==0 ){.     
36970 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
36980 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 63 61  tderr,"Error: ca
36990 6e 6e 6f 74 20 6f 70 65 6e 20 70 69 70 65 20 5c  nnot open pipe \
369a0 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 20  "%s\"\n", zFile 
369b0 2b 20 31 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  + 1);.        p-
369c0 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  >out = stdout;. 
369d0 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
369e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
369f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
36a00 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f  intf(sizeof(p->o
36a10 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66  utfile), p->outf
36a20 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65  ile, "%s", zFile
36a30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
36a40 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
36a50 20 20 20 70 2d 3e 6f 75 74 20 3d 20 6f 75 74 70     p->out = outp
36a60 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a 46 69  ut_file_open(zFi
36a70 6c 65 2c 20 62 54 78 74 4d 6f 64 65 29 3b 0a 20  le, bTxtMode);. 
36a80 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d       if( p->out=
36a90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
36aa0 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22  ( strcmp(zFile,"
36ab0 6f 66 66 22 29 21 3d 30 20 29 7b 0a 20 20 20 20  off")!=0 ){.    
36ac0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
36ad0 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
36ae0 20 63 61 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f   cannot write to
36af0 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c   \"%s\"\n", zFil
36b00 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
36b10 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73        p->out = s
36b20 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72  tdout;.        r
36b30 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20 65  c = 1;.      } e
36b40 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 71  lse {.        sq
36b50 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
36b60 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65  izeof(p->outfile
36b70 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22  ), p->outfile, "
36b80 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20  %s", zFile);.   
36b90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
36ba0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70 27  se..  if( c=='p'
36bb0 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
36bc0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70  cmp(azArg[0], "p
36bd0 61 72 61 6d 65 74 65 72 22 2c 20 6e 29 3d 3d 30  arameter", n)==0
36be0 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   ){.    open_db(
36bf0 70 2c 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41  p,0);.    if( nA
36c00 72 67 3c 3d 31 20 29 20 67 6f 74 6f 20 70 61 72  rg<=1 ) goto par
36c10 61 6d 65 74 65 72 5f 73 79 6e 74 61 78 5f 65 72  ameter_syntax_er
36c20 72 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 2e 70 61  ror;..    /* .pa
36c30 72 61 6d 65 74 65 72 20 63 6c 65 61 72 0a 20 20  rameter clear.  
36c40 20 20 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 62    ** Clear all b
36c50 69 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20 62  ind parameters b
36c60 79 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20 54  y dropping the T
36c70 45 4d 50 20 74 61 62 6c 65 20 74 68 61 74 20 68  EMP table that h
36c80 6f 6c 64 73 20 74 68 65 6d 2e 0a 20 20 20 20 2a  olds them..    *
36c90 2f 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  /.    if( nArg==
36ca0 32 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41 72  2 && strcmp(azAr
36cb0 67 5b 31 5d 2c 22 63 6c 65 61 72 22 29 3d 3d 30  g[1],"clear")==0
36cc0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
36cd0 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 44  3_exec(p->db, "D
36ce0 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
36cf0 53 54 53 20 74 65 6d 70 2e 5b 22 20 42 49 4e 44  STS temp.[" BIND
36d00 5f 50 41 52 41 4d 5f 54 41 42 4c 45 20 22 5d 3b  _PARAM_TABLE "];
36d10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
36d20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a        0, 0, 0);.
36d30 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
36d40 2a 20 2e 70 61 72 61 6d 65 74 65 72 20 6c 69 73  * .parameter lis
36d50 74 0a 20 20 20 20 2a 2a 20 4c 69 73 74 20 61 6c  t.    ** List al
36d60 6c 20 62 69 6e 64 20 70 61 72 61 6d 65 74 65 72  l bind parameter
36d70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
36d80 28 20 6e 41 72 67 3d 3d 32 20 26 26 20 73 74 72  ( nArg==2 && str
36d90 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69  cmp(azArg[1],"li
36da0 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  st")==0 ){.     
36db0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
36dc0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
36dd0 69 6e 74 20 72 78 3b 0a 20 20 20 20 20 20 69 6e  int rx;.      in
36de0 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  t len = 0;.     
36df0 20 72 78 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rx = sqlite3_pr
36e00 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a  epare_v2(p->db,.
36e10 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45               "SE
36e20 4c 45 43 54 20 6d 61 78 28 6c 65 6e 67 74 68 28  LECT max(length(
36e30 6b 65 79 29 29 20 22 0a 20 20 20 20 20 20 20 20  key)) ".        
36e40 20 20 20 20 20 22 46 52 4f 4d 20 74 65 6d 70 2e       "FROM temp.
36e50 5b 22 20 42 49 4e 44 5f 50 41 52 41 4d 5f 54 41  [" BIND_PARAM_TA
36e60 42 4c 45 20 22 5d 3b 22 2c 20 2d 31 2c 20 26 70  BLE "];", -1, &p
36e70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
36e80 69 66 28 20 72 78 3d 3d 53 51 4c 49 54 45 5f 4f  if( rx==SQLITE_O
36e90 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65  K && sqlite3_ste
36ea0 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
36eb0 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
36ec0 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  len = sqlite3_co
36ed0 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
36ee0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
36ef0 6c 65 6e 3e 34 30 20 29 20 6c 65 6e 20 3d 20 34  len>40 ) len = 4
36f00 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
36f10 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
36f20 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
36f30 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
36f40 20 69 66 28 20 6c 65 6e 20 29 7b 0a 20 20 20 20   if( len ){.    
36f50 20 20 20 20 72 78 20 3d 20 73 71 6c 69 74 65 33      rx = sqlite3
36f60 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
36f70 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
36f80 22 53 45 4c 45 43 54 20 6b 65 79 2c 20 71 75 6f  "SELECT key, quo
36f90 74 65 28 76 61 6c 75 65 29 20 22 0a 20 20 20 20  te(value) ".    
36fa0 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 74           "FROM t
36fb0 65 6d 70 2e 5b 22 20 42 49 4e 44 5f 50 41 52 41  emp.[" BIND_PARA
36fc0 4d 5f 54 41 42 4c 45 20 22 5d 3b 22 2c 20 2d 31  M_TABLE "];", -1
36fd0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
36fe0 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c        while( sql
36ff0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
37000 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
37010 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
37020 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
37030 2d 2a 73 20 25 73 5c 6e 22 2c 20 6c 65 6e 2c 20  -*s %s\n", len, 
37040 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
37050 65 78 74 28 70 53 74 6d 74 2c 30 29 2c 0a 20 20  ext(pStmt,0),.  
37060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37070 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
37080 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 31 29  mn_text(pStmt,1)
37090 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
370a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
370b0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
370c0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a      }.    }else.
370d0 0a 20 20 20 20 2f 2a 20 2e 70 61 72 61 6d 65 74  .    /* .paramet
370e0 65 72 20 69 6e 69 74 0a 20 20 20 20 2a 2a 20 4d  er init.    ** M
370f0 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45 4d  ake sure the TEM
37100 50 20 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  P table used to 
37110 68 6f 6c 64 20 62 69 6e 64 20 70 61 72 61 6d 65  hold bind parame
37120 74 65 72 73 20 65 78 69 73 74 73 2e 0a 20 20 20  ters exists..   
37130 20 2a 2a 20 43 72 65 61 74 65 20 69 74 20 69 66   ** Create it if
37140 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20   necessary..    
37150 2a 2f 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  */.    if( nArg=
37160 3d 32 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41  =2 && strcmp(azA
37170 72 67 5b 31 5d 2c 22 69 6e 69 74 22 29 3d 3d 30  rg[1],"init")==0
37180 20 29 7b 0a 20 20 20 20 20 20 62 69 6e 64 5f 74   ){.      bind_t
37190 61 62 6c 65 5f 69 6e 69 74 28 70 29 3b 0a 20 20  able_init(p);.  
371a0 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
371b0 2e 70 61 72 61 6d 65 74 65 72 20 73 65 74 20 4e  .parameter set N
371c0 41 4d 45 20 56 41 4c 55 45 0a 20 20 20 20 2a 2a  AME VALUE.    **
371d0 20 53 65 74 20 6f 72 20 72 65 73 65 74 20 61 20   Set or reset a 
371e0 62 69 6e 64 20 70 61 72 61 6d 65 74 65 72 2e 20  bind parameter. 
371f0 20 4e 41 4d 45 20 73 68 6f 75 6c 64 20 62 65 20   NAME should be 
37200 74 68 65 20 66 75 6c 6c 20 70 61 72 61 6d 65 74  the full paramet
37210 65 72 0a 20 20 20 20 2a 2a 20 6e 61 6d 65 20 65  er.    ** name e
37220 78 61 63 74 6c 79 20 61 73 20 69 74 20 61 70 70  xactly as it app
37230 65 61 72 73 20 69 6e 20 74 68 65 20 71 75 65 72  ears in the quer
37240 79 2e 20 20 28 65 78 3a 20 24 61 62 63 2c 20 40  y.  (ex: $abc, @
37250 64 65 66 29 2e 20 20 54 68 65 0a 20 20 20 20 2a  def).  The.    *
37260 2a 20 56 41 4c 55 45 20 63 61 6e 20 62 65 20 69  * VALUE can be i
37270 6e 20 65 69 74 68 65 72 20 53 51 4c 20 6c 69 74  n either SQL lit
37280 65 72 61 6c 20 6e 6f 74 61 74 69 6f 6e 2c 20 6f  eral notation, o
37290 72 20 69 66 20 6e 6f 74 20 69 74 20 77 69 6c 6c  r if not it will
372a0 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 64 65 72   be.    ** under
372b0 73 74 6f 6f 64 20 74 6f 20 62 65 20 61 20 74 65  stood to be a te
372c0 78 74 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 2a  xt string..    *
372d0 2f 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  /.    if( nArg==
372e0 34 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41 72  4 && strcmp(azAr
372f0 67 5b 31 5d 2c 22 73 65 74 22 29 3d 3d 30 20 29  g[1],"set")==0 )
37300 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 78 3b 0a  {.      int rx;.
37310 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c        char *zSql
37320 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
37330 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20  stmt *pStmt;.   
37340 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
37350 4b 65 79 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a  Key = azArg[2];.
37360 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
37370 20 2a 7a 56 61 6c 75 65 20 3d 20 61 7a 41 72 67   *zValue = azArg
37380 5b 33 5d 3b 0a 20 20 20 20 20 20 62 69 6e 64 5f  [3];.      bind_
37390 74 61 62 6c 65 5f 69 6e 69 74 28 70 29 3b 0a 20  table_init(p);. 
373a0 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
373b0 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
373c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
373d0 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 65 6d  REPLACE INTO tem
373e0 70 2e 5b 22 20 42 49 4e 44 5f 50 41 52 41 4d 5f  p.[" BIND_PARAM_
373f0 54 41 42 4c 45 20 22 5d 28 6b 65 79 2c 76 61 6c  TABLE "](key,val
37400 75 65 29 22 0a 20 20 20 20 20 20 20 20 20 20 20  ue)".           
37410 20 20 20 20 20 20 20 22 56 41 4c 55 45 53 28 25         "VALUES(%
37420 51 2c 25 73 29 3b 22 2c 20 7a 4b 65 79 2c 20 7a  Q,%s);", zKey, z
37430 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66  Value);.      if
37440 28 20 7a 53 71 6c 3d 3d 30 20 29 20 73 68 65 6c  ( zSql==0 ) shel
37450 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28  l_out_of_memory(
37460 29 3b 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d  );.      pStmt =
37470 20 30 3b 0a 20 20 20 20 20 20 72 78 20 3d 20 73   0;.      rx = s
37480 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
37490 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
374a0 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
374b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
374c0 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 69  e(zSql);.      i
374d0 66 28 20 72 78 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rx!=SQLITE_OK
374e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
374f0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
37500 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 53 74  mt);.        pSt
37510 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mt = 0;.        
37520 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
37530 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
37540 20 20 20 20 20 20 20 20 20 20 20 22 52 45 50 4c             "REPL
37550 41 43 45 20 49 4e 54 4f 20 74 65 6d 70 2e 5b 22  ACE INTO temp.["
37560 20 42 49 4e 44 5f 50 41 52 41 4d 5f 54 41 42 4c   BIND_PARAM_TABL
37570 45 20 22 5d 28 6b 65 79 2c 76 61 6c 75 65 29 22  E "](key,value)"
37580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
37590 20 20 20 20 22 56 41 4c 55 45 53 28 25 51 2c 25      "VALUES(%Q,%
375a0 51 29 3b 22 2c 20 7a 4b 65 79 2c 20 7a 56 61 6c  Q);", zKey, zVal
375b0 75 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ue);.        if(
375c0 20 7a 53 71 6c 3d 3d 30 20 29 20 73 68 65 6c 6c   zSql==0 ) shell
375d0 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29  _out_of_memory()
375e0 3b 0a 20 20 20 20 20 20 20 20 72 78 20 3d 20 73  ;.        rx = s
375f0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
37600 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
37610 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
37620 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
37630 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20  ree(zSql);.     
37640 20 20 20 69 66 28 20 72 78 21 3d 53 51 4c 49 54     if( rx!=SQLIT
37650 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
37660 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
37670 3e 6f 75 74 2c 20 22 45 72 72 6f 72 3a 20 25 73  >out, "Error: %s
37680 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
37690 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
376a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
376b0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
376c0 20 20 20 20 20 20 20 20 20 20 70 53 74 6d 74 20            pStmt 
376d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
376e0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
376f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
37700 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
37710 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
37720 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
37730 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20  );.    }else..  
37740 20 20 2f 2a 20 2e 70 61 72 61 6d 65 74 65 72 20    /* .parameter 
37750 75 6e 73 65 74 20 4e 41 4d 45 0a 20 20 20 20 2a  unset NAME.    *
37760 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 4e 41 4d  * Remove the NAM
37770 45 20 62 69 6e 64 69 6e 67 20 66 72 6f 6d 20 74  E binding from t
37780 68 65 20 70 61 72 61 6d 65 74 65 72 20 62 69 6e  he parameter bin
37790 64 69 6e 67 20 74 61 62 6c 65 2c 20 69 66 20 69  ding table, if i
377a0 74 0a 20 20 20 20 2a 2a 20 65 78 69 73 74 73 2e  t.    ** exists.
377b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
377c0 6e 41 72 67 3d 3d 33 20 26 26 20 73 74 72 63 6d  nArg==3 && strcm
377d0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 75 6e 73 65  p(azArg[1],"unse
377e0 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
377f0 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c  char *zSql = sql
37800 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
37810 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 4