/ Hex Artifact Content
Login

Artifact 7544d68921f2c3919da2150c1f7b53a4942c212dd59e68b7926fd903101c3cab:


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 2c 20  (ShellState *p, 
c7d0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
c7e0: 74 6d 74 29 7b 0a 20 20 45 51 50 47 72 61 70 68  tmt){.  EQPGraph
c7f0: 52 6f 77 20 2a 70 52 6f 77 20 3d 20 70 2d 3e 73  Row *pRow = p->s
c800: 47 72 61 70 68 2e 70 52 6f 77 3b 0a 20 20 69 66  Graph.pRow;.  if
c810: 28 20 70 52 6f 77 20 29 7b 0a 20 20 20 20 69 66  ( pRow ){.    if
c820: 28 20 70 52 6f 77 2d 3e 7a 54 65 78 74 5b 30 5d  ( pRow->zText[0]
c830: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 69  =='-' ){.      i
c840: 66 28 20 70 52 6f 77 2d 3e 70 4e 65 78 74 3d 3d  f( pRow->pNext==
c850: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 71 70  0 ){.        eqp
c860: 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20 20  _reset(p);.     
c870: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
c880: 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72   }.      utf8_pr
c890: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
c8a0: 5c 6e 22 2c 20 70 52 6f 77 2d 3e 7a 54 65 78 74  \n", pRow->zText
c8b0: 2b 33 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73 47  +3);.      p->sG
c8c0: 72 61 70 68 2e 70 52 6f 77 20 3d 20 70 52 6f 77  raph.pRow = pRow
c8d0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
c8e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 6f 77  qlite3_free(pRow
c8f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
c900: 20 20 20 20 69 6e 74 20 69 43 6f 73 74 2c 20 6e      int iCost, n
c910: 52 6f 77 3b 0a 20 20 20 20 20 20 69 43 6f 73 74  Row;.      iCost
c920: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
c930: 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20 53 51  status(pStmt, SQ
c940: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
c950: 45 53 54 5f 43 4f 53 54 2c 20 30 29 3b 0a 20 20  EST_COST, 0);.  
c960: 20 20 20 20 6e 52 6f 77 20 3d 20 73 71 6c 69 74      nRow = sqlit
c970: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
c980: 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d  Stmt, SQLITE_STM
c990: 54 53 54 41 54 55 53 5f 45 53 54 5f 52 4f 57 53  TSTATUS_EST_ROWS
c9a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 75 74 66 38  , 0);.      utf8
c9b0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
c9c0: 22 51 55 45 52 59 20 50 4c 41 4e 20 28 6c 6f 67  "QUERY PLAN (log
c9d0: 20 65 73 74 20 63 6f 73 74 3d 25 64 20 72 6f 77   est cost=%d row
c9e0: 73 3d 25 64 29 5c 6e 22 2c 20 69 43 6f 73 74 2c  s=%d)\n", iCost,
c9f0: 20 6e 52 6f 77 29 3b 0a 20 20 20 20 7d 0a 20 20   nRow);.    }.  
ca00: 20 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65    p->sGraph.zPre
ca10: 66 69 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  fix[0] = 0;.    
ca20: 65 71 70 5f 72 65 6e 64 65 72 5f 6c 65 76 65 6c  eqp_render_level
ca30: 28 70 2c 20 30 29 3b 0a 20 20 20 20 65 71 70 5f  (p, 0);.    eqp_
ca40: 72 65 73 65 74 28 70 29 3b 0a 20 20 7d 0a 7d 0a  reset(p);.  }.}.
ca50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ca60: 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41  OMIT_PROGRESS_CA
ca70: 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 50 72 6f  LLBACK./*.** Pro
ca80: 67 72 65 73 73 20 68 61 6e 64 6c 65 72 20 63 61  gress handler ca
ca90: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
caa0: 63 20 69 6e 74 20 70 72 6f 67 72 65 73 73 5f 68  c int progress_h
cab0: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 43 6c  andler(void *pCl
cac0: 69 65 6e 74 44 61 74 61 29 20 7b 0a 20 20 53 68  ientData) {.  Sh
cad0: 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53  ellState *p = (S
cae0: 68 65 6c 6c 53 74 61 74 65 2a 29 70 43 6c 69 65  hellState*)pClie
caf0: 6e 74 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 50 72  ntData;.  p->nPr
cb00: 6f 67 72 65 73 73 2b 2b 3b 0a 20 20 69 66 28 20  ogress++;.  if( 
cb10: 70 2d 3e 6e 50 72 6f 67 72 65 73 73 3e 3d 70 2d  p->nProgress>=p-
cb20: 3e 6d 78 50 72 6f 67 72 65 73 73 20 26 26 20 70  >mxProgress && p
cb30: 2d 3e 6d 78 50 72 6f 67 72 65 73 73 3e 30 20 29  ->mxProgress>0 )
cb40: 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  {.    raw_printf
cb50: 28 70 2d 3e 6f 75 74 2c 20 22 50 72 6f 67 72 65  (p->out, "Progre
cb60: 73 73 20 6c 69 6d 69 74 20 72 65 61 63 68 65 64  ss limit reached
cb70: 20 28 25 75 29 5c 6e 22 2c 20 70 2d 3e 6e 50 72   (%u)\n", p->nPr
cb80: 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 69 66 28  ogress);.    if(
cb90: 20 70 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73 20   p->flgProgress 
cba0: 26 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53  & SHELL_PROGRESS
cbb0: 5f 52 45 53 45 54 20 29 20 70 2d 3e 6e 50 72 6f  _RESET ) p->nPro
cbc0: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 69  gress = 0;.    i
cbd0: 66 28 20 70 2d 3e 66 6c 67 50 72 6f 67 72 65 73  f( p->flgProgres
cbe0: 73 20 26 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45  s & SHELL_PROGRE
cbf0: 53 53 5f 4f 4e 43 45 20 29 20 70 2d 3e 6d 78 50  SS_ONCE ) p->mxP
cc00: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
cc10: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
cc20: 20 69 66 28 20 28 70 2d 3e 66 6c 67 50 72 6f 67   if( (p->flgProg
cc30: 72 65 73 73 20 26 20 53 48 45 4c 4c 5f 50 52 4f  ress & SHELL_PRO
cc40: 47 52 45 53 53 5f 51 55 49 45 54 29 3d 3d 30 20  GRESS_QUIET)==0 
cc50: 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  ){.    raw_print
cc60: 66 28 70 2d 3e 6f 75 74 2c 20 22 50 72 6f 67 72  f(p->out, "Progr
cc70: 65 73 73 20 25 75 5c 6e 22 2c 20 70 2d 3e 6e 50  ess %u\n", p->nP
cc80: 72 6f 67 72 65 73 73 29 3b 0a 20 20 7d 0a 20 20  rogress);.  }.  
cc90: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
cca0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
ccb0: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
ccc0: 41 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  ACK */../*.** Th
ccd0: 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61  is is the callba
cce0: 63 6b 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  ck routine that 
ccf0: 74 68 65 20 73 68 65 6c 6c 0a 2a 2a 20 69 6e 76  the shell.** inv
cd00: 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f  okes for each ro
cd10: 77 20 6f 66 20 61 20 71 75 65 72 79 20 72 65 73  w of a query res
cd20: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
cd30: 6e 74 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63  nt shell_callbac
cd40: 6b 28 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c  k(.  void *pArg,
cd50: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
cd60: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
cd70: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
cd80: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  */.  char **azAr
cd90: 67 2c 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  g,    /* Text of
cda0: 20 65 61 63 68 20 72 65 73 75 6c 74 20 63 6f 6c   each result col
cdb0: 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  umn */.  char **
cdc0: 61 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  azCol,    /* Col
cdd0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
cde0: 6e 74 20 2a 61 69 54 79 70 65 20 20 20 20 20 20  nt *aiType      
cdf0: 2f 2a 20 43 6f 6c 75 6d 6e 20 74 79 70 65 73 20  /* Column types 
ce00: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
ce10: 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d   ShellState *p =
ce20: 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41   (ShellState*)pA
ce30: 72 67 3b 0a 0a 20 20 69 66 28 20 61 7a 41 72 67  rg;..  if( azArg
ce40: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
ce50: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 63 4d 6f    switch( p->cMo
ce60: 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4d  de ){.    case M
ce70: 4f 44 45 5f 4c 69 6e 65 3a 20 7b 0a 20 20 20 20  ODE_Line: {.    
ce80: 20 20 69 6e 74 20 77 20 3d 20 35 3b 0a 20 20 20    int w = 5;.   
ce90: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
cea0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
ceb0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
cec0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
ced0: 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30  t len = strlen30
cee0: 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f  (azCol[i] ? azCo
cef0: 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20  l[i] : "");.    
cf00: 20 20 20 20 69 66 28 20 6c 65 6e 3e 77 20 29 20      if( len>w ) 
cf10: 77 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d  w = len;.      }
cf20: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
cf30: 74 2b 2b 3e 30 20 29 20 75 74 66 38 5f 70 72 69  t++>0 ) utf8_pri
cf40: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
cf50: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
cf60: 72 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  r);.      for(i=
cf70: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
cf80: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
cf90: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2a 73  intf(p->out,"%*s
cfa0: 20 3d 20 25 73 25 73 22 2c 20 77 2c 20 61 7a 43   = %s%s", w, azC
cfb0: 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20  ol[i],.         
cfc0: 20 20 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 20         azArg[i] 
cfd0: 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e  ? azArg[i] : p->
cfe0: 6e 75 6c 6c 56 61 6c 75 65 2c 20 70 2d 3e 72 6f  nullValue, p->ro
cff0: 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  wSeparator);.   
d000: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
d010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
d020: 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3a 0a 20   MODE_Explain:. 
d030: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 43 6f 6c     case MODE_Col
d040: 75 6d 6e 3a 20 7b 0a 20 20 20 20 20 20 73 74 61  umn: {.      sta
d050: 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 45  tic const int aE
d060: 78 70 6c 61 69 6e 57 69 64 74 68 73 5b 5d 20 3d  xplainWidths[] =
d070: 20 7b 34 2c 20 31 33 2c 20 34 2c 20 34 2c 20 34   {4, 13, 4, 4, 4
d080: 2c 20 31 33 2c 20 32 2c 20 31 33 7d 3b 0a 20 20  , 13, 2, 13};.  
d090: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 2a 63      const int *c
d0a0: 6f 6c 57 69 64 74 68 3b 0a 20 20 20 20 20 20 69  olWidth;.      i
d0b0: 6e 74 20 73 68 6f 77 48 64 72 3b 0a 20 20 20 20  nt showHdr;.    
d0c0: 20 20 63 68 61 72 20 2a 72 6f 77 53 65 70 3b 0a    char *rowSep;.
d0d0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 4d 6f        if( p->cMo
d0e0: 64 65 3d 3d 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20  de==MODE_Column 
d0f0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6c 57 69  ){.        colWi
d100: 64 74 68 20 3d 20 70 2d 3e 63 6f 6c 57 69 64 74  dth = p->colWidt
d110: 68 3b 0a 20 20 20 20 20 20 20 20 73 68 6f 77 48  h;.        showH
d120: 64 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64  dr = p->showHead
d130: 65 72 3b 0a 20 20 20 20 20 20 20 20 72 6f 77 53  er;.        rowS
d140: 65 70 20 3d 20 70 2d 3e 72 6f 77 53 65 70 61 72  ep = p->rowSepar
d150: 61 74 6f 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ator;.      }els
d160: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6c 57 69  e{.        colWi
d170: 64 74 68 20 3d 20 61 45 78 70 6c 61 69 6e 57 69  dth = aExplainWi
d180: 64 74 68 73 3b 0a 20 20 20 20 20 20 20 20 73 68  dths;.        sh
d190: 6f 77 48 64 72 20 3d 20 31 3b 0a 20 20 20 20 20  owHdr = 1;.     
d1a0: 20 20 20 72 6f 77 53 65 70 20 3d 20 53 45 50 5f     rowSep = SEP_
d1b0: 52 6f 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Row;.      }.   
d1c0: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d     if( p->cnt++=
d1d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  =0 ){.        fo
d1e0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
d1f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
d200: 6e 74 20 77 2c 20 6e 3b 0a 20 20 20 20 20 20 20  nt w, n;.       
d210: 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69     if( i<ArraySi
d220: 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 20  ze(p->colWidth) 
d230: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  ){.            w
d240: 20 3d 20 63 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a   = colWidth[i];.
d250: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
d260: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  .            w =
d270: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
d280: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3d            if( w=
d290: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
d2a0: 20 20 77 20 3d 20 73 74 72 6c 65 6e 43 68 61 72    w = strlenChar
d2b0: 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f  (azCol[i] ? azCo
d2c0: 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20  l[i] : "");.    
d2d0: 20 20 20 20 20 20 20 20 69 66 28 20 77 3c 31 30          if( w<10
d2e0: 20 29 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20   ) w = 10;.     
d2f0: 20 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65         n = strle
d300: 6e 43 68 61 72 28 61 7a 41 72 67 20 26 26 20 61  nChar(azArg && a
d310: 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b  zArg[i] ? azArg[
d320: 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75  i] : p->nullValu
d330: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
d340: 69 66 28 20 77 3c 6e 20 29 20 77 20 3d 20 6e 3b  if( w<n ) w = n;
d350: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d360: 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72         if( i<Arr
d370: 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c  aySize(p->actual
d380: 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20  Width) ){.      
d390: 20 20 20 20 20 20 70 2d 3e 61 63 74 75 61 6c 57        p->actualW
d3a0: 69 64 74 68 5b 69 5d 20 3d 20 77 3b 0a 20 20 20  idth[i] = w;.   
d3b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d3c0: 20 20 20 69 66 28 20 73 68 6f 77 48 64 72 20 29     if( showHdr )
d3d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  {.            ut
d3e0: 66 38 5f 77 69 64 74 68 5f 70 72 69 6e 74 28 70  f8_width_print(p
d3f0: 2d 3e 6f 75 74 2c 20 77 2c 20 61 7a 43 6f 6c 5b  ->out, w, azCol[
d400: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
d410: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
d420: 6f 75 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e 41  out, "%s", i==nA
d430: 72 67 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a 20  rg-1 ? rowSep : 
d440: 22 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  "  ");.         
d450: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
d460: 20 20 20 20 20 69 66 28 20 73 68 6f 77 48 64 72       if( showHdr
d470: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
d480: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
d490: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
d4a0: 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20   int w;.        
d4b0: 20 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53      if( i<ArrayS
d4c0: 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64  ize(p->actualWid
d4d0: 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  th) ){.         
d4e0: 20 20 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74        w = p->act
d4f0: 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20  ualWidth[i];.   
d500: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
d510: 77 3c 30 20 29 20 77 20 3d 20 2d 77 3b 0a 20 20  w<0 ) w = -w;.  
d520: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
d530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d540: 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  w = 10;.        
d550: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d560: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
d570: 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c  >out,"%-*.*s%s",
d580: 77 2c 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  w,w,.           
d590: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d          "-------
d5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5d0: 2d 2d 2d 22 0a 20 20 20 20 20 20 20 20 20 20 20  ---".           
d5e0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d          "-------
d5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d620: 2d 2d 2d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ---",.          
d630: 20 20 20 20 20 20 20 20 20 20 69 3d 3d 6e 41 72            i==nAr
d640: 67 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22  g-1 ? rowSep : "
d650: 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20    ");.          
d660: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
d670: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
d680: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
d690: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
d6a0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
d6b0: 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20       int w;.    
d6c0: 20 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53      if( i<ArrayS
d6d0: 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64  ize(p->actualWid
d6e0: 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  th) ){.         
d6f0: 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57    w = p->actualW
d700: 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20  idth[i];.       
d710: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d720: 20 20 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20     w = 10;.     
d730: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
d740: 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f   p->cMode==MODE_
d750: 45 78 70 6c 61 69 6e 20 26 26 20 61 7a 41 72 67  Explain && azArg
d760: 5b 69 5d 20 26 26 20 73 74 72 6c 65 6e 43 68 61  [i] && strlenCha
d770: 72 28 61 7a 41 72 67 5b 69 5d 29 3e 77 20 29 7b  r(azArg[i])>w ){
d780: 0a 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 73  .          w = s
d790: 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 5b  trlenChar(azArg[
d7a0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
d7b0: 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20         if( i==1 
d7c0: 26 26 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 26  && p->aiIndent &
d7d0: 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  & p->pStmt ){.  
d7e0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69          if( p->i
d7f0: 49 6e 64 65 6e 74 3c 70 2d 3e 6e 49 6e 64 65 6e  Indent<p->nInden
d800: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
d810: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
d820: 6f 75 74 2c 20 22 25 2a 2e 73 22 2c 20 70 2d 3e  out, "%*.s", p->
d830: 61 69 49 6e 64 65 6e 74 5b 70 2d 3e 69 49 6e 64  aiIndent[p->iInd
d840: 65 6e 74 5d 2c 20 22 22 29 3b 0a 20 20 20 20 20  ent], "");.     
d850: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d860: 20 70 2d 3e 69 49 6e 64 65 6e 74 2b 2b 3b 0a 20   p->iIndent++;. 
d870: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d880: 20 75 74 66 38 5f 77 69 64 74 68 5f 70 72 69 6e   utf8_width_prin
d890: 74 28 70 2d 3e 6f 75 74 2c 20 77 2c 20 61 7a 41  t(p->out, w, azA
d8a0: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
d8b0: 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29   : p->nullValue)
d8c0: 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  ;.        utf8_p
d8d0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
d8e0: 73 22 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20  s", i==nArg-1 ? 
d8f0: 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a  rowSep : "  ");.
d900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
d910: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
d920: 61 73 65 20 4d 4f 44 45 5f 53 65 6d 69 3a 20 7b  ase MODE_Semi: {
d930: 20 20 20 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e     /* .schema an
d940: 64 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20 6f 75  d .fullschema ou
d950: 74 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 70 72  tput */.      pr
d960: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d  intSchemaLine(p-
d970: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 30 5d 2c 20  >out, azArg[0], 
d980: 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72  ";\n");.      br
d990: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
d9a0: 61 73 65 20 4d 4f 44 45 5f 50 72 65 74 74 79 3a  ase MODE_Pretty:
d9b0: 20 7b 20 20 2f 2a 20 2e 73 63 68 65 6d 61 20 61   {  /* .schema a
d9c0: 6e 64 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20 77  nd .fullschema w
d9d0: 69 74 68 20 2d 2d 69 6e 64 65 6e 74 20 2a 2f 0a  ith --indent */.
d9e0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20        char *z;. 
d9f0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
da00: 20 20 69 6e 74 20 6e 50 61 72 65 6e 20 3d 20 30    int nParen = 0
da10: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 45 6e  ;.      char cEn
da20: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61  d = 0;.      cha
da30: 72 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  r c;.      int n
da40: 4c 69 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Line = 0;.      
da50: 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20  assert( nArg==1 
da60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41  );.      if( azA
da70: 72 67 5b 30 5d 3d 3d 30 20 29 20 62 72 65 61 6b  rg[0]==0 ) break
da80: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
da90: 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 43 52 45  te3_strlike("CRE
daa0: 41 54 45 20 56 49 45 57 25 22 2c 20 61 7a 41 72  ATE VIEW%", azAr
dab0: 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a 20 20 20 20  g[0], 0)==0.    
dac0: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74     || sqlite3_st
dad0: 72 6c 69 6b 65 28 22 43 52 45 41 54 45 20 54 52  rlike("CREATE TR
dae0: 49 47 25 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20  IG%", azArg[0], 
daf0: 30 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  0)==0.      ){. 
db00: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
db10: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c  tf(p->out, "%s;\
db20: 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  n", azArg[0]);. 
db30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
db40: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20      }.      z = 
db50: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
db60: 22 25 73 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b  "%s", azArg[0]);
db70: 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  .      j = 0;.  
db80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 49 73 53      for(i=0; IsS
db90: 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29  pace(z[i]); i++)
dba0: 7b 7d 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 28  {}.      for(; (
dbb0: 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b  c = z[i])!=0; i+
dbc0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
dbd0: 49 73 53 70 61 63 65 28 63 29 20 29 7b 0a 20 20  IsSpace(c) ){.  
dbe0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 6a 2d          if( z[j-
dbf0: 31 5d 3d 3d 27 5c 72 27 20 29 20 7a 5b 6a 2d 31  1]=='\r' ) z[j-1
dc00: 5d 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20  ] = '\n';.      
dc10: 20 20 20 20 69 66 28 20 49 73 53 70 61 63 65 28      if( IsSpace(
dc20: 7a 5b 6a 2d 31 5d 29 20 7c 7c 20 7a 5b 6a 2d 31  z[j-1]) || z[j-1
dc30: 5d 3d 3d 27 28 27 20 29 20 63 6f 6e 74 69 6e 75  ]=='(' ) continu
dc40: 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  e;.        }else
dc50: 20 69 66 28 20 28 63 3d 3d 27 28 27 20 7c 7c 20   if( (c=='(' || 
dc60: 63 3d 3d 27 29 27 29 20 26 26 20 6a 3e 30 20 26  c==')') && j>0 &
dc70: 26 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d  & IsSpace(z[j-1]
dc80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a  ) ){.          j
dc90: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  --;.        }.  
dca0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63        z[j++] = c
dcb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
dcc0: 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 49 73  while( j>0 && Is
dcd0: 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b  Space(z[j-1]) ){
dce0: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 7a 5b   j--; }.      z[
dcf0: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  j] = 0;.      if
dd00: 28 20 73 74 72 6c 65 6e 33 30 28 7a 29 3e 3d 37  ( strlen30(z)>=7
dd10: 39 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  9 ){.        for
dd20: 28 69 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69  (i=j=0; (c = z[i
dd30: 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 20 20 2f 2a  ])!=0; i++){  /*
dd40: 20 43 6f 70 79 20 63 68 61 6e 67 65 73 20 66 72   Copy changes fr
dd50: 6f 6d 20 7a 5b 69 5d 20 62 61 63 6b 20 74 6f 20  om z[i] back to 
dd60: 7a 5b 6a 5d 20 2a 2f 0a 20 20 20 20 20 20 20 20  z[j] */.        
dd70: 20 20 69 66 28 20 63 3d 3d 63 45 6e 64 20 29 7b    if( c==cEnd ){
dd80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 45 6e  .            cEn
dd90: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
dda0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22   }else if( c=='"
ddb0: 27 20 7c 7c 20 63 3d 3d 27 5c 27 27 20 7c 7c 20  ' || c=='\'' || 
ddc0: 63 3d 3d 27 60 27 20 29 7b 0a 20 20 20 20 20 20  c=='`' ){.      
ddd0: 20 20 20 20 20 20 63 45 6e 64 20 3d 20 63 3b 0a        cEnd = c;.
dde0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
ddf0: 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20  if( c=='[' ){.  
de00: 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d            cEnd =
de10: 20 27 5d 27 3b 0a 20 20 20 20 20 20 20 20 20 20   ']';.          
de20: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2d 27  }else if( c=='-'
de30: 20 26 26 20 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20   && z[i+1]=='-' 
de40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
de50: 45 6e 64 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20  End = '\n';.    
de60: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
de70: 63 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20  c=='(' ){.      
de80: 20 20 20 20 20 20 6e 50 61 72 65 6e 2b 2b 3b 0a        nParen++;.
de90: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
dea0: 69 66 28 20 63 3d 3d 27 29 27 20 29 7b 0a 20 20  if( c==')' ){.  
deb0: 20 20 20 20 20 20 20 20 20 20 6e 50 61 72 65 6e            nParen
dec0: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  --;.            
ded0: 69 66 28 20 6e 4c 69 6e 65 3e 30 20 26 26 20 6e  if( nLine>0 && n
dee0: 50 61 72 65 6e 3d 3d 30 20 26 26 20 6a 3e 30 20  Paren==0 && j>0 
def0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
df00: 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65   printSchemaLine
df10: 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20  N(p->out, z, j, 
df20: 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  "\n");.         
df30: 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
df40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
df50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
df60: 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  z[j++] = c;.    
df70: 20 20 20 20 20 20 69 66 28 20 6e 50 61 72 65 6e        if( nParen
df80: 3d 3d 31 20 26 26 20 63 45 6e 64 3d 3d 30 0a 20  ==1 && cEnd==0. 
df90: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 63 3d            && (c=
dfa0: 3d 27 28 27 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20  ='(' || c=='\n' 
dfb0: 7c 7c 20 28 63 3d 3d 27 2c 27 20 26 26 20 21 77  || (c==',' && !w
dfc0: 73 54 6f 45 6f 6c 28 7a 2b 69 2b 31 29 29 29 0a  sToEol(z+i+1))).
dfd0: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
dfe0: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
dff0: 27 5c 6e 27 20 29 20 6a 2d 2d 3b 0a 20 20 20 20  '\n' ) j--;.    
e000: 20 20 20 20 20 20 20 20 70 72 69 6e 74 53 63 68          printSch
e010: 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c  emaLineN(p->out,
e020: 20 7a 2c 20 6a 2c 20 22 5c 6e 20 20 22 29 3b 0a   z, j, "\n  ");.
e030: 20 20 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20              j = 
e040: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  0;.            n
e050: 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Line++;.        
e060: 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
e070: 63 65 28 7a 5b 69 2b 31 5d 29 20 29 7b 20 69 2b  ce(z[i+1]) ){ i+
e080: 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d  +; }.          }
e090: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e0a0: 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20     z[j] = 0;.   
e0b0: 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74     }.      print
e0c0: 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75  SchemaLine(p->ou
e0d0: 74 2c 20 7a 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20  t, z, ";\n");.  
e0e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
e0f0: 28 7a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  (z);.      break
e100: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e110: 20 4d 4f 44 45 5f 4c 69 73 74 3a 20 7b 0a 20 20   MODE_List: {.  
e120: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
e130: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
e140: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
e150: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
e160: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
e170: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
e180: 6f 75 74 2c 22 25 73 25 73 22 2c 61 7a 43 6f 6c  out,"%s%s",azCol
e190: 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
e1a0: 20 20 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31         i==nArg-1
e1b0: 20 3f 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74   ? p->rowSeparat
e1c0: 6f 72 20 3a 20 70 2d 3e 63 6f 6c 53 65 70 61 72  or : p->colSepar
e1d0: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ator);.        }
e1e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
e1f0: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
e200: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  eak;.      for(i
e210: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
e220: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
e230: 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20  z = azArg[i];.  
e240: 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
e250: 20 7a 20 3d 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75   z = p->nullValu
e260: 65 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  e;.        utf8_
e270: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e280: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  %s", z);.       
e290: 20 69 66 28 20 69 3c 6e 41 72 67 2d 31 20 29 7b   if( i<nArg-1 ){
e2a0: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
e2b0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e2c0: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
e2d0: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ator);.        }
e2e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
e2f0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
e300: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
e310: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
e320: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e330: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e340: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 48  .    case MODE_H
e350: 74 6d 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  tml: {.      if(
e360: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20   p->cnt++==0 && 
e370: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
e380: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
e390: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e  ntf(p->out,"<TR>
e3a0: 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ");.        for(
e3b0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
e3c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
e3d0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e3e0: 3c 54 48 3e 22 29 3b 0a 20 20 20 20 20 20 20 20  <TH>");.        
e3f0: 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74    output_html_st
e400: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43  ring(p->out, azC
e410: 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ol[i]);.        
e420: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
e430: 6f 75 74 2c 22 3c 2f 54 48 3e 5c 6e 22 29 3b 0a  out,"</TH>\n");.
e440: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e450: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
e460: 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a  out,"</TR>\n");.
e470: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
e480: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
e490: 61 6b 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  ak;.      raw_pr
e4a0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52  intf(p->out,"<TR
e4b0: 3e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  >");.      for(i
e4c0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
e4d0: 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
e4e0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 44  intf(p->out,"<TD
e4f0: 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 6f 75 74  >");.        out
e500: 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28  put_html_string(
e510: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
e520: 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d   ? azArg[i] : p-
e530: 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20  >nullValue);.   
e540: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
e550: 70 2d 3e 6f 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22  p->out,"</TD>\n"
e560: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e570: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e580: 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20  ut,"</TR>\n");. 
e590: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e5a0: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
e5b0: 54 63 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  Tcl: {.      if(
e5c0: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20   p->cnt++==0 && 
e5d0: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
e5e0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
e5f0: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
e600: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
e610: 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  _c_string(p->out
e620: 2c 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f  ,azCol[i] ? azCo
e630: 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20  l[i] : "");.    
e640: 20 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67 2d        if(i<nArg-
e650: 31 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  1) utf8_printf(p
e660: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
e670: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
e680: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e690: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
e6a0: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f  out, "%s", p->ro
e6b0: 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  wSeparator);.   
e6c0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
e6d0: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
e6e0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
e6f0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
e700: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
e710: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
e720: 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69  Arg[i] ? azArg[i
e730: 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  ] : p->nullValue
e740: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 69 3c  );.        if(i<
e750: 6e 41 72 67 2d 31 29 20 75 74 66 38 5f 70 72 69  nArg-1) utf8_pri
e760: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
e770: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
e780: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
e790: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
e7a0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72  >out, "%s", p->r
e7b0: 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
e7c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e7d0: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 43  .    case MODE_C
e7e0: 73 76 3a 20 7b 0a 20 20 20 20 20 20 73 65 74 42  sv: {.      setB
e7f0: 69 6e 61 72 79 4d 6f 64 65 28 70 2d 3e 6f 75 74  inaryMode(p->out
e800: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
e810: 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70  p->cnt++==0 && p
e820: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
e830: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
e840: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
e850: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
e860: 63 73 76 28 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20  csv(p, azCol[i] 
e870: 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c  ? azCol[i] : "",
e880: 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20   i<nArg-1);.    
e890: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74      }.        ut
e8a0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e8b0: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
e8c0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
e8d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  }.      if( nArg
e8e0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  >0 ){.        fo
e8f0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
e900: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  ++){.          o
e910: 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61 7a 41  utput_csv(p, azA
e920: 72 67 5b 69 5d 2c 20 69 3c 6e 41 72 67 2d 31 29  rg[i], i<nArg-1)
e930: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e940: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
e950: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
e960: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
e970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65        }.      se
e980: 74 54 65 78 74 4d 6f 64 65 28 70 2d 3e 6f 75 74  tTextMode(p->out
e990: 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
e9a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
e9b0: 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3a 20 7b  e MODE_Insert: {
e9c0: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
e9d0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
e9e0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
e9f0: 2d 3e 6f 75 74 2c 22 49 4e 53 45 52 54 20 49 4e  ->out,"INSERT IN
ea00: 54 4f 20 25 73 22 2c 70 2d 3e 7a 44 65 73 74 54  TO %s",p->zDestT
ea10: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  able);.      if(
ea20: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29   p->showHeader )
ea30: 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
ea40: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 28 22 29  intf(p->out,"(")
ea50: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
ea60: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
ea70: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
ea80: 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  >0 ) raw_printf(
ea90: 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20  p->out, ",");.  
eaa0: 20 20 20 20 20 20 20 20 69 66 28 20 71 75 6f 74          if( quot
eab0: 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 29 20  eChar(azCol[i]) 
eac0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
ead0: 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
eae0: 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22  _mprintf("\"%w\"
eaf0: 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  ", azCol[i]);.  
eb00: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
eb10: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
eb20: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  s", z);.        
eb30: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
eb40: 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (z);.          }
eb50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
eb60: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
eb70: 6f 75 74 2c 20 22 25 73 22 2c 20 61 7a 43 6f 6c  out, "%s", azCol
eb80: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
eb90: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
eba0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
ebb0: 2d 3e 6f 75 74 2c 22 29 22 29 3b 0a 20 20 20 20  ->out,")");.    
ebc0: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74    }.      p->cnt
ebd0: 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ++;.      for(i=
ebe0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
ebf0: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
ec00: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 69 3e 30 20  ntf(p->out, i>0 
ec10: 3f 20 22 2c 22 20 3a 20 22 20 56 41 4c 55 45 53  ? "," : " VALUES
ec20: 28 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (");.        if(
ec30: 20 28 61 7a 41 72 67 5b 69 5d 3d 3d 30 29 20 7c   (azArg[i]==0) |
ec40: 7c 20 28 61 69 54 79 70 65 20 26 26 20 61 69 54  | (aiType && aiT
ec50: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e  ype[i]==SQLITE_N
ec60: 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ULL) ){.        
ec70: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
ec80: 3e 6f 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20  >out,"NULL");.  
ec90: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
eca0: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
ecb0: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  [i]==SQLITE_TEXT
ecc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
ecd0: 28 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70  ( ShellHasFlag(p
ece0: 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73  , SHFLG_Newlines
ecf0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
ed00: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73   output_quoted_s
ed10: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
ed20: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
ed30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ed40: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f        output_quo
ed50: 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69  ted_escaped_stri
ed60: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
ed70: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
ed80: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
ed90: 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69  if( aiType && ai
eda0: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
edb0: 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
edc0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
edd0: 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a  (p->out,"%s", az
ede0: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
edf0: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
ee00: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
ee10: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a  SQLITE_FLOAT ){.
ee20: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 7a            char z
ee30: 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [50];.          
ee40: 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74  double r = sqlit
ee50: 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  e3_column_double
ee60: 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20  (p->pStmt, i);. 
ee70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ee80: 5f 75 69 6e 74 36 34 20 75 72 3b 0a 20 20 20 20  _uint64 ur;.    
ee90: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 75 72        memcpy(&ur
eea0: 2c 26 72 2c 73 69 7a 65 6f 66 28 72 29 29 3b 0a  ,&r,sizeof(r));.
eeb0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 75 72            if( ur
eec0: 3d 3d 30 78 37 66 66 30 30 30 30 30 30 30 30 30  ==0x7ff000000000
eed0: 30 30 30 30 4c 4c 20 29 7b 0a 20 20 20 20 20 20  0000LL ){.      
eee0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
eef0: 28 70 2d 3e 6f 75 74 2c 20 22 31 65 39 39 39 22  (p->out, "1e999"
ef00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
ef10: 73 65 20 69 66 28 20 75 72 3d 3d 30 78 66 66 66  se if( ur==0xfff
ef20: 30 30 30 30 30 30 30 30 30 30 30 30 30 4c 4c 20  0000000000000LL 
ef30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
ef40: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
ef50: 2c 20 22 2d 31 65 39 39 39 22 29 3b 0a 20 20 20  , "-1e999");.   
ef60: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ef70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ef80: 33 5f 73 6e 70 72 69 6e 74 66 28 35 30 2c 7a 2c  3_snprintf(50,z,
ef90: 22 25 21 2e 32 30 67 22 2c 20 72 29 3b 0a 20 20  "%!.20g", r);.  
efa0: 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
efb0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
efc0: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  ", z);.         
efd0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
efe0: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61   if( aiType && a
eff0: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
f000: 5f 42 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d  _BLOB && p->pStm
f010: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  t ){.          c
f020: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62  onst void *pBlob
f030: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
f040: 6e 5f 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c  n_blob(p->pStmt,
f050: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   i);.          i
f060: 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74  nt nBlob = sqlit
f070: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
f080: 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  p->pStmt, i);.  
f090: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68          output_h
f0a0: 65 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20  ex_blob(p->out, 
f0b0: 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20  pBlob, nBlob);. 
f0c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
f0d0: 20 69 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b   isNumber(azArg[
f0e0: 69 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  i], 0) ){.      
f0f0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
f100: 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41  p->out,"%s", azA
f110: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
f120: 7d 65 6c 73 65 20 69 66 28 20 53 68 65 6c 6c 48  }else if( ShellH
f130: 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  asFlag(p, SHFLG_
f140: 4e 65 77 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20  Newlines) ){.   
f150: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75         output_qu
f160: 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  oted_string(p->o
f170: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  ut, azArg[i]);. 
f180: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
f190: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71          output_q
f1a0: 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74  uoted_escaped_st
f1b0: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41  ring(p->out, azA
f1c0: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
f1d0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
f1e0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
f1f0: 74 2c 22 29 3b 5c 6e 22 29 3b 0a 20 20 20 20 20  t,");\n");.     
f200: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f210: 20 20 63 61 73 65 20 4d 4f 44 45 5f 51 75 6f 74    case MODE_Quot
f220: 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 61  e: {.      if( a
f230: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
f240: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
f250: 74 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48  t==0 && p->showH
f260: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
f270: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
f280: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
f290: 20 20 69 66 28 20 69 3e 30 20 29 20 72 61 77 5f    if( i>0 ) raw_
f2a0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
f2b0: 2c 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  ,");.          o
f2c0: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
f2d0: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f  ing(p->out, azCo
f2e0: 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  l[i]);.        }
f2f0: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
f300: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29  ntf(p->out,"\n")
f310: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f320: 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  p->cnt++;.      
f330: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
f340: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
f350: 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69  f( i>0 ) raw_pri
f360: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29  ntf(p->out, ",")
f370: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 61  ;.        if( (a
f380: 7a 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28  zArg[i]==0) || (
f390: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
f3a0: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  [i]==SQLITE_NULL
f3b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  ) ){.          u
f3c0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
f3d0: 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20  t,"NULL");.     
f3e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54     }else if( aiT
f3f0: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
f400: 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b  ==SQLITE_TEXT ){
f410: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
f420: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
f430: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
f440: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
f450: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61   if( aiType && a
f460: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
f470: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
f480: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
f490: 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61  f(p->out,"%s", a
f4a0: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
f4b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
f4c0: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
f4d0: 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b  =SQLITE_FLOAT ){
f4e0: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
f4f0: 7a 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20 20  z[50];.         
f500: 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69   double r = sqli
f510: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
f520: 65 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a  e(p->pStmt, i);.
f530: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f540: 33 5f 73 6e 70 72 69 6e 74 66 28 35 30 2c 7a 2c  3_snprintf(50,z,
f550: 22 25 21 2e 32 30 67 22 2c 20 72 29 3b 0a 20 20  "%!.20g", r);.  
f560: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
f570: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
f580: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   z);.        }el
f590: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
f5a0: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
f5b0: 54 45 5f 42 4c 4f 42 20 26 26 20 70 2d 3e 70 53  TE_BLOB && p->pS
f5c0: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tmt ){.         
f5d0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c   const void *pBl
f5e0: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ob = sqlite3_col
f5f0: 75 6d 6e 5f 62 6c 6f 62 28 70 2d 3e 70 53 74 6d  umn_blob(p->pStm
f600: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
f610: 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c   int nBlob = sql
f620: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
f630: 73 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a  s(p->pStmt, i);.
f640: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
f650: 5f 68 65 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74  _hex_blob(p->out
f660: 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b  , pBlob, nBlob);
f670: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
f680: 66 28 20 69 73 4e 75 6d 62 65 72 28 61 7a 41 72  f( isNumber(azAr
f690: 67 5b 69 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20  g[i], 0) ){.    
f6a0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
f6b0: 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61  f(p->out,"%s", a
f6c0: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
f6d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f6e0: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
f6f0: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
f700: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
f710: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f720: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
f730: 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20  >out,"\n");.    
f740: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f750: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 41 73 63     case MODE_Asc
f760: 69 69 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ii: {.      if( 
f770: 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70  p->cnt++==0 && p
f780: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
f790: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
f7a0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
f7b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
f7c0: 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70   ) utf8_printf(p
f7d0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
f7e0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
f7f0: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
f800: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22  intf(p->out,"%s"
f810: 2c 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f  ,azCol[i] ? azCo
f820: 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20  l[i] : "");.    
f830: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74      }.        ut
f840: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
f850: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
f860: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
f870: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  }.      if( azAr
f880: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
f890: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
f8a0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
f8b0: 20 20 20 69 66 28 20 69 3e 30 20 29 20 75 74 66     if( i>0 ) utf
f8c0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
f8d0: 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70   "%s", p->colSep
f8e0: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20  arator);.       
f8f0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
f900: 6f 75 74 2c 22 25 73 22 2c 61 7a 41 72 67 5b 69  out,"%s",azArg[i
f910: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
f920: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
f930: 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74 66 38      }.      utf8
f940: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
f950: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
f960: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 62 72  rator);.      br
f970: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f980: 61 73 65 20 4d 4f 44 45 5f 45 51 50 3a 20 7b 0a  ase MODE_EQP: {.
f990: 20 20 20 20 20 20 65 71 70 5f 61 70 70 65 6e 64        eqp_append
f9a0: 28 70 2c 20 61 74 6f 69 28 61 7a 41 72 67 5b 30  (p, atoi(azArg[0
f9b0: 5d 29 2c 20 61 74 6f 69 28 61 7a 41 72 67 5b 31  ]), atoi(azArg[1
f9c0: 5d 29 2c 20 61 7a 41 72 67 5b 33 5d 29 3b 0a 20  ]), azArg[3]);. 
f9d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f9e0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
f9f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
fa00: 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  is the callback 
fa10: 72 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68 65  routine that the
fa20: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 0a   SQLite library.
fa30: 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65  ** invokes for e
fa40: 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65  ach row of a que
fa50: 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  ry result..*/.st
fa60: 61 74 69 63 20 69 6e 74 20 63 61 6c 6c 62 61 63  atic int callbac
fa70: 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  k(void *pArg, in
fa80: 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  t nArg, char **a
fa90: 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 43  zArg, char **azC
faa0: 6f 6c 29 7b 0a 20 20 2f 2a 20 73 69 6e 63 65 20  ol){.  /* since 
fab0: 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 79  we don't have ty
fac0: 70 65 20 69 6e 66 6f 2c 20 63 61 6c 6c 20 74 68  pe info, call th
fad0: 65 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b  e shell_callback
fae0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c   with a NULL val
faf0: 75 65 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73  ue */.  return s
fb00: 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41  hell_callback(pA
fb10: 72 67 2c 20 6e 41 72 67 2c 20 61 7a 41 72 67 2c  rg, nArg, azArg,
fb20: 20 61 7a 43 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d   azCol, NULL);.}
fb30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
fb40: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  the callback rou
fb50: 74 69 6e 65 20 66 72 6f 6d 20 73 71 6c 69 74 65  tine from sqlite
fb60: 33 5f 65 78 65 63 28 29 20 74 68 61 74 20 61 70  3_exec() that ap
fb70: 70 65 6e 64 73 20 61 6c 6c 0a 2a 2a 20 6f 75 74  pends all.** out
fb80: 70 75 74 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  put onto the end
fb90: 20 6f 66 20 61 20 53 68 65 6c 6c 54 65 78 74 20   of a ShellText 
fba0: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
fbb0: 63 20 69 6e 74 20 63 61 70 74 75 72 65 4f 75 74  c int captureOut
fbc0: 70 75 74 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  putCallback(void
fbd0: 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67   *pArg, int nArg
fbe0: 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20  , char **azArg, 
fbf0: 63 68 61 72 20 2a 2a 61 7a 29 7b 0a 20 20 53 68  char **az){.  Sh
fc00: 65 6c 6c 54 65 78 74 20 2a 70 20 3d 20 28 53 68  ellText *p = (Sh
fc10: 65 6c 6c 54 65 78 74 2a 29 70 41 72 67 3b 0a 20  ellText*)pArg;. 
fc20: 20 69 6e 74 20 69 3b 0a 20 20 55 4e 55 53 45 44   int i;.  UNUSED
fc30: 5f 50 41 52 41 4d 45 54 45 52 28 61 7a 29 3b 0a  _PARAMETER(az);.
fc40: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
fc50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
fc60: 20 70 2d 3e 6e 20 29 20 61 70 70 65 6e 64 54 65   p->n ) appendTe
fc70: 78 74 28 70 2c 20 22 7c 22 2c 20 30 29 3b 0a 20  xt(p, "|", 0);. 
fc80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
fc90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
fca0: 69 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 70  i ) appendText(p
fcb0: 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 69  , ",", 0);.    i
fcc0: 66 28 20 61 7a 41 72 67 5b 69 5d 20 29 20 61 70  f( azArg[i] ) ap
fcd0: 70 65 6e 64 54 65 78 74 28 70 2c 20 61 7a 41 72  pendText(p, azAr
fce0: 67 5b 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  g[i], 0);.  }.  
fcf0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
fd00: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 61  ** Generate an a
fd10: 70 70 72 6f 70 72 69 61 74 65 20 53 45 4c 46 54  ppropriate SELFT
fd20: 45 53 54 20 74 61 62 6c 65 20 69 6e 20 74 68 65  EST table in the
fd30: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 0a   main database..
fd40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
fd50: 72 65 61 74 65 53 65 6c 66 74 65 73 74 54 61 62  reateSelftestTab
fd60: 6c 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  le(ShellState *p
fd70: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  ){.  char *zErrM
fd80: 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  sg = 0;.  sqlite
fd90: 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20  3_exec(p->db,.  
fda0: 20 20 22 53 41 56 45 50 4f 49 4e 54 20 73 65 6c    "SAVEPOINT sel
fdb0: 66 74 65 73 74 5f 69 6e 69 74 3b 5c 6e 22 0a 20  ftest_init;\n". 
fdc0: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
fdd0: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73   IF NOT EXISTS s
fde0: 65 6c 66 74 65 73 74 28 5c 6e 22 0a 20 20 20 20  elftest(\n".    
fdf0: 22 20 20 74 6e 6f 20 49 4e 54 45 47 45 52 20 50  "  tno INTEGER P
fe00: 52 49 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 20 20  RIMARY KEY,\n"  
fe10: 20 2f 2a 20 54 65 73 74 20 6e 75 6d 62 65 72 20   /* Test number 
fe20: 2a 2f 0a 20 20 20 20 22 20 20 6f 70 20 54 45 58  */.    "  op TEX
fe30: 54 2c 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20  T,\n"           
fe40: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61          /* Opera
fe50: 74 6f 72 3a 20 20 6d 65 6d 6f 20 72 75 6e 20 2a  tor:  memo run *
fe60: 2f 0a 20 20 20 20 22 20 20 63 6d 64 20 54 45 58  /.    "  cmd TEX
fe70: 54 2c 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20  T,\n"           
fe80: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e         /* Comman
fe90: 64 20 74 65 78 74 20 2a 2f 0a 20 20 20 20 22 20  d text */.    " 
fea0: 20 61 6e 73 20 54 45 58 54 5c 6e 22 20 20 20 20   ans TEXT\n"    
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fec0: 2a 20 44 65 73 69 72 65 64 20 61 6e 73 77 65 72  * Desired answer
fed0: 20 2a 2f 0a 20 20 20 20 22 29 3b 22 0a 20 20 20   */.    ");".   
fee0: 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41   "CREATE TEMP TA
fef0: 42 4c 45 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66  BLE [_shell$self
ff00: 5d 28 6f 70 2c 63 6d 64 2c 61 6e 73 29 3b 5c 6e  ](op,cmd,ans);\n
ff10: 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e  ".    "INSERT IN
ff20: 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d  TO [_shell$self]
ff30: 28 72 6f 77 69 64 2c 6f 70 2c 63 6d 64 29 5c 6e  (rowid,op,cmd)\n
ff40: 22 0a 20 20 20 20 22 20 20 56 41 4c 55 45 53 28  ".    "  VALUES(
ff50: 63 6f 61 6c 65 73 63 65 28 28 53 45 4c 45 43 54  coalesce((SELECT
ff60: 20 28 6d 61 78 28 74 6e 6f 29 2b 31 30 30 29 2f   (max(tno)+100)/
ff70: 31 30 20 46 52 4f 4d 20 73 65 6c 66 74 65 73 74  10 FROM selftest
ff80: 29 2c 31 30 29 2c 5c 6e 22 0a 20 20 20 20 22 20  ),10),\n".    " 
ff90: 20 20 20 20 20 20 20 20 27 6d 65 6d 6f 27 2c 27          'memo','
ffa0: 54 65 73 74 73 20 67 65 6e 65 72 61 74 65 64 20  Tests generated 
ffb0: 62 79 20 2d 2d 69 6e 69 74 27 29 3b 5c 6e 22 0a  by --init');\n".
ffc0: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
ffd0: 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e   [_shell$self]\n
ffe0: 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
fff0: 27 72 75 6e 27 2c 5c 6e 22 0a 20 20 20 20 22 20  'run',\n".    " 
10000 20 20 20 27 53 45 4c 45 43 54 20 68 65 78 28 73     'SELECT hex(s
10010 68 61 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45  ha3_query(''SELE
10020 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c  CT type,name,tbl
10030 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20  _name,sql ".    
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52               "FR
10060 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
10070 20 4f 52 44 45 52 20 42 59 20 32 27 27 2c 32 32   ORDER BY 2'',22
10080 34 29 29 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20  4))',\n".    "  
10090 20 20 68 65 78 28 73 68 61 33 5f 71 75 65 72 79    hex(sha3_query
100a0 28 27 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61  ('SELECT type,na
100b0 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20  me,tbl_name,sql 
100c0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
100d0 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52 4f              "FRO
100e0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
100f0 4f 52 44 45 52 20 42 59 20 32 27 2c 32 32 34 29  ORDER BY 2',224)
10100 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52  );\n".    "INSER
10110 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73  T INTO [_shell$s
10120 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53  elf]\n".    "  S
10130 45 4c 45 43 54 20 27 72 75 6e 27 2c 22 0a 20 20  ELECT 'run',".  
10140 20 20 22 20 20 20 20 27 53 45 4c 45 43 54 20 68    "    'SELECT h
10150 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 27 27  ex(sha3_query(''
10160 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22  SELECT * FROM \"
10170 27 20 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20  ' ||".    "     
10180 20 20 20 70 72 69 6e 74 66 28 27 25 77 27 2c 6e     printf('%w',n
10190 61 6d 65 29 20 7c 7c 20 27 5c 22 20 4e 4f 54 20  ame) || '\" NOT 
101a0 49 4e 44 45 58 45 44 27 27 2c 32 32 34 29 29 27  INDEXED'',224))'
101b0 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65  ,\n".    "    he
101c0 78 28 73 68 61 33 5f 71 75 65 72 79 28 70 72 69  x(sha3_query(pri
101d0 6e 74 66 28 27 53 45 4c 45 43 54 20 2a 20 46 52  ntf('SELECT * FR
101e0 4f 4d 20 5c 22 25 77 5c 22 20 4e 4f 54 20 49 4e  OM \"%w\" NOT IN
101f0 44 45 58 45 44 27 2c 6e 61 6d 65 29 2c 32 32 34  DEXED',name),224
10200 29 29 5c 6e 22 0a 20 20 20 20 22 20 20 46 52 4f  ))\n".    "  FRO
10210 4d 20 28 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  M (\n".    "    
10220 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
10230 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 5c 6e   sqlite_master\n
10240 22 0a 20 20 20 20 22 20 20 20 20 20 57 48 45 52  ".    "     WHER
10250 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 5c 6e  E type='table'\n
10260 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 41 4e  ".    "       AN
10270 44 20 6e 61 6d 65 3c 3e 27 73 65 6c 66 74 65 73  D name<>'selftes
10280 74 27 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20  t'\n".    "     
10290 20 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 72    AND coalesce(r
102a0 6f 6f 74 70 61 67 65 2c 30 29 3e 30 5c 6e 22 0a  ootpage,0)>0\n".
102b0 20 20 20 20 22 20 20 29 5c 6e 22 0a 20 20 20 20      "  )\n".    
102c0 22 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b  " ORDER BY name;
102d0 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20  \n".    "INSERT 
102e0 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c  INTO [_shell$sel
102f0 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 56 41 4c  f]\n".    "  VAL
10300 55 45 53 28 27 72 75 6e 27 2c 27 50 52 41 47 4d  UES('run','PRAGM
10310 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
10320 6b 27 2c 27 6f 6b 27 29 3b 5c 6e 22 0a 20 20 20  k','ok');\n".   
10330 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 65   "INSERT INTO se
10340 6c 66 74 65 73 74 28 74 6e 6f 2c 6f 70 2c 63 6d  lftest(tno,op,cm
10350 64 2c 61 6e 73 29 22 0a 20 20 20 20 22 20 20 53  d,ans)".    "  S
10360 45 4c 45 43 54 20 72 6f 77 69 64 2a 31 30 2c 6f  ELECT rowid*10,o
10370 70 2c 63 6d 64 2c 61 6e 73 20 46 52 4f 4d 20 5b  p,cmd,ans FROM [
10380 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 3b 5c 6e 22  _shell$self];\n"
10390 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45  .    "DROP TABLE
103a0 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 3b 22   [_shell$self];"
103b0 0a 20 20 20 20 2c 30 2c 30 2c 26 7a 45 72 72 4d  .    ,0,0,&zErrM
103c0 73 67 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d  sg);.  if( zErrM
103d0 73 67 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  sg ){.    utf8_p
103e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
103f0 45 4c 46 54 45 53 54 20 69 6e 69 74 69 61 6c 69  ELFTEST initiali
10400 7a 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 3a 20  zation failure: 
10410 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b  %s\n", zErrMsg);
10420 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
10430 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a  e(zErrMsg);.  }.
10440 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
10450 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20 73  ->db, "RELEASE s
10460 65 6c 66 74 65 73 74 5f 69 6e 69 74 22 2c 30 2c  elftest_init",0,
10470 30 2c 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  0,0);.}.../*.** 
10480 53 65 74 20 74 68 65 20 64 65 73 74 69 6e 61 74  Set the destinat
10490 69 6f 6e 20 74 61 62 6c 65 20 66 69 65 6c 64 20  ion table field 
104a0 6f 66 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74  of the ShellStat
104b0 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 0a 2a  e structure to.*
104c0 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * the name of th
104d0 65 20 74 61 62 6c 65 20 67 69 76 65 6e 2e 20 20  e table given.  
104e0 45 73 63 61 70 65 20 61 6e 79 20 71 75 6f 74 65  Escape any quote
104f0 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
10500 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6e 61 6d 65  he.** table name
10510 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10520 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28   set_table_name(
10530 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63  ShellState *p, c
10540 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
10550 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  ){.  int i, n;. 
10560 20 63 68 61 72 20 63 51 75 6f 74 65 3b 0a 20 20   char cQuote;.  
10570 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20  char *z;..  if( 
10580 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 29 7b  p->zDestTable ){
10590 0a 20 20 20 20 66 72 65 65 28 70 2d 3e 7a 44 65  .    free(p->zDe
105a0 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 2d  stTable);.    p-
105b0 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 30 3b  >zDestTable = 0;
105c0 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65  .  }.  if( zName
105d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
105e0 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68  cQuote = quoteCh
105f0 61 72 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d  ar(zName);.  n =
10600 20 73 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29   strlen30(zName)
10610 3b 0a 20 20 69 66 28 20 63 51 75 6f 74 65 20 29  ;.  if( cQuote )
10620 20 6e 20 2b 3d 20 6e 2b 32 3b 0a 20 20 7a 20 3d   n += n+2;.  z =
10630 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d   p->zDestTable =
10640 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a   malloc( n+1 );.
10650 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 73 68 65    if( z==0 ) she
10660 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79  ll_out_of_memory
10670 28 29 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69  ();.  n = 0;.  i
10680 66 28 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b  f( cQuote ) z[n+
10690 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 66  +] = cQuote;.  f
106a0 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d  or(i=0; zName[i]
106b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b  ; i++){.    z[n+
106c0 2b 5d 20 3d 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20  +] = zName[i];. 
106d0 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d     if( zName[i]=
106e0 3d 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d  =cQuote ) z[n++]
106f0 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7d 0a 20   = cQuote;.  }. 
10700 20 69 66 28 20 63 51 75 6f 74 65 20 29 20 7a 5b   if( cQuote ) z[
10710 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20  n++] = cQuote;. 
10720 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f   z[n] = 0;.}.../
10730 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 71  *.** Execute a q
10740 75 65 72 79 20 73 74 61 74 65 6d 65 6e 74 20 74  uery statement t
10750 68 61 74 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  hat will generat
10760 65 20 53 51 4c 20 6f 75 74 70 75 74 2e 20 20 50  e SQL output.  P
10770 72 69 6e 74 0a 2a 2a 20 74 68 65 20 72 65 73 75  rint.** the resu
10780 6c 74 20 63 6f 6c 75 6d 6e 73 2c 20 63 6f 6d 6d  lt columns, comm
10790 61 2d 73 65 70 61 72 61 74 65 64 2c 20 6f 6e 20  a-separated, on 
107a0 61 20 6c 69 6e 65 20 61 6e 64 20 74 68 65 6e 20  a line and then 
107b0 61 64 64 20 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c  add a.** semicol
107c0 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72 20 74 6f  on terminator to
107d0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74   the end of that
107e0 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   line..**.** If 
107f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
10800 6c 75 6d 6e 73 20 69 73 20 31 20 61 6e 64 20 74  lumns is 1 and t
10810 68 61 74 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  hat column conta
10820 69 6e 73 20 74 65 78 74 20 22 2d 2d 22 0a 2a 2a  ins text "--".**
10830 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
10840 73 65 6d 69 63 6f 6c 6f 6e 20 6f 6e 20 61 20 73  semicolon on a s
10850 65 70 61 72 61 74 65 20 6c 69 6e 65 2e 20 20 54  eparate line.  T
10860 68 61 74 20 77 61 79 2c 20 69 66 20 61 0a 2a 2a  hat way, if a.**
10870 20 22 2d 2d 22 20 63 6f 6d 6d 65 6e 74 20 6f 63   "--" comment oc
10880 63 75 72 73 20 61 74 20 74 68 65 20 65 6e 64 20  curs at the end 
10890 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
108a0 2c 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 2a 2a  , the comment.**
108b0 20 77 6f 6e 27 74 20 63 6f 6e 73 75 6d 65 20 74   won't consume t
108c0 68 65 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72  he semicolon ter
108d0 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  minator..*/.stat
108e0 69 63 20 69 6e 74 20 72 75 6e 5f 74 61 62 6c 65  ic int run_table
108f0 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 53  _dump_query(.  S
10900 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20 20  hellState *p,   
10910 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79          /* Query
10920 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f   context */.  co
10930 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 6c 65 63  nst char *zSelec
10940 74 2c 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54  t,     /* SELECT
10950 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78   statement to ex
10960 74 72 61 63 74 20 63 6f 6e 74 65 6e 74 20 2a 2f  tract content */
10970 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10980 46 69 72 73 74 52 6f 77 20 20 20 20 2f 2a 20 50  FirstRow    /* P
10990 72 69 6e 74 20 62 65 66 6f 72 65 20 66 69 72 73  rint before firs
109a0 74 20 72 6f 77 2c 20 69 66 20 6e 6f 74 20 4e 55  t row, if not NU
109b0 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
109c0 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74  e3_stmt *pSelect
109d0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
109e0 74 20 6e 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74  t nResult;.  int
109f0 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
10a00 20 2a 7a 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   *z;.  rc = sqli
10a10 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
10a20 2d 3e 64 62 2c 20 7a 53 65 6c 65 63 74 2c 20 2d  ->db, zSelect, -
10a30 31 2c 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b  1, &pSelect, 0);
10a40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
10a50 45 5f 4f 4b 20 7c 7c 20 21 70 53 65 6c 65 63 74  E_OK || !pSelect
10a60 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
10a70 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a  ntf(p->out, "/**
10a80 2a 2a 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25  ** ERROR: (%d) %
10a90 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c  s *****/\n", rc,
10aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10ab0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
10ac0 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28  p->db));.    if(
10ad0 20 28 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49   (rc&0xff)!=SQLI
10ae0 54 45 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e  TE_CORRUPT ) p->
10af0 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
10b00 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20  rn rc;.  }.  rc 
10b10 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
10b20 53 65 6c 65 63 74 29 3b 0a 20 20 6e 52 65 73 75  Select);.  nResu
10b30 6c 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  lt = sqlite3_col
10b40 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 65 6c 65 63  umn_count(pSelec
10b50 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d  t);.  while( rc=
10b60 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
10b70 20 20 20 69 66 28 20 7a 46 69 72 73 74 52 6f 77     if( zFirstRow
10b80 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
10b90 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
10ba0 73 22 2c 20 7a 46 69 72 73 74 52 6f 77 29 3b 0a  s", zFirstRow);.
10bb0 20 20 20 20 20 20 7a 46 69 72 73 74 52 6f 77 20        zFirstRow 
10bc0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  = 0;.    }.    z
10bd0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
10be0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
10bf0 65 78 74 28 70 53 65 6c 65 63 74 2c 20 30 29 3b  ext(pSelect, 0);
10c00 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
10c10 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
10c20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  );.    for(i=1; 
10c30 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b  i<nResult; i++){
10c40 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
10c50 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 25 73 22  tf(p->out, ",%s"
10c60 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
10c70 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c 20 69  _text(pSelect, i
10c80 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
10c90 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b  ( z==0 ) z = "";
10ca0 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d  .    while( z[0]
10cb0 20 26 26 20 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c   && (z[0]!='-' |
10cc0 7c 20 7a 5b 31 5d 21 3d 27 2d 27 29 20 29 20 7a  | z[1]!='-') ) z
10cd0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  ++;.    if( z[0]
10ce0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
10cf0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
10d00 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ;\n");.    }else
10d10 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
10d20 74 66 28 70 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22  tf(p->out, ";\n"
10d30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
10d40 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
10d50 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72  Select);.  }.  r
10d60 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
10d70 6c 69 7a 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lize(pSelect);. 
10d80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10d90 4f 4b 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  OK ){.    utf8_p
10da0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f  rintf(p->out, "/
10db0 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 28 25 64 29  **** ERROR: (%d)
10dc0 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72   %s *****/\n", r
10dd0 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c,.             
10de0 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
10df0 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69  g(p->db));.    i
10e00 66 28 20 28 72 63 26 30 78 66 66 29 21 3d 53 51  f( (rc&0xff)!=SQ
10e10 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 20 70  LITE_CORRUPT ) p
10e20 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nErr++;.  }.  
10e30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10e40 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61  .** Allocate spa
10e50 63 65 20 61 6e 64 20 73 61 76 65 20 6f 66 66 20  ce and save off 
10e60 63 75 72 72 65 6e 74 20 65 72 72 6f 72 20 73 74  current error st
10e70 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
10e80 63 68 61 72 20 2a 73 61 76 65 5f 65 72 72 5f 6d  char *save_err_m
10e90 73 67 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  sg(.  sqlite3 *d
10ea0 62 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b            /* 
10eb0 44 61 74 61 62 61 73 65 20 74 6f 20 71 75 65 72  Database to quer
10ec0 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  y */.){.  int nE
10ed0 72 72 4d 73 67 20 3d 20 31 2b 73 74 72 6c 65 6e  rrMsg = 1+strlen
10ee0 33 30 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  30(sqlite3_errms
10ef0 67 28 64 62 29 29 3b 0a 20 20 63 68 61 72 20 2a  g(db));.  char *
10f00 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
10f10 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 45 72 72 4d  3_malloc64(nErrM
10f20 73 67 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d  sg);.  if( zErrM
10f30 73 67 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  sg ){.    memcpy
10f40 28 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65  (zErrMsg, sqlite
10f50 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 6e 45  3_errmsg(db), nE
10f60 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65  rrMsg);.  }.  re
10f70 74 75 72 6e 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a  turn zErrMsg;.}.
10f80 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f  .#ifdef __linux_
10f90 5f 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  _./*.** Attempt 
10fa0 74 6f 20 64 69 73 70 6c 61 79 20 49 2f 4f 20 73  to display I/O s
10fb0 74 61 74 73 20 6f 6e 20 4c 69 6e 75 78 20 75 73  tats on Linux us
10fc0 69 6e 67 20 2f 70 72 6f 63 2f 50 49 44 2f 69 6f  ing /proc/PID/io
10fd0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10fe0 64 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74  displayLinuxIoSt
10ff0 61 74 73 28 46 49 4c 45 20 2a 6f 75 74 29 7b 0a  ats(FILE *out){.
11000 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68    FILE *in;.  ch
11010 61 72 20 7a 5b 32 30 30 5d 3b 0a 20 20 73 71 6c  ar z[200];.  sql
11020 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
11030 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 2f 70 72  zeof(z), z, "/pr
11040 6f 63 2f 25 64 2f 69 6f 22 2c 20 67 65 74 70 69  oc/%d/io", getpi
11050 64 28 29 29 3b 0a 20 20 69 6e 20 3d 20 66 6f 70  d());.  in = fop
11060 65 6e 28 7a 2c 20 22 72 62 22 29 3b 0a 20 20 69  en(z, "rb");.  i
11070 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72  f( in==0 ) retur
11080 6e 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74  n;.  while( fget
11090 73 28 7a 2c 20 73 69 7a 65 6f 66 28 7a 29 2c 20  s(z, sizeof(z), 
110a0 69 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 74  in)!=0 ){.    st
110b0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
110c0 74 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  t {.      const 
110d0 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b 0a  char *zPattern;.
110e0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
110f0 20 2a 7a 44 65 73 63 3b 0a 20 20 20 20 7d 20 61   *zDesc;.    } a
11100 54 72 61 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  Trans[] = {.    
11110 20 20 7b 20 22 72 63 68 61 72 3a 20 22 2c 20 20    { "rchar: ",  
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11130 22 42 79 74 65 73 20 72 65 63 65 69 76 65 64 20  "Bytes received 
11140 62 79 20 72 65 61 64 28 29 3a 22 20 7d 2c 0a 20  by read():" },. 
11150 20 20 20 20 20 7b 20 22 77 63 68 61 72 3a 20 22       { "wchar: "
11160 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11170 20 20 20 22 42 79 74 65 73 20 73 65 6e 74 20 74     "Bytes sent t
11180 6f 20 77 72 69 74 65 28 29 3a 22 20 20 20 20 7d  o write():"    }
11190 2c 0a 20 20 20 20 20 20 7b 20 22 73 79 73 63 72  ,.      { "syscr
111a0 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  : ",            
111b0 20 20 20 20 20 20 22 52 65 61 64 28 29 20 73 79        "Read() sy
111c0 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20  stem calls:"    
111d0 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 79    },.      { "sy
111e0 73 63 77 3a 20 22 2c 20 20 20 20 20 20 20 20 20  scw: ",         
111f0 20 20 20 20 20 20 20 20 20 22 57 72 69 74 65 28           "Write(
11200 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 3a 22  ) system calls:"
11210 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
11220 22 72 65 61 64 5f 62 79 74 65 73 3a 20 22 2c 20  "read_bytes: ", 
11230 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74              "Byt
11240 65 73 20 72 65 61 64 20 66 72 6f 6d 20 73 74 6f  es read from sto
11250 72 61 67 65 3a 22 20 20 7d 2c 0a 20 20 20 20 20  rage:"  },.     
11260 20 7b 20 22 77 72 69 74 65 5f 62 79 74 65 73 3a   { "write_bytes:
11270 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22   ",            "
11280 42 79 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f  Bytes written to
11290 20 73 74 6f 72 61 67 65 3a 22 20 7d 2c 0a 20 20   storage:" },.  
112a0 20 20 20 20 7b 20 22 63 61 6e 63 65 6c 6c 65 64      { "cancelled
112b0 5f 77 72 69 74 65 5f 62 79 74 65 73 3a 20 22 2c  _write_bytes: ",
112c0 20 20 22 43 61 6e 63 65 6c 6c 65 64 20 77 72 69    "Cancelled wri
112d0 74 65 20 62 79 74 65 73 3a 22 20 20 20 20 7d 2c  te bytes:"    },
112e0 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
112f0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
11300 69 3c 41 72 72 61 79 53 69 7a 65 28 61 54 72 61  i<ArraySize(aTra
11310 6e 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ns); i++){.     
11320 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33   int n = strlen3
11330 30 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61 74  0(aTrans[i].zPat
11340 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  tern);.      if(
11350 20 73 74 72 6e 63 6d 70 28 61 54 72 61 6e 73 5b   strncmp(aTrans[
11360 69 5d 2e 7a 50 61 74 74 65 72 6e 2c 20 7a 2c 20  i].zPattern, z, 
11370 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  n)==0 ){.       
11380 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
11390 2c 20 22 25 2d 33 36 73 20 25 73 22 2c 20 61 54  , "%-36s %s", aT
113a0 72 61 6e 73 5b 69 5d 2e 7a 44 65 73 63 2c 20 26  rans[i].zDesc, &
113b0 7a 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20 62  z[n]);.        b
113c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
113d0 20 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65    }.  }.  fclose
113e0 28 69 6e 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  (in);.}.#endif..
113f0 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 61 20  /*.** Display a 
11400 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 73  single line of s
11410 74 61 74 75 73 20 75 73 69 6e 67 20 36 34 2d 62  tatus using 64-b
11420 69 74 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74  it values..*/.st
11430 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61  atic void displa
11440 79 53 74 61 74 4c 69 6e 65 28 0a 20 20 53 68 65  yStatLine(.  She
11450 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20  llState *p,     
11460 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68         /* The sh
11470 65 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ell context */. 
11480 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 20 20   char *zLabel,  
11490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
114a0 62 65 6c 20 66 6f 72 20 74 68 69 73 20 6f 6e 65  bel for this one
114b0 20 6c 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20   line */.  char 
114c0 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 20 20 20 20  *zFormat,       
114d0 20 20 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20 66       /* Format f
114e0 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  or the result */
114f0 0a 20 20 69 6e 74 20 69 53 74 61 74 75 73 43 74  .  int iStatusCt
11500 72 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rl,          /* 
11510 57 68 69 63 68 20 73 74 61 74 75 73 20 74 6f 20  Which status to 
11520 64 69 73 70 6c 61 79 20 2a 2f 0a 20 20 69 6e 74  display */.  int
11530 20 62 52 65 73 65 74 20 20 20 20 20 20 20 20 20   bReset         
11540 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
11550 6f 20 72 65 73 65 74 20 74 68 65 20 73 74 61 74  o reset the stat
11560 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
11570 33 5f 69 6e 74 36 34 20 69 43 75 72 20 3d 20 2d  3_int64 iCur = -
11580 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  1;.  sqlite3_int
11590 36 34 20 69 48 69 77 74 72 20 3d 20 2d 31 3b 0a  64 iHiwtr = -1;.
115a0 20 20 69 6e 74 20 69 2c 20 6e 50 65 72 63 65 6e    int i, nPercen
115b0 74 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b  t;.  char zLine[
115c0 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f  200];.  sqlite3_
115d0 73 74 61 74 75 73 36 34 28 69 53 74 61 74 75 73  status64(iStatus
115e0 43 74 72 6c 2c 20 26 69 43 75 72 2c 20 26 69 48  Ctrl, &iCur, &iH
115f0 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
11600 20 66 6f 72 28 69 3d 30 2c 20 6e 50 65 72 63 65   for(i=0, nPerce
11610 6e 74 3d 30 3b 20 7a 46 6f 72 6d 61 74 5b 69 5d  nt=0; zFormat[i]
11620 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
11630 7a 46 6f 72 6d 61 74 5b 69 5d 3d 3d 27 25 27 20  zFormat[i]=='%' 
11640 29 20 6e 50 65 72 63 65 6e 74 2b 2b 3b 0a 20 20  ) nPercent++;.  
11650 7d 0a 20 20 69 66 28 20 6e 50 65 72 63 65 6e 74  }.  if( nPercent
11660 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >1 ){.    sqlite
11670 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
11680 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c  f(zLine), zLine,
11690 20 7a 46 6f 72 6d 61 74 2c 20 69 43 75 72 2c 20   zFormat, iCur, 
116a0 69 48 69 77 74 72 29 3b 0a 20 20 7d 65 6c 73 65  iHiwtr);.  }else
116b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
116c0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c  printf(sizeof(zL
116d0 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f  ine), zLine, zFo
116e0 72 6d 61 74 2c 20 69 48 69 77 74 72 29 3b 0a 20  rmat, iHiwtr);. 
116f0 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28   }.  raw_printf(
11700 70 2d 3e 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  p->out, "%-36s %
11710 73 5c 6e 22 2c 20 7a 4c 61 62 65 6c 2c 20 7a 4c  s\n", zLabel, zL
11720 69 6e 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ine);.}../*.** D
11730 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73 74  isplay memory st
11740 61 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ats..*/.static i
11750 6e 74 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73  nt display_stats
11760 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20 71  /* Database to q
11790 75 65 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c 53  uery */.  ShellS
117a0 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20  tate *pArg,     
117b0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
117c0 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a   to ShellState *
117d0 2f 0a 20 20 69 6e 74 20 62 52 65 73 65 74 20 20  /.  int bReset  
117e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117f0 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74  /* True to reset
11800 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b   the stats */.){
11810 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69  .  int iCur;.  i
11820 6e 74 20 69 48 69 77 74 72 3b 0a 20 20 46 49 4c  nt iHiwtr;.  FIL
11830 45 20 2a 6f 75 74 3b 0a 20 20 69 66 28 20 70 41  E *out;.  if( pA
11840 72 67 3d 3d 30 20 7c 7c 20 70 41 72 67 2d 3e 6f  rg==0 || pArg->o
11850 75 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ut==0 ) return 0
11860 3b 0a 20 20 6f 75 74 20 3d 20 70 41 72 67 2d 3e  ;.  out = pArg->
11870 6f 75 74 3b 0a 0a 20 20 69 66 28 20 70 41 72 67  out;..  if( pArg
11880 2d 3e 70 53 74 6d 74 20 26 26 20 28 70 41 72 67  ->pStmt && (pArg
11890 2d 3e 73 74 61 74 73 4f 6e 20 26 20 32 29 20 29  ->statsOn & 2) )
118a0 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 2c 20  {.    int nCol, 
118b0 69 2c 20 78 3b 0a 20 20 20 20 73 71 6c 69 74 65  i, x;.    sqlite
118c0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
118d0 70 41 72 67 2d 3e 70 53 74 6d 74 3b 0a 20 20 20  pArg->pStmt;.   
118e0 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 20 20   char z[100];.  
118f0 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33    nCol = sqlite3
11900 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
11910 74 6d 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  tmt);.    raw_pr
11920 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
11930 20 25 64 5c 6e 22 2c 20 22 4e 75 6d 62 65 72 20   %d\n", "Number 
11940 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  of output column
11950 73 3a 22 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  s:", nCol);.    
11960 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
11970 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
11980 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
11990 7a 65 6f 66 28 7a 29 2c 7a 2c 22 43 6f 6c 75 6d  zeof(z),z,"Colum
119a0 6e 20 25 64 20 25 6e 6e 61 6d 65 3a 22 2c 20 69  n %d %nname:", i
119b0 2c 20 26 78 29 3b 0a 20 20 20 20 20 20 75 74 66  , &x);.      utf
119c0 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
119d0 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73  -36s %s\n", z, s
119e0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
119f0 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 23 69  me(pStmt,i));.#i
11a00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11a10 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20  T_DECLTYPE.     
11a20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
11a30 66 28 33 30 2c 20 7a 2b 78 2c 20 22 64 65 63 6c  f(30, z+x, "decl
11a40 61 72 65 64 20 74 79 70 65 3a 22 29 3b 0a 20 20  ared type:");.  
11a50 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
11a60 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e  out, "%-36s %s\n
11a70 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f  ", z, sqlite3_co
11a80 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 28 70 53  lumn_decltype(pS
11a90 74 6d 74 2c 20 69 29 29 3b 0a 23 65 6e 64 69 66  tmt, i));.#endif
11aa0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
11ab0 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
11ac0 41 44 41 54 41 0a 20 20 20 20 20 20 73 71 6c 69  ADATA.      sqli
11ad0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c  te3_snprintf(30,
11ae0 20 7a 2b 78 2c 20 22 64 61 74 61 62 61 73 65 20   z+x, "database 
11af0 6e 61 6d 65 3a 22 29 3b 0a 20 20 20 20 20 20 75  name:");.      u
11b00 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
11b10 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c  "%-36s %s\n", z,
11b20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
11b30 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 28 70 53  database_name(pS
11b40 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 73  tmt,i));.      s
11b50 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
11b60 33 30 2c 20 7a 2b 78 2c 20 22 74 61 62 6c 65 20  30, z+x, "table 
11b70 6e 61 6d 65 3a 22 29 3b 0a 20 20 20 20 20 20 75  name:");.      u
11b80 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
11b90 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c  "%-36s %s\n", z,
11ba0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
11bb0 74 61 62 6c 65 5f 6e 61 6d 65 28 70 53 74 6d 74  table_name(pStmt
11bc0 2c 69 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ,i));.      sqli
11bd0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c  te3_snprintf(30,
11be0 20 7a 2b 78 2c 20 22 6f 72 69 67 69 6e 20 6e 61   z+x, "origin na
11bf0 6d 65 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66  me:");.      utf
11c00 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
11c10 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73  -36s %s\n", z, s
11c20 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72  qlite3_column_or
11c30 69 67 69 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  igin_name(pStmt,
11c40 69 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  i));.#endif.    
11c50 7d 0a 20 20 7d 0a 0a 20 20 64 69 73 70 6c 61 79  }.  }..  display
11c60 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
11c70 4d 65 6d 6f 72 79 20 55 73 65 64 3a 22 2c 0a 20  Memory Used:",. 
11c80 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25      "%lld (max %
11c90 6c 6c 64 29 20 62 79 74 65 73 22 2c 20 53 51 4c  lld) bytes", SQL
11ca0 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52  ITE_STATUS_MEMOR
11cb0 59 5f 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b  Y_USED, bReset);
11cc0 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69  .  displayStatLi
11cd0 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72  ne(pArg, "Number
11ce0 20 6f 66 20 4f 75 74 73 74 61 6e 64 69 6e 67 20   of Outstanding 
11cf0 41 6c 6c 6f 63 61 74 69 6f 6e 73 3a 22 2c 0a 20  Allocations:",. 
11d00 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25      "%lld (max %
11d10 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f 53 54  lld)", SQLITE_ST
11d20 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55 4e  ATUS_MALLOC_COUN
11d30 54 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 69 66  T, bReset);.  if
11d40 28 20 70 41 72 67 2d 3e 73 68 65 6c 6c 46 6c 67  ( pArg->shellFlg
11d50 73 20 26 20 53 48 46 4c 47 5f 50 61 67 65 63 61  s & SHFLG_Pageca
11d60 63 68 65 20 29 7b 0a 20 20 20 20 64 69 73 70 6c  che ){.    displ
11d70 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c  ayStatLine(pArg,
11d80 20 22 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63   "Number of Pcac
11d90 68 65 20 50 61 67 65 73 20 55 73 65 64 3a 22 2c  he Pages Used:",
11da0 0a 20 20 20 20 20 20 20 22 25 6c 6c 64 20 28 6d  .       "%lld (m
11db0 61 78 20 25 6c 6c 64 29 20 70 61 67 65 73 22 2c  ax %lld) pages",
11dc0 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50   SQLITE_STATUS_P
11dd0 41 47 45 43 41 43 48 45 5f 55 53 45 44 2c 20 62  AGECACHE_USED, b
11de0 52 65 73 65 74 29 3b 0a 20 20 7d 0a 20 20 64 69  Reset);.  }.  di
11df0 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41  splayStatLine(pA
11e00 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 50  rg, "Number of P
11e10 63 61 63 68 65 20 4f 76 65 72 66 6c 6f 77 20 42  cache Overflow B
11e20 79 74 65 73 3a 22 2c 0a 20 20 20 20 20 22 25 6c  ytes:",.     "%l
11e30 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20 62 79  ld (max %lld) by
11e40 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41  tes", SQLITE_STA
11e50 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 4f 56  TUS_PAGECACHE_OV
11e60 45 52 46 4c 4f 57 2c 20 62 52 65 73 65 74 29 3b  ERFLOW, bReset);
11e70 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69  .  displayStatLi
11e80 6e 65 28 70 41 72 67 2c 20 22 4c 61 72 67 65 73  ne(pArg, "Larges
11e90 74 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a  t Allocation:",.
11ea0 20 20 20 20 20 22 25 6c 6c 64 20 62 79 74 65 73       "%lld bytes
11eb0 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53  ", SQLITE_STATUS
11ec0 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20 62 52  _MALLOC_SIZE, bR
11ed0 65 73 65 74 29 3b 0a 20 20 64 69 73 70 6c 61 79  eset);.  display
11ee0 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
11ef0 4c 61 72 67 65 73 74 20 50 63 61 63 68 65 20 41  Largest Pcache A
11f00 6c 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20  llocation:",.   
11f10 20 20 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20    "%lld bytes", 
11f20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41  SQLITE_STATUS_PA
11f30 47 45 43 41 43 48 45 5f 53 49 5a 45 2c 20 62 52  GECACHE_SIZE, bR
11f40 65 73 65 74 29 3b 0a 23 69 66 64 65 66 20 59 59  eset);.#ifdef YY
11f50 54 52 41 43 4b 4d 41 58 53 54 41 43 4b 44 45 50  TRACKMAXSTACKDEP
11f60 54 48 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74  TH.  displayStat
11f70 4c 69 6e 65 28 70 41 72 67 2c 20 22 44 65 65 70  Line(pArg, "Deep
11f80 65 73 74 20 50 61 72 73 65 72 20 53 74 61 63 6b  est Parser Stack
11f90 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28  :",.     "%lld (
11fa0 6d 61 78 20 25 6c 6c 64 29 22 2c 20 53 51 4c 49  max %lld)", SQLI
11fb0 54 45 5f 53 54 41 54 55 53 5f 50 41 52 53 45 52  TE_STATUS_PARSER
11fc0 5f 53 54 41 43 4b 2c 20 62 52 65 73 65 74 29 3b  _STACK, bReset);
11fd0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 64  .#endif..  if( d
11fe0 62 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 72  b ){.    if( pAr
11ff0 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 53  g->shellFlgs & S
12000 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65 20 29  HFLG_Lookaside )
12010 7b 0a 20 20 20 20 20 20 69 48 69 77 74 72 20 3d  {.      iHiwtr =
12020 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
12030 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
12040 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
12050 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44  BSTATUS_LOOKASID
12060 45 5f 55 53 45 44 2c 0a 20 20 20 20 20 20 20 20  E_USED,.        
12070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12080 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
12090 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72  bReset);.      r
120a0 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
120b0 6f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  out,.           
120c0 20 20 20 22 4c 6f 6f 6b 61 73 69 64 65 20 53 6c     "Lookaside Sl
120d0 6f 74 73 20 55 73 65 64 3a 20 20 20 20 20 20 20  ots Used:       
120e0 20 20 20 20 20 20 20 20 20 25 64 20 28 6d 61 78           %d (max
120f0 20 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20   %d)\n",.       
12100 20 20 20 20 20 20 20 69 43 75 72 2c 20 69 48 69         iCur, iHi
12110 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wtr);.      sqli
12120 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
12130 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
12140 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 48 49 54 2c  S_LOOKASIDE_HIT,
12150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12160 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20           &iCur, 
12170 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
12180 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
12190 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53  tf(pArg->out, "S
121a0 75 63 63 65 73 73 66 75 6c 20 6c 6f 6f 6b 61 73  uccessful lookas
121b0 69 64 65 20 61 74 74 65 6d 70 74 73 3a 20 20 20  ide attempts:   
121c0 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20      %d\n",.     
121d0 20 20 20 20 20 20 20 20 20 69 48 69 77 74 72 29           iHiwtr)
121e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
121f0 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
12200 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f  LITE_DBSTATUS_LO
12210 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f 53 49 5a  OKASIDE_MISS_SIZ
12220 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
12230 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72             &iCur
12240 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
12250 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  t);.      raw_pr
12260 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
12270 22 4c 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c 75  "Lookaside failu
12280 72 65 73 20 64 75 65 20 74 6f 20 73 69 7a 65 3a  res due to size:
12290 20 20 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20        %d\n",.   
122a0 20 20 20 20 20 20 20 20 20 20 20 69 48 69 77 74             iHiwt
122b0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
122c0 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
122d0 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
122e0 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f 46  LOOKASIDE_MISS_F
122f0 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
12300 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69 43               &iC
12310 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
12320 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f  set);.      raw_
12330 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12340 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20 66 61 69  , "Lookaside fai
12350 6c 75 72 65 73 20 64 75 65 20 74 6f 20 4f 4f 4d  lures due to OOM
12360 3a 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 0a 20  :       %d\n",. 
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 69 48 69               iHi
12380 77 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wtr);.    }.    
12390 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
123a0 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
123b0 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
123c0 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
123d0 43 48 45 5f 55 53 45 44 2c 20 26 69 43 75 72 2c  CHE_USED, &iCur,
123e0 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
123f0 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
12400 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61  f(pArg->out, "Pa
12410 67 65 72 20 48 65 61 70 20 55 73 61 67 65 3a 20  ger Heap Usage: 
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12430 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a     %d bytes\n",.
12440 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72              iCur
12450 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20  );.    iHiwtr = 
12460 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73  iCur = -1;.    s
12470 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
12480 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  (db, SQLITE_DBST
12490 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20  ATUS_CACHE_HIT, 
124a0 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
124b0 31 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  1);.    raw_prin
124c0 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50  tf(pArg->out, "P
124d0 61 67 65 20 63 61 63 68 65 20 68 69 74 73 3a 20  age cache hits: 
124e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124f0 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
12500 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  ;.    iHiwtr = i
12510 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
12520 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
12530 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
12540 54 55 53 5f 43 41 43 48 45 5f 4d 49 53 53 2c 20  TUS_CACHE_MISS, 
12550 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
12560 31 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  1);.    raw_prin
12570 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50  tf(pArg->out, "P
12580 61 67 65 20 63 61 63 68 65 20 6d 69 73 73 65 73  age cache misses
12590 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
125a0 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
125b0 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  ;.    iHiwtr = i
125c0 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
125d0 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
125e0 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
125f0 54 55 53 5f 43 41 43 48 45 5f 57 52 49 54 45 2c  TUS_CACHE_WRITE,
12600 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
12610 20 31 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69   1);.    raw_pri
12620 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
12630 50 61 67 65 20 63 61 63 68 65 20 77 72 69 74 65  Page cache write
12640 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s:              
12650 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
12660 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20  );.    iHiwtr = 
12670 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73  iCur = -1;.    s
12680 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
12690 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  (db, SQLITE_DBST
126a0 41 54 55 53 5f 43 41 43 48 45 5f 53 50 49 4c 4c  ATUS_CACHE_SPILL
126b0 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
126c0 2c 20 31 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  , 1);.    raw_pr
126d0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
126e0 22 50 61 67 65 20 63 61 63 68 65 20 73 70 69 6c  "Page cache spil
126f0 6c 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ls:             
12700 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
12710 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d  r);.    iHiwtr =
12720 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
12730 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
12740 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
12750 54 41 54 55 53 5f 53 43 48 45 4d 41 5f 55 53 45  TATUS_SCHEMA_USE
12760 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  D, &iCur, &iHiwt
12770 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
12780 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
12790 3e 6f 75 74 2c 20 22 53 63 68 65 6d 61 20 48 65  >out, "Schema He
127a0 61 70 20 55 73 61 67 65 3a 20 20 20 20 20 20 20  ap Usage:       
127b0 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20 62              %d b
127c0 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ytes\n",.       
127d0 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 20 20       iCur);.    
127e0 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
127f0 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
12800 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
12810 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53 54  LITE_DBSTATUS_ST
12820 4d 54 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20  MT_USED, &iCur, 
12830 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
12840 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
12850 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 74 61  (pArg->out, "Sta
12860 74 65 6d 65 6e 74 20 48 65 61 70 2f 4c 6f 6f 6b  tement Heap/Look
12870 61 73 69 64 65 20 55 73 61 67 65 3a 20 20 20 20  aside Usage:    
12880 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20    %d bytes\n",. 
12890 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72 29             iCur)
128a0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 41 72  ;.  }..  if( pAr
128b0 67 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  g->pStmt ){.    
128c0 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73  iCur = sqlite3_s
128d0 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d  tmt_status(pArg-
128e0 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53  >pStmt, SQLITE_S
128f0 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
12900 41 4e 5f 53 54 45 50 2c 0a 20 20 20 20 20 20 20  AN_STEP,.       
12910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12920 20 20 20 20 20 20 20 20 62 52 65 73 65 74 29 3b          bReset);
12930 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
12940 70 41 72 67 2d 3e 6f 75 74 2c 20 22 46 75 6c 6c  pArg->out, "Full
12950 73 63 61 6e 20 53 74 65 70 73 3a 20 20 20 20 20  scan Steps:     
12960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12970 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12980 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65     iCur = sqlite
12990 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41  3_stmt_status(pA
129a0 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54  rg->pStmt, SQLIT
129b0 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52  E_STMTSTATUS_SOR
129c0 54 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  T, bReset);.    
129d0 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
129e0 3e 6f 75 74 2c 20 22 53 6f 72 74 20 4f 70 65 72  >out, "Sort Oper
129f0 61 74 69 6f 6e 73 3a 20 20 20 20 20 20 20 20 20  ations:         
12a00 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
12a10 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43  ", iCur);.    iC
12a20 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  ur = sqlite3_stm
12a30 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70  t_status(pArg->p
12a40 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d  Stmt, SQLITE_STM
12a50 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45  TSTATUS_AUTOINDE
12a60 58 2c 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72  X,bReset);.    r
12a70 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
12a80 6f 75 74 2c 20 22 41 75 74 6f 69 6e 64 65 78 20  out, "Autoindex 
12a90 49 6e 73 65 72 74 73 3a 20 20 20 20 20 20 20 20  Inserts:        
12aa0 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
12ab0 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75  , iCur);.    iCu
12ac0 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  r = sqlite3_stmt
12ad0 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53  _status(pArg->pS
12ae0 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54  tmt, SQLITE_STMT
12af0 53 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 2c 20  STATUS_VM_STEP, 
12b00 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
12b10 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12b20 74 2c 20 22 56 69 72 74 75 61 6c 20 4d 61 63 68  t, "Virtual Mach
12b30 69 6e 65 20 53 74 65 70 73 3a 20 20 20 20 20 20  ine Steps:      
12b40 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
12b50 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20  iCur);.    iCur 
12b60 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
12b70 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d  tatus(pArg->pStm
12b80 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  t, SQLITE_STMTST
12b90 41 54 55 53 5f 52 45 50 52 45 50 41 52 45 2c 20  ATUS_REPREPARE, 
12ba0 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
12bb0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12bc0 74 2c 20 22 52 65 70 72 65 70 61 72 65 20 6f 70  t, "Reprepare op
12bd0 65 72 61 74 69 6f 6e 73 3a 20 20 20 20 20 20 20  erations:       
12be0 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
12bf0 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20  iCur);.    iCur 
12c00 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
12c10 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d  tatus(pArg->pStm
12c20 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  t, SQLITE_STMTST
12c30 41 54 55 53 5f 52 55 4e 2c 20 62 52 65 73 65 74  ATUS_RUN, bReset
12c40 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
12c50 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4e 75  f(pArg->out, "Nu
12c60 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 72 75  mber of times ru
12c70 6e 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n:              
12c80 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
12c90 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
12ca0 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
12cb0 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
12cc0 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 4d  ITE_STMTSTATUS_M
12cd0 45 4d 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b  EMUSED, bReset);
12ce0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
12cf0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4d 65 6d 6f  pArg->out, "Memo
12d00 72 79 20 75 73 65 64 20 62 79 20 70 72 65 70 61  ry used by prepa
12d10 72 65 64 20 73 74 6d 74 3a 20 20 20 20 20 20 20  red stmt:       
12d20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12d30 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e   }..#ifdef __lin
12d40 75 78 5f 5f 0a 20 20 64 69 73 70 6c 61 79 4c 69  ux__.  displayLi
12d50 6e 75 78 49 6f 53 74 61 74 73 28 70 41 72 67 2d  nuxIoStats(pArg-
12d60 3e 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  >out);.#endif.. 
12d70 20 2f 2a 20 44 6f 20 6e 6f 74 20 72 65 6d 6f 76   /* Do not remov
12d80 65 20 74 68 69 73 20 6d 61 63 68 69 6e 65 20 72  e this machine r
12d90 65 61 64 61 62 6c 65 20 63 6f 6d 6d 65 6e 74 3a  eadable comment:
12da0 20 65 78 74 72 61 2d 73 74 61 74 73 2d 6f 75 74   extra-stats-out
12db0 70 75 74 2d 68 65 72 65 20 2a 2f 0a 0a 20 20 72  put-here */..  r
12dc0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
12dd0 2a 20 44 69 73 70 6c 61 79 20 73 63 61 6e 20 73  * Display scan s
12de0 74 61 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tats..*/.static 
12df0 76 6f 69 64 20 64 69 73 70 6c 61 79 5f 73 63 61  void display_sca
12e00 6e 73 74 61 74 73 28 0a 20 20 73 71 6c 69 74 65  nstats(.  sqlite
12e10 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
12e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
12e30 61 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a  abase to query *
12e40 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  /.  ShellState *
12e50 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
12e60 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
12e70 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a  o ShellState */.
12e80 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
12e90 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
12ea0 41 4e 53 54 41 54 55 53 0a 20 20 55 4e 55 53 45  ANSTATUS.  UNUSE
12eb0 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b  D_PARAMETER(db);
12ec0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
12ed0 54 45 52 28 70 41 72 67 29 3b 0a 23 65 6c 73 65  TER(pArg);.#else
12ee0 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 2c 20  .  int i, k, n, 
12ef0 6d 78 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  mx;.  raw_printf
12f00 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d  (pArg->out, "---
12f10 2d 2d 2d 2d 2d 20 73 63 61 6e 73 74 61 74 73 20  ----- scanstats 
12f20 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20  --------\n");.  
12f30 6d 78 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6b 3d  mx = 0;.  for(k=
12f40 30 3b 20 6b 3c 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a  0; k<=mx; k++){.
12f50 20 20 20 20 64 6f 75 62 6c 65 20 72 45 73 74 4c      double rEstL
12f60 6f 6f 70 20 3d 20 31 2e 30 3b 0a 20 20 20 20 66  oop = 1.0;.    f
12f70 6f 72 28 69 3d 6e 3d 30 3b 20 31 3b 20 69 2b 2b  or(i=n=0; 1; i++
12f80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12f90 5f 73 74 6d 74 20 2a 70 20 3d 20 70 41 72 67 2d  _stmt *p = pArg-
12fa0 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 73 71  >pStmt;.      sq
12fb0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f  lite3_int64 nLoo
12fc0 70 2c 20 6e 56 69 73 69 74 3b 0a 20 20 20 20 20  p, nVisit;.     
12fd0 20 64 6f 75 62 6c 65 20 72 45 73 74 3b 0a 20 20   double rEst;.  
12fe0 20 20 20 20 69 6e 74 20 69 53 69 64 3b 0a 20 20      int iSid;.  
12ff0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
13000 7a 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20  zExplain;.      
13010 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  if( sqlite3_stmt
13020 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69  _scanstatus(p, i
13030 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
13040 54 5f 4e 4c 4f 4f 50 2c 20 28 76 6f 69 64 2a 29  T_NLOOP, (void*)
13050 26 6e 4c 6f 6f 70 29 20 29 7b 0a 20 20 20 20 20  &nLoop) ){.     
13060 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13070 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
13080 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
13090 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
130a0 4e 53 54 41 54 5f 53 45 4c 45 43 54 49 44 2c 20  NSTAT_SELECTID, 
130b0 28 76 6f 69 64 2a 29 26 69 53 69 64 29 3b 0a 20  (void*)&iSid);. 
130c0 20 20 20 20 20 69 66 28 20 69 53 69 64 3e 6d 78       if( iSid>mx
130d0 20 29 20 6d 78 20 3d 20 69 53 69 64 3b 0a 20 20   ) mx = iSid;.  
130e0 20 20 20 20 69 66 28 20 69 53 69 64 21 3d 6b 20      if( iSid!=k 
130f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
13100 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
13110 20 20 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 3d        rEstLoop =
13120 20 28 64 6f 75 62 6c 65 29 6e 4c 6f 6f 70 3b 0a   (double)nLoop;.
13130 20 20 20 20 20 20 20 20 69 66 28 20 6b 3e 30 20          if( k>0 
13140 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72  ) raw_printf(pAr
13150 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d  g->out, "-------
13160 2d 20 73 75 62 71 75 65 72 79 20 25 64 20 2d 2d  - subquery %d --
13170 2d 2d 2d 2d 2d 5c 6e 22 2c 20 6b 29 3b 0a 20 20  -----\n", k);.  
13180 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b      }.      n++;
13190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
131a0 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70  tmt_scanstatus(p
131b0 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e  , i, SQLITE_SCAN
131c0 53 54 41 54 5f 4e 56 49 53 49 54 2c 20 28 76 6f  STAT_NVISIT, (vo
131d0 69 64 2a 29 26 6e 56 69 73 69 74 29 3b 0a 20 20  id*)&nVisit);.  
131e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
131f0 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69  _scanstatus(p, i
13200 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
13210 54 5f 45 53 54 2c 20 28 76 6f 69 64 2a 29 26 72  T_EST, (void*)&r
13220 45 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Est);.      sqli
13230 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
13240 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45  tus(p, i, SQLITE
13250 5f 53 43 41 4e 53 54 41 54 5f 45 58 50 4c 41 49  _SCANSTAT_EXPLAI
13260 4e 2c 20 28 76 6f 69 64 2a 29 26 7a 45 78 70 6c  N, (void*)&zExpl
13270 61 69 6e 29 3b 0a 20 20 20 20 20 20 75 74 66 38  ain);.      utf8
13280 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
13290 74 2c 20 22 4c 6f 6f 70 20 25 32 64 3a 20 25 73  t, "Loop %2d: %s
132a0 5c 6e 22 2c 20 6e 2c 20 7a 45 78 70 6c 61 69 6e  \n", n, zExplain
132b0 29 3b 0a 20 20 20 20 20 20 72 45 73 74 4c 6f 6f  );.      rEstLoo
132c0 70 20 2a 3d 20 72 45 73 74 3b 0a 20 20 20 20 20  p *= rEst;.     
132d0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
132e0 2d 3e 6f 75 74 2c 0a 20 20 20 20 20 20 20 20 20  ->out,.         
132f0 20 22 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70   "         nLoop
13300 3d 25 2d 38 6c 6c 64 20 6e 52 6f 77 3d 25 2d 38  =%-8lld nRow=%-8
13310 6c 6c 64 20 65 73 74 52 6f 77 3d 25 2d 38 6c 6c  lld estRow=%-8ll
13320 64 20 65 73 74 52 6f 77 2f 4c 6f 6f 70 3d 25 2d  d estRow/Loop=%-
13330 38 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  8g\n",.         
13340 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73 69 74 2c 20   nLoop, nVisit, 
13350 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28  (sqlite3_int64)(
13360 72 45 73 74 4c 6f 6f 70 2b 30 2e 35 29 2c 20 72  rEstLoop+0.5), r
13370 45 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Est.      );.   
13380 20 7d 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69   }.  }.  raw_pri
13390 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
133a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b  -----------\n");
133c0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
133d0 20 50 61 72 61 6d 65 74 65 72 20 61 7a 41 72 72   Parameter azArr
133e0 61 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 7a  ay points to a z
133f0 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 61  ero-terminated a
13400 72 72 61 79 20 6f 66 20 73 74 72 69 6e 67 73 2e  rray of strings.
13410 20 7a 53 74 72 0a 2a 2a 20 70 6f 69 6e 74 73 20   zStr.** points 
13420 74 6f 20 61 20 73 69 6e 67 6c 65 20 6e 75 6c 2d  to a single nul-
13430 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
13440 67 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  g. Return non-ze
13450 72 6f 20 69 66 20 7a 53 74 72 0a 2a 2a 20 69 73  ro if zStr.** is
13460 20 65 71 75 61 6c 2c 20 61 63 63 6f 72 64 69 6e   equal, accordin
13470 67 20 74 6f 20 73 74 72 63 6d 70 28 29 2c 20 74  g to strcmp(), t
13480 6f 20 61 6e 79 20 6f 66 20 74 68 65 20 73 74 72  o any of the str
13490 69 6e 67 73 20 69 6e 20 74 68 65 20 61 72 72 61  ings in the arra
134a0 79 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  y..** Otherwise,
134b0 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f   return zero..*/
134c0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 5f  .static int str_
134d0 69 6e 5f 61 72 72 61 79 28 63 6f 6e 73 74 20 63  in_array(const c
134e0 68 61 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74  har *zStr, const
134f0 20 63 68 61 72 20 2a 2a 61 7a 41 72 72 61 79 29   char **azArray)
13500 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
13510 28 69 3d 30 3b 20 61 7a 41 72 72 61 79 5b 69 5d  (i=0; azArray[i]
13520 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
13530 30 3d 3d 73 74 72 63 6d 70 28 7a 53 74 72 2c 20  0==strcmp(zStr, 
13540 61 7a 41 72 72 61 79 5b 69 5d 29 20 29 20 72 65  azArray[i]) ) re
13550 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
13560 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
13570 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 73 74 61   If compiled sta
13580 74 65 6d 65 6e 74 20 70 53 71 6c 20 61 70 70 65  tement pSql appe
13590 61 72 73 20 74 6f 20 62 65 20 61 6e 20 45 58 50  ars to be an EXP
135a0 4c 41 49 4e 20 73 74 61 74 65 6d 65 6e 74 2c 20  LAIN statement, 
135b0 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 61 6e 64 20  allocate.** and 
135c0 70 6f 70 75 6c 61 74 65 20 74 68 65 20 53 68 65  populate the She
135d0 6c 6c 53 74 61 74 65 2e 61 69 49 6e 64 65 6e 74  llState.aiIndent
135e0 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 74 68  [] array with th
135f0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73  e number of.** s
13600 70 61 63 65 73 20 65 61 63 68 20 6f 70 63 6f 64  paces each opcod
13610 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 64 65  e should be inde
13620 6e 74 65 64 20 62 65 66 6f 72 65 20 69 74 20 69  nted before it i
13630 73 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20  s output..**.** 
13640 54 68 65 20 69 6e 64 65 6e 74 69 6e 67 20 72 75  The indenting ru
13650 6c 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  les are:.**.**  
13660 20 20 20 2a 20 46 6f 72 20 65 61 63 68 20 22 4e     * For each "N
13670 65 78 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56  ext", "Prev", "V
13680 4e 65 78 74 22 20 6f 72 20 22 56 50 72 65 76 22  Next" or "VPrev"
13690 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 69 6e   instruction, in
136a0 64 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 61 6c  dent.**       al
136b0 6c 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20 6f  l opcodes that o
136c0 63 63 75 72 20 62 65 74 77 65 65 6e 20 74 68 65  ccur between the
136d0 20 70 32 20 6a 75 6d 70 20 64 65 73 74 69 6e 61   p2 jump destina
136e0 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6f 70 63  tion and the opc
136f0 6f 64 65 0a 2a 2a 20 20 20 20 20 20 20 69 74 73  ode.**       its
13700 65 6c 66 20 62 79 20 32 20 73 70 61 63 65 73 2e  elf by 2 spaces.
13710 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72  .**.**     * For
13720 20 65 61 63 68 20 22 47 6f 74 6f 22 2c 20 69 66   each "Goto", if
13730 20 74 68 65 20 6a 75 6d 70 20 64 65 73 74 69 6e   the jump destin
13740 61 74 69 6f 6e 20 69 73 20 65 61 72 6c 69 65 72  ation is earlier
13750 20 69 6e 20 74 68 65 20 70 72 6f 67 72 61 6d 0a   in the program.
13760 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 65 6e 64  **       and end
13770 73 20 6f 6e 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 20  s on one of:.** 
13780 20 20 20 20 20 20 20 20 20 59 69 65 6c 64 20 20           Yield  
13790 53 65 65 6b 47 74 20 20 53 65 65 6b 4c 74 20 20  SeekGt  SeekLt  
137a0 52 6f 77 53 65 74 52 65 61 64 20 20 52 65 77 69  RowSetRead  Rewi
137b0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 69  nd.**       or i
137c0 66 20 74 68 65 20 50 31 20 70 61 72 61 6d 65 74  f the P1 paramet
137d0 65 72 20 69 73 20 6f 6e 65 20 69 6e 73 74 65 61  er is one instea
137e0 64 20 6f 66 20 7a 65 72 6f 2c 0a 2a 2a 20 20 20  d of zero,.**   
137f0 20 20 20 20 74 68 65 6e 20 69 6e 64 65 6e 74 20      then indent 
13800 61 6c 6c 20 6f 70 63 6f 64 65 73 20 62 65 74 77  all opcodes betw
13810 65 65 6e 20 74 68 65 20 65 61 72 6c 69 65 72 20  een the earlier 
13820 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 20  instruction.**  
13830 20 20 20 20 20 61 6e 64 20 22 47 6f 74 6f 22 20       and "Goto" 
13840 62 79 20 32 20 73 70 61 63 65 73 2e 0a 2a 2f 0a  by 2 spaces..*/.
13850 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
13860 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65  ain_data_prepare
13870 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
13880 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
13890 71 6c 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ql){.  const cha
138a0 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
138b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65         /* The te
138c0 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74  xt of the SQL st
138d0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  atement */.  con
138e0 73 74 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  st char *z;     
138f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13900 55 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  Used to check if
13910 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
13920 41 49 4e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 62  AIN */.  int *ab
13930 59 69 65 6c 64 20 3d 20 30 3b 20 20 20 20 20 20  Yield = 0;      
13940 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
13950 20 69 66 20 6f 70 20 69 73 20 61 6e 20 4f 50 5f   if op is an OP_
13960 59 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  Yield */.  int n
13970 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20  Alloc = 0;      
13980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
13990 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
139a0 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 2c 20 61  p->aiIndent[], a
139b0 62 59 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  bYield */.  int 
139c0 69 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  iOp;            
139d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
139e0 6e 64 65 78 20 6f 66 20 6f 70 65 72 61 74 69 6f  ndex of operatio
139f0 6e 20 69 6e 20 70 2d 3e 61 69 49 6e 64 65 6e 74  n in p->aiIndent
13a00 5b 5d 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63  [] */..  const c
13a10 68 61 72 20 2a 61 7a 4e 65 78 74 5b 5d 20 3d 20  har *azNext[] = 
13a20 7b 20 22 4e 65 78 74 22 2c 20 22 50 72 65 76 22  { "Next", "Prev"
13a30 2c 20 22 56 50 72 65 76 22 2c 20 22 56 4e 65 78  , "VPrev", "VNex
13a40 74 22 2c 20 22 53 6f 72 74 65 72 4e 65 78 74 22  t", "SorterNext"
13a50 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63  , 0 };.  const c
13a60 68 61 72 20 2a 61 7a 59 69 65 6c 64 5b 5d 20 3d  har *azYield[] =
13a70 20 7b 20 22 59 69 65 6c 64 22 2c 20 22 53 65 65   { "Yield", "See
13a80 6b 4c 54 22 2c 20 22 53 65 65 6b 47 54 22 2c 20  kLT", "SeekGT", 
13a90 22 52 6f 77 53 65 74 52 65 61 64 22 2c 0a 20 20  "RowSetRead",.  
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ab0 20 20 20 20 20 20 20 20 20 20 22 52 65 77 69 6e            "Rewin
13ac0 64 22 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74  d", 0 };.  const
13ad0 20 63 68 61 72 20 2a 61 7a 47 6f 74 6f 5b 5d 20   char *azGoto[] 
13ae0 3d 20 7b 20 22 47 6f 74 6f 22 2c 20 30 20 7d 3b  = { "Goto", 0 };
13af0 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  ..  /* Try to fi
13b00 67 75 72 65 20 6f 75 74 20 69 66 20 74 68 69 73  gure out if this
13b10 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 45 58   is really an EX
13b20 50 4c 41 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e  PLAIN statement.
13b30 20 49 66 20 74 68 69 73 0a 20 20 2a 2a 20 63 61   If this.  ** ca
13b40 6e 6e 6f 74 20 62 65 20 76 65 72 69 66 69 65 64  nnot be verified
13b50 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20  , return early. 
13b60 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
13b70 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
13b80 53 71 6c 29 21 3d 38 20 29 7b 0a 20 20 20 20 70  Sql)!=8 ){.    p
13b90 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64  ->cMode = p->mod
13ba0 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  e;.    return;. 
13bb0 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69   }.  zSql = sqli
13bc0 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 3b 0a 20  te3_sql(pSql);. 
13bd0 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72   if( zSql==0 ) r
13be0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 7a 3d 7a  eturn;.  for(z=z
13bf0 53 71 6c 3b 20 2a 7a 3d 3d 27 20 27 20 7c 7c 20  Sql; *z==' ' || 
13c00 2a 7a 3d 3d 27 5c 74 27 20 7c 7c 20 2a 7a 3d 3d  *z=='\t' || *z==
13c10 27 5c 6e 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 66 27  '\n' || *z=='\f'
13c20 20 7c 7c 20 2a 7a 3d 3d 27 5c 72 27 3b 20 7a 2b   || *z=='\r'; z+
13c30 2b 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  +);.  if( sqlite
13c40 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 20 22 65  3_strnicmp(z, "e
13c50 78 70 6c 61 69 6e 22 2c 20 37 29 20 29 7b 0a 20  xplain", 7) ){. 
13c60 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d     p->cMode = p-
13c70 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72  >mode;.    retur
13c80 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 4f  n;.  }..  for(iO
13c90 70 3d 30 3b 20 53 51 4c 49 54 45 5f 52 4f 57 3d  p=0; SQLITE_ROW=
13ca0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
13cb0 71 6c 29 3b 20 69 4f 70 2b 2b 29 7b 0a 20 20 20  ql); iOp++){.   
13cc0 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
13cd0 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 5f  iAddr = sqlite3_
13ce0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c  column_int(pSql,
13cf0 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   0);.    const c
13d00 68 61 72 20 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73  har *zOp = (cons
13d10 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
13d20 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
13d30 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  , 1);..    /* Se
13d40 74 20 70 32 20 74 6f 20 74 68 65 20 50 32 20 66  t p2 to the P2 f
13d50 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72  ield of the curr
13d60 65 6e 74 20 6f 70 63 6f 64 65 2e 20 54 68 65 6e  ent opcode. Then
13d70 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 0a  , assuming that.
13d80 20 20 20 20 2a 2a 20 70 32 20 69 73 20 61 6e 20      ** p2 is an 
13d90 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
13da0 65 73 73 2c 20 73 65 74 20 76 61 72 69 61 62 6c  ess, set variabl
13db0 65 20 70 32 6f 70 20 74 6f 20 74 68 65 20 69 6e  e p2op to the in
13dc0 64 65 78 20 6f 66 20 74 68 61 74 0a 20 20 20 20  dex of that.    
13dd0 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ** instruction i
13de0 6e 20 74 68 65 20 61 69 49 6e 64 65 6e 74 5b 5d  n the aiIndent[]
13df0 20 61 72 72 61 79 2e 20 70 32 20 61 6e 64 20 70   array. p2 and p
13e00 32 6f 70 20 6d 61 79 20 62 65 20 64 69 66 66 65  2op may be diffe
13e10 72 65 6e 74 20 69 66 0a 20 20 20 20 2a 2a 20 74  rent if.    ** t
13e20 68 65 20 63 75 72 72 65 6e 74 20 69 6e 73 74 72  he current instr
13e30 75 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  uction is part o
13e40 66 20 61 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  f a sub-program 
13e50 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 0a  generated by an.
13e60 20 20 20 20 2a 2a 20 53 51 4c 20 74 72 69 67 67      ** SQL trigg
13e70 65 72 20 6f 72 20 66 6f 72 65 69 67 6e 20 6b 65  er or foreign ke
13e80 79 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70  y.  */.    int p
13e90 32 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  2 = sqlite3_colu
13ea0 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 33 29 3b  mn_int(pSql, 3);
13eb0 0a 20 20 20 20 69 6e 74 20 70 32 6f 70 20 3d 20  .    int p2op = 
13ec0 28 70 32 20 2b 20 28 69 4f 70 2d 69 41 64 64 72  (p2 + (iOp-iAddr
13ed0 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77  ));..    /* Grow
13ee0 20 74 68 65 20 70 2d 3e 61 69 49 6e 64 65 6e 74   the p->aiIndent
13ef0 20 61 72 72 61 79 20 61 73 20 72 65 71 75 69 72   array as requir
13f00 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4f  ed */.    if( iO
13f10 70 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  p>=nAlloc ){.   
13f20 20 20 20 69 66 28 20 69 4f 70 3d 3d 30 20 29 7b     if( iOp==0 ){
13f30 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 66  .        /* Do f
13f40 75 72 74 68 65 72 20 76 65 72 66 69 63 61 74 69  urther verficati
13f50 6f 6e 20 74 68 61 74 20 74 68 69 73 20 69 73 20  on that this is 
13f60 65 78 70 6c 61 69 6e 20 6f 75 74 70 75 74 2e 20  explain output. 
13f70 20 41 62 6f 72 74 20 69 66 0a 20 20 20 20 20 20   Abort if.      
13f80 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 2a    ** it is not *
13f90 2f 0a 20 20 20 20 20 20 20 20 73 74 61 74 69 63  /.        static
13fa0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 78 70   const char *exp
13fb0 6c 61 69 6e 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20  lainCols[] = {. 
13fc0 20 20 20 20 20 20 20 20 20 20 22 61 64 64 72 22            "addr"
13fd0 2c 20 22 6f 70 63 6f 64 65 22 2c 20 22 70 31 22  , "opcode", "p1"
13fe0 2c 20 22 70 32 22 2c 20 22 70 33 22 2c 20 22 70  , "p2", "p3", "p
13ff0 34 22 2c 20 22 70 35 22 2c 20 22 63 6f 6d 6d 65  4", "p5", "comme
14000 6e 74 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 69  nt" };.        i
14010 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 66  nt jj;.        f
14020 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 41 72 72 61  or(jj=0; jj<Arra
14030 79 53 69 7a 65 28 65 78 70 6c 61 69 6e 43 6f 6c  ySize(explainCol
14040 73 29 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  s); jj++){.     
14050 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
14060 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
14070 61 6d 65 28 70 53 71 6c 2c 6a 6a 29 2c 65 78 70  ame(pSql,jj),exp
14080 6c 61 69 6e 43 6f 6c 73 5b 6a 6a 5d 29 21 3d 30  lainCols[jj])!=0
14090 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
140a0 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f  p->cMode = p->mo
140b0 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  de;.            
140c0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
140d0 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ql);.           
140e0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
140f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
14100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 41 6c       }.      nAl
14110 6c 6f 63 20 2b 3d 20 31 30 30 3b 0a 20 20 20 20  loc += 100;.    
14120 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d 20    p->aiIndent = 
14130 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65  (int*)sqlite3_re
14140 61 6c 6c 6f 63 36 34 28 70 2d 3e 61 69 49 6e 64  alloc64(p->aiInd
14150 65 6e 74 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65  ent, nAlloc*size
14160 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20  of(int));.      
14170 69 66 28 20 70 2d 3e 61 69 49 6e 64 65 6e 74 3d  if( p->aiIndent=
14180 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f  =0 ) shell_out_o
14190 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20  f_memory();.    
141a0 20 20 61 62 59 69 65 6c 64 20 3d 20 28 69 6e 74    abYield = (int
141b0 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
141c0 63 36 34 28 61 62 59 69 65 6c 64 2c 20 6e 41 6c  c64(abYield, nAl
141d0 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29  loc*sizeof(int))
141e0 3b 0a 20 20 20 20 20 20 69 66 28 20 61 62 59 69  ;.      if( abYi
141f0 65 6c 64 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f  eld==0 ) shell_o
14200 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a  ut_of_memory();.
14210 20 20 20 20 7d 0a 20 20 20 20 61 62 59 69 65 6c      }.    abYiel
14220 64 5b 69 4f 70 5d 20 3d 20 73 74 72 5f 69 6e 5f  d[iOp] = str_in_
14230 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 59 69 65  array(zOp, azYie
14240 6c 64 29 3b 0a 20 20 20 20 70 2d 3e 61 69 49 6e  ld);.    p->aiIn
14250 64 65 6e 74 5b 69 4f 70 5d 20 3d 20 30 3b 0a 20  dent[iOp] = 0;. 
14260 20 20 20 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20     p->nIndent = 
14270 69 4f 70 2b 31 3b 0a 0a 20 20 20 20 69 66 28 20  iOp+1;..    if( 
14280 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70  str_in_array(zOp
14290 2c 20 61 7a 4e 65 78 74 29 20 29 7b 0a 20 20 20  , azNext) ){.   
142a0 20 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69     for(i=p2op; i
142b0 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69  <iOp; i++) p->ai
142c0 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a  Indent[i] += 2;.
142d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
142e0 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20  r_in_array(zOp, 
142f0 61 7a 47 6f 74 6f 29 20 26 26 20 70 32 6f 70 3c  azGoto) && p2op<
14300 70 2d 3e 6e 49 6e 64 65 6e 74 0a 20 20 20 20 20  p->nIndent.     
14310 26 26 20 28 61 62 59 69 65 6c 64 5b 70 32 6f 70  && (abYield[p2op
14320 5d 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ] || sqlite3_col
14330 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 32 29  umn_int(pSql, 2)
14340 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 66  ).    ){.      f
14350 6f 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70  or(i=p2op; i<iOp
14360 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65  ; i++) p->aiInde
14370 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20  nt[i] += 2;.    
14380 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 49 6e 64  }.  }..  p->iInd
14390 65 6e 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ent = 0;.  sqlit
143a0 65 33 5f 66 72 65 65 28 61 62 59 69 65 6c 64 29  e3_free(abYield)
143b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65  ;.  sqlite3_rese
143c0 74 28 70 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  t(pSql);.}../*.*
143d0 2a 20 46 72 65 65 20 74 68 65 20 61 72 72 61 79  * Free the array
143e0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 65 78   allocated by ex
143f0 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61  plain_data_prepa
14400 72 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  re()..*/.static 
14410 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64 61 74  void explain_dat
14420 61 5f 64 65 6c 65 74 65 28 53 68 65 6c 6c 53 74  a_delete(ShellSt
14430 61 74 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  ate *p){.  sqlit
14440 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 49 6e 64  e3_free(p->aiInd
14450 65 6e 74 29 3b 0a 20 20 70 2d 3e 61 69 49 6e 64  ent);.  p->aiInd
14460 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 49  ent = 0;.  p->nI
14470 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ndent = 0;.  p->
14480 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  iIndent = 0;.}..
14490 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 6e  /*.** Disable an
144a0 64 20 72 65 73 74 6f 72 65 20 2e 77 68 65 72 65  d restore .where
144b0 74 72 61 63 65 20 61 6e 64 20 2e 73 65 6c 65 63  trace and .selec
144c0 74 74 72 61 63 65 20 73 65 74 74 69 6e 67 73 2e  ttrace settings.
144d0 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
144e0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
144f0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
14500 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41  ENABLE_SELECTTRA
14510 43 45 29 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  CE).extern int s
14520 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
14530 65 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  e;.static int sa
14540 76 65 64 53 65 6c 65 63 74 54 72 61 63 65 3b 0a  vedSelectTrace;.
14550 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
14560 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
14570 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
14580 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54  TE_ENABLE_WHERET
14590 52 41 43 45 29 0a 65 78 74 65 72 6e 20 69 6e 74  RACE).extern int
145a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
145b0 63 65 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ce;.static int s
145c0 61 76 65 64 57 68 65 72 65 54 72 61 63 65 3b 0a  avedWhereTrace;.
145d0 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 76 6f  #endif.static vo
145e0 69 64 20 64 69 73 61 62 6c 65 5f 64 65 62 75 67  id disable_debug
145f0 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28 76 6f 69  _trace_modes(voi
14600 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  d){.#if defined(
14610 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
14620 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
14630 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41  ENABLE_SELECTTRA
14640 43 45 29 0a 20 20 73 61 76 65 64 53 65 6c 65 63  CE).  savedSelec
14650 74 54 72 61 63 65 20 3d 20 73 71 6c 69 74 65 33  tTrace = sqlite3
14660 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 20 20 73  SelectTrace;.  s
14670 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
14680 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  e = 0;.#endif.#i
14690 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
146a0 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
146b0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
146c0 5f 57 48 45 52 45 54 52 41 43 45 29 0a 20 20 73  _WHERETRACE).  s
146d0 61 76 65 64 57 68 65 72 65 54 72 61 63 65 20 3d  avedWhereTrace =
146e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
146f0 63 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65  ce;.  sqlite3Whe
14700 72 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  reTrace = 0;.#en
14710 64 69 66 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  dif.}.static voi
14720 64 20 72 65 73 74 6f 72 65 5f 64 65 62 75 67 5f  d restore_debug_
14730 74 72 61 63 65 5f 6d 6f 64 65 73 28 76 6f 69 64  trace_modes(void
14740 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
14750 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
14760 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
14770 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43  NABLE_SELECTTRAC
14780 45 29 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  E).  sqlite3Sele
14790 63 74 54 72 61 63 65 20 3d 20 73 61 76 65 64 53  ctTrace = savedS
147a0 65 6c 65 63 74 54 72 61 63 65 3b 0a 23 65 6e 64  electTrace;.#end
147b0 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
147c0 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
147d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
147e0 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45  NABLE_WHERETRACE
147f0 29 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  ).  sqlite3Where
14800 54 72 61 63 65 20 3d 20 73 61 76 65 64 57 68 65  Trace = savedWhe
14810 72 65 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a  reTrace;.#endif.
14820 7d 0a 0a 2f 2a 20 43 72 65 61 74 65 20 74 68 65  }../* Create the
14830 20 54 45 4d 50 20 74 61 62 6c 65 20 75 73 65 64   TEMP table used
14840 20 74 6f 20 73 74 6f 72 65 20 70 61 72 61 6d 65   to store parame
14850 74 65 72 20 62 69 6e 64 69 6e 67 73 20 2a 2f 0a  ter bindings */.
14860 73 74 61 74 69 63 20 76 6f 69 64 20 62 69 6e 64  static void bind
14870 5f 74 61 62 6c 65 5f 69 6e 69 74 28 53 68 65 6c  _table_init(Shel
14880 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e  lState *p){.  in
14890 74 20 77 72 53 63 68 65 6d 61 20 3d 20 30 3b 0a  t wrSchema = 0;.
148a0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
148b0 66 69 67 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54  fig(p->db, SQLIT
148c0 45 5f 44 42 43 4f 4e 46 49 47 5f 57 52 49 54 41  E_DBCONFIG_WRITA
148d0 42 4c 45 5f 53 43 48 45 4d 41 2c 20 2d 31 2c 20  BLE_SCHEMA, -1, 
148e0 26 77 72 53 63 68 65 6d 61 29 3b 0a 20 20 73 71  &wrSchema);.  sq
148f0 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
14900 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  p->db, SQLITE_DB
14910 43 4f 4e 46 49 47 5f 57 52 49 54 41 42 4c 45 5f  CONFIG_WRITABLE_
14920 53 43 48 45 4d 41 2c 20 31 2c 20 30 29 3b 0a 20  SCHEMA, 1, 0);. 
14930 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
14940 3e 64 62 2c 0a 20 20 20 20 22 43 52 45 41 54 45  >db,.    "CREATE
14950 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58   TABLE IF NOT EX
14960 49 53 54 53 20 74 65 6d 70 2e 73 71 6c 69 74 65  ISTS temp.sqlite
14970 5f 70 61 72 61 6d 65 74 65 72 73 28 5c 6e 22 0a  _parameters(\n".
14980 20 20 20 20 22 20 20 6b 65 79 20 54 45 58 54 20      "  key TEXT 
14990 50 52 49 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 0a  PRIMARY KEY,\n".
149a0 20 20 20 20 22 20 20 76 61 6c 75 65 20 41 4e 59      "  value ANY
149b0 5c 6e 22 0a 20 20 20 20 22 29 20 57 49 54 48 4f  \n".    ") WITHO
149c0 55 54 20 52 4f 57 49 44 3b 22 2c 0a 20 20 20 20  UT ROWID;",.    
149d0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  0, 0, 0);.  sqli
149e0 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70 2d  te3_db_config(p-
149f0 3e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f  >db, SQLITE_DBCO
14a00 4e 46 49 47 5f 57 52 49 54 41 42 4c 45 5f 53 43  NFIG_WRITABLE_SC
14a10 48 45 4d 41 2c 20 77 72 53 63 68 65 6d 61 2c 20  HEMA, wrSchema, 
14a20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 69 6e  0);.}../*.** Bin
14a30 64 20 70 61 72 61 6d 65 74 65 72 73 20 6f 6e 20  d parameters on 
14a40 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
14a50 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  ment..**.** Para
14a60 6d 65 74 65 72 20 62 69 6e 64 69 6e 67 73 20 61  meter bindings a
14a70 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 61 20  re taken from a 
14a80 54 45 4d 50 20 74 61 62 6c 65 20 6f 66 20 74 68  TEMP table of th
14a90 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
14aa0 20 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42   CREATE TEMP TAB
14ab0 4c 45 20 73 71 6c 69 74 65 5f 70 61 72 61 6d 65  LE sqlite_parame
14ac0 74 65 72 73 28 6b 65 79 20 54 45 58 54 20 50 52  ters(key TEXT PR
14ad0 49 4d 41 52 59 20 4b 45 59 2c 20 76 61 6c 75 65  IMARY KEY, value
14ae0 29 0a 2a 2a 20 20 20 20 57 49 54 48 4f 55 54 20  ).**    WITHOUT 
14af0 52 4f 57 49 44 3b 0a 2a 2a 0a 2a 2a 20 4e 6f 20  ROWID;.**.** No 
14b00 62 69 6e 64 69 6e 67 73 20 6f 63 63 75 72 20 69  bindings occur i
14b10 66 20 74 68 69 73 20 74 61 62 6c 65 20 64 6f 65  f this table doe
14b20 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68  s not exist.  Th
14b30 65 20 73 70 65 63 69 61 6c 20 63 68 61 72 61 63  e special charac
14b40 74 65 72 20 27 24 27 0a 2a 2a 20 69 73 20 69 6e  ter '$'.** is in
14b50 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 74 61  cluded in the ta
14b60 62 6c 65 20 6e 61 6d 65 20 74 6f 20 68 65 6c 70  ble name to help
14b70 20 70 72 65 76 65 6e 74 20 63 6f 6c 6c 69 73 69   prevent collisi
14b80 6f 6e 73 20 77 69 74 68 20 61 63 74 75 61 6c 20  ons with actual 
14b90 74 61 62 6c 65 73 2e 0a 2a 2a 20 54 68 65 20 74  tables..** The t
14ba0 61 62 6c 65 20 6d 75 73 74 20 62 65 20 69 6e 20  able must be in 
14bb0 74 68 65 20 54 45 4d 50 20 73 63 68 65 6d 61 2e  the TEMP schema.
14bc0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14bd0 62 69 6e 64 5f 70 72 65 70 61 72 65 64 5f 73 74  bind_prepared_st
14be0 6d 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  mt(ShellState *p
14bf0 41 72 67 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d  Arg, sqlite3_stm
14c00 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 69 6e 74  t *pStmt){.  int
14c10 20 6e 56 61 72 3b 0a 20 20 69 6e 74 20 69 3b 0a   nVar;.  int i;.
14c20 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
14c30 74 65 33 5f 73 74 6d 74 20 2a 70 51 20 3d 20 30  te3_stmt *pQ = 0
14c40 3b 0a 0a 20 20 6e 56 61 72 20 3d 20 73 71 6c 69  ;..  nVar = sqli
14c50 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
14c60 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  er_count(pStmt);
14c70 0a 20 20 69 66 28 20 6e 56 61 72 3d 3d 30 20 29  .  if( nVar==0 )
14c80 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 74   return;  /* Not
14c90 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20  hing to do */.  
14ca0 69 66 28 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  if( sqlite3_tabl
14cb0 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
14cc0 61 28 70 41 72 67 2d 3e 64 62 2c 20 22 54 45 4d  a(pArg->db, "TEM
14cd0 50 22 2c 20 22 73 71 6c 69 74 65 5f 70 61 72 61  P", "sqlite_para
14ce0 6d 65 74 65 72 73 22 2c 0a 20 20 20 20 20 20 20  meters",.       
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6b 65               "ke
14d10 79 22 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  y", 0, 0, 0, 0, 
14d20 30 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  0)!=SQLITE_OK ){
14d30 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 2f 2a 20  .    return; /* 
14d40 50 61 72 61 6d 65 74 65 72 20 74 61 62 6c 65 20  Parameter table 
14d50 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 2a  does not exist *
14d60 2f 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  /.  }.  rc = sql
14d70 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
14d80 70 41 72 67 2d 3e 64 62 2c 0a 20 20 20 20 20 20  pArg->db,.      
14d90 20 20 20 20 22 53 45 4c 45 43 54 20 76 61 6c 75      "SELECT valu
14da0 65 20 46 52 4f 4d 20 74 65 6d 70 2e 73 71 6c 69  e FROM temp.sqli
14db0 74 65 5f 70 61 72 61 6d 65 74 65 72 73 22 0a 20  te_parameters". 
14dc0 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
14dd0 20 6b 65 79 3d 3f 31 22 2c 20 2d 31 2c 20 26 70   key=?1", -1, &p
14de0 51 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  Q, 0);.  if( rc 
14df0 7c 7c 20 70 51 3d 3d 30 20 29 20 72 65 74 75 72  || pQ==0 ) retur
14e00 6e 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  n;.  for(i=1; i<
14e10 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  =nVar; i++){.   
14e20 20 63 68 61 72 20 7a 4e 75 6d 5b 33 30 5d 3b 0a   char zNum[30];.
14e30 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14e40 7a 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62  zVar = sqlite3_b
14e50 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
14e60 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  me(pStmt, i);.  
14e70 20 20 69 66 28 20 7a 56 61 72 3d 3d 30 20 29 7b    if( zVar==0 ){
14e80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
14e90 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
14ea0 4e 75 6d 29 2c 7a 4e 75 6d 2c 22 3f 25 64 22 2c  Num),zNum,"?%d",
14eb0 69 29 3b 0a 20 20 20 20 20 20 7a 56 61 72 20 3d  i);.      zVar =
14ec0 20 7a 4e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 20   zNum;.    }.   
14ed0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
14ee0 78 74 28 70 51 2c 20 31 2c 20 7a 56 61 72 2c 20  xt(pQ, 1, zVar, 
14ef0 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
14f00 43 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  C);.    if( sqli
14f10 74 65 33 5f 73 74 65 70 28 70 51 29 3d 3d 53 51  te3_step(pQ)==SQ
14f20 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
14f30 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76    sqlite3_bind_v
14f40 61 6c 75 65 28 70 53 74 6d 74 2c 20 69 2c 20 73  alue(pStmt, i, s
14f50 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61  qlite3_column_va
14f60 6c 75 65 28 70 51 2c 20 30 29 29 3b 0a 20 20 20  lue(pQ, 0));.   
14f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
14f80 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
14f90 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 7d  pStmt, i);.    }
14fa0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
14fb0 65 74 28 70 51 29 3b 0a 20 20 7d 0a 20 20 73 71  et(pQ);.  }.  sq
14fc0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
14fd0 51 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e  Q);.}../*.** Run
14fe0 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
14ff0 65 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ement.*/.static 
15000 76 6f 69 64 20 65 78 65 63 5f 70 72 65 70 61 72  void exec_prepar
15010 65 64 5f 73 74 6d 74 28 0a 20 20 53 68 65 6c 6c  ed_stmt(.  Shell
15020 53 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20  State *pArg,    
15030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
15050 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53  ointer to ShellS
15060 74 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tate */.  sqlite
15070 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 20 20  3_stmt *pStmt   
15080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
150a0 61 74 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f  atment to run */
150b0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  .){.  int rc;.. 
150c0 20 2f 2a 20 70 65 72 66 6f 72 6d 20 74 68 65 20   /* perform the 
150d0 66 69 72 73 74 20 73 74 65 70 2e 20 20 74 68 69  first step.  thi
150e0 73 20 77 69 6c 6c 20 74 65 6c 6c 20 75 73 20 69  s will tell us i
150f0 66 20 77 65 0a 20 20 2a 2a 20 68 61 76 65 20 61  f we.  ** have a
15100 20 72 65 73 75 6c 74 20 73 65 74 20 6f 72 20 6e   result set or n
15110 6f 74 20 61 6e 64 20 68 6f 77 20 77 69 64 65 20  ot and how wide 
15120 69 74 20 69 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  it is..  */.  rc
15130 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
15140 70 53 74 6d 74 29 3b 0a 20 20 2f 2a 20 69 66 20  pStmt);.  /* if 
15150 77 65 20 68 61 76 65 20 61 20 72 65 73 75 6c 74  we have a result
15160 20 73 65 74 2e 2e 2e 20 2a 2f 0a 20 20 69 66 28   set... */.  if(
15170 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72   SQLITE_ROW == r
15180 63 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f  c ){.    /* allo
15190 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 63  cate space for c
151a0 6f 6c 20 6e 61 6d 65 20 70 74 72 2c 20 76 61 6c  ol name ptr, val
151b0 75 65 20 70 74 72 2c 20 61 6e 64 20 74 79 70 65  ue ptr, and type
151c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
151d0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
151e0 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
151f0 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
15200 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
15210 36 34 28 33 2a 6e 43 6f 6c 2a 73 69 7a 65 6f 66  64(3*nCol*sizeof
15220 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 20 2b 20  (const char*) + 
15230 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 61  1);.    if( !pDa
15240 74 61 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ta ){.      rc =
15250 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
15260 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15270 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 73 20 3d 20  char **azCols = 
15280 28 63 68 61 72 20 2a 2a 29 70 44 61 74 61 3b 20  (char **)pData; 
15290 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 20 6f 66       /* Names of
152a0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
152b0 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 2a  */.      char **
152c0 61 7a 56 61 6c 73 20 3d 20 26 61 7a 43 6f 6c 73  azVals = &azCols
152d0 5b 6e 43 6f 6c 5d 3b 20 20 20 20 20 20 20 2f 2a  [nCol];       /*
152e0 20 52 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20   Results */.    
152f0 20 20 69 6e 74 20 2a 61 69 54 79 70 65 73 20 3d    int *aiTypes =
15300 20 28 69 6e 74 20 2a 29 26 61 7a 56 61 6c 73 5b   (int *)&azVals[
15310 6e 43 6f 6c 5d 3b 20 2f 2a 20 52 65 73 75 6c 74  nCol]; /* Result
15320 20 74 79 70 65 73 20 2a 2f 0a 20 20 20 20 20 20   types */.      
15330 69 6e 74 20 69 2c 20 78 3b 0a 20 20 20 20 20 20  int i, x;.      
15340 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 69 6e  assert(sizeof(in
15350 74 29 20 3c 3d 20 73 69 7a 65 6f 66 28 63 68 61  t) <= sizeof(cha
15360 72 20 2a 29 29 3b 0a 20 20 20 20 20 20 2f 2a 20  r *));.      /* 
15370 73 61 76 65 20 6f 66 66 20 70 74 72 73 20 74 6f  save off ptrs to
15380 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
15390 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
153a0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
153b0 20 20 20 20 20 20 61 7a 43 6f 6c 73 5b 69 5d 20        azCols[i] 
153c0 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
153d0 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
153e0 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d  tmt, i);.      }
153f0 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
15400 20 20 20 2f 2a 20 65 78 74 72 61 63 74 20 74 68     /* extract th
15410 65 20 64 61 74 61 20 61 6e 64 20 64 61 74 61 20  e data and data 
15420 74 79 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  types */.       
15430 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
15440 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
15450 20 20 61 69 54 79 70 65 73 5b 69 5d 20 3d 20 78    aiTypes[i] = x
15460 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
15470 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29  n_type(pStmt, i)
15480 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
15490 78 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26  x==SQLITE_BLOB &
154a0 26 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  & pArg && pArg->
154b0 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 49 6e 73 65  cMode==MODE_Inse
154c0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rt ){.          
154d0 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 22 22    azVals[i] = ""
154e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
154f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  e{.            a
15500 7a 56 61 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72  zVals[i] = (char
15510 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
15520 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 29 3b  _text(pStmt, i);
15530 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15540 20 20 20 20 20 20 20 69 66 28 20 21 61 7a 56 61         if( !azVa
15550 6c 73 5b 69 5d 20 26 26 20 28 61 69 54 79 70 65  ls[i] && (aiType
15560 73 5b 69 5d 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  s[i]!=SQLITE_NUL
15570 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
15580 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
15590 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
155a0 20 62 72 65 61 6b 3b 20 2f 2a 20 66 72 6f 6d 20   break; /* from 
155b0 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  for */.         
155c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20   }.        } /* 
155d0 65 6e 64 20 66 6f 72 20 2a 2f 0a 0a 20 20 20 20  end for */..    
155e0 20 20 20 20 2f 2a 20 69 66 20 64 61 74 61 20 61      /* if data a
155f0 6e 64 20 74 79 70 65 73 20 65 78 74 72 61 63 74  nd types extract
15600 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
15610 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  .. */.        if
15620 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20  ( SQLITE_ROW == 
15630 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
15640 2f 2a 20 63 61 6c 6c 20 74 68 65 20 73 75 70 70  /* call the supp
15650 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b 20 77 69  lied callback wi
15660 74 68 20 74 68 65 20 72 65 73 75 6c 74 20 72 6f  th the result ro
15670 77 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20  w data */.      
15680 20 20 20 20 69 66 28 20 73 68 65 6c 6c 5f 63 61      if( shell_ca
15690 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 43 6f  llback(pArg, nCo
156a0 6c 2c 20 61 7a 56 61 6c 73 2c 20 61 7a 43 6f 6c  l, azVals, azCol
156b0 73 2c 20 61 69 54 79 70 65 73 29 20 29 7b 0a 20  s, aiTypes) ){. 
156c0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
156d0 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
156e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
156f0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
15700 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
15710 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  mt);.          }
15720 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15730 20 7d 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45   } while( SQLITE
15740 5f 52 4f 57 20 3d 3d 20 72 63 20 29 3b 0a 20 20  _ROW == rc );.  
15750 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15760 28 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  (pData);.    }. 
15770 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
15780 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
15790 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 69  LTABLE./*.** Thi
157a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
157b0 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  lled to process 
157c0 53 51 4c 20 69 66 20 74 68 65 20 70 72 65 76 69  SQL if the previ
157d0 6f 75 73 20 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e  ous shell comman
157e0 64 0a 2a 2a 20 77 61 73 20 22 2e 65 78 70 65 72  d.** was ".exper
157f0 74 22 2e 20 49 74 20 70 61 73 73 65 73 20 74 68  t". It passes th
15800 65 20 53 51 4c 20 69 6e 20 74 68 65 20 73 65 63  e SQL in the sec
15810 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 64 69 72  ond argument dir
15820 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 74 68 65 20  ectly to.** the 
15830 73 71 6c 69 74 65 33 65 78 70 65 72 74 20 6f 62  sqlite3expert ob
15840 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ject..**.** If s
15850 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
15860 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
15870 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
15880 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
15890 63 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61  code. In this ca
158a0 73 65 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79  se, (*pzErr) may
158b0 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   be set to point
158c0 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
158d0 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e  taining.** an En
158e0 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
158f0 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74  rror message. It
15900 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
15910 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
15920 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
15930 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20  ually free this 
15940 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c  buffer using sql
15950 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
15960 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72  static int exper
15970 74 48 61 6e 64 6c 65 53 51 4c 28 0a 20 20 53 68  tHandleSQL(.  Sh
15980 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
15990 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
159a0 2a 7a 53 71 6c 2c 20 0a 20 20 63 68 61 72 20 2a  *zSql, .  char *
159b0 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 61 73 73 65  *pzErr.){.  asse
159c0 72 74 28 20 70 53 74 61 74 65 2d 3e 65 78 70 65  rt( pState->expe
159d0 72 74 2e 70 45 78 70 65 72 74 20 29 3b 0a 20 20  rt.pExpert );.  
159e0 61 73 73 65 72 74 28 20 70 7a 45 72 72 3d 3d 30  assert( pzErr==0
159f0 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b   || *pzErr==0 );
15a00 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
15a10 33 5f 65 78 70 65 72 74 5f 73 71 6c 28 70 53 74  3_expert_sql(pSt
15a20 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70  ate->expert.pExp
15a30 65 72 74 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72  ert, zSql, pzErr
15a40 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
15a50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
15a60 6c 65 64 20 65 69 74 68 65 72 20 74 6f 20 73 69  led either to si
15a70 6c 65 6e 74 6c 79 20 63 6c 65 61 6e 20 75 70 20  lently clean up 
15a80 74 68 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 72  the object.** cr
15a90 65 61 74 65 64 20 62 79 20 74 68 65 20 22 2e 65  eated by the ".e
15aa0 78 70 65 72 74 22 20 63 6f 6d 6d 61 6e 64 20 28  xpert" command (
15ab0 69 66 20 62 43 61 6e 63 65 6c 3d 3d 31 29 2c 20  if bCancel==1), 
15ac0 6f 72 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  or to generate a
15ad0 20 0a 2a 2a 20 72 65 70 6f 72 74 20 66 72 6f 6d   .** report from
15ae0 20 69 74 20 61 6e 64 20 74 68 65 6e 20 63 6c 65   it and then cle
15af0 61 6e 20 69 74 20 75 70 20 28 69 66 20 62 43 61  an it up (if bCa
15b00 6e 63 65 6c 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20  ncel==0)..**.** 
15b10 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
15b20 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
15b30 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
15b40 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
15b50 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74 68 69  .** code. In thi
15b60 73 20 63 61 73 65 2c 20 28 2a 70 7a 45 72 72 29  s case, (*pzErr)
15b70 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70   may be set to p
15b80 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
15b90 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61   containing.** a
15ba0 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  n English langua
15bb0 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ge error message
15bc0 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
15bd0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
15be0 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65  e.** caller to e
15bf0 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74  ventually free t
15c00 68 69 73 20 62 75 66 66 65 72 20 75 73 69 6e 67  his buffer using
15c10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
15c20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
15c30 78 70 65 72 74 46 69 6e 69 73 68 28 0a 20 20 53  xpertFinish(.  S
15c40 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74  hellState *pStat
15c50 65 2c 0a 20 20 69 6e 74 20 62 43 61 6e 63 65 6c  e,.  int bCancel
15c60 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ,.  char **pzErr
15c70 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
15c80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
15c90 74 65 33 65 78 70 65 72 74 20 2a 70 20 3d 20 70  te3expert *p = p
15ca0 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45  State->expert.pE
15cb0 78 70 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28  xpert;.  assert(
15cc0 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   p );.  assert( 
15cd0 62 43 61 6e 63 65 6c 20 7c 7c 20 70 7a 45 72 72  bCancel || pzErr
15ce0 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30  ==0 || *pzErr==0
15cf0 20 29 3b 0a 20 20 69 66 28 20 62 43 61 6e 63 65   );.  if( bCance
15d00 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45  l==0 ){.    FILE
15d10 20 2a 6f 75 74 20 3d 20 70 53 74 61 74 65 2d 3e   *out = pState->
15d20 6f 75 74 3b 0a 20 20 20 20 69 6e 74 20 62 56 65  out;.    int bVe
15d30 72 62 6f 73 65 20 3d 20 70 53 74 61 74 65 2d 3e  rbose = pState->
15d40 65 78 70 65 72 74 2e 62 56 65 72 62 6f 73 65 3b  expert.bVerbose;
15d50 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
15d60 65 33 5f 65 78 70 65 72 74 5f 61 6e 61 6c 79 7a  e3_expert_analyz
15d70 65 28 70 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20  e(p, pzErr);.   
15d80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15d90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
15da0 6e 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33  nQuery = sqlite3
15db0 5f 65 78 70 65 72 74 5f 63 6f 75 6e 74 28 70 29  _expert_count(p)
15dc0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a  ;.      int i;..
15dd0 20 20 20 20 20 20 69 66 28 20 62 56 65 72 62 6f        if( bVerbo
15de0 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  se ){.        co
15df0 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 6e 64 20  nst char *zCand 
15e00 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74  = sqlite3_expert
15e10 5f 72 65 70 6f 72 74 28 70 2c 30 2c 45 58 50 45  _report(p,0,EXPE
15e20 52 54 5f 52 45 50 4f 52 54 5f 43 41 4e 44 49 44  RT_REPORT_CANDID
15e30 41 54 45 53 29 3b 0a 20 20 20 20 20 20 20 20 72  ATES);.        r
15e40 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
15e50 2d 2d 20 43 61 6e 64 69 64 61 74 65 73 20 2d 2d  -- Candidates --
15e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b  -----------\n");
15e80 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
15e90 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  ntf(out, "%s\n",
15ea0 20 7a 43 61 6e 64 29 3b 0a 20 20 20 20 20 20 7d   zCand);.      }
15eb0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
15ec0 69 3c 6e 51 75 65 72 79 3b 20 69 2b 2b 29 7b 0a  i<nQuery; i++){.
15ed0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
15ee0 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ar *zSql = sqlit
15ef0 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74  e3_expert_report
15f00 28 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45  (p, i, EXPERT_RE
15f10 50 4f 52 54 5f 53 51 4c 29 3b 0a 20 20 20 20 20  PORT_SQL);.     
15f20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15f30 49 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  Idx = sqlite3_ex
15f40 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69  pert_report(p, i
15f50 2c 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f  , EXPERT_REPORT_
15f60 49 4e 44 45 58 45 53 29 3b 0a 20 20 20 20 20 20  INDEXES);.      
15f70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
15f80 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  QP = sqlite3_exp
15f90 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c  ert_report(p, i,
15fa0 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 50   EXPERT_REPORT_P
15fb0 4c 41 4e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  LAN);.        if
15fc0 28 20 7a 49 64 78 3d 3d 30 20 29 20 7a 49 64 78  ( zIdx==0 ) zIdx
15fd0 20 3d 20 22 28 6e 6f 20 6e 65 77 20 69 6e 64 65   = "(no new inde
15fe0 78 65 73 29 5c 6e 22 3b 0a 20 20 20 20 20 20 20  xes)\n";.       
15ff0 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b   if( bVerbose ){
16000 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
16010 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 51  rintf(out, "-- Q
16020 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 2d  uery %d --------
16030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16040 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 69 2b 31 29  --------\n",i+1)
16050 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  ;.          raw_
16060 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c  printf(out, "%s\
16070 6e 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  n\n", zSql);.   
16080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
16090 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
160a0 25 73 5c 6e 22 2c 20 7a 49 64 78 29 3b 0a 20 20  %s\n", zIdx);.  
160b0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
160c0 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 45  (out, "%s\n", zE
160d0 51 50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  QP);.      }.   
160e0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
160f0 5f 65 78 70 65 72 74 5f 64 65 73 74 72 6f 79 28  _expert_destroy(
16100 70 29 3b 0a 20 20 70 53 74 61 74 65 2d 3e 65 78  p);.  pState->ex
16110 70 65 72 74 2e 70 45 78 70 65 72 74 20 3d 20 30  pert.pExpert = 0
16120 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16130 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
16140 74 61 74 69 6f 6e 20 6f 66 20 22 2e 65 78 70 65  tation of ".expe
16150 72 74 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e  rt" dot command.
16160 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
16170 78 70 65 72 74 44 6f 74 43 6f 6d 6d 61 6e 64 28  xpertDotCommand(
16180 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
16190 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  State,          
161a0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68     /* Current sh
161b0 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a  ell tool state *
161c0 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  /.  char **azArg
161d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
161e0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
161f0 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
16200 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20   to dot command 
16210 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20  */.  int nArg   
16220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16230 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16240 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41  f entries in azA
16250 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  rg[] */.){.  int
16260 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16270 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  .  char *zErr = 
16280 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
16290 74 20 69 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 0a  t iSample = 0;..
162a0 20 20 61 73 73 65 72 74 28 20 70 53 74 61 74 65    assert( pState
162b0 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
162c0 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ==0 );.  memset(
162d0 26 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2c  &pState->expert,
162e0 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 65 72   0, sizeof(Exper
162f0 74 49 6e 66 6f 29 29 3b 0a 0a 20 20 66 6f 72 28  tInfo));..  for(
16300 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=1; rc==SQLITE_
16310 4f 4b 20 26 26 20 69 3c 6e 41 72 67 3b 20 69 2b  OK && i<nArg; i+
16320 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20  +){.    char *z 
16330 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  = azArg[i];.    
16340 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 7a  int n;.    if( z
16350 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d  [0]=='-' && z[1]
16360 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20  =='-' ) z++;.   
16370 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29   n = strlen30(z)
16380 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 32 20 26  ;.    if( n>=2 &
16390 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28 7a 2c 20  & 0==strncmp(z, 
163a0 22 2d 76 65 72 62 6f 73 65 22 2c 20 6e 29 20 29  "-verbose", n) )
163b0 7b 0a 20 20 20 20 20 20 70 53 74 61 74 65 2d 3e  {.      pState->
163c0 65 78 70 65 72 74 2e 62 56 65 72 62 6f 73 65 20  expert.bVerbose 
163d0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  = 1;.    }.    e
163e0 6c 73 65 20 69 66 28 20 6e 3e 3d 32 20 26 26 20  lse if( n>=2 && 
163f0 30 3d 3d 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d  0==strncmp(z, "-
16400 73 61 6d 70 6c 65 22 2c 20 6e 29 20 29 7b 0a 20  sample", n) ){. 
16410 20 20 20 20 20 69 66 28 20 69 3d 3d 28 6e 41 72       if( i==(nAr
16420 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  g-1) ){.        
16430 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
16440 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69  r, "option requi
16450 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a  res an argument:
16460 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20   %s\n", z);.    
16470 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16480 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
16490 73 65 7b 0a 20 20 20 20 20 20 20 20 69 53 61 6d  se{.        iSam
164a0 70 6c 65 20 3d 20 28 69 6e 74 29 69 6e 74 65 67  ple = (int)integ
164b0 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 2b 2b  erValue(azArg[++
164c0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  i]);.        if(
164d0 20 69 53 61 6d 70 6c 65 3c 30 20 7c 7c 20 69 53   iSample<0 || iS
164e0 61 6d 70 6c 65 3e 31 30 30 20 29 7b 0a 20 20 20  ample>100 ){.   
164f0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
16500 66 28 73 74 64 65 72 72 2c 20 22 76 61 6c 75 65  f(stderr, "value
16510 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 3a 20 25   out of range: %
16520 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  s\n", azArg[i]);
16530 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
16540 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
16550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16560 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a      }.    else{.
16570 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
16580 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77  (stderr, "unknow
16590 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c  n option: %s\n",
165a0 20 7a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   z);.      rc = 
165b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
165c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
165d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
165e0 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65      pState->expe
165f0 72 74 2e 70 45 78 70 65 72 74 20 3d 20 73 71 6c  rt.pExpert = sql
16600 69 74 65 33 5f 65 78 70 65 72 74 5f 6e 65 77 28  ite3_expert_new(
16610 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 7a 45 72  pState->db, &zEr
16620 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61  r);.    if( pSta
16630 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65  te->expert.pExpe
16640 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  rt==0 ){.      r
16650 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
16660 2c 20 22 73 71 6c 69 74 65 33 5f 65 78 70 65 72  , "sqlite3_exper
16670 74 5f 6e 65 77 3a 20 25 73 5c 6e 22 2c 20 7a 45  t_new: %s\n", zE
16680 72 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rr);.      rc = 
16690 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
166a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
166b0 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 63 6f  qlite3_expert_co
166c0 6e 66 69 67 28 0a 20 20 20 20 20 20 20 20 20 20  nfig(.          
166d0 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
166e0 45 78 70 65 72 74 2c 20 45 58 50 45 52 54 5f 43  Expert, EXPERT_C
166f0 4f 4e 46 49 47 5f 53 41 4d 50 4c 45 2c 20 69 53  ONFIG_SAMPLE, iS
16700 61 6d 70 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20  ample.      );. 
16710 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
16720 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
16730 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /* ifndef SQLITE
16740 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
16750 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78 65  LE */../*.** Exe
16760 63 75 74 65 20 61 20 73 74 61 74 65 6d 65 6e 74  cute a statement
16770 20 6f 72 20 73 65 74 20 6f 66 20 73 74 61 74 65   or set of state
16780 6d 65 6e 74 73 2e 20 20 50 72 69 6e 74 0a 2a 2a  ments.  Print.**
16790 20 61 6e 79 20 72 65 73 75 6c 74 20 72 6f 77 73   any result rows
167a0 2f 63 6f 6c 75 6d 6e 73 20 64 65 70 65 6e 64 69  /columns dependi
167b0 6e 67 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ng on the curren
167c0 74 20 6d 6f 64 65 0a 2a 2a 20 73 65 74 20 76 69  t mode.** set vi
167d0 61 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 63  a the supplied c
167e0 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  allback..**.** T
167f0 68 69 73 20 69 73 20 76 65 72 79 20 73 69 6d 69  his is very simi
16800 6c 61 72 20 74 6f 20 53 51 4c 69 74 65 27 73 20  lar to SQLite's 
16810 62 75 69 6c 74 2d 69 6e 20 73 71 6c 69 74 65 33  built-in sqlite3
16820 5f 65 78 65 63 28 29 0a 2a 2a 20 66 75 6e 63 74  _exec().** funct
16830 69 6f 6e 20 65 78 63 65 70 74 20 69 74 20 74 61  ion except it ta
16840 6b 65 73 20 61 20 73 6c 69 67 68 74 6c 79 20 64  kes a slightly d
16850 69 66 66 65 72 65 6e 74 20 63 61 6c 6c 62 61 63  ifferent callbac
16860 6b 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 62 61 63  k.** and callbac
16870 6b 20 64 61 74 61 20 61 72 67 75 6d 65 6e 74 2e  k data argument.
16880 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
16890 68 65 6c 6c 5f 65 78 65 63 28 0a 20 20 53 68 65  hell_exec(.  She
168a0 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20 20  llState *pArg,  
168b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168c0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
168d0 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20  r to ShellState 
168e0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
168f0 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20  *zSql,          
16900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16910 2a 20 53 51 4c 20 74 6f 20 62 65 20 65 76 61 6c  * SQL to be eval
16920 75 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  uated */.  char 
16930 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20  **pzErrMsg      
16940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16950 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73       /* Error ms
16960 67 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  g written here *
16970 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
16980 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c  tmt *pStmt = NUL
16990 4c 3b 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d  L;     /* Statem
169a0 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65 2e 20  ent to execute. 
169b0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
169c0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
169d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
169e0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32  ode */.  int rc2
169f0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
16a00 7a 4c 65 66 74 6f 76 65 72 3b 20 20 20 20 20 20  zLeftover;      
16a10 20 20 20 20 2f 2a 20 54 61 69 6c 20 6f 66 20 75      /* Tail of u
16a20 6e 70 72 6f 63 65 73 73 65 64 20 53 51 4c 20 2a  nprocessed SQL *
16a30 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
16a40 3d 20 70 41 72 67 2d 3e 64 62 3b 0a 0a 20 20 69  = pArg->db;..  i
16a50 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20  f( pzErrMsg ){. 
16a60 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 4e     *pzErrMsg = N
16a70 55 4c 4c 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ULL;.  }..#ifnde
16a80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
16a90 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
16aa0 20 70 41 72 67 2d 3e 65 78 70 65 72 74 2e 70 45   pArg->expert.pE
16ab0 78 70 65 72 74 20 29 7b 0a 20 20 20 20 72 63 20  xpert ){.    rc 
16ac0 3d 20 65 78 70 65 72 74 48 61 6e 64 6c 65 53 51  = expertHandleSQ
16ad0 4c 28 70 41 72 67 2c 20 7a 53 71 6c 2c 20 70 7a  L(pArg, zSql, pz
16ae0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74  ErrMsg);.    ret
16af0 75 72 6e 20 65 78 70 65 72 74 46 69 6e 69 73 68  urn expertFinish
16b00 28 70 41 72 67 2c 20 28 72 63 21 3d 53 51 4c 49  (pArg, (rc!=SQLI
16b10 54 45 5f 4f 4b 29 2c 20 70 7a 45 72 72 4d 73 67  TE_OK), pzErrMsg
16b20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
16b30 20 77 68 69 6c 65 28 20 7a 53 71 6c 5b 30 5d 20   while( zSql[0] 
16b40 26 26 20 28 53 51 4c 49 54 45 5f 4f 4b 20 3d 3d  && (SQLITE_OK ==
16b50 20 72 63 29 20 29 7b 0a 20 20 20 20 73 74 61 74   rc) ){.    stat
16b60 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
16b70 53 74 6d 74 53 71 6c 3b 0a 20 20 20 20 72 63 20  StmtSql;.    rc 
16b80 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
16b90 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d  e_v2(db, zSql, -
16ba0 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66  1, &pStmt, &zLef
16bb0 74 6f 76 65 72 29 3b 0a 20 20 20 20 69 66 28 20  tover);.    if( 
16bc0 53 51 4c 49 54 45 5f 4f 4b 20 21 3d 20 72 63 20  SQLITE_OK != rc 
16bd0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 7a 45  ){.      if( pzE
16be0 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20  rrMsg ){.       
16bf0 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76   *pzErrMsg = sav
16c00 65 5f 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20  e_err_msg(db);. 
16c10 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
16c20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 53 74  {.      if( !pSt
16c30 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  mt ){.        /*
16c40 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 66 6f   this happens fo
16c50 72 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 72 20 77  r a comment or w
16c60 68 69 74 65 2d 73 70 61 63 65 20 2a 2f 0a 20 20  hite-space */.  
16c70 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65        zSql = zLe
16c80 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20  ftover;.        
16c90 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
16ca0 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b  Sql[0]) ) zSql++
16cb0 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
16cc0 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
16cd0 20 20 7a 53 74 6d 74 53 71 6c 20 3d 20 73 71 6c    zStmtSql = sql
16ce0 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b  ite3_sql(pStmt);
16cf0 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 6d 74  .      if( zStmt
16d00 53 71 6c 3d 3d 30 20 29 20 7a 53 74 6d 74 53 71  Sql==0 ) zStmtSq
16d10 6c 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 77 68  l = "";.      wh
16d20 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 53 74  ile( IsSpace(zSt
16d30 6d 74 53 71 6c 5b 30 5d 29 20 29 20 7a 53 74 6d  mtSql[0]) ) zStm
16d40 74 53 71 6c 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  tSql++;..      /
16d50 2a 20 73 61 76 65 20 6f 66 66 20 74 68 65 20 70  * save off the p
16d60 72 65 70 61 72 65 64 20 73 74 61 74 6d 65 6e 74  repared statment
16d70 20 68 61 6e 64 6c 65 20 61 6e 64 20 72 65 73 65   handle and rese
16d80 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20  t row count */. 
16d90 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29 7b       if( pArg ){
16da0 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 70  .        pArg->p
16db0 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
16dc0 20 20 20 20 20 20 70 41 72 67 2d 3e 63 6e 74 20        pArg->cnt 
16dd0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 0;.      }..  
16de0 20 20 20 20 2f 2a 20 65 63 68 6f 20 74 68 65 20      /* echo the 
16df0 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 69 66  sql statement if
16e00 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a 20 20 20 20   echo on */.    
16e10 20 20 69 66 28 20 70 41 72 67 20 26 26 20 53 68    if( pArg && Sh
16e20 65 6c 6c 48 61 73 46 6c 61 67 28 70 41 72 67 2c  ellHasFlag(pArg,
16e30 20 53 48 46 4c 47 5f 45 63 68 6f 29 20 29 7b 0a   SHFLG_Echo) ){.
16e40 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
16e50 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
16e60 25 73 5c 6e 22 2c 20 7a 53 74 6d 74 53 71 6c 20  %s\n", zStmtSql 
16e70 3f 20 7a 53 74 6d 74 53 71 6c 20 3a 20 7a 53 71  ? zStmtSql : zSq
16e80 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  l);.      }..   
16e90 20 20 20 2f 2a 20 53 68 6f 77 20 74 68 65 20 45     /* Show the E
16ea0 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
16eb0 4e 20 69 66 20 2e 65 71 70 20 69 73 20 6f 6e 20  N if .eqp is on 
16ec0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
16ed0 67 20 26 26 20 70 41 72 67 2d 3e 61 75 74 6f 45  g && pArg->autoE
16ee0 51 50 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  QP && sqlite3_st
16ef0 6d 74 5f 69 73 65 78 70 6c 61 69 6e 28 70 53 74  mt_isexplain(pSt
16f00 6d 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mt)==0 ){.      
16f10 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
16f20 70 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20  pExplain;.      
16f30 20 20 63 68 61 72 20 2a 7a 45 51 50 3b 0a 20 20    char *zEQP;.  
16f40 20 20 20 20 20 20 69 6e 74 20 74 72 69 67 67 65        int trigge
16f50 72 45 51 50 20 3d 20 30 3b 0a 20 20 20 20 20 20  rEQP = 0;.      
16f60 20 20 64 69 73 61 62 6c 65 5f 64 65 62 75 67 5f    disable_debug_
16f70 74 72 61 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20  trace_modes();. 
16f80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
16f90 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c  b_config(db, SQL
16fa0 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49  ITE_DBCONFIG_TRI
16fb0 47 47 45 52 5f 45 51 50 2c 20 2d 31 2c 20 26 74  GGER_EQP, -1, &t
16fc0 72 69 67 67 65 72 45 51 50 29 3b 0a 20 20 20 20  riggerEQP);.    
16fd0 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75      if( pArg->au
16fe0 74 6f 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f 74  toEQP>=AUTOEQP_t
16ff0 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20  rigger ){.      
17000 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63      sqlite3_db_c
17010 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45  onfig(db, SQLITE
17020 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45  _DBCONFIG_TRIGGE
17030 52 5f 45 51 50 2c 20 31 2c 20 30 29 3b 0a 20 20  R_EQP, 1, 0);.  
17040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17050 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zEQP = sqlite3_m
17060 70 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20  printf("EXPLAIN 
17070 51 55 45 52 59 20 50 4c 41 4e 20 25 73 22 2c 20  QUERY PLAN %s", 
17080 7a 53 74 6d 74 53 71 6c 29 3b 0a 20 20 20 20 20  zStmtSql);.     
17090 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
170a0 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
170b0 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61  EQP, -1, &pExpla
170c0 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  in, 0);.        
170d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
170e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  K ){.          w
170f0 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74  hile( sqlite3_st
17100 65 70 28 70 45 78 70 6c 61 69 6e 29 3d 3d 53 51  ep(pExplain)==SQ
17110 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
17120 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
17130 61 72 20 2a 7a 45 51 50 4c 69 6e 65 20 3d 20 28  ar *zEQPLine = (
17140 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
17150 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
17160 70 45 78 70 6c 61 69 6e 2c 33 29 3b 0a 20 20 20  pExplain,3);.   
17170 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 45 71           int iEq
17180 70 49 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  pId = sqlite3_co
17190 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69  lumn_int(pExplai
171a0 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  n, 0);.         
171b0 20 20 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64     int iParentId
171c0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
171d0 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20  n_int(pExplain, 
171e0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
171f0 69 66 28 20 7a 45 51 50 4c 69 6e 65 5b 30 5d 3d  if( zEQPLine[0]=
17200 3d 27 2d 27 20 29 20 65 71 70 5f 72 65 6e 64 65  ='-' ) eqp_rende
17210 72 28 70 41 72 67 2c 20 70 45 78 70 6c 61 69 6e  r(pArg, pExplain
17220 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  );.            e
17230 71 70 5f 61 70 70 65 6e 64 28 70 41 72 67 2c 20  qp_append(pArg, 
17240 69 45 71 70 49 64 2c 20 69 50 61 72 65 6e 74 49  iEqpId, iParentI
17250 64 2c 20 7a 45 51 50 4c 69 6e 65 29 3b 0a 20 20  d, zEQPLine);.  
17260 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17270 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72 28 70      eqp_render(p
17280 41 72 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b 0a  Arg, pExplain);.
17290 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
172a0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
172b0 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20  ze(pExplain);.  
172c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
172d0 65 65 28 7a 45 51 50 29 3b 0a 20 20 20 20 20 20  ee(zEQP);.      
172e0 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f    if( pArg->auto
172f0 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f 66 75 6c  EQP>=AUTOEQP_ful
17300 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  l ){.          /
17310 2a 20 41 6c 73 6f 20 64 6f 20 61 6e 20 45 58 50  * Also do an EXP
17320 4c 41 49 4e 20 66 6f 72 20 22 2e 65 71 70 20 66  LAIN for ".eqp f
17330 75 6c 6c 22 20 6d 6f 64 65 20 2a 2f 0a 20 20 20  ull" mode */.   
17340 20 20 20 20 20 20 20 7a 45 51 50 20 3d 20 73 71         zEQP = sq
17350 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45  lite3_mprintf("E
17360 58 50 4c 41 49 4e 20 25 73 22 2c 20 7a 53 74 6d  XPLAIN %s", zStm
17370 74 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  tSql);.         
17380 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
17390 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51  epare_v2(db, zEQ
173a0 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e  P, -1, &pExplain
173b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
173c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
173d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
173e0 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d   pArg->cMode = M
173f0 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20  ODE_Explain;.   
17400 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e           explain
17410 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 70 41  _data_prepare(pA
17420 72 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b 0a 20  rg, pExplain);. 
17430 20 20 20 20 20 20 20 20 20 20 20 65 78 65 63 5f             exec_
17440 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 70 41  prepared_stmt(pA
17450 72 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b 0a 20  rg, pExplain);. 
17460 20 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61             expla
17470 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70  in_data_delete(p
17480 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Arg);.          
17490 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
174a0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78  te3_finalize(pEx
174b0 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  plain);.        
174c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
174d0 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EQP);.        }.
174e0 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67          if( pArg
174f0 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45  ->autoEQP>=AUTOE
17500 51 50 5f 74 72 69 67 67 65 72 20 26 26 20 74 72  QP_trigger && tr
17510 69 67 67 65 72 45 51 50 3d 3d 30 20 29 7b 0a 20  iggerEQP==0 ){. 
17520 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17530 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53  _db_config(db, S
17540 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54  QLITE_DBCONFIG_T
17550 52 49 47 47 45 52 5f 45 51 50 2c 20 30 2c 20 30  RIGGER_EQP, 0, 0
17560 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
17570 52 65 70 72 65 70 61 72 65 20 70 53 74 6d 74 20  Reprepare pStmt 
17580 62 65 66 6f 72 65 20 72 65 61 63 74 69 76 69 6e  before reactivin
17590 67 20 74 72 61 63 65 20 6d 6f 64 65 73 20 2a 2f  g trace modes */
175a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
175b0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
175c0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  t);.          sq
175d0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
175e0 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
175f0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
17600 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29 20       if( pArg ) 
17610 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 70 53  pArg->pStmt = pS
17620 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  tmt;.        }. 
17630 20 20 20 20 20 20 20 72 65 73 74 6f 72 65 5f 64         restore_d
17640 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73  ebug_trace_modes
17650 28 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ();.      }..   
17660 20 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20     if( pArg ){. 
17670 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f         pArg->cMo
17680 64 65 20 3d 20 70 41 72 67 2d 3e 6d 6f 64 65 3b  de = pArg->mode;
17690 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72  .        if( pAr
176a0 67 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 29  g->autoExplain )
176b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
176c0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69 73 65  sqlite3_stmt_ise
176d0 78 70 6c 61 69 6e 28 70 53 74 6d 74 29 3d 3d 31  xplain(pStmt)==1
176e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
176f0 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f  pArg->cMode = MO
17700 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  DE_Explain;.    
17710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17720 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
17730 6d 74 5f 69 73 65 78 70 6c 61 69 6e 28 70 53 74  mt_isexplain(pSt
17740 6d 74 29 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  mt)==2 ){.      
17750 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64        pArg->cMod
17760 65 20 3d 20 4d 4f 44 45 5f 45 51 50 3b 0a 20 20  e = MODE_EQP;.  
17770 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17780 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
17790 49 66 20 74 68 65 20 73 68 65 6c 6c 20 69 73 20  If the shell is 
177a0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 22 2e 65  currently in ".e
177b0 78 70 6c 61 69 6e 22 20 6d 6f 64 65 2c 20 67 61  xplain" mode, ga
177c0 74 68 65 72 20 74 68 65 20 65 78 74 72 61 0a 20  ther the extra. 
177d0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 72         ** data r
177e0 65 71 75 69 72 65 64 20 74 6f 20 61 64 64 20 69  equired to add i
177f0 6e 64 65 6e 74 73 20 74 6f 20 74 68 65 20 6f 75  ndents to the ou
17800 74 70 75 74 2e 2a 2f 0a 20 20 20 20 20 20 20 20  tput.*/.        
17810 69 66 28 20 70 41 72 67 2d 3e 63 4d 6f 64 65 3d  if( pArg->cMode=
17820 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b  =MODE_Explain ){
17830 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61  .          expla
17840 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28  in_data_prepare(
17850 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20 20  pArg, pStmt);.  
17860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17870 0a 20 20 20 20 20 20 62 69 6e 64 5f 70 72 65 70  .      bind_prep
17880 61 72 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20  ared_stmt(pArg, 
17890 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 65 78  pStmt);.      ex
178a0 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74  ec_prepared_stmt
178b0 28 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20  (pArg, pStmt);. 
178c0 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74       explain_dat
178d0 61 5f 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a  a_delete(pArg);.
178e0 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72        eqp_render
178f0 28 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 0a  (pArg, pStmt);..
17900 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 75        /* print u
17910 73 61 67 65 20 73 74 61 74 73 20 69 66 20 73 74  sage stats if st
17920 61 74 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ats on */.      
17930 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
17940 2d 3e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20  ->statsOn ){.   
17950 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61       display_sta
17960 74 73 28 64 62 2c 20 70 41 72 67 2c 20 30 29 3b  ts(db, pArg, 0);
17970 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
17980 2f 2a 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f  /* print loop-co
17990 75 6e 74 65 72 73 20 69 66 20 72 65 71 75 69 72  unters if requir
179a0 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
179b0 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73 63  pArg && pArg->sc
179c0 61 6e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20  anstatsOn ){.   
179d0 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 63 61       display_sca
179e0 6e 73 74 61 74 73 28 64 62 2c 20 70 41 72 67 29  nstats(db, pArg)
179f0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
17a00 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
17a10 20 73 74 61 74 65 6d 65 6e 74 20 6a 75 73 74 20   statement just 
17a20 65 78 65 63 75 74 65 64 2e 20 49 66 20 74 68 69  executed. If thi
17a30 73 20 66 61 69 6c 73 2c 20 73 61 76 65 20 61 0a  s fails, save a.
17a40 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
17a50 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
17a60 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73  ge. Otherwise, s
17a70 65 74 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74  et zSql to point
17a80 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
17a90 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20   next statement 
17aa0 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20  to execute. */. 
17ab0 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
17ac0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
17ad0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
17ae0 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
17af0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
17b00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17b10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53  OK ){.        zS
17b20 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a  ql = zLeftover;.
17b30 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 49          while( I
17b40 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20  sSpace(zSql[0]) 
17b50 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20  ) zSql++;.      
17b60 7d 65 6c 73 65 20 69 66 28 20 70 7a 45 72 72 4d  }else if( pzErrM
17b70 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  sg ){.        *p
17b80 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65  zErrMsg = save_e
17b90 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20  rr_msg(db);.    
17ba0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c    }..      /* cl
17bb0 65 61 72 20 73 61 76 65 64 20 73 74 6d 74 20 68  ear saved stmt h
17bc0 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69  andle */.      i
17bd0 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20  f( pArg ){.     
17be0 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d     pArg->pStmt =
17bf0 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20   NULL;.      }. 
17c00 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20     }.  } /* end 
17c10 77 68 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75  while */..  retu
17c20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17c30 52 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 70  Release memory p
17c40 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
17c50 74 65 64 20 62 79 20 74 61 62 6c 65 43 6f 6c 75  ted by tableColu
17c60 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74 61  mnList()..*/.sta
17c70 74 69 63 20 76 6f 69 64 20 66 72 65 65 43 6f 6c  tic void freeCol
17c80 75 6d 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a 61  umnList(char **a
17c90 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zCol){.  int i;.
17ca0 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c    for(i=1; azCol
17cb0 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  [i]; i++){.    s
17cc0 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f  qlite3_free(azCo
17cd0 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  l[i]);.  }.  /* 
17ce0 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73 74  azCol[0] is a st
17cf0 61 74 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a 20  atic string */. 
17d00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a   sqlite3_free(az
17d10 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Col);.}../*.** R
17d20 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
17d30 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 74 72 69  pointers to stri
17d40 6e 67 73 20 77 68 69 63 68 20 61 72 65 20 74 68  ngs which are th
17d50 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a  e names of all.*
17d60 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62  * columns in tab
17d70 6c 65 20 7a 54 61 62 2e 20 20 20 54 68 65 20 6d  le zTab.   The m
17d80 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
17d90 65 20 6e 61 6d 65 73 20 69 73 20 64 79 6e 61 6d  e names is dynam
17da0 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61  ically.** alloca
17db0 74 65 64 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ted and must be 
17dc0 72 65 6c 65 61 73 65 64 20 62 79 20 74 68 65 20  released by the 
17dd0 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 61 20 73  caller using a s
17de0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
17df0 2a 20 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e 4c  * to freeColumnL
17e00 69 73 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ist()..**.** The
17e10 20 61 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79 20   azCol[0] entry 
17e20 69 73 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e  is usually NULL.
17e30 20 20 48 6f 77 65 76 65 72 2c 20 69 66 20 7a 54    However, if zT
17e40 61 62 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f  ab contains a ro
17e50 77 69 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68 61  wid.** value tha
17e60 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72  t needs to be pr
17e70 65 73 65 72 76 65 64 2c 20 74 68 65 6e 20 61 7a  eserved, then az
17e80 43 6f 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65 64  Col[0] is filled
17e90 20 69 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a 20   in with the.** 
17ea0 6e 61 6d 65 20 6f 66 20 74 68 65 20 72 6f 77 69  name of the rowi
17eb0 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  d column..**.** 
17ec0 54 68 65 20 66 69 72 73 74 20 72 65 67 75 6c 61  The first regula
17ed0 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  r column in the 
17ee0 74 61 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b 31  table is azCol[1
17ef0 5d 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73 20  ].  The list is 
17f00 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62 79  terminated.** by
17f10 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61   an entry with a
17f20 7a 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73  zCol[i]==0..*/.s
17f30 74 61 74 69 63 20 63 68 61 72 20 2a 2a 74 61 62  tatic char **tab
17f40 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68 65  leColumnList(She
17f50 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
17f60 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20  t char *zTab){. 
17f70 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20   char **azCol = 
17f80 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
17f90 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61 72  t *pStmt;.  char
17fa0 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 43   *zSql;.  int nC
17fb0 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41  ol = 0;.  int nA
17fc0 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lloc = 0;.  int 
17fd0 6e 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  nPK = 0;       /
17fe0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 52 49 4d  * Number of PRIM
17ff0 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20  ARY KEY columns 
18000 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  seen */.  int is
18010 49 50 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  IPK = 0;     /* 
18020 54 72 75 65 20 69 66 20 6f 6e 65 20 50 52 49 4d  True if one PRIM
18030 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f  ARY KEY column o
18040 66 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 2a  f type INTEGER *
18050 2f 0a 20 20 69 6e 74 20 70 72 65 73 65 72 76 65  /.  int preserve
18060 52 6f 77 69 64 20 3d 20 53 68 65 6c 6c 48 61 73  Rowid = ShellHas
18070 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72  Flag(p, SHFLG_Pr
18080 65 73 65 72 76 65 52 6f 77 69 64 29 3b 0a 20 20  eserveRowid);.  
18090 69 6e 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20  int rc;..  zSql 
180a0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
180b0 66 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f  f("PRAGMA table_
180c0 69 6e 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b  info=%Q", zTab);
180d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
180e0 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
180f0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
18100 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
18110 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
18120 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
18130 30 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  0;.  while( sqli
18140 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
18150 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
18160 20 20 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c     if( nCol>=nAl
18170 6c 6f 63 2d 32 20 29 7b 0a 20 20 20 20 20 20 6e  loc-2 ){.      n
18180 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32  Alloc = nAlloc*2
18190 20 2b 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20 20   + nCol + 10;.  
181a0 20 20 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69      azCol = sqli
181b0 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f  te3_realloc(azCo
181c0 6c 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  l, nAlloc*sizeof
181d0 28 61 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  (azCol[0]));.   
181e0 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20     if( azCol==0 
181f0 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d  ) shell_out_of_m
18200 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20  emory();.    }. 
18210 20 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d     azCol[++nCol]
18220 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
18230 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
18240 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
18250 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20 69 66 28  mt, 1));.    if(
18260 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
18270 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 20 29 7b  int(pStmt, 5) ){
18280 0a 20 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20  .      nPK++;.  
18290 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20      if( nPK==1. 
182a0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
182b0 5f 73 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20  _stricmp((const 
182c0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
182d0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
182e0 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  2),.            
182f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
18300 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20  NTEGER")==0.    
18310 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 49    ){.        isI
18320 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  PK = 1;.      }e
18330 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 49  lse{.        isI
18340 50 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  PK = 0;.      }.
18350 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
18360 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
18370 6d 74 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c  mt);.  if( azCol
18380 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
18390 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a    azCol[0] = 0;.
183a0 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20    azCol[nCol+1] 
183b0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  = 0;..  /* The d
183c0 65 63 69 73 69 6f 6e 20 6f 66 20 77 68 65 74 68  ecision of wheth
183d0 65 72 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69  er or not a rowi
183e0 64 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 74  d really needs t
183f0 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 0a 20  o be preserved. 
18400 20 2a 2a 20 69 73 20 74 72 69 63 6b 79 2e 20 20   ** is tricky.  
18410 57 65 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f  We never need to
18420 20 70 72 65 73 65 72 76 65 20 61 20 72 6f 77 69   preserve a rowi
18430 64 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  d for a WITHOUT 
18440 52 4f 57 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a  ROWID table.  **
18450 20 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68   or a table with
18460 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
18470 41 52 59 20 4b 45 59 2e 20 20 57 65 20 61 72 65  ARY KEY.  We are
18480 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 65 73 65   unable to prese
18490 72 76 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20  rve.  ** rowids 
184a0 6f 6e 20 74 61 62 6c 65 73 20 77 68 65 72 65 20  on tables where 
184b0 74 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e 61  the rowid is ina
184c0 63 63 65 73 73 69 62 6c 65 20 62 65 63 61 75 73  ccessible becaus
184d0 65 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  e there are othe
184e0 72 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69  r.  ** columns i
184f0 6e 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  n the table name
18500 64 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77  d "rowid", "_row
18510 69 64 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e  id_", and "oid".
18520 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 73  .  */.  if( pres
18530 65 72 76 65 52 6f 77 69 64 20 26 26 20 69 73 49  erveRowid && isI
18540 50 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  PK ){.    /* If 
18550 61 20 73 69 6e 67 6c 65 20 50 52 49 4d 41 52 59  a single PRIMARY
18560 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68   KEY column with
18570 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 77 61   type INTEGER wa
18580 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a  s seen, then it.
18590 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20      ** might be 
185a0 61 6e 20 61 6c 69 73 65 20 66 6f 72 20 74 68 65  an alise for the
185b0 20 52 4f 57 49 44 2e 20 20 42 75 74 20 69 74 20   ROWID.  But it 
185c0 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20  might also be a 
185d0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20  WITHOUT ROWID.  
185e0 20 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61 20    ** table or a 
185f0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
18600 4b 45 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c  KEY DESC column,
18610 20 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63   neither of whic
18620 68 20 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57  h are.    ** ROW
18630 49 44 20 61 6c 69 61 73 65 73 2e 20 20 54 6f 20  ID aliases.  To 
18640 64 69 73 74 69 6e 67 75 69 73 68 20 74 68 65 73  distinguish thes
18650 65 20 63 61 73 65 73 2c 20 63 68 65 63 6b 20 74  e cases, check t
18660 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20  o see if.    ** 
18670 74 68 65 72 65 20 69 73 20 61 20 22 70 6b 22 20  there is a "pk" 
18680 65 6e 74 72 79 20 69 6e 20 22 50 52 41 47 4d 41  entry in "PRAGMA
18690 20 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20 54   index_list".  T
186a0 68 65 72 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  here will be.   
186b0 20 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65   ** no "pk" inde
186c0 78 20 69 66 20 74 68 65 20 50 52 49 4d 41 52 59  x if the PRIMARY
186d0 20 4b 45 59 20 72 65 61 6c 6c 79 20 69 73 20 61   KEY really is a
186e0 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20  n alias for the 
186f0 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20  ROWID..    */.  
18700 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
18710 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
18720 20 31 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69   1 FROM pragma_i
18730 6e 64 65 78 5f 6c 69 73 74 28 25 51 29 22 0a 20  ndex_list(%Q)". 
18740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18750 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
18760 45 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20  E origin='pk'", 
18770 7a 54 61 62 29 3b 0a 20 20 20 20 72 63 20 3d 20  zTab);.    rc = 
18780 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
18790 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
187a0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
187b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
187c0 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
187d0 72 63 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  rc ){.      free
187e0 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c  ColumnList(azCol
187f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18800 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  0;.    }.    rc 
18810 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
18820 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
18830 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
18840 74 29 3b 0a 20 20 20 20 70 72 65 73 65 72 76 65  t);.    preserve
18850 52 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49  Rowid = rc==SQLI
18860 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66  TE_ROW;.  }.  if
18870 28 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20  ( preserveRowid 
18880 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70  ){.    /* Only p
18890 72 65 73 65 72 76 65 20 74 68 65 20 72 6f 77 69  reserve the rowi
188a0 64 20 69 66 20 77 65 20 63 61 6e 20 66 69 6e 64  d if we can find
188b0 20 61 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 66   a name to use f
188c0 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f  or the.    ** ro
188d0 77 69 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 69  wid */.    stati
188e0 63 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b  c char *azRowid[
188f0 5d 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22  ] = { "rowid", "
18900 5f 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22 20  _rowid_", "oid" 
18910 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  };.    int i, j;
18920 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
18930 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66  3; j++){.      f
18940 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b  or(i=1; i<=nCol;
18950 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
18960 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
18970 6d 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a  mp(azRowid[j],az
18980 43 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65  Col[i])==0 ) bre
18990 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
189a0 20 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a    if( i>nCol ){.
189b0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
189c0 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f  is point, we kno
189d0 77 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a  w that azRowid[j
189e0 5d 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  ] is not the nam
189f0 65 20 6f 66 20 61 6e 79 0a 20 20 20 20 20 20 20  e of any.       
18a00 20 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c   ** ordinary col
18a10 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
18a20 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 61  .  Verify that a
18a30 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20 76  zRowid[j] is a v
18a40 61 6c 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  alid.        ** 
18a50 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 72 6f 77  name for the row
18a60 69 64 20 62 65 66 6f 72 65 20 61 64 64 69 6e 67  id before adding
18a70 20 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e   it to azCol[0].
18a80 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a    WITHOUT ROWID.
18a90 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
18aa0 73 20 77 69 6c 6c 20 66 61 69 6c 20 74 68 69 73  s will fail this
18ab0 20 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20   last check */. 
18ac0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
18ad0 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
18ae0 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c  _metadata(p->db,
18af0 30 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a  0,zTab,azRowid[j
18b00 5d 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20  ],0,0,0,0,0);.  
18b10 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
18b20 4c 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b  LITE_OK ) azCol[
18b30 30 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b  0] = azRowid[j];
18b40 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
18b50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18b60 7d 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c  }.  return azCol
18b70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c  ;.}../*.** Toggl
18b80 65 20 74 68 65 20 72 65 76 65 72 73 65 5f 75 6e  e the reverse_un
18b90 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 20  ordered_selects 
18ba0 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  setting..*/.stat
18bb0 69 63 20 76 6f 69 64 20 74 6f 67 67 6c 65 53 65  ic void toggleSe
18bc0 6c 65 63 74 4f 72 64 65 72 28 73 71 6c 69 74 65  lectOrder(sqlite
18bd0 33 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74 65  3 *db){.  sqlite
18be0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
18bf0 30 3b 0a 20 20 69 6e 74 20 69 53 65 74 74 69 6e  0;.  int iSettin
18c00 67 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 53  g = 0;.  char zS
18c10 74 6d 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69  tmt[100];.  sqli
18c20 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
18c30 62 2c 20 22 50 52 41 47 4d 41 20 72 65 76 65 72  b, "PRAGMA rever
18c40 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c  se_unordered_sel
18c50 65 63 74 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d  ects", -1, &pStm
18c60 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c  t, 0);.  if( sql
18c70 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
18c80 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
18c90 20 20 20 20 69 53 65 74 74 69 6e 67 20 3d 20 73      iSetting = s
18ca0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
18cb0 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d  t(pStmt, 0);.  }
18cc0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
18cd0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71  ize(pStmt);.  sq
18ce0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
18cf0 69 7a 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53  izeof(zStmt), zS
18d00 74 6d 74 2c 0a 20 20 20 20 20 20 20 22 50 52 41  tmt,.       "PRA
18d10 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72  GMA reverse_unor
18d20 64 65 72 65 64 5f 73 65 6c 65 63 74 73 28 25 64  dered_selects(%d
18d30 29 22 2c 20 21 69 53 65 74 74 69 6e 67 29 3b 0a  )", !iSetting);.
18d40 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64    sqlite3_exec(d
18d50 62 2c 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20  b, zStmt, 0, 0, 
18d60 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
18d70 73 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 74  s is a different
18d80 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
18d90 65 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69  e used for dumpi
18da0 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
18db0 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63  .** Each row rec
18dc0 65 69 76 65 64 20 62 79 20 74 68 69 73 20 63 61  eived by this ca
18dd0 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
18de0 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c  of a table name,
18df0 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79  .** the table ty
18e00 70 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22  pe ("index" or "
18e10 74 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20  table") and SQL 
18e20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
18e30 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ble..** This rou
18e40 74 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e  tine should prin
18e50 74 20 74 65 78 74 20 73 75 66 66 69 63 69 65 6e  t text sufficien
18e60 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 74 68  t to recreate th
18e70 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
18e80 69 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c  ic int dump_call
18e90 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c  back(void *pArg,
18ea0 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20   int nArg, char 
18eb0 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a  **azArg, char **
18ec0 61 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e  azNotUsed){.  in
18ed0 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
18ee0 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f  ar *zTable;.  co
18ef0 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
18f00 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18f10 53 71 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74  Sql;.  ShellStat
18f20 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
18f30 74 65 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e  te *)pArg;..  UN
18f40 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
18f50 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  zNotUsed);.  if(
18f60 20 6e 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72   nArg!=3 || azAr
18f70 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
18f80 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72  .  zTable = azAr
18f90 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20  g[0];.  zType = 
18fa0 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c  azArg[1];.  zSql
18fb0 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20   = azArg[2];..  
18fc0 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c  if( strcmp(zTabl
18fd0 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65  e, "sqlite_seque
18fe0 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nce")==0 ){.    
18ff0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
19000 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  t, "DELETE FROM 
19010 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b  sqlite_sequence;
19020 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  \n");.  }else if
19030 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ( sqlite3_strglo
19040 62 28 22 73 71 6c 69 74 65 5f 73 74 61 74 3f 22  b("sqlite_stat?"
19050 2c 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a  , zTable)==0 ){.
19060 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
19070 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20  ->out, "ANALYZE 
19080 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e  sqlite_master;\n
19090 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
190a0 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20  strncmp(zTable, 
190b0 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
190c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
190d0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
190e0 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45  rncmp(zSql, "CRE
190f0 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
19100 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20  E", 20)==0 ){.  
19110 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20    char *zIns;.  
19120 20 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62    if( !p->writab
19130 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  leSchema ){.    
19140 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
19150 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69  out, "PRAGMA wri
19160 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b  table_schema=ON;
19170 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77  \n");.      p->w
19180 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20  ritableSchema = 
19190 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e  1;.    }.    zIn
191a0 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  s = sqlite3_mpri
191b0 6e 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53  ntf(.       "INS
191c0 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f  ERT INTO sqlite_
191d0 6d 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65  master(type,name
191e0 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61  ,tbl_name,rootpa
191f0 67 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20  ge,sql)".       
19200 22 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c  "VALUES('table',
19210 27 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27  '%q','%q',0,'%q'
19220 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62  );",.       zTab
19230 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c  le, zTable, zSql
19240 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
19250 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  tf(p->out, "%s\n
19260 22 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71  ", zIns);.    sq
19270 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29  lite3_free(zIns)
19280 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
19290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69    }else{.    pri
192a0 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e  ntSchemaLine(p->
192b0 6f 75 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22  out, zSql, ";\n"
192c0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74  );.  }..  if( st
192d0 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62  rcmp(zType, "tab
192e0 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53  le")==0 ){.    S
192f0 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74  hellText sSelect
19300 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20  ;.    ShellText 
19310 73 54 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72  sTable;.    char
19320 20 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e   **azCol;.    in
19330 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 73  t i;.    char *s
19340 61 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20  avedDestTable;. 
19350 20 20 20 69 6e 74 20 73 61 76 65 64 4d 6f 64 65     int savedMode
19360 3b 0a 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74  ;..    azCol = t
19370 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  ableColumnList(p
19380 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  , zTable);.    i
19390 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20  f( azCol==0 ){. 
193a0 20 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a       p->nErr++;.
193b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
193c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
193d0 77 61 79 73 20 71 75 6f 74 65 20 74 68 65 20 74  ways quote the t
193e0 61 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20  able name, even 
193f0 69 66 20 69 74 20 61 70 70 65 61 72 73 20 74 6f  if it appears to
19400 20 62 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a   be pure ascii,.
19410 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69      ** in case i
19420 74 20 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20  t is a keyword. 
19430 45 78 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  Ex:  INSERT INTO
19440 20 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a   "table" ... */.
19450 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 54      initText(&sT
19460 61 62 6c 65 29 3b 0a 20 20 20 20 61 70 70 65 6e  able);.    appen
19470 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 7a  dText(&sTable, z
19480 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72  Table, quoteChar
19490 28 7a 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f  (zTable));.    /
194a0 2a 20 49 66 20 70 72 65 73 65 72 76 69 6e 67 20  * If preserving 
194b0 74 68 65 20 72 6f 77 69 64 2c 20 61 64 64 20 61  the rowid, add a
194c0 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74   column list aft
194d0 65 72 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  er the table nam
194e0 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68  e..    ** In oth
194f0 65 72 20 77 6f 72 64 73 3a 20 20 22 49 4e 53 45  er words:  "INSE
19500 52 54 20 49 4e 54 4f 20 74 61 62 28 72 6f 77 69  RT INTO tab(rowi
19510 64 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c  d,a,b,c,...) VAL
19520 55 45 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  UES(...)".    **
19530 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
19540 75 73 75 61 6c 20 22 49 4e 53 45 52 54 20 49 4e  usual "INSERT IN
19550 54 4f 20 74 61 62 20 56 41 4c 55 45 53 28 2e 2e  TO tab VALUES(..
19560 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  .)"..    */.    
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 54 61 62 6c 65 2c 20 22 28 22 2c 20 30  (&sTable, "(", 0
195a0 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54  );.      appendT
195b0 65 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43  ext(&sTable, azC
195c0 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ol[0], 0);.     
195d0 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b   for(i=1; azCol[
195e0 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
195f0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
19600 61 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20  able, ",", 0);. 
19610 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
19620 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c  t(&sTable, azCol
19630 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61  [i], quoteChar(a
19640 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20  zCol[i]));.     
19650 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54   }.      appendT
19660 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22 29 22  ext(&sTable, ")"
19670 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
19680 20 2f 2a 20 42 75 69 6c 64 20 61 6e 20 61 70 70   /* Build an app
19690 72 6f 70 72 69 61 74 65 20 53 45 4c 45 43 54 20  ropriate SELECT 
196a0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
196b0 20 69 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65   initText(&sSele
196c0 63 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  ct);.    appendT
196d0 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53  ext(&sSelect, "S
196e0 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20  ELECT ", 0);.   
196f0 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b   if( azCol[0] ){
19700 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
19710 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f  t(&sSelect, azCo
19720 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  l[0], 0);.      
19730 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
19740 65 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20  ect, ",", 0);.  
19750 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b    }.    for(i=1;
19760 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b   azCol[i]; i++){
19770 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
19780 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f  t(&sSelect, azCo
19790 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28  l[i], quoteChar(
197a0 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20  azCol[i]));.    
197b0 20 20 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d    if( azCol[i+1]
197c0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
197d0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
197e0 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20   ",", 0);.      
197f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
19800 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c  ColumnList(azCol
19810 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
19820 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 46 52  t(&sSelect, " FR
19830 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 61 70  OM ", 0);.    ap
19840 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
19850 74 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65  t, zTable, quote
19860 43 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a  Char(zTable));..
19870 20 20 20 20 73 61 76 65 64 44 65 73 74 54 61 62      savedDestTab
19880 6c 65 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62  le = p->zDestTab
19890 6c 65 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f 64  le;.    savedMod
198a0 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20  e = p->mode;.   
198b0 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d   p->zDestTable =
198c0 20 73 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70   sTable.z;.    p
198d0 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64  ->mode = p->cMod
198e0 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b  e = MODE_Insert;
198f0 0a 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f  .    rc = shell_
19900 65 78 65 63 28 70 2c 20 73 53 65 6c 65 63 74 2e  exec(p, sSelect.
19910 7a 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28  z, 0);.    if( (
19920 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
19930 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20  _CORRUPT ){.    
19940 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
19950 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f  out, "/****** CO
19960 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a  RRUPTION ERROR *
19970 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20  ******/\n");.   
19980 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f     toggleSelectO
19990 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20  rder(p->db);.   
199a0 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c     shell_exec(p,
199b0 20 73 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a   sSelect.z, 0);.
199c0 20 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65        toggleSele
199d0 63 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a  ctOrder(p->db);.
199e0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65      }.    p->zDe
199f0 73 74 54 61 62 6c 65 20 3d 20 73 61 76 65 64 44  stTable = savedD
19a00 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d  estTable;.    p-
19a10 3e 6d 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f 64  >mode = savedMod
19a20 65 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28  e;.    freeText(
19a30 26 73 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 72  &sTable);.    fr
19a40 65 65 54 65 78 74 28 26 73 53 65 6c 65 63 74 29  eeText(&sSelect)
19a50 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 70  ;.    if( rc ) p
19a60 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nErr++;.  }.  
19a70 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
19a80 2a 2a 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20  ** Run zQuery.  
19a90 55 73 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  Use dump_callbac
19aa0 6b 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62  k() as the callb
19ab0 61 63 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74  ack routine so t
19ac0 68 61 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  hat.** the conte
19ad0 6e 74 73 20 6f 66 20 74 68 65 20 71 75 65 72 79  nts of the query
19ae0 20 61 72 65 20 6f 75 74 70 75 74 20 61 73 20 53   are output as S
19af0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  QL statements..*
19b00 2a 0a 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61  *.** If we get a
19b10 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
19b20 65 72 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65  error, rerun the
19b30 20 71 75 65 72 79 20 61 66 74 65 72 20 61 70 70   query after app
19b40 65 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52  ending.** "ORDER
19b50 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20   BY rowid DESC" 
19b60 74 6f 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73  to the end..*/.s
19b70 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63  tatic int run_sc
19b80 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28  hema_dump_query(
19b90 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
19ba0 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
19bb0 7a 51 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20  zQuery.){.  int 
19bc0 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
19bd0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
19be0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
19bf0 20 7a 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61   zQuery, dump_ca
19c00 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72  llback, p, &zErr
19c10 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
19c20 49 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20  ITE_CORRUPT ){. 
19c30 20 20 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20     char *zQ2;.  
19c40 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
19c50 65 6e 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20  en30(zQuery);.  
19c60 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
19c70 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f  out, "/****** CO
19c80 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a  RRUPTION ERROR *
19c90 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20  ******/\n");.   
19ca0 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
19cb0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
19cc0 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20  ->out, "/****** 
19cd0 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a  %s ******/\n", z
19ce0 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Err);.      sqli
19cf0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
19d00 20 20 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a        zErr = 0;.
19d10 20 20 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20      }.    zQ2 = 
19d20 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20  malloc( len+100 
19d30 29 3b 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d  );.    if( zQ2==
19d40 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
19d50 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
19d60 6e 74 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32  ntf(len+100, zQ2
19d70 2c 20 22 25 73 20 4f 52 44 45 52 20 42 59 20 72  , "%s ORDER BY r
19d80 6f 77 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65  owid DESC", zQue
19d90 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ry);.    rc = sq
19da0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
19db0 2c 20 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c  , zQ2, dump_call
19dc0 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b  back, p, &zErr);
19dd0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
19de0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
19df0 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a  (p->out, "/*****
19e00 2a 20 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a  * ERROR: %s ****
19e10 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20  **/\n", zErr);. 
19e20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19e30 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
19e40 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  UPT;.    }.    s
19e50 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
19e60 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29  );.    free(zQ2)
19e70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
19e80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74  c;.}../*.** Text
19e90 20 6f 66 20 68 65 6c 70 20 6d 65 73 73 61 67 65   of help message
19ea0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 65 6c  s..**.** The hel
19eb0 70 20 74 65 78 74 20 66 6f 72 20 65 61 63 68 20  p text for each 
19ec0 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6d 6d 61  individual comma
19ed0 6e 64 20 62 65 67 69 6e 73 20 77 69 74 68 20 61  nd begins with a
19ee0 20 6c 69 6e 65 20 74 68 61 74 20 73 74 61 72 74   line that start
19ef0 73 0a 2a 2a 20 77 69 74 68 20 22 2e 22 2e 20 20  s.** with ".".  
19f00 53 75 62 73 65 71 75 65 6e 74 20 6c 69 6e 65 73  Subsequent lines
19f10 20 61 72 65 20 73 75 70 70 6c 69 6d 65 6e 74 61   are supplimenta
19f20 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
19f30 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
19f40 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  be two or more s
19f50 70 61 63 65 73 20 62 65 74 77 65 65 6e 20 74 68  paces between th
19f60 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 6f 6d  e end of the com
19f70 6d 61 6e 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  mand and the.** 
19f80 73 74 61 72 74 20 6f 66 20 74 68 65 20 64 65 73  start of the des
19f90 63 72 69 70 74 69 6f 6e 20 6f 66 20 77 68 61 74  cription of what
19fa0 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 20 64 6f   that command do
19fb0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
19fc0 6e 73 74 20 63 68 61 72 20 2a 28 61 7a 48 65 6c  nst char *(azHel
19fd0 70 5b 5d 29 20 3d 20 7b 0a 23 69 66 20 64 65 66  p[]) = {.#if def
19fe0 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45  ined(SQLITE_HAVE
19ff0 5f 5a 4c 49 42 29 20 26 26 20 21 64 65 66 69 6e  _ZLIB) && !defin
1a000 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1a010 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 22  IRTUALTABLE).  "
1a020 2e 61 72 63 68 69 76 65 20 2e 2e 2e 20 20 20 20  .archive ...    
1a030 20 20 20 20 20 20 20 20 20 4d 61 6e 61 67 65 20           Manage 
1a040 53 51 4c 20 61 72 63 68 69 76 65 73 22 2c 0a 20  SQL archives",. 
1a050 20 22 20 20 20 45 61 63 68 20 63 6f 6d 6d 61 6e   "   Each comman
1a060 64 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63  d must have exac
1a070 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 66  tly one of the f
1a080 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74 69 6f 6e 73  ollowing options
1a090 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d 63 2c 20  :",.  "     -c, 
1a0a0 2d 2d 63 72 65 61 74 65 20 20 20 20 20 20 20 20  --create        
1a0b0 20 20 20 20 20 20 20 43 72 65 61 74 65 20 61 20         Create a 
1a0c0 6e 65 77 20 61 72 63 68 69 76 65 22 2c 0a 20 20  new archive",.  
1a0d0 22 20 20 20 20 20 2d 75 2c 20 2d 2d 75 70 64 61  "     -u, --upda
1a0e0 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  te              
1a0f0 20 41 64 64 20 66 69 6c 65 73 20 6f 72 20 75 70   Add files or up
1a100 64 61 74 65 20 66 69 6c 65 73 20 77 69 74 68 20  date files with 
1a110 63 68 61 6e 67 65 64 20 6d 74 69 6d 65 22 2c 0a  changed mtime",.
1a120 20 20 22 20 20 20 20 20 2d 69 2c 20 2d 2d 69 6e    "     -i, --in
1a130 73 65 72 74 20 20 20 20 20 20 20 20 20 20 20 20  sert            
1a140 20 20 20 4c 69 6b 65 20 2d 75 20 62 75 74 20 61     Like -u but a
1a150 6c 77 61 79 73 20 61 64 64 20 65 76 65 6e 20 69  lways add even i
1a160 66 20 6d 74 69 6d 65 20 75 6e 63 68 61 6e 67 65  f mtime unchange
1a170 64 22 2c 0a 20 20 22 20 20 20 20 20 2d 74 2c 20  d",.  "     -t, 
1a180 2d 2d 6c 69 73 74 20 20 20 20 20 20 20 20 20 20  --list          
1a190 20 20 20 20 20 20 20 4c 69 73 74 20 63 6f 6e 74         List cont
1a1a0 65 6e 74 73 20 6f 66 20 61 72 63 68 69 76 65 22  ents of archive"
1a1b0 2c 0a 20 20 22 20 20 20 20 20 2d 78 2c 20 2d 2d  ,.  "     -x, --
1a1c0 65 78 74 72 61 63 74 20 20 20 20 20 20 20 20 20  extract         
1a1d0 20 20 20 20 20 45 78 74 72 61 63 74 20 66 69 6c       Extract fil
1a1e0 65 73 20 66 72 6f 6d 20 61 72 63 68 69 76 65 22  es from archive"
1a1f0 2c 0a 20 20 22 20 20 20 4f 70 74 69 6f 6e 61 6c  ,.  "   Optional
1a200 20 61 72 67 75 6d 65 6e 74 73 3a 22 2c 0a 20 20   arguments:",.  
1a210 22 20 20 20 20 20 2d 76 2c 20 2d 2d 76 65 72 62  "     -v, --verb
1a220 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ose             
1a230 20 50 72 69 6e 74 20 65 61 63 68 20 66 69 6c 65   Print each file
1a240 6e 61 6d 65 20 61 73 20 69 74 20 69 73 20 70 72  name as it is pr
1a250 6f 63 65 73 73 65 64 22 2c 0a 20 20 22 20 20 20  ocessed",.  "   
1a260 20 20 2d 66 20 46 49 4c 45 2c 20 2d 2d 66 69 6c    -f FILE, --fil
1a270 65 20 46 49 4c 45 20 20 20 20 20 20 20 4f 70 65  e FILE       Ope
1a280 72 61 74 65 20 6f 6e 20 61 72 63 68 69 76 65 20  rate on archive 
1a290 46 49 4c 45 20 28 64 65 66 61 75 6c 74 20 69 73  FILE (default is
1a2a0 20 63 75 72 72 65 6e 74 20 64 62 29 22 2c 0a 20   current db)",. 
1a2b0 20 22 20 20 20 20 20 2d 61 20 46 49 4c 45 2c 20   "     -a FILE, 
1a2c0 2d 2d 61 70 70 65 6e 64 20 46 49 4c 45 20 20 20  --append FILE   
1a2d0 20 20 4f 70 65 72 61 74 65 20 6f 6e 20 46 49 4c    Operate on FIL
1a2e0 45 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74  E opened using t
1a2f0 68 65 20 61 70 6e 64 76 66 73 20 56 46 53 22 2c  he apndvfs VFS",
1a300 0a 20 20 22 20 20 20 20 20 2d 43 20 44 49 52 2c  .  "     -C DIR,
1a310 20 2d 2d 64 69 72 65 63 74 6f 72 79 20 44 49 52   --directory DIR
1a320 20 20 20 20 43 68 61 6e 67 65 20 74 6f 20 64 69      Change to di
1a330 72 65 63 74 6f 72 79 20 44 49 52 20 74 6f 20 72  rectory DIR to r
1a340 65 61 64 2f 65 78 74 72 61 63 74 20 66 69 6c 65  ead/extract file
1a350 73 22 2c 0a 20 20 22 20 20 20 20 20 2d 6e 2c 20  s",.  "     -n, 
1a360 2d 2d 64 72 79 72 75 6e 20 20 20 20 20 20 20 20  --dryrun        
1a370 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20         Show the 
1a380 53 51 4c 20 74 68 61 74 20 77 6f 75 6c 64 20 68  SQL that would h
1a390 61 76 65 20 6f 63 63 75 72 72 65 64 22 2c 0a 20  ave occurred",. 
1a3a0 20 22 20 20 20 45 78 61 6d 70 6c 65 73 3a 22 2c   "   Examples:",
1a3b0 0a 20 20 22 20 20 20 20 20 2e 61 72 20 2d 63 66  .  "     .ar -cf
1a3c0 20 61 72 63 68 69 76 65 2e 73 61 72 20 66 6f 6f   archive.sar foo
1a3d0 20 62 61 72 20 20 23 20 43 72 65 61 74 65 20 61   bar  # Create a
1a3e0 72 63 68 69 76 65 2e 73 61 72 20 66 72 6f 6d 20  rchive.sar from 
1a3f0 66 69 6c 65 73 20 66 6f 6f 20 61 6e 64 20 62 61  files foo and ba
1a400 72 22 2c 0a 20 20 22 20 20 20 20 20 2e 61 72 20  r",.  "     .ar 
1a410 2d 74 66 20 61 72 63 68 69 76 65 2e 73 61 72 20  -tf archive.sar 
1a420 20 20 20 20 20 20 20 20 20 23 20 4c 69 73 74 20           # List 
1a430 6d 65 6d 62 65 72 73 20 6f 66 20 61 72 63 68 69  members of archi
1a440 76 65 2e 73 61 72 22 2c 0a 20 20 22 20 20 20 20  ve.sar",.  "    
1a450 20 2e 61 72 20 2d 78 76 66 20 61 72 63 68 69 76   .ar -xvf archiv
1a460 65 2e 73 61 72 20 20 20 20 20 20 20 20 20 23 20  e.sar         # 
1a470 56 65 72 62 6f 73 65 6c 79 20 65 78 74 72 61 63  Verbosely extrac
1a480 74 20 66 69 6c 65 73 20 66 72 6f 6d 20 61 72 63  t files from arc
1a490 68 69 76 65 2e 73 61 72 22 2c 0a 20 20 22 20 20  hive.sar",.  "  
1a4a0 20 53 65 65 20 61 6c 73 6f 3a 22 2c 0a 20 20 22   See also:",.  "
1a4b0 20 20 20 20 20 20 68 74 74 70 3a 2f 2f 73 71 6c        http://sql
1a4c0 69 74 65 2e 6f 72 67 2f 63 6c 69 2e 68 74 6d 6c  ite.org/cli.html
1a4d0 23 73 71 6c 61 72 5f 61 72 63 68 69 76 65 5f 73  #sqlar_archive_s
1a4e0 75 70 70 6f 72 74 22 2c 0a 23 65 6e 64 69 66 0a  upport",.#endif.
1a4f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a500 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
1a510 4e 0a 20 20 22 2e 61 75 74 68 20 4f 4e 7c 4f 46  N.  ".auth ON|OF
1a520 46 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68  F             Sh
1a530 6f 77 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61  ow authorizer ca
1a540 6c 6c 62 61 63 6b 73 22 2c 0a 23 65 6e 64 69 66  llbacks",.#endif
1a550 0a 20 20 22 2e 62 61 63 6b 75 70 20 3f 44 42 3f  .  ".backup ?DB?
1a560 20 46 49 4c 45 20 20 20 20 20 20 20 20 42 61 63   FILE        Bac
1a570 6b 75 70 20 44 42 20 28 64 65 66 61 75 6c 74 20  kup DB (default 
1a580 5c 22 6d 61 69 6e 5c 22 29 20 74 6f 20 46 49 4c  \"main\") to FIL
1a590 45 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 2d  E",.  "       --
1a5a0 61 70 70 65 6e 64 20 20 20 20 20 20 20 20 20 20  append          
1a5b0 20 20 55 73 65 20 74 68 65 20 61 70 70 65 6e 64    Use the append
1a5c0 76 66 73 22 2c 0a 20 20 22 20 20 20 20 20 20 20  vfs",.  "       
1a5d0 2d 2d 61 73 79 6e 63 20 20 20 20 20 20 20 20 20  --async         
1a5e0 20 20 20 20 57 72 69 74 65 20 74 6f 20 46 49 4c      Write to FIL
1a5f0 45 20 77 69 74 68 6f 75 74 20 61 20 6a 6f 75 72  E without a jour
1a600 6e 61 6c 20 61 6e 64 20 77 69 74 68 6f 75 74 20  nal and without 
1a610 66 73 79 6e 63 28 29 22 2c 0a 20 20 22 2e 62 61  fsync()",.  ".ba
1a620 69 6c 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  il on|off       
1a630 20 20 20 20 20 20 53 74 6f 70 20 61 66 74 65 72        Stop after
1a640 20 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f   hitting an erro
1a650 72 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 22  r.  Default OFF"
1a660 2c 0a 20 20 22 2e 62 69 6e 61 72 79 20 6f 6e 7c  ,.  ".binary on|
1a670 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 54 75  off           Tu
1a680 72 6e 20 62 69 6e 61 72 79 20 6f 75 74 70 75 74  rn binary output
1a690 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 44 65 66   on or off.  Def
1a6a0 61 75 6c 74 20 4f 46 46 22 2c 0a 20 20 22 2e 63  ault OFF",.  ".c
1a6b0 64 20 44 49 52 45 43 54 4f 52 59 20 20 20 20 20  d DIRECTORY     
1a6c0 20 20 20 20 20 20 20 43 68 61 6e 67 65 20 74 68         Change th
1a6d0 65 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  e working direct
1a6e0 6f 72 79 20 74 6f 20 44 49 52 45 43 54 4f 52 59  ory to DIRECTORY
1a6f0 22 2c 0a 20 20 22 2e 63 68 61 6e 67 65 73 20 6f  ",.  ".changes o
1a700 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 53  n|off          S
1a710 68 6f 77 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  how number of ro
1a720 77 73 20 63 68 61 6e 67 65 64 20 62 79 20 53 51  ws changed by SQ
1a730 4c 22 2c 0a 20 20 22 2e 63 68 65 63 6b 20 47 4c  L",.  ".check GL
1a740 4f 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OB              
1a750 46 61 69 6c 20 69 66 20 6f 75 74 70 75 74 20 73  Fail if output s
1a760 69 6e 63 65 20 2e 74 65 73 74 63 61 73 65 20 64  ince .testcase d
1a770 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 22 2c 0a  oes not match",.
1a780 20 20 22 2e 63 6c 6f 6e 65 20 4e 45 57 44 42 20    ".clone NEWDB 
1a790 20 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f 6e              Clon
1a7a0 65 20 64 61 74 61 20 69 6e 74 6f 20 4e 45 57 44  e data into NEWD
1a7b0 42 20 66 72 6f 6d 20 74 68 65 20 65 78 69 73 74  B from the exist
1a7c0 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c 0a 20  ing database",. 
1a7d0 20 22 2e 64 61 74 61 62 61 73 65 73 20 20 20 20   ".databases    
1a7e0 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20             List 
1a7f0 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c 65 73 20  names and files 
1a800 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61  of attached data
1a810 62 61 73 65 73 22 2c 0a 20 20 22 2e 64 62 63 6f  bases",.  ".dbco
1a820 6e 66 69 67 20 3f 6f 70 3f 20 3f 76 61 6c 3f 20  nfig ?op? ?val? 
1a830 20 20 20 20 4c 69 73 74 20 6f 72 20 63 68 61 6e      List or chan
1a840 67 65 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f  ge sqlite3_db_co
1a850 6e 66 69 67 28 29 20 6f 70 74 69 6f 6e 73 22 2c  nfig() options",
1a860 0a 20 20 22 2e 64 62 69 6e 66 6f 20 3f 44 42 3f  .  ".dbinfo ?DB?
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f               Sho
1a880 77 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d 61  w status informa
1a890 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 64  tion about the d
1a8a0 61 74 61 62 61 73 65 22 2c 0a 20 20 22 2e 64 75  atabase",.  ".du
1a8b0 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20 20  mp ?TABLE? ...  
1a8c0 20 20 20 20 20 20 52 65 6e 64 65 72 20 61 6c 6c        Render all
1a8d0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e   database conten
1a8e0 74 20 61 73 20 53 51 4c 22 2c 0a 20 20 22 20 20  t as SQL",.  "  
1a8f0 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20   Options:",.  " 
1a900 20 20 20 20 2d 2d 70 72 65 73 65 72 76 65 2d 72      --preserve-r
1a910 6f 77 69 64 73 20 20 20 20 20 20 49 6e 63 6c 75  owids      Inclu
1a920 64 65 20 52 4f 57 49 44 20 76 61 6c 75 65 73 20  de ROWID values 
1a930 69 6e 20 74 68 65 20 6f 75 74 70 75 74 22 2c 0a  in the output",.
1a940 20 20 22 20 20 20 20 20 2d 2d 6e 65 77 6c 69 6e    "     --newlin
1a950 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 41  es             A
1a960 6c 6c 6f 77 20 75 6e 65 73 63 61 70 65 64 20 6e  llow unescaped n
1a970 65 77 6c 69 6e 65 20 63 68 61 72 61 63 74 65 72  ewline character
1a980 73 20 69 6e 20 6f 75 74 70 75 74 22 2c 0a 20 20  s in output",.  
1a990 22 20 20 20 54 41 42 4c 45 20 69 73 20 61 20 4c  "   TABLE is a L
1a9a0 49 4b 45 20 70 61 74 74 65 72 6e 20 66 6f 72 20  IKE pattern for 
1a9b0 74 68 65 20 74 61 62 6c 65 73 20 74 6f 20 64 75  the tables to du
1a9c0 6d 70 22 2c 0a 20 20 22 2e 65 63 68 6f 20 6f 6e  mp",.  ".echo on
1a9d0 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 20  |off            
1a9e0 20 54 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 65 63   Turn command ec
1a9f0 68 6f 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 20  ho on or off",. 
1aa00 20 22 2e 65 71 70 20 6f 6e 7c 6f 66 66 7c 66 75   ".eqp on|off|fu
1aa10 6c 6c 7c 2e 2e 2e 20 20 20 20 20 45 6e 61 62 6c  ll|...     Enabl
1aa20 65 20 6f 72 20 64 69 73 61 62 6c 65 20 61 75 74  e or disable aut
1aa30 6f 6d 61 74 69 63 20 45 58 50 4c 41 49 4e 20 51  omatic EXPLAIN Q
1aa40 55 45 52 59 20 50 4c 41 4e 22 2c 0a 20 20 22 20  UERY PLAN",.  " 
1aa50 20 20 4f 74 68 65 72 20 4d 6f 64 65 73 3a 22 2c    Other Modes:",
1aa60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1aa70 45 42 55 47 0a 20 20 22 20 20 20 20 20 20 74 65  EBUG.  "      te
1aa80 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
1aa90 20 20 20 20 53 68 6f 77 20 72 61 77 20 45 58 50      Show raw EXP
1aaa0 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
1aab0 6f 75 74 70 75 74 22 2c 0a 20 20 22 20 20 20 20  output",.  "    
1aac0 20 20 74 72 61 63 65 20 20 20 20 20 20 20 20 20    trace         
1aad0 20 20 20 20 20 20 20 20 4c 69 6b 65 20 5c 22 66          Like \"f
1aae0 75 6c 6c 5c 22 20 62 75 74 20 61 6c 73 6f 20 65  ull\" but also e
1aaf0 6e 61 62 6c 65 20 5c 22 50 52 41 47 4d 41 20 76  nable \"PRAGMA v
1ab00 64 62 65 5f 74 72 61 63 65 5c 22 22 2c 0a 23 65  dbe_trace\"",.#e
1ab10 6e 64 69 66 0a 20 20 22 20 20 20 20 20 20 74 72  ndif.  "      tr
1ab20 69 67 67 65 72 20 20 20 20 20 20 20 20 20 20 20  igger           
1ab30 20 20 20 20 4c 69 6b 65 20 5c 22 66 75 6c 6c 5c      Like \"full\
1ab40 22 20 62 75 74 20 61 6c 73 6f 20 73 68 6f 77 20  " but also show 
1ab50 74 72 69 67 67 65 72 20 62 79 74 65 63 6f 64 65  trigger bytecode
1ab60 22 2c 0a 20 20 22 2e 65 78 63 65 6c 20 20 20 20  ",.  ".excel    
1ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44                 D
1ab80 69 73 70 6c 61 79 20 74 68 65 20 6f 75 74 70 75  isplay the outpu
1ab90 74 20 6f 66 20 6e 65 78 74 20 63 6f 6d 6d 61 6e  t of next comman
1aba0 64 20 69 6e 20 61 20 73 70 72 65 61 64 73 68 65  d in a spreadshe
1abb0 65 74 22 2c 0a 20 20 22 2e 65 78 69 74 20 3f 43  et",.  ".exit ?C
1abc0 4f 44 45 3f 20 20 20 20 20 20 20 20 20 20 20 20  ODE?            
1abd0 20 45 78 69 74 20 74 68 69 73 20 70 72 6f 67 72   Exit this progr
1abe0 61 6d 20 77 69 74 68 20 72 65 74 75 72 6e 2d 63  am with return-c
1abf0 6f 64 65 20 43 4f 44 45 22 2c 0a 20 20 22 2e 65  ode CODE",.  ".e
1ac00 78 70 65 72 74 20 20 20 20 20 20 20 20 20 20 20  xpert           
1ac10 20 20 20 20 20 20 20 45 58 50 45 52 49 4d 45 4e         EXPERIMEN
1ac20 54 41 4c 2e 20 53 75 67 67 65 73 74 20 69 6e 64  TAL. Suggest ind
1ac30 65 78 65 73 20 66 6f 72 20 73 70 65 63 69 66 69  exes for specifi
1ac40 65 64 20 71 75 65 72 69 65 73 22 2c 0a 2f 2a 20  ed queries",./* 
1ac50 42 65 63 61 75 73 65 20 65 78 70 6c 61 69 6e 20  Because explain 
1ac60 6d 6f 64 65 20 63 6f 6d 65 73 20 6f 6e 20 61 75  mode comes on au
1ac70 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6e 6f 77 2c  tomatically now,
1ac80 20 74 68 65 20 22 2e 65 78 70 6c 61 69 6e 22 20   the ".explain" 
1ac90 6d 6f 64 65 0a 2a 2a 20 69 73 20 72 65 6d 6f 76  mode.** is remov
1aca0 65 64 20 66 72 6f 6d 20 74 68 65 20 68 65 6c 70  ed from the help
1acb0 20 73 63 72 65 65 6e 2e 20 20 49 74 20 69 73 20   screen.  It is 
1acc0 73 74 69 6c 6c 20 73 75 70 70 6f 72 74 65 64 20  still supported 
1acd0 66 6f 72 20 6c 65 67 61 63 79 2c 20 68 6f 77 65  for legacy, howe
1ace0 76 65 72 20 2a 2f 0a 2f 2a 22 2e 65 78 70 6c 61  ver */./*".expla
1acf0 69 6e 20 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f 3f  in ?on|off|auto?
1ad00 20 20 20 54 75 72 6e 20 45 58 50 4c 41 49 4e 20     Turn EXPLAIN 
1ad10 6f 75 74 70 75 74 20 6d 6f 64 65 20 6f 6e 20 6f  output mode on o
1ad20 72 20 6f 66 66 20 6f 72 20 74 6f 20 61 75 74 6f  r off or to auto
1ad30 6d 61 74 69 63 22 2c 2a 2f 0a 20 20 22 2e 66 75  matic",*/.  ".fu
1ad40 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65  llschema ?--inde
1ad50 6e 74 3f 20 20 20 53 68 6f 77 20 73 63 68 65 6d  nt?   Show schem
1ad60 61 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  a and the conten
1ad70 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  t of sqlite_stat
1ad80 20 74 61 62 6c 65 73 22 2c 0a 20 20 22 2e 68 65   tables",.  ".he
1ad90 61 64 65 72 73 20 6f 6e 7c 6f 66 66 20 20 20 20  aders on|off    
1ada0 20 20 20 20 20 20 54 75 72 6e 20 64 69 73 70 6c        Turn displ
1adb0 61 79 20 6f 66 20 68 65 61 64 65 72 73 20 6f 6e  ay of headers on
1adc0 20 6f 72 20 6f 66 66 22 2c 0a 20 20 22 2e 68 65   or off",.  ".he
1add0 6c 70 20 3f 2d 61 6c 6c 3f 20 3f 50 41 54 54 45  lp ?-all? ?PATTE
1ade0 52 4e 3f 20 20 20 53 68 6f 77 20 68 65 6c 70 20  RN?   Show help 
1adf0 74 65 78 74 20 66 6f 72 20 50 41 54 54 45 52 4e  text for PATTERN
1ae00 22 2c 0a 20 20 22 2e 69 6d 70 6f 72 74 20 46 49  ",.  ".import FI
1ae10 4c 45 20 54 41 42 4c 45 20 20 20 20 20 20 20 49  LE TABLE       I
1ae20 6d 70 6f 72 74 20 64 61 74 61 20 66 72 6f 6d 20  mport data from 
1ae30 46 49 4c 45 20 69 6e 74 6f 20 54 41 42 4c 45 22  FILE into TABLE"
1ae40 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
1ae50 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52  _OMIT_TEST_CONTR
1ae60 4f 4c 0a 20 20 22 2e 69 6d 70 6f 73 74 65 72 20  OL.  ".imposter 
1ae70 49 4e 44 45 58 20 54 41 42 4c 45 20 20 20 20 43  INDEX TABLE    C
1ae80 72 65 61 74 65 20 69 6d 70 6f 73 74 65 72 20 74  reate imposter t
1ae90 61 62 6c 65 20 54 41 42 4c 45 20 6f 6e 20 69 6e  able TABLE on in
1aea0 64 65 78 20 49 4e 44 45 58 22 2c 0a 23 65 6e 64  dex INDEX",.#end
1aeb0 69 66 0a 20 20 22 2e 69 6e 64 65 78 65 73 20 3f  if.  ".indexes ?
1aec0 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20 20 53  TABLE?         S
1aed0 68 6f 77 20 6e 61 6d 65 73 20 6f 66 20 69 6e 64  how names of ind
1aee0 65 78 65 73 22 2c 0a 20 20 22 20 20 20 20 20 20  exes",.  "      
1aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af00 20 20 20 20 20 49 66 20 54 41 42 4c 45 20 69 73       If TABLE is
1af10 20 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79   specified, only
1af20 20 73 68 6f 77 20 69 6e 64 65 78 65 73 20 66 6f   show indexes fo
1af30 72 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20  r",.  "         
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af50 20 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e    tables matchin
1af60 67 20 54 41 42 4c 45 20 75 73 69 6e 67 20 74 68  g TABLE using th
1af70 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 2e  e LIKE operator.
1af80 22 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ",.#ifdef SQLITE
1af90 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a  _ENABLE_IOTRACE.
1afa0 20 20 22 2e 69 6f 74 72 61 63 65 20 46 49 4c 45    ".iotrace FILE
1afb0 20 20 20 20 20 20 20 20 20 20 20 20 45 6e 61 62              Enab
1afc0 6c 65 20 49 2f 4f 20 64 69 61 67 6e 6f 73 74 69  le I/O diagnosti
1afd0 63 20 6c 6f 67 67 69 6e 67 20 74 6f 20 46 49 4c  c logging to FIL
1afe0 45 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c  E",.#endif.  ".l
1aff0 69 6d 69 74 20 3f 4c 49 4d 49 54 3f 20 3f 56 41  imit ?LIMIT? ?VA
1b000 4c 3f 20 20 20 20 20 44 69 73 70 6c 61 79 20 6f  L?     Display o
1b010 72 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  r change the val
1b020 75 65 20 6f 66 20 61 6e 20 53 51 4c 49 54 45 5f  ue of an SQLITE_
1b030 4c 49 4d 49 54 22 2c 0a 20 20 22 2e 6c 69 6e 74  LIMIT",.  ".lint
1b040 20 4f 50 54 49 4f 4e 53 20 20 20 20 20 20 20 20   OPTIONS        
1b050 20 20 20 20 52 65 70 6f 72 74 20 70 6f 74 65 6e      Report poten
1b060 74 69 61 6c 20 73 63 68 65 6d 61 20 69 73 73 75  tial schema issu
1b070 65 73 2e 22 2c 0a 20 20 22 20 20 20 20 20 4f 70  es.",.  "     Op
1b080 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20  tions:",.  "    
1b090 20 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73      fkey-indexes
1b0a0 20 20 20 20 20 46 69 6e 64 20 6d 69 73 73 69 6e       Find missin
1b0b0 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e  g foreign key in
1b0c0 64 65 78 65 73 22 2c 0a 23 69 66 6e 64 65 66 20  dexes",.#ifndef 
1b0d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
1b0e0 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e 6c  _EXTENSION.  ".l
1b0f0 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54 52 59 3f  oad FILE ?ENTRY?
1b100 20 20 20 20 20 20 20 4c 6f 61 64 20 61 6e 20 65         Load an e
1b110 78 74 65 6e 73 69 6f 6e 20 6c 69 62 72 61 72 79  xtension library
1b120 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 6f  ",.#endif.  ".lo
1b130 67 20 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20  g FILE|off      
1b140 20 20 20 20 20 20 54 75 72 6e 20 6c 6f 67 67 69        Turn loggi
1b150 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 46  ng on or off.  F
1b160 49 4c 45 20 63 61 6e 20 62 65 20 73 74 64 65 72  ILE can be stder
1b170 72 2f 73 74 64 6f 75 74 22 2c 0a 20 20 22 2e 6d  r/stdout",.  ".m
1b180 6f 64 65 20 4d 4f 44 45 20 3f 54 41 42 4c 45 3f  ode MODE ?TABLE?
1b190 20 20 20 20 20 20 20 53 65 74 20 6f 75 74 70 75         Set outpu
1b1a0 74 20 6d 6f 64 65 22 2c 0a 20 20 22 20 20 20 4d  t mode",.  "   M
1b1b0 4f 44 45 20 69 73 20 6f 6e 65 20 6f 66 3a 22 2c  ODE is one of:",
1b1c0 0a 20 20 22 20 20 20 20 20 61 73 63 69 69 20 20  .  "     ascii  
1b1d0 20 20 43 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20 64    Columns/rows d
1b1e0 65 6c 69 6d 69 74 65 64 20 62 79 20 30 78 31 46  elimited by 0x1F
1b1f0 20 61 6e 64 20 30 78 31 45 22 2c 0a 20 20 22 20   and 0x1E",.  " 
1b200 20 20 20 20 63 73 76 20 20 20 20 20 20 43 6f 6d      csv      Com
1b210 6d 61 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c  ma-separated val
1b220 75 65 73 22 2c 0a 20 20 22 20 20 20 20 20 63 6f  ues",.  "     co
1b230 6c 75 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69 67  lumn   Left-alig
1b240 6e 65 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28 53  ned columns.  (S
1b250 65 65 20 2e 77 69 64 74 68 29 22 2c 0a 20 20 22  ee .width)",.  "
1b260 20 20 20 20 20 68 74 6d 6c 20 20 20 20 20 48 54       html     HT
1b270 4d 4c 20 3c 74 61 62 6c 65 3e 20 63 6f 64 65 22  ML <table> code"
1b280 2c 0a 20 20 22 20 20 20 20 20 69 6e 73 65 72 74  ,.  "     insert
1b290 20 20 20 53 51 4c 20 69 6e 73 65 72 74 20 73 74     SQL insert st
1b2a0 61 74 65 6d 65 6e 74 73 20 66 6f 72 20 54 41 42  atements for TAB
1b2b0 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 6c 69 6e  LE",.  "     lin
1b2c0 65 20 20 20 20 20 4f 6e 65 20 76 61 6c 75 65 20  e     One value 
1b2d0 70 65 72 20 6c 69 6e 65 22 2c 0a 20 20 22 20 20  per line",.  "  
1b2e0 20 20 20 6c 69 73 74 20 20 20 20 20 56 61 6c 75     list     Valu
1b2f0 65 73 20 64 65 6c 69 6d 69 74 65 64 20 62 79 20  es delimited by 
1b300 5c 22 7c 5c 22 22 2c 0a 20 20 22 20 20 20 20 20  \"|\"",.  "     
1b310 71 75 6f 74 65 20 20 20 20 45 73 63 61 70 65 20  quote    Escape 
1b320 61 6e 73 77 65 72 73 20 61 73 20 66 6f 72 20 53  answers as for S
1b330 51 4c 22 2c 0a 20 20 22 20 20 20 20 20 74 61 62  QL",.  "     tab
1b340 73 20 20 20 20 20 54 61 62 2d 73 65 70 61 72 61  s     Tab-separa
1b350 74 65 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 22  ted values",.  "
1b360 20 20 20 20 20 74 63 6c 20 20 20 20 20 20 54 43       tcl      TC
1b370 4c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 22  L list elements"
1b380 2c 0a 20 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20  ,.  ".nullvalue 
1b390 53 54 52 49 4e 47 20 20 20 20 20 20 20 20 55 73  STRING        Us
1b3a0 65 20 53 54 52 49 4e 47 20 69 6e 20 70 6c 61 63  e STRING in plac
1b3b0 65 20 6f 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73  e of NULL values
1b3c0 22 2c 0a 20 20 22 2e 6f 6e 63 65 20 28 2d 65 7c  ",.  ".once (-e|
1b3d0 2d 78 7c 46 49 4c 45 29 20 20 20 20 20 20 20 4f  -x|FILE)       O
1b3e0 75 74 70 75 74 20 66 6f 72 20 74 68 65 20 6e 65  utput for the ne
1b3f0 78 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 6f  xt SQL command o
1b400 6e 6c 79 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20  nly to FILE",.  
1b410 22 20 20 20 20 20 49 66 20 46 49 4c 45 20 62 65  "     If FILE be
1b420 67 69 6e 73 20 77 69 74 68 20 27 7c 27 20 74 68  gins with '|' th
1b430 65 6e 20 6f 70 65 6e 20 61 73 20 61 20 70 69 70  en open as a pip
1b440 65 22 2c 0a 20 20 22 20 20 20 20 20 4f 74 68 65  e",.  "     Othe
1b450 72 20 6f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22  r options:",.  "
1b460 20 20 20 20 20 20 20 2d 65 20 20 20 20 49 6e 76         -e    Inv
1b470 6f 6b 65 20 73 79 73 74 65 6d 20 74 65 78 74 20  oke system text 
1b480 65 64 69 74 6f 72 22 2c 0a 20 20 22 20 20 20 20  editor",.  "    
1b490 20 20 20 2d 78 20 20 20 20 4f 70 65 6e 20 69 6e     -x    Open in
1b4a0 20 61 20 73 70 72 65 61 64 73 68 65 65 74 22 2c   a spreadsheet",
1b4b0 0a 20 20 22 2e 6f 70 65 6e 20 3f 4f 50 54 49 4f  .  ".open ?OPTIO
1b4c0 4e 53 3f 20 3f 46 49 4c 45 3f 20 20 20 43 6c 6f  NS? ?FILE?   Clo
1b4d0 73 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  se existing data
1b4e0 62 61 73 65 20 61 6e 64 20 72 65 6f 70 65 6e 20  base and reopen 
1b4f0 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 4f  FILE",.  "     O
1b500 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20  ptions:",.  "   
1b510 20 20 20 20 20 2d 2d 61 70 70 65 6e 64 20 20 20       --append   
1b520 20 20 20 20 20 55 73 65 20 61 70 70 65 6e 64 76       Use appendv
1b530 66 73 20 74 6f 20 61 70 70 65 6e 64 20 64 61 74  fs to append dat
1b540 61 62 61 73 65 20 74 6f 20 74 68 65 20 65 6e 64  abase to the end
1b550 20 6f 66 20 46 49 4c 45 22 2c 0a 23 69 66 64 65   of FILE",.#ifde
1b560 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1b570 44 45 53 45 52 49 41 4c 49 5a 45 0a 20 20 22 20  DESERIALIZE.  " 
1b580 20 20 20 20 20 20 20 2d 2d 64 65 73 65 72 69 61         --deseria
1b590 6c 69 7a 65 20 20 20 4c 6f 61 64 20 69 6e 74 6f  lize   Load into
1b5a0 20 6d 65 6d 6f 72 79 20 75 73 65 69 6e 67 20 73   memory useing s
1b5b0 71 6c 69 74 65 33 5f 64 65 73 65 72 69 61 6c 69  qlite3_deseriali
1b5c0 7a 65 28 29 22 2c 0a 20 20 22 20 20 20 20 20 20  ze()",.  "      
1b5d0 20 20 2d 2d 68 65 78 64 62 20 20 20 20 20 20 20    --hexdb       
1b5e0 20 20 4c 6f 61 64 20 74 68 65 20 6f 75 74 70 75    Load the outpu
1b5f0 74 20 6f 66 20 5c 22 64 62 74 6f 74 78 74 5c 22  t of \"dbtotxt\"
1b600 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
1b610 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 22 20   database",.  " 
1b620 20 20 20 20 20 20 20 2d 2d 6d 61 78 73 69 7a 65         --maxsize
1b630 20 4e 20 20 20 20 20 4d 61 78 69 6d 75 6d 20 73   N     Maximum s
1b640 69 7a 65 20 66 6f 72 20 2d 2d 68 65 78 64 62 20  ize for --hexdb 
1b650 6f 72 20 2d 2d 64 65 73 65 72 69 61 6c 69 7a 65  or --deserialize
1b660 64 20 64 61 74 61 62 61 73 65 22 2c 0a 23 65 6e  d database",.#en
1b670 64 69 66 0a 20 20 22 20 20 20 20 20 20 20 20 2d  dif.  "        -
1b680 2d 6e 65 77 20 20 20 20 20 20 20 20 20 20 20 49  -new           I
1b690 6e 69 74 69 61 6c 69 7a 65 20 46 49 4c 45 20 74  nitialize FILE t
1b6a0 6f 20 61 6e 20 65 6d 70 74 79 20 64 61 74 61 62  o an empty datab
1b6b0 61 73 65 22 2c 0a 20 20 22 20 20 20 20 20 20 20  ase",.  "       
1b6c0 20 2d 2d 72 65 61 64 6f 6e 6c 79 20 20 20 20 20   --readonly     
1b6d0 20 4f 70 65 6e 20 46 49 4c 45 20 72 65 61 64 6f   Open FILE reado
1b6e0 6e 6c 79 22 2c 0a 20 20 22 20 20 20 20 20 20 20  nly",.  "       
1b6f0 20 2d 2d 7a 69 70 20 20 20 20 20 20 20 20 20 20   --zip          
1b700 20 46 49 4c 45 20 69 73 20 61 20 5a 49 50 20 61   FILE is a ZIP a
1b710 72 63 68 69 76 65 22 2c 0a 20 20 22 2e 6f 75 74  rchive",.  ".out
1b720 70 75 74 20 3f 46 49 4c 45 3f 20 20 20 20 20 20  put ?FILE?      
1b730 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74       Send output
1b740 20 74 6f 20 46 49 4c 45 20 6f 72 20 73 74 64 6f   to FILE or stdo
1b750 75 74 20 69 66 20 46 49 4c 45 20 69 73 20 6f 6d  ut if FILE is om
1b760 69 74 74 65 64 22 2c 0a 20 20 22 20 20 20 20 20  itted",.  "     
1b770 49 66 20 46 49 4c 45 20 62 65 67 69 6e 73 20 77  If FILE begins w
1b780 69 74 68 20 27 7c 27 20 74 68 65 6e 20 6f 70 65  ith '|' then ope
1b790 6e 20 69 74 20 61 73 20 61 20 70 69 70 65 2e 22  n it as a pipe."
1b7a0 2c 0a 20 20 22 2e 70 61 72 61 6d 65 74 65 72 20  ,.  ".parameter 
1b7b0 43 4d 44 20 2e 2e 2e 20 20 20 20 20 20 20 4d 61  CMD ...       Ma
1b7c0 6e 61 67 65 20 53 51 4c 20 70 61 72 61 6d 65 74  nage SQL paramet
1b7d0 65 72 20 62 69 6e 64 69 6e 67 73 22 2c 0a 20 20  er bindings",.  
1b7e0 22 20 20 20 63 6c 65 61 72 20 20 20 20 20 20 20  "   clear       
1b7f0 20 20 20 20 20 20 20 20 20 20 20 20 45 72 61 73              Eras
1b800 65 20 61 6c 6c 20 62 69 6e 64 69 6e 67 73 22 2c  e all bindings",
1b810 0a 20 20 22 20 20 20 69 6e 69 74 20 20 20 20 20  .  "   init     
1b820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
1b830 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 54 45  nitialize the TE
1b840 4d 50 20 74 61 62 6c 65 20 74 68 61 74 20 68 6f  MP table that ho
1b850 6c 64 73 20 62 69 6e 64 69 6e 67 73 22 2c 0a 20  lds bindings",. 
1b860 20 22 20 20 20 6c 69 73 74 20 20 20 20 20 20 20   "   list       
1b870 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73               Lis
1b880 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
1b890 72 61 6d 65 74 65 72 20 62 69 6e 64 69 6e 67 73  rameter bindings
1b8a0 22 2c 0a 20 20 22 20 20 20 73 65 74 20 50 41 52  ",.  "   set PAR
1b8b0 41 4d 45 54 45 52 20 56 41 4c 55 45 20 20 20 20  AMETER VALUE    
1b8c0 20 47 69 76 65 6e 20 53 51 4c 20 70 61 72 61 6d   Given SQL param
1b8d0 65 74 65 72 20 50 41 52 41 4d 45 54 45 52 20 61  eter PARAMETER a
1b8e0 20 76 61 6c 75 65 20 6f 66 20 56 41 4c 55 45 22   value of VALUE"
1b8f0 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ,.  "           
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b910 50 41 52 41 4d 45 54 45 52 20 73 68 6f 75 6c 64  PARAMETER should
1b920 20 73 74 61 72 74 20 77 69 74 68 20 27 24 27 2c   start with '$',
1b930 20 27 3a 27 2c 20 27 40 27 2c 20 6f 72 20 27 3f   ':', '@', or '?
1b940 27 22 2c 0a 20 20 22 20 20 20 75 6e 73 65 74 20  '",.  "   unset 
1b950 50 41 52 41 4d 45 54 45 52 20 20 20 20 20 20 20  PARAMETER       
1b960 20 20 52 65 6d 6f 76 65 20 50 41 52 41 4d 45 54    Remove PARAMET
1b970 45 52 20 66 72 6f 6d 20 74 68 65 20 62 69 6e 64  ER from the bind
1b980 69 6e 67 20 74 61 62 6c 65 22 2c 0a 20 20 22 2e  ing table",.  ".
1b990 70 72 69 6e 74 20 53 54 52 49 4e 47 2e 2e 2e 20  print STRING... 
1b9a0 20 20 20 20 20 20 20 20 50 72 69 6e 74 20 6c 69          Print li
1b9b0 74 65 72 61 6c 20 53 54 52 49 4e 47 22 2c 0a 23  teral STRING",.#
1b9c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b9d0 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
1b9e0 42 41 43 4b 0a 20 20 22 2e 70 72 6f 67 72 65 73  BACK.  ".progres
1b9f0 73 20 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  s N             
1ba00 20 49 6e 76 6f 6b 65 20 70 72 6f 67 72 65 73 73   Invoke progress
1ba10 20 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20 65   handler after e
1ba20 76 65 72 79 20 4e 20 6f 70 63 6f 64 65 73 22 2c  very N opcodes",
1ba30 0a 20 20 22 20 20 20 2d 2d 6c 69 6d 69 74 20 4e  .  "   --limit N
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba50 20 49 6e 74 65 72 72 75 70 74 20 61 66 74 65 72   Interrupt after
1ba60 20 4e 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c   N progress call
1ba70 62 61 63 6b 73 22 2c 0a 20 20 22 20 20 20 2d 2d  backs",.  "   --
1ba80 6f 6e 63 65 20 20 20 20 20 20 20 20 20 20 20 20  once            
1ba90 20 20 20 20 20 20 20 20 44 6f 20 6e 6f 20 6d 6f          Do no mo
1baa0 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 6f 67  re than one prog
1bab0 72 65 73 73 20 69 6e 74 65 72 72 75 70 74 22 2c  ress interrupt",
1bac0 0a 20 20 22 20 20 20 2d 2d 71 75 69 65 74 7c 2d  .  "   --quiet|-
1bad0 71 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q               
1bae0 20 4e 6f 20 6f 75 74 70 75 74 20 65 78 63 65 70   No output excep
1baf0 74 20 61 74 20 69 6e 74 65 72 72 75 70 74 73 22  t at interrupts"
1bb00 2c 0a 20 20 22 20 20 20 2d 2d 72 65 73 65 74 20  ,.  "   --reset 
1bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb20 20 20 52 65 73 65 74 20 74 68 65 20 63 6f 75 6e    Reset the coun
1bb30 74 20 66 6f 72 20 65 61 63 68 20 69 6e 70 75 74  t for each input
1bb40 20 61 6e 64 20 69 6e 74 65 72 72 75 70 74 22 2c   and interrupt",
1bb50 0a 23 65 6e 64 69 66 0a 20 20 22 2e 70 72 6f 6d  .#endif.  ".prom
1bb60 70 74 20 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45  pt MAIN CONTINUE
1bb70 20 20 20 20 52 65 70 6c 61 63 65 20 74 68 65 20      Replace the 
1bb80 73 74 61 6e 64 61 72 64 20 70 72 6f 6d 70 74 73  standard prompts
1bb90 22 2c 0a 20 20 22 2e 71 75 69 74 20 20 20 20 20  ",.  ".quit     
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
1bbb0 78 69 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d  xit this program
1bbc0 22 2c 0a 20 20 22 2e 72 65 61 64 20 46 49 4c 45  ",.  ".read FILE
1bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52                 R
1bbe0 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 46  ead input from F
1bbf0 49 4c 45 22 2c 0a 20 20 22 2e 72 65 73 74 6f 72  ILE",.  ".restor
1bc00 65 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20 20  e ?DB? FILE     
1bc10 20 20 52 65 73 74 6f 72 65 20 63 6f 6e 74 65 6e    Restore conten
1bc20 74 20 6f 66 20 44 42 20 28 64 65 66 61 75 6c 74  t of DB (default
1bc30 20 5c 22 6d 61 69 6e 5c 22 29 20 66 72 6f 6d 20   \"main\") from 
1bc40 46 49 4c 45 22 2c 0a 20 20 22 2e 73 61 76 65 20  FILE",.  ".save 
1bc50 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  FILE            
1bc60 20 20 20 57 72 69 74 65 20 69 6e 2d 6d 65 6d 6f     Write in-memo
1bc70 72 79 20 64 61 74 61 62 61 73 65 20 69 6e 74 6f  ry database into
1bc80 20 46 49 4c 45 22 2c 0a 20 20 22 2e 73 63 61 6e   FILE",.  ".scan
1bc90 73 74 61 74 73 20 6f 6e 7c 6f 66 66 20 20 20 20  stats on|off    
1bca0 20 20 20 20 54 75 72 6e 20 73 71 6c 69 74 65 33      Turn sqlite3
1bcb0 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
1bcc0 28 29 20 6d 65 74 72 69 63 73 20 6f 6e 20 6f 72  () metrics on or
1bcd0 20 6f 66 66 22 2c 0a 20 20 22 2e 73 63 68 65 6d   off",.  ".schem
1bce0 61 20 3f 50 41 54 54 45 52 4e 3f 20 20 20 20 20  a ?PATTERN?     
1bcf0 20 20 20 53 68 6f 77 20 74 68 65 20 43 52 45 41     Show the CREA
1bd00 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6d 61  TE statements ma
1bd10 74 63 68 69 6e 67 20 50 41 54 54 45 52 4e 22 2c  tching PATTERN",
1bd20 0a 20 20 22 20 20 20 20 20 4f 70 74 69 6f 6e 73  .  "     Options
1bd30 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20  :",.  "         
1bd40 2d 2d 69 6e 64 65 6e 74 20 20 20 20 20 20 20 20  --indent        
1bd50 20 20 20 20 54 72 79 20 74 6f 20 70 72 65 74 74      Try to prett
1bd60 79 2d 70 72 69 6e 74 20 74 68 65 20 73 63 68 65  y-print the sche
1bd70 6d 61 22 2c 0a 20 20 22 2e 73 65 6c 66 74 65 73  ma",.  ".selftes
1bd80 74 20 3f 4f 50 54 49 4f 4e 53 3f 20 20 20 20 20  t ?OPTIONS?     
1bd90 20 52 75 6e 20 74 65 73 74 73 20 64 65 66 69 6e   Run tests defin
1bda0 65 64 20 69 6e 20 74 68 65 20 53 45 4c 46 54 45  ed in the SELFTE
1bdb0 53 54 20 74 61 62 6c 65 22 2c 0a 20 20 22 20 20  ST table",.  "  
1bdc0 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22    Options:",.  "
1bdd0 20 20 20 20 20 20 20 2d 2d 69 6e 69 74 20 20 20         --init   
1bde0 20 20 20 20 20 20 20 20 20 20 20 20 43 72 65 61              Crea
1bdf0 74 65 20 61 20 6e 65 77 20 53 45 4c 46 54 45 53  te a new SELFTES
1be00 54 20 74 61 62 6c 65 22 2c 0a 20 20 22 20 20 20  T table",.  "   
1be10 20 20 20 20 2d 76 20 20 20 20 20 20 20 20 20 20      -v          
1be20 20 20 20 20 20 20 20 20 20 56 65 72 62 6f 73 65           Verbose
1be30 20 6f 75 74 70 75 74 22 2c 0a 20 20 22 2e 73 65   output",.  ".se
1be40 70 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57  parator COL ?ROW
1be50 3f 20 20 20 20 20 43 68 61 6e 67 65 20 74 68 65  ?     Change the
1be60 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 6f 77 20   column and row 
1be70 73 65 70 61 72 61 74 6f 72 73 22 2c 0a 23 69 66  separators",.#if
1be80 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1be90 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
1bea0 20 20 22 2e 73 65 73 73 69 6f 6e 20 3f 4e 41 4d    ".session ?NAM
1beb0 45 3f 20 43 4d 44 20 2e 2e 2e 20 20 43 72 65 61  E? CMD ...  Crea
1bec0 74 65 20 6f 72 20 63 6f 6e 74 72 6f 6c 20 73 65  te or control se
1bed0 73 73 69 6f 6e 73 22 2c 0a 20 20 22 20 20 20 53  ssions",.  "   S
1bee0 75 62 63 6f 6d 6d 61 6e 64 73 3a 22 2c 0a 20 20  ubcommands:",.  
1bef0 22 20 20 20 20 20 61 74 74 61 63 68 20 54 41 42  "     attach TAB
1bf00 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 41  LE             A
1bf10 74 74 61 63 68 20 54 41 42 4c 45 22 2c 0a 20 20  ttach TABLE",.  
1bf20 22 20 20 20 20 20 63 68 61 6e 67 65 73 65 74 20  "     changeset 
1bf30 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 57  FILE           W
1bf40 72 69 74 65 20 61 20 63 68 61 6e 67 65 73 65 74  rite a changeset
1bf50 20 69 6e 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22   into FILE",.  "
1bf60 20 20 20 20 20 63 6c 6f 73 65 20 20 20 20 20 20       close      
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6c                Cl
1bf80 6f 73 65 20 6f 6e 65 20 73 65 73 73 69 6f 6e 22  ose one session"
1bf90 2c 0a 20 20 22 20 20 20 20 20 65 6e 61 62 6c 65  ,.  "     enable
1bfa0 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20   ?BOOLEAN?      
1bfb0 20 20 20 53 65 74 20 6f 72 20 71 75 65 72 79 20     Set or query 
1bfc0 74 68 65 20 65 6e 61 62 6c 65 20 62 69 74 22 2c  the enable bit",
1bfd0 0a 20 20 22 20 20 20 20 20 66 69 6c 74 65 72 20  .  "     filter 
1bfe0 47 4c 4f 42 2e 2e 2e 20 20 20 20 20 20 20 20 20  GLOB...         
1bff0 20 20 52 65 6a 65 63 74 20 74 61 62 6c 65 73 20    Reject tables 
1c000 6d 61 74 63 68 69 6e 67 20 47 4c 4f 42 73 22 2c  matching GLOBs",
1c010 0a 20 20 22 20 20 20 20 20 69 6e 64 69 72 65 63  .  "     indirec
1c020 74 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20  t ?BOOLEAN?     
1c030 20 20 4d 61 72 6b 20 6f 72 20 71 75 65 72 79 20    Mark or query 
1c040 74 68 65 20 69 6e 64 69 72 65 63 74 20 73 74 61  the indirect sta
1c050 74 75 73 22 2c 0a 20 20 22 20 20 20 20 20 69 73  tus",.  "     is
1c060 65 6d 70 74 79 20 20 20 20 20 20 20 20 20 20 20  empty           
1c070 20 20 20 20 20 20 20 51 75 65 72 79 20 77 68 65         Query whe
1c080 74 68 65 72 20 74 68 65 20 73 65 73 73 69 6f 6e  ther the session
1c090 20 69 73 20 65 6d 70 74 79 22 2c 0a 20 20 22 20   is empty",.  " 
1c0a0 20 20 20 20 6c 69 73 74 20 20 20 20 20 20 20 20      list        
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73               Lis
1c0c0 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  t currently open
1c0d0 20 73 65 73 73 69 6f 6e 20 6e 61 6d 65 73 22 2c   session names",
1c0e0 0a 20 20 22 20 20 20 20 20 6f 70 65 6e 20 44 42  .  "     open DB
1c0f0 20 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 20   NAME           
1c100 20 20 4f 70 65 6e 20 61 20 6e 65 77 20 73 65 73    Open a new ses
1c110 73 69 6f 6e 20 6f 6e 20 44 42 22 2c 0a 20 20 22  sion on DB",.  "
1c120 20 20 20 20 20 70 61 74 63 68 73 65 74 20 46 49       patchset FI
1c130 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 57 72  LE            Wr
1c140 69 74 65 20 61 20 70 61 74 63 68 73 65 74 20 69  ite a patchset i
1c150 6e 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20  nto FILE",.  "  
1c160 20 49 66 20 3f 4e 41 4d 45 3f 20 69 73 20 6f 6d   If ?NAME? is om
1c170 69 74 74 65 64 2c 20 74 68 65 20 66 69 72 73 74  itted, the first
1c180 20 64 65 66 69 6e 65 64 20 73 65 73 73 69 6f 6e   defined session
1c190 20 69 73 20 75 73 65 64 2e 22 2c 0a 23 65 6e 64   is used.",.#end
1c1a0 69 66 0a 20 20 22 2e 73 68 61 33 73 75 6d 20 2e  if.  ".sha3sum .
1c1b0 2e 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 43  ..             C
1c1c0 6f 6d 70 75 74 65 20 61 20 53 48 41 33 20 68 61  ompute a SHA3 ha
1c1d0 73 68 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  sh of database c
1c1e0 6f 6e 74 65 6e 74 22 2c 0a 20 20 22 20 20 20 20  ontent",.  "    
1c1f0 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20  Options:",.  "  
1c200 20 20 20 20 2d 2d 73 63 68 65 6d 61 20 20 20 20      --schema    
1c210 20 20 20 20 20 20 20 20 20 20 41 6c 73 6f 20 68            Also h
1c220 61 73 68 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ash the sqlite_m
1c230 61 73 74 65 72 20 74 61 62 6c 65 22 2c 0a 20 20  aster table",.  
1c240 22 20 20 20 20 20 20 2d 2d 73 68 61 33 2d 32 32  "      --sha3-22
1c250 34 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65  4            Use
1c260 20 74 68 65 20 73 68 61 33 2d 32 32 34 20 61 6c   the sha3-224 al
1c270 67 6f 72 69 74 68 6d 22 2c 0a 20 20 22 20 20 20  gorithm",.  "   
1c280 20 20 20 2d 2d 73 68 61 33 2d 32 35 36 20 20 20     --sha3-256   
1c290 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68 65           Use the
1c2a0 20 73 68 61 33 2d 32 35 36 20 61 6c 67 6f 72 69   sha3-256 algori
1c2b0 74 68 6d 2e 20 20 54 68 69 73 20 69 73 20 74 68  thm.  This is th
1c2c0 65 20 64 65 66 61 75 6c 74 2e 22 2c 0a 20 20 22  e default.",.  "
1c2d0 20 20 20 20 20 20 2d 2d 73 68 61 33 2d 33 38 34        --sha3-384
1c2e0 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20              Use 
1c2f0 74 68 65 20 73 68 61 33 2d 33 38 34 20 61 6c 67  the sha3-384 alg
1c300 6f 72 69 74 68 6d 22 2c 0a 20 20 22 20 20 20 20  orithm",.  "    
1c310 20 20 2d 2d 73 68 61 33 2d 35 31 32 20 20 20 20    --sha3-512    
1c320 20 20 20 20 20 20 20 20 55 73 65 20 74 68 65 20          Use the 
1c330 73 68 61 33 2d 35 31 32 20 61 6c 67 6f 72 69 74  sha3-512 algorit
1c340 68 6d 22 2c 0a 20 20 22 20 20 20 20 41 6e 79 20  hm",.  "    Any 
1c350 6f 74 68 65 72 20 61 72 67 75 6d 65 6e 74 20 69  other argument i
1c360 73 20 61 20 4c 49 4b 45 20 70 61 74 74 65 72 6e  s a LIKE pattern
1c370 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 68   for tables to h
1c380 61 73 68 22 2c 0a 23 69 66 6e 64 65 66 20 53 51  ash",.#ifndef SQ
1c390 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54  LITE_NOHAVE_SYST
1c3a0 45 4d 0a 20 20 22 2e 73 68 65 6c 6c 20 43 4d 44  EM.  ".shell CMD
1c3b0 20 41 52 47 53 2e 2e 2e 20 20 20 20 20 20 20 52   ARGS...       R
1c3c0 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69  un CMD ARGS... i
1c3d0 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c  n a system shell
1c3e0 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73 68  ",.#endif.  ".sh
1c3f0 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ow              
1c400 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20 63        Show the c
1c410 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f  urrent values fo
1c420 72 20 76 61 72 69 6f 75 73 20 73 65 74 74 69 6e  r various settin
1c430 67 73 22 2c 0a 20 20 22 2e 73 74 61 74 73 20 3f  gs",.  ".stats ?
1c440 6f 6e 7c 6f 66 66 3f 20 20 20 20 20 20 20 20 20  on|off?         
1c450 20 53 68 6f 77 20 73 74 61 74 73 20 6f 72 20 74   Show stats or t
1c460 75 72 6e 20 73 74 61 74 73 20 6f 6e 20 6f 72 20  urn stats on or 
1c470 6f 66 66 22 2c 0a 23 69 66 6e 64 65 66 20 53 51  off",.#ifndef SQ
1c480 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54  LITE_NOHAVE_SYST
1c490 45 4d 0a 20 20 22 2e 73 79 73 74 65 6d 20 43 4d  EM.  ".system CM
1c4a0 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 20 20 52  D ARGS...      R
1c4b0 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69  un CMD ARGS... i
1c4c0 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c  n a system shell
1c4d0 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 74 61  ",.#endif.  ".ta
1c4e0 62 6c 65 73 20 3f 54 41 42 4c 45 3f 20 20 20 20  bles ?TABLE?    
1c4f0 20 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73        List names
1c500 20 6f 66 20 74 61 62 6c 65 73 20 6d 61 74 63 68   of tables match
1c510 69 6e 67 20 4c 49 4b 45 20 70 61 74 74 65 72 6e  ing LIKE pattern
1c520 20 54 41 42 4c 45 22 2c 0a 20 20 22 2e 74 65 73   TABLE",.  ".tes
1c530 74 63 61 73 65 20 4e 41 4d 45 20 20 20 20 20 20  tcase NAME      
1c540 20 20 20 20 20 42 65 67 69 6e 20 72 65 64 69 72       Begin redir
1c550 65 63 74 69 6e 67 20 6f 75 74 70 75 74 20 74 6f  ecting output to
1c560 20 27 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74   'testcase-out.t
1c570 78 74 27 22 2c 0a 20 20 22 2e 74 69 6d 65 6f 75  xt'",.  ".timeou
1c580 74 20 4d 53 20 20 20 20 20 20 20 20 20 20 20 20  t MS            
1c590 20 20 54 72 79 20 6f 70 65 6e 69 6e 67 20 6c 6f    Try opening lo
1c5a0 63 6b 65 64 20 74 61 62 6c 65 73 20 66 6f 72 20  cked tables for 
1c5b0 4d 53 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 22  MS milliseconds"
1c5c0 2c 0a 20 20 22 2e 74 69 6d 65 72 20 6f 6e 7c 6f  ,.  ".timer on|o
1c5d0 66 66 20 20 20 20 20 20 20 20 20 20 20 20 54 75  ff            Tu
1c5e0 72 6e 20 53 51 4c 20 74 69 6d 65 72 20 6f 6e 20  rn SQL timer on 
1c5f0 6f 72 20 6f 66 66 22 2c 0a 23 69 66 6e 64 65 66  or off",.#ifndef
1c600 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
1c610 43 45 0a 20 20 22 2e 74 72 61 63 65 20 3f 4f 50  CE.  ".trace ?OP
1c620 54 49 4f 4e 53 3f 20 20 20 20 20 20 20 20 20 4f  TIONS?         O
1c630 75 74 70 75 74 20 65 61 63 68 20 53 51 4c 20 73  utput each SQL s
1c640 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74 20 69  tatement as it i
1c650 73 20 72 75 6e 22 2c 0a 20 20 22 20 20 20 20 46  s run",.  "    F
1c660 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  ILE             
1c670 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70         Send outp
1c680 75 74 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22  ut to FILE",.  "
1c690 20 20 20 20 73 74 64 6f 75 74 20 20 20 20 20 20      stdout      
1c6a0 20 20 20 20 20 20 20 20 20 20 20 20 53 65 6e 64              Send
1c6b0 20 6f 75 74 70 75 74 20 74 6f 20 73 74 64 6f 75   output to stdou
1c6c0 74 22 2c 0a 20 20 22 20 20 20 20 73 74 64 65 72  t",.  "    stder
1c6d0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
1c6e0 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74     Send output t
1c6f0 6f 20 73 74 64 65 72 72 22 2c 0a 20 20 22 20 20  o stderr",.  "  
1c700 20 20 6f 66 66 20 20 20 20 20 20 20 20 20 20 20    off           
1c710 20 20 20 20 20 20 20 20 20 20 44 69 73 61 62 6c            Disabl
1c720 65 20 74 72 61 63 69 6e 67 22 2c 0a 20 20 22 20  e tracing",.  " 
1c730 20 20 20 2d 2d 65 78 70 61 6e 64 65 64 20 20 20     --expanded   
1c740 20 20 20 20 20 20 20 20 20 20 20 45 78 70 61 6e             Expan
1c750 64 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  d query paramete
1c760 72 73 22 2c 0a 23 69 66 64 65 66 20 53 51 4c 49  rs",.#ifdef SQLI
1c770 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c  TE_ENABLE_NORMAL
1c780 49 5a 45 0a 20 20 22 20 20 20 20 2d 2d 6e 6f 72  IZE.  "    --nor
1c790 6d 61 6c 69 7a 65 64 20 20 20 20 20 20 20 20 20  malized         
1c7a0 20 20 20 4e 6f 72 6d 61 6c 20 74 68 65 20 53 51     Normal the SQ
1c7b0 4c 20 73 74 61 74 65 6d 65 6e 74 73 22 2c 0a 23  L statements",.#
1c7c0 65 6e 64 69 66 0a 20 20 22 20 20 20 20 2d 2d 70  endif.  "    --p
1c7d0 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20 20 20  lain            
1c7e0 20 20 20 20 20 53 68 6f 77 20 53 51 4c 20 61 73       Show SQL as
1c7f0 20 69 74 20 69 73 20 69 6e 70 75 74 22 2c 0a 20   it is input",. 
1c800 20 22 20 20 20 20 2d 2d 73 74 6d 74 20 20 20 20   "    --stmt    
1c810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
1c820 61 63 65 20 73 74 61 74 65 6d 65 6e 74 20 65 78  ace statement ex
1c830 65 63 75 74 69 6f 6e 20 28 53 51 4c 49 54 45 5f  ecution (SQLITE_
1c840 54 52 41 43 45 5f 53 54 4d 54 29 22 2c 0a 20 20  TRACE_STMT)",.  
1c850 22 20 20 20 20 2d 2d 70 72 6f 66 69 6c 65 20 20  "    --profile  
1c860 20 20 20 20 20 20 20 20 20 20 20 20 20 50 72 6f               Pro
1c870 66 69 6c 65 20 73 74 61 74 65 6d 65 6e 74 73 20  file statements 
1c880 28 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 50 52  (SQLITE_TRACE_PR
1c890 4f 46 49 4c 45 29 22 2c 0a 20 20 22 20 20 20 20  OFILE)",.  "    
1c8a0 2d 2d 72 6f 77 20 20 20 20 20 20 20 20 20 20 20  --row           
1c8b0 20 20 20 20 20 20 20 20 54 72 61 63 65 20 65 61          Trace ea
1c8c0 63 68 20 72 6f 77 20 28 53 51 4c 49 54 45 5f 54  ch row (SQLITE_T
1c8d0 52 41 43 45 5f 52 4f 57 29 22 2c 0a 20 20 22 20  RACE_ROW)",.  " 
1c8e0 20 20 20 2d 2d 63 6c 6f 73 65 20 20 20 20 20 20     --close      
1c8f0 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65             Trace
1c900 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 6f 73   connection clos
1c910 65 20 28 53 51 4c 49 54 45 5f 54 52 41 43 45 5f  e (SQLITE_TRACE_
1c920 43 4c 4f 53 45 29 22 2c 0a 23 65 6e 64 69 66 20  CLOSE)",.#endif 
1c930 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  /* SQLITE_OMIT_T
1c940 52 41 43 45 20 2a 2f 0a 20 20 22 2e 76 66 73 69  RACE */.  ".vfsi
1c950 6e 66 6f 20 3f 41 55 58 3f 20 20 20 20 20 20 20  nfo ?AUX?       
1c960 20 20 20 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20      Information 
1c970 61 62 6f 75 74 20 74 68 65 20 74 6f 70 2d 6c 65  about the top-le
1c980 76 65 6c 20 56 46 53 22 2c 0a 20 20 22 2e 76 66  vel VFS",.  ".vf
1c990 73 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  slist           
1c9a0 20 20 20 20 20 20 4c 69 73 74 20 61 6c 6c 20 61        List all a
1c9b0 76 61 69 6c 61 62 6c 65 20 56 46 53 65 73 22 2c  vailable VFSes",
1c9c0 0a 20 20 22 2e 76 66 73 6e 61 6d 65 20 3f 41 55  .  ".vfsname ?AU
1c9d0 58 3f 20 20 20 20 20 20 20 20 20 20 20 50 72 69  X?           Pri
1c9e0 6e 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nt the name of t
1c9f0 68 65 20 56 46 53 20 73 74 61 63 6b 22 2c 0a 20  he VFS stack",. 
1ca00 20 22 2e 77 69 64 74 68 20 4e 55 4d 31 20 4e 55   ".width NUM1 NU
1ca10 4d 32 20 2e 2e 2e 20 20 20 20 20 53 65 74 20 63  M2 ...     Set c
1ca20 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20 66 6f 72  olumn widths for
1ca30 20 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65   \"column\" mode
1ca40 22 2c 0a 20 20 22 20 20 20 20 20 4e 65 67 61 74  ",.  "     Negat
1ca50 69 76 65 20 76 61 6c 75 65 73 20 72 69 67 68 74  ive values right
1ca60 2d 6a 75 73 74 69 66 79 22 2c 0a 7d 3b 0a 0a 2f  -justify",.};../
1ca70 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 68 65 6c 70  *.** Output help
1ca80 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 7a 50 61   text..**.** zPa
1ca90 74 74 65 72 6e 20 64 65 73 63 72 69 62 65 73 20  ttern describes 
1caa0 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6d 6d 61  the set of comma
1cab0 6e 64 73 20 66 6f 72 20 77 68 69 63 68 20 68 65  nds for which he
1cac0 6c 70 20 74 65 78 74 20 69 73 20 70 72 6f 76 69  lp text is provi
1cad0 64 65 64 2e 0a 2a 2a 20 49 66 20 7a 50 61 74 74  ded..** If zPatt
1cae0 65 72 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ern is NULL, the
1caf0 6e 20 73 68 6f 77 20 61 6c 6c 20 63 6f 6d 6d 61  n show all comma
1cb00 6e 64 73 2c 20 62 75 74 20 6f 6e 6c 79 20 67 69  nds, but only gi
1cb10 76 65 20 61 20 6f 6e 65 2d 6c 69 6e 65 0a 2a 2a  ve a one-line.**
1cb20 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
1cb30 65 61 63 68 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  each..**.** Retu
1cb40 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1cb50 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61   matches..*/.sta
1cb60 74 69 63 20 69 6e 74 20 73 68 6f 77 48 65 6c 70  tic int showHelp
1cb70 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73  (FILE *out, cons
1cb80 74 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e  t char *zPattern
1cb90 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  ){.  int i = 0;.
1cba0 20 20 69 6e 74 20 6a 20 3d 20 30 3b 0a 20 20 69    int j = 0;.  i
1cbb0 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72  nt n = 0;.  char
1cbc0 20 2a 7a 50 61 74 3b 0a 20 20 69 66 28 20 7a 50   *zPat;.  if( zP
1cbd0 61 74 74 65 72 6e 3d 3d 30 0a 20 20 20 7c 7c 20  attern==0.   || 
1cbe0 7a 50 61 74 74 65 72 6e 5b 30 5d 3d 3d 27 30 27  zPattern[0]=='0'
1cbf0 0a 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 50  .   || strcmp(zP
1cc00 61 74 74 65 72 6e 2c 22 2d 61 22 29 3d 3d 30 0a  attern,"-a")==0.
1cc10 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 50 61     || strcmp(zPa
1cc20 74 74 65 72 6e 2c 22 2d 61 6c 6c 22 29 3d 3d 30  ttern,"-all")==0
1cc30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 68 6f  .  ){.    /* Sho
1cc40 77 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73 2c 20  w all commands, 
1cc50 62 75 74 20 6f 6e 6c 79 20 6f 6e 65 20 6c 69 6e  but only one lin
1cc60 65 20 70 65 72 20 63 6f 6d 6d 61 6e 64 20 2a 2f  e per command */
1cc70 0a 20 20 20 20 69 66 28 20 7a 50 61 74 74 65 72  .    if( zPatter
1cc80 6e 3d 3d 30 20 29 20 7a 50 61 74 74 65 72 6e 20  n==0 ) zPattern 
1cc90 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d  = "";.    for(i=
1cca0 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
1ccb0 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20 20  zHelp); i++){.  
1ccc0 20 20 20 20 69 66 28 20 61 7a 48 65 6c 70 5b 69      if( azHelp[i
1ccd0 5d 5b 30 5d 3d 3d 27 2e 27 20 7c 7c 20 7a 50 61  ][0]=='.' || zPa
1cce0 74 74 65 72 6e 5b 30 5d 20 29 7b 0a 20 20 20 20  ttern[0] ){.    
1ccf0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1cd00 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48  out, "%s\n", azH
1cd10 65 6c 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  elp[i]);.       
1cd20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   n++;.      }.  
1cd30 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1cd40 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 63 6f 6d   /* Look for com
1cd50 6d 61 6e 64 73 20 74 68 61 74 20 66 6f 72 20 77  mands that for w
1cd60 68 69 63 68 20 7a 50 61 74 74 65 72 6e 20 69 73  hich zPattern is
1cd70 20 61 6e 20 65 78 61 63 74 20 70 72 65 66 69 78   an exact prefix
1cd80 20 2a 2f 0a 20 20 20 20 7a 50 61 74 20 3d 20 73   */.    zPat = s
1cd90 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1cda0 2e 25 73 2a 22 2c 20 7a 50 61 74 74 65 72 6e 29  .%s*", zPattern)
1cdb0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1cdc0 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c  <ArraySize(azHel
1cdd0 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  p); i++){.      
1cde0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67  if( sqlite3_strg
1cdf0 6c 6f 62 28 7a 50 61 74 2c 20 61 7a 48 65 6c 70  lob(zPat, azHelp
1ce00 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  [i])==0 ){.     
1ce10 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
1ce20 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65  ut, "%s\n", azHe
1ce30 6c 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  lp[i]);.        
1ce40 6a 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20  j = i+1;.       
1ce50 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   n++;.      }.  
1ce60 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
1ce70 66 72 65 65 28 7a 50 61 74 29 3b 0a 20 20 20 20  free(zPat);.    
1ce80 69 66 28 20 6e 20 29 7b 0a 20 20 20 20 20 20 69  if( n ){.      i
1ce90 66 28 20 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  f( n==1 ){.     
1cea0 20 20 20 2f 2a 20 77 68 65 6e 20 7a 50 61 74 74     /* when zPatt
1ceb0 65 72 6e 20 69 73 20 61 20 70 72 65 66 69 78 20  ern is a prefix 
1cec0 6f 66 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63  of exactly one c
1ced0 6f 6d 6d 61 6e 64 2c 20 74 68 65 6e 20 69 6e 63  ommand, then inc
1cee0 6c 75 64 65 20 74 68 65 0a 20 20 20 20 20 20 20  lude the.       
1cef0 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 74   ** details of t
1cf00 68 61 74 20 63 6f 6d 6d 61 6e 64 2c 20 77 68 69  hat command, whi
1cf10 63 68 20 73 68 6f 75 6c 64 20 62 65 67 69 6e 20  ch should begin 
1cf20 61 74 20 6f 66 66 73 65 74 20 6a 20 2a 2f 0a 20  at offset j */. 
1cf30 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c         while( j<
1cf40 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70  ArraySize(azHelp
1cf50 29 2d 31 20 26 26 20 61 7a 48 65 6c 70 5b 6a 5d  )-1 && azHelp[j]
1cf60 5b 30 5d 21 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]!='.' ){.    
1cf70 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
1cf80 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61  f(out, "%s\n", a
1cf90 7a 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20 20  zHelp[j]);.     
1cfa0 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
1cfb0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1cfc0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 20 20    return n;.    
1cfd0 7d 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f  }.    /* Look fo
1cfe0 72 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20  r commands that 
1cff0 63 6f 6e 74 61 69 6e 20 7a 50 61 74 74 65 72 6e  contain zPattern
1d000 20 61 6e 79 77 68 65 72 65 2e 20 20 53 68 6f 77   anywhere.  Show
1d010 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 0a 20 20   the complete.  
1d020 20 20 2a 2a 20 74 65 78 74 20 6f 66 20 61 6c 6c    ** text of all
1d030 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 6d   commands that m
1d040 61 74 63 68 2e 20 2a 2f 0a 20 20 20 20 7a 50 61  atch. */.    zPa
1d050 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  t = sqlite3_mpri
1d060 6e 74 66 28 22 25 25 25 73 25 25 22 2c 20 7a 50  ntf("%%%s%%", zP
1d070 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 66 6f 72  attern);.    for
1d080 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
1d090 65 28 61 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b  e(azHelp); i++){
1d0a0 0a 20 20 20 20 20 20 69 66 28 20 61 7a 48 65 6c  .      if( azHel
1d0b0 70 5b 69 5d 5b 30 5d 3d 3d 27 2e 27 20 29 20 6a  p[i][0]=='.' ) j
1d0c0 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20   = i;.      if( 
1d0d0 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
1d0e0 7a 50 61 74 2c 20 61 7a 48 65 6c 70 5b 69 5d 2c  zPat, azHelp[i],
1d0f0 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)==0 ){.      
1d100 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
1d110 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c  t, "%s\n", azHel
1d120 70 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 77  p[j]);.        w
1d130 68 69 6c 65 28 20 6a 3c 41 72 72 61 79 53 69 7a  hile( j<ArraySiz
1d140 65 28 61 7a 48 65 6c 70 29 2d 31 20 26 26 20 61  e(azHelp)-1 && a
1d150 7a 48 65 6c 70 5b 6a 2b 31 5d 5b 30 5d 21 3d 27  zHelp[j+1][0]!='
1d160 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .' ){.          
1d170 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 75  j++;.          u
1d180 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
1d190 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a  "%s\n", azHelp[j
1d1a0 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
1d1b0 20 20 20 20 20 20 69 20 3d 20 6a 3b 0a 20 20 20        i = j;.   
1d1c0 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20       n++;.      
1d1d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
1d1e0 74 65 33 5f 66 72 65 65 28 7a 50 61 74 29 3b 0a  te3_free(zPat);.
1d1f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
1d200 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
1d210 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
1d220 63 20 69 6e 74 20 70 72 6f 63 65 73 73 5f 69 6e  c int process_in
1d230 70 75 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  put(ShellState *
1d240 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  p);../*.** Read 
1d250 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66  the content of f
1d260 69 6c 65 20 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d  ile zName into m
1d270 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
1d280 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
1d290 6f 63 36 34 28 29 0a 2a 2a 20 61 6e 64 20 72 65  oc64().** and re
1d2a0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1d2b0 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68  o the buffer. Th
1d2c0 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
1d2d0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65  onsible for free
1d2e0 69 6e 67 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  ing.** the memor
1d2f0 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  y..**.** If para
1d300 6d 65 74 65 72 20 70 6e 42 79 74 65 20 69 73 20  meter pnByte is 
1d310 6e 6f 74 20 4e 55 4c 4c 2c 20 28 2a 70 6e 42 79  not NULL, (*pnBy
1d320 74 65 29 20 69 73 20 73 65 74 20 74 6f 20 74 68  te) is set to th
1d330 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1d340 73 0a 2a 2a 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  s.** read..**.**
1d350 20 46 6f 72 20 63 6f 6e 76 65 6e 69 65 6e 63 65   For convenience
1d360 2c 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  , a nul-terminat
1d370 6f 72 20 62 79 74 65 20 69 73 20 61 6c 77 61 79  or byte is alway
1d380 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
1d390 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 66  e data read.** f
1d3a0 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 62 65 66  rom the file bef
1d3b0 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20 69  ore the buffer i
1d3c0 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  s returned. This
1d3d0 20 62 79 74 65 20 69 73 20 6e 6f 74 20 69 6e 63   byte is not inc
1d3e0 6c 75 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  luded in.** the 
1d3f0 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 28  final value of (
1d400 2a 70 6e 42 79 74 65 29 2c 20 69 66 20 61 70 70  *pnByte), if app
1d410 6c 69 63 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e  licable..**.** N
1d420 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
1d430 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20  if any error is 
1d440 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 54 68 65  encountered. The
1d450 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20   final value of 
1d460 2a 70 6e 42 79 74 65 0a 2a 2a 20 69 73 20 75 6e  *pnByte.** is un
1d470 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
1d480 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
1d490 63 68 61 72 20 2a 72 65 61 64 46 69 6c 65 28 63  char *readFile(c
1d4a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1d4b0 2c 20 69 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a  , int *pnByte){.
1d4c0 20 20 46 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70    FILE *in = fop
1d4d0 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b  en(zName, "rb");
1d4e0 0a 20 20 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20 73  .  long nIn;.  s
1d4f0 69 7a 65 5f 74 20 6e 52 65 61 64 3b 0a 20 20 63  ize_t nRead;.  c
1d500 68 61 72 20 2a 70 42 75 66 3b 0a 20 20 69 66 28  har *pBuf;.  if(
1d510 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   in==0 ) return 
1d520 30 3b 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30  0;.  fseek(in, 0
1d530 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e  , SEEK_END);.  n
1d540 49 6e 20 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a  In = ftell(in);.
1d550 20 20 72 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20    rewind(in);.  
1d560 70 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pBuf = sqlite3_m
1d570 61 6c 6c 6f 63 36 34 28 20 6e 49 6e 2b 31 20 29  alloc64( nIn+1 )
1d580 3b 0a 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20  ;.  if( pBuf==0 
1d590 29 7b 20 66 63 6c 6f 73 65 28 69 6e 29 3b 20 72  ){ fclose(in); r
1d5a0 65 74 75 72 6e 20 30 3b 20 7d 0a 20 20 6e 52 65  eturn 0; }.  nRe
1d5b0 61 64 20 3d 20 66 72 65 61 64 28 70 42 75 66 2c  ad = fread(pBuf,
1d5c0 20 6e 49 6e 2c 20 31 2c 20 69 6e 29 3b 0a 20 20   nIn, 1, in);.  
1d5d0 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69 66  fclose(in);.  if
1d5e0 28 20 6e 52 65 61 64 21 3d 31 20 29 7b 0a 20 20  ( nRead!=1 ){.  
1d5f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1d600 42 75 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Buf);.    return
1d610 20 30 3b 0a 20 20 7d 0a 20 20 70 42 75 66 5b 6e   0;.  }.  pBuf[n
1d620 49 6e 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  In] = 0;.  if( p
1d630 6e 42 79 74 65 20 29 20 2a 70 6e 42 79 74 65 20  nByte ) *pnByte 
1d640 3d 20 6e 49 6e 3b 0a 20 20 72 65 74 75 72 6e 20  = nIn;.  return 
1d650 70 42 75 66 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  pBuf;.}..#if def
1d660 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1d670 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a  LE_SESSION)./*.*
1d680 2a 20 43 6c 6f 73 65 20 61 20 73 69 6e 67 6c 65  * Close a single
1d690 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a   OpenSession obj
1d6a0 65 63 74 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ect and release 
1d6b0 61 6c 6c 20 6f 66 20 69 74 73 20 61 73 73 6f 63  all of its assoc
1d6c0 69 61 74 65 64 0a 2a 2a 20 72 65 73 6f 75 72 63  iated.** resourc
1d6d0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
1d6e0 69 64 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65  id session_close
1d6f0 28 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53  (OpenSession *pS
1d700 65 73 73 69 6f 6e 29 7b 0a 20 20 69 6e 74 20 69  ession){.  int i
1d710 3b 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73 69  ;.  sqlite3sessi
1d720 6f 6e 5f 64 65 6c 65 74 65 28 70 53 65 73 73 69  on_delete(pSessi
1d730 6f 6e 2d 3e 70 29 3b 0a 20 20 73 71 6c 69 74 65  on->p);.  sqlite
1d740 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d  3_free(pSession-
1d750 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  >zName);.  for(i
1d760 3d 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e  =0; i<pSession->
1d770 6e 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20  nFilter; i++){. 
1d780 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1d790 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74  pSession->azFilt
1d7a0 65 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71  er[i]);.  }.  sq
1d7b0 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73  lite3_free(pSess
1d7c0 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a  ion->azFilter);.
1d7d0 20 20 6d 65 6d 73 65 74 28 70 53 65 73 73 69 6f    memset(pSessio
1d7e0 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 70 65  n, 0, sizeof(Ope
1d7f0 6e 53 65 73 73 69 6f 6e 29 29 3b 0a 7d 0a 23 65  nSession));.}.#e
1d800 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ndif../*.** Clos
1d810 65 20 61 6c 6c 20 4f 70 65 6e 53 65 73 73 69 6f  e all OpenSessio
1d820 6e 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 72 65  n objects and re
1d830 6c 65 61 73 65 20 61 6c 6c 20 61 73 73 6f 63 69  lease all associ
1d840 61 74 65 64 20 72 65 73 6f 75 72 63 65 73 2e 0a  ated resources..
1d850 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
1d860 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53  QLITE_ENABLE_SES
1d870 53 49 4f 4e 29 0a 73 74 61 74 69 63 20 76 6f 69  SION).static voi
1d880 64 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f  d session_close_
1d890 61 6c 6c 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  all(ShellState *
1d8a0 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  p){.  int i;.  f
1d8b0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65  or(i=0; i<p->nSe
1d8c0 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ssion; i++){.   
1d8d0 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 26   session_close(&
1d8e0 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 29 3b  p->aSession[i]);
1d8f0 0a 20 20 7d 0a 20 20 70 2d 3e 6e 53 65 73 73 69  .  }.  p->nSessi
1d900 6f 6e 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a  on = 0;.}.#else.
1d910 23 20 64 65 66 69 6e 65 20 73 65 73 73 69 6f 6e  # define session
1d920 5f 63 6c 6f 73 65 5f 61 6c 6c 28 58 29 0a 23 65  _close_all(X).#e
1d930 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ndif../*.** Impl
1d940 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1d950 65 20 78 46 69 6c 74 65 72 20 66 75 6e 63 74 69  e xFilter functi
1d960 6f 6e 20 66 6f 72 20 61 6e 20 6f 70 65 6e 20 73  on for an open s
1d970 65 73 73 69 6f 6e 2e 20 20 4f 6d 69 74 0a 2a 2a  ession.  Omit.**
1d980 20 61 6e 79 20 74 61 62 6c 65 73 20 6e 61 6d 65   any tables name
1d990 64 20 62 79 20 22 2e 73 65 73 73 69 6f 6e 20 66  d by ".session f
1d9a0 69 6c 74 65 72 22 20 62 75 74 20 6c 65 74 20 61  ilter" but let a
1d9b0 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 20 74  ll other table t
1d9c0 68 72 6f 75 67 68 2e 0a 2a 2f 0a 23 69 66 20 64  hrough..*/.#if d
1d9d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1d9e0 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74  ABLE_SESSION).st
1d9f0 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e  atic int session
1da00 5f 66 69 6c 74 65 72 28 76 6f 69 64 20 2a 70 43  _filter(void *pC
1da10 74 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tx, const char *
1da20 7a 54 61 62 29 7b 0a 20 20 4f 70 65 6e 53 65 73  zTab){.  OpenSes
1da30 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d  sion *pSession =
1da40 20 28 4f 70 65 6e 53 65 73 73 69 6f 6e 2a 29 70   (OpenSession*)p
1da50 43 74 78 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Ctx;.  int i;.  
1da60 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73 73  for(i=0; i<pSess
1da70 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b  ion->nFilter; i+
1da80 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
1da90 74 65 33 5f 73 74 72 67 6c 6f 62 28 70 53 65 73  te3_strglob(pSes
1daa0 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69  sion->azFilter[i
1dab0 5d 2c 20 7a 54 61 62 29 3d 3d 30 20 29 20 72 65  ], zTab)==0 ) re
1dac0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
1dad0 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
1dae0 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64  ../*.** Try to d
1daf0 65 64 75 63 65 20 74 68 65 20 74 79 70 65 20 6f  educe the type o
1db00 66 20 66 69 6c 65 20 66 6f 72 20 7a 4e 61 6d 65  f file for zName
1db10 20 62 61 73 65 64 20 6f 6e 20 69 74 73 20 63 6f   based on its co
1db20 6e 74 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a  ntent.  Return.*
1db30 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 48 45  * one of the SHE
1db40 4c 4c 5f 4f 50 45 4e 5f 2a 20 63 6f 6e 73 74 61  LL_OPEN_* consta
1db50 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nts..**.** If th
1db60 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
1db70 65 78 69 73 74 20 6f 72 20 69 73 20 65 6d 70 74  exist or is empt
1db80 79 20 62 75 74 20 69 74 73 20 6e 61 6d 65 20 6c  y but its name l
1db90 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 5a 49 50 0a  ooks like a ZIP.
1dba0 2a 2a 20 61 72 63 68 69 76 65 20 61 6e 64 20 74  ** archive and t
1dbb0 68 65 20 64 66 6c 74 5a 69 70 20 66 6c 61 67 20  he dfltZip flag 
1dbc0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 73  is true, then as
1dbd0 73 75 6d 65 20 69 74 20 69 73 20 61 20 5a 49 50  sume it is a ZIP
1dbe0 20 61 72 63 68 69 76 65 2e 0a 2a 2a 20 4f 74 68   archive..** Oth
1dbf0 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 61  erwise, assume a
1dc00 6e 20 6f 72 64 69 6e 61 72 79 20 64 61 74 61 62  n ordinary datab
1dc10 61 73 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ase regardless o
1dc20 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 69  f the filename i
1dc30 66 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 63 61  f.** the type ca
1dc40 6e 6e 6f 74 20 62 65 20 64 65 74 65 72 6d 69 6e  nnot be determin
1dc50 65 64 20 66 72 6f 6d 20 63 6f 6e 74 65 6e 74 2e  ed from content.
1dc60 0a 2a 2f 0a 69 6e 74 20 64 65 64 75 63 65 44 61  .*/.int deduceDa
1dc70 74 61 62 61 73 65 54 79 70 65 28 63 6f 6e 73 74  tabaseType(const
1dc80 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
1dc90 74 20 64 66 6c 74 5a 69 70 29 7b 0a 20 20 46 49  t dfltZip){.  FI
1dca0 4c 45 20 2a 66 20 3d 20 66 6f 70 65 6e 28 7a 4e  LE *f = fopen(zN
1dcb0 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 73 69  ame, "rb");.  si
1dcc0 7a 65 5f 74 20 6e 3b 0a 20 20 69 6e 74 20 72 63  ze_t n;.  int rc
1dcd0 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e   = SHELL_OPEN_UN
1dce0 53 50 45 43 3b 0a 20 20 63 68 61 72 20 7a 42 75  SPEC;.  char zBu
1dcf0 66 5b 31 30 30 5d 3b 0a 20 20 69 66 28 20 66 3d  f[100];.  if( f=
1dd00 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 66  =0 ){.    if( df
1dd10 6c 74 5a 69 70 20 26 26 20 73 71 6c 69 74 65 33  ltZip && sqlite3
1dd20 5f 73 74 72 6c 69 6b 65 28 22 25 2e 7a 69 70 22  _strlike("%.zip"
1dd30 2c 7a 4e 61 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a  ,zName,0)==0 ){.
1dd40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 48         return SH
1dd50 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45  ELL_OPEN_ZIPFILE
1dd60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1dd70 20 20 20 20 72 65 74 75 72 6e 20 53 48 45 4c 4c      return SHELL
1dd80 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _OPEN_NORMAL;.  
1dd90 20 20 7d 0a 20 20 7d 0a 20 20 6e 20 3d 20 66 72    }.  }.  n = fr
1dda0 65 61 64 28 7a 42 75 66 2c 20 31 36 2c 20 31 2c  ead(zBuf, 16, 1,
1ddb0 20 66 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31 20   f);.  if( n==1 
1ddc0 26 26 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20  && memcmp(zBuf, 
1ddd0 22 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33  "SQLite format 3
1dde0 22 2c 20 31 36 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 16)==0 ){.   
1ddf0 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 20 20   fclose(f);.    
1de00 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45  return SHELL_OPE
1de10 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  N_NORMAL;.  }.  
1de20 66 73 65 65 6b 28 66 2c 20 2d 32 35 2c 20 53 45  fseek(f, -25, SE
1de30 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 20 3d 20 66  EK_END);.  n = f
1de40 72 65 61 64 28 7a 42 75 66 2c 20 32 35 2c 20 31  read(zBuf, 25, 1
1de50 2c 20 66 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31  , f);.  if( n==1
1de60 20 26 26 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c   && memcmp(zBuf,
1de70 20 22 53 74 61 72 74 2d 4f 66 2d 53 51 4c 69 74   "Start-Of-SQLit
1de80 65 33 2d 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a  e3-", 17)==0 ){.
1de90 20 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f      rc = SHELL_O
1dea0 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20  PEN_APPENDVFS;. 
1deb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 73 65 65   }else{.    fsee
1dec0 6b 28 66 2c 20 2d 32 32 2c 20 53 45 45 4b 5f 45  k(f, -22, SEEK_E
1ded0 4e 44 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65  ND);.    n = fre
1dee0 61 64 28 7a 42 75 66 2c 20 32 32 2c 20 31 2c 20  ad(zBuf, 22, 1, 
1def0 66 29 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 31  f);.    if( n==1
1df00 20 26 26 20 7a 42 75 66 5b 30 5d 3d 3d 30 78 35   && zBuf[0]==0x5
1df10 30 20 26 26 20 7a 42 75 66 5b 31 5d 3d 3d 30 78  0 && zBuf[1]==0x
1df20 34 62 20 26 26 20 7a 42 75 66 5b 32 5d 3d 3d 30  4b && zBuf[2]==0
1df30 78 30 35 0a 20 20 20 20 20 20 20 26 26 20 7a 42  x05.       && zB
1df40 75 66 5b 33 5d 3d 3d 30 78 30 36 20 29 7b 0a 20  uf[3]==0x06 ){. 
1df50 20 20 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f       rc = SHELL_
1df60 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20  OPEN_ZIPFILE;.  
1df70 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 30    }else if( n==0
1df80 20 26 26 20 64 66 6c 74 5a 69 70 20 26 26 20 73   && dfltZip && s
1df90 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22  qlite3_strlike("
1dfa0 25 2e 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29 3d  %.zip",zName,0)=
1dfb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1dfc0 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46   SHELL_OPEN_ZIPF
1dfd0 49 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ILE;.    }.  }. 
1dfe0 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 72 65   fclose(f);.  re
1dff0 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 23 69  turn rc;  .}..#i
1e000 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1e010 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a 2f  LE_DESERIALIZE./
1e020 2a 0a 2a 2a 20 52 65 63 6f 6e 73 74 72 75 63 74  *.** Reconstruct
1e030 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
1e040 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
1e050 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 74 68 65   output from the
1e060 20 22 64 62 74 6f 74 78 74 22 0a 2a 2a 20 70 72   "dbtotxt".** pr
1e070 6f 67 72 61 6d 2e 20 20 52 65 61 64 20 63 6f 6e  ogram.  Read con
1e080 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 66 69  tent from the fi
1e090 6c 65 20 69 6e 20 70 2d 3e 7a 44 62 46 69 6c 65  le in p->zDbFile
1e0a0 6e 61 6d 65 2e 20 20 49 66 20 70 2d 3e 7a 44 62  name.  If p->zDb
1e0b0 46 69 6c 65 6e 61 6d 65 0a 2a 2a 20 69 73 20 30  Filename.** is 0
1e0c0 2c 20 74 68 65 6e 20 72 65 61 64 20 66 72 6f 6d  , then read from
1e0d0 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2e   standard input.
1e0e0 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67  .*/.static unsig
1e0f0 6e 65 64 20 63 68 61 72 20 2a 72 65 61 64 48 65  ned char *readHe
1e100 78 44 62 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  xDb(ShellState *
1e110 70 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61 29 7b  p, int *pnData){
1e120 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1e130 20 2a 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e   *a = 0;.  int n
1e140 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  Line;.  int n = 
1e150 30 3b 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20  0;.  int pgsz = 
1e160 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74  0;.  int iOffset
1e170 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 2c 20 6b   = 0;.  int j, k
1e180 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 46 49  ;.  int rc;.  FI
1e190 4c 45 20 2a 69 6e 3b 0a 20 20 75 6e 73 69 67 6e  LE *in;.  unsign
1e1a0 65 64 20 69 6e 74 20 78 5b 31 36 5d 3b 0a 20 20  ed int x[16];.  
1e1b0 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30 5d  char zLine[1000]
1e1c0 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 44 62 46 69  ;.  if( p->zDbFi
1e1d0 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e  lename ){.    in
1e1e0 20 3d 20 66 6f 70 65 6e 28 70 2d 3e 7a 44 62 46   = fopen(p->zDbF
1e1f0 69 6c 65 6e 61 6d 65 2c 20 22 72 22 29 3b 0a 20  ilename, "r");. 
1e200 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a     if( in==0 ){.
1e210 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
1e220 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f  f(stderr, "canno
1e230 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f  t open \"%s\" fo
1e240 72 20 72 65 61 64 69 6e 67 5c 6e 22 2c 20 70 2d  r reading\n", p-
1e250 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  >zDbFilename);. 
1e260 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1e270 20 20 20 7d 0a 20 20 20 20 6e 4c 69 6e 65 20 3d     }.    nLine =
1e280 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1e290 20 69 6e 20 3d 20 70 2d 3e 69 6e 3b 0a 20 20 20   in = p->in;.   
1e2a0 20 6e 4c 69 6e 65 20 3d 20 70 2d 3e 6c 69 6e 65   nLine = p->line
1e2b0 6e 6f 3b 0a 20 20 7d 0a 20 20 2a 70 6e 44 61 74  no;.  }.  *pnDat
1e2c0 61 20 3d 20 30 3b 0a 20 20 6e 4c 69 6e 65 2b 2b  a = 0;.  nLine++
1e2d0 3b 0a 20 20 69 66 28 20 66 67 65 74 73 28 7a 4c  ;.  if( fgets(zL
1e2e0 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e  ine, sizeof(zLin
1e2f0 65 29 2c 20 69 6e 29 3d 3d 30 20 29 20 67 6f 74  e), in)==0 ) got
1e300 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f  o readHexDb_erro
1e310 72 3b 0a 20 20 72 63 20 3d 20 73 73 63 61 6e 66  r;.  rc = sscanf
1e320 28 7a 4c 69 6e 65 2c 20 22 7c 20 73 69 7a 65 20  (zLine, "| size 
1e330 25 64 20 70 61 67 65 73 69 7a 65 20 25 64 22 2c  %d pagesize %d",
1e340 20 26 6e 2c 20 26 70 67 73 7a 29 3b 0a 20 20 69   &n, &pgsz);.  i
1e350 66 28 20 72 63 21 3d 32 20 29 20 67 6f 74 6f 20  f( rc!=2 ) goto 
1e360 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f 72 3b  readHexDb_error;
1e370 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 20 67 6f  .  if( n<=0 ) go
1e380 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72  to readHexDb_err
1e390 6f 72 3b 0a 20 20 61 20 3d 20 73 71 6c 69 74 65  or;.  a = sqlite
1e3a0 33 5f 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20  3_malloc( n );. 
1e3b0 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
1e3c0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1e3d0 65 72 72 2c 20 22 4f 75 74 20 6f 66 20 6d 65 6d  err, "Out of mem
1e3e0 6f 72 79 21 5c 6e 22 29 3b 0a 20 20 20 20 67 6f  ory!\n");.    go
1e3f0 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72  to readHexDb_err
1e400 6f 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  or;.  }.  memset
1e410 28 61 2c 20 30 2c 20 6e 29 3b 0a 20 20 69 66 28  (a, 0, n);.  if(
1e420 20 70 67 73 7a 3c 35 31 32 20 7c 7c 20 70 67 73   pgsz<512 || pgs
1e430 7a 3e 36 35 35 33 36 20 7c 7c 20 28 70 67 73 7a  z>65536 || (pgsz
1e440 20 26 20 28 70 67 73 7a 2d 31 29 29 21 3d 30 20   & (pgsz-1))!=0 
1e450 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
1e460 74 66 28 73 74 64 65 72 72 2c 20 22 69 6e 76 61  tf(stderr, "inva
1e470 6c 69 64 20 70 61 67 65 73 69 7a 65 5c 6e 22 29  lid pagesize\n")
1e480 3b 0a 20 20 20 20 67 6f 74 6f 20 72 65 61 64 48  ;.    goto readH
1e490 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  exDb_error;.  }.
1e4a0 20 20 66 6f 72 28 6e 4c 69 6e 65 2b 2b 3b 20 66    for(nLine++; f
1e4b0 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65  gets(zLine, size
1e4c0 6f 66 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 21 3d  of(zLine), in)!=
1e4d0 30 3b 20 6e 4c 69 6e 65 2b 2b 29 7b 0a 20 20 20  0; nLine++){.   
1e4e0 20 72 63 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69   rc = sscanf(zLi
1e4f0 6e 65 2c 20 22 7c 20 70 61 67 65 20 25 64 20 6f  ne, "| page %d o
1e500 66 66 73 65 74 20 25 64 22 2c 20 26 6a 2c 20 26  ffset %d", &j, &
1e510 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  k);.    if( rc==
1e520 32 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 73  2 ){.      iOffs
1e530 65 74 20 3d 20 6b 3b 0a 20 20 20 20 20 20 63 6f  et = k;.      co
1e540 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
1e550 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4c    if( strncmp(zL
1e560 69 6e 65 2c 20 22 7c 20 65 6e 64 20 22 2c 20 36  ine, "| end ", 6
1e570 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  )==0 ){.      br
1e580 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  eak;.    }.    r
1e590 63 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69 6e 65  c = sscanf(zLine
1e5a0 2c 22 7c 20 25 64 3a 20 25 78 20 25 78 20 25 78  ,"| %d: %x %x %x
1e5b0 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20   %x %x %x %x %x 
1e5c0 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25  %x %x %x %x %x %
1e5d0 78 20 25 78 20 25 78 22 2c 0a 20 20 20 20 20 20  x %x %x",.      
1e5e0 20 20 20 20 20 20 20 20 20 20 26 6a 2c 20 26 78            &j, &x
1e5f0 5b 30 5d 2c 20 26 78 5b 31 5d 2c 20 26 78 5b 32  [0], &x[1], &x[2
1e600 5d 2c 20 26 78 5b 33 5d 2c 20 26 78 5b 34 5d 2c  ], &x[3], &x[4],
1e610 20 26 78 5b 35 5d 2c 20 26 78 5b 36 5d 2c 20 26   &x[5], &x[6], &
1e620 78 5b 37 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  x[7],.          
1e630 20 20 20 20 20 20 26 78 5b 38 5d 2c 20 26 78 5b        &x[8], &x[
1e640 39 5d 2c 20 26 78 5b 31 30 5d 2c 20 26 78 5b 31  9], &x[10], &x[1
1e650 31 5d 2c 20 26 78 5b 31 32 5d 2c 20 26 78 5b 31  1], &x[12], &x[1
1e660 33 5d 2c 20 26 78 5b 31 34 5d 2c 20 26 78 5b 31  3], &x[14], &x[1
1e670 35 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  5]);.    if( rc=
1e680 3d 31 37 20 29 7b 0a 20 20 20 20 20 20 6b 20 3d  =17 ){.      k =
1e690 20 69 4f 66 66 73 65 74 2b 6a 3b 0a 20 20 20 20   iOffset+j;.    
1e6a0 20 20 69 66 28 20 6b 2b 31 36 3c 3d 6e 20 29 7b    if( k+16<=n ){
1e6b0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
1e6c0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
1e6d0 30 3b 20 69 69 3c 31 36 3b 20 69 69 2b 2b 29 20  0; ii<16; ii++) 
1e6e0 61 5b 6b 2b 69 69 5d 20 3d 20 78 5b 69 69 5d 26  a[k+ii] = x[ii]&
1e6f0 30 78 66 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20  0xff;.      }.  
1e700 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 6e 44 61 74    }.  }.  *pnDat
1e710 61 20 3d 20 6e 3b 0a 20 20 69 66 28 20 69 6e 21  a = n;.  if( in!
1e720 3d 70 2d 3e 69 6e 20 29 7b 0a 20 20 20 20 66 63  =p->in ){.    fc
1e730 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 65 6c 73  lose(in);.  }els
1e740 65 7b 0a 20 20 20 20 70 2d 3e 6c 69 6e 65 6e 6f  e{.    p->lineno
1e750 20 3d 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20 20   = nLine;.  }.  
1e760 72 65 74 75 72 6e 20 61 3b 0a 0a 72 65 61 64 48  return a;..readH
1e770 65 78 44 62 5f 65 72 72 6f 72 3a 0a 20 20 69 66  exDb_error:.  if
1e780 28 20 69 6e 21 3d 73 74 64 69 6e 20 29 7b 0a 20  ( in!=stdin ){. 
1e790 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
1e7a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
1e7b0 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20  e( fgets(zLine, 
1e7c0 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 70  sizeof(zLine), p
1e7d0 2d 3e 69 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  ->in)!=0 ){.    
1e7e0 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20    nLine++;.     
1e7f0 20 69 66 28 73 74 72 6e 63 6d 70 28 7a 4c 69 6e   if(strncmp(zLin
1e800 65 2c 20 22 7c 20 65 6e 64 20 22 2c 20 36 29 3d  e, "| end ", 6)=
1e810 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1e820 7d 0a 20 20 20 20 70 2d 3e 6c 69 6e 65 6e 6f 20  }.    p->lineno 
1e830 3d 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20 20 73  = nLine;.  }.  s
1e840 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a  qlite3_free(a);.
1e850 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1e860 64 65 72 72 2c 22 45 72 72 6f 72 20 6f 6e 20 6c  derr,"Error on l
1e870 69 6e 65 20 25 64 20 6f 66 20 2d 2d 68 65 78 64  ine %d of --hexd
1e880 62 20 69 6e 70 75 74 5c 6e 22 2c 20 6e 4c 69 6e  b input\n", nLin
1e890 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  e);.  return 0;.
1e8a0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1e8b0 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49  TE_ENABLE_DESERI
1e8c0 41 4c 49 5a 45 20 2a 2f 0a 0a 2f 2a 20 46 6c 61  ALIZE */../* Fla
1e8d0 67 73 20 66 6f 72 20 6f 70 65 6e 5f 64 62 28 29  gs for open_db()
1e8e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  ..**.** The defa
1e8f0 75 6c 74 20 62 65 68 61 76 69 6f 72 20 6f 66 20  ult behavior of 
1e900 6f 70 65 6e 5f 64 62 28 29 20 69 73 20 74 6f 20  open_db() is to 
1e910 65 78 69 74 28 31 29 20 69 66 20 74 68 65 20 64  exit(1) if the d
1e920 61 74 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f  atabase fails to
1e930 0a 2a 2a 20 6f 70 65 6e 2e 20 20 54 68 65 20 4f  .** open.  The O
1e940 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45  PEN_DB_KEEPALIVE
1e950 20 66 6c 61 67 20 63 68 61 6e 67 65 73 20 74 68   flag changes th
1e960 61 74 20 73 6f 20 74 68 61 74 20 69 74 20 70 72  at so that it pr
1e970 69 6e 74 73 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  ints an error.**
1e980 20 62 75 74 20 73 74 69 6c 6c 20 72 65 74 75 72   but still retur
1e990 6e 73 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69  ns without calli
1e9a0 6e 67 20 65 78 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  ng exit..**.** T
1e9b0 68 65 20 4f 50 45 4e 5f 44 42 5f 5a 49 50 46 49  he OPEN_DB_ZIPFI
1e9c0 4c 45 20 66 6c 61 67 20 63 61 75 73 65 73 20 6f  LE flag causes o
1e9d0 70 65 6e 5f 64 62 28 29 20 74 6f 20 70 72 65 66  pen_db() to pref
1e9e0 65 72 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 73  er to open files
1e9f0 20 61 73 20 61 0a 2a 2a 20 5a 49 50 20 61 72 63   as a.** ZIP arc
1ea00 68 69 76 65 20 69 66 20 74 68 65 20 66 69 6c 65  hive if the file
1ea10 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20   does not exist 
1ea20 6f 72 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20  or is empty and 
1ea30 69 74 73 20 6e 61 6d 65 20 6d 61 74 63 68 65 73  its name matches
1ea40 0a 2a 2a 20 74 68 65 20 2a 2e 7a 69 70 20 70 61  .** the *.zip pa
1ea50 74 74 65 72 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ttern..*/.#defin
1ea60 65 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c  e OPEN_DB_KEEPAL
1ea70 49 56 45 20 20 20 30 78 30 30 31 20 20 20 2f 2a  IVE   0x001   /*
1ea80 20 52 65 74 75 72 6e 20 61 66 74 65 72 20 65 72   Return after er
1ea90 72 6f 72 20 69 66 20 74 72 75 65 20 2a 2f 0a 23  ror if true */.#
1eaa0 64 65 66 69 6e 65 20 4f 50 45 4e 5f 44 42 5f 5a  define OPEN_DB_Z
1eab0 49 50 46 49 4c 45 20 20 20 20 20 30 78 30 30 32  IPFILE     0x002
1eac0 20 20 20 2f 2a 20 4f 70 65 6e 20 61 73 20 5a 49     /* Open as ZI
1ead0 50 20 69 66 20 6e 61 6d 65 20 6d 61 74 63 68 65  P if name matche
1eae0 73 20 2a 2e 7a 69 70 20 2a 2f 0a 0a 2f 2a 0a 2a  s *.zip */../*.*
1eaf0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
1eb00 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
1eb10 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
1eb20 20 74 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20   then open it.  
1eb30 49 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  If.** the databa
1eb40 73 65 20 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e  se fails to open
1eb50 2c 20 70 72 69 6e 74 20 61 6e 20 65 72 72 6f 72  , print an error
1eb60 20 6d 65 73 73 61 67 65 20 61 6e 64 20 65 78 69   message and exi
1eb70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1eb80 64 20 6f 70 65 6e 5f 64 62 28 53 68 65 6c 6c 53  d open_db(ShellS
1eb90 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 6f 70 65  tate *p, int ope
1eba0 6e 46 6c 61 67 73 29 7b 0a 20 20 69 66 28 20 70  nFlags){.  if( p
1ebb0 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ->db==0 ){.    i
1ebc0 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d  f( p->openMode==
1ebd0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45  SHELL_OPEN_UNSPE
1ebe0 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  C ){.      if( p
1ebf0 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d 30  ->zDbFilename==0
1ec00 20 7c 7c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61   || p->zDbFilena
1ec10 6d 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  me[0]==0 ){.    
1ec20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20      p->openMode 
1ec30 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52  = SHELL_OPEN_NOR
1ec40 4d 41 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MAL;.      }else
1ec50 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65  {.        p->ope
1ec60 6e 4d 6f 64 65 20 3d 20 28 75 38 29 64 65 64 75  nMode = (u8)dedu
1ec70 63 65 44 61 74 61 62 61 73 65 54 79 70 65 28 70  ceDatabaseType(p
1ec80 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 0a  ->zDbFilename, .
1ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 70               (op
1ecb0 65 6e 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f 44  enFlags & OPEN_D
1ecc0 42 5f 5a 49 50 46 49 4c 45 29 21 3d 30 29 3b 0a  B_ZIPFILE)!=0);.
1ecd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ece0 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 65    switch( p->ope
1ecf0 6e 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63  nMode ){.      c
1ed00 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41  ase SHELL_OPEN_A
1ed10 50 50 45 4e 44 56 46 53 3a 20 7b 0a 20 20 20 20  PPENDVFS: {.    
1ed20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e      sqlite3_open
1ed30 5f 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61  _v2(p->zDbFilena
1ed40 6d 65 2c 20 26 70 2d 3e 64 62 2c 20 0a 20 20 20  me, &p->db, .   
1ed50 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1ed60 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
1ed70 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1ed80 2c 20 22 61 70 6e 64 76 66 73 22 29 3b 0a 20 20  , "apndvfs");.  
1ed90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1eda0 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
1edb0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44 42  SHELL_OPEN_HEXDB
1edc0 3a 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45  :.      case SHE
1edd0 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c  LL_OPEN_DESERIAL
1ede0 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  IZE: {.        s
1edf0 71 6c 69 74 65 33 5f 6f 70 65 6e 28 30 2c 20 26  qlite3_open(0, &
1ee00 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  p->db);.        
1ee10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1ee20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f       case SHELL_
1ee30 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3a 20 7b 0a  OPEN_ZIPFILE: {.
1ee40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1ee50 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22 2c  open(":memory:",
1ee60 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20   &p->db);.      
1ee70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1ee80 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c  .      case SHEL
1ee90 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3a  L_OPEN_READONLY:
1eea0 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
1eeb0 65 33 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a 44  e3_open_v2(p->zD
1eec0 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64  bFilename, &p->d
1eed0 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  b, SQLITE_OPEN_R
1eee0 45 41 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20  EADONLY, 0);.   
1eef0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ef00 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53    }.      case S
1ef10 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43  HELL_OPEN_UNSPEC
1ef20 3a 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45  :.      case SHE
1ef30 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3a 20  LL_OPEN_NORMAL: 
1ef40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ef50 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69 6c  3_open(p->zDbFil
1ef60 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 29 3b 0a  ename, &p->db);.
1ef70 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1ef80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1ef90 20 67 6c 6f 62 61 6c 44 62 20 3d 20 70 2d 3e 64   globalDb = p->d
1efa0 62 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62  b;.    if( p->db
1efb0 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  ==0 || SQLITE_OK
1efc0 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  !=sqlite3_errcod
1efd0 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  e(p->db) ){.    
1efe0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1eff0 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e 61  derr,"Error: una
1f000 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
1f010 62 61 73 65 20 5c 22 25 73 5c 22 3a 20 25 73 5c  base \"%s\": %s\
1f020 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d  n",.          p-
1f030 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 73 71  >zDbFilename, sq
1f040 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
1f050 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  db));.      if( 
1f060 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 50 45 4e  openFlags & OPEN
1f070 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45 20 29 7b  _DB_KEEPALIVE ){
1f080 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f090 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22  _open(":memory:"
1f0a0 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  , &p->db);.     
1f0b0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
1f0c0 20 7d 0a 20 20 20 20 20 20 65 78 69 74 28 31 29   }.      exit(1)
1f0d0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1f0e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
1f0f0 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 73  _EXTENSION.    s
1f100 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f  qlite3_enable_lo
1f110 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e  ad_extension(p->
1f120 64 62 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20  db, 1);.#endif. 
1f130 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69     sqlite3_filei
1f140 6f 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c  o_init(p->db, 0,
1f150 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1f160 5f 73 68 61 74 68 72 65 65 5f 69 6e 69 74 28 70  _shathree_init(p
1f170 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
1f180 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
1f190 69 6f 6e 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  ion_init(p->db, 
1f1a0 30 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51  0, 0);.#ifdef SQ
1f1b0 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 20  LITE_HAVE_ZLIB. 
1f1c0 20 20 20 73 71 6c 69 74 65 33 5f 7a 69 70 66 69     sqlite3_zipfi
1f1d0 6c 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30  le_init(p->db, 0
1f1e0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1f1f0 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 70 2d 3e  3_sqlar_init(p->
1f200 64 62 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69  db, 0, 0);.#endi
1f210 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  f.    sqlite3_cr
1f220 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d  eate_function(p-
1f230 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 61 64 64 5f  >db, "shell_add_
1f240 73 63 68 65 6d 61 22 2c 20 33 2c 20 53 51 4c 49  schema", 3, SQLI
1f250 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
1f260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f270 20 20 20 20 20 20 20 20 73 68 65 6c 6c 41 64 64          shellAdd
1f280 53 63 68 65 6d 61 4e 61 6d 65 2c 20 30 2c 20 30  SchemaName, 0, 0
1f290 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1f2a0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
1f2b0 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 6d 6f 64  ->db, "shell_mod
1f2c0 75 6c 65 5f 73 63 68 65 6d 61 22 2c 20 31 2c 20  ule_schema", 1, 
1f2d0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_UTF8, 0,.
1f2e0 20 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 73 68 65 6c              shel
1f300 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 2c 20 30  lModuleSchema, 0
1f310 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1f320 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1f330 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f  n(p->db, "shell_
1f340 70 75 74 73 6e 6c 22 2c 20 31 2c 20 53 51 4c 49  putsnl", 1, SQLI
1f350 54 45 5f 55 54 46 38 2c 20 70 2c 0a 20 20 20 20  TE_UTF8, p,.    
1f360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f370 20 20 20 20 20 20 20 20 73 68 65 6c 6c 50 75 74          shellPut
1f380 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 23 69  sFunc, 0, 0);.#i
1f390 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48  fndef SQLITE_NOH
1f3a0 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20 73  AVE_SYSTEM.    s
1f3b0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1f3c0 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 65  nction(p->db, "e
1f3d0 64 69 74 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  dit", 1, SQLITE_
1f3e0 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f400 20 20 20 20 20 65 64 69 74 46 75 6e 63 2c 20 30       editFunc, 0
1f410 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1f420 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1f430 6e 28 70 2d 3e 64 62 2c 20 22 65 64 69 74 22 2c  n(p->db, "edit",
1f440 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   2, SQLITE_UTF8,
1f450 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1f460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f470 65 64 69 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b  editFunc, 0, 0);
1f480 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1f490 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45  p->openMode==SHE
1f4a0 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 20  LL_OPEN_ZIPFILE 
1f4b0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
1f4c0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
1f4d0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
1f4e0 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20  "CREATE VIRTUAL 
1f4f0 54 41 42 4c 45 20 7a 69 70 20 55 53 49 4e 47 20  TABLE zip USING 
1f500 7a 69 70 66 69 6c 65 28 25 51 29 3b 22 2c 20 70  zipfile(%Q);", p
1f510 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a  ->zDbFilename);.
1f520 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
1f530 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  ec(p->db, zSql, 
1f540 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
1f550 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
1f560 6c 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  l);.    }.#ifdef
1f570 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
1f580 45 53 45 52 49 41 4c 49 5a 45 0a 20 20 20 20 65  ESERIALIZE.    e
1f590 6c 73 65 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  lse.    if( p->o
1f5a0 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f  penMode==SHELL_O
1f5b0 50 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a 45 20  PEN_DESERIALIZE 
1f5c0 7c 7c 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d  || p->openMode==
1f5d0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44 42  SHELL_OPEN_HEXDB
1f5e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
1f5f0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 61 74  ;.      int nDat
1f600 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 73  a = 0;.      uns
1f610 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
1f620 61 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  a;.      if( p->
1f630 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f  openMode==SHELL_
1f640 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a 45  OPEN_DESERIALIZE
1f650 20 29 7b 0a 20 20 20 20 20 20 20 20 61 44 61 74   ){.        aDat
1f660 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
1f670 61 72 2a 29 72 65 61 64 46 69 6c 65 28 70 2d 3e  ar*)readFile(p->
1f680 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 6e 44  zDbFilename, &nD
1f690 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ata);.      }els
1f6a0 65 7b 0a 20 20 20 20 20 20 20 20 61 44 61 74 61  e{.        aData
1f6b0 20 3d 20 72 65 61 64 48 65 78 44 62 28 70 2c 20   = readHexDb(p, 
1f6c0 26 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  &nData);.       
1f6d0 20 69 66 28 20 61 44 61 74 61 3d 3d 30 20 29 7b   if( aData==0 ){
1f6e0 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
1f6f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1f700 45 72 72 6f 72 20 69 6e 20 68 65 78 64 62 20 69  Error in hexdb i
1f710 6e 70 75 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20  nput\n");.      
1f720 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1f730 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1f740 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f750 5f 64 65 73 65 72 69 61 6c 69 7a 65 28 70 2d 3e  _deserialize(p->
1f760 64 62 2c 20 22 6d 61 69 6e 22 2c 20 61 44 61 74  db, "main", aDat
1f770 61 2c 20 6e 44 61 74 61 2c 20 6e 44 61 74 61 2c  a, nData, nData,
1f780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f790 20 20 20 20 53 51 4c 49 54 45 5f 44 45 53 45 52      SQLITE_DESER
1f7a0 49 41 4c 49 5a 45 5f 52 45 53 49 5a 45 41 42 4c  IALIZE_RESIZEABL
1f7b0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
1f7c0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
1f7d0 53 45 52 49 41 4c 49 5a 45 5f 46 52 45 45 4f 4e  SERIALIZE_FREEON
1f7e0 43 4c 4f 53 45 29 3b 0a 20 20 20 20 20 20 69 66  CLOSE);.      if
1f7f0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1f800 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1f810 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 71 6c 69  rr, "Error: sqli
1f820 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a 65 28  te3_deserialize(
1f830 29 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c  ) returns %d\n",
1f840 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc);.      }.  
1f850 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 78      if( p->szMax
1f860 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >0 ){.        sq
1f870 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
1f880 6f 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22  ol(p->db, "main"
1f890 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  , SQLITE_FCNTL_S
1f8a0 49 5a 45 5f 4c 49 4d 49 54 2c 20 26 70 2d 3e 73  IZE_LIMIT, &p->s
1f8b0 7a 4d 61 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zMax);.      }. 
1f8c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
1f8d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
1f8e0 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 61   to close the da
1f8f0 74 61 62 61 65 73 20 63 6f 6e 6e 65 63 74 69 6f  tabaes connectio
1f900 6e 2e 20 20 52 65 70 6f 72 74 20 65 72 72 6f 72  n.  Report error
1f910 73 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6c 6f 73 65  s..*/.void close
1f920 5f 64 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29  _db(sqlite3 *db)
1f930 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
1f940 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  ite3_close(db);.
1f950 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1f960 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1f970 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 71 6c 69  rr, "Error: sqli
1f980 74 65 33 5f 63 6c 6f 73 65 28 29 20 72 65 74 75  te3_close() retu
1f990 72 6e 73 20 25 64 3a 20 25 73 5c 6e 22 2c 0a 20  rns %d: %s\n",. 
1f9a0 20 20 20 20 20 20 20 72 63 2c 20 73 71 6c 69 74         rc, sqlit
1f9b0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
1f9c0 20 20 7d 20 0a 7d 0a 0a 23 69 66 20 48 41 56 45    } .}..#if HAVE
1f9d0 5f 52 45 41 44 4c 49 4e 45 20 7c 7c 20 48 41 56  _READLINE || HAV
1f9e0 45 5f 45 44 49 54 4c 49 4e 45 0a 2f 2a 0a 2a 2a  E_EDITLINE./*.**
1f9f0 20 52 65 61 64 6c 69 6e 65 20 63 6f 6d 70 6c 65   Readline comple
1fa00 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 0a 2a  tion callbacks.*
1fa10 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72  /.static char *r
1fa20 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69  eadline_completi
1fa30 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 28 63 6f 6e  on_generator(con
1fa40 73 74 20 63 68 61 72 20 2a 74 65 78 74 2c 20 69  st char *text, i
1fa50 6e 74 20 73 74 61 74 65 29 7b 0a 20 20 73 74 61  nt state){.  sta
1fa60 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  tic sqlite3_stmt
1fa70 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
1fa80 68 61 72 20 2a 7a 52 65 74 3b 0a 20 20 69 66 28  har *zRet;.  if(
1fa90 20 73 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20   state==0 ){.   
1faa0 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20   char *zSql;.   
1fab0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1fac0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53  e(pStmt);.    zS
1fad0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
1fae0 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49 53  intf("SELECT DIS
1faf0 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20  TINCT candidate 
1fb00 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a  COLLATE nocase".
1fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52             "  FR
1fb30 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51  OM completion(%Q
1fb40 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c 20 74  ) ORDER BY 1", t
1fb50 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ext);.    sqlite
1fb60 33 5f 70 72 65 70 61 72 65 5f 76 32 28 67 6c 6f  3_prepare_v2(glo
1fb70 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  balDb, zSql, -1,
1fb80 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
1fb90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
1fba0 71 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ql);.  }.  if( s
1fbb0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
1fbc0 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
1fbd0 7b 0a 20 20 20 20 7a 52 65 74 20 3d 20 73 74 72  {.    zRet = str
1fbe0 64 75 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  dup((const char*
1fbf0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
1fc00 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b  text(pStmt, 0));
1fc10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1fc20 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1fc30 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74  Stmt);.    pStmt
1fc40 20 3d 20 30 3b 0a 20 20 20 20 7a 52 65 74 20 3d   = 0;.    zRet =
1fc50 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1fc60 20 7a 52 65 74 3b 0a 7d 0a 73 74 61 74 69 63 20   zRet;.}.static 
1fc70 63 68 61 72 20 2a 2a 72 65 61 64 6c 69 6e 65 5f  char **readline_
1fc80 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74  completion(const
1fc90 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e   char *zText, in
1fca0 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 45  t iStart, int iE
1fcb0 6e 64 29 7b 0a 20 20 72 6c 5f 61 74 74 65 6d 70  nd){.  rl_attemp
1fcc0 74 65 64 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6f  ted_completion_o
1fcd0 76 65 72 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  ver = 1;.  retur
1fce0 6e 20 72 6c 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f  n rl_completion_
1fcf0 6d 61 74 63 68 65 73 28 7a 54 65 78 74 2c 20 72  matches(zText, r
1fd00 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69  eadline_completi
1fd10 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 29 3b 0a 7d  on_generator);.}
1fd20 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c 49 4e  ..#elif HAVE_LIN
1fd30 45 4e 4f 49 53 45 0a 2f 2a 0a 2a 2a 20 4c 69 6e  ENOISE./*.** Lin
1fd40 65 6e 6f 69 73 65 20 63 6f 6d 70 6c 65 74 69 6f  enoise completio
1fd50 6e 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74  n callback.*/.st
1fd60 61 74 69 63 20 76 6f 69 64 20 6c 69 6e 65 6e 6f  atic void lineno
1fd70 69 73 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63  ise_completion(c
1fd80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e 65  onst char *zLine
1fd90 2c 20 6c 69 6e 65 6e 6f 69 73 65 43 6f 6d 70 6c  , linenoiseCompl
1fda0 65 74 69 6f 6e 73 20 2a 6c 63 29 7b 0a 20 20 69  etions *lc){.  i
1fdb0 6e 74 20 6e 4c 69 6e 65 20 3d 20 73 74 72 6c 65  nt nLine = strle
1fdc0 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 69 6e  n30(zLine);.  in
1fdd0 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 73  t i, iStart;.  s
1fde0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1fdf0 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  mt = 0;.  char *
1fe00 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75  zSql;.  char zBu
1fe10 66 5b 31 30 30 30 5d 3b 0a 0a 20 20 69 66 28 20  f[1000];..  if( 
1fe20 6e 4c 69 6e 65 3e 73 69 7a 65 6f 66 28 7a 42 75  nLine>sizeof(zBu
1fe30 66 29 2d 33 30 20 29 20 72 65 74 75 72 6e 3b 0a  f)-30 ) return;.
1fe40 20 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d    if( zLine[0]==
1fe50 27 2e 27 20 7c 7c 20 7a 4c 69 6e 65 5b 30 5d 3d  '.' || zLine[0]=
1fe60 3d 27 23 27 29 20 72 65 74 75 72 6e 3b 0a 20 20  ='#') return;.  
1fe70 66 6f 72 28 69 3d 6e 4c 69 6e 65 2d 31 3b 20 69  for(i=nLine-1; i
1fe80 3e 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28  >=0 && (isalnum(
1fe90 7a 4c 69 6e 65 5b 69 5d 29 20 7c 7c 20 7a 4c 69  zLine[i]) || zLi
1fea0 6e 65 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69 2d 2d  ne[i]=='_'); i--
1feb0 29 7b 7d 0a 20 20 69 66 28 20 69 3d 3d 6e 4c 69  ){}.  if( i==nLi
1fec0 6e 65 2d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  ne-1 ) return;. 
1fed0 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20   iStart = i+1;. 
1fee0 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c   memcpy(zBuf, zL
1fef0 69 6e 65 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  ine, iStart);.  
1ff00 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
1ff10 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44  printf("SELECT D
1ff20 49 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74  ISTINCT candidat
1ff30 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  e COLLATE nocase
1ff40 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
1ff50 20 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52             "  FR
1ff60 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51  OM completion(%Q
1ff70 2c 25 51 29 20 4f 52 44 45 52 20 42 59 20 31 22  ,%Q) ORDER BY 1"
1ff80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ff90 20 20 20 20 20 20 20 20 20 20 20 26 7a 4c 69 6e             &zLin
1ffa0 65 5b 69 53 74 61 72 74 5d 2c 20 7a 4c 69 6e 65  e[iStart], zLine
1ffb0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65  );.  sqlite3_pre
1ffc0 70 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62  pare_v2(globalDb
1ffd0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
1ffe0 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
1fff0 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
20000 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67 6c 6f  sqlite3_exec(glo
20010 62 61 6c 44 62 2c 20 22 50 52 41 47 4d 41 20 70  balDb, "PRAGMA p
20020 61 67 65 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 30  age_count", 0, 0
20030 2c 20 30 29 3b 20 2f 2a 20 4c 6f 61 64 20 74 68  , 0); /* Load th
20040 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 77 68  e schema */.  wh
20050 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
20060 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
20070 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73  _ROW ){.    cons
20080 74 20 63 68 61 72 20 2a 7a 43 6f 6d 70 6c 65 74  t char *zComplet
20090 69 6f 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ion = (const cha
200a0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
200b0 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
200c0 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6d 70 6c  ;.    int nCompl
200d0 65 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f  etion = sqlite3_
200e0 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
200f0 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
20100 69 53 74 61 72 74 2b 6e 43 6f 6d 70 6c 65 74 69  iStart+nCompleti
20110 6f 6e 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66  on < sizeof(zBuf
20120 29 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  )-1 ){.      mem
20130 63 70 79 28 7a 42 75 66 2b 69 53 74 61 72 74 2c  cpy(zBuf+iStart,
20140 20 7a 43 6f 6d 70 6c 65 74 69 6f 6e 2c 20 6e 43   zCompletion, nC
20150 6f 6d 70 6c 65 74 69 6f 6e 2b 31 29 3b 0a 20 20  ompletion+1);.  
20160 20 20 20 20 6c 69 6e 65 6e 6f 69 73 65 41 64 64      linenoiseAdd
20170 43 6f 6d 70 6c 65 74 69 6f 6e 28 6c 63 2c 20 7a  Completion(lc, z
20180 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Buf);.    }.  }.
20190 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
201a0 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 23 65 6e  ze(pStmt);.}.#en
201b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d  dif../*.** Do C-
201c0 6c 61 6e 67 75 61 67 65 20 73 74 79 6c 65 20 64  language style d
201d0 65 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  equoting..**.** 
201e0 20 20 20 5c 61 20 20 20 20 2d 3e 20 61 6c 61 72     \a    -> alar
201f0 6d 0a 2a 2a 20 20 20 20 5c 62 20 20 20 20 2d 3e  m.**    \b    ->
20200 20 62 61 63 6b 73 70 61 63 65 0a 2a 2a 20 20 20   backspace.**   
20210 20 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a 2a 2a   \t    -> tab.**
20220 20 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e 65 77      \n    -> new
20230 6c 69 6e 65 0a 2a 2a 20 20 20 20 5c 76 20 20 20  line.**    \v   
20240 20 2d 3e 20 76 65 72 74 69 63 61 6c 20 74 61 62   -> vertical tab
20250 0a 2a 2a 20 20 20 20 5c 66 20 20 20 20 2d 3e 20  .**    \f    -> 
20260 66 6f 72 6d 20 66 65 65 64 0a 2a 2a 20 20 20 20  form feed.**    
20270 5c 72 20 20 20 20 2d 3e 20 63 61 72 72 69 61 67  \r    -> carriag
20280 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 20 5c  e return.**    \
20290 73 20 20 20 20 2d 3e 20 73 70 61 63 65 0a 2a 2a  s    -> space.**
202a0 20 20 20 20 5c 22 20 20 20 20 2d 3e 20 22 0a 2a      \"    -> ".*
202b0 2a 20 20 20 20 5c 27 20 20 20 20 2d 3e 20 27 0a  *    \'    -> '.
202c0 2a 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e 20 62  **    \\    -> b
202d0 61 63 6b 73 6c 61 73 68 0a 2a 2a 20 20 20 20 5c  ackslash.**    \
202e0 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20 63 68  NNN  -> ascii ch
202f0 61 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e 20 6f  aracter NNN in o
20300 63 74 61 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ctal.*/.static v
20310 6f 69 64 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b  oid resolve_back
20320 73 6c 61 73 68 65 73 28 63 68 61 72 20 2a 7a 29  slashes(char *z)
20330 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
20340 63 68 61 72 20 63 3b 0a 20 20 77 68 69 6c 65 28  char c;.  while(
20350 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 5c 27 20   *z && *z!='\\' 
20360 29 20 7a 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a  ) z++;.  for(i=j
20370 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
20380 30 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  0; i++, j++){.  
20390 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 26 26    if( c=='\\' &&
203a0 20 7a 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a 20 20   z[i+1]!=0 ){.  
203b0 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a      c = z[++i];.
203c0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 61 27        if( c=='a'
203d0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
203e0 27 5c 61 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\a';.      }els
203f0 65 20 69 66 28 20 63 3d 3d 27 62 27 20 29 7b 0a  e if( c=='b' ){.
20400 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 62 27          c = '\b'
20410 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
20420 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20  ( c=='t' ){.    
20430 20 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20      c = '\t';.  
20440 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
20450 3d 27 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='n' ){.        
20460 63 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20  c = '\n';.      
20470 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 76 27  }else if( c=='v'
20480 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
20490 27 5c 76 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\v';.      }els
204a0 65 20 69 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a  e if( c=='f' ){.
204b0 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 66 27          c = '\f'
204c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
204d0 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20  ( c=='r' ){.    
204e0 20 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20      c = '\r';.  
204f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
20500 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='"' ){.        
20510 63 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 7d  c = '"';.      }
20520 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 27 27  else if( c=='\''
20530 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
20540 27 5c 27 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\'';.      }els
20550 65 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b  e if( c=='\\' ){
20560 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 5c  .        c = '\\
20570 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
20580 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d  f( c>='0' && c<=
20590 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  '7' ){.        c
205a0 20 2d 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 20   -= '0';.       
205b0 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27   if( z[i+1]>='0'
205c0 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20   && z[i+1]<='7' 
205d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b  ){.          i++
205e0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
205f0 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20  (c<<3) + z[i] - 
20600 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69  '0';.          i
20610 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26  f( z[i+1]>='0' &
20620 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b  & z[i+1]<='7' ){
20630 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b  .            i++
20640 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 20  ;.            c 
20650 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20  = (c<<3) + z[i] 
20660 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20  - '0';.         
20670 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
20680 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
20690 5b 6a 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69  [j] = c;.  }.  i
206a0 66 28 20 6a 3c 69 20 29 20 7a 5b 6a 5d 20 3d 20  f( j<i ) z[j] = 
206b0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  0;.}../*.** Inte
206c0 72 70 72 65 74 20 7a 41 72 67 20 61 73 20 65 69  rpret zArg as ei
206d0 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20  ther an integer 
206e0 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  or a boolean val
206f0 75 65 2e 20 20 52 65 74 75 72 6e 20 31 20 6f 72  ue.  Return 1 or
20700 20 30 0a 2a 2a 20 66 6f 72 20 54 52 55 45 20 61   0.** for TRUE a
20710 6e 64 20 46 41 4c 53 45 2e 20 20 52 65 74 75 72  nd FALSE.  Retur
20720 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  n the integer va
20730 6c 75 65 20 69 66 20 61 70 70 72 6f 70 72 69 61  lue if appropria
20740 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
20750 74 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 63  t booleanValue(c
20760 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29  onst char *zArg)
20770 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
20780 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26   zArg[0]=='0' &&
20790 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b   zArg[1]=='x' ){
207a0 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20 68 65  .    for(i=2; he
207b0 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67  xDigitValue(zArg
207c0 5b 69 5d 29 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a  [i])>=0; i++){}.
207d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
207e0 28 69 3d 30 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27  (i=0; zArg[i]>='
207f0 30 27 20 26 26 20 7a 41 72 67 5b 69 5d 3c 3d 27  0' && zArg[i]<='
20800 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 0a 20  9'; i++){}.  }. 
20810 20 69 66 28 20 69 3e 30 20 26 26 20 7a 41 72 67   if( i>0 && zArg
20820 5b 69 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  [i]==0 ) return 
20830 28 69 6e 74 29 28 69 6e 74 65 67 65 72 56 61 6c  (int)(integerVal
20840 75 65 28 7a 41 72 67 29 20 26 20 30 78 66 66 66  ue(zArg) & 0xfff
20850 66 66 66 66 66 29 3b 0a 20 20 69 66 28 20 73 71  fffff);.  if( sq
20860 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41  lite3_stricmp(zA
20870 72 67 2c 20 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20  rg, "on")==0 || 
20880 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
20890 7a 41 72 67 2c 22 79 65 73 22 29 3d 3d 30 20 29  zArg,"yes")==0 )
208a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
208b0 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
208c0 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20  3_stricmp(zArg, 
208d0 22 6f 66 66 22 29 3d 3d 30 20 7c 7c 20 73 71 6c  "off")==0 || sql
208e0 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
208f0 67 2c 22 6e 6f 22 29 3d 3d 30 20 29 7b 0a 20 20  g,"no")==0 ){.  
20900 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
20910 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
20920 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f  derr, "ERROR: No
20930 74 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  t a boolean valu
20940 65 3a 20 5c 22 25 73 5c 22 2e 20 41 73 73 75 6d  e: \"%s\". Assum
20950 69 6e 67 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a  ing \"no\".\n",.
20960 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 29 3b            zArg);
20970 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
20980 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65  /*.** Set or cle
20990 61 72 20 61 20 73 68 65 6c 6c 20 66 6c 61 67 20  ar a shell flag 
209a0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 20 62  according to a b
209b0 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f  oolean value..*/
209c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
209d0 4f 72 43 6c 65 61 72 46 6c 61 67 28 53 68 65 6c  OrClearFlag(Shel
209e0 6c 53 74 61 74 65 20 2a 70 2c 20 75 6e 73 69 67  lState *p, unsig
209f0 6e 65 64 20 6d 46 6c 61 67 2c 20 63 6f 6e 73 74  ned mFlag, const
20a00 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20   char *zArg){.  
20a10 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  if( booleanValue
20a20 28 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 53 68  (zArg) ){.    Sh
20a30 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 6d 46  ellSetFlag(p, mF
20a40 6c 61 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lag);.  }else{. 
20a50 20 20 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61     ShellClearFla
20a60 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d  g(p, mFlag);.  }
20a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
20a80 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2c 20  an output file, 
20a90 61 73 73 75 6d 69 6e 67 20 69 74 20 69 73 20 6e  assuming it is n
20aa0 6f 74 20 73 74 64 65 72 72 20 6f 72 20 73 74 64  ot stderr or std
20ab0 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  out.*/.static vo
20ac0 69 64 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63  id output_file_c
20ad0 6c 6f 73 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20  lose(FILE *f){. 
20ae0 20 69 66 28 20 66 20 26 26 20 66 21 3d 73 74 64   if( f && f!=std
20af0 6f 75 74 20 26 26 20 66 21 3d 73 74 64 65 72 72  out && f!=stderr
20b00 20 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a   ) fclose(f);.}.
20b10 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 70  ./*.** Try to op
20b20 65 6e 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c  en an output fil
20b30 65 2e 20 20 20 54 68 65 20 6e 61 6d 65 73 20 22  e.   The names "
20b40 73 74 64 6f 75 74 22 20 61 6e 64 20 22 73 74 64  stdout" and "std
20b50 65 72 72 22 20 61 72 65 0a 2a 2a 20 72 65 63 6f  err" are.** reco
20b60 67 6e 69 7a 65 64 20 61 6e 64 20 64 6f 20 74 68  gnized and do th
20b70 65 20 72 69 67 68 74 20 74 68 69 6e 67 2e 20 20  e right thing.  
20b80 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
20b90 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 0a 2a   if the output.*
20ba0 2a 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 22 6f  * filename is "o
20bb0 66 66 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46  ff"..*/.static F
20bc0 49 4c 45 20 2a 6f 75 74 70 75 74 5f 66 69 6c 65  ILE *output_file
20bd0 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  _open(const char
20be0 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 62 54 65   *zFile, int bTe
20bf0 78 74 4d 6f 64 65 29 7b 0a 20 20 46 49 4c 45 20  xtMode){.  FILE 
20c00 2a 66 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  *f;.  if( strcmp
20c10 28 7a 46 69 6c 65 2c 22 73 74 64 6f 75 74 22 29  (zFile,"stdout")
20c20 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 73  ==0 ){.    f = s
20c30 74 64 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69  tdout;.  }else i
20c40 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c  f( strcmp(zFile,
20c50 20 22 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b   "stderr")==0 ){
20c60 0a 20 20 20 20 66 20 3d 20 73 74 64 65 72 72 3b  .    f = stderr;
20c70 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
20c80 63 6d 70 28 7a 46 69 6c 65 2c 20 22 6f 66 66 22  cmp(zFile, "off"
20c90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20  )==0 ){.    f = 
20ca0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
20cb0 66 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c  f = fopen(zFile,
20cc0 20 62 54 65 78 74 4d 6f 64 65 20 3f 20 22 77 22   bTextMode ? "w"
20cd0 20 3a 20 22 77 62 22 29 3b 0a 20 20 20 20 69 66   : "wb");.    if
20ce0 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( f==0 ){.      
20cf0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
20d00 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rr, "Error: cann
20d10 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e  ot open \"%s\"\n
20d20 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ", zFile);.    }
20d30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 3b  .  }.  return f;
20d40 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
20d50 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
20d60 0a 2a 2a 20 41 20 72 6f 75 74 69 6e 65 20 66 6f  .** A routine fo
20d70 72 20 68 61 6e 64 6c 69 6e 67 20 6f 75 74 70 75  r handling outpu
20d80 74 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 74  t from sqlite3_t
20d90 72 61 63 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  race()..*/.stati
20da0 63 20 69 6e 74 20 73 71 6c 5f 74 72 61 63 65 5f  c int sql_trace_
20db0 63 61 6c 6c 62 61 63 6b 28 0a 20 20 75 6e 73 69  callback(.  unsi
20dc0 67 6e 65 64 20 6d 54 79 70 65 2c 20 20 20 20 20  gned mType,     
20dd0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 63 65      /* The trace
20de0 20 74 79 70 65 20 2a 2f 0a 20 20 76 6f 69 64 20   type */.  void 
20df0 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
20e00 20 20 20 2f 2a 20 54 68 65 20 53 68 65 6c 6c 53     /* The ShellS
20e10 74 61 74 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  tate pointer */.
20e20 20 20 76 6f 69 64 20 2a 70 50 2c 20 20 20 20 20    void *pP,     
20e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 75            /* Usu
20e40 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
20e50 6f 20 73 71 6c 69 74 65 5f 73 74 6d 74 20 2a 2f  o sqlite_stmt */
20e60 0a 20 20 76 6f 69 64 20 2a 70 58 20 20 20 20 20  .  void *pX     
20e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75             /* Au
20e80 78 69 6c 69 61 72 79 20 6f 75 74 70 75 74 20 2a  xiliary output *
20e90 2f 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74  /.){.  ShellStat
20ea0 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
20eb0 74 65 2a 29 70 41 72 67 3b 0a 20 20 73 71 6c 69  te*)pArg;.  sqli
20ec0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
20ed0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
20ee0 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 53 71 6c 3b  Sql;.  int nSql;
20ef0 0a 20 20 69 66 28 20 70 2d 3e 74 72 61 63 65 4f  .  if( p->traceO
20f00 75 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ut==0 ) return 0
20f10 3b 0a 20 20 69 66 28 20 6d 54 79 70 65 3d 3d 53  ;.  if( mType==S
20f20 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53  QLITE_TRACE_CLOS
20f30 45 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  E ){.    utf8_pr
20f40 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75 74  intf(p->traceOut
20f50 2c 20 22 2d 2d 20 63 6c 6f 73 69 6e 67 20 64 61  , "-- closing da
20f60 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
20f70 6e 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  n\n");.    retur
20f80 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  n 0;.  }.  if( m
20f90 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 54 52 41  Type!=SQLITE_TRA
20fa0 43 45 5f 52 4f 57 20 26 26 20 28 28 63 6f 6e 73  CE_ROW && ((cons
20fb0 74 20 63 68 61 72 2a 29 70 58 29 5b 30 5d 3d 3d  t char*)pX)[0]==
20fc0 27 2d 27 20 29 7b 0a 20 20 20 20 7a 53 71 6c 20  '-' ){.    zSql 
20fd0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  = (const char*)p
20fe0 58 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  X;.  }else{.    
20ff0 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65 33  pStmt = (sqlite3
21000 5f 73 74 6d 74 2a 29 70 50 3b 0a 20 20 20 20 73  _stmt*)pP;.    s
21010 77 69 74 63 68 28 20 70 2d 3e 65 54 72 61 63 65  witch( p->eTrace
21020 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  Type ){.      ca
21030 73 65 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f 45  se SHELL_TRACE_E
21040 58 50 41 4e 44 45 44 3a 20 7b 0a 20 20 20 20 20  XPANDED: {.     
21050 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
21060 33 5f 65 78 70 61 6e 64 65 64 5f 73 71 6c 28 70  3_expanded_sql(p
21070 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Stmt);.        b
21080 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69  reak;.      }.#i
21090 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
210a0 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 20  LE_NORMALIZE.   
210b0 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 54 52     case SHELL_TR
210c0 41 43 45 5f 4e 4f 52 4d 41 4c 49 5a 45 44 3a 20  ACE_NORMALIZED: 
210d0 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d  {.        zSql =
210e0 20 73 71 6c 69 74 65 33 5f 6e 6f 72 6d 61 6c 69   sqlite3_normali
210f0 7a 65 64 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a  zed_sql(pStmt);.
21100 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
21110 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
21120 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
21130 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71         zSql = sq
21140 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29  lite3_sql(pStmt)
21150 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
21160 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21170 20 7d 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30   }.  if( zSql==0
21180 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
21190 53 71 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  Sql = strlen30(z
211a0 53 71 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  Sql);.  while( n
211b0 53 71 6c 3e 30 20 26 26 20 7a 53 71 6c 5b 6e 53  Sql>0 && zSql[nS
211c0 71 6c 2d 31 5d 3d 3d 27 3b 27 20 29 7b 20 6e 53  ql-1]==';' ){ nS
211d0 71 6c 2d 2d 3b 20 7d 0a 20 20 73 77 69 74 63 68  ql--; }.  switch
211e0 28 20 6d 54 79 70 65 20 29 7b 0a 20 20 20 20 63  ( mType ){.    c
211f0 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 43 45  ase SQLITE_TRACE
21200 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73 65 20 53  _ROW:.    case S
21210 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54  QLITE_TRACE_STMT
21220 3a 20 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  : {.      utf8_p
21230 72 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75  rintf(p->traceOu
21240 74 2c 20 22 25 2e 2a 73 3b 5c 6e 22 2c 20 6e 53  t, "%.*s;\n", nS
21250 71 6c 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  ql, zSql);.     
21260 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
21270 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52    case SQLITE_TR
21280 41 43 45 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20  ACE_PROFILE: {. 
21290 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
212a0 36 34 20 6e 4e 61 6e 6f 73 65 63 20 3d 20 2a 28  64 nNanosec = *(
212b0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70  sqlite3_int64*)p
212c0 58 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  X;.      utf8_pr
212d0 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75 74  intf(p->traceOut
212e0 2c 20 22 25 2e 2a 73 3b 20 2d 2d 20 25 6c 6c 64  , "%.*s; -- %lld
212f0 20 6e 73 5c 6e 22 2c 20 6e 53 71 6c 2c 20 7a 53   ns\n", nSql, zS
21300 71 6c 2c 20 6e 4e 61 6e 6f 73 65 63 29 3b 0a 20  ql, nNanosec);. 
21310 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21320 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
21330 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
21340 2a 20 41 20 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e  * A no-op routin
21350 65 20 74 68 61 74 20 72 75 6e 73 20 77 69 74 68  e that runs with
21360 20 74 68 65 20 22 2e 62 72 65 61 6b 70 6f 69 6e   the ".breakpoin
21370 74 22 20 64 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20  t" doc-command. 
21380 20 54 68 69 73 20 69 73 0a 2a 2a 20 61 20 75 73   This is.** a us
21390 65 66 75 6c 20 73 70 6f 74 20 74 6f 20 73 65 74  eful spot to set
213a0 20 61 20 64 65 62 75 67 67 65 72 20 62 72 65 61   a debugger brea
213b0 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  kpoint..*/.stati
213c0 63 20 76 6f 69 64 20 74 65 73 74 5f 62 72 65 61  c void test_brea
213d0 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20  kpoint(void){.  
213e0 73 74 61 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c  static int nCall
213f0 20 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b   = 0;.  nCall++;
21400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a  .}../*.** An obj
21410 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 61 64  ect used to read
21420 20 61 20 43 53 56 20 61 6e 64 20 6f 74 68 65 72   a CSV and other
21430 20 66 69 6c 65 73 20 66 6f 72 20 69 6d 70 6f 72   files for impor
21440 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
21450 72 75 63 74 20 49 6d 70 6f 72 74 43 74 78 20 49  ruct ImportCtx I
21460 6d 70 6f 72 74 43 74 78 3b 0a 73 74 72 75 63 74  mportCtx;.struct
21470 20 49 6d 70 6f 72 74 43 74 78 20 7b 0a 20 20 63   ImportCtx {.  c
21480 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
21490 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
214a0 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
214b0 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20    FILE *in;     
214c0 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
214d0 65 20 43 53 56 20 74 65 78 74 20 66 72 6f 6d 20  e CSV text from 
214e0 74 68 69 73 20 69 6e 70 75 74 20 73 74 72 65 61  this input strea
214f0 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  m */.  char *z; 
21500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63             /* Ac
21510 63 75 6d 75 6c 61 74 65 64 20 74 65 78 74 20 66  cumulated text f
21520 6f 72 20 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20  or a field */.  
21530 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
21540 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21550 20 62 79 74 65 73 20 69 6e 20 7a 20 2a 2f 0a 20   bytes in z */. 
21560 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20   int nAlloc;    
21570 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c       /* Space al
21580 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20  located for z[] 
21590 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20  */.  int nLine; 
215a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
215b0 65 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ent line number 
215c0 2a 2f 0a 20 20 69 6e 74 20 62 4e 6f 74 46 69 72  */.  int bNotFir
215d0 73 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  st;      /* True
215e0 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
215f0 62 79 74 65 73 20 61 6c 72 65 61 64 79 20 72 65  bytes already re
21600 61 64 20 2a 2f 0a 20 20 69 6e 74 20 63 54 65 72  ad */.  int cTer
21610 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  m;          /* C
21620 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65  haracter that te
21630 72 6d 69 6e 61 74 65 64 20 74 68 65 20 6d 6f 73  rminated the mos
21640 74 20 72 65 63 65 6e 74 20 66 69 65 6c 64 20 2a  t recent field *
21650 2f 0a 20 20 69 6e 74 20 63 43 6f 6c 53 65 70 3b  /.  int cColSep;
21660 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
21670 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20  olumn separator 
21680 63 68 61 72 61 63 74 65 72 2e 20 20 28 55 73 75  character.  (Usu
21690 61 6c 6c 79 20 22 2c 22 29 20 2a 2f 0a 20 20 69  ally ",") */.  i
216a0 6e 74 20 63 52 6f 77 53 65 70 3b 20 20 20 20 20  nt cRowSep;     
216b0 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 20 73 65     /* The row se
216c0 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
216d0 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 5c 6e  r.  (Usually "\n
216e0 22 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70  ") */.};../* App
216f0 65 6e 64 20 61 20 73 69 6e 67 6c 65 20 62 79 74  end a single byt
21700 65 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74  e to z[] */.stat
21710 69 63 20 76 6f 69 64 20 69 6d 70 6f 72 74 5f 61  ic void import_a
21720 70 70 65 6e 64 5f 63 68 61 72 28 49 6d 70 6f 72  ppend_char(Impor
21730 74 43 74 78 20 2a 70 2c 20 69 6e 74 20 63 29 7b  tCtx *p, int c){
21740 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70  .  if( p->n+1>=p
21750 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
21760 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e  p->nAlloc += p->
21770 6e 41 6c 6c 6f 63 20 2b 20 31 30 30 3b 0a 20 20  nAlloc + 100;.  
21780 20 20 70 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33    p->z = sqlite3
21790 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c  _realloc64(p->z,
217a0 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
217b0 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73   if( p->z==0 ) s
217c0 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
217d0 72 79 28 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a  ry();.  }.  p->z
217e0 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61 72  [p->n++] = (char
217f0 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61  )c;.}../* Read a
21800 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66   single field of
21810 20 43 53 56 20 74 65 78 74 2e 20 20 43 6f 6d 70   CSV text.  Comp
21820 61 74 69 62 6c 65 20 77 69 74 68 20 72 66 63 34  atible with rfc4
21830 31 38 30 20 61 6e 64 20 65 78 74 65 6e 64 65 64  180 and extended
21840 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 70 74  .** with the opt
21850 69 6f 6e 20 6f 66 20 68 61 76 69 6e 67 20 61 20  ion of having a 
21860 73 65 70 61 72 61 74 6f 72 20 6f 74 68 65 72 20  separator other 
21870 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20  than ","..**.** 
21880 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65 73    +  Input comes
21890 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20   from p->in..** 
218a0 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75 6c    +  Store resul
218b0 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65  ts in p->z of le
218c0 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63  ngth p->n.  Spac
218d0 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63  e to hold p->z c
218e0 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f  omes.**      fro
218f0 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
21900 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73  64()..**   +  Us
21910 65 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68 65  e p->cSep as the
21920 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
21930 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  r.  The default 
21940 69 73 20 22 2c 22 2e 0a 2a 2a 20 20 20 2b 20 20  is ","..**   +  
21950 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74  Use p->rSep as t
21960 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  he row separator
21970 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
21980 73 20 22 5c 6e 22 2e 0a 2a 2a 20 20 20 2b 20 20  s "\n"..**   +  
21990 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
219a0 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e  e line number in
219b0 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20   p->nLine..**   
219c0 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61  +  Store the cha
219d0 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d  racter that term
219e0 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64  inates the field
219f0 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53   in p->cTerm.  S
21a00 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46  tore.**      EOF
21a10 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e   on end-of-file.
21a20 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20  .**   +  Report 
21a30 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e  syntax errors on
21a40 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69   stderr.*/.stati
21a50 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43  c char *SQLITE_C
21a60 44 45 43 4c 20 63 73 76 5f 72 65 61 64 5f 6f 6e  DECL csv_read_on
21a70 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43 74  e_field(ImportCt
21a80 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a  x *p){.  int c;.
21a90 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e    int cSep = p->
21aa0 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72  cColSep;.  int r
21ab0 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70  Sep = p->cRowSep
21ac0 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20  ;.  p->n = 0;.  
21ad0 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
21ae0 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c  ;.  if( c==EOF |
21af0 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20  | seenInterrupt 
21b00 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20  ){.    p->cTerm 
21b10 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 72  = EOF;.    retur
21b20 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  n 0;.  }.  if( c
21b30 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 69 6e 74  =='"' ){.    int
21b40 20 70 63 2c 20 70 70 63 3b 0a 20 20 20 20 69 6e   pc, ppc;.    in
21b50 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 70 2d  t startLine = p-
21b60 3e 6e 4c 69 6e 65 3b 0a 20 20 20 20 69 6e 74 20  >nLine;.    int 
21b70 63 51 75 6f 74 65 20 3d 20 63 3b 0a 20 20 20 20  cQuote = c;.    
21b80 70 63 20 3d 20 70 70 63 20 3d 20 30 3b 0a 20 20  pc = ppc = 0;.  
21b90 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
21ba0 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d      c = fgetc(p-
21bb0 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >in);.      if( 
21bc0 63 3d 3d 72 53 65 70 20 29 20 70 2d 3e 6e 4c 69  c==rSep ) p->nLi
21bd0 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ne++;.      if( 
21be0 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20 20  c==cQuote ){.   
21bf0 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51 75       if( pc==cQu
21c00 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ote ){.         
21c10 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   pc = 0;.       
21c20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
21c30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
21c40 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63 53 65       if( (c==cSe
21c50 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29  p && pc==cQuote)
21c60 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72  .       || (c==r
21c70 53 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74  Sep && pc==cQuot
21c80 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d  e).       || (c=
21c90 3d 72 53 65 70 20 26 26 20 70 63 3d 3d 27 5c 72  =rSep && pc=='\r
21ca0 27 20 26 26 20 70 70 63 3d 3d 63 51 75 6f 74 65  ' && ppc==cQuote
21cb0 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d  ).       || (c==
21cc0 45 4f 46 20 26 26 20 70 63 3d 3d 63 51 75 6f 74  EOF && pc==cQuot
21cd0 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  e).      ){.    
21ce0 20 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20      do{ p->n--; 
21cf0 7d 77 68 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e  }while( p->z[p->
21d00 6e 5d 21 3d 63 51 75 6f 74 65 20 29 3b 0a 20 20  n]!=cQuote );.  
21d10 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d        p->cTerm =
21d20 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   c;.        brea
21d30 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
21d40 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20   if( pc==cQuote 
21d50 26 26 20 63 21 3d 27 5c 72 27 20 29 7b 0a 20 20  && c!='\r' ){.  
21d60 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
21d70 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64  f(stderr, "%s:%d
21d80 3a 20 75 6e 65 73 63 61 70 65 64 20 25 63 20 63  : unescaped %c c
21d90 68 61 72 61 63 74 65 72 5c 6e 22 2c 0a 20 20 20  haracter\n",.   
21da0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
21db0 7a 46 69 6c 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c  zFile, p->nLine,
21dc0 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20   cQuote);.      
21dd0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 45  }.      if( c==E
21de0 4f 46 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  OF ){.        ut
21df0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
21e00 2c 20 22 25 73 3a 25 64 3a 20 75 6e 74 65 72 6d  , "%s:%d: unterm
21e10 69 6e 61 74 65 64 20 25 63 2d 71 75 6f 74 65 64  inated %c-quoted
21e20 20 66 69 65 6c 64 5c 6e 22 2c 0a 20 20 20 20 20   field\n",.     
21e30 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46             p->zF
21e40 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20  ile, startLine, 
21e50 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 20  cQuote);.       
21e60 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20   p->cTerm = c;. 
21e70 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21e80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6d 70 6f      }.      impo
21e90 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70  rt_append_char(p
21ea0 2c 20 63 29 3b 0a 20 20 20 20 20 20 70 70 63 20  , c);.      ppc 
21eb0 3d 20 70 63 3b 0a 20 20 20 20 20 20 70 63 20 3d  = pc;.      pc =
21ec0 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   c;.    }.  }els
21ed0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  e{.    /* If thi
21ee0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66  s is the first f
21ef0 69 65 6c 64 20 62 65 69 6e 67 20 70 61 72 73 65  ield being parse
21f00 64 20 61 6e 64 20 69 74 20 62 65 67 69 6e 73 20  d and it begins 
21f10 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20  with the.    ** 
21f20 55 54 46 2d 38 20 42 4f 4d 20 20 28 30 78 45 46  UTF-8 BOM  (0xEF
21f30 20 42 42 20 42 46 29 20 74 68 65 6e 20 73 6b 69   BB BF) then ski
21f40 70 20 74 68 65 20 42 4f 4d 20 2a 2f 0a 20 20 20  p the BOM */.   
21f50 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30   if( (c&0xff)==0
21f60 78 65 66 20 26 26 20 70 2d 3e 62 4e 6f 74 46 69  xef && p->bNotFi
21f70 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rst==0 ){.      
21f80 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68  import_append_ch
21f90 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20  ar(p, c);.      
21fa0 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
21fb0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63 26 30  ;.      if( (c&0
21fc0 78 66 66 29 3d 3d 30 78 62 62 20 29 7b 0a 20 20  xff)==0xbb ){.  
21fd0 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70        import_app
21fe0 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a  end_char(p, c);.
21ff0 20 20 20 20 20 20 20 20 63 20 3d 20 66 67 65 74          c = fget
22000 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20  c(p->in);.      
22010 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d    if( (c&0xff)==
22020 30 78 62 66 20 29 7b 0a 20 20 20 20 20 20 20 20  0xbf ){.        
22030 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d    p->bNotFirst =
22040 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   1;.          p-
22050 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  >n = 0;.        
22060 20 20 72 65 74 75 72 6e 20 63 73 76 5f 72 65 61    return csv_rea
22070 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 70 29 3b 0a  d_one_field(p);.
22080 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22090 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  }.    }.    whil
220a0 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d  e( c!=EOF && c!=
220b0 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70 20  cSep && c!=rSep 
220c0 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f  ){.      import_
220d0 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
220e0 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65  );.      c = fge
220f0 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d  tc(p->in);.    }
22100 0a 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65 70  .    if( c==rSep
22110 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69   ){.      p->nLi
22120 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ne++;.      if( 
22130 70 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b 70  p->n>0 && p->z[p
22140 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 70  ->n-1]=='\r' ) p
22150 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  ->n--;.    }.   
22160 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20   p->cTerm = c;. 
22170 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20   }.  if( p->z ) 
22180 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a  p->z[p->n] = 0;.
22190 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d    p->bNotFirst =
221a0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   1;.  return p->
221b0 7a 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20  z;.}../* Read a 
221c0 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66 20  single field of 
221d0 41 53 43 49 49 20 64 65 6c 69 6d 69 74 65 64 20  ASCII delimited 
221e0 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20  text..**.**   + 
221f0 20 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f   Input comes fro
22200 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20  m p->in..**   + 
22210 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
22220 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68  n p->z of length
22230 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f   p->n.  Space to
22240 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73   hold p->z comes
22250 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71  .**      from sq
22260 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29  lite3_malloc64()
22270 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d  ..**   +  Use p-
22280 3e 63 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c  >cSep as the col
22290 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20  umn separator.  
222a0 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22  The default is "
222b0 5c 78 31 46 22 2e 0a 2a 2a 20 20 20 2b 20 20 55  \x1F"..**   +  U
222c0 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74 68  se p->rSep as th
222d0 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e  e row separator.
222e0 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
222f0 20 22 5c 78 31 45 22 2e 0a 2a 2a 20 20 20 2b 20   "\x1E"..**   + 
22300 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
22310 68 65 20 72 6f 77 20 6e 75 6d 62 65 72 20 69 6e  he row number in
22320 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20   p->nLine..**   
22330 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61  +  Store the cha
22340 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d  racter that term
22350 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64  inates the field
22360 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53   in p->cTerm.  S
22370 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46  tore.**      EOF
22380 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e   on end-of-file.
22390 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20  .**   +  Report 
223a0 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e  syntax errors on
223b0 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69   stderr.*/.stati
223c0 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43  c char *SQLITE_C
223d0 44 45 43 4c 20 61 73 63 69 69 5f 72 65 61 64 5f  DECL ascii_read_
223e0 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74  one_field(Import
223f0 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63  Ctx *p){.  int c
22400 3b 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70  ;.  int cSep = p
22410 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74  ->cColSep;.  int
22420 20 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53   rSep = p->cRowS
22430 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a  ep;.  p->n = 0;.
22440 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
22450 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46  n);.  if( c==EOF
22460 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70   || seenInterrup
22470 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72  t ){.    p->cTer
22480 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74  m = EOF;.    ret
22490 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69  urn 0;.  }.  whi
224a0 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21  le( c!=EOF && c!
224b0 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70  =cSep && c!=rSep
224c0 20 29 7b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61   ){.    import_a
224d0 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29  ppend_char(p, c)
224e0 3b 0a 20 20 20 20 63 20 3d 20 66 67 65 74 63 28  ;.    c = fgetc(
224f0 70 2d 3e 69 6e 29 3b 0a 20 20 7d 0a 20 20 69 66  p->in);.  }.  if
22500 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20  ( c==rSep ){.   
22510 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 7d   p->nLine++;.  }
22520 0a 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b  .  p->cTerm = c;
22530 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d  .  if( p->z ) p-
22540 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  >z[p->n] = 0;.  
22550 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a  return p->z;.}..
22560 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72 61  /*.** Try to tra
22570 6e 73 66 65 72 20 64 61 74 61 20 66 6f 72 20 74  nsfer data for t
22580 61 62 6c 65 20 7a 54 61 62 6c 65 2e 20 20 49 66  able zTable.  If
22590 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
225a0 6e 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e  n while.** movin
225b0 67 20 66 6f 72 77 61 72 64 2c 20 74 72 79 20 74  g forward, try t
225c0 6f 20 67 6f 20 62 61 63 6b 77 61 72 64 73 2e 20  o go backwards. 
225d0 20 54 68 65 20 62 61 63 6b 77 61 72 64 73 20 6d   The backwards m
225e0 6f 76 65 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a  ovement won't.**
225f0 20 77 6f 72 6b 20 66 6f 72 20 57 49 54 48 4f 55   work for WITHOU
22600 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e 0a  T ROWID tables..
22610 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
22620 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61 28 0a 20  ryToCloneData(. 
22630 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a   ShellState *p,.
22640 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62    sqlite3 *newDb
22650 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
22660 7a 54 61 62 6c 65 0a 29 7b 0a 20 20 73 71 6c 69  zTable.){.  sqli
22670 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79  te3_stmt *pQuery
22680 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
22690 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20  stmt *pInsert = 
226a0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72  0;.  char *zQuer
226b0 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  y = 0;.  char *z
226c0 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 69 6e  Insert = 0;.  in
226d0 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  t rc;.  int i, j
226e0 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 54 61 62 6c  , n;.  int nTabl
226f0 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54 61  e = strlen30(zTa
22700 62 6c 65 29 3b 0a 20 20 69 6e 74 20 6b 20 3d 20  ble);.  int k = 
22710 30 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  0;.  int cnt = 0
22720 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 70  ;.  const int sp
22730 69 6e 52 61 74 65 20 3d 20 31 30 30 30 30 3b 0a  inRate = 10000;.
22740 0a 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69  .  zQuery = sqli
22750 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
22760 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c  ECT * FROM \"%w\
22770 22 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 72  "", zTable);.  r
22780 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
22790 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
227a0 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
227b0 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  y, 0);.  if( rc 
227c0 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
227d0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
227e0 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d  r %d: %s on [%s]
227f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
22800 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
22810 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  d_errcode(p->db)
22820 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
22830 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20  (p->db),.       
22840 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
22850 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f    goto end_data_
22860 78 66 65 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20  xfer;.  }.  n = 
22870 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
22880 6f 75 6e 74 28 70 51 75 65 72 79 29 3b 0a 20 20  ount(pQuery);.  
22890 7a 49 6e 73 65 72 74 20 3d 20 73 71 6c 69 74 65  zInsert = sqlite
228a0 33 5f 6d 61 6c 6c 6f 63 36 34 28 32 30 30 20 2b  3_malloc64(200 +
228b0 20 6e 54 61 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a   nTable + n*3);.
228c0 20 20 69 66 28 20 7a 49 6e 73 65 72 74 3d 3d 30    if( zInsert==0
228d0 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
228e0 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 73 71 6c 69  memory();.  sqli
228f0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 30  te3_snprintf(200
22900 2b 6e 54 61 62 6c 65 2c 7a 49 6e 73 65 72 74 2c  +nTable,zInsert,
22910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22920 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49      "INSERT OR I
22930 47 4e 4f 52 45 20 49 4e 54 4f 20 5c 22 25 73 5c  GNORE INTO \"%s\
22940 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61  " VALUES(?", zTa
22950 62 6c 65 29 3b 0a 20 20 69 20 3d 20 73 74 72 6c  ble);.  i = strl
22960 65 6e 33 30 28 7a 49 6e 73 65 72 74 29 3b 0a 20  en30(zInsert);. 
22970 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a   for(j=1; j<n; j
22980 2b 2b 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ++){.    memcpy(
22990 7a 49 6e 73 65 72 74 2b 69 2c 20 22 2c 3f 22 2c  zInsert+i, ",?",
229a0 20 32 29 3b 0a 20 20 20 20 69 20 2b 3d 20 32 3b   2);.    i += 2;
229b0 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 49  .  }.  memcpy(zI
229c0 6e 73 65 72 74 2b 69 2c 20 22 29 3b 22 2c 20 33  nsert+i, ");", 3
229d0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
229e0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 6e 65 77  3_prepare_v2(new
229f0 44 62 2c 20 7a 49 6e 73 65 72 74 2c 20 2d 31 2c  Db, zInsert, -1,
22a00 20 26 70 49 6e 73 65 72 74 2c 20 30 29 3b 0a 20   &pInsert, 0);. 
22a10 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75   if( rc ){.    u
22a20 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
22a30 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73  r, "Error %d: %s
22a40 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20   on [%s]\n",.   
22a50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22a60 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
22a70 65 28 6e 65 77 44 62 29 2c 20 73 71 6c 69 74 65  e(newDb), sqlite
22a80 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29 2c  3_errmsg(newDb),
22a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75  .            zQu
22aa0 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ery);.    goto e
22ab0 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20  nd_data_xfer;.  
22ac0 7d 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 32  }.  for(k=0; k<2
22ad0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 77 68 69 6c  ; k++){.    whil
22ae0 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  e( (rc = sqlite3
22af0 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d  _step(pQuery))==
22b00 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
22b10 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
22b20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
22b30 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
22b40 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 51 75 65  column_type(pQue
22b50 72 79 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20  ry, i) ){.      
22b60 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
22b70 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  NULL: {.        
22b80 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
22b90 5f 6e 75 6c 6c 28 70 49 6e 73 65 72 74 2c 20 69  _null(pInsert, i
22ba0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +1);.           
22bb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
22bc0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61    }.          ca
22bd0 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
22be0 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  R: {.           
22bf0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
22c00 74 36 34 28 70 49 6e 73 65 72 74 2c 20 69 2b 31  t64(pInsert, i+1
22c10 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
22c20 5f 69 6e 74 36 34 28 70 51 75 65 72 79 2c 69 29  _int64(pQuery,i)
22c30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
22c40 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
22c50 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  }.          case
22c60 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
22c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
22c80 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
22c90 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73  (pInsert, i+1, s
22ca0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
22cb0 75 62 6c 65 28 70 51 75 65 72 79 2c 69 29 29 3b  uble(pQuery,i));
22cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
22cd0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
22ce0 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
22cf0 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20  QLITE_TEXT: {.  
22d00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22d10 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 49 6e 73  3_bind_text(pIns
22d20 65 72 74 2c 20 69 2b 31 2c 0a 20 20 20 20 20 20  ert, i+1,.      
22d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d40 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68         (const ch
22d50 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
22d60 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 69  mn_text(pQuery,i
22d70 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d90 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
22da0 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
22db0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
22dc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   }.          cas
22dd0 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
22de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
22df0 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
22e00 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c  Insert, i+1, sql
22e10 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
22e20 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20  (pQuery,i),.    
22e30 20 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 20 20 20 20 20 20 20                  
22e50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
22e60 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 51 75  column_bytes(pQu
22e70 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20  ery,i),.        
22e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 20 20 20 20 53 51 4c 49 54 45 5f 53 54 41 54 49      SQLITE_STATI
22eb0 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
22ec0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
22ed0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
22ee0 20 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 20     } /* End for 
22ef0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
22f00 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73 65  lite3_step(pInse
22f10 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rt);.      if( r
22f20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
22f30 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26  rc!=SQLITE_ROW &
22f40 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  & rc!=SQLITE_DON
22f50 45 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  E ){.        utf
22f60 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
22f70 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 5c 6e   "Error %d: %s\n
22f80 22 2c 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  ", sqlite3_exten
22f90 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44  ded_errcode(newD
22fa0 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b),.            
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
22fc0 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62  te3_errmsg(newDb
22fd0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
22fe0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
22ff0 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20  pInsert);.      
23000 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
23010 20 28 63 6e 74 25 73 70 69 6e 52 61 74 65 29 3d   (cnt%spinRate)=
23020 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  =0 ){.        pr
23030 69 6e 74 66 28 22 25 63 5c 62 22 2c 20 22 7c 2f  intf("%c\b", "|/
23040 2d 5c 5c 22 5b 28 63 6e 74 2f 73 70 69 6e 52 61  -\\"[(cnt/spinRa
23050 74 65 29 25 34 5d 29 3b 0a 20 20 20 20 20 20 20  te)%4]);.       
23060 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
23070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f  .      }.    } /
23080 2a 20 45 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 20  * End while */. 
23090 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
230a0 45 5f 44 4f 4e 45 20 29 20 62 72 65 61 6b 3b 0a  E_DONE ) break;.
230b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
230c0 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20  lize(pQuery);.  
230d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
230e0 51 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65  Query);.    zQue
230f0 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
23100 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46  intf("SELECT * F
23110 52 4f 4d 20 5c 22 25 77 5c 22 20 4f 52 44 45 52  ROM \"%w\" ORDER
23120 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 3b 22   BY rowid DESC;"
23130 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
23150 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  Table);.    rc =
23160 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
23170 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  _v2(p->db, zQuer
23180 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20  y, -1, &pQuery, 
23190 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
231a0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
231b0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 61 72  ntf(stderr, "War
231c0 6e 69 6e 67 3a 20 63 61 6e 6e 6f 74 20 73 74 65  ning: cannot ste
231d0 70 20 5c 22 25 73 5c 22 20 62 61 63 6b 77 61 72  p \"%s\" backwar
231e0 64 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  ds", zTable);.  
231f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
23200 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 28  .  } /* End for(
23210 6b 3d 30 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e 64 5f  k=0...) */..end_
23220 64 61 74 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c  data_xfer:.  sql
23230 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
23240 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  uery);.  sqlite3
23250 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72  _finalize(pInser
23260 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
23270 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 73 71  ee(zQuery);.  sq
23280 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 65  lite3_free(zInse
23290 72 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  rt);.}.../*.** T
232a0 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20 61  ry to transfer a
232b0 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 73  ll rows of the s
232c0 63 68 65 6d 61 20 74 68 61 74 20 6d 61 74 63 68  chema that match
232d0 20 7a 57 68 65 72 65 2e 20 20 46 6f 72 0a 2a 2a   zWhere.  For.**
232e0 20 65 61 63 68 20 72 6f 77 2c 20 69 6e 76 6f 6b   each row, invok
232f0 65 20 78 46 6f 72 45 61 63 68 28 29 20 6f 6e 20  e xForEach() on 
23300 74 68 65 20 6f 62 6a 65 63 74 20 64 65 66 69 6e  the object defin
23310 65 64 20 62 79 20 74 68 61 74 20 72 6f 77 2e 0a  ed by that row..
23320 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
23330 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68  s encountered wh
23340 69 6c 65 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61  ile moving forwa
23350 72 64 20 74 68 72 6f 75 67 68 20 74 68 65 0a 2a  rd through the.*
23360 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
23370 74 61 62 6c 65 2c 20 74 72 79 20 61 67 61 69 6e  table, try again
23380 20 6d 6f 76 69 6e 67 20 62 61 63 6b 77 61 72 64   moving backward
23390 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
233a0 64 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65  d tryToCloneSche
233b0 6d 61 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ma(.  ShellState
233c0 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p,.  sqlite3 *
233d0 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63  newDb,.  const c
233e0 68 61 72 20 2a 7a 57 68 65 72 65 2c 0a 20 20 76  har *zWhere,.  v
233f0 6f 69 64 20 28 2a 78 46 6f 72 45 61 63 68 29 28  oid (*xForEach)(
23400 53 68 65 6c 6c 53 74 61 74 65 2a 2c 73 71 6c 69  ShellState*,sqli
23410 74 65 33 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  te3*,const char*
23420 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ).){.  sqlite3_s
23430 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b  tmt *pQuery = 0;
23440 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20  .  char *zQuery 
23450 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
23460 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
23470 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63  char *zName;.  c
23480 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
23490 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
234a0 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a   *zErrMsg = 0;..
234b0 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74    zQuery = sqlit
234c0 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
234d0 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f  CT name, sql FRO
234e0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
234f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23500 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
23510 45 52 45 20 25 73 22 2c 20 7a 57 68 65 72 65 29  ERE %s", zWhere)
23520 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
23530 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
23540 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26  b, zQuery, -1, &
23550 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69 66  pQuery, 0);.  if
23560 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38  ( rc ){.    utf8
23570 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
23580 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20  "Error: (%d) %s 
23590 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20  on [%s]\n",.    
235a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235b0 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
235c0 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c  _errcode(p->db),
235d0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
235e0 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20  p->db),.        
235f0 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
23600 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  ry);.    goto en
23610 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20  d_schema_xfer;. 
23620 20 7d 0a 20 20 77 68 69 6c 65 28 20 28 72 63 20   }.  while( (rc 
23630 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
23640 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f  Query))==SQLITE_
23650 52 4f 57 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ROW ){.    zName
23660 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
23670 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 30  n_text(pQuery, 0
23680 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  );.    zSql = sq
23690 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
236a0 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20  t(pQuery, 1);.  
236b0 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20    printf("%s... 
236c0 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73  ", zName); fflus
236d0 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 73  h(stdout);.    s
236e0 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44  qlite3_exec(newD
236f0 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  b, (const char*)
23700 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72  zSql, 0, 0, &zEr
23710 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a  rMsg);.    if( z
23720 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
23730 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
23740 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
23750 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45  SQL: [%s]\n", zE
23760 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20  rrMsg, zSql);.  
23770 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
23780 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
23790 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20   zErrMsg = 0;.  
237a0 20 20 7d 0a 20 20 20 20 69 66 28 20 78 46 6f 72    }.    if( xFor
237b0 45 61 63 68 20 29 7b 0a 20 20 20 20 20 20 78 46  Each ){.      xF
237c0 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c  orEach(p, newDb,
237d0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e   (const char*)zN
237e0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
237f0 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29  printf("done\n")
23800 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
23810 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
23820 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
23830 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 20  ize(pQuery);.   
23840 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
23850 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65 72  uery);.    zQuer
23860 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
23870 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d 65  ntf("SELECT name
23880 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
23890 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20  e_master".      
238a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238b0 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 25         " WHERE %
238c0 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64  s ORDER BY rowid
238d0 20 44 45 53 43 22 2c 20 7a 57 68 65 72 65 29 3b   DESC", zWhere);
238e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
238f0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
23900 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
23910 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  &pQuery, 0);.   
23920 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
23930 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
23940 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 28 25 64  err, "Error: (%d
23950 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c  ) %s on [%s]\n",
23960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23970 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
23980 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
23990 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f  p->db), sqlite3_
239a0 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20  errmsg(p->db),. 
239b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239c0 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
239d0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68      goto end_sch
239e0 65 6d 61 5f 78 66 65 72 3b 0a 20 20 20 20 7d 0a  ema_xfer;.    }.
239f0 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d      while( (rc =
23a00 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51   sqlite3_step(pQ
23a10 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52  uery))==SQLITE_R
23a20 4f 57 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  OW ){.      zNam
23a30 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
23a40 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20  mn_text(pQuery, 
23a50 30 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  0);.      zSql =
23a60 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
23a70 74 65 78 74 28 70 51 75 65 72 79 2c 20 31 29 3b  text(pQuery, 1);
23a80 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25  .      printf("%
23a90 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20  s... ", zName); 
23aa0 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
23ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
23ac0 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74  ec(newDb, (const
23ad0 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20   char*)zSql, 0, 
23ae0 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0, &zErrMsg);.  
23af0 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
23b00 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
23b10 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
23b20 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20  Error: %s\nSQL: 
23b30 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  [%s]\n", zErrMsg
23b40 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
23b50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
23b60 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
23b70 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
23b80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 78     }.      if( x
23b90 46 6f 72 45 61 63 68 20 29 7b 0a 20 20 20 20 20  ForEach ){.     
23ba0 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c 20 6e     xForEach(p, n
23bb0 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61  ewDb, (const cha
23bc0 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  r*)zName);.     
23bd0 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28   }.      printf(
23be0 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 20 20 7d  "done\n");.    }
23bf0 0a 20 20 7d 0a 65 6e 64 5f 73 63 68 65 6d 61 5f  .  }.end_schema_
23c00 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f  xfer:.  sqlite3_
23c10 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29  finalize(pQuery)
23c20 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
23c30 28 7a 51 75 65 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a  (zQuery);.}../*.
23c40 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
23c50 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
23c60 64 20 22 7a 4e 65 77 44 62 22 2e 20 20 54 72 79  d "zNewDb".  Try
23c70 20 74 6f 20 72 65 63 6f 76 65 72 20 61 73 20 6d   to recover as m
23c80 75 63 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  uch information.
23c90 2a 2a 20 61 73 20 70 6f 73 73 69 62 6c 65 20 6f  ** as possible o
23ca0 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64  ut of the main d
23cb0 61 74 61 62 61 73 65 20 28 77 68 69 63 68 20 6d  atabase (which m
23cc0 69 67 68 74 20 62 65 20 63 6f 72 72 75 70 74 29  ight be corrupt)
23cd0 20 61 6e 64 20 77 72 69 74 65 20 69 74 0a 2a 2a   and write it.**
23ce0 20 69 6e 74 6f 20 7a 4e 65 77 44 62 2e 0a 2a 2f   into zNewDb..*/
23cf0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79  .static void try
23d00 54 6f 43 6c 6f 6e 65 28 53 68 65 6c 6c 53 74 61  ToClone(ShellSta
23d10 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  te *p, const cha
23d20 72 20 2a 7a 4e 65 77 44 62 29 7b 0a 20 20 69 6e  r *zNewDb){.  in
23d30 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  t rc;.  sqlite3 
23d40 2a 6e 65 77 44 62 20 3d 20 30 3b 0a 20 20 69 66  *newDb = 0;.  if
23d50 28 20 61 63 63 65 73 73 28 7a 4e 65 77 44 62 2c  ( access(zNewDb,
23d60 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66  0)==0 ){.    utf
23d70 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
23d80 20 22 46 69 6c 65 20 5c 22 25 73 5c 22 20 61 6c   "File \"%s\" al
23d90 72 65 61 64 79 20 65 78 69 73 74 73 2e 5c 6e 22  ready exists.\n"
23da0 2c 20 7a 4e 65 77 44 62 29 3b 0a 20 20 20 20 72  , zNewDb);.    r
23db0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
23dc0 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a  = sqlite3_open(z
23dd0 4e 65 77 44 62 2c 20 26 6e 65 77 44 62 29 3b 0a  NewDb, &newDb);.
23de0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
23df0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
23e00 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 72 65 61  rr, "Cannot crea
23e10 74 65 20 6f 75 74 70 75 74 20 64 61 74 61 62 61  te output databa
23e20 73 65 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  se: %s\n",.     
23e30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
23e40 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20  rrmsg(newDb));. 
23e50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
23e60 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
23e70 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
23e80 5f 73 63 68 65 6d 61 3d 4f 4e 3b 22 2c 20 30 2c  _schema=ON;", 0,
23e90 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
23ea0 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20  te3_exec(newDb, 
23eb0 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45  "BEGIN EXCLUSIVE
23ec0 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
23ed0 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65    tryToCloneSche
23ee0 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79  ma(p, newDb, "ty
23ef0 70 65 3d 27 74 61 62 6c 65 27 22 2c 20 74 72 79  pe='table'", try
23f00 54 6f 43 6c 6f 6e 65 44 61 74 61 29 3b 0a 20 20  ToCloneData);.  
23f10 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65    tryToCloneSche
23f20 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79  ma(p, newDb, "ty
23f30 70 65 21 3d 27 74 61 62 6c 65 27 22 2c 20 30 29  pe!='table'", 0)
23f40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
23f50 65 63 28 6e 65 77 44 62 2c 20 22 43 4f 4d 4d 49  ec(newDb, "COMMI
23f60 54 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  T;", 0, 0, 0);. 
23f70 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
23f80 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77  p->db, "PRAGMA w
23f90 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
23fa0 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  FF;", 0, 0, 0);.
23fb0 20 20 7d 0a 20 20 63 6c 6f 73 65 5f 64 62 28 6e    }.  close_db(n
23fc0 65 77 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ewDb);.}../*.** 
23fd0 43 68 61 6e 67 65 20 74 68 65 20 6f 75 74 70 75  Change the outpu
23fe0 74 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 73  t file back to s
23ff0 74 64 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tdout..**.** If 
24000 74 68 65 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e  the p->doXdgOpen
24010 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
24020 61 74 20 6d 65 61 6e 73 20 74 68 65 20 6f 75 74  at means the out
24030 70 75 74 20 77 61 73 20 62 65 69 6e 67 0a 2a 2a  put was being.**
24040 20 72 65 64 69 72 65 63 74 65 64 20 74 6f 20 61   redirected to a
24050 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
24060 6e 61 6d 65 64 20 62 79 20 70 2d 3e 7a 54 65 6d  named by p->zTem
24070 70 46 69 6c 65 2e 20 20 49 6e 20 74 68 61 74 20  pFile.  In that 
24080 63 61 73 65 2c 0a 2a 2a 20 6c 61 75 6e 63 68 20  case,.** launch 
24090 73 74 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f  start/open/xdg-o
240a0 70 65 6e 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  pen on that temp
240b0 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73  orary file..*/.s
240c0 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
240d0 74 5f 72 65 73 65 74 28 53 68 65 6c 6c 53 74 61  t_reset(ShellSta
240e0 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  te *p){.  if( p-
240f0 3e 6f 75 74 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27  >outfile[0]=='|'
24100 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
24110 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20  TE_OMIT_POPEN.  
24120 20 20 70 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29    pclose(p->out)
24130 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
24140 7b 0a 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c  {.    output_fil
24150 65 5f 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b  e_close(p->out);
24160 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24170 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20  NOHAVE_SYSTEM.  
24180 20 20 69 66 28 20 70 2d 3e 64 6f 58 64 67 4f 70    if( p->doXdgOp
24190 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  en ){.      cons
241a0 74 20 63 68 61 72 20 2a 7a 58 64 67 4f 70 65 6e  t char *zXdgOpen
241b0 43 6d 64 20 3d 0a 23 69 66 20 64 65 66 69 6e 65  Cmd =.#if define
241c0 64 28 5f 57 49 4e 33 32 29 0a 20 20 20 20 20 20  d(_WIN32).      
241d0 22 73 74 61 72 74 22 3b 0a 23 65 6c 69 66 20 64  "start";.#elif d
241e0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
241f0 29 0a 20 20 20 20 20 20 22 6f 70 65 6e 22 3b 0a  ).      "open";.
24200 23 65 6c 73 65 0a 20 20 20 20 20 20 22 78 64 67  #else.      "xdg
24210 2d 6f 70 65 6e 22 3b 0a 23 65 6e 64 69 66 0a 20  -open";.#endif. 
24220 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b       char *zCmd;
24230 0a 20 20 20 20 20 20 7a 43 6d 64 20 3d 20 73 71  .      zCmd = sq
24240 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
24250 73 20 25 73 22 2c 20 7a 58 64 67 4f 70 65 6e 43  s %s", zXdgOpenC
24260 6d 64 2c 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  md, p->zTempFile
24270 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 79 73  );.      if( sys
24280 74 65 6d 28 7a 43 6d 64 29 20 29 7b 0a 20 20 20  tem(zCmd) ){.   
24290 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
242a0 28 73 74 64 65 72 72 2c 20 22 46 61 69 6c 65 64  (stderr, "Failed
242b0 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 43 6d 64 29  : [%s]\n", zCmd)
242c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
242d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d  sqlite3_free(zCm
242e0 64 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  d);.      output
242f0 4d 6f 64 65 50 6f 70 28 70 29 3b 0a 20 20 20 20  ModePop(p);.    
24300 20 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 3d    p->doXdgOpen =
24310 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   0;.    }.#endif
24320 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
24330 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45  ITE_NOHAVE_SYSTE
24340 4d 29 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 6f  M) */.  }.  p->o
24350 75 74 66 69 6c 65 5b 30 5d 20 3d 20 30 3b 0a 20  utfile[0] = 0;. 
24360 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74   p->out = stdout
24370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61  ;.}../*.** Run a
24380 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 61 6e  n SQL command an
24390 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 69 6e  d return the sin
243a0 67 6c 65 20 69 6e 74 65 67 65 72 20 72 65 73 75  gle integer resu
243b0 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  lt..*/.static in
243c0 74 20 64 62 5f 69 6e 74 28 53 68 65 6c 6c 53 74  t db_int(ShellSt
243d0 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ate *p, const ch
243e0 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 73 71 6c  ar *zSql){.  sql
243f0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
24400 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b  ;.  int res = 0;
24410 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  .  sqlite3_prepa
24420 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
24430 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
24440 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 26  );.  if( pStmt &
24450 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  & sqlite3_step(p
24460 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
24470 57 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 73  W ){.    res = s
24480 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
24490 74 28 70 53 74 6d 74 2c 30 29 3b 0a 20 20 7d 0a  t(pStmt,0);.  }.
244a0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
244b0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 72 65 74  ze(pStmt);.  ret
244c0 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
244d0 2a 20 43 6f 6e 76 65 72 74 20 61 20 32 2d 62 79  * Convert a 2-by
244e0 74 65 20 6f 72 20 34 2d 62 79 74 65 20 62 69 67  te or 4-byte big
244f0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
24500 69 6e 74 6f 20 61 20 6e 61 74 69 76 65 20 69 6e  into a native in
24510 74 65 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20  teger.*/.static 
24520 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67 65 74  unsigned int get
24530 32 62 79 74 65 49 6e 74 28 75 6e 73 69 67 6e 65  2byteInt(unsigne
24540 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20 72 65  d char *a){.  re
24550 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 38 29 20 2b  turn (a[0]<<8) +
24560 20 61 5b 31 5d 3b 0a 7d 0a 73 74 61 74 69 63 20   a[1];.}.static 
24570 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67 65 74  unsigned int get
24580 34 62 79 74 65 49 6e 74 28 75 6e 73 69 67 6e 65  4byteInt(unsigne
24590 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20 72 65  d char *a){.  re
245a0 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 32 34 29 20  turn (a[0]<<24) 
245b0 2b 20 28 61 5b 31 5d 3c 3c 31 36 29 20 2b 20 28  + (a[1]<<16) + (
245c0 61 5b 32 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b  a[2]<<8) + a[3];
245d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
245e0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
245f0 22 2e 69 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64 2e  ".info" command.
24600 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  .**.** Return 1 
24610 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f 20 65  on error, 2 to e
24620 78 69 74 2c 20 61 6e 64 20 30 20 6f 74 68 65 72  xit, and 0 other
24630 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
24640 69 6e 74 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f  int shell_dbinfo
24650 5f 63 6f 6d 6d 61 6e 64 28 53 68 65 6c 6c 53 74  _command(ShellSt
24660 61 74 65 20 2a 70 2c 20 69 6e 74 20 6e 41 72 67  ate *p, int nArg
24670 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 29 7b  , char **azArg){
24680 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
24690 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74 20 63  struct { const c
246a0 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 69 6e 74 20  har *zName; int 
246b0 6f 66 73 74 3b 20 7d 20 61 46 69 65 6c 64 5b 5d  ofst; } aField[]
246c0 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 66 69 6c   = {.     { "fil
246d0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
246e0 3a 22 2c 20 20 32 34 20 20 7d 2c 0a 20 20 20 20  :",  24  },.    
246f0 20 7b 20 22 64 61 74 61 62 61 73 65 20 70 61 67   { "database pag
24700 65 20 63 6f 75 6e 74 3a 22 2c 20 20 32 38 20 20  e count:",  28  
24710 7d 2c 0a 20 20 20 20 20 7b 20 22 66 72 65 65 6c  },.     { "freel
24720 69 73 74 20 70 61 67 65 20 63 6f 75 6e 74 3a 22  ist page count:"
24730 2c 20 20 33 36 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  36  },.     {
24740 20 22 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 3a   "schema cookie:
24750 22 2c 20 20 20 20 20 20 20 20 34 30 20 20 7d 2c  ",        40  },
24760 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d 61 20  .     { "schema 
24770 66 6f 72 6d 61 74 3a 22 2c 20 20 20 20 20 20 20  format:",       
24780 20 34 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   44  },.     { "
24790 64 65 66 61 75 6c 74 20 63 61 63 68 65 20 73 69  default cache si
247a0 7a 65 3a 22 2c 20 20 20 34 38 20 20 7d 2c 0a 20  ze:",   48  },. 
247b0 20 20 20 20 7b 20 22 61 75 74 6f 76 61 63 75 75      { "autovacuu
247c0 6d 20 74 6f 70 20 72 6f 6f 74 3a 22 2c 20 20 35  m top root:",  5
247d0 32 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 69 6e  2  },.     { "in
247e0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
247f0 3a 22 2c 20 20 20 36 34 20 20 7d 2c 0a 20 20 20  :",   64  },.   
24800 20 20 7b 20 22 74 65 78 74 20 65 6e 63 6f 64 69    { "text encodi
24810 6e 67 3a 22 2c 20 20 20 20 20 20 20 20 35 36 20  ng:",        56 
24820 20 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73 65 72   },.     { "user
24830 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20   version:",     
24840 20 20 20 20 36 30 20 20 7d 2c 0a 20 20 20 20 20      60  },.     
24850 7b 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 20 69  { "application i
24860 64 3a 22 2c 20 20 20 20 20 20 20 36 38 20 20 7d  d:",       68  }
24870 2c 0a 20 20 20 20 20 7b 20 22 73 6f 66 74 77 61  ,.     { "softwa
24880 72 65 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20  re version:",   
24890 20 20 39 36 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20    96  },.  };.  
248a0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
248b0 75 63 74 20 7b 20 63 6f 6e 73 74 20 63 68 61 72  uct { const char
248c0 20 2a 7a 4e 61 6d 65 3b 20 63 6f 6e 73 74 20 63   *zName; const c
248d0 68 61 72 20 2a 7a 53 71 6c 3b 20 7d 20 61 51 75  har *zSql; } aQu
248e0 65 72 79 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b  ery[] = {.     {
248f0 20 22 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c   "number of tabl
24900 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45  es:",.       "SE
24910 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
24920 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70 65  OM %s WHERE type
24930 3d 27 74 61 62 6c 65 27 22 20 7d 2c 0a 20 20 20  ='table'" },.   
24940 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 69    { "number of i
24950 6e 64 65 78 65 73 3a 22 2c 0a 20 20 20 20 20 20  ndexes:",.      
24960 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
24970 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20  ) FROM %s WHERE 
24980 74 79 70 65 3d 27 69 6e 64 65 78 27 22 20 7d 2c  type='index'" },
24990 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20  .     { "number 
249a0 6f 66 20 74 72 69 67 67 65 72 73 3a 22 2c 0a 20  of triggers:",. 
249b0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f        "SELECT co
249c0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57  unt(*) FROM %s W
249d0 48 45 52 45 20 74 79 70 65 3d 27 74 72 69 67 67  HERE type='trigg
249e0 65 72 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22  er'" },.     { "
249f0 6e 75 6d 62 65 72 20 6f 66 20 76 69 65 77 73 3a  number of views:
24a00 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  ",.       "SELEC
24a10 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
24a20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 76  %s WHERE type='v
24a30 69 65 77 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20  iew'" },.     { 
24a40 22 73 63 68 65 6d 61 20 73 69 7a 65 3a 22 2c 0a  "schema size:",.
24a50 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 74         "SELECT t
24a60 6f 74 61 6c 28 6c 65 6e 67 74 68 28 73 71 6c 29  otal(length(sql)
24a70 29 20 46 52 4f 4d 20 25 73 22 20 7d 2c 0a 20 20  ) FROM %s" },.  
24a80 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 72 63 3b 0a  };.  int i, rc;.
24a90 20 20 75 6e 73 69 67 6e 65 64 20 69 44 61 74 61    unsigned iData
24aa0 56 65 72 73 69 6f 6e 3b 0a 20 20 63 68 61 72 20  Version;.  char 
24ab0 2a 7a 53 63 68 65 6d 61 54 61 62 3b 0a 20 20 63  *zSchemaTab;.  c
24ac0 68 61 72 20 2a 7a 44 62 20 3d 20 6e 41 72 67 3e  har *zDb = nArg>
24ad0 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20  =2 ? azArg[1] : 
24ae0 22 6d 61 69 6e 22 3b 0a 20 20 73 71 6c 69 74 65  "main";.  sqlite
24af0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
24b00 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  0;.  unsigned ch
24b10 61 72 20 61 48 64 72 5b 31 30 30 5d 3b 0a 20 20  ar aHdr[100];.  
24b20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
24b30 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 20   if( p->db==0 ) 
24b40 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 63 20 3d  return 1;.  rc =
24b50 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
24b60 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  _v2(p->db,.     
24b70 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
24b80 64 61 74 61 20 46 52 4f 4d 20 73 71 6c 69 74 65  data FROM sqlite
24b90 5f 64 62 70 61 67 65 28 3f 31 29 20 57 48 45 52  _dbpage(?1) WHER
24ba0 45 20 70 67 6e 6f 3d 31 22 2c 0a 20 20 20 20 20  E pgno=1",.     
24bb0 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74          -1, &pSt
24bc0 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
24bd0 20 29 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c   ){.    if( !sql
24be0 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69  ite3_compileopti
24bf0 6f 6e 5f 75 73 65 64 28 22 45 4e 41 42 4c 45 5f  on_used("ENABLE_
24c00 44 42 50 41 47 45 5f 56 54 41 42 22 29 20 29 7b  DBPAGE_VTAB") ){
24c10 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
24c20 74 66 28 73 74 64 65 72 72 2c 20 22 74 68 65 20  tf(stderr, "the 
24c30 5c 22 2e 64 62 69 6e 66 6f 5c 22 20 63 6f 6d 6d  \".dbinfo\" comm
24c40 61 6e 64 20 72 65 71 75 69 72 65 73 20 74 68 65  and requires the
24c50 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
24c60 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 44               "-D
24c70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42  SQLITE_ENABLE_DB
24c80 50 41 47 45 5f 56 54 41 42 20 63 6f 6d 70 69 6c  PAGE_VTAB compil
24c90 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 5c 6e  e-time options\n
24ca0 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
24cb0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
24cc0 28 73 74 64 65 72 72 2c 20 22 65 72 72 6f 72 3a  (stderr, "error:
24cd0 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
24ce0 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
24cf0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
24d00 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
24d10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
24d20 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62  .  }.  sqlite3_b
24d30 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
24d40 31 2c 20 7a 44 62 2c 20 2d 31 2c 20 53 51 4c 49  1, zDb, -1, SQLI
24d50 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66  TE_STATIC);.  if
24d60 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
24d70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
24d80 57 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f  W.   && sqlite3_
24d90 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
24da0 6d 74 2c 30 29 3e 31 30 30 0a 20 20 29 7b 0a 20  mt,0)>100.  ){. 
24db0 20 20 20 6d 65 6d 63 70 79 28 61 48 64 72 2c 20     memcpy(aHdr, 
24dc0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
24dd0 6c 6f 62 28 70 53 74 6d 74 2c 30 29 2c 20 31 30  lob(pStmt,0), 10
24de0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
24df0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
24e00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61  .  }else{.    ra
24e10 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
24e20 20 22 75 6e 61 62 6c 65 20 74 6f 20 72 65 61 64   "unable to read
24e30 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
24e40 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  \n");.    sqlite
24e50 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
24e60 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
24e70 0a 20 20 7d 0a 20 20 69 20 3d 20 67 65 74 32 62  .  }.  i = get2b
24e80 79 74 65 49 6e 74 28 61 48 64 72 2b 31 36 29 3b  yteInt(aHdr+16);
24e90 0a 20 20 69 66 28 20 69 3d 3d 31 20 29 20 69 20  .  if( i==1 ) i 
24ea0 3d 20 36 35 35 33 36 3b 0a 20 20 75 74 66 38 5f  = 65536;.  utf8_
24eb0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
24ec0 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 64 61  %-20s %d\n", "da
24ed0 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
24ee0 3a 22 2c 20 69 29 3b 0a 20 20 75 74 66 38 5f 70  :", i);.  utf8_p
24ef0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
24f00 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 77 72 69  -20s %d\n", "wri
24f10 74 65 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64  te format:", aHd
24f20 72 5b 31 38 5d 29 3b 0a 20 20 75 74 66 38 5f 70  r[18]);.  utf8_p
24f30 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
24f40 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 61  -20s %d\n", "rea
24f50 64 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72  d format:", aHdr
24f60 5b 31 39 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72  [19]);.  utf8_pr
24f70 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
24f80 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 73 65  20s %d\n", "rese
24f90 72 76 65 64 20 62 79 74 65 73 3a 22 2c 20 61 48  rved bytes:", aH
24fa0 64 72 5b 32 30 5d 29 3b 0a 20 20 66 6f 72 28 69  dr[20]);.  for(i
24fb0 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
24fc0 61 46 69 65 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20  aField); i++){. 
24fd0 20 20 20 69 6e 74 20 6f 66 73 74 20 3d 20 61 46     int ofst = aF
24fe0 69 65 6c 64 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20  ield[i].ofst;.  
24ff0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 76    unsigned int v
25000 61 6c 20 3d 20 67 65 74 34 62 79 74 65 49 6e 74  al = get4byteInt
25010 28 61 48 64 72 20 2b 20 6f 66 73 74 29 3b 0a 20  (aHdr + ofst);. 
25020 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
25030 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 75  ->out, "%-20s %u
25040 22 2c 20 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61  ", aField[i].zNa
25050 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 20 20 73 77  me, val);.    sw
25060 69 74 63 68 28 20 6f 66 73 74 20 29 7b 0a 20 20  itch( ofst ){.  
25070 20 20 20 20 63 61 73 65 20 35 36 3a 20 7b 0a 20      case 56: {. 
25080 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d         if( val==
25090 31 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  1 ) raw_printf(p
250a0 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 38 29 22  ->out, " (utf8)"
250b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
250c0 61 6c 3d 3d 32 20 29 20 72 61 77 5f 70 72 69 6e  al==2 ) raw_prin
250d0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74  tf(p->out, " (ut
250e0 66 31 36 6c 65 29 22 29 3b 0a 20 20 20 20 20 20  f16le)");.      
250f0 20 20 69 66 28 20 76 61 6c 3d 3d 33 20 29 20 72    if( val==3 ) r
25100 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
25110 2c 20 22 20 28 75 74 66 31 36 62 65 29 22 29 3b  , " (utf16be)");
25120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25130 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
25140 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d  >out, "\n");.  }
25150 0a 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b  .  if( zDb==0 ){
25160 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20  .    zSchemaTab 
25170 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
25180 66 28 22 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d  f("main.sqlite_m
25190 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65  aster");.  }else
251a0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 44 62 2c   if( strcmp(zDb,
251b0 22 74 65 6d 70 22 29 3d 3d 30 20 29 7b 0a 20 20  "temp")==0 ){.  
251c0 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73    zSchemaTab = s
251d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
251e0 25 73 22 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d  %s", "sqlite_tem
251f0 70 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d 65  p_master");.  }e
25200 6c 73 65 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61  lse{.    zSchema
25210 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Tab = sqlite3_mp
25220 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 2e 73 71  rintf("\"%w\".sq
25230 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 7a 44  lite_master", zD
25240 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  b);.  }.  for(i=
25250 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
25260 51 75 65 72 79 29 3b 20 69 2b 2b 29 7b 0a 20 20  Query); i++){.  
25270 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
25280 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
25290 51 75 65 72 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a  Query[i].zSql, z
252a0 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 20 20  SchemaTab);.    
252b0 69 6e 74 20 76 61 6c 20 3d 20 64 62 5f 69 6e 74  int val = db_int
252c0 28 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73  (p, zSql);.    s
252d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
252e0 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
252f0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
25300 73 20 25 64 5c 6e 22 2c 20 61 51 75 65 72 79 5b  s %d\n", aQuery[
25310 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a  i].zName, val);.
25320 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
25330 65 65 28 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a  ee(zSchemaTab);.
25340 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
25350 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 7a 44  ontrol(p->db, zD
25360 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  b, SQLITE_FCNTL_
25370 44 41 54 41 5f 56 45 52 53 49 4f 4e 2c 20 26 69  DATA_VERSION, &i
25380 44 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20  DataVersion);.  
25390 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
253a0 75 74 2c 20 22 25 2d 32 30 73 20 25 75 5c 6e 22  ut, "%-20s %u\n"
253b0 2c 20 22 64 61 74 61 20 76 65 72 73 69 6f 6e 22  , "data version"
253c0 2c 20 69 44 61 74 61 56 65 72 73 69 6f 6e 29 3b  , iDataVersion);
253d0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
253e0 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
253f0 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f  current sqlite3_
25400 65 72 72 6d 73 67 28 29 20 76 61 6c 75 65 20 74  errmsg() value t
25410 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65 74  o stderr and ret
25420 75 72 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 1..*/.static
25430 20 69 6e 74 20 73 68 65 6c 6c 44 61 74 61 62 61   int shellDataba
25440 73 65 45 72 72 6f 72 28 73 71 6c 69 74 65 33 20  seError(sqlite3 
25450 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  *db){.  const ch
25460 61 72 20 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74  ar *zErr = sqlit
25470 65 33 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20  e3_errmsg(db);. 
25480 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
25490 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
254a0 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 72 65 74  n", zErr);.  ret
254b0 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
254c0 43 6f 6d 70 61 72 65 20 74 68 65 20 70 61 74 74  Compare the patt
254d0 65 72 6e 20 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61  ern in zGlob[] a
254e0 67 61 69 6e 73 74 20 74 68 65 20 74 65 78 74 20  gainst the text 
254f0 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20  in z[].  Return 
25500 54 52 55 45 0a 2a 2a 20 69 66 20 74 68 65 79 20  TRUE.** if they 
25510 6d 61 74 63 68 20 61 6e 64 20 46 41 4c 53 45 20  match and FALSE 
25520 28 30 29 20 69 66 20 74 68 65 79 20 64 6f 20 6e  (0) if they do n
25530 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20  ot match..**.** 
25540 47 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a  Globbing rules:.
25550 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20  **.**      '*'  
25560 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79       Matches any
25570 20 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72   sequence of zer
25580 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63  o or more charac
25590 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ters..**.**     
255a0 20 27 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68   '?'       Match
255b0 65 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63  es exactly one c
255c0 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  haracter..**.** 
255d0 20 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d      [...]      M
255e0 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61  atches one chara
255f0 63 74 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e  cter from the en
25600 63 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a  closed list of.*
25610 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
25620 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a   characters..**.
25630 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20  **     [^...]   
25640 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68    Matches one ch
25650 61 72 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74  aracter not in t
25660 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74  he enclosed list
25670 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 23 27  ..**.**      '#'
25680 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 61         Matches a
25690 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 6f  ny sequence of o
256a0 6e 65 20 6f 72 20 6d 6f 72 65 20 64 69 67 69 74  ne or more digit
256b0 73 20 77 69 74 68 20 61 6e 0a 2a 2a 20 20 20 20  s with an.**    
256c0 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 74 69              opti
256d0 6f 6e 61 6c 20 2b 20 6f 72 20 2d 20 73 69 67 6e  onal + or - sign
256e0 20 69 6e 20 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20   in front.**.** 
256f0 20 20 20 20 20 27 20 27 20 20 20 20 20 20 20 41       ' '       A
25700 6e 79 20 73 70 61 6e 20 6f 66 20 77 68 69 74 65  ny span of white
25710 73 70 61 63 65 20 6d 61 74 63 68 65 73 20 61 6e  space matches an
25720 79 20 6f 74 68 65 72 20 73 70 61 6e 20 6f 66 0a  y other span of.
25730 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
25740 20 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a    whitespace..**
25750 0a 2a 2a 20 45 78 74 72 61 20 77 68 69 74 65 73  .** Extra whites
25760 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
25770 6f 66 20 7a 5b 5d 20 69 73 20 69 67 6e 6f 72 65  of z[] is ignore
25780 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
25790 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 63   testcase_glob(c
257a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62  onst char *zGlob
257b0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
257c0 7b 0a 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20  {.  int c, c2;. 
257d0 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69   int invert;.  i
257e0 6e 74 20 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c  nt seen;..  whil
257f0 65 28 20 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62  e( (c = (*(zGlob
25800 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ++)))!=0 ){.    
25810 69 66 28 20 49 73 53 70 61 63 65 28 63 29 20 29  if( IsSpace(c) )
25820 7b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 53  {.      if( !IsS
25830 70 61 63 65 28 2a 7a 29 20 29 20 72 65 74 75 72  pace(*z) ) retur
25840 6e 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  n 0;.      while
25850 28 20 49 73 53 70 61 63 65 28 2a 7a 47 6c 6f 62  ( IsSpace(*zGlob
25860 29 20 29 20 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20  ) ) zGlob++;.   
25870 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63     while( IsSpac
25880 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  e(*z) ) z++;.   
25890 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2a   }else if( c=='*
258a0 27 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  ' ){.      while
258b0 28 20 28 63 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29  ( (c=(*(zGlob++)
258c0 29 29 20 3d 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d  )) == '*' || c==
258d0 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '?' ){.        i
258e0 66 28 20 63 3d 3d 27 3f 27 20 26 26 20 28 2a 28  f( c=='?' && (*(
258f0 7a 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72  z++))==0 ) retur
25900 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
25910 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
25920 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
25930 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
25940 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20   c=='[' ){.     
25950 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20     while( *z && 
25960 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47  testcase_glob(zG
25970 6c 6f 62 2d 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20  lob-1,z)==0 ){. 
25980 20 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20           z++;.  
25990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
259a0 72 65 74 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a  return (*z)!=0;.
259b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
259c0 69 6c 65 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b  ile( (c2 = (*(z+
259d0 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  +)))!=0 ){.     
259e0 20 20 20 77 68 69 6c 65 28 20 63 32 21 3d 63 20     while( c2!=c 
259f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32 20  ){.          c2 
25a00 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20  = *(z++);.      
25a10 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20      if( c2==0 ) 
25a20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
25a30 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
25a40 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47  testcase_glob(zG
25a50 6c 6f 62 2c 7a 29 20 29 20 72 65 74 75 72 6e 20  lob,z) ) return 
25a60 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
25a70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
25a80 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 3f 27 20  else if( c=='?' 
25a90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 28  ){.      if( (*(
25aa0 7a 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72  z++))==0 ) retur
25ab0 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 0;.    }else i
25ac0 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20  f( c=='[' ){.   
25ad0 20 20 20 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d     int prior_c =
25ae0 20 30 3b 0a 20 20 20 20 20 20 73 65 65 6e 20 3d   0;.      seen =
25af0 20 30 3b 0a 20 20 20 20 20 20 69 6e 76 65 72 74   0;.      invert
25b00 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20   = 0;.      c = 
25b10 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66  *(z++);.      if
25b20 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( c==0 ) return 
25b30 30 3b 0a 20 20 20 20 20 20 63 32 20 3d 20 2a 28  0;.      c2 = *(
25b40 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
25b50 69 66 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20  if( c2=='^' ){. 
25b60 20 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20         invert = 
25b70 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20  1;.        c2 = 
25b80 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20  *(zGlob++);.    
25b90 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32    }.      if( c2
25ba0 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20  ==']' ){.       
25bb0 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 73 65   if( c==']' ) se
25bc0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
25bd0 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b  c2 = *(zGlob++);
25be0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77  .      }.      w
25bf0 68 69 6c 65 28 20 63 32 20 26 26 20 63 32 21 3d  hile( c2 && c2!=
25c00 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ']' ){.        i
25c10 66 28 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a 47  f( c2=='-' && zG
25c20 6c 6f 62 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a  lob[0]!=']' && z
25c30 47 6c 6f 62 5b 30 5d 21 3d 30 20 26 26 20 70 72  Glob[0]!=0 && pr
25c40 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20  ior_c>0 ){.     
25c50 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f       c2 = *(zGlo
25c60 62 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  b++);.          
25c70 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26  if( c>=prior_c &
25c80 26 20 63 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d  & c<=c2 ) seen =
25c90 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72   1;.          pr
25ca0 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20  ior_c = 0;.     
25cb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25cc0 20 20 20 20 69 66 28 20 63 3d 3d 63 32 20 29 7b      if( c==c2 ){
25cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65  .            see
25ce0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
25cf0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 72 69   }.          pri
25d00 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20 20  or_c = c2;.     
25d10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 32 20     }.        c2 
25d20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20  = *(zGlob++);.  
25d30 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
25d40 63 32 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e  c2==0 || (seen ^
25d50 20 69 6e 76 65 72 74 29 3d 3d 30 20 29 20 72 65   invert)==0 ) re
25d60 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
25d70 65 20 69 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a  e if( c=='#' ){.
25d80 20 20 20 20 20 20 69 66 28 20 28 7a 5b 30 5d 3d        if( (z[0]=
25d90 3d 27 2d 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b  ='-' || z[0]=='+
25da0 27 29 20 26 26 20 49 73 44 69 67 69 74 28 7a 5b  ') && IsDigit(z[
25db0 31 5d 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20  1]) ) z++;.     
25dc0 20 69 66 28 20 21 49 73 44 69 67 69 74 28 7a 5b   if( !IsDigit(z[
25dd0 30 5d 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  0]) ) return 0;.
25de0 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20        z++;.     
25df0 20 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28   while( IsDigit(
25e00 7a 5b 30 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  z[0]) ){ z++; }.
25e10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25e20 20 69 66 28 20 63 21 3d 28 2a 28 7a 2b 2b 29 29   if( c!=(*(z++))
25e30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
25e40 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20   }.  }.  while( 
25e50 49 73 53 70 61 63 65 28 2a 7a 29 20 29 7b 20 7a  IsSpace(*z) ){ z
25e60 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a  ++; }.  return *
25e70 7a 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  z==0;.}.../*.** 
25e80 43 6f 6d 70 61 72 65 20 74 68 65 20 73 74 72 69  Compare the stri
25e90 6e 67 20 61 73 20 61 20 63 6f 6d 6d 61 6e 64 2d  ng as a command-
25ea0 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 77 69 74 68  line option with
25eb0 20 65 69 74 68 65 72 20 6f 6e 65 20 6f 72 20 74   either one or t
25ec0 77 6f 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 22 2d  wo.** initial "-
25ed0 22 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f  " characters..*/
25ee0 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 74 69  .static int opti
25ef0 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68  onMatch(const ch
25f00 61 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20  ar *zStr, const 
25f10 63 68 61 72 20 2a 7a 4f 70 74 29 7b 0a 20 20 69  char *zOpt){.  i
25f20 66 28 20 7a 53 74 72 5b 30 5d 21 3d 27 2d 27 20  f( zStr[0]!='-' 
25f30 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 53  ) return 0;.  zS
25f40 74 72 2b 2b 3b 0a 20 20 69 66 28 20 7a 53 74 72  tr++;.  if( zStr
25f50 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 53 74 72 2b  [0]=='-' ) zStr+
25f60 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63  +;.  return strc
25f70 6d 70 28 7a 53 74 72 2c 20 7a 4f 70 74 29 3d 3d  mp(zStr, zOpt)==
25f80 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  0;.}../*.** Dele
25f90 74 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e  te a file..*/.in
25fa0 74 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c  t shellDeleteFil
25fb0 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
25fc0 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
25fd0 72 63 3b 0a 23 69 66 64 65 66 20 5f 57 49 4e 33  rc;.#ifdef _WIN3
25fe0 32 0a 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d  2.  wchar_t *z =
25ff0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75   sqlite3_win32_u
26000 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a  tf8_to_unicode(z
26010 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20  Filename);.  rc 
26020 3d 20 5f 77 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20  = _wunlink(z);. 
26030 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
26040 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 75  ;.#else.  rc = u
26050 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29  nlink(zFilename)
26060 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
26070 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
26080 72 79 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ry to delete the
26090 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
260a0 28 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65  (if there is one
260b0 29 20 61 6e 64 20 66 72 65 65 20 74 68 65 0a 2a  ) and free the.*
260c0 2a 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 74 6f  * memory used to
260d0 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 20 6f   hold the name o
260e0 66 20 74 68 65 20 74 65 6d 70 20 66 69 6c 65 2e  f the temp file.
260f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26100 63 6c 65 61 72 54 65 6d 70 46 69 6c 65 28 53 68  clearTempFile(Sh
26110 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
26120 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  if( p->zTempFile
26130 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
26140 69 66 28 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e  if( p->doXdgOpen
26150 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
26160 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65   shellDeleteFile
26170 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 20 29  (p->zTempFile) )
26180 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
26190 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70  e3_free(p->zTemp
261a0 46 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d  File);.  p->zTem
261b0 70 46 69 6c 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  pFile = 0;.}../*
261c0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
261d0 20 74 65 6d 70 20 66 69 6c 65 20 6e 61 6d 65 20   temp file name 
261e0 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 73  with the given s
261f0 75 66 66 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  uffix..*/.static
26200 20 76 6f 69 64 20 6e 65 77 54 65 6d 70 46 69 6c   void newTempFil
26210 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  e(ShellState *p,
26220 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75   const char *zSu
26230 66 66 69 78 29 7b 0a 20 20 63 6c 65 61 72 54 65  ffix){.  clearTe
26240 6d 70 46 69 6c 65 28 70 29 3b 0a 20 20 73 71 6c  mpFile(p);.  sql
26250 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54 65  ite3_free(p->zTe
26260 6d 70 46 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54  mpFile);.  p->zT
26270 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69  empFile = 0;.  i
26280 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20  f( p->db ){.    
26290 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
262a0 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 30 2c 20 53  trol(p->db, 0, S
262b0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50  QLITE_FCNTL_TEMP
262c0 46 49 4c 45 4e 41 4d 45 2c 20 26 70 2d 3e 7a 54  FILENAME, &p->zT
262d0 65 6d 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20  empFile);.  }.  
262e0 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  if( p->zTempFile
262f0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
26300 65 33 5f 75 69 6e 74 36 34 20 72 3b 0a 20 20 20  e3_uint64 r;.   
26310 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
26320 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26  ess(sizeof(r), &
26330 72 29 3b 0a 20 20 20 20 70 2d 3e 7a 54 65 6d 70  r);.    p->zTemp
26340 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
26350 70 72 69 6e 74 66 28 22 74 65 6d 70 25 6c 6c 78  printf("temp%llx
26360 2e 25 73 22 2c 20 72 2c 20 7a 53 75 66 66 69 78  .%s", r, zSuffix
26370 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
26380 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73  p->zTempFile = s
26390 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
263a0 25 7a 2e 25 73 22 2c 20 70 2d 3e 7a 54 65 6d 70  %z.%s", p->zTemp
263b0 46 69 6c 65 2c 20 7a 53 75 66 66 69 78 29 3b 0a  File, zSuffix);.
263c0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65    }.  if( p->zTe
263d0 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  mpFile==0 ){.   
263e0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
263f0 72 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  rr, "out of memo
26400 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  ry\n");.    exit
26410 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  (1);.  }.}.../*.
26420 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
26430 61 74 69 6f 6e 20 6f 66 20 53 51 4c 20 73 63 61  ation of SQL sca
26440 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 6b 65  lar function fke
26450 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65  y_collate_clause
26460 28 29 2c 20 75 73 65 64 0a 2a 2a 20 62 79 20 74  (), used.** by t
26470 68 65 20 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69  he ".lint fkey-i
26480 6e 64 65 78 65 73 22 20 63 6f 6d 6d 61 6e 64 2e  ndexes" command.
26490 20 54 68 69 73 20 73 63 61 6c 61 72 20 66 75 6e   This scalar fun
264a0 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 0a  ction is always.
264b0 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 66  ** called with f
264c0 6f 75 72 20 61 72 67 75 6d 65 6e 74 73 20 2d 20  our arguments - 
264d0 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
264e0 20 6e 61 6d 65 2c 20 74 68 65 20 70 61 72 65 6e   name, the paren
264f0 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 2a  t column name,.*
26500 2a 20 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c  * the child tabl
26510 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 63  e name and the c
26520 68 69 6c 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hild column name
26530 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 6b 65 79 5f 63  ..**.**   fkey_c
26540 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 27 70  ollate_clause('p
26550 61 72 65 6e 74 2d 74 61 62 27 2c 20 27 70 61 72  arent-tab', 'par
26560 65 6e 74 2d 63 6f 6c 27 2c 20 27 63 68 69 6c 64  ent-col', 'child
26570 2d 74 61 62 27 2c 20 27 63 68 69 6c 64 2d 63 6f  -tab', 'child-co
26580 6c 27 29 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74  l').**.** If eit
26590 68 65 72 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  her of the named
265a0 20 74 61 62 6c 65 73 20 6f 72 20 63 6f 6c 75 6d   tables or colum
265b0 6e 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c  ns do not exist,
265c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
265d0 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 6d 70  * returns an emp
265e0 74 79 20 73 74 72 69 6e 67 2e 20 41 6e 20 65 6d  ty string. An em
265f0 70 74 79 20 73 74 72 69 6e 67 20 69 73 20 61 6c  pty string is al
26600 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 62  so returned if b
26610 6f 74 68 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e  oth tables.** an
26620 64 20 63 6f 6c 75 6d 6e 73 20 65 78 69 73 74 20  d columns exist 
26630 62 75 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  but have the sam
26640 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
26650 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 4f 72  ion sequence. Or
26660 2c 0a 2a 2a 20 69 66 20 62 6f 74 68 20 65 78 69  ,.** if both exi
26670 73 74 20 62 75 74 20 74 68 65 20 64 65 66 61 75  st but the defau
26680 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  lt collation seq
26690 75 65 6e 63 65 73 20 61 72 65 20 64 69 66 66 65  uences are diffe
266a0 72 65 6e 74 2c 20 74 68 69 73 0a 2a 2a 20 66 75  rent, this.** fu
266b0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
266c0 68 65 20 73 74 72 69 6e 67 20 22 20 43 4f 4c 4c  he string " COLL
266d0 41 54 45 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c  ATE <parent-coll
266e0 61 74 69 6f 6e 3e 22 2c 20 77 68 65 72 65 0a 2a  ation>", where.*
266f0 2a 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74  * <parent-collat
26700 69 6f 6e 3e 20 69 73 20 74 68 65 20 64 65 66 61  ion> is the defa
26710 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ult collation se
26720 71 75 65 6e 63 65 20 6f 66 20 74 68 65 20 70 61  quence of the pa
26730 72 65 6e 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  rent column..*/.
26740 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
26750 6c 46 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75  lFkeyCollateClau
26760 73 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  se(.  sqlite3_co
26770 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 69  ntext *pCtx,.  i
26780 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74  nt nVal,.  sqlit
26790 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
267a0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
267b0 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
267c0 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43  ext_db_handle(pC
267d0 74 78 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  tx);.  const cha
267e0 72 20 2a 7a 50 61 72 65 6e 74 3b 0a 20 20 63 6f  r *zParent;.  co
267f0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  nst char *zParen
26800 74 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68  tCol;.  const ch
26810 61 72 20 2a 7a 50 61 72 65 6e 74 53 65 71 3b 0a  ar *zParentSeq;.
26820 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
26830 68 69 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68  hild;.  const ch
26840 61 72 20 2a 7a 43 68 69 6c 64 43 6f 6c 3b 0a 20  ar *zChildCol;. 
26850 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68   const char *zCh
26860 69 6c 64 53 65 71 20 3d 20 30 3b 20 20 2f 2a 20  ildSeq = 0;  /* 
26870 49 6e 69 74 69 61 6c 69 7a 65 20 74 6f 20 61 76  Initialize to av
26880 6f 69 64 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  oid false-positi
26890 76 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20  ve warning */.  
268a0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
268b0 74 28 20 6e 56 61 6c 3d 3d 34 20 29 3b 0a 20 20  t( nVal==4 );.  
268c0 7a 50 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74  zParent = (const
268d0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
268e0 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
268f0 30 5d 29 3b 0a 20 20 7a 50 61 72 65 6e 74 43 6f  0]);.  zParentCo
26900 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
26910 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
26920 65 78 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20  ext(apVal[1]);. 
26930 20 7a 43 68 69 6c 64 20 3d 20 28 63 6f 6e 73 74   zChild = (const
26940 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
26950 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
26960 32 5d 29 3b 0a 20 20 7a 43 68 69 6c 64 43 6f 6c  2]);.  zChildCol
26970 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
26980 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
26990 78 74 28 61 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20  xt(apVal[3]);.. 
269a0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
269b0 74 65 78 74 28 70 43 74 78 2c 20 22 22 2c 20 2d  text(pCtx, "", -
269c0 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
269d0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
269e0 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
269f0 65 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 64  etadata(.      d
26a00 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 50 61 72 65  b, "main", zPare
26a10 6e 74 2c 20 7a 50 61 72 65 6e 74 43 6f 6c 2c 20  nt, zParentCol, 
26a20 30 2c 20 26 7a 50 61 72 65 6e 74 53 65 71 2c 20  0, &zParentSeq, 
26a30 30 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69  0, 0, 0.  );.  i
26a40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26a50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
26a60 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
26a70 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20 20  n_metadata(.    
26a80 20 20 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20      db, "main", 
26a90 7a 43 68 69 6c 64 2c 20 7a 43 68 69 6c 64 43 6f  zChild, zChildCo
26aa0 6c 2c 20 30 2c 20 26 7a 43 68 69 6c 64 53 65 71  l, 0, &zChildSeq
26ab0 2c 20 30 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b  , 0, 0, 0.    );
26ac0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
26ad0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c  SQLITE_OK && sql
26ae0 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 50 61  ite3_stricmp(zPa
26af0 72 65 6e 74 53 65 71 2c 20 7a 43 68 69 6c 64 53  rentSeq, zChildS
26b00 65 71 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  eq) ){.    char 
26b10 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  *z = sqlite3_mpr
26b20 69 6e 74 66 28 22 20 43 4f 4c 4c 41 54 45 20 25  intf(" COLLATE %
26b30 73 22 2c 20 7a 50 61 72 65 6e 74 53 65 71 29 3b  s", zParentSeq);
26b40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
26b50 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a  ult_text(pCtx, z
26b60 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
26b70 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
26b80 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
26b90 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  }.}.../*.** The 
26ba0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
26bb0 66 20 64 6f 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e  f dot-command ".
26bc0 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78 65  lint fkey-indexe
26bd0 73 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  s"..*/.static in
26be0 74 20 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78 65  t lintFkeyIndexe
26bf0 73 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  s(.  ShellState 
26c00 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20  *pState,        
26c10 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
26c20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65  shell tool state
26c30 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41   */.  char **azA
26c40 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
26c50 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
26c60 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
26c70 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e  ed to dot comman
26c80 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20  d */.  int nArg 
26c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ca0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
26cb0 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
26cc0 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73  zArg[] */.){.  s
26cd0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 53 74  qlite3 *db = pSt
26ce0 61 74 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f  ate->db;       /
26cf0 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
26d00 65 20 74 6f 20 71 75 65 72 79 20 22 6d 61 69 6e  e to query "main
26d10 22 20 64 62 20 6f 66 20 2a 2f 0a 20 20 46 49 4c  " db of */.  FIL
26d20 45 20 2a 6f 75 74 20 3d 20 70 53 74 61 74 65 2d  E *out = pState-
26d30 3e 6f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  >out;        /* 
26d40 53 74 72 65 61 6d 20 74 6f 20 77 72 69 74 65 20  Stream to write 
26d50 6e 6f 6e 2d 65 72 72 6f 72 20 6f 75 74 70 75 74  non-error output
26d60 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 62 56 65   to */.  int bVe
26d70 72 62 6f 73 65 20 3d 20 30 3b 20 20 20 20 20 20  rbose = 0;      
26d80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 2d           /* If -
26d90 76 65 72 62 6f 73 65 20 69 73 20 70 72 65 73 65  verbose is prese
26da0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62 47 72 6f  nt */.  int bGro
26db0 75 70 42 79 50 61 72 65 6e 74 20 3d 20 30 3b 20  upByParent = 0; 
26dc0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 67          /* If -g
26dd0 72 6f 75 70 62 79 70 61 72 65 6e 74 20 69 73 20  roupbyparent is 
26de0 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
26df0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
26e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26e10 54 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  To iterate throu
26e20 67 68 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20  gh azArg[] */.  
26e30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 64  const char *zInd
26e40 65 6e 74 20 3d 20 22 22 3b 20 20 20 20 20 20 20  ent = "";       
26e50 2f 2a 20 48 6f 77 20 6d 75 63 68 20 74 6f 20 69  /* How much to i
26e60 6e 64 65 6e 74 20 43 52 45 41 54 45 20 49 4e 44  ndent CREATE IND
26e70 45 58 20 62 79 20 2a 2f 0a 20 20 69 6e 74 20 72  EX by */.  int r
26e80 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
26e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
26ea0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
26eb0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71  qlite3_stmt *pSq
26ec0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  l = 0;         /
26ed0 2a 20 43 6f 6d 70 69 6c 65 64 20 76 65 72 73 69  * Compiled versi
26ee0 6f 6e 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  on of SQL statem
26ef0 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20  ent below */..  
26f00 2f 2a 0a 20 20 2a 2a 20 54 68 69 73 20 53 45 4c  /*.  ** This SEL
26f10 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 72 65  ECT statement re
26f20 74 75 72 6e 73 20 6f 6e 65 20 72 6f 77 20 66 6f  turns one row fo
26f30 72 20 65 61 63 68 20 66 6f 72 65 69 67 6e 20 6b  r each foreign k
26f40 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20  ey constraint.  
26f50 2a 2a 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ** in the schema
26f60 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   of the main dat
26f70 61 62 61 73 65 2e 20 54 68 65 20 63 6f 6c 75 6d  abase. The colum
26f80 6e 20 76 61 6c 75 65 73 20 61 72 65 3a 0a 20 20  n values are:.  
26f90 2a 2a 0a 20 20 2a 2a 20 30 2e 20 54 68 65 20 74  **.  ** 0. The t
26fa0 65 78 74 20 6f 66 20 61 6e 20 53 51 4c 20 73 74  ext of an SQL st
26fb0 61 74 65 6d 65 6e 74 20 73 69 6d 69 6c 61 72 20  atement similar 
26fc0 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
26fd0 20 20 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52     "EXPLAIN QUER
26fe0 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 31 20  Y PLAN SELECT 1 
26ff0 46 52 4f 4d 20 63 68 69 6c 64 5f 74 61 62 6c 65  FROM child_table
27000 20 57 48 45 52 45 20 63 68 69 6c 64 5f 6b 65 79   WHERE child_key
27010 3d 3f 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  =?".  **.  **   
27020 20 54 68 69 73 20 53 45 4c 45 43 54 20 69 73 20   This SELECT is 
27030 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 6f  similar to the o
27040 6e 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65  ne that the fore
27050 69 67 6e 20 6b 65 79 73 20 69 6d 70 6c 65 6d 65  ign keys impleme
27060 6e 74 61 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20  ntation.  **    
27070 6e 65 65 64 73 20 74 6f 20 72 75 6e 20 69 6e 74  needs to run int
27080 65 72 6e 61 6c 6c 79 20 6f 6e 20 63 68 69 6c 64  ernally on child
27090 20 74 61 62 6c 65 73 2e 20 49 66 20 74 68 65 72   tables. If ther
270a0 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  e is an index th
270b0 61 74 20 63 61 6e 0a 20 20 2a 2a 20 20 20 20 62  at can.  **    b
270c0 65 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69  e used to optimi
270d0 7a 65 20 74 68 69 73 20 71 75 65 72 79 2c 20 74  ze this query, t
270e0 68 65 6e 20 69 74 20 63 61 6e 20 61 6c 73 6f 20  hen it can also 
270f0 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20 46  be used by the F
27100 4b 0a 20 20 2a 2a 20 20 20 20 69 6d 70 6c 65 6d  K.  **    implem
27110 65 6e 74 61 74 69 6f 6e 20 74 6f 20 6f 70 74 69  entation to opti
27120 6d 69 7a 65 20 44 45 4c 45 54 45 20 6f 72 20 55  mize DELETE or U
27130 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
27140 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 0a 20   on the parent. 
27150 20 2a 2a 20 20 20 20 74 61 62 6c 65 2e 0a 20 20   **    table..  
27160 2a 2a 0a 20 20 2a 2a 20 31 2e 20 41 20 47 4c 4f  **.  ** 1. A GLO
27170 42 20 70 61 74 74 65 72 6e 20 73 75 69 74 61 62  B pattern suitab
27180 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 73  le for sqlite3_s
27190 74 72 67 6c 6f 62 28 29 2e 20 49 66 20 74 68 65  trglob(). If the
271a0 20 70 6c 61 6e 20 6f 75 74 70 75 74 20 62 79 0a   plan output by.
271b0 20 20 2a 2a 20 20 20 20 74 68 65 20 45 58 50 4c    **    the EXPL
271c0 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63  AIN QUERY PLAN c
271d0 6f 6d 6d 61 6e 64 20 6d 61 74 63 68 65 73 20 74  ommand matches t
271e0 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65  his pattern, the
271f0 6e 20 74 68 65 20 73 63 68 65 6d 61 0a 20 20 2a  n the schema.  *
27200 2a 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e  *    contains an
27210 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20   index that can 
27220 62 65 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d  be used to optim
27230 69 7a 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20  ize the query.. 
27240 20 2a 2a 0a 20 20 2a 2a 20 32 2e 20 48 75 6d 61   **.  ** 2. Huma
27250 6e 20 72 65 61 64 61 62 6c 65 20 74 65 78 74 20  n readable text 
27260 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
27270 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 61  he child table a
27280 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e  nd columns. e.g.
27290 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
272a0 20 22 63 68 69 6c 64 5f 74 61 62 6c 65 28 63 68   "child_table(ch
272b0 69 6c 64 5f 6b 65 79 31 2c 20 63 68 69 6c 64 5f  ild_key1, child_
272c0 6b 65 79 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a  key2)".  **.  **
272d0 20 33 2e 20 48 75 6d 61 6e 20 72 65 61 64 61 62   3. Human readab
272e0 6c 65 20 74 65 78 74 20 74 68 61 74 20 64 65 73  le text that des
272f0 63 72 69 62 65 73 20 74 68 65 20 70 61 72 65 6e  cribes the paren
27300 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  t table and colu
27310 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20  mns. e.g..  **. 
27320 20 2a 2a 20 20 20 20 20 20 20 22 70 61 72 65 6e   **       "paren
27330 74 5f 74 61 62 6c 65 28 70 61 72 65 6e 74 5f 6b  t_table(parent_k
27340 65 79 31 2c 20 70 61 72 65 6e 74 5f 6b 65 79 32  ey1, parent_key2
27350 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 34 2e 20  )".  **.  ** 4. 
27360 41 20 66 75 6c 6c 20 43 52 45 41 54 45 20 49 4e  A full CREATE IN
27370 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  DEX statement fo
27380 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  r an index that 
27390 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f  could be used to
273a0 0a 20 20 2a 2a 20 20 20 20 6f 70 74 69 6d 69 7a  .  **    optimiz
273b0 65 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41  e DELETE or UPDA
273c0 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  TE statements on
273d0 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
273e0 65 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a  e. e.g..  **.  *
273f0 2a 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20  *       "CREATE 
27400 49 4e 44 45 58 20 63 68 69 6c 64 5f 74 61 62 6c  INDEX child_tabl
27410 65 5f 63 68 69 6c 64 5f 6b 65 79 20 4f 4e 20 63  e_child_key ON c
27420 68 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64  hild_table(child
27430 5f 6b 65 79 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a  _key)".  **.  **
27440 20 35 2e 20 54 68 65 20 6e 61 6d 65 20 6f 66 20   5. The name of 
27450 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
27460 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 73  ..  **.  ** Thes
27470 65 20 73 69 78 20 76 61 6c 75 65 73 20 61 72 65  e six values are
27480 20 75 73 65 64 20 62 79 20 74 68 65 20 43 20 6c   used by the C l
27490 6f 67 69 63 20 62 65 6c 6f 77 20 74 6f 20 67 65  ogic below to ge
274a0 6e 65 72 61 74 65 20 74 68 65 20 72 65 70 6f 72  nerate the repor
274b0 74 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  t..  */.  const 
274c0 63 68 61 72 20 2a 7a 53 71 6c 20 3d 0a 20 20 22  char *zSql =.  "
274d0 53 45 4c 45 43 54 20 22 0a 20 20 20 20 22 20 20  SELECT ".    "  
274e0 20 20 20 27 45 58 50 4c 41 49 4e 20 51 55 45 52     'EXPLAIN QUER
274f0 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 31 20  Y PLAN SELECT 1 
27500 46 52 4f 4d 20 27 20 7c 7c 20 71 75 6f 74 65 28  FROM ' || quote(
27510 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 20 57 48 45  s.name) || ' WHE
27520 52 45 20 27 22 0a 20 20 20 20 22 20 20 7c 7c 20  RE '".    "  || 
27530 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f  group_concat(quo
27540 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 2e  te(s.name) || '.
27550 27 20 7c 7c 20 71 75 6f 74 65 28 66 2e 5b 66 72  ' || quote(f.[fr
27560 6f 6d 5d 29 20 7c 7c 20 27 3d 3f 27 20 22 0a 20  om]) || '=?' ". 
27570 20 20 20 22 20 20 7c 7c 20 66 6b 65 79 5f 63 6f     "  || fkey_co
27580 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 22 0a 20  llate_clause(". 
27590 20 20 20 22 20 20 20 20 20 20 20 66 2e 5b 74 61     "       f.[ta
275a0 62 6c 65 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66  ble], COALESCE(f
275b0 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29  .[to], p.[name])
275c0 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f  , s.name, f.[fro
275d0 6d 5d 29 2c 27 20 41 4e 44 20 27 29 22 0a 20 20  m]),' AND ')".  
275e0 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20    ", ".    "    
275f0 20 27 53 45 41 52 43 48 20 54 41 42 4c 45 20 27   'SEARCH TABLE '
27600 20 7c 7c 20 73 2e 6e 61 6d 65 20 7c 7c 20 27 20   || s.name || ' 
27610 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
27620 4e 44 45 58 2a 28 27 22 0a 20 20 20 20 22 20 20  NDEX*('".    "  
27630 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
27640 27 2a 3d 3f 27 2c 20 27 20 41 4e 44 20 27 29 20  '*=?', ' AND ') 
27650 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22  || ')'".    ", "
27660 0a 20 20 20 20 22 20 20 20 20 20 73 2e 6e 61 6d  .    "     s.nam
27670 65 20 20 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f  e  || '(' || gro
27680 75 70 5f 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f  up_concat(f.[fro
27690 6d 5d 2c 20 20 27 2c 20 27 29 20 7c 7c 20 27 29  m],  ', ') || ')
276a0 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20  '".    ", ".    
276b0 22 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20  "     f.[table] 
276c0 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f  || '(' || group_
276d0 63 6f 6e 63 61 74 28 43 4f 41 4c 45 53 43 45 28  concat(COALESCE(
276e0 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d  f.[to], p.[name]
276f0 29 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20 22  )) || ')'".    "
27700 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 43  , ".    "     'C
27710 52 45 41 54 45 20 49 4e 44 45 58 20 27 20 7c 7c  REATE INDEX ' ||
27720 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 20 7c 7c   quote(s.name ||
27730 27 5f 27 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  '_'|| group_conc
27740 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20 27 5f 27  at(f.[from], '_'
27750 29 29 22 0a 20 20 20 20 22 20 20 7c 7c 20 27 20  ))".    "  || ' 
27760 4f 4e 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e  ON ' || quote(s.
27770 6e 61 6d 65 29 20 7c 7c 20 27 28 27 22 0a 20 20  name) || '('".  
27780 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f    "  || group_co
27790 6e 63 61 74 28 71 75 6f 74 65 28 66 2e 5b 66 72  ncat(quote(f.[fr
277a0 6f 6d 5d 29 20 7c 7c 22 0a 20 20 20 20 22 20 20  om]) ||".    "  
277b0 20 20 20 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61        fkey_colla
277c0 74 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20  te_clause(".    
277d0 22 20 20 20 20 20 20 20 20 20 20 66 2e 5b 74 61  "          f.[ta
277e0 62 6c 65 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66  ble], COALESCE(f
277f0 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29  .[to], p.[name])
27800 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f  , s.name, f.[fro
27810 6d 5d 29 2c 20 27 2c 20 27 29 22 0a 20 20 20 20  m]), ', ')".    
27820 22 20 20 7c 7c 20 27 29 3b 27 22 0a 20 20 20 20  "  || ');'".    
27830 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 66  ", ".    "     f
27840 2e 5b 74 61 62 6c 65 5d 20 22 0a 20 20 20 20 22  .[table] ".    "
27850 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
27860 65 72 20 41 53 20 73 2c 20 70 72 61 67 6d 61 5f  er AS s, pragma_
27870 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74  foreign_key_list
27880 28 73 2e 6e 61 6d 65 29 20 41 53 20 66 20 22 0a  (s.name) AS f ".
27890 20 20 20 20 22 4c 45 46 54 20 4a 4f 49 4e 20 70      "LEFT JOIN p
278a0 72 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f  ragma_table_info
278b0 20 41 53 20 70 20 4f 4e 20 28 70 6b 2d 31 3d 73   AS p ON (pk-1=s
278c0 65 71 20 41 4e 44 20 70 2e 61 72 67 3d 66 2e 5b  eq AND p.arg=f.[
278d0 74 61 62 6c 65 5d 29 20 22 0a 20 20 20 20 22 47  table]) ".    "G
278e0 52 4f 55 50 20 42 59 20 73 2e 6e 61 6d 65 2c 20  ROUP BY s.name, 
278f0 66 2e 69 64 20 22 0a 20 20 20 20 22 4f 52 44 45  f.id ".    "ORDE
27900 52 20 42 59 20 28 43 41 53 45 20 57 48 45 4e 20  R BY (CASE WHEN 
27910 3f 20 54 48 45 4e 20 66 2e 5b 74 61 62 6c 65 5d  ? THEN f.[table]
27920 20 45 4c 53 45 20 73 2e 6e 61 6d 65 20 45 4e 44   ELSE s.name END
27930 29 22 0a 20 20 3b 0a 20 20 63 6f 6e 73 74 20 63  )".  ;.  const c
27940 68 61 72 20 2a 7a 47 6c 6f 62 49 50 4b 20 3d 20  har *zGlobIPK = 
27950 22 53 45 41 52 43 48 20 54 41 42 4c 45 20 2a 20  "SEARCH TABLE * 
27960 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52  USING INTEGER PR
27970 49 4d 41 52 59 20 4b 45 59 20 28 72 6f 77 69 64  IMARY KEY (rowid
27980 3d 3f 29 22 3b 0a 0a 20 20 66 6f 72 28 69 3d 32  =?)";..  for(i=2
27990 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
279a0 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
279b0 65 6e 33 30 28 61 7a 41 72 67 5b 69 5d 29 3b 0a  en30(azArg[i]);.
279c0 20 20 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73      if( n>1 && s
279d0 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
279e0 22 2d 76 65 72 62 6f 73 65 22 2c 20 61 7a 41 72  "-verbose", azAr
279f0 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  g[i], n)==0 ){. 
27a00 20 20 20 20 20 62 56 65 72 62 6f 73 65 20 3d 20       bVerbose = 
27a10 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  1;.    }.    els
27a20 65 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c  e if( n>1 && sql
27a30 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d  ite3_strnicmp("-
27a40 67 72 6f 75 70 62 79 70 61 72 65 6e 74 22 2c 20  groupbyparent", 
27a50 61 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20  azArg[i], n)==0 
27a60 29 7b 0a 20 20 20 20 20 20 62 47 72 6f 75 70 42  ){.      bGroupB
27a70 79 50 61 72 65 6e 74 20 3d 20 31 3b 0a 20 20 20  yParent = 1;.   
27a80 20 20 20 7a 49 6e 64 65 6e 74 20 3d 20 22 20 20     zIndent = "  
27a90 20 20 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65    ";.    }.    e
27aa0 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
27ab0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
27ac0 73 61 67 65 3a 20 25 73 20 25 73 20 3f 2d 76 65  sage: %s %s ?-ve
27ad0 72 62 6f 73 65 3f 20 3f 2d 67 72 6f 75 70 62 79  rbose? ?-groupby
27ae0 70 61 72 65 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20  parent?\n",.    
27af0 20 20 20 20 20 20 61 7a 41 72 67 5b 30 5d 2c 20        azArg[0], 
27b00 61 7a 41 72 67 5b 31 5d 0a 20 20 20 20 20 20 29  azArg[1].      )
27b10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
27b20 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
27b30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67   }.  }..  /* Reg
27b40 69 73 74 65 72 20 74 68 65 20 66 6b 65 79 5f 63  ister the fkey_c
27b50 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 20  ollate_clause() 
27b60 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  SQL function */.
27b70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
27b80 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
27b90 62 2c 20 22 66 6b 65 79 5f 63 6f 6c 6c 61 74 65  b, "fkey_collate
27ba0 5f 63 6c 61 75 73 65 22 2c 20 34 2c 20 53 51 4c  _clause", 4, SQL
27bb0 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
27bc0 30 2c 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c  0, shellFkeyColl
27bd0 61 74 65 43 6c 61 75 73 65 2c 20 30 2c 20 30 0a  ateClause, 0, 0.
27be0 20 20 29 3b 0a 0a 0a 20 20 69 66 28 20 72 63 3d    );...  if( rc=
27bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27c00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
27c10 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
27c20 71 6c 2c 20 2d 31 2c 20 26 70 53 71 6c 2c 20 30  ql, -1, &pSql, 0
27c30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
27c40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27c50 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
27c60 6e 74 28 70 53 71 6c 2c 20 31 2c 20 62 47 72 6f  nt(pSql, 1, bGro
27c70 75 70 42 79 50 61 72 65 6e 74 29 3b 0a 20 20 7d  upByParent);.  }
27c80 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
27c90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
27ca0 20 72 63 32 3b 0a 20 20 20 20 63 68 61 72 20 2a   rc2;.    char *
27cb0 7a 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 77  zPrev = 0;.    w
27cc0 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
27cd0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
27ce0 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  Sql) ){.      in
27cf0 74 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  t res = -1;.    
27d00 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
27d10 70 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20  pExplain = 0;.  
27d20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
27d30 7a 45 51 50 20 3d 20 28 63 6f 6e 73 74 20 63 68  zEQP = (const ch
27d40 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
27d50 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29  mn_text(pSql, 0)
27d60 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
27d70 61 72 20 2a 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e  ar *zGlob = (con
27d80 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
27d90 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
27da0 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e  l, 1);.      con
27db0 73 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d  st char *zFrom =
27dc0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
27dd0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
27de0 74 28 70 53 71 6c 2c 20 32 29 3b 0a 20 20 20 20  t(pSql, 2);.    
27df0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
27e00 61 72 67 65 74 20 3d 20 28 63 6f 6e 73 74 20 63  arget = (const c
27e10 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
27e20 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33  umn_text(pSql, 3
27e30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
27e40 68 61 72 20 2a 7a 43 49 20 3d 20 28 63 6f 6e 73  har *zCI = (cons
27e50 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
27e60 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
27e70 2c 20 34 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , 4);.      cons
27e80 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 20  t char *zParent 
27e90 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
27ea0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
27eb0 78 74 28 70 53 71 6c 2c 20 35 29 3b 0a 0a 20 20  xt(pSql, 5);..  
27ec0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27ed0 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
27ee0 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c  zEQP, -1, &pExpl
27ef0 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ain, 0);.      i
27f00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27f10 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
27f20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
27f30 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78  sqlite3_step(pEx
27f40 70 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  plain) ){.      
27f50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
27f60 6c 61 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  lan = (const cha
27f70 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
27f80 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c  n_text(pExplain,
27f90 20 33 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73   3);.        res
27fa0 20 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 20   = (.           
27fb0 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74     0==sqlite3_st
27fc0 72 67 6c 6f 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c  rglob(zGlob, zPl
27fd0 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  an).           |
27fe0 7c 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  | 0==sqlite3_str
27ff0 67 6c 6f 62 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a  glob(zGlobIPK, z
28000 50 6c 61 6e 29 0a 20 20 20 20 20 20 20 20 29 3b  Plan).        );
28010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
28020 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
28030 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a  lize(pExplain);.
28040 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28050 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
28060 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c  ..      if( res<
28070 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  0 ){.        raw
28080 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
28090 22 45 72 72 6f 72 3a 20 69 6e 74 65 72 6e 61 6c  "Error: internal
280a0 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20   error");.      
280b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
280c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
280d0 28 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74  ( bGroupByParent
280e0 0a 20 20 20 20 20 20 20 20 26 26 20 28 62 56 65  .        && (bVe
280f0 72 62 6f 73 65 20 7c 7c 20 72 65 73 3d 3d 30 29  rbose || res==0)
28100 0a 20 20 20 20 20 20 20 20 26 26 20 28 7a 50 72  .        && (zPr
28110 65 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ev==0 || sqlite3
28120 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74  _stricmp(zParent
28130 2c 20 7a 50 72 65 76 29 29 0a 20 20 20 20 20 20  , zPrev)).      
28140 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72    ){.          r
28150 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
28160 2d 2d 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20  -- Parent table 
28170 25 73 5c 6e 22 2c 20 7a 50 61 72 65 6e 74 29 3b  %s\n", zParent);
28180 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
28190 65 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a  e3_free(zPrev);.
281a0 20 20 20 20 20 20 20 20 20 20 7a 50 72 65 76 20            zPrev 
281b0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
281c0 66 28 22 25 73 22 2c 20 7a 50 61 72 65 6e 74 29  f("%s", zParent)
281d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
281e0 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
281f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
28200 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
28210 25 73 20 2d 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49  %s --> %s\n", zI
28220 6e 64 65 6e 74 2c 20 7a 43 49 2c 20 7a 54 61 72  ndent, zCI, zTar
28230 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  get);.        }e
28240 6c 73 65 20 69 66 28 20 62 56 65 72 62 6f 73 65  lse if( bVerbose
28250 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61   ){.          ra
28260 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
28270 73 2f 2a 20 6e 6f 20 65 78 74 72 61 20 69 6e 64  s/* no extra ind
28280 65 78 65 73 20 72 65 71 75 69 72 65 64 20 66 6f  exes required fo
28290 72 20 25 73 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22  r %s -> %s */\n"
282a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
282b0 7a 49 6e 64 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20  zIndent, zFrom, 
282c0 7a 54 61 72 67 65 74 0a 20 20 20 20 20 20 20 20  zTarget.        
282d0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20    );.        }. 
282e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
282f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
28300 72 65 76 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  rev);..    if( r
28310 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28320 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
28330 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c  (stderr, "%s\n",
28340 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
28350 64 62 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  db));.    }..   
28360 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66   rc2 = sqlite3_f
28370 69 6e 61 6c 69 7a 65 28 70 53 71 6c 29 3b 0a 20  inalize(pSql);. 
28380 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28390 45 5f 4f 4b 20 26 26 20 72 63 32 21 3d 53 51 4c  E_OK && rc2!=SQL
283a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
283b0 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
283c0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
283d0 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  r, "%s\n", sqlit
283e0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
283f0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
28400 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
28410 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71  derr, "%s\n", sq
28420 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
28430 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
28440 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
28450 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
28460 22 2e 6c 69 6e 74 22 20 64 6f 74 20 63 6f 6d 6d  ".lint" dot comm
28470 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  and..*/.static i
28480 6e 74 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e  nt lintDotComman
28490 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  d(.  ShellState 
284a0 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20  *pState,        
284b0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
284c0 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65  shell tool state
284d0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41   */.  char **azA
284e0 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
284f0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
28500 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
28510 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e  ed to dot comman
28520 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20  d */.  int nArg 
28530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28540 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
28550 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
28560 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69  zArg[] */.){.  i
28570 6e 74 20 6e 3b 0a 20 20 6e 20 3d 20 28 6e 41 72  nt n;.  n = (nAr
28580 67 3e 3d 32 20 3f 20 73 74 72 6c 65 6e 33 30 28  g>=2 ? strlen30(
28590 61 7a 41 72 67 5b 31 5d 29 20 3a 20 30 29 3b 0a  azArg[1]) : 0);.
285a0 20 20 69 66 28 20 6e 3c 31 20 7c 7c 20 73 71 6c    if( n<1 || sql
285b0 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 61 7a  ite3_strnicmp(az
285c0 41 72 67 5b 31 5d 2c 20 22 66 6b 65 79 2d 69 6e  Arg[1], "fkey-in
285d0 64 65 78 65 73 22 2c 20 6e 29 20 29 20 67 6f 74  dexes", n) ) got
285e0 6f 20 75 73 61 67 65 3b 0a 20 20 72 65 74 75 72  o usage;.  retur
285f0 6e 20 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78 65  n lintFkeyIndexe
28600 73 28 70 53 74 61 74 65 2c 20 61 7a 41 72 67 2c  s(pState, azArg,
28610 20 6e 41 72 67 29 3b 0a 0a 20 75 73 61 67 65 3a   nArg);.. usage:
28620 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74  .  raw_printf(st
28630 64 65 72 72 2c 20 22 55 73 61 67 65 20 25 73 20  derr, "Usage %s 
28640 73 75 62 2d 63 6f 6d 6d 61 6e 64 20 3f 73 77 69  sub-command ?swi
28650 74 63 68 65 73 2e 2e 2e 3f 5c 6e 22 2c 20 61 7a  tches...?\n", az
28660 41 72 67 5b 30 5d 29 3b 0a 20 20 72 61 77 5f 70  Arg[0]);.  raw_p
28670 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57  rintf(stderr, "W
28680 68 65 72 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64  here sub-command
28690 73 20 61 72 65 3a 5c 6e 22 29 3b 0a 20 20 72 61  s are:\n");.  ra
286a0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
286b0 20 22 20 20 20 20 66 6b 65 79 2d 69 6e 64 65 78   "    fkey-index
286c0 65 73 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e  es\n");.  return
286d0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
286e0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
286f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
28700 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
28710 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f  ned(SQLITE_HAVE_
28720 5a 4c 49 42 29 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ZLIB)./*********
28730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28770 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
28780 22 2e 61 72 63 68 69 76 65 22 20 6f 72 20 22 2e  ".archive" or ".
28790 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  ar" command..*/.
287a0 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
287b0 6c 50 72 65 70 61 72 65 28 0a 20 20 73 71 6c 69  lPrepare(.  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 63 6f 6e 73 74 20 63  *pRc, .  const c
287e0 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 73 71  har *zSql, .  sq
287f0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
28800 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74  tmt.){.  *ppStmt
28810 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63   = 0;.  if( *pRc
28820 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28830 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
28840 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
28850 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53  b, zSql, -1, ppS
28860 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
28870 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28880 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
28890 74 66 28 73 74 64 65 72 72 2c 20 22 73 71 6c 20  tf(stderr, "sql 
288a0 65 72 72 6f 72 3a 20 25 73 20 28 25 64 29 5c 6e  error: %s (%d)\n
288b0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  ", .          sq
288c0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
288d0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  , sqlite3_errcod
288e0 65 28 64 62 29 0a 20 20 20 20 20 20 29 3b 0a 20  e(db).      );. 
288f0 20 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a       *pRc = rc;.
28900 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61      }.  }.}..sta
28910 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 72  tic void shellPr
28920 65 70 61 72 65 50 72 69 6e 74 66 28 0a 20 20 73  eparePrintf(.  s
28930 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69  qlite3 *db, .  i
28940 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69  nt *pRc, .  sqli
28950 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d  te3_stmt **ppStm
28960 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t,.  const char 
28970 2a 7a 46 6d 74 2c 20 0a 20 20 2e 2e 2e 0a 29 7b  *zFmt, .  ....){
28980 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a  .  *ppStmt = 0;.
28990 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
289a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 61 5f  TE_OK ){.    va_
289b0 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 63 68 61  list ap;.    cha
289c0 72 20 2a 7a 3b 0a 20 20 20 20 76 61 5f 73 74 61  r *z;.    va_sta
289d0 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20  rt(ap, zFmt);.  
289e0 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d    z = sqlite3_vm
289f0 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29  printf(zFmt, ap)
28a00 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
28a10 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
28a20 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
28a30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
28a40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 68   }else{.      sh
28a50 65 6c 6c 50 72 65 70 61 72 65 28 64 62 2c 20 70  ellPrepare(db, p
28a60 52 63 2c 20 7a 2c 20 70 70 53 74 6d 74 29 3b 0a  Rc, z, ppStmt);.
28a70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
28a80 65 65 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ee(z);.    }.  }
28a90 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
28aa0 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 0a 20  shellFinalize(. 
28ab0 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71   int *pRc, .  sq
28ac0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
28ad0 74 0a 29 7b 0a 20 20 69 66 28 20 70 53 74 6d 74  t.){.  if( pStmt
28ae0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
28af0 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62  *db = sqlite3_db
28b00 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a  _handle(pStmt);.
28b10 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
28b20 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
28b30 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  tmt);.    if( *p
28b40 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
28b50 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
28b60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28b70 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
28b80 74 64 65 72 72 2c 20 22 53 51 4c 20 65 72 72 6f  tderr, "SQL erro
28b90 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
28ba0 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
28bb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 52       }.      *pR
28bc0 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  c = rc;.    }.  
28bd0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
28be0 20 73 68 65 6c 6c 52 65 73 65 74 28 0a 20 20 69   shellReset(.  i
28bf0 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69  nt *pRc, .  sqli
28c00 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a  te3_stmt *pStmt.
28c10 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ){.  int rc = sq
28c20 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
28c30 74 29 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  t);.  if( *pRc==
28c40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28c50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28c60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
28c70 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
28c80 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d  3_db_handle(pStm
28c90 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  t);.      raw_pr
28ca0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51  intf(stderr, "SQ
28cb0 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20  L error: %s\n", 
28cc0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
28cd0 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  b));.    }.    *
28ce0 70 52 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a  pRc = rc;.  }.}.
28cf0 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20  /*.** Structure 
28d00 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 20 73  representing a s
28d10 69 6e 67 6c 65 20 22 2e 61 72 22 20 63 6f 6d 6d  ingle ".ar" comm
28d20 61 6e 64 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  and..*/.typedef 
28d30 73 74 72 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64  struct ArCommand
28d40 20 41 72 43 6f 6d 6d 61 6e 64 3b 0a 73 74 72 75   ArCommand;.stru
28d50 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20 7b 0a 20  ct ArCommand {. 
28d60 20 75 38 20 65 43 6d 64 3b 20 20 20 20 20 20 20   u8 eCmd;       
28d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d80 20 2f 2a 20 41 6e 20 41 52 5f 43 4d 44 5f 2a 20   /* An AR_CMD_* 
28d90 76 61 6c 75 65 20 2a 2f 0a 20 20 75 38 20 62 56  value */.  u8 bV
28da0 65 72 62 6f 73 65 3b 20 20 20 20 20 20 20 20 20  erbose;         
28db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
28dc0 75 65 20 69 66 20 2d 2d 76 65 72 62 6f 73 65 20  ue if --verbose 
28dd0 2a 2f 0a 20 20 75 38 20 62 5a 69 70 3b 20 20 20  */.  u8 bZip;   
28de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28df0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
28e00 74 68 65 20 61 72 63 68 69 76 65 20 69 73 20 61  the archive is a
28e10 20 5a 49 50 20 2a 2f 0a 20 20 75 38 20 62 44 72   ZIP */.  u8 bDr
28e20 79 52 75 6e 3b 20 20 20 20 20 20 20 20 20 20 20  yRun;           
28e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
28e40 65 20 69 66 20 2d 2d 64 72 79 2d 72 75 6e 20 2a  e if --dry-run *
28e50 2f 0a 20 20 75 38 20 62 41 70 70 65 6e 64 3b 20  /.  u8 bAppend; 
28e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e70 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d      /* True if -
28e80 2d 61 70 70 65 6e 64 20 2a 2f 0a 20 20 75 38 20  -append */.  u8 
28e90 66 72 6f 6d 43 6d 64 4c 69 6e 65 3b 20 20 20 20  fromCmdLine;    
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28eb0 52 75 6e 20 66 72 6f 6d 20 2d 41 20 69 6e 73 74  Run from -A inst
28ec0 65 61 64 20 6f 66 20 2e 61 72 63 68 69 76 65 20  ead of .archive 
28ed0 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20  */.  int nArg;  
28ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ef0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
28f00 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  f command argume
28f10 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  nts */.  char *z
28f20 53 72 63 54 61 62 6c 65 3b 20 20 20 20 20 20 20  SrcTable;       
28f30 20 20 20 20 20 20 20 20 20 2f 2a 20 22 73 71 6c           /* "sql
28f40 61 72 22 2c 20 22 7a 69 70 66 69 6c 65 28 24 66  ar", "zipfile($f
28f50 69 6c 65 29 22 20 6f 72 20 22 7a 69 70 22 20 2a  ile)" or "zip" *
28f60 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
28f70 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  zFile;          
28f80 20 20 20 20 2f 2a 20 2d 2d 66 69 6c 65 20 61 72      /* --file ar
28f90 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20  gument, or NULL 
28fa0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
28fb0 2a 7a 44 69 72 3b 20 20 20 20 20 20 20 20 20 20  *zDir;          
28fc0 20 20 20 20 20 2f 2a 20 2d 2d 64 69 72 65 63 74       /* --direct
28fd0 6f 72 79 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72  ory argument, or
28fe0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20   NULL */.  char 
28ff0 2a 2a 61 7a 41 72 67 3b 20 20 20 20 20 20 20 20  **azArg;        
29000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
29010 72 61 79 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61  ray of command a
29020 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 53 68  rguments */.  Sh
29030 65 6c 6c 53 74 61 74 65 20 2a 70 3b 20 20 20 20  ellState *p;    
29040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29050 20 53 68 65 6c 6c 20 73 74 61 74 65 20 2a 2f 0a   Shell state */.
29060 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
29070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29080 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
29090 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 61 72 63  ntaining the arc
290a0 68 69 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  hive */.};../*.*
290b0 2a 20 50 72 69 6e 74 20 61 20 75 73 61 67 65 20  * Print a usage 
290c0 6d 65 73 73 61 67 65 20 66 6f 72 20 74 68 65 20  message for the 
290d0 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73  .ar command to s
290e0 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e  tderr and return
290f0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a   SQLITE_ERROR..*
29100 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 55  /.static int arU
29110 73 61 67 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20  sage(FILE *f){. 
29120 20 73 68 6f 77 48 65 6c 70 28 66 2c 22 61 72 63   showHelp(f,"arc
29130 68 69 76 65 22 29 3b 0a 20 20 72 65 74 75 72 6e  hive");.  return
29140 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
29150 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e  ../*.** Print an
29160 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
29170 6f 72 20 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61  or the .ar comma
29180 6e 64 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64  nd to stderr and
29190 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
291a0 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61  TE_ERROR..*/.sta
291b0 74 69 63 20 69 6e 74 20 61 72 45 72 72 6f 72 4d  tic int arErrorM
291c0 73 67 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  sg(ArCommand *pA
291d0 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
291e0 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  Fmt, ...){.  va_
291f0 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
29200 2a 7a 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  *z;.  va_start(a
29210 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 20 3d 20  p, zFmt);.  z = 
29220 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
29230 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 76 61  (zFmt, ap);.  va
29240 5f 65 6e 64 28 61 70 29 3b 0a 20 20 75 74 66 38  _end(ap);.  utf8
29250 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
29260 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a  "Error: %s\n", z
29270 29 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 66 72  );.  if( pAr->fr
29280 6f 6d 43 6d 64 4c 69 6e 65 20 29 7b 0a 20 20 20  omCmdLine ){.   
29290 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
292a0 65 72 72 2c 20 22 55 73 65 20 5c 22 2d 41 5c 22  err, "Use \"-A\"
292b0 20 66 6f 72 20 6d 6f 72 65 20 68 65 6c 70 5c 6e   for more help\n
292c0 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
292d0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
292e0 65 72 72 2c 20 22 55 73 65 20 5c 22 2e 61 72 63  err, "Use \".arc
292f0 68 69 76 65 20 2d 2d 68 65 6c 70 5c 22 20 66 6f  hive --help\" fo
29300 72 20 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 29 3b  r more help\n");
29310 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
29320 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  ree(z);.  return
29330 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
29340 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 66  ../*.** Values f
29350 6f 72 20 41 72 43 6f 6d 6d 61 6e 64 2e 65 43 6d  or ArCommand.eCm
29360 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52  d..*/.#define AR
29370 5f 43 4d 44 5f 43 52 45 41 54 45 20 20 20 20 20  _CMD_CREATE     
29380 20 20 31 0a 23 64 65 66 69 6e 65 20 41 52 5f 43    1.#define AR_C
29390 4d 44 5f 55 50 44 41 54 45 20 20 20 20 20 20 20  MD_UPDATE       
293a0 32 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44  2.#define AR_CMD
293b0 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20 33 0a  _INSERT       3.
293c0 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 45  #define AR_CMD_E
293d0 58 54 52 41 43 54 20 20 20 20 20 20 34 0a 23 64  XTRACT      4.#d
293e0 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 4c 49 53  efine AR_CMD_LIS
293f0 54 20 20 20 20 20 20 20 20 20 35 0a 23 64 65 66  T         5.#def
29400 69 6e 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 20  ine AR_CMD_HELP 
29410 20 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a          6../*.**
29420 20 4f 74 68 65 72 20 28 6e 6f 6e 2d 63 6f 6d 6d   Other (non-comm
29430 61 6e 64 29 20 73 77 69 74 63 68 65 73 2e 0a 2a  and) switches..*
29440 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  /.#define AR_SWI
29450 54 43 48 5f 56 45 52 42 4f 53 45 20 20 20 20 20  TCH_VERBOSE     
29460 37 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  7.#define AR_SWI
29470 54 43 48 5f 46 49 4c 45 20 20 20 20 20 20 20 20  TCH_FILE        
29480 38 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  8.#define AR_SWI
29490 54 43 48 5f 44 49 52 45 43 54 4f 52 59 20 20 20  TCH_DIRECTORY   
294a0 39 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  9.#define AR_SWI
294b0 54 43 48 5f 41 50 50 45 4e 44 20 20 20 20 20 31  TCH_APPEND     1
294c0 30 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  0.#define AR_SWI
294d0 54 43 48 5f 44 52 59 52 55 4e 20 20 20 20 20 31  TCH_DRYRUN     1
294e0 31 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  1..static int ar
294f0 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 41 72  ProcessSwitch(Ar
29500 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 69 6e  Command *pAr, in
29510 74 20 65 53 77 69 74 63 68 2c 20 63 6f 6e 73 74  t eSwitch, const
29520 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20   char *zArg){.  
29530 73 77 69 74 63 68 28 20 65 53 77 69 74 63 68 20  switch( eSwitch 
29540 29 7b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43  ){.    case AR_C
29550 4d 44 5f 43 52 45 41 54 45 3a 0a 20 20 20 20 63  MD_CREATE:.    c
29560 61 73 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41  ase AR_CMD_EXTRA
29570 43 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f  CT:.    case AR_
29580 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 63 61  CMD_LIST:.    ca
29590 73 65 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45  se AR_CMD_UPDATE
295a0 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d  :.    case AR_CM
295b0 44 5f 49 4e 53 45 52 54 3a 0a 20 20 20 20 63 61  D_INSERT:.    ca
295c0 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a  se AR_CMD_HELP:.
295d0 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 65        if( pAr->e
295e0 43 6d 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  Cmd ){.        r
295f0 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
29600 28 70 41 72 2c 20 22 6d 75 6c 74 69 70 6c 65 20  (pAr, "multiple 
29610 63 6f 6d 6d 61 6e 64 20 6f 70 74 69 6f 6e 73 22  command options"
29620 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
29630 20 70 41 72 2d 3e 65 43 6d 64 20 3d 20 65 53 77   pAr->eCmd = eSw
29640 69 74 63 68 3b 0a 20 20 20 20 20 20 62 72 65 61  itch;.      brea
29650 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 41 52 5f  k;..    case AR_
29660 53 57 49 54 43 48 5f 44 52 59 52 55 4e 3a 0a 20  SWITCH_DRYRUN:. 
29670 20 20 20 20 20 70 41 72 2d 3e 62 44 72 79 52 75       pAr->bDryRu
29680 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  n = 1;.      bre
29690 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f  ak;.    case AR_
296a0 53 57 49 54 43 48 5f 56 45 52 42 4f 53 45 3a 0a  SWITCH_VERBOSE:.
296b0 20 20 20 20 20 20 70 41 72 2d 3e 62 56 65 72 62        pAr->bVerb
296c0 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  ose = 1;.      b
296d0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41  reak;.    case A
296e0 52 5f 53 57 49 54 43 48 5f 41 50 50 45 4e 44 3a  R_SWITCH_APPEND:
296f0 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 41 70 70  .      pAr->bApp
29700 65 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f  end = 1;.      /
29710 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  * Fall thru into
29720 20 2d 2d 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63   --file */.    c
29730 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 46 49  ase AR_SWITCH_FI
29740 4c 45 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a  LE:.      pAr->z
29750 46 69 6c 65 20 3d 20 7a 41 72 67 3b 0a 20 20 20  File = zArg;.   
29760 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
29770 73 65 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52  se AR_SWITCH_DIR
29780 45 43 54 4f 52 59 3a 0a 20 20 20 20 20 20 70 41  ECTORY:.      pA
29790 72 2d 3e 7a 44 69 72 20 3d 20 7a 41 72 67 3b 0a  r->zDir = zArg;.
297a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
297b0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
297c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  E_OK;.}../*.** P
297d0 61 72 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64  arse the command
297e0 20 6c 69 6e 65 20 66 6f 72 20 61 6e 20 22 2e 61   line for an ".a
297f0 72 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 65 20  r" command. The 
29800 72 65 73 75 6c 74 73 20 61 72 65 20 77 72 69 74  results are writ
29810 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 73 74 72 75  ten into.** stru
29820 63 74 75 72 65 20 28 2a 70 41 72 29 2e 20 53 51  cture (*pAr). SQ
29830 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
29840 6e 65 64 20 69 66 20 74 68 65 20 63 6f 6d 6d 61  ned if the comma
29850 6e 64 20 6c 69 6e 65 20 69 73 20 70 61 72 73 65  nd line is parse
29860 64 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c  d.** successfull
29870 79 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20  y, otherwise an 
29880 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
29890 20 77 72 69 74 74 65 6e 20 74 6f 20 73 74 64 65   written to stde
298a0 72 72 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54  rr and .** SQLIT
298b0 45 5f 45 52 52 4f 52 20 72 65 74 75 72 6e 65 64  E_ERROR returned
298c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
298d0 61 72 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28 0a  arParseCommand(.
298e0 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20    char **azArg, 
298f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29900 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
29910 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
29920 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f  o dot command */
29930 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
29940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29950 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
29960 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67  entries in azArg
29970 5b 5d 20 2a 2f 0a 20 20 41 72 43 6f 6d 6d 61 6e  [] */.  ArComman
29980 64 20 2a 70 41 72 20 20 20 20 20 20 20 20 20 20  d *pAr          
29990 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c          /* Popul
299a0 61 74 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ate this object 
299b0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 41  */.){.  struct A
299c0 72 53 77 69 74 63 68 20 7b 0a 20 20 20 20 63 6f  rSwitch {.    co
299d0 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 3b  nst char *zLong;
299e0 0a 20 20 20 20 63 68 61 72 20 63 53 68 6f 72 74  .    char cShort
299f0 3b 0a 20 20 20 20 75 38 20 65 53 77 69 74 63 68  ;.    u8 eSwitch
29a00 3b 0a 20 20 20 20 75 38 20 62 41 72 67 3b 0a 20  ;.    u8 bArg;. 
29a10 20 7d 20 61 53 77 69 74 63 68 5b 5d 20 3d 20 7b   } aSwitch[] = {
29a20 0a 20 20 20 20 7b 20 22 63 72 65 61 74 65 22 2c  .    { "create",
29a30 20 20 20 20 27 63 27 2c 20 41 52 5f 43 4d 44 5f      'c', AR_CMD_
29a40 43 52 45 41 54 45 2c 20 20 20 20 20 20 20 30 20  CREATE,       0 
29a50 7d 2c 0a 20 20 20 20 7b 20 22 65 78 74 72 61 63  },.    { "extrac
29a60 74 22 2c 20 20 20 27 78 27 2c 20 41 52 5f 43 4d  t",   'x', AR_CM
29a70 44 5f 45 58 54 52 41 43 54 2c 20 20 20 20 20 20  D_EXTRACT,      
29a80 30 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 73 65  0 },.    { "inse
29a90 72 74 22 2c 20 20 20 20 27 69 27 2c 20 41 52 5f  rt",    'i', AR_
29aa0 43 4d 44 5f 49 4e 53 45 52 54 2c 20 20 20 20 20  CMD_INSERT,     
29ab0 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 69    0 },.    { "li
29ac0 73 74 22 2c 20 20 20 20 20 20 27 74 27 2c 20 41  st",      't', A
29ad0 52 5f 43 4d 44 5f 4c 49 53 54 2c 20 20 20 20 20  R_CMD_LIST,     
29ae0 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22      0 },.    { "
29af0 75 70 64 61 74 65 22 2c 20 20 20 20 27 75 27 2c  update",    'u',
29b00 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 2c 20   AR_CMD_UPDATE, 
29b10 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b        0 },.    {
29b20 20 22 68 65 6c 70 22 2c 20 20 20 20 20 20 27 68   "help",      'h
29b30 27 2c 20 41 52 5f 43 4d 44 5f 48 45 4c 50 2c 20  ', AR_CMD_HELP, 
29b40 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20          0 },.   
29b50 20 7b 20 22 76 65 72 62 6f 73 65 22 2c 20 20 20   { "verbose",   
29b60 27 76 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 56  'v', AR_SWITCH_V
29b70 45 52 42 4f 53 45 2c 20 20 20 30 20 7d 2c 0a 20  ERBOSE,   0 },. 
29b80 20 20 20 7b 20 22 66 69 6c 65 22 2c 20 20 20 20     { "file",    
29b90 20 20 27 66 27 2c 20 41 52 5f 53 57 49 54 43 48    'f', AR_SWITCH
29ba0 5f 46 49 4c 45 2c 20 20 20 20 20 20 31 20 7d 2c  _FILE,      1 },
29bb0 0a 20 20 20 20 7b 20 22 61 70 70 65 6e 64 22 2c  .    { "append",
29bc0 20 20 20 20 27 61 27 2c 20 41 52 5f 53 57 49 54      'a', AR_SWIT
29bd0 43 48 5f 41 50 50 45 4e 44 2c 20 20 20 20 31 20  CH_APPEND,    1 
29be0 7d 2c 0a 20 20 20 20 7b 20 22 64 69 72 65 63 74  },.    { "direct
29bf0 6f 72 79 22 2c 20 27 43 27 2c 20 41 52 5f 53 57  ory", 'C', AR_SW
29c00 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59 2c 20  ITCH_DIRECTORY, 
29c10 31 20 7d 2c 0a 20 20 20 20 7b 20 22 64 72 79 72  1 },.    { "dryr
29c20 75 6e 22 2c 20 20 20 20 27 6e 27 2c 20 41 52 5f  un",    'n', AR_
29c30 53 57 49 54 43 48 5f 44 52 59 52 55 4e 2c 20 20  SWITCH_DRYRUN,  
29c40 20 20 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e    0 },.  };.  in
29c50 74 20 6e 53 77 69 74 63 68 20 3d 20 73 69 7a 65  t nSwitch = size
29c60 6f 66 28 61 53 77 69 74 63 68 29 20 2f 20 73 69  of(aSwitch) / si
29c70 7a 65 6f 66 28 73 74 72 75 63 74 20 41 72 53 77  zeof(struct ArSw
29c80 69 74 63 68 29 3b 0a 20 20 73 74 72 75 63 74 20  itch);.  struct 
29c90 41 72 53 77 69 74 63 68 20 2a 70 45 6e 64 20 3d  ArSwitch *pEnd =
29ca0 20 26 61 53 77 69 74 63 68 5b 6e 53 77 69 74 63   &aSwitch[nSwitc
29cb0 68 5d 3b 0a 0a 20 20 69 66 28 20 6e 41 72 67 3c  h];..  if( nArg<
29cc0 3d 31 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =1 ){.    utf8_p
29cd0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57  rintf(stderr, "W
29ce0 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
29cf0 72 67 75 6d 65 6e 74 73 2e 20 20 55 73 61 67 65  rguments.  Usage
29d00 3a 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  :\n");.    retur
29d10 6e 20 61 72 55 73 61 67 65 28 73 74 64 65 72 72  n arUsage(stderr
29d20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
29d30 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
29d40 31 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  1];.    if( z[0]
29d50 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 2f  !='-' ){.      /
29d60 2a 20 54 72 61 64 69 74 69 6f 6e 61 6c 20 73 74  * Traditional st
29d70 79 6c 65 20 5b 74 61 72 5d 20 69 6e 76 6f 63 61  yle [tar] invoca
29d80 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
29d90 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  t i;.      int i
29da0 41 72 67 20 3d 20 32 3b 0a 20 20 20 20 20 20 66  Arg = 2;.      f
29db0 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(i=0; z[i]; i+
29dc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
29dd0 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30  t char *zArg = 0
29de0 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
29df0 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b   ArSwitch *pOpt;
29e00 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70  .        for(pOp
29e10 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70  t=&aSwitch[0]; p
29e20 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b  Opt<pEnd; pOpt++
29e30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
29e40 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68   z[i]==pOpt->cSh
29e50 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ort ) break;.   
29e60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
29e70 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b  f( pOpt==pEnd ){
29e80 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
29e90 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72  n arErrorMsg(pAr
29ea0 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20  , "unrecognized 
29eb0 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69  option: %c", z[i
29ec0 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
29ed0 20 20 20 20 20 20 69 66 28 20 70 4f 70 74 2d 3e        if( pOpt->
29ee0 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  bArg ){.        
29ef0 20 20 69 66 28 20 69 41 72 67 3e 3d 6e 41 72 67    if( iArg>=nArg
29f00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29f10 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73  return arErrorMs
29f20 67 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72  g(pAr, "option r
29f30 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d  equires an argum
29f40 65 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a  ent: %c",z[i]);.
29f50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29f60 20 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41        zArg = azA
29f70 72 67 5b 69 41 72 67 2b 2b 5d 3b 0a 20 20 20 20  rg[iArg++];.    
29f80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
29f90 28 20 61 72 50 72 6f 63 65 73 73 53 77 69 74 63  ( arProcessSwitc
29fa0 68 28 70 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77  h(pAr, pOpt->eSw
29fb0 69 74 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65  itch, zArg) ) re
29fc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
29fd0 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
29fe0 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72   pAr->nArg = nAr
29ff0 67 2d 69 41 72 67 3b 0a 20 20 20 20 20 20 69 66  g-iArg;.      if
2a000 28 20 70 41 72 2d 3e 6e 41 72 67 3e 30 20 29 7b  ( pAr->nArg>0 ){
2a010 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a  .        pAr->az
2a020 41 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72  Arg = &azArg[iAr
2a030 67 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g];.      }.    
2a040 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
2a050 4e 6f 6e 2d 74 72 61 64 69 74 69 6f 6e 61 6c 20  Non-traditional 
2a060 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  invocation */.  
2a070 20 20 20 20 69 6e 74 20 69 41 72 67 3b 0a 20 20      int iArg;.  
2a080 20 20 20 20 66 6f 72 28 69 41 72 67 3d 31 3b 20      for(iArg=1; 
2a090 69 41 72 67 3c 6e 41 72 67 3b 20 69 41 72 67 2b  iArg<nArg; iArg+
2a0a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
2a0b0 6e 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 61  n;.        z = a
2a0c0 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20  zArg[iArg];.    
2a0d0 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d      if( z[0]!='-
2a0e0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ' ){.          /
2a0f0 2a 20 41 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20  * All remaining 
2a100 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72  command line wor
2a110 64 73 20 61 72 65 20 63 6f 6d 6d 61 6e 64 20 61  ds are command a
2a120 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20  rguments. */.   
2a130 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72         pAr->azAr
2a140 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 5d  g = &azArg[iArg]
2a150 3b 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 2d  ;.          pAr-
2a160 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72  >nArg = nArg-iAr
2a170 67 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  g;.          bre
2a180 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
2a190 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e        n = strlen
2a1a0 33 30 28 7a 29 3b 0a 0a 20 20 20 20 20 20 20 20  30(z);..        
2a1b0 69 66 28 20 7a 5b 31 5d 21 3d 27 2d 27 20 29 7b  if( z[1]!='-' ){
2a1c0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
2a1d0 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;.          /* O
2a1e0 6e 65 20 6f 72 20 6d 6f 72 65 20 73 68 6f 72 74  ne or more short
2a1f0 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20   options */.    
2a200 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
2a210 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
2a220 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2a230 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20 20   *zArg = 0;.    
2a240 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2a250 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20  rSwitch *pOpt;. 
2a260 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 70             for(p
2a270 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b  Opt=&aSwitch[0];
2a280 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74   pOpt<pEnd; pOpt
2a290 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2a2a0 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70     if( z[i]==pOp
2a2b0 74 2d 3e 63 53 68 6f 72 74 20 29 20 62 72 65 61  t->cShort ) brea
2a2c0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
2a2d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2a2e0 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20   pOpt==pEnd ){. 
2a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
2a300 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70  urn arErrorMsg(p
2a310 41 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65  Ar, "unrecognize
2a320 64 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20 7a  d option: %c", z
2a330 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
2a340 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2a350 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67 20 29  if( pOpt->bArg )
2a360 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2a370 69 66 28 20 69 3c 28 6e 2d 31 29 20 29 7b 0a 20  if( i<(n-1) ){. 
2a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
2a390 41 72 67 20 3d 20 26 7a 5b 69 2b 31 5d 3b 0a 20  Arg = &z[i+1];. 
2a3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2a3b0 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20   = n;.          
2a3c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a3d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2a3e0 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29 20 29 7b  Arg>=(nArg-1) ){
2a3f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a400 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
2a410 72 4d 73 67 28 70 41 72 2c 20 22 6f 70 74 69 6f  rMsg(pAr, "optio
2a420 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72  n requires an ar
2a430 67 75 6d 65 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d  gument: %c",z[i]
2a440 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2a450 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2a460 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72       zArg = azAr
2a470 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20  g[++iArg];.     
2a480 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a4a0 20 20 20 20 20 69 66 28 20 61 72 50 72 6f 63 65       if( arProce
2a4b0 73 73 53 77 69 74 63 68 28 70 41 72 2c 20 70 4f  ssSwitch(pAr, pO
2a4c0 70 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72  pt->eSwitch, zAr
2a4d0 67 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  g) ) return SQLI
2a4e0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
2a4f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2a500 6c 73 65 20 69 66 28 20 7a 5b 32 5d 3d 3d 27 5c  lse if( z[2]=='\
2a510 30 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0' ){.          
2a520 2f 2a 20 41 20 2d 2d 20 6f 70 74 69 6f 6e 2c 20  /* A -- option, 
2a530 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
2a540 61 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f  all remaining co
2a550 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73  mmand line words
2a560 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72  .          ** ar
2a570 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  e command argume
2a580 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  nts.  */.       
2a590 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20     pAr->azArg = 
2a5a0 26 61 7a 41 72 67 5b 69 41 72 67 2b 31 5d 3b 0a  &azArg[iArg+1];.
2a5b0 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e            pAr->n
2a5c0 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 2d  Arg = nArg-iArg-
2a5d0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
2a5e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
2a5f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2a600 41 20 6c 6f 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f  A long option */
2a610 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
2a620 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b   char *zArg = 0;
2a630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a640 41 72 67 75 6d 65 6e 74 20 66 6f 72 20 6f 70 74  Argument for opt
2a650 69 6f 6e 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20  ion, if any */. 
2a660 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2a670 41 72 53 77 69 74 63 68 20 2a 70 4d 61 74 63 68  ArSwitch *pMatch
2a680 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4d 61   = 0;      /* Ma
2a690 74 63 68 69 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f  tching option */
2a6a0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
2a6b0 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74  t ArSwitch *pOpt
2a6c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2a6d0 49 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  Iterator */.    
2a6e0 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26        for(pOpt=&
2a6f0 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74  aSwitch[0]; pOpt
2a700 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a  <pEnd; pOpt++){.
2a710 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
2a720 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 20 3d 20  t char *zLong = 
2a730 70 4f 70 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20 20  pOpt->zLong;.   
2a740 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 2d           if( (n-
2a750 32 29 3c 3d 73 74 72 6c 65 6e 33 30 28 7a 4c 6f  2)<=strlen30(zLo
2a760 6e 67 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  ng) && 0==memcmp
2a770 28 26 7a 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c 20 6e  (&z[2], zLong, n
2a780 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -2) ){.         
2a790 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 20       if( pMatch 
2a7a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2a7b0 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
2a7c0 72 4d 73 67 28 70 41 72 2c 20 22 61 6d 62 69 67  rMsg(pAr, "ambig
2a7d0 75 6f 75 73 20 6f 70 74 69 6f 6e 3a 20 25 73 22  uous option: %s"
2a7e0 2c 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,z);.           
2a7f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a800 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68            pMatch
2a810 20 3d 20 70 4f 70 74 3b 0a 20 20 20 20 20 20 20   = pOpt;.       
2a820 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2a840 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66   }..          if
2a850 28 20 70 4d 61 74 63 68 3d 3d 30 20 29 7b 0a 20  ( pMatch==0 ){. 
2a860 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2a870 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72  n arErrorMsg(pAr
2a880 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20  , "unrecognized 
2a890 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 20 7a 29 3b  option: %s", z);
2a8a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2a8b0 20 20 20 20 20 20 20 69 66 28 20 70 4d 61 74 63         if( pMatc
2a8c0 68 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20  h->bArg ){.     
2a8d0 20 20 20 20 20 20 20 69 66 28 20 69 41 72 67 3e         if( iArg>
2a8e0 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20  =(nArg-1) ){.   
2a8f0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2a900 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72  n arErrorMsg(pAr
2a910 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72  , "option requir
2a920 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20  es an argument: 
2a930 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  %s", z);.       
2a940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2a950 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b     zArg = azArg[
2a960 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20  ++iArg];.       
2a970 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
2a980 66 28 20 61 72 50 72 6f 63 65 73 73 53 77 69 74  f( arProcessSwit
2a990 63 68 28 70 41 72 2c 20 70 4d 61 74 63 68 2d 3e  ch(pAr, pMatch->
2a9a0 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20 29  eSwitch, zArg) )
2a9b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2a9c0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
2a9d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2a9e0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
2a9f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2aa00 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
2aa10 73 75 6d 65 73 20 74 68 61 74 20 61 6c 6c 20 61  sumes that all a
2aa20 72 67 75 6d 65 6e 74 73 20 77 69 74 68 69 6e 20  rguments within 
2aa30 74 68 65 20 41 72 43 6f 6d 6d 61 6e 64 2e 61 7a  the ArCommand.az
2aa40 41 72 67 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 72  Arg[].** array r
2aa50 65 66 65 72 20 74 6f 20 61 72 63 68 69 76 65 20  efer to archive 
2aa60 6d 65 6d 62 65 72 73 2c 20 61 73 20 66 6f 72 20  members, as for 
2aa70 74 68 65 20 2d 2d 65 78 74 72 61 63 74 20 6f 72  the --extract or
2aa80 20 2d 2d 6c 69 73 74 20 63 6f 6d 6d 61 6e 64 73   --list commands
2aa90 2e 20 0a 2a 2a 20 49 74 20 63 68 65 63 6b 73 20  . .** It checks 
2aaa0 74 68 61 74 20 65 61 63 68 20 6f 66 20 74 68 65  that each of the
2aab0 6d 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20 49  m are present. I
2aac0 66 20 61 6e 79 20 73 70 65 63 69 66 69 65 64 20  f any specified 
2aad0 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 70  file is not.** p
2aae0 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 61 72  resent in the ar
2aaf0 63 68 69 76 65 2c 20 61 6e 20 65 72 72 6f 72 20  chive, an error 
2ab00 69 73 20 70 72 69 6e 74 65 64 20 74 6f 20 73 74  is printed to st
2ab10 64 65 72 72 20 61 6e 64 20 61 6e 20 65 72 72 6f  derr and an erro
2ab20 72 0a 2a 2a 20 63 6f 64 65 20 72 65 74 75 72 6e  r.** code return
2ab30 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
2ab40 66 20 61 6c 6c 20 73 70 65 63 69 66 69 65 64 20  f all specified 
2ab50 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 70 72  arguments are pr
2ab60 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20  esent in.** the 
2ab70 61 72 63 68 69 76 65 2c 20 53 51 4c 49 54 45 5f  archive, SQLITE_
2ab80 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
2ab90 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2aba0 69 6f 6e 20 73 74 72 69 70 73 20 61 6e 79 20 74  ion strips any t
2abb0 72 61 69 6c 69 6e 67 20 27 2f 27 20 63 68 61 72  railing '/' char
2abc0 61 63 74 65 72 73 20 66 72 6f 6d 20 65 61 63 68  acters from each
2abd0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68   argument..** Th
2abe0 69 73 20 69 73 20 63 6f 6e 73 69 73 74 65 6e 74  is is consistent
2abf0 20 77 69 74 68 20 74 68 65 20 77 61 79 20 74 68   with the way th
2ac00 65 20 5b 74 61 72 5d 20 63 6f 6d 6d 61 6e 64 20  e [tar] command 
2ac10 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b 20 6f 6e  seems to work on
2ac20 0a 2a 2a 20 4c 69 6e 75 78 2e 0a 2a 2f 0a 73 74  .** Linux..*/.st
2ac30 61 74 69 63 20 69 6e 74 20 61 72 43 68 65 63 6b  atic int arCheck
2ac40 45 6e 74 72 69 65 73 28 41 72 43 6f 6d 6d 61 6e  Entries(ArComman
2ac50 64 20 2a 70 41 72 29 7b 0a 20 20 69 6e 74 20 72  d *pAr){.  int r
2ac60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2ac70 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 20 29   if( pAr->nArg )
2ac80 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  {.    int i, j;.
2ac90 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
2aca0 20 2a 70 54 65 73 74 20 3d 20 30 3b 0a 0a 20 20   *pTest = 0;..  
2acb0 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72    shellPreparePr
2acc0 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72  intf(pAr->db, &r
2acd0 63 2c 20 26 70 54 65 73 74 2c 0a 20 20 20 20 20  c, &pTest,.     
2ace0 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
2acf0 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 6e 61  FROM %s WHERE na
2ad00 6d 65 3d 24 6e 61 6d 65 22 2c 20 0a 20 20 20 20  me=$name", .    
2ad10 20 20 20 20 70 41 72 2d 3e 7a 53 72 63 54 61 62      pAr->zSrcTab
2ad20 6c 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 6a 20  le.    );.    j 
2ad30 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  = sqlite3_bind_p
2ad40 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70  arameter_index(p
2ad50 54 65 73 74 2c 20 22 24 6e 61 6d 65 22 29 3b 0a  Test, "$name");.
2ad60 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2ad70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d  Ar->nArg && rc==
2ad80 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
2ad90 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  .      char *z =
2ada0 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a   pAr->azArg[i];.
2adb0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
2adc0 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20  rlen30(z);.     
2add0 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 20 20   int bOk = 0;.  
2ade0 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26      while( n>0 &
2adf0 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 20  & z[n-1]=='/' ) 
2ae00 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20  n--;.      z[n] 
2ae10 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 73 71  = '\0';.      sq
2ae20 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
2ae30 70 54 65 73 74 2c 20 6a 2c 20 7a 2c 20 2d 31 2c  pTest, j, z, -1,
2ae40 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
2ae50 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
2ae60 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
2ae70 74 65 70 28 70 54 65 73 74 29 20 29 7b 0a 20 20  tep(pTest) ){.  
2ae80 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20        bOk = 1;. 
2ae90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68 65       }.      she
2aea0 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 54 65  llReset(&rc, pTe
2aeb0 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  st);.      if( r
2aec0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2aed0 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  bOk==0 ){.      
2aee0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2aef0 64 65 72 72 2c 20 22 6e 6f 74 20 66 6f 75 6e 64  derr, "not found
2af00 20 69 6e 20 61 72 63 68 69 76 65 3a 20 25 73 5c   in archive: %s\
2af10 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  n", z);.        
2af20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
2af30 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
2af40 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  .    shellFinali
2af50 7a 65 28 26 72 63 2c 20 70 54 65 73 74 29 3b 0a  ze(&rc, pTest);.
2af60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2af70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d 61 74  .}../*.** Format
2af80 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
2af90 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
2afa0 20 61 67 61 69 6e 73 74 20 74 68 65 20 22 73 71   against the "sq
2afb0 6c 61 72 22 20 74 61 62 6c 65 20 74 6f 0a 2a 2a  lar" table to.**
2afc0 20 69 64 65 6e 74 69 66 79 20 61 6c 6c 20 61 72   identify all ar
2afd0 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20 74 68  chive members th
2afe0 61 74 20 6d 61 74 63 68 20 74 68 65 20 63 6f 6d  at match the com
2aff0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 68  mand arguments h
2b000 65 6c 64 0a 2a 2a 20 69 6e 20 28 2a 70 41 72 29  eld.** in (*pAr)
2b010 2e 20 4c 65 61 76 65 20 74 68 69 73 20 57 48 45  . Leave this WHE
2b020 52 45 20 63 6c 61 75 73 65 20 69 6e 20 28 2a 70  RE clause in (*p
2b030 7a 57 68 65 72 65 29 20 62 65 66 6f 72 65 20 72  zWhere) before r
2b040 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 54 68 65  eturning..** The
2b050 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
2b060 6e 73 69 62 6c 65 20 66 6f 72 20 65 76 65 6e 74  nsible for event
2b070 75 61 6c 6c 79 20 63 61 6c 6c 69 6e 67 20 73 71  ually calling sq
2b080 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e 0a  lite3_free() on.
2b090 2a 2a 20 61 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c 20  ** any non-NULL 
2b0a0 28 2a 70 7a 57 68 65 72 65 29 20 76 61 6c 75 65  (*pzWhere) value
2b0b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2b0c0 20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 0a   arWhereClause(.
2b0d0 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 41    int *pRc, .  A
2b0e0 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 0a  rCommand *pAr, .
2b0f0 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65 72 65    char **pzWhere
2b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b110 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 57 48    /* OUT: New WH
2b120 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29 7b  ERE clause */.){
2b130 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20  .  char *zWhere 
2b140 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d  = 0;.  if( *pRc=
2b150 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b160 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 3d    if( pAr->nArg=
2b170 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 57 68 65  =0 ){.      zWhe
2b180 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  re = sqlite3_mpr
2b190 69 6e 74 66 28 22 31 22 29 3b 0a 20 20 20 20 7d  intf("1");.    }
2b1a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
2b1b0 69 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  i;.      const c
2b1c0 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a  har *zSep = "";.
2b1d0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2b1e0 3c 70 41 72 2d 3e 6e 41 72 67 3b 20 69 2b 2b 29  <pAr->nArg; i++)
2b1f0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
2b200 63 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d 3e 61  char *z = pAr->a
2b210 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20  zArg[i];.       
2b220 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   zWhere = sqlite
2b230 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
2b240 20 20 20 20 20 22 25 7a 25 73 20 6e 61 6d 65 20       "%z%s name 
2b250 3d 20 27 25 71 27 20 4f 52 20 73 75 62 73 74 72  = '%q' OR substr
2b260 28 6e 61 6d 65 2c 31 2c 25 64 29 20 3d 20 27 25  (name,1,%d) = '%
2b270 71 2f 27 22 2c 20 0a 20 20 20 20 20 20 20 20 20  q/'", .         
2b280 20 7a 57 68 65 72 65 2c 20 7a 53 65 70 2c 20 7a   zWhere, zSep, z
2b290 2c 20 73 74 72 6c 65 6e 33 30 28 7a 29 2b 31 2c  , strlen30(z)+1,
2b2a0 20 7a 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   z.        );.  
2b2b0 20 20 20 20 20 20 69 66 28 20 7a 57 68 65 72 65        if( zWhere
2b2c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2b2d0 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
2b2e0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
2b2f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
2b300 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20  .        zSep = 
2b310 22 20 4f 52 20 22 3b 0a 20 20 20 20 20 20 7d 0a  " OR ";.      }.
2b320 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 57      }.  }.  *pzW
2b330 68 65 72 65 20 3d 20 7a 57 68 65 72 65 3b 0a 7d  here = zWhere;.}
2b340 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
2b350 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 6c  tation of .ar "l
2b360 69 73 54 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a  isT" command. .*
2b370 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 4c  /.static int arL
2b380 69 73 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d  istCommand(ArCom
2b390 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f  mand *pAr){.  co
2b3a0 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
2b3b0 20 22 53 45 4c 45 43 54 20 25 73 20 46 52 4f 4d   "SELECT %s FROM
2b3c0 20 25 73 20 57 48 45 52 45 20 25 73 22 3b 20 0a   %s WHERE %s"; .
2b3d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
2b3e0 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  Cols[] = {.    "
2b3f0 6e 61 6d 65 22 2c 0a 20 20 20 20 22 6c 73 6d 6f  name",.    "lsmo
2b400 64 65 28 6d 6f 64 65 29 2c 20 73 7a 2c 20 64 61  de(mode), sz, da
2b410 74 65 74 69 6d 65 28 6d 74 69 6d 65 2c 20 27 75  tetime(mtime, 'u
2b420 6e 69 78 65 70 6f 63 68 27 29 2c 20 6e 61 6d 65  nixepoch'), name
2b430 22 0a 20 20 7d 3b 0a 0a 20 20 63 68 61 72 20 2a  ".  };..  char *
2b440 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 73 71  zWhere = 0;.  sq
2b450 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c  lite3_stmt *pSql
2b460 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
2b470 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b 45  .  rc = arCheckE
2b480 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20 61  ntries(pAr);.  a
2b490 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72 63  rWhereClause(&rc
2b4a0 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29 3b  , pAr, &zWhere);
2b4b0 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65  ..  shellPrepare
2b4c0 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20  Printf(pAr->db, 
2b4d0 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71 6c  &rc, &pSql, zSql
2b4e0 2c 20 61 7a 43 6f 6c 73 5b 70 41 72 2d 3e 62 56  , azCols[pAr->bV
2b4f0 65 72 62 6f 73 65 5d 2c 0a 20 20 20 20 20 20 20  erbose],.       
2b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 41                pA
2b510 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a 57  r->zSrcTable, zW
2b520 68 65 72 65 29 3b 0a 20 20 69 66 28 20 70 41 72  here);.  if( pAr
2b530 2d 3e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20  ->bDryRun ){.   
2b540 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
2b550 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  ->p->out, "%s\n"
2b560 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53  , sqlite3_sql(pS
2b570 71 6c 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ql));.  }else{. 
2b580 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
2b590 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
2b5a0 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
2b5b0 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20 20  tep(pSql) ){.   
2b5c0 20 20 20 69 66 28 20 70 41 72 2d 3e 62 56 65 72     if( pAr->bVer
2b5d0 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  bose ){.        
2b5e0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d  utf8_printf(pAr-
2b5f0 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 20 25 20 31  >p->out, "%s % 1
2b600 30 64 20 20 25 73 20 20 25 73 5c 6e 22 2c 0a 20  0d  %s  %s\n",. 
2b610 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2b620 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
2b630 53 71 6c 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  Sql, 0),.       
2b640 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
2b650 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 31 29  umn_int(pSql, 1)
2b660 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  , .            s
2b670 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
2b680 78 74 28 70 53 71 6c 2c 20 32 29 2c 0a 20 20 20  xt(pSql, 2),.   
2b690 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2b6a0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
2b6b0 6c 2c 20 33 29 0a 20 20 20 20 20 20 20 20 29 3b  l, 3).        );
2b6c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2b6d0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2b6e0 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22  f(pAr->p->out, "
2b6f0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63  %s\n", sqlite3_c
2b700 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
2b710 20 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   0));.      }.  
2b720 20 20 7d 0a 20 20 7d 0a 20 20 73 68 65 6c 6c 46    }.  }.  shellF
2b730 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 71  inalize(&rc, pSq
2b740 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  l);.  sqlite3_fr
2b750 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 72 65  ee(zWhere);.  re
2b760 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
2b770 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
2b780 6e 20 6f 66 20 2e 61 72 20 22 65 58 74 72 61 63  n of .ar "eXtrac
2b790 74 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a  t" command. .*/.
2b7a0 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 78 74  static int arExt
2b7b0 72 61 63 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f  ractCommand(ArCo
2b7c0 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63  mmand *pAr){.  c
2b7d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 31  onst char *zSql1
2b7e0 20 3d 20 0a 20 20 20 20 22 53 45 4c 45 43 54 20   = .    "SELECT 
2b7f0 22 0a 20 20 20 20 22 20 28 24 64 69 72 20 7c 7c  ".    " ($dir ||
2b800 20 6e 61 6d 65 29 2c 22 0a 20 20 20 20 22 20 77   name),".    " w
2b810 72 69 74 65 66 69 6c 65 28 28 24 64 69 72 20 7c  ritefile(($dir |
2b820 7c 20 6e 61 6d 65 29 2c 20 25 73 2c 20 6d 6f 64  | name), %s, mod
2b830 65 2c 20 6d 74 69 6d 65 29 20 22 0a 20 20 20 20  e, mtime) ".    
2b840 22 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 28  "FROM %s WHERE (
2b850 25 73 29 20 41 4e 44 20 28 64 61 74 61 20 49 53  %s) AND (data IS
2b860 20 4e 55 4c 4c 20 4f 52 20 24 64 69 72 4f 6e 6c   NULL OR $dirOnl
2b870 79 20 3d 20 30 29 22 0a 20 20 20 20 22 20 41 4e  y = 0)".    " AN
2b880 44 20 6e 61 6d 65 20 4e 4f 54 20 47 4c 4f 42 20  D name NOT GLOB 
2b890 27 2a 2e 2e 5b 2f 5c 5c 5d 2a 27 22 3b 0a 0a 20  '*..[/\\]*'";.. 
2b8a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 45   const char *azE
2b8b0 78 74 72 61 41 72 67 5b 5d 20 3d 20 7b 20 0a 20  xtraArg[] = { . 
2b8c0 20 20 20 22 73 71 6c 61 72 5f 75 6e 63 6f 6d 70     "sqlar_uncomp
2b8d0 72 65 73 73 28 64 61 74 61 2c 20 73 7a 29 22 2c  ress(data, sz)",
2b8e0 0a 20 20 20 20 22 64 61 74 61 22 0a 20 20 7d 3b  .    "data".  };
2b8f0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ..  sqlite3_stmt
2b900 20 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pSql = 0;.  in
2b910 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2b920 3b 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  ;.  char *zDir =
2b930 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 57 68 65   0;.  char *zWhe
2b940 72 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c  re = 0;.  int i,
2b950 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67   j;..  /* If arg
2b960 75 6d 65 6e 74 73 20 61 72 65 20 73 70 65 63 69  uments are speci
2b970 66 69 65 64 2c 20 63 68 65 63 6b 20 74 68 61 74  fied, check that
2b980 20 74 68 65 79 20 61 63 74 75 61 6c 6c 79 20 65   they actually e
2b990 78 69 73 74 20 77 69 74 68 69 6e 0a 20 20 2a 2a  xist within.  **
2b9a0 20 74 68 65 20 61 72 63 68 69 76 65 20 62 65 66   the archive bef
2b9b0 6f 72 65 20 70 72 6f 63 65 65 64 69 6e 67 2e 20  ore proceeding. 
2b9c0 41 6e 64 20 66 6f 72 6d 75 6c 61 74 65 20 61 20  And formulate a 
2b9d0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 0a  WHERE clause to.
2b9e0 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 6d 2e    ** match them.
2b9f0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 72 43 68    */.  rc = arCh
2ba00 65 63 6b 45 6e 74 72 69 65 73 28 70 41 72 29 3b  eckEntries(pAr);
2ba10 0a 20 20 61 72 57 68 65 72 65 43 6c 61 75 73 65  .  arWhereClause
2ba20 28 26 72 63 2c 20 70 41 72 2c 20 26 7a 57 68 65  (&rc, pAr, &zWhe
2ba30 72 65 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  re);..  if( rc==
2ba40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ba50 20 69 66 28 20 70 41 72 2d 3e 7a 44 69 72 20 29   if( pAr->zDir )
2ba60 7b 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20 73  {.      zDir = s
2ba70 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2ba80 25 73 2f 22 2c 20 70 41 72 2d 3e 7a 44 69 72 29  %s/", pAr->zDir)
2ba90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2baa0 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74 65     zDir = sqlite
2bab0 33 5f 6d 70 72 69 6e 74 66 28 22 22 29 3b 0a 20  3_mprintf("");. 
2bac0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 69     }.    if( zDi
2bad0 72 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49  r==0 ) rc = SQLI
2bae0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
2baf0 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69   shellPreparePri
2bb00 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72 63  ntf(pAr->db, &rc
2bb10 2c 20 26 70 53 71 6c 2c 20 7a 53 71 6c 31 2c 20  , &pSql, zSql1, 
2bb20 0a 20 20 20 20 20 20 61 7a 45 78 74 72 61 41 72  .      azExtraAr
2bb30 67 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 70 41  g[pAr->bZip], pA
2bb40 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a 57  r->zSrcTable, zW
2bb50 68 65 72 65 0a 20 20 29 3b 0a 0a 20 20 69 66 28  here.  );..  if(
2bb60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2bb70 7b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65  {.    j = sqlite
2bb80 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
2bb90 5f 69 6e 64 65 78 28 70 53 71 6c 2c 20 22 24 64  _index(pSql, "$d
2bba0 69 72 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ir");.    sqlite
2bbb0 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 71 6c  3_bind_text(pSql
2bbc0 2c 20 6a 2c 20 7a 44 69 72 2c 20 2d 31 2c 20 53  , j, zDir, -1, S
2bbd0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 0a  QLITE_STATIC);..
2bbe0 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 53      /* Run the S
2bbf0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2bc00 74 77 69 63 65 2e 20 54 68 65 20 66 69 72 73 74  twice. The first
2bc10 20 74 69 6d 65 2c 20 77 72 69 74 65 66 69 6c 65   time, writefile
2bc20 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20  () is called.   
2bc30 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 61 72 63 68   ** for all arch
2bc40 69 76 65 20 6d 65 6d 62 65 72 73 20 74 68 61 74  ive members that
2bc50 20 73 68 6f 75 6c 64 20 62 65 20 65 78 74 72 61   should be extra
2bc60 63 74 65 64 2e 20 54 68 65 20 73 65 63 6f 6e 64  cted. The second
2bc70 20 74 69 6d 65 2c 0a 20 20 20 20 2a 2a 20 6f 6e   time,.    ** on
2bc80 6c 79 20 66 6f 72 20 74 68 65 20 64 69 72 65 63  ly for the direc
2bc90 74 6f 72 69 65 73 2e 20 54 68 69 73 20 69 73 20  tories. This is 
2bca0 62 65 63 61 75 73 65 20 74 68 65 20 74 69 6d 65  because the time
2bcb0 73 74 61 6d 70 73 20 66 6f 72 0a 20 20 20 20 2a  stamps for.    *
2bcc0 2a 20 65 78 74 72 61 63 74 65 64 20 64 69 72 65  * extracted dire
2bcd0 63 74 6f 72 69 65 73 20 6d 75 73 74 20 62 65 20  ctories must be 
2bce0 72 65 73 65 74 20 61 66 74 65 72 20 74 68 65 79  reset after they
2bcf0 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 28   are populated (
2bd00 61 73 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61  as.    ** popula
2bd10 74 69 6e 67 20 74 68 65 6d 20 63 68 61 6e 67 65  ting them change
2bd20 73 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 29  s the timestamp)
2bd30 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  .  */.    for(i=
2bd40 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
2bd50 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f      j = sqlite3_
2bd60 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
2bd70 6e 64 65 78 28 70 53 71 6c 2c 20 22 24 64 69 72  ndex(pSql, "$dir
2bd80 4f 6e 6c 79 22 29 3b 0a 20 20 20 20 20 20 73 71  Only");.      sq
2bd90 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
2bda0 53 71 6c 2c 20 6a 2c 20 69 29 3b 0a 20 20 20 20  Sql, j, i);.    
2bdb0 20 20 69 66 28 20 70 41 72 2d 3e 62 44 72 79 52    if( pAr->bDryR
2bdc0 75 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  un ){.        ut
2bdd0 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70  f8_printf(pAr->p
2bde0 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73  ->out, "%s\n", s
2bdf0 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c 29  qlite3_sql(pSql)
2be00 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2be10 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 72          while( r
2be20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2be30 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
2be40 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29  te3_step(pSql) )
2be50 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2be60 69 3d 3d 30 20 26 26 20 70 41 72 2d 3e 62 56 65  i==0 && pAr->bVe
2be70 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20  rbose ){.       
2be80 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2be90 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25  (pAr->p->out, "%
2bea0 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f  s\n", sqlite3_co
2beb0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
2bec0 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  0));.          }
2bed0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2bee0 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65   }.      shellRe
2bef0 73 65 74 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a  set(&rc, pSql);.
2bf00 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46      }.    shellF
2bf10 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 71  inalize(&rc, pSq
2bf20 6c 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  l);.  }..  sqlit
2bf30 65 33 5f 66 72 65 65 28 7a 44 69 72 29 3b 0a 20  e3_free(zDir);. 
2bf40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
2bf50 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  here);.  return 
2bf60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e  rc;.}../*.** Run
2bf70 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
2bf80 6e 74 20 69 6e 20 7a 53 71 6c 2e 20 20 4f 72 20  nt in zSql.  Or 
2bf90 69 66 20 64 6f 69 6e 67 20 61 20 2d 2d 64 72 79  if doing a --dry
2bfa0 72 75 6e 2c 20 6d 65 72 65 6c 79 20 70 72 69 6e  run, merely prin
2bfb0 74 20 69 74 20 6f 75 74 2e 0a 2a 2f 0a 73 74 61  t it out..*/.sta
2bfc0 74 69 63 20 69 6e 74 20 61 72 45 78 65 63 53 71  tic int arExecSq
2bfd0 6c 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72  l(ArCommand *pAr
2bfe0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
2bff0 71 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ql){.  int rc;. 
2c000 20 69 66 28 20 70 41 72 2d 3e 62 44 72 79 52 75   if( pAr->bDryRu
2c010 6e 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  n ){.    utf8_pr
2c020 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74  intf(pAr->p->out
2c030 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b  , "%s\n", zSql);
2c040 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2c050 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
2c060 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30    char *zErr = 0
2c070 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2c080 65 33 5f 65 78 65 63 28 70 41 72 2d 3e 64 62 2c  e3_exec(pAr->db,
2c090 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45   zSql, 0, 0, &zE
2c0a0 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72  rr);.    if( zEr
2c0b0 72 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  r ){.      utf8_
2c0c0 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
2c0d0 45 52 52 4f 52 3a 20 25 73 5c 6e 22 2c 20 7a 45  ERROR: %s\n", zE
2c0e0 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rr);.      sqlit
2c0f0 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
2c100 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2c110 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2c120 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
2c130 66 20 2e 61 72 20 22 63 72 65 61 74 65 22 2c 20  f .ar "create", 
2c140 22 69 6e 73 65 72 74 22 2c 20 61 6e 64 20 22 75  "insert", and "u
2c150 70 64 61 74 65 22 20 63 6f 6d 6d 61 6e 64 73 2e  pdate" commands.
2c160 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 72 65 61 74  .**.**     creat
2c170 65 20 20 20 20 2d 3e 20 20 20 20 20 43 72 65 61  e    ->     Crea
2c180 74 65 20 61 20 6e 65 77 20 53 51 4c 20 61 72 63  te a new SQL arc
2c190 68 69 76 65 0a 2a 2a 20 20 20 20 20 69 6e 73 65  hive.**     inse
2c1a0 72 74 20 20 20 20 2d 3e 20 20 20 20 20 49 6e 73  rt    ->     Ins
2c1b0 65 72 74 20 6f 72 20 72 65 69 6e 73 65 72 74 20  ert or reinsert 
2c1c0 61 6c 6c 20 66 69 6c 65 73 20 6c 69 73 74 65 64  all files listed
2c1d0 0a 2a 2a 20 20 20 20 20 75 70 64 61 74 65 20 20  .**     update  
2c1e0 20 20 2d 3e 20 20 20 20 20 49 6e 73 65 72 74 20    ->     Insert 
2c1f0 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
2c200 63 68 61 6e 67 65 64 20 6f 72 20 74 68 61 74 20  changed or that 
2c210 77 65 72 65 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  were not.**     
2c220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c230 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 20 74   previously in t
2c240 68 65 20 61 72 63 68 69 76 65 0a 2a 2a 0a 2a 2a  he archive.**.**
2c250 20 43 72 65 61 74 65 20 74 68 65 20 22 73 71 6c   Create the "sql
2c260 61 72 22 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ar" table in the
2c270 20 64 61 74 61 62 61 73 65 20 69 66 20 69 74 20   database if it 
2c280 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
2c290 20 65 78 69 73 74 2e 0a 2a 2a 20 54 68 65 6e 20   exist..** Then 
2c2a0 61 64 64 20 65 61 63 68 20 66 69 6c 65 20 69 6e  add each file in
2c2b0 20 74 68 65 20 61 7a 46 69 6c 65 5b 5d 20 61 72   the azFile[] ar
2c2c0 72 61 79 20 74 6f 20 74 68 65 20 61 72 63 68 69  ray to the archi
2c2d0 76 65 2e 20 44 69 72 65 63 74 6f 72 69 65 73 0a  ve. Directories.
2c2e0 2a 2a 20 61 72 65 20 61 64 64 65 64 20 72 65 63  ** are added rec
2c2f0 75 72 73 69 76 65 6c 79 2e 20 49 66 20 61 72 67  ursively. If arg
2c300 75 6d 65 6e 74 20 62 56 65 72 62 6f 73 65 20 69  ument bVerbose i
2c310 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d 65  s non-zero, a me
2c320 73 73 61 67 65 20 69 73 0a 2a 2a 20 70 72 69 6e  ssage is.** prin
2c330 74 65 64 20 6f 6e 20 73 74 64 6f 75 74 20 66 6f  ted on stdout fo
2c340 72 20 65 61 63 68 20 66 69 6c 65 20 61 72 63 68  r each file arch
2c350 69 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ived..**.** The 
2c360 63 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 69  create command i
2c370 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 75 70  s the same as up
2c380 64 61 74 65 2c 20 65 78 63 65 70 74 20 74 68 61  date, except tha
2c390 74 20 69 74 20 64 72 6f 70 73 0a 2a 2a 20 61 6e  t it drops.** an
2c3a0 79 20 65 78 69 73 74 69 6e 67 20 22 73 71 6c 61  y existing "sqla
2c3b0 72 22 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20  r" table before 
2c3c0 62 65 67 69 6e 6e 69 6e 67 2e 20 20 54 68 65 20  beginning.  The 
2c3d0 22 69 6e 73 65 72 74 22 20 63 6f 6d 6d 61 6e 64  "insert" command
2c3e0 0a 2a 2a 20 61 6c 77 61 79 73 20 6f 76 65 72 77  .** always overw
2c3f0 72 69 74 65 73 20 65 76 65 72 79 20 66 69 6c 65  rites every file
2c400 20 6e 61 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f   named on the co
2c410 6d 6d 61 6e 64 2d 6c 69 6e 65 2c 20 77 68 65 72  mmand-line, wher
2c420 65 20 61 73 0a 2a 2a 20 22 75 70 64 61 74 65 22  e as.** "update"
2c430 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73   only overwrites
2c440 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 72 20   if the size or 
2c450 6d 74 69 6d 65 20 6f 72 20 6d 6f 64 65 20 68 61  mtime or mode ha
2c460 73 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74  s changed..*/.st
2c470 61 74 69 63 20 69 6e 74 20 61 72 43 72 65 61 74  atic int arCreat
2c480 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64  eOrUpdateCommand
2c490 28 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  (.  ArCommand *p
2c4a0 41 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Ar,             
2c4b0 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61      /* Command a
2c4c0 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 70 74  rguments and opt
2c4d0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 55  ions */.  int bU
2c4e0 70 64 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  pdate,          
2c4f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72 75            /* tru
2c500 65 20 66 6f 72 20 61 20 2d 2d 63 72 65 61 74 65  e for a --create
2c510 2e 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6e 6c 79  . */.  int bOnly
2c520 49 66 43 68 61 6e 67 65 64 20 20 20 20 20 20 20  IfChanged       
2c530 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 75         /* Only u
2c540 70 64 61 74 65 20 69 66 20 66 69 6c 65 20 68 61  pdate if file ha
2c550 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 29 7b 0a  s changed */.){.
2c560 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
2c570 72 65 61 74 65 20 3d 20 0a 20 20 20 20 20 20 22  reate = .      "
2c580 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20  CREATE TABLE IF 
2c590 4e 4f 54 20 45 58 49 53 54 53 20 73 71 6c 61 72  NOT EXISTS sqlar
2c5a0 28 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 6e 61  (\n".      "  na
2c5b0 6d 65 20 54 45 58 54 20 50 52 49 4d 41 52 59 20  me TEXT PRIMARY 
2c5c0 4b 45 59 2c 20 20 2d 2d 20 6e 61 6d 65 20 6f 66  KEY,  -- name of
2c5d0 20 74 68 65 20 66 69 6c 65 5c 6e 22 0a 20 20 20   the file\n".   
2c5e0 20 20 20 22 20 20 6d 6f 64 65 20 49 4e 54 2c 20     "  mode INT, 
2c5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
2c600 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69   access permissi
2c610 6f 6e 73 5c 6e 22 0a 20 20 20 20 20 20 22 20 20  ons\n".      "  
2c620 6d 74 69 6d 65 20 49 4e 54 2c 20 20 20 20 20 20  mtime INT,      
2c630 20 20 20 20 20 20 20 20 2d 2d 20 6c 61 73 74 20          -- last 
2c640 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 74 69 6d  modification tim
2c650 65 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 73 7a  e\n".      "  sz
2c660 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20 20   INT,           
2c670 20 20 20 20 20 20 2d 2d 20 6f 72 69 67 69 6e 61        -- origina
2c680 6c 20 66 69 6c 65 20 73 69 7a 65 5c 6e 22 0a 20  l file size\n". 
2c690 20 20 20 20 20 22 20 20 64 61 74 61 20 42 4c 4f       "  data BLO
2c6a0 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B               
2c6b0 2d 2d 20 63 6f 6d 70 72 65 73 73 65 64 20 63 6f  -- compressed co
2c6c0 6e 74 65 6e 74 5c 6e 22 0a 20 20 20 20 20 20 22  ntent\n".      "
2c6d0 29 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  )";.  const char
2c6e0 20 2a 7a 44 72 6f 70 20 3d 20 22 44 52 4f 50 20   *zDrop = "DROP 
2c6f0 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
2c700 73 71 6c 61 72 22 3b 0a 20 20 63 6f 6e 73 74 20  sqlar";.  const 
2c710 63 68 61 72 20 2a 7a 49 6e 73 65 72 74 46 6d 74  char *zInsertFmt
2c720 5b 32 5d 20 3d 20 7b 0a 20 20 20 20 20 22 52 45  [2] = {.     "RE
2c730 50 4c 41 43 45 20 49 4e 54 4f 20 25 73 28 6e 61  PLACE INTO %s(na
2c740 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c 73 7a  me,mode,mtime,sz
2c750 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22  ,data)\n".     "
2c760 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20 20 20    SELECT\n".    
2c770 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a 20 20 20   "    %s,\n".   
2c780 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a    "    mode,\n".
2c790 20 20 20 20 20 22 20 20 20 20 6d 74 69 6d 65 2c       "    mtime,
2c7a0 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 43 41  \n".     "    CA
2c7b0 53 45 20 73 75 62 73 74 72 28 6c 73 6d 6f 64 65  SE substr(lsmode
2c7c0 28 6d 6f 64 65 29 2c 31 2c 31 29 5c 6e 22 0a 20  (mode),1,1)\n". 
2c7d0 20 20 20 20 22 20 20 20 20 20 20 57 48 45 4e 20      "      WHEN 
2c7e0 27 2d 27 20 54 48 45 4e 20 6c 65 6e 67 74 68 28  '-' THEN length(
2c7f0 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20  data)\n".     " 
2c800 20 20 20 20 20 57 48 45 4e 20 27 64 27 20 54 48       WHEN 'd' TH
2c810 45 4e 20 30 5c 6e 22 0a 20 20 20 20 20 22 20 20  EN 0\n".     "  
2c820 20 20 20 20 45 4c 53 45 20 2d 31 20 45 4e 44 2c      ELSE -1 END,
2c830 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 73 71  \n".     "    sq
2c840 6c 61 72 5f 63 6f 6d 70 72 65 73 73 28 64 61 74  lar_compress(dat
2c850 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 46 52  a)\n".     "  FR
2c860 4f 4d 20 66 73 64 69 72 28 25 51 2c 25 51 29 20  OM fsdir(%Q,%Q) 
2c870 41 53 20 64 69 73 6b 5c 6e 22 0a 20 20 20 20 20  AS disk\n".     
2c880 22 20 20 57 48 45 52 45 20 6c 73 6d 6f 64 65 28  "  WHERE lsmode(
2c890 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20 27  mode) NOT LIKE '
2c8a0 3f 25 25 27 25 73 3b 22 0a 20 20 20 20 20 2c 0a  ?%%'%s;".     ,.
2c8b0 20 20 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e       "REPLACE IN
2c8c0 54 4f 20 25 73 28 6e 61 6d 65 2c 6d 6f 64 65 2c  TO %s(name,mode,
2c8d0 6d 74 69 6d 65 2c 64 61 74 61 29 5c 6e 22 0a 20  mtime,data)\n". 
2c8e0 20 20 20 20 22 20 20 53 45 4c 45 43 54 5c 6e 22      "  SELECT\n"
2c8f0 0a 20 20 20 20 20 22 20 20 20 20 25 73 2c 5c 6e  .     "    %s,\n
2c900 22 0a 20 20 20 20 20 22 20 20 20 20 6d 6f 64 65  ".     "    mode
2c910 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d  ,\n".     "    m
2c920 74 69 6d 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20  time,\n".     " 
2c930 20 20 20 64 61 74 61 5c 6e 22 0a 20 20 20 20 20     data\n".     
2c940 22 20 20 46 52 4f 4d 20 66 73 64 69 72 28 25 51  "  FROM fsdir(%Q
2c950 2c 25 51 29 20 41 53 20 64 69 73 6b 5c 6e 22 0a  ,%Q) AS disk\n".
2c960 20 20 20 20 20 22 20 20 57 48 45 52 45 20 6c 73       "  WHERE ls
2c970 6d 6f 64 65 28 6d 6f 64 65 29 20 4e 4f 54 20 4c  mode(mode) NOT L
2c980 49 4b 45 20 27 3f 25 25 27 25 73 3b 22 0a 20 20  IKE '?%%'%s;".  
2c990 7d 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  };.  int i;     
2c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9b0 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72       /* For iter
2c9c0 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61 7a  ating through az
2c9d0 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  File[] */.  int 
2c9e0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2c9f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2ca00 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2ca10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2ca20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2ca30 2f 2a 20 53 51 4c 20 74 61 62 6c 65 20 69 6e 74  /* SQL table int
2ca40 6f 20 77 68 69 63 68 20 74 6f 20 69 6e 73 65 72  o which to inser
2ca50 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71  t */.  char *zSq
2ca60 6c 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  l;.  char zTemp[
2ca70 35 30 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78  50];.  char *zEx
2ca80 69 73 74 73 20 3d 20 30 3b 0a 0a 20 20 61 72 45  ists = 0;..  arE
2ca90 78 65 63 53 71 6c 28 70 41 72 2c 20 22 50 52 41  xecSql(pAr, "PRA
2caa0 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3d 35 31  GMA page_size=51
2cab0 32 22 29 3b 0a 20 20 72 63 20 3d 20 61 72 45 78  2");.  rc = arEx
2cac0 65 63 53 71 6c 28 70 41 72 2c 20 22 53 41 56 45  ecSql(pAr, "SAVE
2cad0 50 4f 49 4e 54 20 61 72 3b 22 29 3b 0a 20 20 69  POINT ar;");.  i
2cae0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2caf0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2cb00 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 20 0a 20  zTemp[0] = 0; . 
2cb10 20 69 66 28 20 70 41 72 2d 3e 62 5a 69 70 20 29   if( pAr->bZip )
2cb20 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
2cb30 69 7a 65 20 74 68 65 20 7a 69 70 66 69 6c 65 20  ize the zipfile 
2cb40 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 69  virtual table, i
2cb50 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
2cb60 20 20 20 69 66 28 20 70 41 72 2d 3e 7a 46 69 6c     if( pAr->zFil
2cb70 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
2cb80 65 33 5f 75 69 6e 74 36 34 20 72 3b 0a 20 20 20  e3_uint64 r;.   
2cb90 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
2cba0 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c  mness(sizeof(r),
2cbb0 26 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &r);.      sqlit
2cbc0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2cbd0 6f 66 28 7a 54 65 6d 70 29 2c 7a 54 65 6d 70 2c  of(zTemp),zTemp,
2cbe0 22 7a 69 70 25 30 31 36 6c 6c 78 22 2c 72 29 3b  "zip%016llx",r);
2cbf0 0a 20 20 20 20 20 20 7a 54 61 62 20 3d 20 7a 54  .      zTab = zT
2cc00 65 6d 70 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20  emp;.      zSql 
2cc10 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2cc20 66 28 0a 20 20 20 20 20 20 20 20 20 22 43 52 45  f(.         "CRE
2cc30 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
2cc40 45 20 74 65 6d 70 2e 25 73 20 55 53 49 4e 47 20  E temp.%s USING 
2cc50 7a 69 70 66 69 6c 65 28 25 51 29 22 2c 0a 20 20  zipfile(%Q)",.  
2cc60 20 20 20 20 20 20 20 7a 54 61 62 2c 20 70 41 72         zTab, pAr
2cc70 2d 3e 7a 46 69 6c 65 0a 20 20 20 20 20 20 29 3b  ->zFile.      );
2cc80 0a 20 20 20 20 20 20 72 63 20 3d 20 61 72 45 78  .      rc = arEx
2cc90 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c 29  ecSql(pAr, zSql)
2cca0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2ccb0 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
2ccc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54 61  }else{.      zTa
2ccd0 62 20 3d 20 22 7a 69 70 22 3b 0a 20 20 20 20 7d  b = "zip";.    }
2cce0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2ccf0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
2cd00 74 61 62 6c 65 20 66 6f 72 20 61 6e 20 53 51 4c  table for an SQL
2cd10 41 52 20 2a 2f 0a 20 20 20 20 7a 54 61 62 20 3d  AR */.    zTab =
2cd20 20 22 73 71 6c 61 72 22 3b 0a 20 20 20 20 69 66   "sqlar";.    if
2cd30 28 20 62 55 70 64 61 74 65 3d 3d 30 20 29 7b 0a  ( bUpdate==0 ){.
2cd40 20 20 20 20 20 20 72 63 20 3d 20 61 72 45 78 65        rc = arExe
2cd50 63 53 71 6c 28 70 41 72 2c 20 7a 44 72 6f 70 29  cSql(pAr, zDrop)
2cd60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2cd70 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2cd80 20 65 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63 74   end_ar_transact
2cd90 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ion;.    }.    r
2cda0 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41  c = arExecSql(pA
2cdb0 72 2c 20 7a 43 72 65 61 74 65 29 3b 0a 20 20 7d  r, zCreate);.  }
2cdc0 0a 20 20 69 66 28 20 62 4f 6e 6c 79 49 66 43 68  .  if( bOnlyIfCh
2cdd0 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 7a 45 78  anged ){.    zEx
2cde0 69 73 74 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d  ists = sqlite3_m
2cdf0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22 20  printf(.      " 
2ce00 41 4e 44 20 4e 4f 54 20 45 58 49 53 54 53 28 22  AND NOT EXISTS("
2ce10 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45  .          "SELE
2ce20 43 54 20 31 20 46 52 4f 4d 20 25 73 20 41 53 20  CT 1 FROM %s AS 
2ce30 6d 65 6d 22 0a 20 20 20 20 20 20 20 20 20 20 22  mem".          "
2ce40 20 57 48 45 52 45 20 6d 65 6d 2e 6e 61 6d 65 3d   WHERE mem.name=
2ce50 64 69 73 6b 2e 6e 61 6d 65 22 0a 20 20 20 20 20  disk.name".     
2ce60 20 20 20 20 20 22 20 41 4e 44 20 6d 65 6d 2e 6d       " AND mem.m
2ce70 74 69 6d 65 3d 64 69 73 6b 2e 6d 74 69 6d 65 22  time=disk.mtime"
2ce80 0a 20 20 20 20 20 20 20 20 20 20 22 20 41 4e 44  .          " AND
2ce90 20 6d 65 6d 2e 6d 6f 64 65 3d 64 69 73 6b 2e 6d   mem.mode=disk.m
2cea0 6f 64 65 29 22 2c 20 7a 54 61 62 29 3b 0a 20 20  ode)", zTab);.  
2ceb0 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45 78 69 73  }else{.    zExis
2cec0 74 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ts = sqlite3_mpr
2ced0 69 6e 74 66 28 22 22 29 3b 0a 20 20 7d 0a 20 20  intf("");.  }.  
2cee0 69 66 28 20 7a 45 78 69 73 74 73 3d 3d 30 20 29  if( zExists==0 )
2cef0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2cf00 45 4d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  EM;.  for(i=0; i
2cf10 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63  <pAr->nArg && rc
2cf20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
2cf30 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  ){.    char *zSq
2cf40 6c 32 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  l2 = sqlite3_mpr
2cf50 69 6e 74 66 28 7a 49 6e 73 65 72 74 46 6d 74 5b  intf(zInsertFmt[
2cf60 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 7a 54 61 62  pAr->bZip], zTab
2cf70 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e 62  ,.        pAr->b
2cf80 56 65 72 62 6f 73 65 20 3f 20 22 73 68 65 6c 6c  Verbose ? "shell
2cf90 5f 70 75 74 73 6e 6c 28 6e 61 6d 65 29 22 20 3a  _putsnl(name)" :
2cfa0 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20 20   "name",.       
2cfb0 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 2c 20   pAr->azArg[i], 
2cfc0 70 41 72 2d 3e 7a 44 69 72 2c 20 7a 45 78 69 73  pAr->zDir, zExis
2cfd0 74 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 72  ts);.    rc = ar
2cfe0 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71  ExecSql(pAr, zSq
2cff0 6c 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  l2);.    sqlite3
2d000 5f 66 72 65 65 28 7a 53 71 6c 32 29 3b 0a 20 20  _free(zSql2);.  
2d010 7d 0a 65 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63  }.end_ar_transac
2d020 74 69 6f 6e 3a 0a 20 20 69 66 28 20 72 63 21 3d  tion:.  if( rc!=
2d030 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d040 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 41   sqlite3_exec(pA
2d050 72 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b  r->db, "ROLLBACK
2d060 20 54 4f 20 61 72 3b 20 52 45 4c 45 41 53 45 20   TO ar; RELEASE 
2d070 61 72 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ar;", 0, 0, 0);.
2d080 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2d090 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c  = arExecSql(pAr,
2d0a0 20 22 52 45 4c 45 41 53 45 20 61 72 3b 22 29 3b   "RELEASE ar;");
2d0b0 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62 5a  .    if( pAr->bZ
2d0c0 69 70 20 26 26 20 70 41 72 2d 3e 7a 46 69 6c 65  ip && pAr->zFile
2d0d0 20 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d   ){.      zSql =
2d0e0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2d0f0 28 22 44 52 4f 50 20 54 41 42 4c 45 20 25 73 22  ("DROP TABLE %s"
2d100 2c 20 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  , zTemp);.      
2d110 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a  arExecSql(pAr, z
2d120 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sql);.      sqli
2d130 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
2d140 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
2d150 74 65 33 5f 66 72 65 65 28 7a 45 78 69 73 74 73  te3_free(zExists
2d160 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2d170 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2d180 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 61 72 22  ntation of ".ar"
2d190 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   dot command..*/
2d1a0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 44 6f  .static int arDo
2d1b0 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c  tCommand(.  Shel
2d1c0 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20  lState *pState, 
2d1d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2d1e0 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f  urrent shell too
2d1f0 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74  l state */.  int
2d200 20 66 72 6f 6d 43 6d 64 4c 69 6e 65 2c 20 20 20   fromCmdLine,   
2d210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d220 54 72 75 65 20 69 66 20 2d 41 20 63 6f 6d 6d 61  True if -A comma
2d230 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2c 20  nd-line option, 
2d240 6e 6f 74 20 2e 61 72 20 63 6d 64 20 2a 2f 0a 20  not .ar cmd */. 
2d250 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
2d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d270 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67   /* Array of arg
2d280 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
2d290 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a   dot command */.
2d2a0 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20    int nArg      
2d2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
2d2d0 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b  ntries in azArg[
2d2e0 5d 20 2a 2f 0a 29 7b 0a 20 20 41 72 43 6f 6d 6d  ] */.){.  ArComm
2d2f0 61 6e 64 20 63 6d 64 3b 0a 20 20 69 6e 74 20 72  and cmd;.  int r
2d300 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6d 64  c;.  memset(&cmd
2d310 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29  , 0, sizeof(cmd)
2d320 29 3b 0a 20 20 63 6d 64 2e 66 72 6f 6d 43 6d 64  );.  cmd.fromCmd
2d330 4c 69 6e 65 20 3d 20 66 72 6f 6d 43 6d 64 4c 69  Line = fromCmdLi
2d340 6e 65 3b 0a 20 20 72 63 20 3d 20 61 72 50 61 72  ne;.  rc = arPar
2d350 73 65 43 6f 6d 6d 61 6e 64 28 61 7a 41 72 67 2c  seCommand(azArg,
2d360 20 6e 41 72 67 2c 20 26 63 6d 64 29 3b 0a 20 20   nArg, &cmd);.  
2d370 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2d380 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 44 62  K ){.    int eDb
2d390 54 79 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45  Type = SHELL_OPE
2d3a0 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 20 20 63 6d  N_UNSPEC;.    cm
2d3b0 64 2e 70 20 3d 20 70 53 74 61 74 65 3b 0a 20 20  d.p = pState;.  
2d3c0 20 20 63 6d 64 2e 64 62 20 3d 20 70 53 74 61 74    cmd.db = pStat
2d3d0 65 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 63  e->db;.    if( c
2d3e0 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20  md.zFile ){.    
2d3f0 20 20 65 44 62 54 79 70 65 20 3d 20 64 65 64 75    eDbType = dedu
2d400 63 65 44 61 74 61 62 61 73 65 54 79 70 65 28 63  ceDatabaseType(c
2d410 6d 64 2e 7a 46 69 6c 65 2c 20 31 29 3b 0a 20 20  md.zFile, 1);.  
2d420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65    }else{.      e
2d430 44 62 54 79 70 65 20 3d 20 70 53 74 61 74 65 2d  DbType = pState-
2d440 3e 6f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 7d  >openMode;.    }
2d450 0a 20 20 20 20 69 66 28 20 65 44 62 54 79 70 65  .    if( eDbType
2d460 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50  ==SHELL_OPEN_ZIP
2d470 46 49 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66  FILE ){.      if
2d480 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43  ( cmd.eCmd==AR_C
2d490 4d 44 5f 45 58 54 52 41 43 54 20 7c 7c 20 63 6d  MD_EXTRACT || cm
2d4a0 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 4c  d.eCmd==AR_CMD_L
2d4b0 49 53 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  IST ){.        i
2d4c0 66 28 20 63 6d 64 2e 7a 46 69 6c 65 3d 3d 30 20  f( cmd.zFile==0 
2d4d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64  ){.          cmd
2d4e0 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c  .zSrcTable = sql
2d4f0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69  ite3_mprintf("zi
2d500 70 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  p");.        }el
2d510 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6d  se{.          cm
2d520 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71  d.zSrcTable = sq
2d530 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a  lite3_mprintf("z
2d540 69 70 66 69 6c 65 28 25 51 29 22 2c 20 63 6d 64  ipfile(%Q)", cmd
2d550 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  .zFile);.       
2d560 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2d570 20 63 6d 64 2e 62 5a 69 70 20 3d 20 31 3b 0a 20   cmd.bZip = 1;. 
2d580 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6d 64     }else if( cmd
2d590 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  .zFile ){.      
2d5a0 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 20 20 20  int flags;.     
2d5b0 20 69 66 28 20 63 6d 64 2e 62 41 70 70 65 6e 64   if( cmd.bAppend
2d5c0 20 29 20 65 44 62 54 79 70 65 20 3d 20 53 48 45   ) eDbType = SHE
2d5d0 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46  LL_OPEN_APPENDVF
2d5e0 53 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64  S;.      if( cmd
2d5f0 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43 52  .eCmd==AR_CMD_CR
2d600 45 41 54 45 20 7c 7c 20 63 6d 64 2e 65 43 6d 64  EATE || cmd.eCmd
2d610 3d 3d 41 52 5f 43 4d 44 5f 49 4e 53 45 52 54 20  ==AR_CMD_INSERT 
2d620 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 63  .           || c
2d630 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f  md.eCmd==AR_CMD_
2d640 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UPDATE ){.      
2d650 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45    flags = SQLITE
2d660 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
2d670 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
2d680 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  TE;.      }else{
2d690 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d  .        flags =
2d6a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2d6b0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20  DONLY;.      }. 
2d6c0 20 20 20 20 20 63 6d 64 2e 64 62 20 3d 20 30 3b       cmd.db = 0;
2d6d0 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 62  .      if( cmd.b
2d6e0 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 20 20  DryRun ){.      
2d6f0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 53    utf8_printf(pS
2d700 74 61 74 65 2d 3e 6f 75 74 2c 20 22 2d 2d 20 6f  tate->out, "-- o
2d710 70 65 6e 20 64 61 74 61 62 61 73 65 20 27 25 73  pen database '%s
2d720 27 25 73 5c 6e 22 2c 20 63 6d 64 2e 7a 46 69 6c  '%s\n", cmd.zFil
2d730 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2d740 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f  eDbType==SHELL_O
2d750 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 3f 20  PEN_APPENDVFS ? 
2d760 22 20 75 73 69 6e 67 20 27 61 70 6e 64 76 66 73  " using 'apndvfs
2d770 27 22 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  '" : "");.      
2d780 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
2d790 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 63 6d 64  ite3_open_v2(cmd
2d7a0 2e 7a 46 69 6c 65 2c 20 26 63 6d 64 2e 64 62 2c  .zFile, &cmd.db,
2d7b0 20 66 6c 61 67 73 2c 20 0a 20 20 20 20 20 20 20   flags, .       
2d7c0 20 20 20 20 20 20 65 44 62 54 79 70 65 3d 3d 53        eDbType==S
2d7d0 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44  HELL_OPEN_APPEND
2d7e0 56 46 53 20 3f 20 22 61 70 6e 64 76 66 73 22 20  VFS ? "apndvfs" 
2d7f0 3a 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  : 0);.      if( 
2d800 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d810 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
2d820 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63 61  intf(stderr, "ca
2d830 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20  nnot open file: 
2d840 25 73 20 28 25 73 29 5c 6e 22 2c 20 0a 20 20 20  %s (%s)\n", .   
2d850 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 46 69           cmd.zFi
2d860 6c 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  le, sqlite3_errm
2d870 73 67 28 63 6d 64 2e 64 62 29 0a 20 20 20 20 20  sg(cmd.db).     
2d880 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f     );.        go
2d890 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e  to end_ar_comman
2d8a0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
2d8b0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f   sqlite3_fileio_
2d8c0 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20 30 2c 20  init(cmd.db, 0, 
2d8d0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
2d8e0 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 63 6d 64  3_sqlar_init(cmd
2d8f0 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  .db, 0, 0);.    
2d900 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
2d910 5f 66 75 6e 63 74 69 6f 6e 28 63 6d 64 2e 64 62  _function(cmd.db
2d920 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 22  , "shell_putsnl"
2d930 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
2d940 2c 20 63 6d 64 2e 70 2c 0a 20 20 20 20 20 20 20  , cmd.p,.       
2d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d960 20 20 20 20 20 20 20 73 68 65 6c 6c 50 75 74 73         shellPuts
2d970 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  Func, 0, 0);..  
2d980 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6d 64 2e    }.    if( cmd.
2d990 7a 53 72 63 54 61 62 6c 65 3d 3d 30 20 26 26 20  zSrcTable==0 && 
2d9a0 63 6d 64 2e 62 5a 69 70 3d 3d 30 20 26 26 20 63  cmd.bZip==0 && c
2d9b0 6d 64 2e 65 43 6d 64 21 3d 41 52 5f 43 4d 44 5f  md.eCmd!=AR_CMD_
2d9c0 48 45 4c 50 20 29 7b 0a 20 20 20 20 20 20 69 66  HELP ){.      if
2d9d0 28 20 63 6d 64 2e 65 43 6d 64 21 3d 41 52 5f 43  ( cmd.eCmd!=AR_C
2d9e0 4d 44 5f 43 52 45 41 54 45 0a 20 20 20 20 20 20  MD_CREATE.      
2d9f0 20 26 26 20 73 71 6c 69 74 65 33 5f 74 61 62 6c   && sqlite3_tabl
2da00 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
2da10 61 28 63 6d 64 2e 64 62 2c 30 2c 22 73 71 6c 61  a(cmd.db,0,"sqla
2da20 72 22 2c 22 6e 61 6d 65 22 2c 30 2c 30 2c 30 2c  r","name",0,0,0,
2da30 30 2c 30 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  0,0).      ){.  
2da40 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2da50 66 28 73 74 64 65 72 72 2c 20 22 64 61 74 61 62  f(stderr, "datab
2da60 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ase does not con
2da70 74 61 69 6e 20 61 6e 20 27 73 71 6c 61 72 27 20  tain an 'sqlar' 
2da80 74 61 62 6c 65 5c 6e 22 29 3b 0a 20 20 20 20 20  table\n");.     
2da90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2daa0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f  RROR;.        go
2dab0 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e  to end_ar_comman
2dac0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
2dad0 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d   cmd.zSrcTable =
2dae0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2daf0 28 22 73 71 6c 61 72 22 29 3b 0a 20 20 20 20 7d  ("sqlar");.    }
2db00 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 63 6d  ..    switch( cm
2db10 64 2e 65 43 6d 64 20 29 7b 0a 20 20 20 20 20 20  d.eCmd ){.      
2db20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52 45 41  case AR_CMD_CREA
2db30 54 45 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  TE:.        rc =
2db40 20 61 72 43 72 65 61 74 65 4f 72 55 70 64 61 74   arCreateOrUpdat
2db50 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c 20 30  eCommand(&cmd, 0
2db60 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 0);.        br
2db70 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
2db80 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a   AR_CMD_EXTRACT:
2db90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72  .        rc = ar
2dba0 45 78 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 26  ExtractCommand(&
2dbb0 63 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72  cmd);.        br
2dbc0 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
2dbd0 20 41 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20   AR_CMD_LIST:.  
2dbe0 20 20 20 20 20 20 72 63 20 3d 20 61 72 4c 69 73        rc = arLis
2dbf0 74 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b 0a  tCommand(&cmd);.
2dc00 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
2dc10 20 20 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d        case AR_CM
2dc20 44 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20 20 20  D_HELP:.        
2dc30 61 72 55 73 61 67 65 28 70 53 74 61 74 65 2d 3e  arUsage(pState->
2dc40 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  out);.        br
2dc50 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
2dc60 20 41 52 5f 43 4d 44 5f 49 4e 53 45 52 54 3a 0a   AR_CMD_INSERT:.
2dc70 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 43          rc = arC
2dc80 72 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f 6d  reateOrUpdateCom
2dc90 6d 61 6e 64 28 26 63 6d 64 2c 20 31 2c 20 30 29  mand(&cmd, 1, 0)
2dca0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2dcb0 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ..      default:
2dcc0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2dcd0 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d   cmd.eCmd==AR_CM
2dce0 44 5f 55 50 44 41 54 45 20 29 3b 0a 20 20 20 20  D_UPDATE );.    
2dcf0 20 20 20 20 72 63 20 3d 20 61 72 43 72 65 61 74      rc = arCreat
2dd00 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64  eOrUpdateCommand
2dd10 28 26 63 6d 64 2c 20 31 2c 20 31 29 3b 0a 20 20  (&cmd, 1, 1);.  
2dd20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2dd30 20 7d 0a 20 20 7d 0a 65 6e 64 5f 61 72 5f 63 6f   }.  }.end_ar_co
2dd40 6d 6d 61 6e 64 3a 0a 20 20 69 66 28 20 63 6d 64  mmand:.  if( cmd
2dd50 2e 64 62 21 3d 70 53 74 61 74 65 2d 3e 64 62 20  .db!=pState->db 
2dd60 29 7b 0a 20 20 20 20 63 6c 6f 73 65 5f 64 62 28  ){.    close_db(
2dd70 63 6d 64 2e 64 62 29 3b 0a 20 20 7d 0a 20 20 73  cmd.db);.  }.  s
2dd80 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6d 64 2e  qlite3_free(cmd.
2dd90 7a 53 72 63 54 61 62 6c 65 29 3b 0a 0a 20 20 72  zSrcTable);..  r
2dda0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45  eturn rc;.}./* E
2ddb0 6e 64 20 6f 66 20 74 68 65 20 22 2e 61 72 63 68  nd of the ".arch
2ddc0 69 76 65 22 20 6f 72 20 22 2e 61 72 22 20 63 6f  ive" or ".ar" co
2ddd0 6d 6d 61 6e 64 20 6c 6f 67 69 63 0a 2a 2a 2a 2a  mmand logic.****
2dde0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ddf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2de00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2de10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2de20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
2de30 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
2de40 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
2de50 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
2de60 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
2de70 41 56 45 5f 5a 4c 49 42 29 20 2a 2f 0a 0a 0a 2f  AVE_ZLIB) */.../
2de80 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 70 75 74  *.** If an input
2de90 20 6c 69 6e 65 20 62 65 67 69 6e 73 20 77 69 74   line begins wit
2dea0 68 20 22 2e 22 20 74 68 65 6e 20 69 6e 76 6f 6b  h "." then invok
2deb0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  e this routine t
2dec0 6f 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61  o.** process tha
2ded0 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  t line..**.** Re
2dee0 74 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c  turn 1 on error,
2def0 20 32 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20   2 to exit, and 
2df00 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  0 otherwise..*/.
2df10 73 74 61 74 69 63 20 69 6e 74 20 64 6f 5f 6d 65  static int do_me
2df20 74 61 5f 63 6f 6d 6d 61 6e 64 28 63 68 61 72 20  ta_command(char 
2df30 2a 7a 4c 69 6e 65 2c 20 53 68 65 6c 6c 53 74 61  *zLine, ShellSta
2df40 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 68 20  te *p){.  int h 
2df50 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20  = 1;.  int nArg 
2df60 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 3b  = 0;.  int n, c;
2df70 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
2df80 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 35 30 5d   char *azArg[50]
2df90 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
2dfa0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2dfb0 42 4c 45 0a 20 20 69 66 28 20 70 2d 3e 65 78 70  BLE.  if( p->exp
2dfc0 65 72 74 2e 70 45 78 70 65 72 74 20 29 7b 0a 20  ert.pExpert ){. 
2dfd0 20 20 20 65 78 70 65 72 74 46 69 6e 69 73 68 28     expertFinish(
2dfe0 70 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  p, 1, 0);.  }.#e
2dff0 6e 64 69 66 0a 0a 20 20 2f 2a 20 50 61 72 73 65  ndif..  /* Parse
2e000 20 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 20   the input line 
2e010 69 6e 74 6f 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a  into tokens..  *
2e020 2f 0a 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65  /.  while( zLine
2e030 5b 68 5d 20 26 26 20 6e 41 72 67 3c 41 72 72 61  [h] && nArg<Arra
2e040 79 53 69 7a 65 28 61 7a 41 72 67 29 20 29 7b 0a  ySize(azArg) ){.
2e050 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
2e060 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20  ce(zLine[h]) ){ 
2e070 68 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a  h++; }.    if( z
2e080 4c 69 6e 65 5b 68 5d 3d 3d 30 20 29 20 62 72 65  Line[h]==0 ) bre
2e090 61 6b 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e  ak;.    if( zLin
2e0a0 65 5b 68 5d 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c  e[h]=='\'' || zL
2e0b0 69 6e 65 5b 68 5d 3d 3d 27 22 27 20 29 7b 0a 20  ine[h]=='"' ){. 
2e0c0 20 20 20 20 20 69 6e 74 20 64 65 6c 69 6d 20 3d       int delim =
2e0d0 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 3b 0a 20 20 20   zLine[h++];.   
2e0e0 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d     azArg[nArg++]
2e0f0 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20   = &zLine[h];.  
2e100 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65      while( zLine
2e110 5b 68 5d 20 26 26 20 7a 4c 69 6e 65 5b 68 5d 21  [h] && zLine[h]!
2e120 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20  =delim ){.      
2e130 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d    if( zLine[h]==
2e140 27 5c 5c 27 20 26 26 20 64 65 6c 69 6d 3d 3d 27  '\\' && delim=='
2e150 22 27 20 26 26 20 7a 4c 69 6e 65 5b 68 2b 31 5d  "' && zLine[h+1]
2e160 21 3d 30 20 29 20 68 2b 2b 3b 0a 20 20 20 20 20  !=0 ) h++;.     
2e170 20 20 20 68 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     h++;.      }.
2e180 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b        if( zLine[
2e190 68 5d 3d 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20  h]==delim ){.   
2e1a0 20 20 20 20 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20       zLine[h++] 
2e1b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
2e1c0 20 20 20 69 66 28 20 64 65 6c 69 6d 3d 3d 27 22     if( delim=='"
2e1d0 27 20 29 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b  ' ) resolve_back
2e1e0 73 6c 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41  slashes(azArg[nA
2e1f0 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  rg-1]);.    }els
2e200 65 7b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e  e{.      azArg[n
2e210 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b  Arg++] = &zLine[
2e220 68 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  h];.      while(
2e230 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 21 49 73   zLine[h] && !Is
2e240 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20  Space(zLine[h]) 
2e250 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ){ h++; }.      
2e260 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 20 29 20 7a  if( zLine[h] ) z
2e270 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20  Line[h++] = 0;. 
2e280 20 20 20 20 20 72 65 73 6f 6c 76 65 5f 62 61 63       resolve_bac
2e290 6b 73 6c 61 73 68 65 73 28 61 7a 41 72 67 5b 6e  kslashes(azArg[n
2e2a0 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 0a 20  Arg-1]);.    }. 
2e2b0 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
2e2c0 20 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 2e   the input line.
2e2d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67  .  */.  if( nArg
2e2e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
2e2f0 2f 2a 20 6e 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f  /* no tokens, no
2e300 20 65 72 72 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20   error */.  n = 
2e310 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 30  strlen30(azArg[0
2e320 5d 29 3b 0a 20 20 63 20 3d 20 61 7a 41 72 67 5b  ]);.  c = azArg[
2e330 30 5d 5b 30 5d 3b 0a 20 20 63 6c 65 61 72 54 65  0][0];.  clearTe
2e340 6d 70 46 69 6c 65 28 70 29 3b 0a 0a 23 69 66 6e  mpFile(p);..#ifn
2e350 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e360 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
2e370 69 66 28 20 63 3d 3d 27 61 27 20 26 26 20 73 74  if( c=='a' && st
2e380 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2e390 22 61 75 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b  "auth", n)==0 ){
2e3a0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32  .    if( nArg!=2
2e3b0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2e3c0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2e3d0 61 67 65 3a 20 2e 61 75 74 68 20 4f 4e 7c 4f 46  age: .auth ON|OF
2e3e0 46 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  F\n");.      rc 
2e3f0 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
2e400 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
2e410 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65  t;.    }.    ope
2e420 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
2e430 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  if( booleanValue
2e440 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20  (azArg[1]) ){.  
2e450 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
2e460 61 75 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62  authorizer(p->db
2e470 2c 20 73 68 65 6c 6c 41 75 74 68 2c 20 70 29 3b  , shellAuth, p);
2e480 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2e490 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75    sqlite3_set_au
2e4a0 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20  thorizer(p->db, 
2e4b0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
2e4c0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66  else.#endif..#if
2e4d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2e4e0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2e4f0 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  LE) && defined(S
2e500 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29  QLITE_HAVE_ZLIB)
2e510 0a 20 20 69 66 28 20 63 3d 3d 27 61 27 20 26 26  .  if( c=='a' &&
2e520 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2e530 5d 2c 20 22 61 72 63 68 69 76 65 22 2c 20 6e 29  ], "archive", n)
2e540 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f  ==0 ){.    open_
2e550 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63  db(p, 0);.    rc
2e560 20 3d 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28   = arDotCommand(
2e570 70 2c 20 30 2c 20 61 7a 41 72 67 2c 20 6e 41 72  p, 0, azArg, nAr
2e580 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  g);.  }else.#end
2e590 69 66 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27 62  if..  if( (c=='b
2e5a0 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
2e5b0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2e5c0 62 61 63 6b 75 70 22 2c 20 6e 29 3d 3d 30 29 0a  backup", n)==0).
2e5d0 20 20 20 7c 7c 20 28 63 3d 3d 27 73 27 20 26 26     || (c=='s' &&
2e5e0 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
2e5f0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 61 76 65  (azArg[0], "save
2e600 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20  ", n)==0).  ){. 
2e610 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2e620 44 65 73 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20  DestFile = 0;.  
2e630 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2e640 62 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  b = 0;.    sqlit
2e650 65 33 20 2a 70 44 65 73 74 3b 0a 20 20 20 20 73  e3 *pDest;.    s
2e660 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70  qlite3_backup *p
2e670 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20  Backup;.    int 
2e680 6a 3b 0a 20 20 20 20 69 6e 74 20 62 41 73 79 6e  j;.    int bAsyn
2e690 63 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  c = 0;.    const
2e6a0 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b   char *zVfs = 0;
2e6b0 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c  .    for(j=1; j<
2e6c0 6e 41 72 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nArg; j++){.    
2e6d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
2e6e0 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20  = azArg[j];.    
2e6f0 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20    if( z[0]=='-' 
2e700 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
2e710 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a  [1]=='-' ) z++;.
2e720 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
2e730 6d 70 28 7a 2c 20 22 2d 61 70 70 65 6e 64 22 29  mp(z, "-append")
2e740 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2e750 20 7a 56 66 73 20 3d 20 22 61 70 6e 64 76 66 73   zVfs = "apndvfs
2e760 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
2e770 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
2e780 63 6d 70 28 7a 2c 20 22 2d 61 73 79 6e 63 22 29  cmp(z, "-async")
2e790 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2e7a0 20 62 41 73 79 6e 63 20 3d 20 31 3b 0a 20 20 20   bAsync = 1;.   
2e7b0 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
2e7c0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75     {.          u
2e7d0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2e7e0 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  r, "unknown opti
2e7f0 6f 6e 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67  on: %s\n", azArg
2e800 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [j]);.          
2e810 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2e820 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
2e830 69 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30  if( zDestFile==0
2e840 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 73   ){.        zDes
2e850 74 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d  tFile = azArg[j]
2e860 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
2e870 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zDb==0 ){.    
2e880 20 20 20 20 7a 44 62 20 3d 20 7a 44 65 73 74 46      zDb = zDestF
2e890 69 6c 65 3b 0a 20 20 20 20 20 20 20 20 7a 44 65  ile;.        zDe
2e8a0 73 74 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a  stFile = azArg[j
2e8b0 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ];.      }else{.
2e8c0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
2e8d0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2e8e0 65 3a 20 2e 62 61 63 6b 75 70 20 3f 44 42 3f 20  e: .backup ?DB? 
2e8f0 3f 4f 50 54 49 4f 4e 53 3f 20 46 49 4c 45 4e 41  ?OPTIONS? FILENA
2e900 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ME\n");.        
2e910 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2e920 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2e930 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a  zDestFile==0 ){.
2e940 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2e950 28 73 74 64 65 72 72 2c 20 22 6d 69 73 73 69 6e  (stderr, "missin
2e960 67 20 46 49 4c 45 4e 41 4d 45 20 61 72 67 75 6d  g FILENAME argum
2e970 65 6e 74 20 6f 6e 20 2e 62 61 63 6b 75 70 5c 6e  ent on .backup\n
2e980 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
2e990 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
2e9a0 28 20 7a 44 62 3d 3d 30 20 29 20 7a 44 62 20 3d  ( zDb==0 ) zDb =
2e9b0 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 72 63 20   "main";.    rc 
2e9c0 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  = sqlite3_open_v
2e9d0 32 28 7a 44 65 73 74 46 69 6c 65 2c 20 26 70 44  2(zDestFile, &pD
2e9e0 65 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  est, .          
2e9f0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
2ea00 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
2ea10 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
2ea20 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 69 66 28  , zVfs);.    if(
2ea30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ea40 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
2ea50 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2ea60 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
2ea70 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 44 65 73 74  \"%s\"\n", zDest
2ea80 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 63 6c 6f  File);.      clo
2ea90 73 65 5f 64 62 28 70 44 65 73 74 29 3b 0a 20 20  se_db(pDest);.  
2eaa0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2eab0 20 20 7d 0a 20 20 20 20 69 66 28 20 62 41 73 79    }.    if( bAsy
2eac0 6e 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nc ){.      sqli
2ead0 74 65 33 5f 65 78 65 63 28 70 44 65 73 74 2c 20  te3_exec(pDest, 
2eae0 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e  "PRAGMA synchron
2eaf0 6f 75 73 3d 4f 46 46 3b 20 50 52 41 47 4d 41 20  ous=OFF; PRAGMA 
2eb00 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46  journal_mode=OFF
2eb10 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ;",.            
2eb20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 29 3b         0, 0, 0);
2eb30 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
2eb40 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70 42  db(p, 0);.    pB
2eb50 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f  ackup = sqlite3_
2eb60 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73  backup_init(pDes
2eb70 74 2c 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62  t, "main", p->db
2eb80 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
2eb90 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20  pBackup==0 ){.  
2eba0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2ebb0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2ebc0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
2ebd0 72 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20  rrmsg(pDest));. 
2ebe0 20 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 44       close_db(pD
2ebf0 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  est);.      retu
2ec00 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2ec10 77 68 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71  while(  (rc = sq
2ec20 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65  lite3_backup_ste
2ec30 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d  p(pBackup,100))=
2ec40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20  =SQLITE_OK ){}. 
2ec50 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
2ec60 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70  p_finish(pBackup
2ec70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2ec80 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
2ec90 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
2eca0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66  }else{.      utf
2ecb0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2ecc0 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20   "Error: %s\n", 
2ecd0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
2ece0 44 65 73 74 29 29 3b 0a 20 20 20 20 20 20 72 63  Dest));.      rc
2ecf0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
2ed00 63 6c 6f 73 65 5f 64 62 28 70 44 65 73 74 29 3b  close_db(pDest);
2ed10 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2ed20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26  c=='b' && n>=3 &
2ed30 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2ed40 30 5d 2c 20 22 62 61 69 6c 22 2c 20 6e 29 3d 3d  0], "bail", n)==
2ed50 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
2ed60 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 62 61  g==2 ){.      ba
2ed70 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 62 6f  il_on_error = bo
2ed80 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
2ed90 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [1]);.    }else{
2eda0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2edb0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
2edc0 3a 20 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66 5c 6e  : .bail on|off\n
2edd0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
2ede0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2edf0 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26  .  if( c=='b' &&
2ee00 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
2ee10 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 69 6e 61  (azArg[0], "bina
2ee20 72 79 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ry", n)==0 ){.  
2ee30 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
2ee40 0a 20 20 20 20 20 20 69 66 28 20 62 6f 6f 6c 65  .      if( boole
2ee50 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
2ee60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74  ) ){.        set
2ee70 42 69 6e 61 72 79 4d 6f 64 65 28 70 2d 3e 6f 75  BinaryMode(p->ou
2ee80 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  t, 1);.      }el
2ee90 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 74 54  se{.        setT
2eea0 65 78 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20  extMode(p->out, 
2eeb0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
2eec0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
2eed0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2eee0 22 55 73 61 67 65 3a 20 2e 62 69 6e 61 72 79 20  "Usage: .binary 
2eef0 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20  on|off\n");.    
2ef00 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
2ef10 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2ef20 3d 3d 27 63 27 20 26 26 20 73 74 72 63 6d 70 28  =='c' && strcmp(
2ef30 61 7a 41 72 67 5b 30 5d 2c 22 63 64 22 29 3d 3d  azArg[0],"cd")==
2ef40 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
2ef50 67 3d 3d 32 20 29 7b 0a 23 69 66 20 64 65 66 69  g==2 ){.#if defi
2ef60 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
2ef70 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 20 20  efined(WIN32).  
2ef80 20 20 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d      wchar_t *z =
2ef90 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75   sqlite3_win32_u
2efa0 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 61  tf8_to_unicode(a
2efb0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
2efc0 72 63 20 3d 20 21 53 65 74 43 75 72 72 65 6e 74  rc = !SetCurrent
2efd0 44 69 72 65 63 74 6f 72 79 57 28 7a 29 3b 0a 20  DirectoryW(z);. 
2efe0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2eff0 65 28 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  e(z);.#else.    
2f000 20 20 72 63 20 3d 20 63 68 64 69 72 28 61 7a 41    rc = chdir(azA
2f010 72 67 5b 31 5d 29 3b 0a 23 65 6e 64 69 66 0a 20  rg[1]);.#endif. 
2f020 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2f030 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2f040 74 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e  tf(stderr, "Cann
2f050 6f 74 20 63 68 61 6e 67 65 20 74 6f 20 64 69 72  ot change to dir
2f060 65 63 74 6f 72 79 20 5c 22 25 73 5c 22 5c 6e 22  ectory \"%s\"\n"
2f070 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
2f080 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2f090 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2f0a0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2f0b0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2f0c0 20 2e 63 64 20 44 49 52 45 43 54 4f 52 59 5c 6e   .cd DIRECTORY\n
2f0d0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
2f0e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2f0f0 0a 20 20 2f 2a 20 54 68 65 20 75 6e 64 6f 63 75  .  /* The undocu
2f100 6d 65 6e 74 65 64 20 22 2e 62 72 65 61 6b 70 6f  mented ".breakpo
2f110 69 6e 74 22 20 63 6f 6d 6d 61 6e 64 20 63 61 75  int" command cau
2f120 73 65 73 20 61 20 63 61 6c 6c 20 74 6f 20 74 68  ses a call to th
2f130 65 20 6e 6f 2d 6f 70 0a 20 20 2a 2a 20 72 6f 75  e no-op.  ** rou
2f140 74 69 6e 65 20 6e 61 6d 65 64 20 74 65 73 74 5f  tine named test_
2f150 62 72 65 61 6b 70 6f 69 6e 74 28 29 2e 0a 20 20  breakpoint()..  
2f160 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20  */.  if( c=='b' 
2f170 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
2f180 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 72  mp(azArg[0], "br
2f190 65 61 6b 70 6f 69 6e 74 22 2c 20 6e 29 3d 3d 30  eakpoint", n)==0
2f1a0 20 29 7b 0a 20 20 20 20 74 65 73 74 5f 62 72 65   ){.    test_bre
2f1b0 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 65 6c  akpoint();.  }el
2f1c0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27  se..  if( c=='c'
2f1d0 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
2f1e0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63  cmp(azArg[0], "c
2f1f0 68 61 6e 67 65 73 22 2c 20 6e 29 3d 3d 30 20 29  hanges", n)==0 )
2f200 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
2f210 32 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72  2 ){.      setOr
2f220 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46  ClearFlag(p, SHF
2f230 4c 47 5f 43 6f 75 6e 74 43 68 61 6e 67 65 73 2c  LG_CountChanges,
2f240 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
2f250 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
2f260 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2f270 22 55 73 61 67 65 3a 20 2e 63 68 61 6e 67 65 73  "Usage: .changes
2f280 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20   on|off\n");.   
2f290 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2f2a0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 43  .  }else..  /* C
2f2b0 61 6e 63 65 6c 20 6f 75 74 70 75 74 20 72 65 64  ancel output red
2f2c0 69 72 65 63 74 69 6f 6e 2c 20 69 66 20 69 74 20  irection, if it 
2f2d0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74  is currently set
2f2e0 20 28 62 79 20 2e 74 65 73 74 63 61 73 65 29 0a   (by .testcase).
2f2f0 20 20 2a 2a 20 54 68 65 6e 20 72 65 61 64 20 74    ** Then read t
2f300 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
2f310 65 20 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74  e testcase-out.t
2f320 78 74 20 66 69 6c 65 20 61 6e 64 20 63 6f 6d 70  xt file and comp
2f330 61 72 65 20 61 67 61 69 6e 73 74 0a 20 20 2a 2a  are against.  **
2f340 20 61 7a 41 72 67 5b 31 5d 2e 20 20 49 66 20 74   azArg[1].  If t
2f350 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
2f360 6e 63 65 73 2c 20 72 65 70 6f 72 74 20 61 6e 20  nces, report an 
2f370 65 72 72 6f 72 20 61 6e 64 20 65 78 69 74 2e 0a  error and exit..
2f380 20 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 63    */.  if( c=='c
2f390 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
2f3a0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2f3b0 63 68 65 63 6b 22 2c 20 6e 29 3d 3d 30 20 29 7b  check", n)==0 ){
2f3c0 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 65 73 20  .    char *zRes 
2f3d0 3d 20 30 3b 0a 20 20 20 20 6f 75 74 70 75 74 5f  = 0;.    output_
2f3e0 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20 69 66  reset(p);.    if
2f3f0 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20  ( nArg!=2 ){.   
2f400 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2f410 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63  derr, "Usage: .c
2f420 68 65 63 6b 20 47 4c 4f 42 2d 50 41 54 54 45 52  heck GLOB-PATTER
2f430 4e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  N\n");.      rc 
2f440 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 2;.    }else i
2f450 66 28 20 28 7a 52 65 73 20 3d 20 72 65 61 64 46  f( (zRes = readF
2f460 69 6c 65 28 22 74 65 73 74 63 61 73 65 2d 6f 75  ile("testcase-ou
2f470 74 2e 74 78 74 22 2c 20 30 29 29 3d 3d 30 20 29  t.txt", 0))==0 )
2f480 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2f490 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2f4a0 72 3a 20 63 61 6e 6e 6f 74 20 72 65 61 64 20 27  r: cannot read '
2f4b0 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74  testcase-out.txt
2f4c0 27 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  '\n");.      rc 
2f4d0 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 2;.    }else i
2f4e0 66 28 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62  f( testcase_glob
2f4f0 28 61 7a 41 72 67 5b 31 5d 2c 7a 52 65 73 29 3d  (azArg[1],zRes)=
2f500 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =0 ){.      utf8
2f510 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a  _printf(stderr,.
2f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f530 20 22 74 65 73 74 63 61 73 65 2d 25 73 20 46 41   "testcase-%s FA
2f540 49 4c 45 44 5c 6e 20 45 78 70 65 63 74 65 64 3a  ILED\n Expected:
2f550 20 5b 25 73 5d 5c 6e 20 20 20 20 20 20 47 6f 74   [%s]\n      Got
2f560 3a 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20  : [%s]\n",.     
2f570 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
2f580 54 65 73 74 63 61 73 65 2c 20 61 7a 41 72 67 5b  Testcase, azArg[
2f590 31 5d 2c 20 7a 52 65 73 29 3b 0a 20 20 20 20 20  1], zRes);.     
2f5a0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c   rc = 1;.    }el
2f5b0 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  se{.      utf8_p
2f5c0 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 74  rintf(stdout, "t
2f5d0 65 73 74 63 61 73 65 2d 25 73 20 6f 6b 5c 6e 22  estcase-%s ok\n"
2f5e0 2c 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 29 3b  , p->zTestcase);
2f5f0 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 65 63 6b  .      p->nCheck
2f600 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ++;.    }.    sq
2f610 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65 73 29  lite3_free(zRes)
2f620 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
2f630 20 63 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63   c=='c' && strnc
2f640 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 6c  mp(azArg[0], "cl
2f650 6f 6e 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  one", n)==0 ){. 
2f660 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
2f670 7b 0a 20 20 20 20 20 20 74 72 79 54 6f 43 6c 6f  {.      tryToClo
2f680 6e 65 28 70 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  ne(p, azArg[1]);
2f690 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f6a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2f6b0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 6c  err, "Usage: .cl
2f6c0 6f 6e 65 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29  one FILENAME\n")
2f6d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2f6e0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2f6f0 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e   if( c=='d' && n
2f700 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  >1 && strncmp(az
2f710 41 72 67 5b 30 5d 2c 20 22 64 61 74 61 62 61 73  Arg[0], "databas
2f720 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  es", n)==0 ){.  
2f730 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74    ShellState dat
2f740 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  a;.    char *zEr
2f750 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70  rMsg = 0;.    op
2f760 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2f770 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70   memcpy(&data, p
2f780 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b  , sizeof(data));
2f790 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65  .    data.showHe
2f7a0 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61  ader = 0;.    da
2f7b0 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e  ta.cMode = data.
2f7c0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74  mode = MODE_List
2f7d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
2f7e0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 64 61  printf(sizeof(da
2f7f0 74 61 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  ta.colSeparator)
2f800 2c 64 61 74 61 2e 63 6f 6c 53 65 70 61 72 61 74  ,data.colSeparat
2f810 6f 72 2c 22 3a 20 22 29 3b 0a 20 20 20 20 64 61  or,": ");.    da
2f820 74 61 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  ta.cnt = 0;.    
2f830 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
2f840 64 62 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65  db, "SELECT name
2f850 2c 20 66 69 6c 65 20 46 52 4f 4d 20 70 72 61 67  , file FROM prag
2f860 6d 61 5f 64 61 74 61 62 61 73 65 5f 6c 69 73 74  ma_database_list
2f870 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2f880 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64      callback, &d
2f890 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  ata, &zErrMsg);.
2f8a0 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
2f8b0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
2f8c0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
2f8d0 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d  or: %s\n", zErrM
2f8e0 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sg);.      sqlit
2f8f0 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
2f900 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2f910 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2f920 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e   if( c=='d' && n
2f930 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
2f940 7a 41 72 67 5b 30 5d 2c 20 22 64 62 63 6f 6e 66  zArg[0], "dbconf
2f950 69 67 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ig", n)==0 ){.  
2f960 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
2f970 74 72 75 63 74 20 44 62 43 6f 6e 66 69 67 43 68  truct DbConfigCh
2f980 6f 69 63 65 73 20 7b 0a 20 20 20 20 20 20 63 6f  oices {.      co
2f990 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
2f9a0 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20  .      int op;. 
2f9b0 20 20 20 7d 20 61 44 62 43 6f 6e 66 69 67 5b 5d     } aDbConfig[]
2f9c0 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 22   = {.        { "
2f9d0 65 6e 61 62 6c 65 5f 66 6b 65 79 22 2c 20 20 20  enable_fkey",   
2f9e0 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
2f9f0 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 20 20  IG_ENABLE_FKEY  
2fa00 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2fa10 20 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 74       { "enable_t
2fa20 72 69 67 67 65 72 22 2c 20 20 20 53 51 4c 49 54  rigger",   SQLIT
2fa30 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
2fa40 45 5f 54 52 49 47 47 45 52 20 20 20 20 20 20 20  E_TRIGGER       
2fa50 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22    },.        { "
2fa60 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 22 2c  fts3_tokenizer",
2fa70 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
2fa80 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54  IG_ENABLE_FTS3_T
2fa90 4f 4b 45 4e 49 5a 45 52 20 20 7d 2c 0a 20 20 20  OKENIZER  },.   
2faa0 20 20 20 20 20 7b 20 22 6c 6f 61 64 5f 65 78 74       { "load_ext
2fab0 65 6e 73 69 6f 6e 22 2c 20 20 20 53 51 4c 49 54  ension",   SQLIT
2fac0 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
2fad0 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
2fae0 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22    },.        { "
2faf0 6e 6f 5f 63 6b 70 74 5f 6f 6e 5f 63 6c 6f 73 65  no_ckpt_on_close
2fb00 22 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  ", SQLITE_DBCONF
2fb10 49 47 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c  IG_NO_CKPT_ON_CL
2fb20 4f 53 45 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  OSE       },.   
2fb30 20 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 71       { "enable_q
2fb40 70 73 67 22 2c 20 20 20 20 20 20 53 51 4c 49 54  psg",      SQLIT
2fb50 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
2fb60 45 5f 51 50 53 47 20 20 20 20 20 20 20 20 20 20  E_QPSG          
2fb70 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22    },.        { "
2fb80 74 72 69 67 67 65 72 5f 65 71 70 22 2c 20 20 20  trigger_eqp",   
2fb90 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
2fba0 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 20 20  IG_TRIGGER_EQP  
2fbb0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2fbc0 20 20 20 20 20 7b 20 22 72 65 73 65 74 5f 64 61       { "reset_da
2fbd0 74 61 62 61 73 65 22 2c 20 20 20 53 51 4c 49 54  tabase",   SQLIT
2fbe0 45 5f 44 42 43 4f 4e 46 49 47 5f 52 45 53 45 54  E_DBCONFIG_RESET
2fbf0 5f 44 41 54 41 42 41 53 45 20 20 20 20 20 20 20  _DATABASE       
2fc00 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22    },.        { "
2fc10 64 65 66 65 6e 73 69 76 65 22 2c 20 20 20 20 20  defensive",     
2fc20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
2fc30 49 47 5f 44 45 46 45 4e 53 49 56 45 20 20 20 20  IG_DEFENSIVE    
2fc40 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2fc50 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 69 2c 20   };.    int ii, 
2fc60 76 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  v;.    open_db(p
2fc70 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 69  , 0);.    for(ii
2fc80 3d 30 3b 20 69 69 3c 41 72 72 61 79 53 69 7a 65  =0; ii<ArraySize
2fc90 28 61 44 62 43 6f 6e 66 69 67 29 3b 20 69 69 2b  (aDbConfig); ii+
2fca0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41  +){.      if( nA
2fcb0 72 67 3e 31 20 26 26 20 73 74 72 63 6d 70 28 61  rg>1 && strcmp(a
2fcc0 7a 41 72 67 5b 31 5d 2c 20 61 44 62 43 6f 6e 66  zArg[1], aDbConf
2fcd0 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ig[ii].zName)!=0
2fce0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2fcf0 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29     if( nArg>=3 )
2fd00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2fd10 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64  3_db_config(p->d
2fd20 62 2c 20 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d  b, aDbConfig[ii]
2fd30 2e 6f 70 2c 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  .op, booleanValu
2fd40 65 28 61 7a 41 72 67 5b 32 5d 29 2c 20 30 29 3b  e(azArg[2]), 0);
2fd50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2fd60 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
2fd70 28 70 2d 3e 64 62 2c 20 61 44 62 43 6f 6e 66 69  (p->db, aDbConfi
2fd80 67 5b 69 69 5d 2e 6f 70 2c 20 2d 31 2c 20 26 76  g[ii].op, -1, &v
2fd90 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
2fda0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31  intf(p->out, "%1
2fdb0 38 73 20 25 73 5c 6e 22 2c 20 61 44 62 43 6f 6e  8s %s\n", aDbCon
2fdc0 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65 2c 20 76  fig[ii].zName, v
2fdd0 20 3f 20 22 6f 6e 22 20 3a 20 22 6f 66 66 22 29   ? "on" : "off")
2fde0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  ;.      if( nArg
2fdf0 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  >1 ) break;.    
2fe00 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31  }.    if( nArg>1
2fe10 20 26 26 20 69 69 3d 3d 41 72 72 61 79 53 69 7a   && ii==ArraySiz
2fe20 65 28 61 44 62 43 6f 6e 66 69 67 29 20 29 7b 0a  e(aDbConfig) ){.
2fe30 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2fe40 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2fe50 3a 20 75 6e 6b 6e 6f 77 6e 20 64 62 63 6f 6e 66  : unknown dbconf
2fe60 69 67 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  ig \"%s\"\n", az
2fe70 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 75  Arg[1]);.      u
2fe80 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2fe90 72 2c 20 22 45 6e 74 65 72 20 5c 22 2e 64 62 63  r, "Enter \".dbc
2fea0 6f 6e 66 69 67 5c 22 20 77 69 74 68 20 6e 6f 20  onfig\" with no 
2feb0 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 61 20  arguments for a 
2fec0 6c 69 73 74 5c 6e 22 29 3b 0a 20 20 20 20 7d 20  list\n");.    } 
2fed0 20 20 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66    .  }else..  if
2fee0 28 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 3d 33  ( c=='d' && n>=3
2fef0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2ff00 67 5b 30 5d 2c 20 22 64 62 69 6e 66 6f 22 2c 20  g[0], "dbinfo", 
2ff10 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  n)==0 ){.    rc 
2ff20 3d 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63  = shell_dbinfo_c
2ff30 6f 6d 6d 61 6e 64 28 70 2c 20 6e 41 72 67 2c 20  ommand(p, nArg, 
2ff40 61 7a 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a  azArg);.  }else.
2ff50 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26  .  if( c=='d' &&
2ff60 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2ff70 5d 2c 20 22 64 75 6d 70 22 2c 20 6e 29 3d 3d 30  ], "dump", n)==0
2ff80 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2ff90 61 72 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 0a 20  ar *zLike = 0;. 
2ffa0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
2ffb0 74 20 73 61 76 65 64 53 68 6f 77 48 65 61 64 65  t savedShowHeade
2ffc0 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65  r = p->showHeade
2ffd0 72 3b 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64  r;.    int saved
2ffe0 53 68 65 6c 6c 46 6c 61 67 73 20 3d 20 70 2d 3e  ShellFlags = p->
2fff0 73 68 65 6c 6c 46 6c 67 73 3b 0a 20 20 20 20 53  shellFlgs;.    S
30000 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c  hellClearFlag(p,
30010 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52   SHFLG_PreserveR
30020 6f 77 69 64 7c 53 48 46 4c 47 5f 4e 65 77 6c 69  owid|SHFLG_Newli
30030 6e 65 73 7c 53 48 46 4c 47 5f 45 63 68 6f 29 3b  nes|SHFLG_Echo);
30040 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
30050 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
30060 20 20 69 66 28 20 61 7a 41 72 67 5b 69 5d 5b 30    if( azArg[i][0
30070 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
30080 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
30090 3d 20 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20 20  = azArg[i]+1;.  
300a0 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
300b0 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20  '-' ) z++;.     
300c0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
300d0 22 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73  "preserve-rowids
300e0 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  ")==0 ){.#ifdef 
300f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
30100 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20  UALTABLE.       
30110 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
30120 64 65 72 72 2c 20 22 54 68 65 20 2d 2d 70 72 65  derr, "The --pre
30130 73 65 72 76 65 2d 72 6f 77 69 64 73 20 6f 70 74  serve-rowids opt
30140 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61  ion is not compa
30150 74 69 62 6c 65 22 0a 20 20 20 20 20 20 20 20 20  tible".         
30160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30170 20 20 20 20 22 20 77 69 74 68 20 53 51 4c 49 54      " with SQLIT
30180 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
30190 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  BLE\n");.       
301a0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
301b0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
301c0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 23 65 6c  ommand_exit;.#el
301d0 73 65 0a 20 20 20 20 20 20 20 20 20 20 53 68 65  se.          She
301e0 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46  llSetFlag(p, SHF
301f0 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64  LG_PreserveRowid
30200 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
30210 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20    }else.        
30220 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e 65  if( strcmp(z,"ne
30230 77 6c 69 6e 65 73 22 29 3d 3d 30 20 29 7b 0a 20  wlines")==0 ){. 
30240 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c 53 65           ShellSe
30250 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e  tFlag(p, SHFLG_N
30260 65 77 6c 69 6e 65 73 29 3b 0a 20 20 20 20 20 20  ewlines);.      
30270 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20    }else.        
30280 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
30290 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
302a0 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c  Unknown option \
302b0 22 25 73 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d 70  "%s\" on \".dump
302c0 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29  \"\n", azArg[i])
302d0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
302e0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   1;.          go
302f0 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
30300 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  exit;.        }.
30310 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
30320 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 20  zLike ){.       
30330 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
30340 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 64 75 6d  rr, "Usage: .dum
30350 70 20 3f 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f  p ?--preserve-ro
30360 77 69 64 73 3f 20 22 0a 20 20 20 20 20 20 20 20  wids? ".        
30370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30380 20 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f     "?--newlines?
30390 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c   ?LIKE-PATTERN?\
303a0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  n");.        rc 
303b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
303c0 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
303d0 78 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  xit;.      }else
303e0 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20  {.        zLike 
303f0 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  = azArg[i];.    
30400 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70    }.    }.    op
30410 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
30420 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67   /* When playing
30430 20 62 61 63 6b 20 61 20 22 64 75 6d 70 22 2c 20   back a "dump", 
30440 74 68 65 20 63 6f 6e 74 65 6e 74 20 6d 69 67 68  the content migh
30450 74 20 61 70 70 65 61 72 20 69 6e 20 61 6e 20 6f  t appear in an o
30460 72 64 65 72 0a 20 20 20 20 2a 2a 20 77 68 69 63  rder.    ** whic
30470 68 20 63 61 75 73 65 73 20 69 6d 6d 65 64 69 61  h causes immedia
30480 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  te foreign key c
30490 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 62 65  onstraints to be
304a0 20 76 69 6f 6c 61 74 65 64 2e 0a 20 20 20 20 2a   violated..    *
304b0 2a 20 53 6f 20 64 69 73 61 62 6c 65 20 66 6f 72  * So disable for
304c0 65 69 67 6e 2d 6b 65 79 20 63 6f 6e 73 74 72 61  eign-key constra
304d0 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  int enforcement 
304e0 74 6f 20 70 72 65 76 65 6e 74 20 70 72 6f 62 6c  to prevent probl
304f0 65 6d 73 2e 20 2a 2f 0a 20 20 20 20 72 61 77 5f  ems. */.    raw_
30500 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
30510 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
30520 65 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20  eys=OFF;\n");.  
30530 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
30540 6f 75 74 2c 20 22 42 45 47 49 4e 20 54 52 41 4e  out, "BEGIN TRAN
30550 53 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20  SACTION;\n");.  
30560 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68    p->writableSch
30570 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ema = 0;.    p->
30580 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a  showHeader = 0;.
30590 20 20 20 20 2f 2a 20 53 65 74 20 77 72 69 74 61      /* Set writa
305a0 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 73 69  ble_schema=ON si
305b0 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 66 6f 72  nce doing so for
305c0 63 65 73 20 53 51 4c 69 74 65 20 74 6f 20 69 6e  ces SQLite to in
305d0 69 74 69 61 6c 69 7a 65 0a 20 20 20 20 2a 2a 20  itialize.    ** 
305e0 61 73 20 6d 75 63 68 20 6f 66 20 74 68 65 20 73  as much of the s
305f0 63 68 65 6d 61 20 61 73 20 69 74 20 63 61 6e 20  chema as it can 
30600 65 76 65 6e 20 69 66 20 74 68 65 20 73 71 6c 69  even if the sqli
30610 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
30620 69 73 0a 20 20 20 20 2a 2a 20 63 6f 72 72 75 70  is.    ** corrup
30630 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  t. */.    sqlite
30640 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53  3_exec(p->db, "S
30650 41 56 45 50 4f 49 4e 54 20 64 75 6d 70 3b 20 50  AVEPOINT dump; P
30660 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
30670 63 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c  chema=ON", 0, 0,
30680 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6e 45 72 72   0);.    p->nErr
30690 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4c   = 0;.    if( zL
306a0 69 6b 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ike==0 ){.      
306b0 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f  run_schema_dump_
306c0 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20  query(p,.       
306d0 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74   "SELECT name, t
306e0 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71  ype, sql FROM sq
306f0 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
30700 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c        "WHERE sql
30710 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79   NOT NULL AND ty
30720 70 65 3d 3d 27 74 61 62 6c 65 27 20 41 4e 44 20  pe=='table' AND 
30730 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73 65  name!='sqlite_se
30740 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20 20 29  quence'".      )
30750 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65  ;.      run_sche
30760 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c  ma_dump_query(p,
30770 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
30780 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c   name, type, sql
30790 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
307a0 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
307b0 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c 69  HERE name=='sqli
307c0 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20  te_sequence'".  
307d0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e      );.      run
307e0 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72  _table_dump_quer
307f0 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45  y(p,.        "SE
30800 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71  LECT sql FROM sq
30810 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
30820 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c        "WHERE sql
30830 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79   NOT NULL AND ty
30840 70 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27  pe IN ('index','
30850 74 72 69 67 67 65 72 27 2c 27 76 69 65 77 27 29  trigger','view')
30860 22 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  ", 0.      );.  
30870 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
30880 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20  har *zSql;.     
30890 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
308a0 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
308b0 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74   "SELECT name, t
308c0 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71  ype, sql FROM sq
308d0 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
308e0 20 20 20 20 20 20 22 57 48 45 52 45 20 74 62 6c        "WHERE tbl
308f0 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 20 41 4e  _name LIKE %Q AN
30900 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 22  D type=='table'"
30910 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20  .        "  AND 
30920 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 7a  sql NOT NULL", z
30930 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e  Like);.      run
30940 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65  _schema_dump_que
30950 72 79 28 70 2c 7a 53 71 6c 29 3b 0a 20 20 20 20  ry(p,zSql);.    
30960 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
30970 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c  Sql);.      zSql
30980 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
30990 74 66 28 0a 20 20 20 20 20 20 20 20 22 53 45 4c  tf(.        "SEL
309a0 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  ECT sql FROM sql
309b0 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
309c0 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20       "WHERE sql 
309d0 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20  NOT NULL".      
309e0 20 20 22 20 20 41 4e 44 20 74 79 70 65 20 49 4e    "  AND type IN
309f0 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67   ('index','trigg
30a00 65 72 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20  er','view')".   
30a10 20 20 20 20 20 22 20 20 41 4e 44 20 74 62 6c 5f       "  AND tbl_
30a20 6e 61 6d 65 20 4c 49 4b 45 20 25 51 22 2c 20 7a  name LIKE %Q", z
30a30 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e  Like);.      run
30a40 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72  _table_dump_quer
30a50 79 28 70 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20  y(p, zSql, 0);. 
30a60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
30a70 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20  e(zSql);.    }. 
30a80 20 20 20 69 66 28 20 70 2d 3e 77 72 69 74 61 62     if( p->writab
30a90 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  leSchema ){.    
30aa0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
30ab0 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69  out, "PRAGMA wri
30ac0 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46  table_schema=OFF
30ad0 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ;\n");.      p->
30ae0 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d  writableSchema =
30af0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
30b00 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
30b10 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
30b20 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c  le_schema=OFF;",
30b30 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
30b40 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
30b50 62 2c 20 22 52 45 4c 45 41 53 45 20 64 75 6d 70  b, "RELEASE dump
30b60 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
30b70 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
30b80 6f 75 74 2c 20 70 2d 3e 6e 45 72 72 20 3f 20 22  out, p->nErr ? "
30b90 52 4f 4c 4c 42 41 43 4b 3b 20 2d 2d 20 64 75 65  ROLLBACK; -- due
30ba0 20 74 6f 20 65 72 72 6f 72 73 5c 6e 22 20 3a 20   to errors\n" : 
30bb0 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20  "COMMIT;\n");.  
30bc0 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20    p->showHeader 
30bd0 3d 20 73 61 76 65 64 53 68 6f 77 48 65 61 64 65  = savedShowHeade
30be0 72 3b 0a 20 20 20 20 70 2d 3e 73 68 65 6c 6c 46  r;.    p->shellF
30bf0 6c 67 73 20 3d 20 73 61 76 65 64 53 68 65 6c 6c  lgs = savedShell
30c00 46 6c 61 67 73 3b 0a 20 20 7d 65 6c 73 65 0a 0a  Flags;.  }else..
30c10 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20    if( c=='e' && 
30c20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
30c30 2c 20 22 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20  , "echo", n)==0 
30c40 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
30c50 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f  =2 ){.      setO
30c60 72 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48  rClearFlag(p, SH
30c70 46 4c 47 5f 45 63 68 6f 2c 20 61 7a 41 72 67 5b  FLG_Echo, azArg[
30c80 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
30c90 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
30ca0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
30cb0 20 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22   .echo on|off\n"
30cc0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
30cd0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
30ce0 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20    if( c=='e' && 
30cf0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
30d00 2c 20 22 65 71 70 22 2c 20 6e 29 3d 3d 30 20 29  , "eqp", n)==0 )
30d10 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
30d20 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 75  2 ){.      p->au
30d30 74 6f 45 51 50 74 65 73 74 20 3d 20 30 3b 0a 20  toEQPtest = 0;. 
30d40 20 20 20 20 20 69 66 28 20 70 2d 3e 61 75 74 6f       if( p->auto
30d50 45 51 50 74 72 61 63 65 20 29 7b 0a 20 20 20 20  EQPtrace ){.    
30d60 20 20 20 20 69 66 28 20 70 2d 3e 64 62 20 29 20      if( p->db ) 
30d70 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
30d80 64 62 2c 20 22 50 52 41 47 4d 41 20 76 64 62 65  db, "PRAGMA vdbe
30d90 5f 74 72 61 63 65 3d 4f 46 46 3b 22 2c 20 30 2c  _trace=OFF;", 0,
30da0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
30db0 70 2d 3e 61 75 74 6f 45 51 50 74 72 61 63 65 20  p->autoEQPtrace 
30dc0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
30dd0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
30de0 41 72 67 5b 31 5d 2c 22 66 75 6c 6c 22 29 3d 3d  Arg[1],"full")==
30df0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
30e00 61 75 74 6f 45 51 50 20 3d 20 41 55 54 4f 45 51  autoEQP = AUTOEQ
30e10 50 5f 66 75 6c 6c 3b 0a 20 20 20 20 20 20 7d 65  P_full;.      }e
30e20 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
30e30 7a 41 72 67 5b 31 5d 2c 22 74 72 69 67 67 65 72  zArg[1],"trigger
30e40 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
30e50 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41 55   p->autoEQP = AU
30e60 54 4f 45 51 50 5f 74 72 69 67 67 65 72 3b 0a 23  TOEQP_trigger;.#
30e70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
30e80 55 47 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  UG.      }else i
30e90 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  f( strcmp(azArg[
30ea0 31 5d 2c 22 74 65 73 74 22 29 3d 3d 30 20 29 7b  1],"test")==0 ){
30eb0 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  .        p->auto
30ec0 45 51 50 20 3d 20 41 55 54 4f 45 51 50 5f 6f 6e  EQP = AUTOEQP_on
30ed0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74  ;.        p->aut
30ee0 6f 45 51 50 74 65 73 74 20 3d 20 31 3b 0a 20 20  oEQPtest = 1;.  
30ef0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
30f00 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74  rcmp(azArg[1],"t
30f10 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  race")==0 ){.   
30f20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20       p->autoEQP 
30f30 3d 20 41 55 54 4f 45 51 50 5f 66 75 6c 6c 3b 0a  = AUTOEQP_full;.
30f40 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45          p->autoE
30f50 51 50 74 72 61 63 65 20 3d 20 31 3b 0a 20 20 20  QPtrace = 1;.   
30f60 20 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20       open_db(p, 
30f70 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
30f80 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
30f90 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f  "SELECT name FRO
30fa0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
30fb0 4c 49 4d 49 54 20 31 22 2c 20 30 2c 20 30 2c 20  LIMIT 1", 0, 0, 
30fc0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
30fd0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
30fe0 22 50 52 41 47 4d 41 20 76 64 62 65 5f 74 72 61  "PRAGMA vdbe_tra
30ff0 63 65 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30  ce=ON;", 0, 0, 0
31000 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
31010 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
31020 2d 3e 61 75 74 6f 45 51 50 20 3d 20 28 75 38 29  ->autoEQP = (u8)
31030 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
31040 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  rg[1]);.      }.
31050 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31060 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
31070 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65 71 70  rr, "Usage: .eqp
31080 20 6f 66 66 7c 6f 6e 7c 74 72 61 63 65 7c 74 72   off|on|trace|tr
31090 69 67 67 65 72 7c 66 75 6c 6c 5c 6e 22 29 3b 0a  igger|full\n");.
310a0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
310b0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
310c0 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72  f( c=='e' && str
310d0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
310e0 65 78 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  exit", n)==0 ){.
310f0 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26      if( nArg>1 &
31100 26 20 28 72 63 20 3d 20 28 69 6e 74 29 69 6e 74  & (rc = (int)int
31110 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b  egerValue(azArg[
31120 31 5d 29 29 21 3d 30 20 29 20 65 78 69 74 28 72  1]))!=0 ) exit(r
31130 63 29 3b 0a 20 20 20 20 72 63 20 3d 20 32 3b 0a  c);.    rc = 2;.
31140 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68    }else..  /* Th
31150 65 20 22 2e 65 78 70 6c 61 69 6e 22 20 63 6f 6d  e ".explain" com
31160 6d 61 6e 64 20 69 73 20 61 75 74 6f 6d 61 74 69  mand is automati
31170 63 20 6e 6f 77 2e 20 20 49 74 20 69 73 20 6c 61  c now.  It is la
31180 72 67 65 6c 79 20 70 6f 69 6e 74 6c 65 73 73 2e  rgely pointless.
31190 20 20 49 74 0a 20 20 2a 2a 20 72 65 74 61 69 6e    It.  ** retain
311a0 65 64 20 70 75 72 65 6c 79 20 66 6f 72 20 62 61  ed purely for ba
311b0 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
311c0 69 6c 69 74 79 20 2a 2f 0a 20 20 69 66 28 20 63  ility */.  if( c
311d0 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70  =='e' && strncmp
311e0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70 6c  (azArg[0], "expl
311f0 61 69 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ain", n)==0 ){. 
31200 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 31 3b 0a     int val = 1;.
31210 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 32 20      if( nArg>=2 
31220 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
31230 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61 75  cmp(azArg[1],"au
31240 74 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  to")==0 ){.     
31250 20 20 20 76 61 6c 20 3d 20 39 39 3b 0a 20 20 20     val = 99;.   
31260 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31270 20 20 76 61 6c 20 3d 20 20 62 6f 6f 6c 65 61 6e    val =  boolean
31280 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
31290 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
312a0 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20 26 26     if( val==1 &&
312b0 20 70 2d 3e 6d 6f 64 65 21 3d 4d 4f 44 45 5f 45   p->mode!=MODE_E
312c0 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20  xplain ){.      
312d0 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 20 3d 20  p->normalMode = 
312e0 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70  p->mode;.      p
312f0 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78  ->mode = MODE_Ex
31300 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 70 2d 3e  plain;.      p->
31310 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30 3b  autoExplain = 0;
31320 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76  .    }else if( v
31330 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  al==0 ){.      i
31340 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45  f( p->mode==MODE
31350 5f 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f  _Explain ) p->mo
31360 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f  de = p->normalMo
31370 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74  de;.      p->aut
31380 6f 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20  oExplain = 0;.  
31390 20 20 7d 65 6c 73 65 20 69 66 28 20 76 61 6c 3d    }else if( val=
313a0 3d 39 39 20 29 7b 0a 20 20 20 20 20 20 69 66 28  =99 ){.      if(
313b0 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45   p->mode==MODE_E
313c0 78 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65  xplain ) p->mode
313d0 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65   = p->normalMode
313e0 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45  ;.      p->autoE
313f0 78 70 6c 61 69 6e 20 3d 20 31 3b 0a 20 20 20 20  xplain = 1;.    
31400 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64  }.  }else..#ifnd
31410 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
31420 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
31430 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e  ( c=='e' && strn
31440 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65  cmp(azArg[0], "e
31450 78 70 65 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b  xpert", n)==0 ){
31460 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
31470 30 29 3b 0a 20 20 20 20 65 78 70 65 72 74 44 6f  0);.    expertDo
31480 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41 72  tCommand(p, azAr
31490 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73  g, nArg);.  }els
314a0 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  e.#endif..  if( 
314b0 63 3d 3d 27 66 27 20 26 26 20 73 74 72 6e 63 6d  c=='f' && strncm
314c0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 66 75 6c  p(azArg[0], "ful
314d0 6c 73 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20  lschema", n)==0 
314e0 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74  ){.    ShellStat
314f0 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72  e data;.    char
31500 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
31510 20 20 20 69 6e 74 20 64 6f 53 74 61 74 73 20 3d     int doStats =
31520 20 30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   0;.    memcpy(&
31530 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28  data, p, sizeof(
31540 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61  data));.    data
31550 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b  .showHeader = 0;
31560 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20  .    data.cMode 
31570 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f  = data.mode = MO
31580 44 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 66 28  DE_Semi;.    if(
31590 20 6e 41 72 67 3d 3d 32 20 26 26 20 6f 70 74 69   nArg==2 && opti
315a0 6f 6e 4d 61 74 63 68 28 61 7a 41 72 67 5b 31 5d  onMatch(azArg[1]
315b0 2c 20 22 69 6e 64 65 6e 74 22 29 20 29 7b 0a 20  , "indent") ){. 
315c0 20 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20       data.cMode 
315d0 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f  = data.mode = MO
315e0 44 45 5f 50 72 65 74 74 79 3b 0a 20 20 20 20 20  DE_Pretty;.     
315f0 20 6e 41 72 67 20 3d 20 31 3b 0a 20 20 20 20 7d   nArg = 1;.    }
31600 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 31  .    if( nArg!=1
31610 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
31620 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
31630 61 67 65 3a 20 2e 66 75 6c 6c 73 63 68 65 6d 61  age: .fullschema
31640 20 3f 2d 2d 69 6e 64 65 6e 74 3f 5c 6e 22 29 3b   ?--indent?\n");
31650 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
31660 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
31670 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
31680 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70   }.    open_db(p
31690 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  , 0);.    rc = s
316a0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
316b0 62 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  b,.       "SELEC
316c0 54 20 73 71 6c 20 46 52 4f 4d 22 0a 20 20 20 20  T sql FROM".    
316d0 20 20 20 22 20 20 28 53 45 4c 45 43 54 20 73 71     "  (SELECT sq
316e0 6c 20 73 71 6c 2c 20 74 79 70 65 20 74 79 70 65  l sql, type type
316f0 2c 20 74 62 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e  , tbl_name tbl_n
31700 61 6d 65 2c 20 6e 61 6d 65 20 6e 61 6d 65 2c 20  ame, name name, 
31710 72 6f 77 69 64 20 78 22 0a 20 20 20 20 20 20 20  rowid x".       
31720 22 20 20 20 20 20 46 52 4f 4d 20 73 71 6c 69 74  "     FROM sqlit
31730 65 5f 6d 61 73 74 65 72 20 55 4e 49 4f 4e 20 41  e_master UNION A
31740 4c 4c 22 0a 20 20 20 20 20 20 20 22 20 20 20 53  LL".       "   S
31750 45 4c 45 43 54 20 73 71 6c 2c 20 74 79 70 65 2c  ELECT sql, type,
31760 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c   tbl_name, name,
31770 20 72 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c 69   rowid FROM sqli
31780 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29 20  te_temp_master) 
31790 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20  ".       "WHERE 
317a0 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e 44  type!='meta' AND
317b0 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20 41 4e 44   sql NOTNULL AND
317c0 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27   name NOT LIKE '
317d0 73 71 6c 69 74 65 5f 25 27 20 22 0a 20 20 20 20  sqlite_%' ".    
317e0 20 20 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77     "ORDER BY row
317f0 69 64 22 2c 0a 20 20 20 20 20 20 20 63 61 6c 6c  id",.       call
31800 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45  back, &data, &zE
31810 72 72 4d 73 67 0a 20 20 20 20 29 3b 0a 20 20 20  rrMsg.    );.   
31820 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31830 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
31840 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
31850 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
31860 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
31870 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
31880 20 20 20 20 20 22 53 45 4c 45 43 54 20 72 6f 77       "SELECT row
31890 69 64 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  id FROM sqlite_m
318a0 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20  aster".         
318b0 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6e 61        " WHERE na
318c0 6d 65 20 47 4c 4f 42 20 27 73 71 6c 69 74 65 5f  me GLOB 'sqlite_
318d0 73 74 61 74 5b 31 33 34 5d 27 22 2c 0a 20 20 20  stat[134]'",.   
318e0 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
318f0 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
31900 20 20 64 6f 53 74 61 74 73 20 3d 20 73 71 6c 69    doStats = sqli
31910 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
31920 3d 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20  =SQLITE_ROW;.   
31930 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
31940 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
31950 7d 0a 20 20 20 20 69 66 28 20 64 6f 53 74 61 74  }.    if( doStat
31960 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61  s==0 ){.      ra
31970 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
31980 20 22 2f 2a 20 4e 6f 20 53 54 41 54 20 74 61 62   "/* No STAT tab
31990 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  les available */
319a0 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  \n");.    }else{
319b0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
319c0 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59  f(p->out, "ANALY
319d0 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ZE sqlite_master
319e0 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c  ;\n");.      sql
319f0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
31a00 20 22 53 45 4c 45 43 54 20 27 41 4e 41 4c 59 5a   "SELECT 'ANALYZ
31a10 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 27  E sqlite_master'
31a20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
31a30 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20        callback, 
31a40 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29  &data, &zErrMsg)
31a50 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 63 4d 6f  ;.      data.cMo
31a60 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d  de = data.mode =
31a70 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20   MODE_Insert;.  
31a80 20 20 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61      data.zDestTa
31a90 62 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74  ble = "sqlite_st
31aa0 61 74 31 22 3b 0a 20 20 20 20 20 20 73 68 65 6c  at1";.      shel
31ab0 6c 5f 65 78 65 63 28 26 64 61 74 61 2c 20 22 53  l_exec(&data, "S
31ac0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
31ad0 69 74 65 5f 73 74 61 74 31 22 2c 20 26 7a 45 72  ite_stat1", &zEr
31ae0 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74  rMsg);.      dat
31af0 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22  a.zDestTable = "
31b00 73 71 6c 69 74 65 5f 73 74 61 74 33 22 3b 0a 20  sqlite_stat3";. 
31b10 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28       shell_exec(
31b20 26 64 61 74 61 2c 20 22 53 45 4c 45 43 54 20 2a  &data, "SELECT *
31b30 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61   FROM sqlite_sta
31b40 74 33 22 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  t3", &zErrMsg);.
31b50 20 20 20 20 20 20 64 61 74 61 2e 7a 44 65 73 74        data.zDest
31b60 54 61 62 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f  Table = "sqlite_
31b70 73 74 61 74 34 22 3b 0a 20 20 20 20 20 20 73 68  stat4";.      sh
31b80 65 6c 6c 5f 65 78 65 63 28 26 64 61 74 61 2c 20  ell_exec(&data, 
31b90 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  "SELECT * FROM s
31ba0 71 6c 69 74 65 5f 73 74 61 74 34 22 2c 20 26 7a  qlite_stat4", &z
31bb0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72  ErrMsg);.      r
31bc0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
31bd0 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74  , "ANALYZE sqlit
31be0 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20  e_master;\n");. 
31bf0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
31c00 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74  if( c=='h' && st
31c10 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
31c20 22 68 65 61 64 65 72 73 22 2c 20 6e 29 3d 3d 30  "headers", n)==0
31c30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
31c40 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==2 ){.      p->
31c50 73 68 6f 77 48 65 61 64 65 72 20 3d 20 62 6f 6f  showHeader = boo
31c60 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
31c70 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
31c80 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
31c90 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
31ca0 20 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66   .headers on|off
31cb0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
31cc0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
31cd0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20  e..  if( c=='h' 
31ce0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
31cf0 5b 30 5d 2c 20 22 68 65 6c 70 22 2c 20 6e 29 3d  [0], "help", n)=
31d00 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
31d10 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 6e  rg>=2 ){.      n
31d20 20 3d 20 73 68 6f 77 48 65 6c 70 28 70 2d 3e 6f   = showHelp(p->o
31d30 75 74 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  ut, azArg[1]);. 
31d40 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
31d50 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
31d60 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 4e 6f  intf(p->out, "No
31d70 74 68 69 6e 67 20 6d 61 74 63 68 65 73 20 27 25  thing matches '%
31d80 73 27 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29  s'\n", azArg[1])
31d90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
31da0 6c 73 65 7b 0a 20 20 20 20 20 20 73 68 6f 77 48  lse{.      showH
31db0 65 6c 70 28 70 2d 3e 6f 75 74 2c 20 30 29 3b 0a  elp(p->out, 0);.
31dc0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
31dd0 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73   if( c=='i' && s
31de0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
31df0 20 22 69 6d 70 6f 72 74 22 2c 20 6e 29 3d 3d 30   "import", n)==0
31e00 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54   ){.    char *zT
31e10 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
31e20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
31e30 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62  ta into this tab
31e40 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
31e50 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  zFile;          
31e60 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
31e70 20 66 69 6c 65 20 74 6f 20 65 78 74 72 61 20 63   file to extra c
31e80 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20  ontent from */. 
31e90 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
31ea0 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 2f  *pStmt = NULL; /
31eb0 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  * A statement */
31ec0 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
31ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ee0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
31ef0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
31f00 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  le */.    int nB
31f10 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
31f20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
31f30 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53  of bytes in an S
31f40 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20  QL string */.   
31f50 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
31f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31f70 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
31f80 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 43 6f 6d  .    int needCom
31f90 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
31fa0 20 2f 2a 20 54 72 75 65 20 74 6f 20 43 4f 4d 4d   /* True to COMM
31fb0 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 61  IT or ROLLBACK a
31fc0 74 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74  t end */.    int
31fd0 20 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20 20   nSep;          
31fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
31ff0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 70  er of bytes in p
32000 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 5d  ->colSeparator[]
32010 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
32020 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
32030 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74      /* An SQL st
32040 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 49  atement */.    I
32050 6d 70 6f 72 74 43 74 78 20 73 43 74 78 3b 20 20  mportCtx sCtx;  
32060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
32070 61 64 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ader context */.
32080 20 20 20 20 63 68 61 72 20 2a 28 53 51 4c 49 54      char *(SQLIT
32090 45 5f 43 44 45 43 4c 20 2a 78 52 65 61 64 29 28  E_CDECL *xRead)(
320a0 49 6d 70 6f 72 74 43 74 78 2a 29 3b 20 2f 2a 20  ImportCtx*); /* 
320b0 46 75 6e 63 20 74 6f 20 72 65 61 64 20 6f 6e 65  Func to read one
320c0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e   value */.    in
320d0 74 20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20  t (SQLITE_CDECL 
320e0 2a 78 43 6c 6f 73 65 72 29 28 46 49 4c 45 2a 29  *xCloser)(FILE*)
320f0 3b 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 20 74  ;      /* Func t
32100 6f 20 63 6c 6f 73 65 20 66 69 6c 65 20 2a 2f 0a  o close file */.
32110 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33  .    if( nArg!=3
32120 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
32130 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
32140 61 67 65 3a 20 2e 69 6d 70 6f 72 74 20 46 49 4c  age: .import FIL
32150 45 20 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20  E TABLE\n");.   
32160 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
32170 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
32180 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41  .    zFile = azA
32190 72 67 5b 31 5d 3b 0a 20 20 20 20 7a 54 61 62 6c  rg[1];.    zTabl
321a0 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20  e = azArg[2];.  
321b0 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20    seenInterrupt 
321c0 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  = 0;.    memset(
321d0 26 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66  &sCtx, 0, sizeof
321e0 28 73 43 74 78 29 29 3b 0a 20 20 20 20 6f 70 65  (sCtx));.    ope
321f0 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
32200 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSep = strlen30(
32210 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
32220 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d  ;.    if( nSep==
32230 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
32240 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20  rintf(stderr,.  
32250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
32260 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20  Error: non-null 
32270 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
32280 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d   required for im
32290 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20  port\n");.      
322a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
322b0 20 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20 29      if( nSep>1 )
322c0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
322d0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
322e0 72 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61 63 74  r: multi-charact
322f0 65 72 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61  er column separa
32300 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  tors not allowed
32310 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
32320 20 20 20 20 20 20 20 20 22 20 66 6f 72 20 69 6d          " for im
32330 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20  port\n");.      
32340 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
32350 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65      nSep = strle
32360 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  n30(p->rowSepara
32370 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  tor);.    if( nS
32380 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ep==0 ){.      r
32390 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
323a0 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75  , "Error: non-nu
323b0 6c 6c 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  ll row separator
323c0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d   required for im
323d0 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20  port\n");.      
323e0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
323f0 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 32 20      if( nSep==2 
32400 26 26 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45  && p->mode==MODE
32410 5f 43 73 76 20 26 26 20 73 74 72 63 6d 70 28 70  _Csv && strcmp(p
32420 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
32430 53 45 50 5f 43 72 4c 66 29 3d 3d 30 20 29 7b 0a  SEP_CrLf)==0 ){.
32440 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 69 6d        /* When im
32450 70 6f 72 74 69 6e 67 20 43 53 56 20 28 6f 6e 6c  porting CSV (onl
32460 79 29 2c 20 69 66 20 74 68 65 20 72 6f 77 20 73  y), if the row s
32470 65 70 61 72 61 74 6f 72 20 69 73 20 73 65 74 20  eparator is set 
32480 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
32490 64 65 66 61 75 6c 74 20 6f 75 74 70 75 74 20 72  default output r
324a0 6f 77 20 73 65 70 61 72 61 74 6f 72 2c 20 63 68  ow separator, ch
324b0 61 6e 67 65 20 69 74 20 74 6f 20 74 68 65 20 64  ange it to the d
324c0 65 66 61 75 6c 74 20 69 6e 70 75 74 0a 20 20 20  efault input.   
324d0 20 20 20 2a 2a 20 72 6f 77 20 73 65 70 61 72 61     ** row separa
324e0 74 6f 72 2e 20 20 54 68 69 73 20 61 76 6f 69 64  tor.  This avoid
324f0 73 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 69 6e  s having to main
32500 74 61 69 6e 20 64 69 66 66 65 72 65 6e 74 20 69  tain different i
32510 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a 20 61 6e  nput.      ** an
32520 64 20 6f 75 74 70 75 74 20 72 6f 77 20 73 65 70  d output row sep
32530 61 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 20 20  arators. */.    
32540 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
32550 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77  tf(sizeof(p->row
32560 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72  Separator), p->r
32570 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  owSeparator, SEP
32580 5f 52 6f 77 29 3b 0a 20 20 20 20 20 20 6e 53 65  _Row);.      nSe
32590 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e  p = strlen30(p->
325a0 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  rowSeparator);. 
325b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 65     }.    if( nSe
325c0 70 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77  p>1 ){.      raw
325d0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
325e0 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63 68  "Error: multi-ch
325f0 61 72 61 63 74 65 72 20 72 6f 77 20 73 65 70 61  aracter row sepa
32600 72 61 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77  rators not allow
32610 65 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed".            
32620 20 20 20 20 20 20 20 20 20 20 22 20 66 6f 72 20            " for 
32630 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20  import\n");.    
32640 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
32650 7d 0a 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65  }.    sCtx.zFile
32660 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 20 20 73 43   = zFile;.    sC
32670 74 78 2e 6e 4c 69 6e 65 20 3d 20 31 3b 0a 20 20  tx.nLine = 1;.  
32680 20 20 69 66 28 20 73 43 74 78 2e 7a 46 69 6c 65    if( sCtx.zFile
32690 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 64  [0]=='|' ){.#ifd
326a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
326b0 4f 50 45 4e 0a 20 20 20 20 20 20 72 61 77 5f 70  OPEN.      raw_p
326c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
326d0 72 72 6f 72 3a 20 70 69 70 65 73 20 61 72 65 20  rror: pipes are 
326e0 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e  not supported in
326f0 20 74 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20 20   this OS\n");.  
32700 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65      return 1;.#e
32710 6c 73 65 0a 20 20 20 20 20 20 73 43 74 78 2e 69  lse.      sCtx.i
32720 6e 20 3d 20 70 6f 70 65 6e 28 73 43 74 78 2e 7a  n = popen(sCtx.z
32730 46 69 6c 65 2b 31 2c 20 22 72 22 29 3b 0a 20 20  File+1, "r");.  
32740 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 20 3d      sCtx.zFile =
32750 20 22 3c 70 69 70 65 3e 22 3b 0a 20 20 20 20 20   "<pipe>";.     
32760 20 78 43 6c 6f 73 65 72 20 3d 20 70 63 6c 6f 73   xCloser = pclos
32770 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  e;.#endif.    }e
32780 6c 73 65 7b 0a 20 20 20 20 20 20 73 43 74 78 2e  lse{.      sCtx.
32790 69 6e 20 3d 20 66 6f 70 65 6e 28 73 43 74 78 2e  in = fopen(sCtx.
327a0 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20  zFile, "rb");.  
327b0 20 20 20 20 78 43 6c 6f 73 65 72 20 3d 20 66 63      xCloser = fc
327c0 6c 6f 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lose;.    }.    
327d0 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44  if( p->mode==MOD
327e0 45 5f 41 73 63 69 69 20 29 7b 0a 20 20 20 20 20  E_Ascii ){.     
327f0 20 78 52 65 61 64 20 3d 20 61 73 63 69 69 5f 72   xRead = ascii_r
32800 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20  ead_one_field;. 
32810 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32820 78 52 65 61 64 20 3d 20 63 73 76 5f 72 65 61 64  xRead = csv_read
32830 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20 20  _one_field;.    
32840 7d 0a 20 20 20 20 69 66 28 20 73 43 74 78 2e 69  }.    if( sCtx.i
32850 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74  n==0 ){.      ut
32860 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
32870 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  , "Error: cannot
32880 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c   open \"%s\"\n",
32890 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72   zFile);.      r
328a0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
328b0 20 20 20 73 43 74 78 2e 63 43 6f 6c 53 65 70 20     sCtx.cColSep 
328c0 3d 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  = p->colSeparato
328d0 72 5b 30 5d 3b 0a 20 20 20 20 73 43 74 78 2e 63  r[0];.    sCtx.c
328e0 52 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77 53  RowSep = p->rowS
328f0 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20 20  eparator[0];.   
32900 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
32910 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
32920 2a 20 46 52 4f 4d 20 25 73 22 2c 20 7a 54 61 62  * FROM %s", zTab
32930 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71  le);.    if( zSq
32940 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 78 43  l==0 ){.      xC
32950 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a  loser(sCtx.in);.
32960 20 20 20 20 20 20 73 68 65 6c 6c 5f 6f 75 74 5f        shell_out_
32970 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20  of_memory();.   
32980 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73   }.    nByte = s
32990 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20  trlen30(zSql);. 
329a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
329b0 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
329c0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
329d0 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 6d 70 6f  mt, 0);.    impo
329e0 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 26  rt_append_char(&
329f0 73 43 74 78 2c 20 30 29 3b 20 20 20 20 2f 2a 20  sCtx, 0);    /* 
32a00 54 6f 20 65 6e 73 75 72 65 20 73 43 74 78 2e 7a  To ensure sCtx.z
32a10 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f   is allocated */
32a20 0a 20 20 20 20 69 66 28 20 72 63 20 26 26 20 73  .    if( rc && s
32a30 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22  qlite3_strglob("
32a40 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 2a  no such table: *
32a50 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
32a60 67 28 70 2d 3e 64 62 29 29 3d 3d 30 20 29 7b 0a  g(p->db))==0 ){.
32a70 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 72 65        char *zCre
32a80 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ate = sqlite3_mp
32a90 72 69 6e 74 66 28 22 43 52 45 41 54 45 20 54 41  rintf("CREATE TA
32aa0 42 4c 45 20 25 73 22 2c 20 7a 54 61 62 6c 65 29  BLE %s", zTable)
32ab0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 53 65  ;.      char cSe
32ac0 70 20 3d 20 27 28 27 3b 0a 20 20 20 20 20 20 77  p = '(';.      w
32ad0 68 69 6c 65 28 20 78 52 65 61 64 28 26 73 43 74  hile( xRead(&sCt
32ae0 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  x) ){.        zC
32af0 72 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  reate = sqlite3_
32b00 6d 70 72 69 6e 74 66 28 22 25 7a 25 63 5c 6e 20  mprintf("%z%c\n 
32b10 20 5c 22 25 77 5c 22 20 54 45 58 54 22 2c 20 7a   \"%w\" TEXT", z
32b20 43 72 65 61 74 65 2c 20 63 53 65 70 2c 20 73 43  Create, cSep, sC
32b30 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 63  tx.z);.        c
32b40 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  Sep = ',';.     
32b50 20 20 20 69 66 28 20 73 43 74 78 2e 63 54 65 72     if( sCtx.cTer
32b60 6d 21 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20  m!=sCtx.cColSep 
32b70 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
32b80 0a 20 20 20 20 20 20 69 66 28 20 63 53 65 70 3d  .      if( cSep=
32b90 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='(' ){.        
32ba0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 72  sqlite3_free(zCr
32bb0 65 61 74 65 29 3b 0a 20 20 20 20 20 20 20 20 73  eate);.        s
32bc0 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43 74 78  qlite3_free(sCtx
32bd0 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 78 43 6c  .z);.        xCl
32be0 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20  oser(sCtx.in);. 
32bf0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
32c00 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 65  tf(stderr,"%s: e
32c10 6d 70 74 79 20 66 69 6c 65 5c 6e 22 2c 20 73 43  mpty file\n", sC
32c20 74 78 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20  tx.zFile);.     
32c30 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
32c40 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 72 65 61     }.      zCrea
32c50 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  te = sqlite3_mpr
32c60 69 6e 74 66 28 22 25 7a 5c 6e 29 22 2c 20 7a 43  intf("%z\n)", zC
32c70 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20 72 63  reate);.      rc
32c80 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
32c90 70 2d 3e 64 62 2c 20 7a 43 72 65 61 74 65 2c 20  p->db, zCreate, 
32ca0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
32cb0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 72  sqlite3_free(zCr
32cc0 65 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  eate);.      if(
32cd0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75   rc ){.        u
32ce0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
32cf0 72 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  r, "CREATE TABLE
32d00 20 25 73 28 2e 2e 2e 29 20 66 61 69 6c 65 64 3a   %s(...) failed:
32d10 20 25 73 5c 6e 22 2c 20 7a 54 61 62 6c 65 2c 0a   %s\n", zTable,.
32d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d30 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
32d40 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  ->db));.        
32d50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43 74  sqlite3_free(sCt
32d60 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 78 43  x.z);.        xC
32d70 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a  loser(sCtx.in);.
32d80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
32d90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32da0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
32db0 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
32dc0 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
32dd0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
32de0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
32df0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
32e00 0a 20 20 20 20 20 20 69 66 20 28 70 53 74 6d 74  .      if (pStmt
32e10 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  ) sqlite3_finali
32e20 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
32e30 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
32e40 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e  err,"Error: %s\n
32e50 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
32e60 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
32e70 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e   xCloser(sCtx.in
32e80 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
32e90 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  1;.    }.    nCo
32ea0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
32eb0 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  mn_count(pStmt);
32ec0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
32ed0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
32ee0 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    pStmt = 0;.   
32ef0 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 72   if( nCol==0 ) r
32f00 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 63  eturn 0; /* no c
32f10 6f 6c 75 6d 6e 73 2c 20 6e 6f 20 65 72 72 6f 72  olumns, no error
32f20 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73   */.    zSql = s
32f30 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
32f40 20 6e 42 79 74 65 2a 32 20 2b 20 32 30 20 2b 20   nByte*2 + 20 + 
32f50 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66  nCol*2 );.    if
32f60 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
32f70 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e     xCloser(sCtx.
32f80 69 6e 29 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c  in);.      shell
32f90 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29  _out_of_memory()
32fa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
32fb0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79  te3_snprintf(nBy
32fc0 74 65 2b 32 30 2c 20 7a 53 71 6c 2c 20 22 49 4e  te+20, zSql, "IN
32fd0 53 45 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c 22  SERT INTO \"%w\"
32fe0 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62   VALUES(?", zTab
32ff0 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72  le);.    j = str
33000 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20  len30(zSql);.   
33010 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c   for(i=1; i<nCol
33020 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53  ; i++){.      zS
33030 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20  ql[j++] = ',';. 
33040 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d       zSql[j++] =
33050 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20   '?';.    }.    
33060 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b  zSql[j++] = ')';
33070 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30  .    zSql[j] = 0
33080 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
33090 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
330a0 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
330b0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73  pStmt, 0);.    s
330c0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
330d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
330e0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
330f0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
33100 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
33110 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
33120 3b 0a 20 20 20 20 20 20 69 66 20 28 70 53 74 6d  ;.      if (pStm
33130 74 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  t) sqlite3_final
33140 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
33150 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69    xCloser(sCtx.i
33160 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
33170 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65   1;.    }.    ne
33180 65 64 43 6f 6d 6d 69 74 20 3d 20 73 71 6c 69 74  edCommit = sqlit
33190 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
331a0 74 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66  t(p->db);.    if
331b0 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20 73  ( needCommit ) s
331c0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
331d0 62 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30  b, "BEGIN", 0, 0
331e0 2c 20 30 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  , 0);.    do{.  
331f0 20 20 20 20 69 6e 74 20 73 74 61 72 74 4c 69 6e      int startLin
33200 65 20 3d 20 73 43 74 78 2e 6e 4c 69 6e 65 3b 0a  e = sCtx.nLine;.
33210 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
33220 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
33230 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 78       char *z = x
33240 52 65 61 64 28 26 73 43 74 78 29 3b 0a 20 20 20  Read(&sCtx);.   
33250 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20       /*.        
33260 2a 2a 20 44 69 64 20 77 65 20 72 65 61 63 68 20  ** Did we reach 
33270 65 6e 64 2d 6f 66 2d 66 69 6c 65 20 62 65 66 6f  end-of-file befo
33280 72 65 20 66 69 6e 64 69 6e 67 20 61 6e 79 20 63  re finding any c
33290 6f 6c 75 6d 6e 73 3f 0a 20 20 20 20 20 20 20 20  olumns?.        
332a0 2a 2a 20 49 66 20 73 6f 2c 20 73 74 6f 70 20 69  ** If so, stop i
332b0 6e 73 74 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66  nstead of NULL f
332c0 69 6c 6c 69 6e 67 20 74 68 65 20 72 65 6d 61 69  illing the remai
332d0 6e 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  ning columns..  
332e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
332f0 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 69 3d 3d   if( z==0 && i==
33300 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
33310 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a     /*.        **
33320 20 44 69 64 20 77 65 20 72 65 61 63 68 20 65 6e   Did we reach en
33330 64 2d 6f 66 2d 66 69 6c 65 20 4f 52 20 65 6e 64  d-of-file OR end
33340 2d 6f 66 2d 6c 69 6e 65 20 62 65 66 6f 72 65 20  -of-line before 
33350 66 69 6e 64 69 6e 67 20 61 6e 79 0a 20 20 20 20  finding any.    
33360 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69      ** columns i
33370 6e 20 41 53 43 49 49 20 6d 6f 64 65 3f 20 20 49  n ASCII mode?  I
33380 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65  f so, stop inste
33390 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69  ad of NULL filli
333a0 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ng.        ** th
333b0 65 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c 75  e remaining colu
333c0 6d 6e 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  mns..        */.
333d0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d          if( p->m
333e0 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20  ode==MODE_Ascii 
333f0 26 26 20 28 7a 3d 3d 30 20 7c 7c 20 7a 5b 30 5d  && (z==0 || z[0]
33400 3d 3d 30 29 20 26 26 20 69 3d 3d 30 20 29 20 62  ==0) && i==0 ) b
33410 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71  reak;.        sq
33420 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
33430 70 53 74 6d 74 2c 20 69 2b 31 2c 20 7a 2c 20 2d  pStmt, i+1, z, -
33440 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
33450 45 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ENT);.        if
33460 28 20 69 3c 6e 43 6f 6c 2d 31 20 26 26 20 73 43  ( i<nCol-1 && sC
33470 74 78 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e 63  tx.cTerm!=sCtx.c
33480 43 6f 6c 53 65 70 20 29 7b 0a 20 20 20 20 20 20  ColSep ){.      
33490 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
334a0 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20  stderr, "%s:%d: 
334b0 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75  expected %d colu
334c0 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64 20 25 64  mns but found %d
334d0 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20 20   - ".           
334e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
334f0 66 69 6c 6c 69 6e 67 20 74 68 65 20 72 65 73 74  filling the rest
33500 20 77 69 74 68 20 4e 55 4c 4c 5c 6e 22 2c 0a 20   with NULL\n",. 
33510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33520 20 20 20 20 20 20 20 20 20 73 43 74 78 2e 7a 46           sCtx.zF
33530 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20  ile, startLine, 
33540 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20  nCol, i+1);.    
33550 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20        i += 2;.  
33560 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69          while( i
33570 3c 3d 6e 43 6f 6c 20 29 7b 20 73 71 6c 69 74 65  <=nCol ){ sqlite
33580 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d  3_bind_null(pStm
33590 74 2c 20 69 29 3b 20 69 2b 2b 3b 20 7d 0a 20 20  t, i); i++; }.  
335a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
335b0 20 20 20 20 20 20 69 66 28 20 73 43 74 78 2e 63        if( sCtx.c
335c0 54 65 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53  Term==sCtx.cColS
335d0 65 70 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  ep ){.        do
335e0 7b 0a 20 20 20 20 20 20 20 20 20 20 78 52 65 61  {.          xRea
335f0 64 28 26 73 43 74 78 29 3b 0a 20 20 20 20 20 20  d(&sCtx);.      
33600 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
33610 20 7d 77 68 69 6c 65 28 20 73 43 74 78 2e 63 54   }while( sCtx.cT
33620 65 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65  erm==sCtx.cColSe
33630 70 20 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66  p );.        utf
33640 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
33650 20 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65   "%s:%d: expecte
33660 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74  d %d columns but
33670 20 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20   found %d - ".  
33680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33690 20 20 20 20 20 20 22 65 78 74 72 61 73 20 69 67        "extras ig
336a0 6e 6f 72 65 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nored\n",.      
336b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
336c0 20 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74    sCtx.zFile, st
336d0 61 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69  artLine, nCol, i
336e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
336f0 20 69 66 28 20 69 3e 3d 6e 43 6f 6c 20 29 7b 0a   if( i>=nCol ){.
33700 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
33710 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
33720 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
33730 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
33740 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
33750 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33760 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
33770 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25  tf(stderr, "%s:%
33780 64 3a 20 49 4e 53 45 52 54 20 66 61 69 6c 65 64  d: INSERT failed
33790 3a 20 25 73 5c 6e 22 2c 20 73 43 74 78 2e 7a 46  : %s\n", sCtx.zF
337a0 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ile,.           
337b0 20 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74             start
337c0 4c 69 6e 65 2c 20 73 71 6c 69 74 65 33 5f 65 72  Line, sqlite3_er
337d0 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
337e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
337f0 20 20 20 20 7d 77 68 69 6c 65 28 20 73 43 74 78      }while( sCtx
33800 2e 63 54 65 72 6d 21 3d 45 4f 46 20 29 3b 0a 0a  .cTerm!=EOF );..
33810 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78      xCloser(sCtx
33820 2e 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  .in);.    sqlite
33830 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a  3_free(sCtx.z);.
33840 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
33850 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
33860 20 69 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20   if( needCommit 
33870 29 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  ) sqlite3_exec(p
33880 2d 3e 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  ->db, "COMMIT", 
33890 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  0, 0, 0);.  }els
338a0 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e..#ifndef SQLIT
338b0 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20 20 69  E_UNTESTABLE.  i
338c0 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72  f( c=='i' && str
338d0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
338e0 69 6d 70 6f 73 74 65 72 22 2c 20 6e 29 3d 3d 30  imposter", n)==0
338f0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   ){.    char *zS
33900 71 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43  ql;.    char *zC
33910 6f 6c 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  ollist = 0;.    
33920 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
33930 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 74 6e 75  tmt;.    int tnu
33940 6d 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  m = 0;.    int i
33950 3b 0a 20 20 20 20 69 66 28 20 21 28 6e 41 72 67  ;.    if( !(nArg
33960 3d 3d 33 20 7c 7c 20 28 6e 41 72 67 3d 3d 32 20  ==3 || (nArg==2 
33970 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  && sqlite3_stric
33980 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6f 66 66  mp(azArg[1],"off
33990 22 29 3d 3d 30 29 29 20 29 7b 0a 20 20 20 20 20  ")==0)) ){.     
339a0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
339b0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d  err, "Usage: .im
339c0 70 6f 73 74 65 72 20 49 4e 44 45 58 20 49 4d 50  poster INDEX IMP
339d0 4f 53 54 45 52 5c 6e 22 0a 20 20 20 20 20 20 20  OSTER\n".       
339e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
339f0 20 20 20 22 20 20 20 20 20 20 20 2e 69 6d 70 6f     "       .impo
33a00 73 74 65 72 20 6f 66 66 5c 6e 22 29 3b 0a 20 20  ster off\n");.  
33a10 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
33a20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
33a30 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
33a40 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
33a50 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  );.    if( nArg=
33a60 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =2 ){.      sqli
33a70 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
33a80 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
33a90 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62  _IMPOSTER, p->db
33aa0 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29 3b  , "main", 0, 1);
33ab0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
33ac0 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
33ad0 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20     }.    zSql = 
33ae0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
33af0 22 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65  "SELECT rootpage
33b00 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
33b10 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20  ter".           
33b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b30 22 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 25 71  " WHERE name='%q
33b40 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65  ' AND type='inde
33b50 78 27 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  x'", azArg[1]);.
33b60 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70      sqlite3_prep
33b70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
33b80 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
33b90 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
33ba0 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
33bb0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  if( sqlite3_step
33bc0 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
33bd0 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 74 6e 75  ROW ){.      tnu
33be0 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  m = sqlite3_colu
33bf0 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
33c00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
33c10 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
33c20 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 74 6e 75  mt);.    if( tnu
33c30 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74  m==0 ){.      ut
33c40 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
33c50 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
33c60 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41  : \"%s\"\n", azA
33c70 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63  rg[1]);.      rc
33c80 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
33c90 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
33ca0 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53  it;.    }.    zS
33cb0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
33cc0 69 6e 74 66 28 22 50 52 41 47 4d 41 20 69 6e 64  intf("PRAGMA ind
33cd0 65 78 5f 78 69 6e 66 6f 3d 27 25 71 27 22 2c 20  ex_xinfo='%q'", 
33ce0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 72  azArg[1]);.    r
33cf0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
33d00 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
33d10 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
33d20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
33d30 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
33d40 69 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  i = 0;.    while
33d50 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
33d60 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
33d70 57 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  W ){.      char 
33d80 7a 4c 61 62 65 6c 5b 32 30 5d 3b 0a 20 20 20 20  zLabel[20];.    
33d90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
33da0 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ol = (const char
33db0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
33dc0 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29 3b 0a  _text(pStmt,2);.
33dd0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
33de0 20 69 66 28 20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a   if( zCol==0 ){.
33df0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
33e00 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
33e10 53 74 6d 74 2c 31 29 3d 3d 2d 31 20 29 7b 0a 20  Stmt,1)==-1 ){. 
33e20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20           zCol = 
33e30 22 5f 52 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20  "_ROWID_";.     
33e40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33e50 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
33e60 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 61 62  intf(sizeof(zLab
33e70 65 6c 29 2c 7a 4c 61 62 65 6c 2c 22 65 78 70 72  el),zLabel,"expr
33e80 25 64 22 2c 69 29 3b 0a 20 20 20 20 20 20 20 20  %d",i);.        
33e90 20 20 7a 43 6f 6c 20 3d 20 7a 4c 61 62 65 6c 3b    zCol = zLabel;
33ea0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33eb0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f   }.      if( zCo
33ec0 6c 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  llist==0 ){.    
33ed0 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73      zCollist = s
33ee0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
33ef0 5c 22 25 77 5c 22 22 2c 20 7a 43 6f 6c 29 3b 0a  \"%w\"", zCol);.
33f00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33f10 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20       zCollist = 
33f20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
33f30 22 25 7a 2c 5c 22 25 77 5c 22 22 2c 20 7a 43 6f  "%z,\"%w\"", zCo
33f40 6c 6c 69 73 74 2c 20 7a 43 6f 6c 29 3b 0a 20 20  llist, zCol);.  
33f50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
33f60 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
33f70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71  (pStmt);.    zSq
33f80 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
33f90 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
33fa0 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22 25  CREATE TABLE \"%
33fb0 77 5c 22 28 25 73 2c 50 52 49 4d 41 52 59 20 4b  w\"(%s,PRIMARY K
33fc0 45 59 28 25 73 29 29 57 49 54 48 4f 55 54 20 52  EY(%s))WITHOUT R
33fd0 4f 57 49 44 22 2c 0a 20 20 20 20 20 20 20 20 20  OWID",.         
33fe0 20 61 7a 41 72 67 5b 32 5d 2c 20 7a 43 6f 6c 6c   azArg[2], zColl
33ff0 69 73 74 2c 20 7a 43 6f 6c 6c 69 73 74 29 3b 0a  ist, zCollist);.
34000 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
34010 28 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20  (zCollist);.    
34020 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73  rc = sqlite3_tes
34030 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
34040 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
34050 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e  ER, p->db, "main
34060 22 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20  ", 1, tnum);.   
34070 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34080 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
34090 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
340a0 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c  >db, zSql, 0, 0,
340b0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
340c0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
340d0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
340e0 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c  IMPOSTER, p->db,
340f0 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a   "main", 0, 0);.
34100 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
34110 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
34120 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
34130 6f 72 20 69 6e 20 5b 25 73 5d 3a 20 25 73 5c 6e  or in [%s]: %s\n
34140 22 2c 20 7a 53 71 6c 2c 20 73 71 6c 69 74 65 33  ", zSql, sqlite3
34150 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
34160 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
34170 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
34180 66 28 73 74 64 6f 75 74 2c 20 22 25 73 3b 5c 6e  f(stdout, "%s;\n
34190 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  ", zSql);.      
341a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
341b0 6f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  out,.           
341c0 22 57 41 52 4e 49 4e 47 3a 20 77 72 69 74 69 6e  "WARNING: writin
341d0 67 20 74 6f 20 61 6e 20 69 6d 70 6f 73 74 65 72  g to an imposter
341e0 20 74 61 62 6c 65 20 77 69 6c 6c 20 63 6f 72 72   table will corr
341f0 75 70 74 20 74 68 65 20 69 6e 64 65 78 21 5c 6e  upt the index!\n
34200 22 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ".        );.   
34210 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
34220 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
34230 28 73 74 64 65 72 72 2c 20 22 53 51 4c 49 54 45  (stderr, "SQLITE
34240 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
34250 45 52 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22  ER returns %d\n"
34260 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 63 20  , rc);.      rc 
34270 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  = 1;.    }.    s
34280 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
34290 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
342a0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
342b0 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 53 54 5f 43  LITE_OMIT_TEST_C
342c0 4f 4e 54 52 4f 4c 29 20 2a 2f 0a 0a 23 69 66 64  ONTROL) */..#ifd
342d0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
342e0 5f 49 4f 54 52 41 43 45 0a 20 20 69 66 28 20 63  _IOTRACE.  if( c
342f0 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70  =='i' && strncmp
34300 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6f 74 72  (azArg[0], "iotr
34310 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ace", n)==0 ){. 
34320 20 20 20 53 51 4c 49 54 45 5f 41 50 49 20 65 78     SQLITE_API ex
34330 74 65 72 6e 20 76 6f 69 64 20 28 53 51 4c 49 54  tern void (SQLIT
34340 45 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74 65 33  E_CDECL *sqlite3
34350 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20 63  IoTrace)(const c
34360 68 61 72 2a 2c 20 2e 2e 2e 29 3b 0a 20 20 20 20  har*, ...);.    
34370 69 66 28 20 69 6f 74 72 61 63 65 20 26 26 20 69  if( iotrace && i
34380 6f 74 72 61 63 65 21 3d 73 74 64 6f 75 74 20 29  otrace!=stdout )
34390 20 66 63 6c 6f 73 65 28 69 6f 74 72 61 63 65 29   fclose(iotrace)
343a0 3b 0a 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20  ;.    iotrace = 
343b0 30 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c  0;.    if( nArg<
343c0 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
343d0 65 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20  e3IoTrace = 0;. 
343e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
343f0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22 2d  cmp(azArg[1], "-
34400 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ")==0 ){.      s
34410 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20  qlite3IoTrace = 
34420 69 6f 74 72 61 63 65 50 72 69 6e 74 66 3b 0a 20  iotracePrintf;. 
34430 20 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20 73       iotrace = s
34440 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65  tdout;.    }else
34450 7b 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65 20  {.      iotrace 
34460 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d  = fopen(azArg[1]
34470 2c 20 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66  , "w");.      if
34480 28 20 69 6f 74 72 61 63 65 3d 3d 30 20 29 7b 0a  ( iotrace==0 ){.
34490 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
344a0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
344b0 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
344c0 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67  \"%s\"\n", azArg
344d0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [1]);.        sq
344e0 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 30  lite3IoTrace = 0
344f0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
34500 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
34510 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f         sqlite3Io
34520 54 72 61 63 65 20 3d 20 69 6f 74 72 61 63 65 50  Trace = iotraceP
34530 72 69 6e 74 66 3b 0a 20 20 20 20 20 20 7d 0a 20  rintf;.      }. 
34540 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e     }.  }else.#en
34550 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c  dif..  if( c=='l
34560 27 20 26 26 20 6e 3e 3d 35 20 26 26 20 73 74 72  ' && n>=5 && str
34570 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
34580 6c 69 6d 69 74 73 22 2c 20 6e 29 3d 3d 30 20 29  limits", n)==0 )
34590 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
345a0 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
345b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
345c0 4c 69 6d 69 74 4e 61 6d 65 3b 20 20 20 2f 2a 20  LimitName;   /* 
345d0 4e 61 6d 65 20 6f 66 20 61 20 6c 69 6d 69 74 20  Name of a limit 
345e0 2a 2f 0a 20 20 20 20 20 20 20 69 6e 74 20 6c 69  */.       int li
345f0 6d 69 74 43 6f 64 65 3b 20 20 20 20 20 20 20 20  mitCode;        
34600 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 63      /* Integer c
34610 6f 64 65 20 66 6f 72 20 74 68 61 74 20 6c 69 6d  ode for that lim
34620 69 74 20 2a 2f 0a 20 20 20 20 7d 20 61 4c 69 6d  it */.    } aLim
34630 69 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  it[] = {.      {
34640 20 22 6c 65 6e 67 74 68 22 2c 20 20 20 20 20 20   "length",      
34650 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
34660 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20  _LIMIT_LENGTH   
34670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34680 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 71 6c   },.      { "sql
34690 5f 6c 65 6e 67 74 68 22 2c 20 20 20 20 20 20 20  _length",       
346a0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
346b0 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20  T_SQL_LENGTH    
346c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
346d0 20 20 20 20 20 7b 20 22 63 6f 6c 75 6d 6e 22 2c       { "column",
346e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346f0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
34700 55 4d 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  UMN             
34710 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
34720 7b 20 22 65 78 70 72 5f 64 65 70 74 68 22 2c 20  { "expr_depth", 
34730 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
34740 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
34750 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TH              
34760 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 6f    },.      { "co
34770 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74 22 2c 20  mpound_select", 
34780 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
34790 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
347a0 43 54 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  CT           },.
347b0 20 20 20 20 20 20 7b 20 22 76 64 62 65 5f 6f 70        { "vdbe_op
347c0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
347d0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44   SQLITE_LIMIT_VD
347e0 42 45 5f 4f 50 20 20 20 20 20 20 20 20 20 20 20  BE_OP           
347f0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
34800 20 7b 20 22 66 75 6e 63 74 69 6f 6e 5f 61 72 67   { "function_arg
34810 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  ",          SQLI
34820 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f  TE_LIMIT_FUNCTIO
34830 4e 5f 41 52 47 20 20 20 20 20 20 20 20 20 20 20  N_ARG           
34840 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 61     },.      { "a
34850 74 74 61 63 68 65 64 22 2c 20 20 20 20 20 20 20  ttached",       
34860 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
34870 4d 49 54 5f 41 54 54 41 43 48 45 44 20 20 20 20  MIT_ATTACHED    
34880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
34890 0a 20 20 20 20 20 20 7b 20 22 6c 69 6b 65 5f 70  .      { "like_p
348a0 61 74 74 65 72 6e 5f 6c 65 6e 67 74 68 22 2c 20  attern_length", 
348b0 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c    SQLITE_LIMIT_L
348c0 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
348d0 54 48 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  TH       },.    
348e0 20 20 7b 20 22 76 61 72 69 61 62 6c 65 5f 6e 75    { "variable_nu
348f0 6d 62 65 72 22 2c 20 20 20 20 20 20 20 53 51 4c  mber",       SQL
34900 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
34910 4c 45 5f 4e 55 4d 42 45 52 20 20 20 20 20 20 20  LE_NUMBER       
34920 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
34930 74 72 69 67 67 65 72 5f 64 65 70 74 68 22 2c 20  trigger_depth", 
34940 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
34950 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
34960 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  TH             }
34970 2c 0a 20 20 20 20 20 20 7b 20 22 77 6f 72 6b 65  ,.      { "worke
34980 72 5f 74 68 72 65 61 64 73 22 2c 20 20 20 20 20  r_threads",     
34990 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
349a0 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 20  WORKER_THREADS  
349b0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
349c0 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e   };.    int i, n
349d0 32 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  2;.    open_db(p
349e0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41  , 0);.    if( nA
349f0 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 66  rg==1 ){.      f
34a00 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
34a10 69 7a 65 28 61 4c 69 6d 69 74 29 3b 20 69 2b 2b  ize(aLimit); i++
34a20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ){.        print
34a30 66 28 22 25 32 30 73 20 25 64 5c 6e 22 2c 20 61  f("%20s %d\n", a
34a40 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e  Limit[i].zLimitN
34a50 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
34a60 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69      sqlite3_limi
34a70 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b  t(p->db, aLimit[
34a80 69 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31  i].limitCode, -1
34a90 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
34aa0 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3e 33  }else if( nArg>3
34ab0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
34ac0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
34ad0 61 67 65 3a 20 2e 6c 69 6d 69 74 20 4e 41 4d 45  age: .limit NAME
34ae0 20 3f 4e 45 57 2d 56 41 4c 55 45 3f 5c 6e 22 29   ?NEW-VALUE?\n")
34af0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
34b00 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
34b10 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
34b20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
34b30 6e 74 20 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a  nt iLimit = -1;.
34b40 20 20 20 20 20 20 6e 32 20 3d 20 73 74 72 6c 65        n2 = strle
34b50 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  n30(azArg[1]);. 
34b60 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
34b70 41 72 72 61 79 53 69 7a 65 28 61 4c 69 6d 69 74  ArraySize(aLimit
34b80 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
34b90 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
34ba0 6e 69 63 6d 70 28 61 4c 69 6d 69 74 5b 69 5d 2e  nicmp(aLimit[i].
34bb0 7a 4c 69 6d 69 74 4e 61 6d 65 2c 20 61 7a 41 72  zLimitName, azAr
34bc0 67 5b 31 5d 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a  g[1], n2)==0 ){.
34bd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4c            if( iL
34be0 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  imit<0 ){.      
34bf0 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 69        iLimit = i
34c00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
34c10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  e{.            u
34c20 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
34c30 72 2c 20 22 61 6d 62 69 67 75 6f 75 73 20 6c 69  r, "ambiguous li
34c40 6d 69 74 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  mit: \"%s\"\n", 
34c50 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
34c60 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
34c70 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
34c80 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
34c90 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
34ca0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34cb0 0a 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d 69  .      if( iLimi
34cc0 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  t<0 ){.        u
34cd0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
34ce0 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69  r, "unknown limi
34cf0 74 3a 20 5c 22 25 73 5c 22 5c 6e 22 0a 20 20 20  t: \"%s\"\n".   
34d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d10 20 20 20 20 20 22 65 6e 74 65 72 20 5c 22 2e 6c       "enter \".l
34d20 69 6d 69 74 73 5c 22 20 77 69 74 68 20 6e 6f 20  imits\" with no 
34d30 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 61 20  arguments for a 
34d40 6c 69 73 74 2e 5c 6e 22 2c 0a 20 20 20 20 20 20  list.\n",.      
34d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d60 20 20 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20     azArg[1]);.  
34d70 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
34d80 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
34d90 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
34da0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
34db0 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20  nArg==3 ){.     
34dc0 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74     sqlite3_limit
34dd0 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69  (p->db, aLimit[i
34de0 4c 69 6d 69 74 5d 2e 6c 69 6d 69 74 43 6f 64 65  Limit].limitCode
34df0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
34e00 20 20 20 20 20 20 20 20 28 69 6e 74 29 69 6e 74          (int)int
34e10 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b  egerValue(azArg[
34e20 32 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  2]));.      }.  
34e30 20 20 20 20 70 72 69 6e 74 66 28 22 25 32 30 73      printf("%20s
34e40 20 25 64 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b 69   %d\n", aLimit[i
34e50 4c 69 6d 69 74 5d 2e 7a 4c 69 6d 69 74 4e 61 6d  Limit].zLimitNam
34e60 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
34e70 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d  sqlite3_limit(p-
34e80 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d  >db, aLimit[iLim
34e90 69 74 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d  it].limitCode, -
34ea0 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  1));.    }.  }el
34eb0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27  se..  if( c=='l'
34ec0 20 26 26 20 6e 3e 32 20 26 26 20 73 74 72 6e 63   && n>2 && strnc
34ed0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69  mp(azArg[0], "li
34ee0 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  nt", n)==0 ){.  
34ef0 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
34f00 0a 20 20 20 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d  .    lintDotComm
34f10 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41  and(p, azArg, nA
34f20 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69  rg);.  }else..#i
34f30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
34f40 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
34f50 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26  .  if( c=='l' &&
34f60 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
34f70 5d 2c 20 22 6c 6f 61 64 22 2c 20 6e 29 3d 3d 30  ], "load", n)==0
34f80 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
34f90 61 72 20 2a 7a 46 69 6c 65 2c 20 2a 7a 50 72 6f  ar *zFile, *zPro
34fa0 63 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  c;.    char *zEr
34fb0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66  rMsg = 0;.    if
34fc0 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20  ( nArg<2 ){.    
34fd0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
34fe0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f  err, "Usage: .lo
34ff0 61 64 20 46 49 4c 45 20 3f 45 4e 54 52 59 50 4f  ad FILE ?ENTRYPO
35000 49 4e 54 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20  INT?\n");.      
35010 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
35020 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
35030 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
35040 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d  zFile = azArg[1]
35050 3b 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 6e 41  ;.    zProc = nA
35060 72 67 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d  rg>=3 ? azArg[2]
35070 20 3a 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64   : 0;.    open_d
35080 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20  b(p, 0);.    rc 
35090 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65  = sqlite3_load_e
350a0 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20  xtension(p->db, 
350b0 7a 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a  zFile, zProc, &z
350c0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28  ErrMsg);.    if(
350d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
350e0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
350f0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
35100 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d  or: %s\n", zErrM
35110 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sg);.      sqlit
35120 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
35130 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
35140 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
35150 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27  ndif..  if( c=='
35160 6c 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  l' && strncmp(az
35170 41 72 67 5b 30 5d 2c 20 22 6c 6f 67 22 2c 20 6e  Arg[0], "log", n
35180 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
35190 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20  nArg!=2 ){.     
351a0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
351b0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f 67  rr, "Usage: .log
351c0 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20   FILENAME\n");. 
351d0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
351e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
351f0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20  nst char *zFile 
35200 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
35210 20 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c    output_file_cl
35220 6f 73 65 28 70 2d 3e 70 4c 6f 67 29 3b 0a 20 20  ose(p->pLog);.  
35230 20 20 20 20 70 2d 3e 70 4c 6f 67 20 3d 20 6f 75      p->pLog = ou
35240 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a  tput_file_open(z
35250 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  File, 0);.    }.
35260 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
35270 3d 3d 27 6d 27 20 26 26 20 73 74 72 6e 63 6d 70  =='m' && strncmp
35280 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f 64 65  (azArg[0], "mode
35290 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
352a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64  const char *zMod
352b0 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a  e = nArg>=2 ? az
352c0 41 72 67 5b 31 5d 20 3a 20 22 22 3b 0a 20 20 20  Arg[1] : "";.   
352d0 20 69 6e 74 20 6e 32 20 3d 20 73 74 72 6c 65 6e   int n2 = strlen
352e0 33 30 28 7a 4d 6f 64 65 29 3b 0a 20 20 20 20 69  30(zMode);.    i
352f0 6e 74 20 63 32 20 3d 20 7a 4d 6f 64 65 5b 30 5d  nt c2 = zMode[0]
35300 3b 0a 20 20 20 20 69 66 28 20 63 32 3d 3d 27 6c  ;.    if( c2=='l
35310 27 20 26 26 20 6e 32 3e 32 20 26 26 20 73 74 72  ' && n2>2 && str
35320 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c  ncmp(azArg[1],"l
35330 69 6e 65 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  ines",n2)==0 ){.
35340 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
35350 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20 20 20 20  MODE_Line;.     
35360 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
35370 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53  f(sizeof(p->rowS
35380 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f  eparator), p->ro
35390 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  wSeparator, SEP_
353a0 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Row);.    }else 
353b0 69 66 28 20 63 32 3d 3d 27 63 27 20 26 26 20 73  if( c2=='c' && s
353c0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
353d0 22 63 6f 6c 75 6d 6e 73 22 2c 6e 32 29 3d 3d 30  "columns",n2)==0
353e0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
353f0 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b  e = MODE_Column;
35400 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
35410 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
35420 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c  ->rowSeparator),
35430 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
35440 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20  , SEP_Row);.    
35450 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 6c  }else if( c2=='l
35460 27 20 26 26 20 6e 32 3e 32 20 26 26 20 73 74 72  ' && n2>2 && str
35470 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c  ncmp(azArg[1],"l
35480 69 73 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  ist",n2)==0 ){. 
35490 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
354a0 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20  ODE_List;.      
354b0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
354c0 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65  (sizeof(p->colSe
354d0 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c  parator), p->col
354e0 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43  Separator, SEP_C
354f0 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71  olumn);.      sq
35500 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
35510 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
35520 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65  rator), p->rowSe
35530 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77  parator, SEP_Row
35540 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
35550 20 63 32 3d 3d 27 68 27 20 26 26 20 73 74 72 6e   c2=='h' && strn
35560 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 68 74  cmp(azArg[1],"ht
35570 6d 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  ml",n2)==0 ){.  
35580 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
35590 44 45 5f 48 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c  DE_Html;.    }el
355a0 73 65 20 69 66 28 20 63 32 3d 3d 27 74 27 20 26  se if( c2=='t' &
355b0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
355c0 31 5d 2c 22 74 63 6c 22 2c 6e 32 29 3d 3d 30 20  1],"tcl",n2)==0 
355d0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
355e0 20 3d 20 4d 4f 44 45 5f 54 63 6c 3b 0a 20 20 20   = MODE_Tcl;.   
355f0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
35600 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f  ntf(sizeof(p->co
35610 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  lSeparator), p->
35620 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45  colSeparator, SE
35630 50 5f 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  P_Space);.      
35640 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
35650 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65  (sizeof(p->rowSe
35660 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77  parator), p->row
35670 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52  Separator, SEP_R
35680 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ow);.    }else i
35690 66 28 20 63 32 3d 3d 27 63 27 20 26 26 20 73 74  f( c2=='c' && st
356a0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
356b0 63 73 76 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  csv",n2)==0 ){. 
356c0 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
356d0 4f 44 45 5f 43 73 76 3b 0a 20 20 20 20 20 20 73  ODE_Csv;.      s
356e0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
356f0 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70  sizeof(p->colSep
35700 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53  arator), p->colS
35710 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f  eparator, SEP_Co
35720 6d 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  mma);.      sqli
35730 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
35740 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
35750 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61  tor), p->rowSepa
35760 72 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29  rator, SEP_CrLf)
35770 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
35780 63 32 3d 3d 27 74 27 20 26 26 20 73 74 72 6e 63  c2=='t' && strnc
35790 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 61 62  mp(azArg[1],"tab
357a0 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  s",n2)==0 ){.   
357b0 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
357c0 45 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71  E_List;.      sq
357d0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
357e0 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61  izeof(p->colSepa
357f0 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65  rator), p->colSe
35800 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 54 61 62  parator, SEP_Tab
35810 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
35820 20 63 32 3d 3d 27 69 27 20 26 26 20 73 74 72 6e   c2=='i' && strn
35830 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 69 6e  cmp(azArg[1],"in
35840 73 65 72 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  sert",n2)==0 ){.
35850 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
35860 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20  MODE_Insert;.   
35870 20 20 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d     set_table_nam
35880 65 28 70 2c 20 6e 41 72 67 3e 3d 33 20 3f 20 61  e(p, nArg>=3 ? a
35890 7a 41 72 67 5b 32 5d 20 3a 20 22 74 61 62 6c 65  zArg[2] : "table
358a0 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ");.    }else if
358b0 28 20 63 32 3d 3d 27 71 27 20 26 26 20 73 74 72  ( c2=='q' && str
358c0 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 71  ncmp(azArg[1],"q
358d0 75 6f 74 65 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  uote",n2)==0 ){.
358e0 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
358f0 4d 4f 44 45 5f 51 75 6f 74 65 3b 0a 20 20 20 20  MODE_Quote;.    
35900 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 61  }else if( c2=='a
35910 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
35920 72 67 5b 31 5d 2c 22 61 73 63 69 69 22 2c 6e 32  rg[1],"ascii",n2
35930 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
35940 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 41 73 63  >mode = MODE_Asc
35950 69 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ii;.      sqlite
35960 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
35970 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  f(p->colSeparato
35980 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  r), p->colSepara
35990 74 6f 72 2c 20 53 45 50 5f 55 6e 69 74 29 3b 0a  tor, SEP_Unit);.
359a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
359b0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
359c0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
359d0 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
359e0 20 53 45 50 5f 52 65 63 6f 72 64 29 3b 0a 20 20   SEP_Record);.  
359f0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67    }else if( nArg
35a00 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==1 ){.      raw
35a10 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
35a20 22 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20  "current output 
35a30 6d 6f 64 65 3a 20 25 73 5c 6e 22 2c 20 6d 6f 64  mode: %s\n", mod
35a40 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29  eDescr[p->mode])
35a50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
35a60 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
35a70 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 6f  derr, "Error: mo
35a80 64 65 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65  de should be one
35a90 20 6f 66 3a 20 22 0a 20 20 20 20 20 20 20 20 20   of: ".         
35aa0 22 61 73 63 69 69 20 63 6f 6c 75 6d 6e 20 63 73  "ascii column cs
35ab0 76 20 68 74 6d 6c 20 69 6e 73 65 72 74 20 6c 69  v html insert li
35ac0 6e 65 20 6c 69 73 74 20 71 75 6f 74 65 20 74 61  ne list quote ta
35ad0 62 73 20 74 63 6c 5c 6e 22 29 3b 0a 20 20 20 20  bs tcl\n");.    
35ae0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
35af0 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70      p->cMode = p
35b00 2d 3e 6d 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 0a  ->mode;.  }else.
35b10 0a 20 20 69 66 28 20 63 3d 3d 27 6e 27 20 26 26  .  if( c=='n' &&
35b20 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
35b30 5d 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20  ], "nullvalue", 
35b40 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
35b50 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
35b60 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
35b70 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6e 75 6c  tf(sizeof(p->nul
35b80 6c 56 61 6c 75 65 29 2c 20 70 2d 3e 6e 75 6c 6c  lValue), p->null
35b90 56 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20  Value,.         
35ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
35bb0 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61 79  .*s", (int)Array
35bc0 53 69 7a 65 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75  Size(p->nullValu
35bd0 65 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  e)-1, azArg[1]);
35be0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
35bf0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
35c00 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6e 75  err, "Usage: .nu
35c10 6c 6c 76 61 6c 75 65 20 53 54 52 49 4e 47 5c 6e  llvalue STRING\n
35c20 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
35c30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
35c40 0a 20 20 69 66 28 20 63 3d 3d 27 6f 27 20 26 26  .  if( c=='o' &&
35c50 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
35c60 5d 2c 20 22 6f 70 65 6e 22 2c 20 6e 29 3d 3d 30  ], "open", n)==0
35c70 20 26 26 20 6e 3e 3d 32 20 29 7b 0a 20 20 20 20   && n>=2 ){.    
35c80 63 68 61 72 20 2a 7a 4e 65 77 46 69 6c 65 6e 61  char *zNewFilena
35c90 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me;  /* Name of 
35ca0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35cb0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20  e to open */.   
35cc0 20 69 6e 74 20 69 4e 61 6d 65 20 3d 20 31 3b 20   int iName = 1; 
35cd0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
35ce0 6e 20 61 7a 41 72 67 5b 5d 20 6f 66 20 74 68 65  n azArg[] of the
35cf0 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20   filename */.   
35d00 20 69 6e 74 20 6e 65 77 46 6c 61 67 20 3d 20 30   int newFlag = 0
35d10 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f  ;     /* True to
35d20 20 64 65 6c 65 74 65 20 66 69 6c 65 20 62 65 66   delete file bef
35d30 6f 72 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20  ore opening */. 
35d40 20 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20     /* Close the 
35d50 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
35d60 65 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e  e */.    session
35d70 5f 63 6c 6f 73 65 5f 61 6c 6c 28 70 29 3b 0a 20  _close_all(p);. 
35d80 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 2d 3e 64     close_db(p->d
35d90 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20  b);.    p->db = 
35da0 30 3b 0a 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c  0;.    p->zDbFil
35db0 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73  ename = 0;.    s
35dc0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
35dd0 46 72 65 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20  FreeOnClose);.  
35de0 20 20 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73    p->zFreeOnClos
35df0 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6f 70  e = 0;.    p->op
35e00 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f  enMode = SHELL_O
35e10 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 20 20  PEN_UNSPEC;.    
35e20 70 2d 3e 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20  p->szMax = 0;.  
35e30 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63    /* Check for c
35e40 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75  ommand-line argu
35e50 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 66 6f 72  ments */.    for
35e60 28 69 4e 61 6d 65 3d 31 3b 20 69 4e 61 6d 65 3c  (iName=1; iName<
35e70 6e 41 72 67 20 26 26 20 61 7a 41 72 67 5b 69 4e  nArg && azArg[iN
35e80 61 6d 65 5d 5b 30 5d 3d 3d 27 2d 27 3b 20 69 4e  ame][0]=='-'; iN
35e90 61 6d 65 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ame++){.      co
35ea0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a  nst char *z = az
35eb0 41 72 67 5b 69 4e 61 6d 65 5d 3b 0a 20 20 20 20  Arg[iName];.    
35ec0 20 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63    if( optionMatc
35ed0 68 28 7a 2c 22 6e 65 77 22 29 20 29 7b 0a 20 20  h(z,"new") ){.  
35ee0 20 20 20 20 20 20 6e 65 77 46 6c 61 67 20 3d 20        newFlag = 
35ef0 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  1;.#ifdef SQLITE
35f00 5f 48 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20 20  _HAVE_ZLIB.     
35f10 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69 6f   }else if( optio
35f20 6e 4d 61 74 63 68 28 7a 2c 20 22 7a 69 70 22 29  nMatch(z, "zip")
35f30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f   ){.        p->o
35f40 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f  penMode = SHELL_
35f50 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 23 65  OPEN_ZIPFILE;.#e
35f60 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
35f70 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68   if( optionMatch
35f80 28 7a 2c 20 22 61 70 70 65 6e 64 22 29 20 29 7b  (z, "append") ){
35f90 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e  .        p->open
35fa0 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45  Mode = SHELL_OPE
35fb0 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20 20  N_APPENDVFS;.   
35fc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 74     }else if( opt
35fd0 69 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 72 65 61  ionMatch(z, "rea
35fe0 64 6f 6e 6c 79 22 29 20 29 7b 0a 20 20 20 20 20  donly") ){.     
35ff0 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d     p->openMode =
36000 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44   SHELL_OPEN_READ
36010 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c  ONLY;.#ifdef SQL
36020 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52  ITE_ENABLE_DESER
36030 49 41 4c 49 5a 45 0a 20 20 20 20 20 20 7d 65 6c  IALIZE.      }el
36040 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74  se if( optionMat
36050 63 68 28 7a 2c 20 22 64 65 73 65 72 69 61 6c 69  ch(z, "deseriali
36060 7a 65 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ze") ){.        
36070 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48  p->openMode = SH
36080 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41  ELL_OPEN_DESERIA
36090 4c 49 5a 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  LIZE;.      }els
360a0 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63  e if( optionMatc
360b0 68 28 7a 2c 20 22 68 65 78 64 62 22 29 20 29 7b  h(z, "hexdb") ){
360c0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e  .        p->open
360d0 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45  Mode = SHELL_OPE
360e0 4e 5f 48 45 58 44 42 3b 0a 20 20 20 20 20 20 7d  N_HEXDB;.      }
360f0 65 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d  else if( optionM
36100 61 74 63 68 28 7a 2c 20 22 6d 61 78 73 69 7a 65  atch(z, "maxsize
36110 22 29 20 26 26 20 69 4e 61 6d 65 2b 31 3c 6e 41  ") && iName+1<nA
36120 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  rg ){.        p-
36130 3e 73 7a 4d 61 78 20 3d 20 69 6e 74 65 67 65 72  >szMax = integer
36140 56 61 6c 75 65 28 61 7a 41 72 67 5b 2b 2b 69 4e  Value(azArg[++iN
36150 61 6d 65 5d 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  ame]);.#endif /*
36160 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
36170 45 53 45 52 49 41 4c 49 5a 45 20 2a 2f 0a 20 20  ESERIALIZE */.  
36180 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
36190 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]=='-' ){.     
361a0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
361b0 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20  tderr, "unknown 
361c0 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a  option: %s\n", z
361d0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
361e0 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
361f0 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
36200 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
36210 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 66 69 6c  .    /* If a fil
36220 65 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69  ename is specifi
36230 65 64 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ed, try to open 
36240 69 74 20 66 69 72 73 74 20 2a 2f 0a 20 20 20 20  it first */.    
36250 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 20 3d 20 6e  zNewFilename = n
36260 41 72 67 3e 69 4e 61 6d 65 20 3f 20 73 71 6c 69  Arg>iName ? sqli
36270 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
36280 2c 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 29 20  , azArg[iName]) 
36290 3a 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65  : 0;.    if( zNe
362a0 77 46 69 6c 65 6e 61 6d 65 20 7c 7c 20 70 2d 3e  wFilename || p->
362b0 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f  openMode==SHELL_
362c0 4f 50 45 4e 5f 48 45 58 44 42 20 29 7b 0a 20 20  OPEN_HEXDB ){.  
362d0 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20      if( newFlag 
362e0 29 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c  ) shellDeleteFil
362f0 65 28 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b  e(zNewFilename);
36300 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c  .      p->zDbFil
36310 65 6e 61 6d 65 20 3d 20 7a 4e 65 77 46 69 6c 65  ename = zNewFile
36320 6e 61 6d 65 3b 0a 20 20 20 20 20 20 6f 70 65 6e  name;.      open
36330 5f 64 62 28 70 2c 20 4f 50 45 4e 5f 44 42 5f 4b  _db(p, OPEN_DB_K
36340 45 45 50 41 4c 49 56 45 29 3b 0a 20 20 20 20 20  EEPALIVE);.     
36350 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b   if( p->db==0 ){
36360 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
36370 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
36380 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
36390 20 27 25 73 27 5c 6e 22 2c 20 7a 4e 65 77 46 69   '%s'\n", zNewFi
363a0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
363b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
363c0 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  ewFilename);.   
363d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
363e0 20 20 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73    p->zFreeOnClos
363f0 65 20 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65  e = zNewFilename
36400 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36410 20 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30      if( p->db==0
36420 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 73 20   ){.      /* As 
36430 61 20 66 61 6c 6c 2d 62 61 63 6b 20 6f 70 65 6e  a fall-back open
36440 20 61 20 54 45 4d 50 20 64 61 74 61 62 61 73 65   a TEMP database
36450 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62   */.      p->zDb
36460 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
36470 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
36480 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
36490 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27 6f 27 0a  ..  if( (c=='o'.
364a0 20 20 20 20 20 20 20 20 26 26 20 28 73 74 72 6e          && (strn
364b0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f  cmp(azArg[0], "o
364c0 75 74 70 75 74 22 2c 20 6e 29 3d 3d 30 7c 7c 73  utput", n)==0||s
364d0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
364e0 20 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 29 29   "once", n)==0))
364f0 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 65 27 20 26  .   || (c=='e' &
36500 26 20 6e 3d 3d 35 20 26 26 20 73 74 72 63 6d 70  & n==5 && strcmp
36510 28 61 7a 41 72 67 5b 30 5d 2c 22 65 78 63 65 6c  (azArg[0],"excel
36520 22 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  ")==0).  ){.    
36530 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
36540 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a  e = nArg>=2 ? az
36550 41 72 67 5b 31 5d 20 3a 20 22 73 74 64 6f 75 74  Arg[1] : "stdout
36560 22 3b 0a 20 20 20 20 69 6e 74 20 62 54 78 74 4d  ";.    int bTxtM
36570 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ode = 0;.    if(
36580 20 61 7a 41 72 67 5b 30 5d 5b 30 5d 3d 3d 27 65   azArg[0][0]=='e
36590 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  ' ){.      /* Tr
365a0 61 6e 73 66 6f 72 6d 20 74 68 65 20 22 2e 65 78  ansform the ".ex
365b0 63 65 6c 22 20 63 6f 6d 6d 61 6e 64 20 69 6e 74  cel" command int
365c0 6f 20 22 2e 6f 6e 63 65 20 2d 78 22 20 2a 2f 0a  o ".once -x" */.
365d0 20 20 20 20 20 20 6e 41 72 67 20 3d 20 32 3b 0a        nArg = 2;.
365e0 20 20 20 20 20 20 61 7a 41 72 67 5b 30 5d 20 3d        azArg[0] =
365f0 20 22 6f 6e 63 65 22 3b 0a 20 20 20 20 20 20 7a   "once";.      z
36600 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 20  File = azArg[1] 
36610 3d 20 22 2d 78 22 3b 0a 20 20 20 20 20 20 6e 20  = "-x";.      n 
36620 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 4;.    }.    i
36630 66 28 20 6e 41 72 67 3e 32 20 29 7b 0a 20 20 20  f( nArg>2 ){.   
36640 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
36650 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
36660 25 73 20 5b 2d 65 7c 2d 78 7c 46 49 4c 45 5d 5c  %s [-e|-x|FILE]\
36670 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  n", azArg[0]);. 
36680 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
36690 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
366a0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
366b0 0a 20 20 20 20 69 66 28 20 6e 3e 31 20 26 26 20  .    if( n>1 && 
366c0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
366d0 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 20  , "once", n)==0 
366e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72  ){.      if( nAr
366f0 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72  g<2 ){.        r
36700 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
36710 2c 20 22 55 73 61 67 65 3a 20 2e 6f 6e 63 65 20  , "Usage: .once 
36720 28 2d 65 7c 2d 78 7c 46 49 4c 45 29 5c 6e 22 29  (-e|-x|FILE)\n")
36730 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
36740 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
36750 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
36760 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36770 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20 32 3b  p->outCount = 2;
36780 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
36790 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20    p->outCount = 
367a0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 75 74  0;.    }.    out
367b0 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a 20 20  put_reset(p);.  
367c0 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d    if( zFile[0]==
367d0 27 2d 27 20 26 26 20 7a 46 69 6c 65 5b 31 5d 3d  '-' && zFile[1]=
367e0 3d 27 2d 27 20 29 20 7a 46 69 6c 65 2b 2b 3b 0a  ='-' ) zFile++;.
367f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
36800 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 20  OHAVE_SYSTEM.   
36810 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
36820 65 2c 20 22 2d 65 22 29 3d 3d 30 20 7c 7c 20 73  e, "-e")==0 || s
36830 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 2d 78  trcmp(zFile, "-x
36840 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ")==0 ){.      p
36850 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 3d 20 31 3b  ->doXdgOpen = 1;
36860 0a 20 20 20 20 20 20 6f 75 74 70 75 74 4d 6f 64  .      outputMod
36870 65 50 75 73 68 28 70 29 3b 0a 20 20 20 20 20 20  ePush(p);.      
36880 69 66 28 20 7a 46 69 6c 65 5b 31 5d 3d 3d 27 78  if( zFile[1]=='x
36890 27 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77  ' ){.        new
368a0 54 65 6d 70 46 69 6c 65 28 70 2c 20 22 63 73 76  TempFile(p, "csv
368b0 22 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6d  ");.        p->m
368c0 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a  ode = MODE_Csv;.
368d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
368e0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
368f0 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
36900 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
36910 72 2c 20 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a 20  r, SEP_Comma);. 
36920 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
36930 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
36940 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c  ->rowSeparator),
36950 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
36960 2c 20 53 45 50 5f 43 72 4c 66 29 3b 0a 20 20 20  , SEP_CrLf);.   
36970 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36980 20 20 6e 65 77 54 65 6d 70 46 69 6c 65 28 70 2c    newTempFile(p,
36990 20 22 74 78 74 22 29 3b 0a 20 20 20 20 20 20 20   "txt");.       
369a0 20 62 54 78 74 4d 6f 64 65 20 3d 20 31 3b 0a 20   bTxtMode = 1;. 
369b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69       }.      zFi
369c0 6c 65 20 3d 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  le = p->zTempFil
369d0 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  e;.    }.#endif 
369e0 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  /* SQLITE_NOHAVE
369f0 5f 53 59 53 54 45 4d 20 2a 2f 0a 20 20 20 20 69  _SYSTEM */.    i
36a00 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27  f( zFile[0]=='|'
36a10 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
36a20 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20  E_OMIT_POPEN.   
36a30 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
36a40 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 70 69  derr, "Error: pi
36a50 70 65 73 20 61 72 65 20 6e 6f 74 20 73 75 70 70  pes are not supp
36a60 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 4f 53  orted in this OS
36a70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
36a80 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74   1;.      p->out
36a90 20 3d 20 73 74 64 6f 75 74 3b 0a 23 65 6c 73 65   = stdout;.#else
36aa0 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20  .      p->out = 
36ab0 70 6f 70 65 6e 28 7a 46 69 6c 65 20 2b 20 31 2c  popen(zFile + 1,
36ac0 20 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28   "w");.      if(
36ad0 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20   p->out==0 ){.  
36ae0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
36af0 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
36b00 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 70 69 70   cannot open pip
36b10 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69  e \"%s\"\n", zFi
36b20 6c 65 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 20  le + 1);.       
36b30 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74   p->out = stdout
36b40 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
36b50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
36b60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
36b70 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
36b80 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f  ->outfile), p->o
36b90 75 74 66 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46  utfile, "%s", zF
36ba0 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ile);.      }.#e
36bb0 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
36bc0 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 6f        p->out = o
36bd0 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28  utput_file_open(
36be0 7a 46 69 6c 65 2c 20 62 54 78 74 4d 6f 64 65 29  zFile, bTxtMode)
36bf0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f  ;.      if( p->o
36c00 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
36c10 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
36c20 65 2c 22 6f 66 66 22 29 21 3d 30 20 29 7b 0a 20  e,"off")!=0 ){. 
36c30 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
36c40 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
36c50 6f 72 3a 20 63 61 6e 6e 6f 74 20 77 72 69 74 65  or: cannot write
36c60 20 74 6f 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a   to \"%s\"\n", z
36c70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  File);.        }
36c80 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 75 74 20  .        p->out 
36c90 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20  = stdout;.      
36ca0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
36cb0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
36cc0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
36cd0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66  f(sizeof(p->outf
36ce0 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65  ile), p->outfile
36cf0 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a  , "%s", zFile);.
36d00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
36d10 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
36d20 27 70 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'p' && n>=3 && s
36d30 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
36d40 20 22 70 61 72 61 6d 65 74 65 72 22 2c 20 6e 29   "parameter", n)
36d50 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f  ==0 ){.    open_
36d60 64 62 28 70 2c 30 29 3b 0a 20 20 20 20 69 66 28  db(p,0);.    if(
36d70 20 6e 41 72 67 3c 3d 31 20 29 20 67 6f 74 6f 20   nArg<=1 ) goto 
36d80 70 61 72 61 6d 65 74 65 72 5f 73 79 6e 74 61 78  parameter_syntax
36d90 5f 65 72 72 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20  _error;..    /* 
36da0 2e 70 61 72 61 6d 65 74 65 72 20 63 6c 65 61 72  .parameter clear
36db0 0a 20 20 20 20 2a 2a 20 43 6c 65 61 72 20 61 6c  .    ** Clear al
36dc0 6c 20 62 69 6e 64 20 70 61 72 61 6d 65 74 65 72  l bind parameter
36dd0 73 20 62 79 20 64 72 6f 70 70 69 6e 67 20 74 68  s by dropping th
36de0 65 20 54 45 4d 50 20 74 61 62 6c 65 20 74 68 61  e TEMP table tha
36df0 74 20 68 6f 6c 64 73 20 74 68 65 6d 2e 0a 20 20  t holds them..  
36e00 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 41 72    */.    if( nAr
36e10 67 3d 3d 32 20 26 26 20 73 74 72 63 6d 70 28 61  g==2 && strcmp(a
36e20 7a 41 72 67 5b 31 5d 2c 22 63 6c 65 61 72 22 29  zArg[1],"clear")
36e30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
36e40 20 77 72 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20   wrSchema = 0;. 
36e50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f       sqlite3_db_
36e60 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20 53 51  config(p->db, SQ
36e70 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 57 52  LITE_DBCONFIG_WR
36e80 49 54 41 42 4c 45 5f 53 43 48 45 4d 41 2c 20 2d  ITABLE_SCHEMA, -
36e90 31 2c 20 26 77 72 53 63 68 65 6d 61 29 3b 0a 20  1, &wrSchema);. 
36ea0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f       sqlite3_db_
36eb0 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20 53 51  config(p->db, SQ
36ec0 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 57 52  LITE_DBCONFIG_WR
36ed0 49 54 41 42 4c 45 5f 53 43 48 45 4d 41 2c 20 31  ITABLE_SCHEMA, 1
36ee0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
36ef0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
36f00 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45  "DROP TABLE IF E
36f10 58 49 53 54 53 20 74 65 6d 70 2e 73 71 6c 69 74  XISTS temp.sqlit
36f20 65 5f 70 61 72 61 6d 65 74 65 72 73 3b 22 2c 0a  e_parameters;",.
36f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f40 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20     0, 0, 0);.   
36f50 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f     sqlite3_db_co
36f60 6e 66 69 67 28 70 2d 3e 64 62 2c 20 53 51 4c 49  nfig(p->db, SQLI
36f70 54 45 5f 44 42 43 4f 4e 46 49 47 5f 57 52 49 54  TE_DBCONFIG_WRIT
36f80 41 42 4c 45 5f 53 43 48 45 4d 41 2c 20 77 72 53  ABLE_SCHEMA, wrS
36f90 63 68 65 6d 61 2c 20 30 29 3b 0a 20 20 20 20 7d  chema, 0);.    }
36fa0 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 70 61  else..    /* .pa
36fb0 72 61 6d 65 74 65 72 20 6c 69 73 74 0a 20 20 20  rameter list.   
36fc0 20 2a 2a 20 4c 69 73 74 20 61 6c 6c 20 62 69 6e   ** List all bin
36fd0 64 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20  d parameters..  
36fe0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 41 72    */.    if( nAr
36ff0 67 3d 3d 32 20 26 26 20 73 74 72 63 6d 70 28 61  g==2 && strcmp(a
37000 7a 41 72 67 5b 31 5d 2c 22 6c 69 73 74 22 29 3d  zArg[1],"list")=
37010 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
37020 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
37030 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  = 0;.      int r
37040 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  x;.      int len
37050 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 78 20 3d   = 0;.      rx =
37060 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
37070 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  _v2(p->db,.     
37080 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
37090 6d 61 78 28 6c 65 6e 67 74 68 28 6b 65 79 29 29  max(length(key))
370a0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
370b0 22 46 52 4f 4d 20 74 65 6d 70 2e 73 71 6c 69 74  "FROM temp.sqlit
370c0 65 5f 70 61 72 61 6d 65 74 65 72 73 3b 22 2c 20  e_parameters;", 
370d0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
370e0 20 20 20 20 20 20 69 66 28 20 72 78 3d 3d 53 51        if( rx==SQ
370f0 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74  LITE_OK && sqlit
37100 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
37110 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
37120 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69        len = sqli
37130 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
37140 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
37150 20 20 69 66 28 20 6c 65 6e 3e 34 30 20 29 20 6c    if( len>40 ) l
37160 65 6e 20 3d 20 34 30 3b 0a 20 20 20 20 20 20 7d  en = 40;.      }
37170 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
37180 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
37190 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b        pStmt = 0;
371a0 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e 20 29  .      if( len )
371b0 7b 0a 20 20 20 20 20 20 20 20 72 78 20 3d 20 73  {.        rx = s
371c0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
371d0 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  2(p->db,.       
371e0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6b 65        "SELECT ke
371f0 79 2c 20 71 75 6f 74 65 28 76 61 6c 75 65 29 20  y, quote(value) 
37200 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ".             "
37210 46 52 4f 4d 20 74 65 6d 70 2e 73 71 6c 69 74 65  FROM temp.sqlite
37220 5f 70 61 72 61 6d 65 74 65 72 73 3b 22 2c 20 2d  _parameters;", -
37230 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
37240 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71         while( sq
37250 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
37260 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
37270 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
37280 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
37290 25 2d 2a 73 20 25 73 5c 6e 22 2c 20 6c 65 6e 2c  %-*s %s\n", len,
372a0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
372b0 74 65 78 74 28 70 53 74 6d 74 2c 30 29 2c 0a 20  text(pStmt,0),. 
372c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
372d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
372e0 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 31  umn_text(pStmt,1
372f0 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
37300 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
37310 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
37320 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
37330 0a 0a 20 20 20 20 2f 2a 20 2e 70 61 72 61 6d 65  ..    /* .parame
37340 74 65 72 20 69 6e 69 74 0a 20 20 20 20 2a 2a 20  ter init.    ** 
37350 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45  Make sure the TE
37360 4d 50 20 74 61 62 6c 65 20 75 73 65 64 20 74 6f  MP table used to
37370 20 68 6f 6c 64 20 62 69 6e 64 20 70 61 72 61 6d   hold bind param
37380 65 74 65 72 73 20 65 78 69 73 74 73 2e 0a 20 20  eters exists..  
37390 20 20 2a 2a 20 43 72 65 61 74 65 20 69 74 20 69    ** Create it i
373a0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  f necessary..   
373b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 41 72 67   */.    if( nArg
373c0 3d 3d 32 20 26 26 20 73 74 72 63 6d 70 28 61 7a  ==2 && strcmp(az
373d0 41 72 67 5b 31 5d 2c 22 69 6e 69 74 22 29 3d 3d  Arg[1],"init")==
373e0 30 20 29 7b 0a 20 20 20 20 20 20 62 69 6e 64 5f  0 ){.      bind_
373f0 74 61 62 6c 65 5f 69 6e 69 74 28 70 29 3b 0a 20  table_init(p);. 
37400 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a     }else..    /*
37410 20 2e 70 61 72 61 6d 65 74 65 72 20 73 65 74 20   .parameter set 
37420 4e 41 4d 45 20 56 41 4c 55 45 0a 20 20 20 20 2a  NAME VALUE.    *
37430 2a 20 53 65 74 20 6f 72 20 72 65 73 65 74 20 61  * Set or reset a
37440 20 62 69 6e 64 20 70 61 72 61 6d 65 74 65 72 2e   bind parameter.
37450 20 20 4e 41 4d 45 20 73 68 6f 75 6c 64 20 62 65    NAME should be
37460 20 74 68 65 20 66 75 6c 6c 20 70 61 72 61 6d 65   the full parame
37470 74 65 72 0a 20 20 20 20 2a 2a 20 6e 61 6d 65 20  ter.    ** name 
37480 65 78 61 63 74 6c 79 20 61 73 20 69 74 20 61 70  exactly as it ap
37490 70 65 61 72 73 20 69 6e 20 74 68 65 20 71 75 65  pears in the que
374a0 72 79 2e 20 20 28 65 78 3a 20 24 61 62 63 2c 20  ry.  (ex: $abc, 
374b0 40 64 65 66 29 2e 20 20 54 68 65 0a 20 20 20 20  @def).  The.    
374c0 2a 2a 20 56 41 4c 55 45 20 63 61 6e 20 62 65 20  ** VALUE can be 
374d0 69 6e 20 65 69 74 68 65 72 20 53 51 4c 20 6c 69  in either SQL li
374e0 74 65 72 61 6c 20 6e 6f 74 61 74 69 6f 6e 2c 20  teral notation, 
374f0 6f 72 20 69 66 20 6e 6f 74 20 69 74 20 77 69 6c  or if not it wil
37500 6c 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 64 65  l be.    ** unde
37510 72 73 74 6f 6f 64 20 74 6f 20 62 65 20 61 20 74  rstood to be a t
37520 65 78 74 20 73 74 72 69 6e 67 2e 0a 20 20 20 20  ext string..    
37530 2a 2f 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  */.    if( nArg=
37540 3d 34 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41  =4 && strcmp(azA
37550 72 67 5b 31 5d 2c 22 73 65 74 22 29 3d 3d 30 20  rg[1],"set")==0 
37560 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 78 3b  ){.      int rx;
37570 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71  .      char *zSq
37580 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
37590 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
375a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
375b0 7a 4b 65 79 20 3d 20 61 7a 41 72 67 5b 32 5d 3b  zKey = azArg[2];
375c0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
375d0 72 20 2a 7a 56 61 6c 75 65 20 3d 20 61 7a 41 72  r *zValue = azAr
375e0 67 5b 33 5d 3b 0a 20 20 20 20 20 20 62 69 6e 64  g[3];.      bind
375f0 5f 74 61 62 6c 65 5f 69 6e 69 74 28 70 29 3b 0a  _table_init(p);.
37600 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
37610 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
37620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37630 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 65  "REPLACE INTO te
37640 6d 70 2e 73 71 6c 69 74 65 5f 70 61 72 61 6d 65  mp.sqlite_parame
37650 74 65 72 73 28 6b 65 79 2c 76 61 6c 75 65 29 22  ters(key,value)"
37660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
37670 20 20 20 22 56 41 4c 55 45 53 28 25 51 2c 25 73     "VALUES(%Q,%s
37680 29 3b 22 2c 20 7a 4b 65 79 2c 20 7a 56 61 6c 75  );", zKey, zValu
37690 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53  e);.      if( zS
376a0 71 6c 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75  ql==0 ) shell_ou
376b0 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20  t_of_memory();. 
376c0 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a       pStmt = 0;.
376d0 20 20 20 20 20 20 72 78 20 3d 20 73 71 6c 69 74        rx = sqlit
376e0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
376f0 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
37700 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
37710 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
37720 71 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ql);.      if( r
37730 78 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  x!=SQLITE_OK ){.
37740 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
37750 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
37760 0a 20 20 20 20 20 20 20 20 70 53 74 6d 74 20 3d  .        pStmt =
37770 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c   0;.        zSql
37780 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
37790 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
377a0 20 20 20 20 20 20 20 22 52 45 50 4c 41 43 45 20         "REPLACE 
377b0 49 4e 54 4f 20 74 65 6d 70 2e 73 71 6c 69 74 65  INTO temp.sqlite
377c0 5f 70 61 72 61 6d 65 74 65 72 73 28 6b 65 79 2c  _parameters(key,
377d0 76 61 6c 75 65 29 22 0a 20 20 20 20 20 20 20 20  value)".        
377e0 20 20 20 20 20 20 20 20 20 20 20 22 56 41 4c 55             "VALU
377f0 45 53 28 25 51 2c 25 51 29 3b 22 2c 20 7a 4b 65  ES(%Q,%Q);", zKe
37800 79 2c 20 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20  y, zValue);.    
37810 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
37820 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d  ) shell_out_of_m
37830 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 20 20 20  emory();.       
37840 20 72 78 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rx = sqlite3_pr
37850 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
37860 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
37870 2c 20 30 29 3b 0a 20 20 20 20